cocoon-sdk 0.1.0 → 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/protocol/session.ts","../src/core/protocol/connection.ts","../src/core/error.ts","../src/core/protocol/pow.ts","../src/core/tl/schema.ts","../src/core/tl/serializer.ts","../src/core/tl/deserializer.ts","../src/core/protocol/handshake.ts","../src/core/streaming.ts","../src/resources/chat/completions.ts","../src/resources/models/models.ts","../src/ton/wallet.ts","../src/ton/discovery.ts","../src/ton/contracts/root.ts","../src/ton/contracts/client-contract.ts","../src/client.ts","../src/core/protocol/attestation.ts"],"sourcesContent":["/**\n * Cocoon TypeScript SDK\n *\n * OpenAI-compatible client for Telegram Cocoon — decentralized GPU network\n * for AI inference on TON blockchain.\n */\n\n// Main client\nexport { Cocoon } from './client.js';\nexport type { CocoonOptions } from './client.js';\nexport type {\n AttestationProvider,\n AttestationContext,\n ClientTlsCredentials,\n} from './core/protocol/attestation.js';\nexport {\n StaticAttestationProvider,\n FileAttestationProvider,\n} from './core/protocol/attestation.js';\n\n// Chat types\nexport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionChoice,\n ChatCompletionChunkChoice,\n ChatCompletionChunkDelta,\n ChatCompletionCreateParams,\n ChatMessage,\n ChatRole,\n} from './types/chat.js';\n\n// Model types\nexport type { Model, ModelList } from './types/models.js';\n\n// Common types\nexport type { Usage, FinishReason } from './types/common.js';\n\n// Error classes\nexport {\n CocoonError,\n ConnectionError,\n ProtocolError,\n APIError,\n AuthenticationError,\n TimeoutError,\n} from './core/error.js';\n\n// Streaming\nexport { Stream } from './core/streaming.js';\n","/**\n * Cocoon Session — manages an authenticated connection to a proxy.\n *\n * Handles:\n * - Keepalive (tcp.ping/tcp.pong)\n * - Query dispatch and response routing by requestId\n * - Streaming response assembly\n */\n\nimport crypto from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport { CocoonConnection, type ConnectionOptions } from './connection.js';\nimport {\n performHandshake,\n type HandshakeResult,\n type LongAuthHandler,\n} from './handshake.js';\nimport { serializeTLObject } from '../tl/serializer.js';\nimport { deserializeTLObject } from '../tl/deserializer.js';\nimport { ConnectionError, ProtocolError, TimeoutError } from '../error.js';\nimport type {\n ClientQueryAnswerExType,\n ClientRunQueryEx,\n HttpRequest,\n HttpHeader,\n} from '../tl/types.js';\n\nexport interface SessionOptions extends ConnectionOptions {\n ownerAddress: string;\n secretString: string;\n configVersion?: number;\n onLongAuthRequired?: LongAuthHandler;\n}\n\ninterface PendingQuery {\n resolve: (value: ClientQueryAnswerExType) => void;\n reject: (error: Error) => void;\n onPart?: (part: ClientQueryAnswerExType) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nexport class CocoonSession extends EventEmitter {\n private conn: CocoonConnection | null = null;\n private handshakeResult: HandshakeResult | null = null;\n private pendingQueries: Map<string, PendingQuery> = new Map();\n private keepaliveTimer: ReturnType<typeof setInterval> | null = null;\n private _connected = false;\n\n private readonly options: SessionOptions;\n\n constructor(options: SessionOptions) {\n super();\n this.options = options;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get protoVersion(): number {\n return this.handshakeResult?.protoVersion ?? 0;\n }\n\n async connect(): Promise<void> {\n if (this._connected) return;\n\n this.conn = new CocoonConnection(this.options);\n await this.conn.connect();\n\n // Perform handshake\n this.handshakeResult = await performHandshake(\n this.conn,\n this.options.ownerAddress,\n this.options.secretString,\n this.options.configVersion ?? 0,\n this.options.onLongAuthRequired,\n );\n\n this._connected = true;\n\n // Set up frame handler for ongoing communication\n this.conn.on('frame', (data: Buffer) => this.handleFrame(data));\n this.conn.on('close', (error?: Error) => {\n this._connected = false;\n this.cleanup();\n this.emit('close', error);\n });\n\n // Start keepalive\n this.startKeepalive();\n }\n\n /**\n * Send a query and wait for the complete answer.\n */\n async sendQuery(\n modelName: string,\n httpRequest: HttpRequest,\n options: {\n maxCoefficient?: number;\n maxTokens?: number;\n timeout?: number;\n enableDebug?: boolean;\n onPart?: (part: ClientQueryAnswerExType) => void;\n } = {},\n ): Promise<ClientQueryAnswerExType> {\n if (!this.conn || !this._connected) {\n throw new ConnectionError('Not connected');\n }\n\n const requestId = crypto.randomBytes(32);\n const timeout = options.timeout ?? this.options.timeout ?? 120_000;\n\n // Serialize the HTTP request as the query payload\n const queryPayload = serializeTLObject(httpRequest as unknown as Record<string, unknown>, true);\n\n const runQuery: ClientRunQueryEx = {\n _type: 'client.runQueryEx',\n modelName,\n query: queryPayload,\n maxCoefficient: options.maxCoefficient ?? 4000,\n maxTokens: options.maxTokens ?? 1000,\n timeout: (timeout / 1000) * 0.95,\n requestId,\n minConfigVersion: this.options.configVersion ?? 0,\n flags: options.enableDebug ? 1 : 0,\n enableDebug: options.enableDebug,\n };\n\n // Send as tcp.packet (not tcp.query — queries are sent as messages after handshake)\n const tlData = serializeTLObject(runQuery as unknown as Record<string, unknown>, true);\n const tcpPacket = {\n _type: 'tcp.packet',\n data: tlData,\n };\n this.conn.send(serializeTLObject(tcpPacket as unknown as Record<string, unknown>));\n\n // Wait for answer\n return new Promise<ClientQueryAnswerExType>((resolve, reject) => {\n const requestIdHex = requestId.toString('hex');\n\n const timer = setTimeout(() => {\n this.pendingQueries.delete(requestIdHex);\n reject(new TimeoutError(`Query timed out after ${timeout}ms`));\n }, timeout);\n\n this.pendingQueries.set(requestIdHex, {\n resolve,\n reject,\n onPart: options.onPart,\n timer,\n });\n });\n }\n\n /**\n * Send a raw TL function (for getWorkerTypesV2, etc.)\n */\n async sendRpcQuery(\n tlObject: Record<string, unknown>,\n timeoutMs = 30_000,\n ): Promise<Record<string, unknown>> {\n if (!this.conn || !this._connected) {\n throw new ConnectionError('Not connected');\n }\n\n const queryId = crypto.randomBytes(8).readBigInt64LE();\n const data = serializeTLObject(tlObject, true);\n\n const tcpQuery = {\n _type: 'tcp.query',\n id: queryId,\n data,\n };\n this.conn.send(serializeTLObject(tcpQuery as unknown as Record<string, unknown>));\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.removeListener(`queryAnswer:${queryId}`, onAnswer);\n reject(new TimeoutError(`RPC query timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const onAnswer = (result: { data?: Buffer; error?: { code: number; message: string } }) => {\n clearTimeout(timer);\n if (result.error) {\n reject(new ProtocolError(result.error.message, result.error.code));\n } else if (result.data) {\n resolve(deserializeTLObject(result.data));\n }\n };\n\n this.once(`queryAnswer:${queryId}`, onAnswer);\n });\n }\n\n async disconnect(): Promise<void> {\n this.cleanup();\n this.conn?.destroy();\n this.conn = null;\n this._connected = false;\n }\n\n private handleFrame(data: Buffer): void {\n if (data.length === 0) {\n // Keepalive empty frame\n return;\n }\n\n let obj: Record<string, unknown>;\n try {\n obj = deserializeTLObject(data);\n } catch (e) {\n this.emit('error', new ProtocolError(`Failed to deserialize frame: ${e}`));\n return;\n }\n\n const type = obj['_type'] as string;\n\n switch (type) {\n case 'tcp.pong':\n // Keepalive response — ignore\n break;\n\n case 'tcp.ping': {\n // Server asking us for keepalive — respond with pong\n if (this.conn) {\n const pong = { _type: 'tcp.pong', id: obj['id'] };\n this.conn.send(serializeTLObject(pong as unknown as Record<string, unknown>));\n }\n break;\n }\n\n case 'tcp.queryAnswer': {\n const queryId = obj['id'] as bigint;\n this.emit(`queryAnswer:${queryId}`, { data: obj['data'] });\n break;\n }\n\n case 'tcp.queryError': {\n const queryId = obj['id'] as bigint;\n this.emit(`queryAnswer:${queryId}`, {\n error: { code: obj['code'] as number, message: obj['message'] as string },\n });\n break;\n }\n\n case 'tcp.packet': {\n // Unwrap tcp.packet data and process inner TL object\n const innerData = obj['data'] as Buffer;\n if (innerData.length === 0) break;\n\n let innerObj: Record<string, unknown>;\n try {\n innerObj = deserializeTLObject(innerData);\n } catch (e) {\n this.emit('error', new ProtocolError(`Failed to deserialize inner packet: ${e}`));\n return;\n }\n\n this.handleInnerPacket(innerObj);\n break;\n }\n\n default:\n this.emit('error', new ProtocolError(`Unexpected frame type: ${type}`));\n }\n }\n\n private handleInnerPacket(obj: Record<string, unknown>): void {\n const type = obj['_type'] as string;\n\n // Normalize legacy query answer variants to Ex-shape used by the SDK.\n let normalized: Record<string, unknown> = obj;\n if (type === 'client.queryAnswer') {\n normalized = {\n ...obj,\n _type: 'client.queryAnswerEx',\n };\n } else if (type === 'client.queryAnswerPart') {\n normalized = {\n ...obj,\n _type: 'client.queryAnswerPartEx',\n };\n } else if (type === 'client.queryAnswerError' || type === 'client.queryAnswerPartError') {\n normalized = {\n ...obj,\n _type: 'client.queryAnswerErrorEx',\n };\n }\n\n const normalizedType = normalized['_type'] as string;\n if (\n normalizedType === 'client.queryAnswerEx' ||\n normalizedType === 'client.queryAnswerErrorEx' ||\n normalizedType === 'client.queryAnswerPartEx'\n ) {\n const requestId = (normalized['requestId'] as Buffer).toString('hex');\n const pending = this.pendingQueries.get(requestId);\n if (!pending) {\n return;\n }\n\n const answer = normalized as unknown as ClientQueryAnswerExType;\n\n if (normalizedType === 'client.queryAnswerErrorEx') {\n // Error is always terminal.\n clearTimeout(pending.timer);\n this.pendingQueries.delete(requestId);\n pending.resolve(answer);\n return;\n }\n\n // Both queryAnswerEx and queryAnswerPartEx can carry intermediate or final chunks.\n pending.onPart?.(answer);\n if (this.isTerminalQueryAnswer(answer)) {\n clearTimeout(pending.timer);\n this.pendingQueries.delete(requestId);\n pending.resolve(answer);\n }\n }\n }\n\n private isTerminalQueryAnswer(answer: ClientQueryAnswerExType): boolean {\n if (answer._type === 'client.queryAnswerErrorEx') {\n return true;\n }\n\n // Legacy protocol may provide explicit completion bit.\n const legacyIsCompleted = (answer as unknown as { isCompleted?: boolean }).isCompleted;\n if (typeof legacyIsCompleted === 'boolean') {\n return legacyIsCompleted;\n }\n\n // Ex protocol signals final chunk via final_info (flags.0).\n if ('finalInfo' in answer && answer.finalInfo) {\n return true;\n }\n if ('flags' in answer && typeof answer.flags === 'number' && (answer.flags & 1) !== 0) {\n return true;\n }\n\n // If this is an HTTP envelope with chunked transfer, more chunks will follow.\n if ('answer' in answer && answer.answer) {\n try {\n const envelope = deserializeTLObject(answer.answer) as {\n _type?: string;\n headers?: Array<{ name: string; value: string }>;\n };\n if (envelope._type === 'http.response') {\n const transferEncoding = envelope.headers?.find(\n (h) => h.name.toLowerCase() === 'transfer-encoding',\n )?.value;\n if (transferEncoding && transferEncoding.toLowerCase().includes('chunked')) {\n return false;\n }\n return true;\n }\n } catch {\n // Raw payload (not an envelope). Fall through to type-based heuristic below.\n }\n }\n\n // PartEx without explicit completion markers is not terminal.\n if (answer._type === 'client.queryAnswerPartEx') {\n return false;\n }\n\n // Ex without completion markers/envelope is treated as terminal fallback.\n return true;\n }\n\n private startKeepalive(): void {\n // Send ping every 10 seconds\n this.keepaliveTimer = setInterval(() => {\n if (this.conn?.isConnected) {\n const pingId = crypto.randomBytes(8).readBigInt64LE();\n const ping = { _type: 'tcp.ping', id: pingId };\n try {\n this.conn.send(serializeTLObject(ping as unknown as Record<string, unknown>));\n } catch {\n // Connection may have been closed\n }\n }\n }, 10_000);\n }\n\n private cleanup(): void {\n if (this.keepaliveTimer) {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = null;\n }\n\n for (const [, pending] of this.pendingQueries) {\n clearTimeout(pending.timer);\n pending.reject(new ConnectionError('Connection closed'));\n }\n this.pendingQueries.clear();\n }\n}\n\n/**\n * Helper to build an HTTP request TL object for inference.\n */\nexport function buildHttpRequest(\n method: string,\n url: string,\n body: Buffer,\n extraHeaders: HttpHeader[] = [],\n): HttpRequest {\n const hasHeader = (name: string): boolean =>\n extraHeaders.some((h) => h.name.toLowerCase() === name.toLowerCase());\n\n const headers: HttpHeader[] = [...extraHeaders];\n if (!hasHeader('Content-Type')) {\n headers.unshift({ _type: 'http.header', name: 'Content-Type', value: 'application/json' });\n }\n if (!hasHeader('Content-Length')) {\n headers.push({ _type: 'http.header', name: 'Content-Length', value: body.length.toString() });\n }\n // Most HTTP/1.1 upstreams require Host header.\n if (!hasHeader('Host')) {\n headers.push({ _type: 'http.header', name: 'Host', value: 'api.openai.com' });\n }\n\n return {\n _type: 'http.request',\n method,\n url,\n httpVersion: 'HTTP/1.1',\n headers,\n payload: body,\n };\n}\n","/**\n * TCP + TLS connection with Cocoon framing.\n *\n * Connection flow:\n * 1. Raw TCP connect\n * 2. Receive PoW challenge (24 bytes), solve it, send response (12 bytes)\n * 3. Upgrade to TLS on same socket\n * 4. TL framing begins: [4 bytes LE size][4 bytes LE seqno][payload]\n * Where `size` is the length of `payload` only.\n */\n\nimport * as net from 'node:net';\nimport * as tls from 'node:tls';\nimport { EventEmitter } from 'node:events';\nimport { ConnectionError } from '../error.js';\nimport {\n parsePowChallenge,\n solvePow,\n buildPowResponse,\n POW_CHALLENGE_SIZE,\n POW_CHALLENGE_MAGIC,\n} from './pow.js';\n\nexport interface ConnectionOptions {\n host: string;\n port: number;\n useTls?: boolean;\n timeout?: number;\n /** PEM-encoded TLS client certificate (for RA-TLS / mTLS) */\n tlsCert?: string | Buffer;\n /** PEM-encoded TLS client private key (for RA-TLS / mTLS) */\n tlsKey?: string | Buffer;\n}\n\nexport type ConnectionEvent =\n | { type: 'data'; seqno: number; data: Buffer }\n | { type: 'close'; error?: Error }\n | { type: 'ready' };\n\nexport class CocoonConnection extends EventEmitter {\n private socket: net.Socket | tls.TLSSocket | null = null;\n private rawSocket: net.Socket | null = null;\n private outSeqno = 0;\n private inSeqno = 0;\n private readBuffer = Buffer.alloc(0);\n private connected = false;\n private destroyed = false;\n\n private readonly host: string;\n private readonly port: number;\n private readonly useTls: boolean;\n private readonly timeout: number;\n private readonly tlsCert?: string | Buffer;\n private readonly tlsKey?: string | Buffer;\n\n constructor(options: ConnectionOptions) {\n super();\n this.host = options.host;\n this.port = options.port;\n this.useTls = options.useTls ?? true;\n this.timeout = options.timeout ?? 120_000;\n this.tlsCert = options.tlsCert;\n this.tlsKey = options.tlsKey;\n }\n\n async connect(): Promise<void> {\n if (this.connected) return;\n\n if (this.useTls) {\n await this.connectWithPowAndTls();\n } else {\n await this.connectPlainTcp();\n }\n }\n\n /**\n * Connect with PoW challenge + TLS upgrade (default for Cocoon proxies).\n */\n private async connectWithPowAndTls(): Promise<void> {\n // Step 1: Raw TCP connect\n const rawSocket = await this.rawTcpConnect();\n this.rawSocket = rawSocket;\n\n try {\n // Step 2: Read PoW challenge and solve it\n await this.handlePow(rawSocket);\n\n // Step 3: Upgrade to TLS\n this.socket = await this.upgradeTls(rawSocket);\n } catch (err) {\n rawSocket.destroy();\n this.rawSocket = null;\n throw err;\n }\n\n this.connected = true;\n this.setupSocketHandlers(this.socket);\n this.emit('ready');\n }\n\n /**\n * Connect with plain TCP (no PoW, no TLS).\n */\n private async connectPlainTcp(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const onConnect = () => {\n this.connected = true;\n this.setupSocketHandlers(this.socket!);\n this.emit('ready');\n resolve();\n };\n\n const onError = (err: Error) => {\n reject(\n new ConnectionError(\n `Failed to connect to ${this.host}:${this.port}: ${err.message}`,\n err,\n ),\n );\n };\n\n this.socket = net.connect({ host: this.host, port: this.port }, onConnect);\n this.socket.setTimeout(this.timeout);\n this.socket.once('error', onError);\n });\n }\n\n private rawTcpConnect(): Promise<net.Socket> {\n return new Promise<net.Socket>((resolve, reject) => {\n const sock = net.connect({ host: this.host, port: this.port }, () => {\n sock.removeListener('error', onError);\n resolve(sock);\n });\n\n sock.setTimeout(this.timeout);\n\n const onError = (err: Error) => {\n reject(\n new ConnectionError(\n `Failed to connect to ${this.host}:${this.port}: ${err.message}`,\n err,\n ),\n );\n };\n\n sock.once('error', onError);\n });\n }\n\n private handlePow(sock: net.Socket): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let powBuffer = Buffer.alloc(0);\n\n const timer = setTimeout(() => {\n sock.removeListener('data', onData);\n reject(new ConnectionError('Timeout waiting for PoW challenge'));\n }, 30_000);\n\n const onData = (chunk: Buffer) => {\n powBuffer = Buffer.concat([powBuffer, chunk]);\n\n // Check if first 4 bytes are the PoW magic\n if (powBuffer.length >= 4) {\n const magic = powBuffer.readUInt32LE(0);\n if (magic !== POW_CHALLENGE_MAGIC) {\n clearTimeout(timer);\n sock.removeListener('data', onData);\n reject(\n new ConnectionError(\n `Unexpected data from proxy (expected PoW challenge): 0x${magic.toString(16)}`,\n ),\n );\n return;\n }\n }\n\n if (powBuffer.length >= POW_CHALLENGE_SIZE) {\n clearTimeout(timer);\n sock.removeListener('data', onData);\n\n try {\n const challenge = parsePowChallenge(powBuffer);\n const nonce = solvePow(challenge);\n const response = buildPowResponse(nonce);\n sock.write(response, (err) => {\n if (err) {\n reject(new ConnectionError(`Failed to send PoW response: ${err.message}`, err));\n } else {\n resolve();\n }\n });\n } catch (err) {\n reject(\n new ConnectionError(\n `PoW failed: ${err instanceof Error ? err.message : err}`,\n err instanceof Error ? err : undefined,\n ),\n );\n }\n }\n };\n\n sock.on('data', onData);\n });\n }\n\n private upgradeTls(rawSocket: net.Socket): Promise<tls.TLSSocket> {\n return new Promise<tls.TLSSocket>((resolve, reject) => {\n const tlsOptions: tls.ConnectionOptions = {\n socket: rawSocket,\n rejectUnauthorized: false, // Cocoon uses custom TDX attestation, not standard CA\n };\n\n // RA-TLS: pass client certificate and key for mTLS\n if (this.tlsCert) tlsOptions.cert = this.tlsCert;\n if (this.tlsKey) tlsOptions.key = this.tlsKey;\n\n const tlsSocket = tls.connect(tlsOptions);\n\n const timer = setTimeout(() => {\n cleanup(() => reject(new ConnectionError('TLS handshake timeout')));\n }, this.timeout);\n\n const cleanup = (next?: () => void) => {\n clearTimeout(timer);\n tlsSocket.removeListener('secureConnect', onSecureConnect);\n tlsSocket.removeListener('error', onError);\n tlsSocket.removeListener('close', onClose);\n if (next) next();\n };\n\n const onSecureConnect = () => {\n cleanup(() => resolve(tlsSocket));\n };\n\n const onError = (err: Error) => {\n cleanup(() => reject(new ConnectionError(`TLS handshake failed: ${err.message}`, err)));\n };\n\n const onClose = () => {\n cleanup(() => reject(new ConnectionError('TLS socket closed before handshake completed')));\n };\n\n tlsSocket.once('secureConnect', onSecureConnect);\n tlsSocket.once('error', onError);\n tlsSocket.once('close', onClose);\n });\n }\n\n private setupSocketHandlers(sock: net.Socket | tls.TLSSocket): void {\n sock.setTimeout(this.timeout);\n sock.on('data', (data: Buffer) => this.onData(data));\n sock.on('close', () => this.onClose());\n sock.on('timeout', () => {\n this.destroy(new ConnectionError('Connection timed out'));\n });\n sock.on('error', (err: Error) => {\n if (this.connected) {\n this.destroy(new ConnectionError(`Socket error: ${err.message}`, err));\n }\n });\n }\n\n /**\n * Send a framed packet: [4b size][4b seqno][payload]\n */\n send(payload: Buffer): void {\n if (!this.socket || this.destroyed) {\n throw new ConnectionError('Not connected');\n }\n\n const frame = Buffer.alloc(8 + payload.length);\n frame.writeUInt32LE(payload.length, 0); // size\n frame.writeInt32LE(this.outSeqno, 4); // seqno\n payload.copy(frame, 8);\n\n this.outSeqno++;\n this.socket.write(frame);\n }\n\n destroy(error?: Error): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.connected = false;\n\n if (this.socket) {\n this.socket.destroy();\n this.socket = null;\n }\n\n if (this.rawSocket) {\n this.rawSocket.destroy();\n this.rawSocket = null;\n }\n\n this.emit('close', error);\n }\n\n get isConnected(): boolean {\n return this.connected && !this.destroyed;\n }\n\n private onData(chunk: Buffer): void {\n this.readBuffer = Buffer.concat([this.readBuffer, chunk]);\n this.processFrames();\n }\n\n private processFrames(): void {\n while (this.readBuffer.length >= 8) {\n const size = this.readBuffer.readUInt32LE(0);\n\n if (size > 1 << 24 || size < 0) {\n this.destroy(new ConnectionError(`Invalid frame size: ${size}`));\n return;\n }\n\n const totalFrameSize = 8 + size;\n if (this.readBuffer.length < totalFrameSize) {\n break; // Wait for more data\n }\n\n const seqno = this.readBuffer.readInt32LE(4);\n if (seqno !== this.inSeqno) {\n this.destroy(\n new ConnectionError(`Sequence number mismatch: expected ${this.inSeqno}, got ${seqno}`),\n );\n return;\n }\n\n const payload = Buffer.alloc(size);\n this.readBuffer.copy(payload, 0, 8, totalFrameSize);\n this.readBuffer = this.readBuffer.subarray(totalFrameSize);\n\n this.inSeqno++;\n this.emit('frame', payload);\n }\n }\n\n private onClose(): void {\n if (!this.destroyed) {\n this.destroy();\n }\n }\n}\n","/**\n * Error classes for the Cocoon SDK.\n */\n\nexport class CocoonError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CocoonError';\n }\n}\n\nexport class ConnectionError extends CocoonError {\n constructor(\n message: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'ConnectionError';\n }\n}\n\nexport class ProtocolError extends CocoonError {\n constructor(\n message: string,\n public readonly code?: number,\n ) {\n super(message);\n this.name = 'ProtocolError';\n }\n}\n\nexport class APIError extends CocoonError {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly errorBody?: unknown,\n ) {\n super(message);\n this.name = 'APIError';\n }\n}\n\nexport class AuthenticationError extends CocoonError {\n constructor(\n message: string,\n public readonly code?: number,\n ) {\n super(message);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class TimeoutError extends CocoonError {\n constructor(message = 'Request timed out') {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n","/**\n * Proof-of-Work solver for Cocoon proxy connections.\n *\n * Before TLS handshake, the proxy sends a PoW challenge:\n * [4B LE magic=0x418e1291] [4B LE difficulty_bits] [16B salt]\n *\n * Client must find a nonce (uint64) such that SHA256(salt || nonce)\n * has at least `difficulty_bits` leading zero bits.\n *\n * Response format:\n * [4B LE magic=0x01827319] [8B LE nonce]\n */\n\nimport crypto from 'node:crypto';\n\nexport const POW_CHALLENGE_MAGIC = 0x418e1291;\nexport const POW_RESPONSE_MAGIC = 0x01827319;\nexport const POW_CHALLENGE_SIZE = 24; // 4 + 4 + 16\nexport const POW_RESPONSE_SIZE = 12; // 4 + 8\nconst MAX_DIFFICULTY = 32;\n\nexport interface PowChallenge {\n difficultyBits: number;\n salt: Buffer;\n}\n\nexport function parsePowChallenge(data: Buffer): PowChallenge {\n if (data.length < POW_CHALLENGE_SIZE) {\n throw new Error(\n `PoW challenge too short: ${data.length} bytes, expected ${POW_CHALLENGE_SIZE}`,\n );\n }\n\n const magic = data.readUInt32LE(0);\n if (magic !== POW_CHALLENGE_MAGIC) {\n throw new Error(\n `Invalid PoW magic: 0x${magic.toString(16)}, expected 0x${POW_CHALLENGE_MAGIC.toString(16)}`,\n );\n }\n\n const difficultyBits = data.readInt32LE(4);\n if (difficultyBits < 0 || difficultyBits > MAX_DIFFICULTY) {\n throw new Error(`PoW difficulty out of range: ${difficultyBits}`);\n }\n\n const salt = Buffer.alloc(16);\n data.copy(salt, 0, 8, 24);\n\n return { difficultyBits, salt };\n}\n\n/**\n * Check PoW: read first 8 bytes of hash as LE uint64,\n * count leading zeros of that value.\n *\n * The C++ implementation does:\n * count_leading_zeroes_u64(*(uint64_t*)hash_bytes) >= difficulty\n * On x86 (LE), this reads hash[0..7] in LE order, making hash[7]\n * the most significant byte of the uint64.\n */\nfunction checkPow(hash: Buffer, difficultyBits: number): boolean {\n // Read first 8 hash bytes as LE uint64, then count leading zeros\n // Leading zeros of LE uint64 → check bytes 7,6,5,... (MSB first)\n let remaining = difficultyBits;\n for (let i = 7; i >= 0 && remaining > 0; i--) {\n const byte = hash[i]!;\n if (remaining >= 8) {\n if (byte !== 0) return false;\n remaining -= 8;\n } else {\n // Check top `remaining` bits of this byte\n const mask = 0xff << (8 - remaining);\n if ((byte & mask) !== 0) return false;\n remaining = 0;\n }\n }\n return true;\n}\n\nexport function solvePow(challenge: PowChallenge): bigint {\n const { difficultyBits, salt } = challenge;\n\n if (difficultyBits === 0) return 0n;\n\n // Preallocate buffer: salt(16) + nonce(8)\n const input = Buffer.alloc(24);\n salt.copy(input, 0);\n\n for (let nonce = 0n; ; nonce++) {\n input.writeBigUInt64LE(nonce, 16);\n const hash = crypto.createHash('sha256').update(input).digest();\n if (checkPow(hash, difficultyBits)) {\n return nonce;\n }\n }\n}\n\nexport function buildPowResponse(nonce: bigint): Buffer {\n const buf = Buffer.alloc(POW_RESPONSE_SIZE);\n buf.writeUInt32LE(POW_RESPONSE_MAGIC, 0);\n buf.writeBigUInt64LE(nonce, 4);\n return buf;\n}\n","/**\n * TL Schema definitions with constructor IDs.\n *\n * Constructor IDs are CRC32 of the normalized TL definition string.\n * IDs with # suffix in the .tl file are explicit; others are computed.\n *\n * The schema maps _type names to their constructor ID and field definitions.\n */\n\nexport type TLFieldType =\n | 'int'\n | 'long'\n | 'double'\n | 'int128'\n | 'int256'\n | 'string'\n | 'bytes'\n | 'Bool'\n | 'true' // bare true (flag field present = true)\n | { vector: TLFieldType; bare?: boolean }\n | { ref: string }; // reference to another TL type by _type name\n\nexport interface TLFieldDef {\n name: string;\n type: TLFieldType;\n flag?: { field: string; bit: number }; // conditional field\n}\n\nexport interface TLConstructorDef {\n id: number; // CRC32 constructor ID (uint32)\n fields: TLFieldDef[];\n isFunction?: boolean;\n}\n\n/**\n * CRC32 lookup table (IEEE polynomial)\n */\nconst crc32Table = new Uint32Array(256);\nfor (let i = 0; i < 256; i++) {\n let c = i;\n for (let j = 0; j < 8; j++) {\n if (c & 1) {\n c = 0xedb88320 ^ (c >>> 1);\n } else {\n c = c >>> 1;\n }\n }\n crc32Table[i] = c;\n}\n\nexport function crc32(str: string): number {\n const bytes = Buffer.from(str, 'utf-8');\n let crc = 0xffffffff;\n for (let i = 0; i < bytes.length; i++) {\n crc = crc32Table[(crc ^ bytes[i]!) & 0xff]! ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\n/**\n * Compute TL constructor ID from its definition line.\n * We normalize by removing comments and extra spaces.\n */\nfunction tlId(definition: string): number {\n return crc32(definition.trim());\n}\n\n// --- TCP Layer ---\n// From cocoon_api.tl:\n// tcp.ping id:long = tcp.Packet;\n// tcp.pong id:long = tcp.Packet;\n// tcp.packet data:bytes = tcp.Packet;\n// tcp.queryAnswer id:long data:bytes = tcp.Packet;\n// tcp.queryError id:long code:int message:string = tcp.Packet;\n// tcp.query id:long data:bytes = tcp.Packet;\n// tcp.connected id:long = tcp.Packet;\n// tcp.connect id:long = tcp.Packet;\n\nexport const TL_SCHEMA: Record<string, TLConstructorDef> = {\n // --- TCP Layer ---\n 'tcp.ping': {\n id: tlId('tcp.ping id:long = tcp.Packet'),\n fields: [{ name: 'id', type: 'long' }],\n },\n 'tcp.pong': {\n id: tlId('tcp.pong id:long = tcp.Packet'),\n fields: [{ name: 'id', type: 'long' }],\n },\n 'tcp.packet': {\n id: tlId('tcp.packet data:bytes = tcp.Packet'),\n fields: [{ name: 'data', type: 'bytes' }],\n },\n 'tcp.queryAnswer': {\n id: tlId('tcp.queryAnswer id:long data:bytes = tcp.Packet'),\n fields: [\n { name: 'id', type: 'long' },\n { name: 'data', type: 'bytes' },\n ],\n },\n 'tcp.queryError': {\n id: tlId('tcp.queryError id:long code:int message:string = tcp.Packet'),\n fields: [\n { name: 'id', type: 'long' },\n { name: 'code', type: 'int' },\n { name: 'message', type: 'string' },\n ],\n },\n 'tcp.query': {\n id: tlId('tcp.query id:long data:bytes = tcp.Packet'),\n fields: [\n { name: 'id', type: 'long' },\n { name: 'data', type: 'bytes' },\n ],\n },\n 'tcp.connected': {\n id: tlId('tcp.connected id:long = tcp.Packet'),\n fields: [{ name: 'id', type: 'long' }],\n },\n 'tcp.connect': {\n id: tlId('tcp.connect id:long = tcp.Packet'),\n fields: [{ name: 'id', type: 'long' }],\n },\n\n // --- Tokens ---\n tokensUsed: {\n id: tlId(\n 'tokensUsed prompt_tokens_used:long cached_tokens_used:long completion_tokens_used:long reasoning_tokens_used:long total_tokens_used:long = TokensUsed',\n ),\n fields: [\n { name: 'promptTokensUsed', type: 'long' },\n { name: 'cachedTokensUsed', type: 'long' },\n { name: 'completionTokensUsed', type: 'long' },\n { name: 'reasoningTokensUsed', type: 'long' },\n { name: 'totalTokensUsed', type: 'long' },\n ],\n },\n\n // --- Client/Proxy Params ---\n // worker.params has explicit ID: #869c73ed\n 'worker.params': {\n id: 0x869c73ed,\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'workerOwnerAddress', type: 'string' },\n { name: 'model', type: 'string' },\n { name: 'coefficient', type: 'int' },\n { name: 'isTest', type: 'Bool', flag: { field: 'flags', bit: 0 } },\n { name: 'proxyCnt', type: 'int', flag: { field: 'flags', bit: 0 } },\n { name: 'maxActiveRequests', type: 'int', flag: { field: 'flags', bit: 0 } },\n { name: 'minProtoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n { name: 'maxProtoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n ],\n },\n\n // proxy.params has explicit ID: #d5c5609f\n 'proxy.params': {\n id: 0xd5c5609f,\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'proxyPublicKey', type: 'int256' },\n { name: 'proxyOwnerAddress', type: 'string' },\n { name: 'proxyScAddress', type: 'string' },\n { name: 'isTest', type: 'Bool', flag: { field: 'flags', bit: 0 } },\n { name: 'protoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n ],\n },\n\n // client.params has explicit ID: #40fdca64\n 'client.params': {\n id: 0x40fdca64,\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'clientOwnerAddress', type: 'string' },\n { name: 'isTest', type: 'Bool', flag: { field: 'flags', bit: 0 } },\n { name: 'minProtoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n { name: 'maxProtoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n ],\n },\n\n // --- Auth ---\n 'client.proxyConnectionAuthShort': {\n id: tlId(\n 'client.proxyConnectionAuthShort secret_hash:int256 nonce:long = client.ProxyConnectionAuth',\n ),\n fields: [\n { name: 'secretHash', type: 'int256' },\n { name: 'nonce', type: 'long' },\n ],\n },\n 'client.proxyConnectionAuthLong': {\n id: tlId('client.proxyConnectionAuthLong nonce:long = client.ProxyConnectionAuth'),\n fields: [{ name: 'nonce', type: 'long' }],\n },\n\n // --- Signed Payment ---\n 'proxy.signedPayment': {\n id: tlId('proxy.signedPayment data:bytes = proxy.SignedPayment'),\n fields: [{ name: 'data', type: 'bytes' }],\n },\n 'proxy.signedPaymentEmpty': {\n id: tlId('proxy.signedPaymentEmpty = proxy.SignedPayment'),\n fields: [],\n },\n\n // --- Connected To Proxy ---\n 'client.connectedToProxy': {\n id: tlId(\n 'client.connectedToProxy params:proxy.params client_sc_address:string auth:client.ProxyConnectionAuth signed_payment:proxy.SignedPayment = client.ConnectedToProxy',\n ),\n fields: [\n { name: 'params', type: { ref: 'proxy.params' } },\n { name: 'clientScAddress', type: 'string' },\n { name: 'auth', type: { ref: 'client.ProxyConnectionAuth' } },\n { name: 'signedPayment', type: { ref: 'proxy.SignedPayment' } },\n ],\n },\n\n // --- Auth Responses ---\n 'client.authorizationWithProxySuccess': {\n id: tlId(\n 'client.authorizationWithProxySuccess signed_payment:proxy.SignedPayment tokens_committed_to_db:long max_tokens:long = client.AuthorizationWithProxy',\n ),\n fields: [\n { name: 'signedPayment', type: { ref: 'proxy.SignedPayment' } },\n { name: 'tokensCommittedToDb', type: 'long' },\n { name: 'maxTokens', type: 'long' },\n ],\n },\n 'client.authorizationWithProxyFailed': {\n id: tlId(\n 'client.authorizationWithProxyFailed error_code:int error:string = client.AuthorizationWithProxy',\n ),\n fields: [\n { name: 'errorCode', type: 'int' },\n { name: 'error', type: 'string' },\n ],\n },\n\n // --- Query Final Info ---\n 'client.queryFinalInfo': {\n id: tlId(\n 'client.queryFinalInfo flags:# tokens_used:tokensUsed worker_debug:flags.0?string proxy_debug:flags.0?string proxy_start_time:flags.1?double proxy_end_time:flags.1?double worker_start_time:flags.1?double worker_end_time:flags.1?double = client.QueryFinalInfo',\n ),\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'tokensUsed', type: { ref: 'tokensUsed' } },\n { name: 'workerDebug', type: 'string', flag: { field: 'flags', bit: 0 } },\n { name: 'proxyDebug', type: 'string', flag: { field: 'flags', bit: 0 } },\n { name: 'proxyStartTime', type: 'double', flag: { field: 'flags', bit: 1 } },\n { name: 'proxyEndTime', type: 'double', flag: { field: 'flags', bit: 1 } },\n { name: 'workerStartTime', type: 'double', flag: { field: 'flags', bit: 1 } },\n { name: 'workerEndTime', type: 'double', flag: { field: 'flags', bit: 1 } },\n ],\n },\n\n // --- Query Answer Ex variants ---\n // Legacy variants (still sent by some proxy paths):\n 'client.queryAnswer': {\n id: tlId(\n 'client.queryAnswer answer:bytes is_completed:Bool request_id:int256 request_tokens_used:tokensUsed = client.QueryAnswer',\n ),\n fields: [\n { name: 'answer', type: 'bytes' },\n { name: 'isCompleted', type: 'Bool' },\n { name: 'requestId', type: 'int256' },\n { name: 'requestTokensUsed', type: { ref: 'tokensUsed' } },\n ],\n },\n 'client.queryAnswerError': {\n id: tlId(\n 'client.queryAnswerError error_code:int error:string request_id:int256 request_tokens_used:tokensUsed = client.QueryAnswer',\n ),\n fields: [\n { name: 'errorCode', type: 'int' },\n { name: 'error', type: 'string' },\n { name: 'requestId', type: 'int256' },\n { name: 'requestTokensUsed', type: { ref: 'tokensUsed' } },\n ],\n },\n 'client.queryAnswerPart': {\n id: tlId(\n 'client.queryAnswerPart answer:bytes is_completed:Bool request_id:int256 request_tokens_used:tokensUsed = client.QueryAnswerPart',\n ),\n fields: [\n { name: 'answer', type: 'bytes' },\n { name: 'isCompleted', type: 'Bool' },\n { name: 'requestId', type: 'int256' },\n { name: 'requestTokensUsed', type: { ref: 'tokensUsed' } },\n ],\n },\n 'client.queryAnswerPartError': {\n id: tlId(\n 'client.queryAnswerPartError error_code:int error:string request_id:int256 request_tokens_used:tokensUsed = client.QueryAnswerPart',\n ),\n fields: [\n { name: 'errorCode', type: 'int' },\n { name: 'error', type: 'string' },\n { name: 'requestId', type: 'int256' },\n { name: 'requestTokensUsed', type: { ref: 'tokensUsed' } },\n ],\n },\n\n 'client.queryAnswerEx': {\n id: tlId(\n 'client.queryAnswerEx request_id:int256 answer:bytes flags:# final_info:flags.0?client.queryFinalInfo = client.QueryAnswerEx',\n ),\n fields: [\n { name: 'requestId', type: 'int256' },\n { name: 'answer', type: 'bytes' },\n { name: 'flags', type: 'int' },\n {\n name: 'finalInfo',\n type: { ref: 'client.queryFinalInfo' },\n flag: { field: 'flags', bit: 0 },\n },\n ],\n },\n 'client.queryAnswerErrorEx': {\n id: tlId(\n 'client.queryAnswerErrorEx request_id:int256 error_code:int error:string flags:# final_info:flags.0?client.queryFinalInfo = client.QueryAnswerEx',\n ),\n fields: [\n { name: 'requestId', type: 'int256' },\n { name: 'errorCode', type: 'int' },\n { name: 'error', type: 'string' },\n { name: 'flags', type: 'int' },\n {\n name: 'finalInfo',\n type: { ref: 'client.queryFinalInfo' },\n flag: { field: 'flags', bit: 0 },\n },\n ],\n },\n 'client.queryAnswerPartEx': {\n id: tlId(\n 'client.queryAnswerPartEx request_id:int256 answer:bytes flags:# final_info:flags.0?client.queryFinalInfo = client.QueryAnswerEx',\n ),\n fields: [\n { name: 'requestId', type: 'int256' },\n { name: 'answer', type: 'bytes' },\n { name: 'flags', type: 'int' },\n {\n name: 'finalInfo',\n type: { ref: 'client.queryFinalInfo' },\n flag: { field: 'flags', bit: 0 },\n },\n ],\n },\n\n // --- Worker Types V2 ---\n // client.workerInstanceV2 has explicit ID: #3ea93d00\n 'client.workerInstanceV2': {\n id: 0x3ea93d00,\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'coefficient', type: 'int' },\n { name: 'activeRequests', type: 'int' },\n { name: 'maxActiveRequests', type: 'int' },\n ],\n },\n 'client.workerTypeV2': {\n // NOTE: Telegram TL canonical CRC for vector fields uses \"vector T\" syntax.\n // Equivalent canonical form:\n // \"client.workerTypeV2 name:string workers:vector client.workerInstanceV2 = client.WorkerTypeV2\"\n id: 0xb27d8197,\n fields: [\n { name: 'name', type: 'string' },\n { name: 'workers', type: { vector: { ref: 'client.workerInstanceV2' }, bare: true } },\n ],\n },\n 'client.workerTypesV2': {\n // Canonical form:\n // \"client.workerTypesV2 types:vector client.workerTypeV2 = client.WorkerTypesV2\"\n id: 0x0cf0dc67,\n fields: [{ name: 'types', type: { vector: { ref: 'client.workerTypeV2' }, bare: true } }],\n },\n\n // --- Payment ---\n 'client.paymentStatus': {\n id: tlId(\n 'client.paymentStatus signed_payment:proxy.SignedPayment db_tokens:long max_tokens:long = client.PaymentStatus',\n ),\n fields: [\n { name: 'signedPayment', type: { ref: 'proxy.SignedPayment' } },\n { name: 'dbTokens', type: 'long' },\n { name: 'maxTokens', type: 'long' },\n ],\n },\n\n // Payment request from proxy to client (may be sent during query flow).\n 'proxy.clientRequestPayment': {\n id: tlId(\n 'proxy.clientRequestPayment request_id:int256 signed_payment:proxy.SignedPayment db_tokens:long max_tokens:long request_tokens:long = proxy.WorkerRequestPayment',\n ),\n fields: [\n { name: 'requestId', type: 'int256' },\n { name: 'signedPayment', type: { ref: 'proxy.SignedPayment' } },\n { name: 'dbTokens', type: 'long' },\n { name: 'maxTokens', type: 'long' },\n { name: 'requestTokens', type: 'long' },\n ],\n },\n\n 'client.refund': {\n id: tlId('client.refund data:bytes = client.Refund'),\n fields: [{ name: 'data', type: 'bytes' }],\n },\n 'client.refundRejected': {\n id: tlId('client.refundRejected active_queries:long = client.Refund'),\n fields: [{ name: 'activeQueries', type: 'long' }],\n },\n\n // --- HTTP ---\n 'http.header': {\n id: tlId('http.header name:string value:string = http.Header'),\n fields: [\n { name: 'name', type: 'string' },\n { name: 'value', type: 'string' },\n ],\n },\n 'http.response': {\n // Canonical vector form for CRC:\n // \"http.response http_version:string status_code:int reason:string headers:vector http.header payload:bytes = http.Response\"\n id: 0x1cd0c42b,\n fields: [\n { name: 'httpVersion', type: 'string' },\n { name: 'statusCode', type: 'int' },\n { name: 'reason', type: 'string' },\n { name: 'headers', type: { vector: { ref: 'http.header' }, bare: true } },\n { name: 'payload', type: 'bytes' },\n ],\n },\n 'http.request': {\n // Canonical vector form for CRC:\n // \"http.request method:string url:string http_version:string headers:vector http.header payload:bytes = http.Response\"\n id: 0x47492de5,\n fields: [\n { name: 'method', type: 'string' },\n { name: 'url', type: 'string' },\n { name: 'httpVersion', type: 'string' },\n { name: 'headers', type: { vector: { ref: 'http.header' }, bare: true } },\n { name: 'payload', type: 'bytes' },\n ],\n isFunction: true,\n },\n\n // --- Root Config ---\n 'rootConfig.registeredProxy': {\n id: tlId('rootConfig.registeredProxy seqno:int address:string = rootConfig.RegisteredProxy'),\n fields: [\n { name: 'seqno', type: 'int' },\n { name: 'address', type: 'string' },\n ],\n },\n\n // --- Functions ---\n 'client.connectToProxy': {\n id: tlId(\n 'client.connectToProxy params:client.params min_config_version:int = client.ConnectedToProxy',\n ),\n fields: [\n { name: 'params', type: { ref: 'client.params' } },\n { name: 'minConfigVersion', type: 'int' },\n ],\n isFunction: true,\n },\n 'client.authorizeWithProxyShort': {\n id: tlId('client.authorizeWithProxyShort data:bytes = client.AuthorizationWithProxy'),\n fields: [{ name: 'data', type: 'bytes' }],\n isFunction: true,\n },\n 'client.authorizeWithProxyLong': {\n id: tlId('client.authorizeWithProxyLong = client.AuthorizationWithProxy'),\n fields: [],\n isFunction: true,\n },\n 'client.runQueryEx': {\n id: tlId(\n 'client.runQueryEx model_name:string query:bytes max_coefficient:int max_tokens:int timeout:double request_id:int256 min_config_version:int flags:# enable_debug:flags.0?Bool = client.QueryAnswerEx',\n ),\n fields: [\n { name: 'modelName', type: 'string' },\n { name: 'query', type: 'bytes' },\n { name: 'maxCoefficient', type: 'int' },\n { name: 'maxTokens', type: 'int' },\n { name: 'timeout', type: 'double' },\n { name: 'requestId', type: 'int256' },\n { name: 'minConfigVersion', type: 'int' },\n { name: 'flags', type: 'int' },\n { name: 'enableDebug', type: 'Bool', flag: { field: 'flags', bit: 0 } },\n ],\n isFunction: true,\n },\n 'client.getWorkerTypesV2': {\n id: tlId('client.getWorkerTypesV2 = client.WorkerTypesV2'),\n fields: [],\n isFunction: true,\n },\n 'client.updatePaymentStatus': {\n id: tlId('client.updatePaymentStatus = client.PaymentStatus'),\n fields: [],\n isFunction: true,\n },\n 'client.requestRefund': {\n id: tlId('client.requestRefund = client.Refund'),\n fields: [],\n isFunction: true,\n },\n};\n\n// Build reverse lookup: constructor ID → type name\nexport const CONSTRUCTOR_ID_MAP: Map<number, string> = new Map();\nfor (const [name, def] of Object.entries(TL_SCHEMA)) {\n CONSTRUCTOR_ID_MAP.set(def.id, name);\n}\n\n// Polymorphic type → concrete constructors\nexport const POLYMORPHIC_TYPES: Record<string, string[]> = {\n 'tcp.Packet': [\n 'tcp.ping',\n 'tcp.pong',\n 'tcp.packet',\n 'tcp.queryAnswer',\n 'tcp.queryError',\n 'tcp.query',\n 'tcp.connected',\n 'tcp.connect',\n ],\n 'client.ProxyConnectionAuth': [\n 'client.proxyConnectionAuthShort',\n 'client.proxyConnectionAuthLong',\n ],\n 'proxy.SignedPayment': ['proxy.signedPayment', 'proxy.signedPaymentEmpty'],\n 'client.AuthorizationWithProxy': [\n 'client.authorizationWithProxySuccess',\n 'client.authorizationWithProxyFailed',\n ],\n 'client.QueryAnswerEx': [\n 'client.queryAnswerEx',\n 'client.queryAnswerErrorEx',\n 'client.queryAnswerPartEx',\n ],\n 'client.Refund': ['client.refund', 'client.refundRejected'],\n};\n","/**\n * TL Binary Serializer.\n *\n * Serializes TL objects into binary format following the TL specification:\n * - int: 4 bytes LE\n * - long: 8 bytes LE\n * - double: 8 bytes LE (IEEE 754)\n * - int128: 16 bytes raw\n * - int256: 32 bytes raw\n * - string/bytes: length-prefixed with padding to 4-byte alignment\n * - vector: constructor_id(0x1cb5c415) + count + elements\n * - Bool: boolTrue(0x997275b5) or boolFalse(0xbc799737)\n */\n\nimport {\n TL_SCHEMA,\n POLYMORPHIC_TYPES,\n type TLFieldType,\n type TLConstructorDef,\n} from './schema.js';\n\nconst VECTOR_ID = 0x1cb5c415;\nconst BOOL_TRUE_ID = 0x997275b5;\nconst BOOL_FALSE_ID = 0xbc799737;\n\nexport class TLSerializer {\n private buffers: Buffer[] = [];\n private totalLength = 0;\n\n writeInt(value: number): void {\n const buf = Buffer.alloc(4);\n buf.writeInt32LE(value, 0);\n this.push(buf);\n }\n\n writeUInt(value: number): void {\n const buf = Buffer.alloc(4);\n buf.writeUInt32LE(value, 0);\n this.push(buf);\n }\n\n writeLong(value: bigint): void {\n const buf = Buffer.alloc(8);\n buf.writeBigInt64LE(value, 0);\n this.push(buf);\n }\n\n writeDouble(value: number): void {\n const buf = Buffer.alloc(8);\n buf.writeDoubleLE(value, 0);\n this.push(buf);\n }\n\n writeInt128(value: Buffer): void {\n if (value.length !== 16) throw new Error(`int128 must be 16 bytes, got ${value.length}`);\n this.push(value);\n }\n\n writeInt256(value: Buffer): void {\n if (value.length !== 32) throw new Error(`int256 must be 32 bytes, got ${value.length}`);\n this.push(value);\n }\n\n writeBytes(value: Buffer): void {\n let headerLen: number;\n if (value.length < 254) {\n const header = Buffer.alloc(1);\n header[0] = value.length;\n this.push(header);\n headerLen = 1;\n } else {\n const header = Buffer.alloc(4);\n header[0] = 254;\n header[1] = value.length & 0xff;\n header[2] = (value.length >> 8) & 0xff;\n header[3] = (value.length >> 16) & 0xff;\n this.push(header);\n headerLen = 4;\n }\n this.push(value);\n // Pad to 4-byte alignment\n const totalLen = headerLen + value.length;\n const padding = (4 - (totalLen % 4)) % 4;\n if (padding > 0) {\n this.push(Buffer.alloc(padding));\n }\n }\n\n writeString(value: string): void {\n this.writeBytes(Buffer.from(value, 'utf-8'));\n }\n\n writeBool(value: boolean): void {\n this.writeUInt(value ? BOOL_TRUE_ID : BOOL_FALSE_ID);\n }\n\n writeVector(items: unknown[], itemType: TLFieldType, bare = false): void {\n if (!bare) {\n this.writeUInt(VECTOR_ID);\n }\n this.writeInt(items.length);\n for (const item of items) {\n this.writeField(item, itemType);\n }\n }\n\n writeConstructorId(id: number): void {\n this.writeUInt(id);\n }\n\n /**\n * Serialize a TL object by its _type, writing constructor ID + fields.\n * boxed=true writes the constructor ID prefix.\n */\n writeObject(obj: Record<string, unknown>, boxed = true): void {\n const typeName = obj['_type'] as string;\n if (!typeName) throw new Error('TL object must have _type field');\n\n const schema = TL_SCHEMA[typeName];\n if (!schema) throw new Error(`Unknown TL type: ${typeName}`);\n\n if (boxed) {\n this.writeConstructorId(schema.id);\n }\n\n // Compute flags before writing\n this.writeFields(obj, schema);\n }\n\n private writeFields(obj: Record<string, unknown>, schema: TLConstructorDef): void {\n // First pass: compute flags values\n const flagValues: Record<string, number> = {};\n for (const field of schema.fields) {\n if (field.type === 'int' && field.name.toLowerCase().includes('flag')) {\n // Check if this is an explicit flags field\n const isFlags = schema.fields.some((f) => f.flag?.field === field.name);\n if (isFlags) {\n let flags = 0;\n for (const f of schema.fields) {\n if (f.flag?.field === field.name && obj[f.name] !== undefined && obj[f.name] !== null) {\n flags |= 1 << f.flag.bit;\n }\n }\n flagValues[field.name] = flags;\n }\n }\n }\n\n for (const field of schema.fields) {\n // Check if this is a flag field we computed\n if (field.name in flagValues) {\n this.writeInt(flagValues[field.name]!);\n continue;\n }\n\n // Skip conditional fields that are not present\n if (field.flag) {\n const flagVal = flagValues[field.flag.field] ?? (obj[field.flag.field] as number) ?? 0;\n if (!(flagVal & (1 << field.flag.bit))) {\n continue;\n }\n }\n\n const value = obj[field.name];\n this.writeField(value, field.type);\n }\n }\n\n writeField(value: unknown, type: TLFieldType): void {\n if (typeof type === 'string') {\n switch (type) {\n case 'int':\n this.writeInt(value as number);\n break;\n case 'long':\n this.writeLong(value as bigint);\n break;\n case 'double':\n this.writeDouble(value as number);\n break;\n case 'int128':\n this.writeInt128(value as Buffer);\n break;\n case 'int256':\n this.writeInt256(value as Buffer);\n break;\n case 'string':\n this.writeString(value as string);\n break;\n case 'bytes':\n this.writeBytes(value as Buffer);\n break;\n case 'Bool':\n this.writeBool(value as boolean);\n break;\n case 'true':\n // bare true — presence is encoded by the flag bit, no data written\n break;\n default:\n throw new Error(`Unknown primitive type: ${type}`);\n }\n } else if ('vector' in type) {\n this.writeVector(value as unknown[], type.vector, Boolean(type.bare));\n } else if ('ref' in type) {\n // Concrete constructor refs are bare in TL (no nested constructor ID).\n // Polymorphic refs are boxed and must include constructor ID.\n const isPolymorphicRef = type.ref in POLYMORPHIC_TYPES;\n if (isPolymorphicRef) {\n this.writeObject(value as Record<string, unknown>, true);\n return;\n }\n\n if (!(type.ref in TL_SCHEMA)) {\n throw new Error(`Unknown TL ref type: ${type.ref}`);\n }\n\n const obj = value as Record<string, unknown>;\n const nestedType = obj['_type'] as string | undefined;\n if (nestedType && nestedType !== type.ref) {\n throw new Error(`Expected nested type ${type.ref}, got ${nestedType}`);\n }\n this.writeObject(nestedType ? obj : { ...obj, _type: type.ref }, false);\n }\n }\n\n private push(buf: Buffer): void {\n this.buffers.push(buf);\n this.totalLength += buf.length;\n }\n\n toBuffer(): Buffer {\n return Buffer.concat(this.buffers, this.totalLength);\n }\n}\n\n/**\n * Serialize a TL object to a Buffer.\n */\nexport function serializeTLObject(obj: Record<string, unknown>, boxed = true): Buffer {\n const s = new TLSerializer();\n s.writeObject(obj, boxed);\n return s.toBuffer();\n}\n","/**\n * TL Binary Deserializer.\n *\n * Deserializes TL binary data into JavaScript objects.\n */\n\nimport {\n TL_SCHEMA,\n CONSTRUCTOR_ID_MAP,\n POLYMORPHIC_TYPES,\n type TLFieldType,\n type TLConstructorDef,\n} from './schema.js';\n\nconst VECTOR_ID = 0x1cb5c415;\nconst BOOL_TRUE_ID = 0x997275b5;\nconst BOOL_FALSE_ID = 0xbc799737;\n\nexport class TLDeserializer {\n private buffer: Buffer;\n private offset: number;\n\n constructor(buffer: Buffer) {\n this.buffer = buffer;\n this.offset = 0;\n }\n\n get remaining(): number {\n return this.buffer.length - this.offset;\n }\n\n readInt(): number {\n this.checkRemaining(4);\n const value = this.buffer.readInt32LE(this.offset);\n this.offset += 4;\n return value;\n }\n\n readUInt(): number {\n this.checkRemaining(4);\n const value = this.buffer.readUInt32LE(this.offset);\n this.offset += 4;\n return value;\n }\n\n readLong(): bigint {\n this.checkRemaining(8);\n const value = this.buffer.readBigInt64LE(this.offset);\n this.offset += 8;\n return value;\n }\n\n readDouble(): number {\n this.checkRemaining(8);\n const value = this.buffer.readDoubleLE(this.offset);\n this.offset += 8;\n return value;\n }\n\n readInt128(): Buffer {\n this.checkRemaining(16);\n const value = Buffer.alloc(16);\n this.buffer.copy(value, 0, this.offset, this.offset + 16);\n this.offset += 16;\n return value;\n }\n\n readInt256(): Buffer {\n this.checkRemaining(32);\n const value = Buffer.alloc(32);\n this.buffer.copy(value, 0, this.offset, this.offset + 32);\n this.offset += 32;\n return value;\n }\n\n readBytes(): Buffer {\n this.checkRemaining(1);\n let length: number;\n let headerLen: number;\n\n const firstByte = this.buffer[this.offset]!;\n if (firstByte < 254) {\n length = firstByte;\n headerLen = 1;\n this.offset += 1;\n } else {\n this.checkRemaining(4);\n length =\n this.buffer[this.offset + 1]! |\n (this.buffer[this.offset + 2]! << 8) |\n (this.buffer[this.offset + 3]! << 16);\n headerLen = 4;\n this.offset += 4;\n }\n\n this.checkRemaining(length);\n const value = Buffer.alloc(length);\n this.buffer.copy(value, 0, this.offset, this.offset + length);\n this.offset += length;\n\n // Skip padding\n const totalLen = headerLen + length;\n const padding = (4 - (totalLen % 4)) % 4;\n this.offset += padding;\n\n return value;\n }\n\n readString(): string {\n return this.readBytes().toString('utf-8');\n }\n\n readBool(): boolean {\n const id = this.readUInt();\n if (id === BOOL_TRUE_ID) return true;\n if (id === BOOL_FALSE_ID) return false;\n throw new Error(`Invalid Bool constructor ID: 0x${id.toString(16)}`);\n }\n\n readVector(itemType: TLFieldType, bare = false): unknown[] {\n if (!bare) {\n const id = this.readUInt();\n if (id !== VECTOR_ID) {\n throw new Error(\n `Expected vector constructor ID 0x${VECTOR_ID.toString(16)}, got 0x${id.toString(16)}`,\n );\n }\n }\n const count = this.readInt();\n const items: unknown[] = [];\n for (let i = 0; i < count; i++) {\n items.push(this.readField(itemType));\n }\n return items;\n }\n\n /**\n * Read a boxed TL object: reads constructor ID, looks up schema, reads fields.\n */\n readObject(): Record<string, unknown> {\n const constructorId = this.readUInt();\n const typeName = CONSTRUCTOR_ID_MAP.get(constructorId);\n if (!typeName) {\n throw new Error(\n `Unknown TL constructor ID: 0x${constructorId.toString(16).padStart(8, '0')}`,\n );\n }\n\n const schema = TL_SCHEMA[typeName]!;\n return this.readFields(typeName, schema);\n }\n\n /**\n * Read fields of a known TL type (without reading constructor ID).\n */\n readObjectBare(typeName: string): Record<string, unknown> {\n const schema = TL_SCHEMA[typeName];\n if (!schema) throw new Error(`Unknown TL type: ${typeName}`);\n return this.readFields(typeName, schema);\n }\n\n private readFields(typeName: string, schema: TLConstructorDef): Record<string, unknown> {\n const result: Record<string, unknown> = { _type: typeName };\n const flagValues: Record<string, number> = {};\n\n for (const field of schema.fields) {\n // Check if this is a conditional field\n if (field.flag) {\n const flagVal = flagValues[field.flag.field] ?? 0;\n if (!(flagVal & (1 << field.flag.bit))) {\n continue; // Field not present\n }\n }\n\n const value = this.readField(field.type);\n result[field.name] = value;\n\n // Track flag values for conditional fields\n if (field.type === 'int' && schema.fields.some((f) => f.flag?.field === field.name)) {\n flagValues[field.name] = value as number;\n }\n }\n\n return result;\n }\n\n readField(type: TLFieldType): unknown {\n if (typeof type === 'string') {\n switch (type) {\n case 'int':\n return this.readInt();\n case 'long':\n return this.readLong();\n case 'double':\n return this.readDouble();\n case 'int128':\n return this.readInt128();\n case 'int256':\n return this.readInt256();\n case 'string':\n return this.readString();\n case 'bytes':\n return this.readBytes();\n case 'Bool':\n return this.readBool();\n case 'true':\n return true; // Bare true is present by virtue of the flag being set\n default:\n throw new Error(`Unknown primitive type: ${type}`);\n }\n } else if ('vector' in type) {\n return this.readVector(type.vector, Boolean(type.bare));\n } else if ('ref' in type) {\n if (type.ref in POLYMORPHIC_TYPES) {\n // Boxed polymorphic type — constructor ID determines concrete type.\n return this.readObject();\n }\n if (type.ref in TL_SCHEMA) {\n // Concrete constructor refs are bare (no nested constructor ID).\n return this.readObjectBare(type.ref);\n }\n throw new Error(`Unknown TL ref type: ${type.ref}`);\n }\n\n throw new Error(`Unhandled field type: ${JSON.stringify(type)}`);\n }\n\n private checkRemaining(needed: number): void {\n if (this.offset + needed > this.buffer.length) {\n throw new Error(\n `Buffer underflow: need ${needed} bytes at offset ${this.offset}, ` +\n `but only ${this.buffer.length - this.offset} remain`,\n );\n }\n }\n}\n\n/**\n * Deserialize a boxed TL object from a Buffer.\n */\nexport function deserializeTLObject(buffer: Buffer): Record<string, unknown> {\n const d = new TLDeserializer(buffer);\n return d.readObject();\n}\n","/**\n * Cocoon protocol handshake.\n *\n * Flow:\n * 1. Client sends tcp.connect(id) → Server replies tcp.connected(id)\n * 2. Client sends client.connectToProxy(params, minConfigVersion)\n * → Server replies client.connectedToProxy(params, clientScAddress, auth, signedPayment)\n * 3. Auth: short (secret hash match) or long (blockchain registration)\n * - Short: client.authorizeWithProxyShort(secretData)\n * - Long: client.authorizeWithProxyLong() (after on-chain tx)\n * → Server replies client.AuthorizationWithProxy (success or failed)\n */\n\nimport { serializeTLObject } from '../tl/serializer.js';\nimport { deserializeTLObject } from '../tl/deserializer.js';\nimport { CocoonConnection } from './connection.js';\nimport { ConnectionError, AuthenticationError, ProtocolError } from '../error.js';\nimport type {\n TcpConnect,\n TcpConnected,\n ClientParams,\n ClientConnectToProxy,\n ClientConnectedToProxy,\n ClientAuthorizeWithProxyShort,\n ClientAuthorizationWithProxy,\n ProxyParams,\n ProxySignedPaymentType,\n} from '../tl/types.js';\nimport { TL_SCHEMA } from '../tl/schema.js';\nimport crypto from 'node:crypto';\n\nexport interface HandshakeResult {\n proxyParams: ProxyParams;\n clientScAddress: string;\n signedPayment: ProxySignedPaymentType;\n tokensCommittedToDb: bigint;\n maxTokens: bigint;\n protoVersion: number;\n}\n\nexport interface LongAuthContext {\n nonce: bigint;\n clientScAddress: string;\n proxyParams: ProxyParams;\n}\n\nexport type LongAuthHandler = (context: LongAuthContext) => Promise<void>;\n\n/**\n * Perform the full TCP + proxy handshake and authentication.\n */\nexport async function performHandshake(\n conn: CocoonConnection,\n ownerAddress: string,\n secretString: string,\n configVersion: number,\n onLongAuthRequired?: LongAuthHandler,\n): Promise<HandshakeResult> {\n // Step 1: TCP connect\n const tcpId = crypto.randomBytes(8).readBigInt64LE();\n const tcpConnect: TcpConnect = { _type: 'tcp.connect', id: tcpId };\n conn.send(serializeTLObject(tcpConnect as unknown as Record<string, unknown>));\n\n const tcpResponse = await waitForFrame(conn, 30_000);\n const tcpConnected = deserializeTLObject(tcpResponse) as unknown as TcpConnected;\n if (tcpConnected._type !== 'tcp.connected') {\n throw new ProtocolError(`Expected tcp.connected, got ${tcpConnected._type}`);\n }\n\n // Step 2: Connect to proxy\n const clientParams: ClientParams = {\n _type: 'client.params',\n flags: 3, // bit 0 (isTest) + bit 1 (proto versions)\n clientOwnerAddress: ownerAddress,\n isTest: false,\n minProtoVersion: 0,\n maxProtoVersion: 1,\n };\n\n const connectReq: ClientConnectToProxy = {\n _type: 'client.connectToProxy',\n params: clientParams,\n minConfigVersion: configVersion,\n };\n\n // Wrap in tcp.query for handshake\n const queryId = crypto.randomBytes(8).readBigInt64LE();\n sendQuery(conn, queryId, serializeTLObject(connectReq as unknown as Record<string, unknown>));\n\n const connectResponseData = await waitForQueryAnswer(\n conn,\n queryId,\n 30_000,\n 'connectToProxy response',\n );\n const connected = deserializeTLObject(connectResponseData) as unknown as ClientConnectedToProxy;\n if (connected._type !== 'client.connectedToProxy') {\n throw new ProtocolError(`Expected client.connectedToProxy, got ${connected._type}`);\n }\n\n const protoVersion = connected.params.protoVersion ?? 0;\n\n // Step 3: Authenticate\n // Determine auth type from connected response\n const auth = connected.auth;\n let authResult: ClientAuthorizationWithProxy;\n\n if (auth._type === 'client.proxyConnectionAuthShort') {\n // Compute our secret hash and compare\n const ourSecretHash = Buffer.from(crypto.createHash('sha256').update(secretString).digest());\n\n if (ourSecretHash.equals(auth.secretHash)) {\n // Short auth — send secret string\n const authReq: ClientAuthorizeWithProxyShort = {\n _type: 'client.authorizeWithProxyShort',\n data: Buffer.from(secretString, 'utf-8'),\n };\n const authQueryId = crypto.randomBytes(8).readBigInt64LE();\n sendQuery(\n conn,\n authQueryId,\n serializeTLObject(authReq as unknown as Record<string, unknown>),\n );\n const authResponseData = await waitForQueryAnswer(\n conn,\n authQueryId,\n 300_000,\n 'short auth response',\n );\n authResult = deserializeTLObject(authResponseData) as unknown as ClientAuthorizationWithProxy;\n } else {\n // Fallback to long auth\n authResult = await performLongAuth(\n conn,\n connected,\n auth.nonce,\n onLongAuthRequired,\n 'Proxy requested long auth because provided SECRET does not match on-chain secret hash',\n );\n }\n } else {\n // Long auth required\n authResult = await performLongAuth(\n conn,\n connected,\n auth.nonce,\n onLongAuthRequired,\n 'Proxy requires long auth (wallet is not registered for this proxy or SECRET is unavailable)',\n );\n }\n\n if (authResult._type === 'client.authorizationWithProxyFailed') {\n throw new AuthenticationError(`Proxy auth failed: ${authResult.error}`, authResult.errorCode);\n }\n\n if (authResult._type !== 'client.authorizationWithProxySuccess') {\n throw new ProtocolError(\n `Unexpected auth response type: ${(authResult as { _type: string })._type}`,\n );\n }\n\n return {\n proxyParams: connected.params,\n clientScAddress: connected.clientScAddress,\n signedPayment: authResult.signedPayment,\n tokensCommittedToDb: authResult.tokensCommittedToDb,\n maxTokens: authResult.maxTokens,\n protoVersion,\n };\n}\n\nfunction buildHandshakeCloseError(stage: string, error?: Error): ConnectionError {\n const suffix =\n ' This usually means RA-TLS/mTLS client credentials were rejected by the proxy.';\n return new ConnectionError(\n `Connection closed while waiting for ${stage}.${suffix}`,\n error,\n );\n}\n\nasync function performLongAuth(\n conn: CocoonConnection,\n connected: ClientConnectedToProxy,\n nonce: bigint,\n onLongAuthRequired: LongAuthHandler | undefined,\n missingHandlerMessage: string,\n): Promise<ClientAuthorizationWithProxy> {\n if (!onLongAuthRequired) {\n throw new AuthenticationError(\n `${missingHandlerMessage}. Provide SECRET for short auth, or keep automatic long-auth registration enabled`,\n );\n }\n\n await onLongAuthRequired({\n nonce,\n clientScAddress: connected.clientScAddress,\n proxyParams: connected.params,\n });\n\n const authQueryId = crypto.randomBytes(8).readBigInt64LE();\n const authReq = { _type: 'client.authorizeWithProxyLong' };\n sendQuery(conn, authQueryId, serializeTLObject(authReq as unknown as Record<string, unknown>));\n const authResponseData = await waitForQueryAnswer(\n conn,\n authQueryId,\n 300_000,\n 'long auth response',\n );\n return deserializeTLObject(authResponseData) as unknown as ClientAuthorizationWithProxy;\n}\n\nfunction sendQuery(conn: CocoonConnection, queryId: bigint, data: Buffer): void {\n const queryObj = {\n _type: 'tcp.query',\n id: queryId,\n data,\n };\n conn.send(serializeTLObject(queryObj as unknown as Record<string, unknown>));\n}\n\nfunction waitForFrame(conn: CocoonConnection, timeoutMs: number): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => cleanup(() => reject(new ConnectionError('Timeout waiting for frame'))), timeoutMs);\n\n const cleanup = (next?: () => void) => {\n clearTimeout(timer);\n conn.removeListener('frame', onFrame);\n conn.removeListener('close', onClose);\n if (next) next();\n };\n\n const onFrame = (data: Buffer) => {\n cleanup(() => resolve(data));\n };\n const onClose = (error?: Error) => {\n cleanup(() => reject(buildHandshakeCloseError('handshake frame', error)));\n };\n\n conn.once('frame', onFrame);\n conn.once('close', onClose);\n });\n}\n\nfunction waitForQueryAnswer(\n conn: CocoonConnection,\n queryId: bigint,\n timeoutMs: number,\n stage = 'query answer',\n): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => cleanup(() => reject(new ConnectionError(`Timeout waiting for ${stage}`))),\n timeoutMs,\n );\n\n const cleanup = (next?: () => void) => {\n clearTimeout(timer);\n conn.removeListener('frame', onFrame);\n conn.removeListener('close', onClose);\n if (next) next();\n };\n\n const onClose = (error?: Error) => {\n cleanup(() => reject(buildHandshakeCloseError(stage, error)));\n };\n\n const onFrame = (data: Buffer) => {\n let obj: Record<string, unknown>;\n try {\n obj = deserializeTLObject(data);\n } catch (err) {\n cleanup(() =>\n reject(new ProtocolError(`Failed to deserialize handshake frame: ${String(err)}`)),\n );\n return;\n }\n\n if (obj['_type'] === 'tcp.queryAnswer') {\n const answerId = obj['id'] as bigint;\n if (answerId === queryId) {\n cleanup(() => resolve(obj['data'] as Buffer));\n return;\n }\n } else if (obj['_type'] === 'tcp.queryError') {\n const errorId = obj['id'] as bigint;\n if (errorId === queryId) {\n cleanup(() =>\n reject(new ProtocolError(`Query error: ${obj['message']}`, obj['code'] as number)),\n );\n return;\n }\n }\n // Not our answer, keep listening.\n };\n\n conn.on('frame', onFrame);\n conn.once('close', onClose);\n });\n}\n\nexport { sendQuery, waitForFrame, waitForQueryAnswer };\n// Re-export for use in session\nvoid TL_SCHEMA; // ensure import is preserved\n","/**\n * Stream<T> — an async iterable wrapper for streaming responses.\n * Follows the OpenAI SDK pattern.\n */\n\nexport class Stream<T> implements AsyncIterable<T> {\n private controller: ReadableStreamDefaultController<T> | null = null;\n private stream: ReadableStream<T>;\n private _done = false;\n\n constructor() {\n this.stream = new ReadableStream<T>({\n start: (controller) => {\n this.controller = controller;\n },\n });\n }\n\n /**\n * Push a chunk into the stream.\n */\n push(chunk: T): void {\n if (this._done) return;\n this.controller?.enqueue(chunk);\n }\n\n /**\n * Signal that the stream is complete.\n */\n end(): void {\n if (this._done) return;\n this._done = true;\n this.controller?.close();\n }\n\n /**\n * Signal an error on the stream.\n */\n error(err: Error): void {\n if (this._done) return;\n this._done = true;\n this.controller?.error(err);\n }\n\n get done(): boolean {\n return this._done;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n const reader = this.stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","/**\n * Chat Completions resource — the main API for AI inference.\n *\n * Implements both non-streaming and streaming modes:\n * - Non-streaming: collects all queryAnswerPartEx + final queryAnswerEx,\n * parses the HTTP response body as JSON, returns ChatCompletion.\n * - Streaming: wraps parts in Stream<ChatCompletionChunk>, parses SSE from chunks.\n */\n\nimport type { CocoonSession } from '../../core/protocol/session.js';\nimport { buildHttpRequest } from '../../core/protocol/session.js';\nimport { deserializeTLObject } from '../../core/tl/deserializer.js';\nimport { Stream } from '../../core/streaming.js';\nimport { APIError, ProtocolError } from '../../core/error.js';\nimport type {\n ChatCompletionCreateParams,\n ChatCompletion,\n ChatCompletionChunk,\n} from '../../types/chat.js';\nimport type { HttpResponse } from '../../core/tl/types.js';\n\ntype SessionProvider = () => Promise<CocoonSession>;\n\nexport class Completions {\n constructor(private readonly getSession: SessionProvider) {}\n\n private extractHttpData(answer: Buffer): {\n payload: Buffer;\n statusCode?: number;\n reason?: string;\n } {\n try {\n const httpResponse = deserializeTLObject(answer) as unknown as HttpResponse;\n if (httpResponse._type === 'http.response') {\n return {\n payload: httpResponse.payload,\n statusCode: httpResponse.statusCode,\n reason: httpResponse.reason,\n };\n }\n } catch {\n // Not a boxed http.response TL object, treat as raw payload chunk.\n }\n return { payload: answer };\n }\n\n private parseErrorPayload(payload: Buffer, fallbackMessage: string): { message: string; body: unknown } {\n if (payload.length === 0) {\n return { message: fallbackMessage, body: { error: fallbackMessage } };\n }\n const text = payload.toString('utf-8');\n try {\n const parsed = JSON.parse(text) as Record<string, unknown>;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : typeof parsed.error === 'string'\n ? parsed.error\n : fallbackMessage;\n return { message, body: parsed };\n } catch {\n return { message: text || fallbackMessage, body: { error: text || fallbackMessage } };\n }\n }\n\n /**\n * Create a chat completion.\n *\n * @param params - OpenAI-compatible chat completion parameters\n * @returns ChatCompletion (non-streaming) or Stream<ChatCompletionChunk> (streaming)\n */\n async create(\n params: ChatCompletionCreateParams & { stream: true },\n ): Promise<Stream<ChatCompletionChunk>>;\n async create(params: ChatCompletionCreateParams & { stream?: false }): Promise<ChatCompletion>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | Stream<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | Stream<ChatCompletionChunk>> {\n const session = await this.getSession();\n\n // Build the JSON body (OpenAI-compatible)\n const body = JSON.stringify({\n model: params.model,\n messages: params.messages,\n stream: params.stream ?? false,\n ...(params.temperature !== undefined && { temperature: params.temperature }),\n ...(params.top_p !== undefined && { top_p: params.top_p }),\n ...(params.max_tokens !== undefined && { max_tokens: params.max_tokens }),\n ...(params.max_completion_tokens !== undefined && {\n max_completion_tokens: params.max_completion_tokens,\n }),\n ...(params.stop !== undefined && { stop: params.stop }),\n ...(params.presence_penalty !== undefined && { presence_penalty: params.presence_penalty }),\n ...(params.frequency_penalty !== undefined && {\n frequency_penalty: params.frequency_penalty,\n }),\n });\n\n const httpRequest = buildHttpRequest(\n 'POST',\n '/v1/chat/completions',\n Buffer.from(body, 'utf-8'),\n );\n\n if (params.stream) {\n return this.createStreaming(session, params, httpRequest);\n }\n\n return this.createNonStreaming(session, params, httpRequest);\n }\n\n private async createNonStreaming(\n session: CocoonSession,\n params: ChatCompletionCreateParams,\n httpRequest: import('../../core/tl/types.js').HttpRequest,\n ): Promise<ChatCompletion> {\n const chunks: Buffer[] = [];\n let sawAnswer = false;\n let statusCode: number | undefined;\n let statusReason: string | undefined;\n\n const finalAnswer = await session.sendQuery(params.model, httpRequest, {\n maxCoefficient: params.max_coefficient,\n maxTokens: params.max_tokens ?? params.max_completion_tokens,\n timeout: params.timeout,\n onPart: (part) => {\n if (!('answer' in part) || !part.answer) {\n return;\n }\n sawAnswer = true;\n const extracted = this.extractHttpData(part.answer as Buffer);\n if (extracted.statusCode !== undefined) {\n statusCode = extracted.statusCode;\n statusReason = extracted.reason;\n }\n if (extracted.payload.length > 0) {\n chunks.push(extracted.payload);\n }\n },\n });\n\n if (finalAnswer._type === 'client.queryAnswerErrorEx') {\n throw new APIError(finalAnswer.error, 500, {\n error_code: finalAnswer.errorCode,\n error: finalAnswer.error,\n });\n }\n\n // Safety fallback in case caller didn't receive chunk callbacks.\n if (!sawAnswer && 'answer' in finalAnswer && finalAnswer.answer) {\n const extracted = this.extractHttpData(finalAnswer.answer as Buffer);\n if (extracted.statusCode !== undefined) {\n statusCode = extracted.statusCode;\n statusReason = extracted.reason;\n }\n if (extracted.payload.length > 0) {\n chunks.push(extracted.payload);\n }\n }\n\n const fullPayload = Buffer.concat(chunks);\n if (statusCode !== undefined && statusCode >= 400) {\n const fallback = statusReason ? `${statusCode} ${statusReason}` : `HTTP ${statusCode}`;\n const parsed = this.parseErrorPayload(fullPayload, fallback);\n throw new APIError(parsed.message, statusCode, parsed.body);\n }\n if (fullPayload.length === 0) {\n throw new ProtocolError('Empty response from proxy');\n }\n\n try {\n return JSON.parse(fullPayload.toString('utf-8')) as ChatCompletion;\n } catch (error) {\n throw new ProtocolError(\n `Failed to parse completion payload as JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n private async createStreaming(\n session: CocoonSession,\n params: ChatCompletionCreateParams,\n httpRequest: import('../../core/tl/types.js').HttpRequest,\n ): Promise<Stream<ChatCompletionChunk>> {\n const stream = new Stream<ChatCompletionChunk>();\n let sseBuffer = '';\n let headersParsed = false;\n let statusCode: number | undefined;\n let statusReason: string | undefined;\n const errorChunks: Buffer[] = [];\n\n // Process streaming in background\n session\n .sendQuery(params.model, httpRequest, {\n maxCoefficient: params.max_coefficient,\n maxTokens: params.max_tokens ?? params.max_completion_tokens,\n timeout: params.timeout,\n onPart: (part) => {\n try {\n let rawData: Buffer | undefined;\n\n if ('answer' in part && part.answer) {\n const answer = part.answer as Buffer;\n\n if (!headersParsed) {\n // First chunk may contain HTTP response headers as TL object\n try {\n const httpResponse = deserializeTLObject(answer) as unknown as HttpResponse;\n if (httpResponse._type === 'http.response') {\n headersParsed = true;\n statusCode = httpResponse.statusCode;\n statusReason = httpResponse.reason;\n rawData = httpResponse.payload;\n } else {\n rawData = answer;\n }\n } catch {\n // Not a TL object, raw SSE data\n rawData = answer;\n headersParsed = true;\n }\n } else {\n rawData = answer;\n }\n }\n\n if (rawData && rawData.length > 0) {\n if (statusCode !== undefined && statusCode >= 400) {\n errorChunks.push(rawData);\n return;\n }\n sseBuffer += rawData.toString('utf-8');\n this.processSSEBuffer(sseBuffer, stream);\n // Keep unprocessed remainder\n const lastNewline = sseBuffer.lastIndexOf('\\n');\n if (lastNewline >= 0) {\n sseBuffer = sseBuffer.substring(lastNewline + 1);\n }\n }\n } catch (e) {\n stream.error(e instanceof Error ? e : new Error(String(e)));\n }\n },\n })\n .then(() => {\n if (statusCode !== undefined && statusCode >= 400) {\n const parsed = this.parseErrorPayload(\n Buffer.concat(errorChunks),\n statusReason ? `${statusCode} ${statusReason}` : `HTTP ${statusCode}`,\n );\n stream.error(new APIError(parsed.message, statusCode, parsed.body));\n return;\n }\n\n // Process any remaining buffer\n if (sseBuffer.trim().length > 0) {\n this.processSSEBuffer(sseBuffer + '\\n', stream);\n }\n stream.end();\n })\n .catch((err) => {\n stream.error(err instanceof Error ? err : new Error(String(err)));\n });\n\n return stream;\n }\n\n private processSSEBuffer(buffer: string, stream: Stream<ChatCompletionChunk>): void {\n const lines = buffer.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed === '') continue;\n if (trimmed === 'data: [DONE]') continue;\n\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.substring(6);\n try {\n const chunk = JSON.parse(jsonStr) as ChatCompletionChunk;\n stream.push(chunk);\n } catch {\n // Partial JSON, will be completed in next chunk\n }\n }\n }\n }\n}\n","/**\n * Models resource — list available AI models on the network.\n *\n * Uses client.getWorkerTypesV2 TL function to query the proxy.\n */\n\nimport type { CocoonSession } from '../../core/protocol/session.js';\nimport type { ClientWorkerTypesV2 } from '../../core/tl/types.js';\nimport type { Model, ModelList } from '../../types/models.js';\n\ntype SessionProvider = () => Promise<CocoonSession>;\n\nexport class Models {\n constructor(private readonly getSession: SessionProvider) {}\n\n /**\n * List all available models on the network.\n */\n async list(): Promise<ModelList> {\n const session = await this.getSession();\n\n const result = await session.sendRpcQuery({\n _type: 'client.getWorkerTypesV2',\n });\n\n const workerTypes = result as unknown as ClientWorkerTypesV2;\n\n const models: Model[] = workerTypes.types.map((wt) => {\n const totalWorkers = wt.workers.length;\n const coefficients = wt.workers.map((w) => w.coefficient);\n const minCoeff = coefficients.length > 0 ? Math.min(...coefficients) : 0;\n const maxCoeff = coefficients.length > 0 ? Math.max(...coefficients) : 0;\n\n return {\n id: wt.name,\n object: 'model' as const,\n created: Math.floor(Date.now() / 1000),\n owned_by: 'cocoon',\n active_workers: totalWorkers,\n coefficient_min: minCoeff,\n coefficient_max: maxCoeff,\n };\n });\n\n return {\n object: 'list',\n data: models,\n };\n }\n}\n","/**\n * Mnemonic wallet for Cocoon.\n *\n * Converts a 24-word mnemonic into a keypair and wallet address.\n * Uses @ton/crypto for key derivation and @ton/ton for wallet contract.\n */\n\nimport { mnemonicToPrivateKey } from '@ton/crypto';\nimport { WalletContractV4, TonClient, TonClient4 } from '@ton/ton';\nimport { Address, type Sender } from '@ton/core';\nimport crypto from 'node:crypto';\n\nexport interface WalletInfo {\n address: Address;\n publicKey: Buffer;\n secretKey: Buffer;\n}\n\nexport class MnemonicWallet {\n private mnemonic: string[];\n private keyPair: { publicKey: Buffer; secretKey: Buffer } | null = null;\n private wallet: WalletContractV4 | null = null;\n private _address: Address | null = null;\n private tonClient: TonClient | null = null;\n private tonClient4: TonClient4 | null = null;\n\n constructor(\n mnemonic: string,\n network: 'mainnet' | 'testnet' = 'mainnet',\n options?: { tonEndpoint?: string; tonV4Endpoint?: string },\n ) {\n this.mnemonic = mnemonic.trim().split(/\\s+/);\n if (this.mnemonic.length !== 24) {\n throw new Error(`Expected 24 mnemonic words, got ${this.mnemonic.length}`);\n }\n this.network = network;\n this.tonEndpoint = options?.tonEndpoint;\n this.tonV4Endpoint = options?.tonV4Endpoint;\n }\n\n private readonly network: 'mainnet' | 'testnet';\n private readonly tonEndpoint?: string;\n private readonly tonV4Endpoint?: string;\n\n async init(): Promise<void> {\n if (this.keyPair) return;\n\n this.keyPair = await mnemonicToPrivateKey(this.mnemonic);\n\n this.wallet = WalletContractV4.create({\n workchain: 0,\n publicKey: this.keyPair.publicKey,\n });\n\n this._address = this.wallet.address;\n }\n\n get address(): Address {\n if (!this._address) throw new Error('Wallet not initialized. Call init() first.');\n return this._address;\n }\n\n get addressString(): string {\n return this.address.toString({ bounceable: true, testOnly: this.network === 'testnet' });\n }\n\n get publicKey(): Buffer {\n if (!this.keyPair) throw new Error('Wallet not initialized. Call init() first.');\n return this.keyPair.publicKey;\n }\n\n get secretKey(): Buffer {\n if (!this.keyPair) throw new Error('Wallet not initialized. Call init() first.');\n return this.keyPair.secretKey;\n }\n\n /**\n * Compute SHA-256 hash of a secret string (for short auth).\n */\n secretHash(secret: string): Buffer {\n return crypto.createHash('sha256').update(secret).digest();\n }\n\n /**\n * Get or create a TonClient for blockchain queries.\n */\n getTonClient(): TonClient {\n if (!this.tonClient) {\n const endpoint =\n this.tonEndpoint ??\n (this.network === 'mainnet'\n ? 'https://toncenter.com/api/v2/jsonRPC'\n : 'https://testnet.toncenter.com/api/v2/jsonRPC');\n\n this.tonClient = new TonClient({ endpoint });\n }\n return this.tonClient;\n }\n\n /**\n * Get or create a TonClient4 for sending transactions via v4 HTTP API.\n */\n getTonClient4(): TonClient4 {\n if (!this.tonClient4) {\n const endpoint =\n this.tonV4Endpoint ??\n (this.network === 'mainnet'\n ? 'https://mainnet-v4.tonhubapi.com'\n : 'https://testnet-v4.tonhubapi.com');\n this.tonClient4 = new TonClient4({ endpoint });\n }\n return this.tonClient4;\n }\n\n /**\n * Create a sender for sending transactions.\n */\n async createSender(): Promise<Sender> {\n if (!this.wallet || !this.keyPair) {\n throw new Error('Wallet not initialized');\n }\n\n const client = this.getTonClient4();\n const contract = client.open(this.wallet);\n\n return contract.sender(this.keyPair.secretKey);\n }\n}\n","/**\n * Proxy discovery via TON Root Contract.\n *\n * Queries the Root Contract to get the list of registered proxies,\n * then parses the addresses for client connections.\n */\n\nimport { Address, TonClient } from '@ton/ton';\nimport { CocoonRoot, type RootParams, type ProxyInfo } from './contracts/root.js';\n\nexport interface DiscoveryOptions {\n network: 'mainnet' | 'testnet';\n rootContractAddress?: string;\n tonApiEndpoint?: string;\n}\n\n// Known root contract addresses\nconst ROOT_CONTRACTS: Record<string, string> = {\n mainnet: 'EQCns7bYSp0igFvS1wpb5wsZjCKCV19MD5AVzI4EyxsnU73k',\n testnet: 'EQBT4hy4vMEZ9uxSCuhw_gBKh9_AwmHXLe7Wo0O4Vh-4kRjJ',\n};\n\nexport class ProxyDiscovery {\n private tonClient: TonClient;\n private rootAddress: Address;\n private cachedParams: RootParams | null = null;\n private cacheTime = 0;\n private readonly cacheTtl = 60_000; // 1 minute\n\n constructor(options: DiscoveryOptions) {\n const endpoint =\n options.tonApiEndpoint ??\n (options.network === 'mainnet'\n ? 'https://toncenter.com/api/v2/jsonRPC'\n : 'https://testnet.toncenter.com/api/v2/jsonRPC');\n\n this.tonClient = new TonClient({ endpoint });\n\n const addr = options.rootContractAddress ?? ROOT_CONTRACTS[options.network];\n if (!addr) {\n throw new Error(`No root contract address for network: ${options.network}`);\n }\n this.rootAddress = Address.parse(addr);\n }\n\n /**\n * Get all registered proxies from the root contract.\n */\n async getProxies(): Promise<ProxyInfo[]> {\n const params = await this.getRootParams();\n return params.registeredProxies;\n }\n\n /**\n * Get a random proxy for connection.\n */\n async getRandomProxy(): Promise<ProxyInfo> {\n const proxies = await this.getProxies();\n if (proxies.length === 0) {\n throw new Error('No proxies available in the network');\n }\n const idx = Math.floor(Math.random() * proxies.length);\n return proxies[idx]!;\n }\n\n /**\n * Get root contract parameters (cached).\n */\n async getRootParams(): Promise<RootParams> {\n const now = Date.now();\n if (this.cachedParams && now - this.cacheTime < this.cacheTtl) {\n return this.cachedParams;\n }\n\n const root = new CocoonRoot(this.tonClient, this.rootAddress);\n const result = await root.getAllParams();\n if (!result) {\n throw new Error('Root contract is not initialized');\n }\n this.cachedParams = result;\n this.cacheTime = now;\n return this.cachedParams;\n }\n}\n","/**\n * CocoonRoot smart contract wrapper.\n *\n * Reads the root contract raw state to get network configuration:\n * - List of registered proxies with their addresses\n * - Supported worker/proxy/model hashes\n * - Pricing parameters\n *\n * On-chain cell layout (from official cocoon-contracts wrapper):\n * top-level:\n * ownerAddress:address version:uint32 ref(data) ref(params)\n * data ref:\n * proxyHashes:dict registeredProxies:dict lastProxySeqno:uint32\n * workerHashes:dict modelHashes:dict\n * params ref:\n * structVersion:uint8 paramsVersion:uint32 uniqueId:uint32 isTest:bit\n * pricePerToken:coins workerFeePerToken:coins ...multipliers...\n * delays minStakes ref(proxyScCode) ref(workerScCode) ref(clientScCode)\n */\n\nimport { Address, Cell, Dictionary, Slice, TonClient, beginCell } from '@ton/ton';\n\nexport interface ProxyInfo {\n seqno: number;\n /** Proxy address, typically \"host:workerPort host:clientPort\" */\n address: string;\n}\n\nexport interface CocoonParams {\n structVersion: number;\n paramsVersion: number;\n uniqueId: number;\n isTest: boolean;\n pricePerToken: bigint;\n workerFeePerToken: bigint;\n promptTokensPriceMultiplier: number;\n cachedTokensPriceMultiplier: number;\n completionTokensPriceMultiplier: number;\n reasoningTokensPriceMultiplier: number;\n proxyDelayBeforeClose: number;\n clientDelayBeforeClose: number;\n minProxyStake: bigint;\n minClientStake: bigint;\n}\n\nexport interface RootContractCodes {\n proxyScCode: Cell | null;\n workerScCode: Cell | null;\n clientScCode: Cell | null;\n}\n\nexport interface RootParams {\n ownerAddress: Address;\n registeredProxies: ProxyInfo[];\n lastProxySeqno: number;\n version: number;\n params: CocoonParams;\n codes: RootContractCodes;\n}\n\n/**\n * Build the client params cell as RootContractConfig::serialize_client_params_cell(0).\n * This is needed for client_sc deployment state-init.\n */\nexport function buildClientParamsCell(params: CocoonParams): Cell {\n const b = beginCell()\n .storeUint(params.structVersion, 8)\n .storeUint(params.paramsVersion, 32)\n .storeUint(params.uniqueId, 32)\n .storeBit(params.isTest)\n .storeCoins(params.pricePerToken)\n .storeCoins(params.workerFeePerToken);\n\n if (params.structVersion >= 2) {\n if (params.structVersion >= 3) {\n b.storeUint(params.promptTokensPriceMultiplier, 32);\n }\n b.storeUint(params.cachedTokensPriceMultiplier, 32);\n if (params.structVersion >= 3) {\n b.storeUint(params.completionTokensPriceMultiplier, 32);\n }\n b.storeUint(params.reasoningTokensPriceMultiplier, 32);\n }\n\n b.storeUint(params.proxyDelayBeforeClose, 32);\n b.storeUint(params.clientDelayBeforeClose, 32);\n\n if (params.structVersion >= 1) {\n b.storeCoins(params.minProxyStake);\n b.storeCoins(params.minClientStake);\n }\n\n // serialize_client_params_cell(0): no code refs included.\n b.storeMaybeRef(null).storeMaybeRef(null).storeMaybeRef(null);\n return b.endCell();\n}\n\n/** Value codec for the registered_proxies dictionary (Uint32 → ProxyInfo). */\nfunction proxyInfoValue() {\n return {\n serialize: () => {\n throw new Error('ProxyInfo serialization not needed for read-only usage');\n },\n parse: (src: Slice) => {\n src.loadBit(); // type bit (always 0)\n const strlen = src.loadUint(7);\n const buf = src.loadBuffer(strlen);\n return { addr: buf.toString('utf-8') };\n },\n };\n}\n\nexport class CocoonRoot {\n constructor(\n private readonly client: TonClient,\n private readonly address: Address,\n ) {}\n\n /**\n * Get all parameters by reading the raw contract state and parsing the Cell.\n * Returns null if the contract is not initialized.\n */\n async getAllParams(): Promise<RootParams | null> {\n const state = await this.client.getContractState(this.address);\n\n if (!state.data) {\n return null;\n }\n\n const cell = Cell.fromBoc(Buffer.from(state.data))[0]!;\n const cs = cell.beginParse();\n\n // Top-level: ownerAddress + version + ref(data) + ref(params)\n const ownerAddress = cs.loadAddress();\n const version = cs.loadUint(32);\n\n // Data ref: proxyHashes, registeredProxies, lastProxySeqno, workerHashes, modelHashes\n const data = cs.loadRef().beginParse();\n\n // Skip proxyHashes dict (inline maybe-ref)\n if (data.loadBit()) data.loadRef();\n\n // registeredProxies dict (inline maybe-ref)\n const proxiesDict = data.loadDict<number, { addr: string }>(\n Dictionary.Keys.Uint(32),\n proxyInfoValue(),\n );\n\n const lastProxySeqno = data.loadUint(32);\n\n // Skip workerHashes and modelHashes\n if (data.loadBit()) data.loadRef();\n if (data.loadBit()) data.loadRef();\n\n // Params ref\n const pcs = cs.loadRef().beginParse();\n\n const structVersion = pcs.loadUint(8);\n const paramsVersion = pcs.loadUint(32);\n const uniqueId = pcs.loadUint(32);\n const isTest = pcs.loadBit();\n const pricePerToken = pcs.loadCoins();\n const workerFeePerToken = pcs.loadCoins();\n\n let promptTokensPriceMultiplier = 10000;\n if (structVersion >= 3) {\n promptTokensPriceMultiplier = pcs.loadUint(32);\n }\n let cachedTokensPriceMultiplier = 10000;\n if (structVersion >= 2) {\n cachedTokensPriceMultiplier = pcs.loadUint(32);\n }\n let completionTokensPriceMultiplier = 10000;\n if (structVersion >= 3) {\n completionTokensPriceMultiplier = pcs.loadUint(32);\n }\n let reasoningTokensPriceMultiplier = 10000;\n if (structVersion >= 2) {\n reasoningTokensPriceMultiplier = pcs.loadUint(32);\n }\n\n const proxyDelayBeforeClose = pcs.loadUint(32);\n const clientDelayBeforeClose = pcs.loadUint(32);\n\n let minProxyStake = 1000000000n; // 1 TON default\n let minClientStake = 1000000000n;\n if (structVersion >= 1) {\n minProxyStake = pcs.loadCoins();\n minClientStake = pcs.loadCoins();\n }\n\n const proxyScCode = pcs.loadMaybeRef();\n const workerScCode = pcs.loadMaybeRef();\n const clientScCode = pcs.loadMaybeRef();\n\n // Convert proxies dict to array\n const registeredProxies: ProxyInfo[] = [];\n if (proxiesDict) {\n for (const [seqno, info] of proxiesDict) {\n registeredProxies.push({ seqno, address: info.addr });\n }\n }\n\n return {\n ownerAddress,\n registeredProxies,\n lastProxySeqno,\n version,\n params: {\n structVersion,\n paramsVersion,\n uniqueId,\n isTest,\n pricePerToken,\n workerFeePerToken,\n promptTokensPriceMultiplier,\n cachedTokensPriceMultiplier,\n completionTokensPriceMultiplier,\n reasoningTokensPriceMultiplier,\n proxyDelayBeforeClose,\n clientDelayBeforeClose,\n minProxyStake,\n minClientStake,\n },\n codes: {\n proxyScCode,\n workerScCode,\n clientScCode,\n },\n };\n }\n}\n","/**\n * CocoonClient smart contract wrapper.\n *\n * Handles client registration with a proxy and balance management.\n * The client contract is deployed per client-proxy pair.\n */\n\nimport { Address, beginCell, type Cell, toNano } from '@ton/ton';\nimport type { Sender, StateInit } from '@ton/core';\n\n// Opcodes from the Cocoon smart contracts\nconst OPCODES = {\n ownerClientRegister: 0xc45f9f3b,\n ownerClientChangeSecretHash: 0xa9357034,\n extClientTopUp: 0xf172e6c2,\n} as const;\n\nexport class CocoonClientContract {\n constructor(private readonly address: Address) {}\n\n /**\n * Create a registration message body for the proxy.\n * This is sent to the client smart contract to register with a proxy.\n */\n static createRegisterBody(\n nonce: bigint,\n sendExcessesTo: Address,\n queryId = 0n,\n ): Cell {\n const nonceU64 = BigInt.asUintN(64, nonce);\n const queryIdU64 = BigInt.asUintN(64, queryId);\n return beginCell()\n .storeUint(OPCODES.ownerClientRegister, 32)\n .storeUint(queryIdU64, 64)\n .storeUint(nonceU64, 64)\n .storeAddress(sendExcessesTo)\n .endCell();\n }\n\n /**\n * Create a message body to change the secret hash.\n */\n static createChangeSecretHashBody(\n secretHash: Buffer,\n sendExcessesTo: Address,\n queryId = 0n,\n ): Cell {\n const queryIdU64 = BigInt.asUintN(64, queryId);\n return beginCell()\n .storeUint(OPCODES.ownerClientChangeSecretHash, 32)\n .storeUint(queryIdU64, 64)\n .storeBuffer(secretHash, 32)\n .storeAddress(sendExcessesTo)\n .endCell();\n }\n\n /**\n * Create a top-up message body.\n */\n static createTopUpBody(coins: bigint, sendExcessesTo: Address, queryId = 0n): Cell {\n const queryIdU64 = BigInt.asUintN(64, queryId);\n return beginCell()\n .storeUint(OPCODES.extClientTopUp, 32)\n .storeUint(queryIdU64, 64)\n .storeCoins(coins)\n .storeAddress(sendExcessesTo)\n .endCell();\n }\n\n /**\n * Build client_sc data cell for deployment.\n * Mirrors ClientContract::init_data_cell in upstream C++ code.\n */\n static createDeployDataCell(\n ownerAddress: Address,\n proxyScAddress: Address,\n proxyPublicKey: Buffer,\n minClientStake: bigint,\n clientParamsCell: Cell,\n ): Cell {\n if (proxyPublicKey.length !== 32) {\n throw new Error(`proxyPublicKey must be 32 bytes, got ${proxyPublicKey.length}`);\n }\n\n const configDataRef = beginCell()\n .storeAddress(ownerAddress)\n .storeAddress(proxyScAddress)\n .storeBuffer(proxyPublicKey, 32)\n .endCell();\n\n return beginCell()\n .storeUint(0, 2) // state\n .storeCoins(0n) // balance\n .storeCoins(minClientStake) // stake\n .storeInt(0n, 64) // tokens_used\n .storeInt(0, 32) // unlock_ts\n .storeBuffer(Buffer.alloc(32), 32) // secret_hash\n .storeRef(configDataRef)\n .storeRef(clientParamsCell)\n .endCell();\n }\n\n static createStateInit(clientCode: Cell, dataCell: Cell): StateInit {\n return {\n code: clientCode,\n data: dataCell,\n };\n }\n\n /**\n * Send a registration transaction to the client contract.\n */\n async register(\n sender: Sender,\n ownerAddress: Address,\n nonce: bigint,\n amount = toNano('1'),\n init?: StateInit,\n ): Promise<void> {\n const body = CocoonClientContract.createRegisterBody(nonce, ownerAddress);\n const message: {\n to: Address;\n value: bigint;\n body: Cell;\n init?: StateInit;\n } = {\n to: this.address,\n value: amount,\n body,\n };\n if (init) {\n message.init = init;\n }\n await sender.send(message);\n }\n\n /**\n * Top up the client contract balance.\n */\n async topUp(sender: Sender, ownerAddress: Address, amount: bigint): Promise<void> {\n const body = CocoonClientContract.createTopUpBody(amount, ownerAddress);\n await sender.send({\n to: this.address,\n value: amount + toNano('0.7'),\n body,\n });\n }\n\n /**\n * Change the secret hash for short auth.\n */\n async changeSecretHash(\n sender: Sender,\n ownerAddress: Address,\n secretHash: Buffer,\n amount = toNano('0.7'),\n ): Promise<void> {\n const body = CocoonClientContract.createChangeSecretHashBody(secretHash, ownerAddress);\n await sender.send({\n to: this.address,\n value: amount,\n body,\n });\n }\n}\n","/**\n * Cocoon SDK Client — the main entry point.\n *\n * Usage:\n * const client = new Cocoon({\n * wallet: '24 word mnemonic...',\n * network: 'mainnet',\n * });\n *\n * const response = await client.chat.completions.create({\n * model: 'deepseek-r1',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n */\n\nimport { Completions } from './resources/chat/completions.js';\nimport { Models } from './resources/models/models.js';\nimport { MnemonicWallet } from './ton/wallet.js';\nimport { ProxyDiscovery } from './ton/discovery.js';\nimport { CocoonClientContract } from './ton/contracts/client-contract.js';\nimport { buildClientParamsCell } from './ton/contracts/root.js';\nimport { CocoonSession, type SessionOptions } from './core/protocol/session.js';\nimport { ConnectionError } from './core/error.js';\nimport type {\n AttestationProvider,\n AttestationContext,\n} from './core/protocol/attestation.js';\nimport crypto from 'node:crypto';\nimport { Address, toNano } from '@ton/ton';\nimport { contractAddress } from '@ton/core';\n\nexport interface CocoonOptions {\n /** 24-word mnemonic phrase */\n wallet: string;\n /** Network: mainnet or testnet. Default: mainnet */\n network?: 'mainnet' | 'testnet';\n /** Direct proxy URL (bypasses discovery). Format: host:port */\n proxyUrl?: string;\n /** Request timeout in ms. Default: 120000 */\n timeout?: number;\n /** Optional TON JSON-RPC endpoint for on-chain operations (registration, wallet tx). */\n tonEndpoint?: string;\n /** Optional TON v4 endpoint used for wallet transaction sending. */\n tonV4Endpoint?: string;\n /** Secret string for short auth. Auto-generated if not provided. */\n secretString?: string;\n /** Use TLS for proxy connection. Default: true */\n useTls?: boolean;\n /** PEM-encoded TLS client certificate for RA-TLS / mTLS authentication */\n tlsCert?: string | Buffer;\n /** PEM-encoded TLS client private key for RA-TLS / mTLS authentication */\n tlsKey?: string | Buffer;\n /** Dynamic provider for RA-TLS credentials (e.g. sidecar, file rotation). */\n attestationProvider?: AttestationProvider;\n /**\n * If true, automatically perform on-chain long-auth registration when proxy requests it.\n * This sends a TON transaction from the mnemonic wallet.\n * Default: true\n */\n autoRegisterOnLongAuth?: boolean;\n /** Amount in TON to attach to auto long-auth registration tx. Default: \"1\" */\n longAuthRegisterAmountTon?: string;\n}\n\nexport class Cocoon {\n readonly chat: { completions: Completions };\n readonly models: Models;\n\n private readonly mnemonicWallet: MnemonicWallet;\n private readonly discovery: ProxyDiscovery | null;\n private session: CocoonSession | null = null;\n private connecting: Promise<CocoonSession> | null = null;\n\n private readonly options: Required<Pick<CocoonOptions, 'network' | 'timeout' | 'useTls'>> &\n Required<Pick<CocoonOptions, 'autoRegisterOnLongAuth' | 'longAuthRegisterAmountTon'>> &\n CocoonOptions;\n\n constructor(options: CocoonOptions) {\n if ((options.tlsCert && !options.tlsKey) || (!options.tlsCert && options.tlsKey)) {\n throw new ConnectionError(\n 'Both tlsCert and tlsKey must be provided together for mTLS',\n );\n }\n if (options.attestationProvider && (options.tlsCert || options.tlsKey)) {\n throw new ConnectionError(\n 'Use either attestationProvider or tlsCert/tlsKey, not both',\n );\n }\n\n this.options = {\n network: 'mainnet',\n timeout: 120_000,\n useTls: true,\n autoRegisterOnLongAuth: true,\n longAuthRegisterAmountTon: '1',\n ...options,\n };\n\n this.mnemonicWallet = new MnemonicWallet(options.wallet, this.options.network, {\n tonEndpoint: this.options.tonEndpoint,\n tonV4Endpoint: this.options.tonV4Endpoint,\n });\n\n // Set up discovery unless a direct proxyUrl is given\n if (!options.proxyUrl) {\n this.discovery = new ProxyDiscovery({ network: this.options.network });\n } else {\n this.discovery = null;\n }\n\n // Create resource namespaces with lazy session provider\n const getSession = () => this.ensureSession();\n this.chat = { completions: new Completions(getSession) };\n this.models = new Models(getSession);\n }\n\n /**\n * Explicitly connect to a proxy. Called lazily on first API call if not called manually.\n */\n async connect(): Promise<void> {\n await this.ensureSession();\n }\n\n /**\n * Disconnect from the proxy.\n */\n async disconnect(): Promise<void> {\n if (this.session) {\n await this.session.disconnect();\n this.session = null;\n }\n this.connecting = null;\n }\n\n private async ensureSession(): Promise<CocoonSession> {\n if (this.session?.connected) {\n return this.session;\n }\n\n // Prevent concurrent connect attempts\n if (this.connecting) {\n return this.connecting;\n }\n\n this.connecting = this.createSession();\n try {\n this.session = await this.connecting;\n return this.session;\n } finally {\n this.connecting = null;\n }\n }\n\n private async createSession(): Promise<CocoonSession> {\n // Initialize wallet\n await this.mnemonicWallet.init();\n\n // Determine proxy address\n let host: string;\n let port: number;\n\n if (this.options.proxyUrl) {\n const parts = this.options.proxyUrl.split(':');\n host = parts.slice(0, -1).join(':');\n port = parseInt(parts[parts.length - 1]!, 10);\n if (!host || isNaN(port)) {\n throw new ConnectionError(`Invalid proxyUrl: ${this.options.proxyUrl}`);\n }\n } else if (this.discovery) {\n const proxy = await this.discovery.getRandomProxy();\n // Proxy address format: \"host:workerPort host:clientPort\"\n // We need the client port (second entry)\n const entries = proxy.address.trim().split(/\\s+/);\n const clientEntry = entries.length > 1 ? entries[1]! : entries[0]!;\n const lastColon = clientEntry.lastIndexOf(':');\n host = clientEntry.substring(0, lastColon);\n port = parseInt(clientEntry.substring(lastColon + 1), 10);\n if (!host || isNaN(port)) {\n throw new ConnectionError(`Invalid proxy address from discovery: ${proxy.address}`);\n }\n } else {\n throw new ConnectionError('No proxy URL or discovery available');\n }\n\n // Resolve TLS credentials (static or via provider).\n let tlsCert = this.options.tlsCert;\n let tlsKey = this.options.tlsKey;\n\n if (this.options.attestationProvider) {\n const context: AttestationContext = {\n host,\n port,\n network: this.options.network,\n };\n const credentials = await this.options.attestationProvider.getClientTlsCredentials(context);\n tlsCert = credentials.cert;\n tlsKey = credentials.key;\n }\n\n if ((tlsCert && !tlsKey) || (!tlsCert && tlsKey)) {\n throw new ConnectionError('Attestation provider returned incomplete TLS credentials');\n }\n\n // Generate or use secret string\n const secretString = this.options.secretString ?? crypto.randomBytes(32).toString('hex');\n\n const onLongAuthRequired = this.options.autoRegisterOnLongAuth\n ? async (context: {\n nonce: bigint;\n clientScAddress: string;\n proxyParams: {\n proxyScAddress: string;\n proxyPublicKey: Buffer;\n };\n }): Promise<void> => {\n try {\n const sender = await this.mnemonicWallet.createSender();\n const clientScAddress = Address.parse(context.clientScAddress);\n const clientContract = new CocoonClientContract(clientScAddress);\n\n const v4Client = this.mnemonicWallet.getTonClient4();\n const last = await v4Client.getLastBlock();\n const account = await v4Client.getAccount(last.last.seqno, clientScAddress);\n\n let init;\n if (account.account.state.type !== 'active') {\n const discovery =\n this.discovery ??\n new ProxyDiscovery({\n network: this.options.network,\n tonApiEndpoint: this.options.tonEndpoint,\n });\n const rootParams = await discovery.getRootParams();\n const clientCode = rootParams.codes.clientScCode;\n if (!clientCode) {\n throw new Error(\n 'Root contract does not contain client_sc_code; cannot deploy client contract',\n );\n }\n const clientParamsCell = buildClientParamsCell(rootParams.params);\n const dataCell = CocoonClientContract.createDeployDataCell(\n this.mnemonicWallet.address,\n Address.parse(context.proxyParams.proxyScAddress),\n context.proxyParams.proxyPublicKey,\n rootParams.params.minClientStake,\n clientParamsCell,\n );\n init = CocoonClientContract.createStateInit(clientCode, dataCell);\n\n const expectedAddress = contractAddress(0, init);\n if (!expectedAddress.equals(clientScAddress)) {\n throw new Error(\n `Computed client_sc mismatch: expected ${context.clientScAddress}, got ${expectedAddress.toString({ bounceable: true, testOnly: this.options.network === 'testnet' })}`,\n );\n }\n }\n\n await clientContract.register(\n sender,\n this.mnemonicWallet.address,\n context.nonce,\n toNano(this.options.longAuthRegisterAmountTon),\n init,\n );\n } catch (err) {\n throw new ConnectionError(\n `Auto long-auth registration failed: ${\n err instanceof Error ? err.message : String(err)\n }. Configure tonEndpoint / wallet balance or provide a valid SECRET`,\n err instanceof Error ? err : undefined,\n );\n }\n }\n : undefined;\n\n const sessionOptions: SessionOptions = {\n host,\n port,\n useTls: this.options.useTls,\n timeout: this.options.timeout,\n ownerAddress: this.mnemonicWallet.addressString,\n secretString,\n tlsCert,\n tlsKey,\n onLongAuthRequired,\n };\n\n const session = new CocoonSession(sessionOptions);\n await session.connect();\n\n // Handle session close\n session.on('close', () => {\n if (this.session === session) {\n this.session = null;\n }\n });\n\n return session;\n }\n}\n","import { readFile } from 'node:fs/promises';\n\nexport interface ClientTlsCredentials {\n cert: string | Buffer;\n key: string | Buffer;\n}\n\nexport interface AttestationContext {\n host: string;\n port: number;\n network: 'mainnet' | 'testnet';\n}\n\n/**\n * Provides RA-TLS client credentials (certificate + private key) for mTLS.\n * Implementations may load static values, files, or fetch from sidecars.\n */\nexport interface AttestationProvider {\n getClientTlsCredentials(context: AttestationContext): Promise<ClientTlsCredentials>;\n}\n\n/**\n * Uses already available in-memory credentials.\n */\nexport class StaticAttestationProvider implements AttestationProvider {\n constructor(private readonly credentials: ClientTlsCredentials) {}\n\n async getClientTlsCredentials(): Promise<ClientTlsCredentials> {\n return this.credentials;\n }\n}\n\n/**\n * Loads credentials from PEM files on each call.\n * Useful when credentials are rotated externally.\n */\nexport class FileAttestationProvider implements AttestationProvider {\n constructor(\n private readonly certPath: string,\n private readonly keyPath: string,\n ) {}\n\n async getClientTlsCredentials(): Promise<ClientTlsCredentials> {\n const [cert, key] = await Promise.all([\n readFile(this.certPath),\n readFile(this.keyPath),\n ]);\n return { cert, key };\n }\n}\n"],"mappings":"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","names":["import_node_crypto","import_node_events","crypto","VECTOR_ID","BOOL_TRUE_ID","BOOL_FALSE_ID","import_node_crypto","crypto","crypto","import_node_crypto","crypto","import_ton","import_ton","import_ton","import_node_crypto","import_ton","crypto"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/protocol/session.ts","../src/core/protocol/connection.ts","../src/core/error.ts","../src/core/protocol/pow.ts","../src/core/tl/schema.ts","../src/core/tl/serializer.ts","../src/core/tl/deserializer.ts","../src/core/protocol/handshake.ts","../src/core/streaming.ts","../src/resources/chat/completions.ts","../src/resources/models/models.ts","../src/ton/wallet.ts","../src/ton/discovery.ts","../src/ton/contracts/root.ts","../src/ton/contracts/client-contract.ts","../src/client.ts","../src/core/protocol/attestation.ts"],"sourcesContent":["/**\n * Cocoon TypeScript SDK\n *\n * OpenAI-compatible client for Telegram Cocoon — decentralized GPU network\n * for AI inference on TON blockchain.\n */\n\n// Main client\nexport { Cocoon } from './client.js';\nexport type { CocoonOptions } from './client.js';\nexport type {\n AttestationProvider,\n AttestationContext,\n ClientTlsCredentials,\n} from './core/protocol/attestation.js';\nexport {\n StaticAttestationProvider,\n FileAttestationProvider,\n} from './core/protocol/attestation.js';\n\n// Chat types\nexport type {\n ChatCompletion,\n ChatCompletionChunk,\n ChatCompletionChoice,\n ChatCompletionChunkChoice,\n ChatCompletionChunkDelta,\n ChatCompletionCreateParams,\n ChatMessage,\n ChatRole,\n} from './types/chat.js';\n\n// Model types\nexport type { Model, ModelList } from './types/models.js';\n\n// Common types\nexport type { Usage, FinishReason } from './types/common.js';\n\n// Error classes\nexport {\n CocoonError,\n ConnectionError,\n ProtocolError,\n APIError,\n AuthenticationError,\n TimeoutError,\n} from './core/error.js';\n\n// Streaming\nexport { Stream } from './core/streaming.js';\n","/**\n * Cocoon Session — manages an authenticated connection to a proxy.\n *\n * Handles:\n * - Keepalive (tcp.ping/tcp.pong)\n * - Query dispatch and response routing by requestId\n * - Streaming response assembly\n */\n\nimport crypto from 'node:crypto';\nimport { EventEmitter } from 'node:events';\nimport { CocoonConnection, type ConnectionOptions } from './connection.js';\nimport {\n performHandshake,\n type HandshakeResult,\n type LongAuthHandler,\n} from './handshake.js';\nimport { serializeTLObject } from '../tl/serializer.js';\nimport { deserializeTLObject } from '../tl/deserializer.js';\nimport { ConnectionError, ProtocolError, TimeoutError } from '../error.js';\nimport type {\n ClientQueryAnswerExType,\n ClientRunQueryEx,\n HttpRequest,\n HttpHeader,\n} from '../tl/types.js';\n\nexport interface SessionOptions extends ConnectionOptions {\n ownerAddress: string;\n secretString: string;\n configVersion?: number;\n onLongAuthRequired?: LongAuthHandler;\n}\n\ninterface PendingQuery {\n resolve: (value: ClientQueryAnswerExType) => void;\n reject: (error: Error) => void;\n onPart?: (part: ClientQueryAnswerExType) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nexport class CocoonSession extends EventEmitter {\n private conn: CocoonConnection | null = null;\n private handshakeResult: HandshakeResult | null = null;\n private pendingQueries: Map<string, PendingQuery> = new Map();\n private keepaliveTimer: ReturnType<typeof setInterval> | null = null;\n private _connected = false;\n\n private readonly options: SessionOptions;\n\n constructor(options: SessionOptions) {\n super();\n this.options = options;\n }\n\n get connected(): boolean {\n return this._connected;\n }\n\n get protoVersion(): number {\n return this.handshakeResult?.protoVersion ?? 0;\n }\n\n async connect(): Promise<void> {\n if (this._connected) return;\n\n this.conn = new CocoonConnection(this.options);\n await this.conn.connect();\n\n // Perform handshake\n this.handshakeResult = await performHandshake(\n this.conn,\n this.options.ownerAddress,\n this.options.secretString,\n this.options.configVersion ?? 0,\n this.options.onLongAuthRequired,\n );\n\n this._connected = true;\n\n // Set up frame handler for ongoing communication\n this.conn.on('frame', (data: Buffer) => this.handleFrame(data));\n this.conn.on('close', (error?: Error) => {\n this._connected = false;\n this.cleanup();\n this.emit('close', error);\n });\n\n // Start keepalive\n this.startKeepalive();\n }\n\n /**\n * Send a query and wait for the complete answer.\n */\n async sendQuery(\n modelName: string,\n httpRequest: HttpRequest,\n options: {\n maxCoefficient?: number;\n maxTokens?: number;\n timeout?: number;\n enableDebug?: boolean;\n onPart?: (part: ClientQueryAnswerExType) => void;\n } = {},\n ): Promise<ClientQueryAnswerExType> {\n if (!this.conn || !this._connected) {\n throw new ConnectionError('Not connected');\n }\n\n const requestId = crypto.randomBytes(32);\n const timeout = options.timeout ?? this.options.timeout ?? 120_000;\n\n // Serialize the HTTP request as the query payload\n const queryPayload = serializeTLObject(httpRequest as unknown as Record<string, unknown>, true);\n\n const runQuery: ClientRunQueryEx = {\n _type: 'client.runQueryEx',\n modelName,\n query: queryPayload,\n maxCoefficient: options.maxCoefficient ?? 4000,\n maxTokens: options.maxTokens ?? 1000,\n timeout: (timeout / 1000) * 0.95,\n requestId,\n minConfigVersion: this.options.configVersion ?? 0,\n flags: options.enableDebug ? 1 : 0,\n enableDebug: options.enableDebug,\n };\n\n // Send as tcp.packet (not tcp.query — queries are sent as messages after handshake)\n const tlData = serializeTLObject(runQuery as unknown as Record<string, unknown>, true);\n const tcpPacket = {\n _type: 'tcp.packet',\n data: tlData,\n };\n this.conn.send(serializeTLObject(tcpPacket as unknown as Record<string, unknown>));\n\n // Wait for answer\n return new Promise<ClientQueryAnswerExType>((resolve, reject) => {\n const requestIdHex = requestId.toString('hex');\n\n const timer = setTimeout(() => {\n this.pendingQueries.delete(requestIdHex);\n reject(new TimeoutError(`Query timed out after ${timeout}ms`));\n }, timeout);\n\n this.pendingQueries.set(requestIdHex, {\n resolve,\n reject,\n onPart: options.onPart,\n timer,\n });\n });\n }\n\n /**\n * Send a raw TL function (for getWorkerTypesV2, etc.)\n */\n async sendRpcQuery(\n tlObject: Record<string, unknown>,\n timeoutMs = 30_000,\n ): Promise<Record<string, unknown>> {\n if (!this.conn || !this._connected) {\n throw new ConnectionError('Not connected');\n }\n\n const queryId = crypto.randomBytes(8).readBigInt64LE();\n const data = serializeTLObject(tlObject, true);\n\n const tcpQuery = {\n _type: 'tcp.query',\n id: queryId,\n data,\n };\n this.conn.send(serializeTLObject(tcpQuery as unknown as Record<string, unknown>));\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.removeListener(`queryAnswer:${queryId}`, onAnswer);\n reject(new TimeoutError(`RPC query timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n const onAnswer = (result: { data?: Buffer; error?: { code: number; message: string } }) => {\n clearTimeout(timer);\n if (result.error) {\n reject(new ProtocolError(result.error.message, result.error.code));\n } else if (result.data) {\n resolve(deserializeTLObject(result.data));\n }\n };\n\n this.once(`queryAnswer:${queryId}`, onAnswer);\n });\n }\n\n async disconnect(): Promise<void> {\n this.cleanup();\n this.conn?.destroy();\n this.conn = null;\n this._connected = false;\n }\n\n private handleFrame(data: Buffer): void {\n if (data.length === 0) {\n // Keepalive empty frame\n return;\n }\n\n let obj: Record<string, unknown>;\n try {\n obj = deserializeTLObject(data);\n } catch (e) {\n this.emit('error', new ProtocolError(`Failed to deserialize frame: ${e}`));\n return;\n }\n\n const type = obj['_type'] as string;\n\n switch (type) {\n case 'tcp.pong':\n // Keepalive response — ignore\n break;\n\n case 'tcp.ping': {\n // Server asking us for keepalive — respond with pong\n if (this.conn) {\n const pong = { _type: 'tcp.pong', id: obj['id'] };\n this.conn.send(serializeTLObject(pong as unknown as Record<string, unknown>));\n }\n break;\n }\n\n case 'tcp.queryAnswer': {\n const queryId = obj['id'] as bigint;\n this.emit(`queryAnswer:${queryId}`, { data: obj['data'] });\n break;\n }\n\n case 'tcp.queryError': {\n const queryId = obj['id'] as bigint;\n this.emit(`queryAnswer:${queryId}`, {\n error: { code: obj['code'] as number, message: obj['message'] as string },\n });\n break;\n }\n\n case 'tcp.packet': {\n // Unwrap tcp.packet data and process inner TL object\n const innerData = obj['data'] as Buffer;\n if (innerData.length === 0) break;\n\n let innerObj: Record<string, unknown>;\n try {\n innerObj = deserializeTLObject(innerData);\n } catch (e) {\n this.emit('error', new ProtocolError(`Failed to deserialize inner packet: ${e}`));\n return;\n }\n\n this.handleInnerPacket(innerObj);\n break;\n }\n\n default:\n this.emit('error', new ProtocolError(`Unexpected frame type: ${type}`));\n }\n }\n\n private handleInnerPacket(obj: Record<string, unknown>): void {\n const type = obj['_type'] as string;\n\n // Normalize legacy query answer variants to Ex-shape used by the SDK.\n let normalized: Record<string, unknown> = obj;\n if (type === 'client.queryAnswer') {\n normalized = {\n ...obj,\n _type: 'client.queryAnswerEx',\n };\n } else if (type === 'client.queryAnswerPart') {\n normalized = {\n ...obj,\n _type: 'client.queryAnswerPartEx',\n };\n } else if (type === 'client.queryAnswerError' || type === 'client.queryAnswerPartError') {\n normalized = {\n ...obj,\n _type: 'client.queryAnswerErrorEx',\n };\n }\n\n const normalizedType = normalized['_type'] as string;\n if (\n normalizedType === 'client.queryAnswerEx' ||\n normalizedType === 'client.queryAnswerErrorEx' ||\n normalizedType === 'client.queryAnswerPartEx'\n ) {\n const requestId = (normalized['requestId'] as Buffer).toString('hex');\n const pending = this.pendingQueries.get(requestId);\n if (!pending) {\n return;\n }\n\n const answer = normalized as unknown as ClientQueryAnswerExType;\n\n if (normalizedType === 'client.queryAnswerErrorEx') {\n // Error is always terminal.\n clearTimeout(pending.timer);\n this.pendingQueries.delete(requestId);\n pending.resolve(answer);\n return;\n }\n\n // Both queryAnswerEx and queryAnswerPartEx can carry intermediate or final chunks.\n pending.onPart?.(answer);\n if (this.isTerminalQueryAnswer(answer)) {\n clearTimeout(pending.timer);\n this.pendingQueries.delete(requestId);\n pending.resolve(answer);\n }\n }\n }\n\n private isTerminalQueryAnswer(answer: ClientQueryAnswerExType): boolean {\n if (answer._type === 'client.queryAnswerErrorEx') {\n return true;\n }\n\n // Legacy protocol may provide explicit completion bit.\n const legacyIsCompleted = (answer as unknown as { isCompleted?: boolean }).isCompleted;\n if (typeof legacyIsCompleted === 'boolean') {\n return legacyIsCompleted;\n }\n\n // Ex protocol signals final chunk via final_info (flags.0).\n if ('finalInfo' in answer && answer.finalInfo) {\n return true;\n }\n if ('flags' in answer && typeof answer.flags === 'number' && (answer.flags & 1) !== 0) {\n return true;\n }\n\n // If this is an HTTP envelope with chunked transfer, more chunks will follow.\n if ('answer' in answer && answer.answer) {\n try {\n const envelope = deserializeTLObject(answer.answer) as {\n _type?: string;\n headers?: Array<{ name: string; value: string }>;\n };\n if (envelope._type === 'http.response') {\n const transferEncoding = envelope.headers?.find(\n (h) => h.name.toLowerCase() === 'transfer-encoding',\n )?.value;\n if (transferEncoding && transferEncoding.toLowerCase().includes('chunked')) {\n return false;\n }\n return true;\n }\n } catch {\n // Raw payload (not an envelope). Fall through to type-based heuristic below.\n }\n }\n\n // PartEx without explicit completion markers is not terminal.\n if (answer._type === 'client.queryAnswerPartEx') {\n return false;\n }\n\n // Ex without completion markers/envelope is treated as terminal fallback.\n return true;\n }\n\n private startKeepalive(): void {\n // Send ping every 10 seconds\n this.keepaliveTimer = setInterval(() => {\n if (this.conn?.isConnected) {\n const pingId = crypto.randomBytes(8).readBigInt64LE();\n const ping = { _type: 'tcp.ping', id: pingId };\n try {\n this.conn.send(serializeTLObject(ping as unknown as Record<string, unknown>));\n } catch {\n // Connection may have been closed\n }\n }\n }, 10_000);\n }\n\n private cleanup(): void {\n if (this.keepaliveTimer) {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = null;\n }\n\n for (const [, pending] of this.pendingQueries) {\n clearTimeout(pending.timer);\n pending.reject(new ConnectionError('Connection closed'));\n }\n this.pendingQueries.clear();\n }\n}\n\n/**\n * Helper to build an HTTP request TL object for inference.\n */\nexport function buildHttpRequest(\n method: string,\n url: string,\n body: Buffer,\n extraHeaders: HttpHeader[] = [],\n): HttpRequest {\n const hasHeader = (name: string): boolean =>\n extraHeaders.some((h) => h.name.toLowerCase() === name.toLowerCase());\n\n const headers: HttpHeader[] = [...extraHeaders];\n if (!hasHeader('Content-Type')) {\n headers.unshift({ _type: 'http.header', name: 'Content-Type', value: 'application/json' });\n }\n if (!hasHeader('Content-Length')) {\n headers.push({ _type: 'http.header', name: 'Content-Length', value: body.length.toString() });\n }\n // Most HTTP/1.1 upstreams require Host header.\n if (!hasHeader('Host')) {\n headers.push({ _type: 'http.header', name: 'Host', value: 'api.openai.com' });\n }\n\n return {\n _type: 'http.request',\n method,\n url,\n httpVersion: 'HTTP/1.1',\n headers,\n payload: body,\n };\n}\n","/**\n * TCP + TLS connection with Cocoon framing.\n *\n * Connection flow:\n * 1. Raw TCP connect\n * 2. Receive PoW challenge (24 bytes), solve it, send response (12 bytes)\n * 3. Upgrade to TLS on same socket\n * 4. TL framing begins: [4 bytes LE size][4 bytes LE seqno][payload]\n * Where `size` is the length of `payload` only.\n */\n\nimport * as net from 'node:net';\nimport * as tls from 'node:tls';\nimport { EventEmitter } from 'node:events';\nimport { ConnectionError } from '../error.js';\nimport {\n parsePowChallenge,\n solvePow,\n buildPowResponse,\n POW_CHALLENGE_SIZE,\n POW_CHALLENGE_MAGIC,\n} from './pow.js';\n\nexport interface ConnectionOptions {\n host: string;\n port: number;\n useTls?: boolean;\n timeout?: number;\n /** PEM-encoded TLS client certificate (for RA-TLS / mTLS) */\n tlsCert?: string | Buffer;\n /** PEM-encoded TLS client private key (for RA-TLS / mTLS) */\n tlsKey?: string | Buffer;\n}\n\nexport type ConnectionEvent =\n | { type: 'data'; seqno: number; data: Buffer }\n | { type: 'close'; error?: Error }\n | { type: 'ready' };\n\nexport class CocoonConnection extends EventEmitter {\n private socket: net.Socket | tls.TLSSocket | null = null;\n private rawSocket: net.Socket | null = null;\n private outSeqno = 0;\n private inSeqno = 0;\n private readBuffer = Buffer.alloc(0);\n private connected = false;\n private destroyed = false;\n\n private readonly host: string;\n private readonly port: number;\n private readonly useTls: boolean;\n private readonly timeout: number;\n private readonly tlsCert?: string | Buffer;\n private readonly tlsKey?: string | Buffer;\n\n constructor(options: ConnectionOptions) {\n super();\n this.host = options.host;\n this.port = options.port;\n this.useTls = options.useTls ?? true;\n this.timeout = options.timeout ?? 120_000;\n this.tlsCert = options.tlsCert;\n this.tlsKey = options.tlsKey;\n }\n\n async connect(): Promise<void> {\n if (this.connected) return;\n\n if (this.useTls) {\n await this.connectWithPowAndTls();\n } else {\n await this.connectPlainTcp();\n }\n }\n\n /**\n * Connect with PoW challenge + TLS upgrade (default for Cocoon proxies).\n */\n private async connectWithPowAndTls(): Promise<void> {\n // Step 1: Raw TCP connect\n const rawSocket = await this.rawTcpConnect();\n this.rawSocket = rawSocket;\n\n try {\n // Step 2: Read PoW challenge and solve it\n await this.handlePow(rawSocket);\n\n // Step 3: Upgrade to TLS\n this.socket = await this.upgradeTls(rawSocket);\n } catch (err) {\n rawSocket.destroy();\n this.rawSocket = null;\n throw err;\n }\n\n this.connected = true;\n this.setupSocketHandlers(this.socket);\n this.emit('ready');\n }\n\n /**\n * Connect with plain TCP (no PoW, no TLS).\n */\n private async connectPlainTcp(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const onConnect = () => {\n this.connected = true;\n this.setupSocketHandlers(this.socket!);\n this.emit('ready');\n resolve();\n };\n\n const onError = (err: Error) => {\n reject(\n new ConnectionError(\n `Failed to connect to ${this.host}:${this.port}: ${err.message}`,\n err,\n ),\n );\n };\n\n this.socket = net.connect({ host: this.host, port: this.port }, onConnect);\n this.socket.setTimeout(this.timeout);\n this.socket.once('error', onError);\n });\n }\n\n private rawTcpConnect(): Promise<net.Socket> {\n return new Promise<net.Socket>((resolve, reject) => {\n const sock = net.connect({ host: this.host, port: this.port }, () => {\n sock.removeListener('error', onError);\n resolve(sock);\n });\n\n sock.setTimeout(this.timeout);\n\n const onError = (err: Error) => {\n reject(\n new ConnectionError(\n `Failed to connect to ${this.host}:${this.port}: ${err.message}`,\n err,\n ),\n );\n };\n\n sock.once('error', onError);\n });\n }\n\n private handlePow(sock: net.Socket): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let powBuffer = Buffer.alloc(0);\n\n const timer = setTimeout(() => {\n sock.removeListener('data', onData);\n reject(new ConnectionError('Timeout waiting for PoW challenge'));\n }, 30_000);\n\n const onData = (chunk: Buffer) => {\n powBuffer = Buffer.concat([powBuffer, chunk]);\n\n // Check if first 4 bytes are the PoW magic\n if (powBuffer.length >= 4) {\n const magic = powBuffer.readUInt32LE(0);\n if (magic !== POW_CHALLENGE_MAGIC) {\n clearTimeout(timer);\n sock.removeListener('data', onData);\n reject(\n new ConnectionError(\n `Unexpected data from proxy (expected PoW challenge): 0x${magic.toString(16)}`,\n ),\n );\n return;\n }\n }\n\n if (powBuffer.length >= POW_CHALLENGE_SIZE) {\n clearTimeout(timer);\n sock.removeListener('data', onData);\n\n try {\n const challenge = parsePowChallenge(powBuffer);\n const nonce = solvePow(challenge);\n const response = buildPowResponse(nonce);\n sock.write(response, (err) => {\n if (err) {\n reject(new ConnectionError(`Failed to send PoW response: ${err.message}`, err));\n } else {\n resolve();\n }\n });\n } catch (err) {\n reject(\n new ConnectionError(\n `PoW failed: ${err instanceof Error ? err.message : err}`,\n err instanceof Error ? err : undefined,\n ),\n );\n }\n }\n };\n\n sock.on('data', onData);\n });\n }\n\n private upgradeTls(rawSocket: net.Socket): Promise<tls.TLSSocket> {\n return new Promise<tls.TLSSocket>((resolve, reject) => {\n const tlsOptions: tls.ConnectionOptions = {\n socket: rawSocket,\n rejectUnauthorized: false, // Cocoon uses custom TDX attestation, not standard CA\n };\n\n // RA-TLS: pass client certificate and key for mTLS\n if (this.tlsCert) tlsOptions.cert = this.tlsCert;\n if (this.tlsKey) tlsOptions.key = this.tlsKey;\n\n const tlsSocket = tls.connect(tlsOptions);\n\n const timer = setTimeout(() => {\n cleanup(() => reject(new ConnectionError('TLS handshake timeout')));\n }, this.timeout);\n\n const cleanup = (next?: () => void) => {\n clearTimeout(timer);\n tlsSocket.removeListener('secureConnect', onSecureConnect);\n tlsSocket.removeListener('error', onError);\n tlsSocket.removeListener('close', onClose);\n if (next) next();\n };\n\n const onSecureConnect = () => {\n cleanup(() => resolve(tlsSocket));\n };\n\n const onError = (err: Error) => {\n cleanup(() => reject(new ConnectionError(`TLS handshake failed: ${err.message}`, err)));\n };\n\n const onClose = () => {\n cleanup(() => reject(new ConnectionError('TLS socket closed before handshake completed')));\n };\n\n tlsSocket.once('secureConnect', onSecureConnect);\n tlsSocket.once('error', onError);\n tlsSocket.once('close', onClose);\n });\n }\n\n private setupSocketHandlers(sock: net.Socket | tls.TLSSocket): void {\n sock.setTimeout(this.timeout);\n sock.on('data', (data: Buffer) => this.onData(data));\n sock.on('close', () => this.onClose());\n sock.on('timeout', () => {\n this.destroy(new ConnectionError('Connection timed out'));\n });\n sock.on('error', (err: Error) => {\n if (this.connected) {\n this.destroy(new ConnectionError(`Socket error: ${err.message}`, err));\n }\n });\n }\n\n /**\n * Send a framed packet: [4b size][4b seqno][payload]\n */\n send(payload: Buffer): void {\n if (!this.socket || this.destroyed) {\n throw new ConnectionError('Not connected');\n }\n\n const frame = Buffer.alloc(8 + payload.length);\n frame.writeUInt32LE(payload.length, 0); // size\n frame.writeInt32LE(this.outSeqno, 4); // seqno\n payload.copy(frame, 8);\n\n this.outSeqno++;\n this.socket.write(frame);\n }\n\n destroy(error?: Error): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.connected = false;\n\n if (this.socket) {\n this.socket.destroy();\n this.socket = null;\n }\n\n if (this.rawSocket) {\n this.rawSocket.destroy();\n this.rawSocket = null;\n }\n\n this.emit('close', error);\n }\n\n get isConnected(): boolean {\n return this.connected && !this.destroyed;\n }\n\n private onData(chunk: Buffer): void {\n this.readBuffer = Buffer.concat([this.readBuffer, chunk]);\n this.processFrames();\n }\n\n private processFrames(): void {\n while (this.readBuffer.length >= 8) {\n const size = this.readBuffer.readUInt32LE(0);\n\n if (size > 1 << 24 || size < 0) {\n this.destroy(new ConnectionError(`Invalid frame size: ${size}`));\n return;\n }\n\n const totalFrameSize = 8 + size;\n if (this.readBuffer.length < totalFrameSize) {\n break; // Wait for more data\n }\n\n const seqno = this.readBuffer.readInt32LE(4);\n if (seqno !== this.inSeqno) {\n this.destroy(\n new ConnectionError(`Sequence number mismatch: expected ${this.inSeqno}, got ${seqno}`),\n );\n return;\n }\n\n const payload = Buffer.alloc(size);\n this.readBuffer.copy(payload, 0, 8, totalFrameSize);\n this.readBuffer = this.readBuffer.subarray(totalFrameSize);\n\n this.inSeqno++;\n this.emit('frame', payload);\n }\n }\n\n private onClose(): void {\n if (!this.destroyed) {\n this.destroy();\n }\n }\n}\n","/**\n * Error classes for the Cocoon SDK.\n */\n\nexport class CocoonError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CocoonError';\n }\n}\n\nexport class ConnectionError extends CocoonError {\n constructor(\n message: string,\n public readonly cause?: Error,\n ) {\n super(message);\n this.name = 'ConnectionError';\n }\n}\n\nexport class ProtocolError extends CocoonError {\n constructor(\n message: string,\n public readonly code?: number,\n ) {\n super(message);\n this.name = 'ProtocolError';\n }\n}\n\nexport class APIError extends CocoonError {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly errorBody?: unknown,\n ) {\n super(message);\n this.name = 'APIError';\n }\n}\n\nexport class AuthenticationError extends CocoonError {\n constructor(\n message: string,\n public readonly code?: number,\n ) {\n super(message);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class TimeoutError extends CocoonError {\n constructor(message = 'Request timed out') {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n","/**\n * Proof-of-Work solver for Cocoon proxy connections.\n *\n * Before TLS handshake, the proxy sends a PoW challenge:\n * [4B LE magic=0x418e1291] [4B LE difficulty_bits] [16B salt]\n *\n * Client must find a nonce (uint64) such that SHA256(salt || nonce)\n * has at least `difficulty_bits` leading zero bits.\n *\n * Response format:\n * [4B LE magic=0x01827319] [8B LE nonce]\n */\n\nimport crypto from 'node:crypto';\n\nexport const POW_CHALLENGE_MAGIC = 0x418e1291;\nexport const POW_RESPONSE_MAGIC = 0x01827319;\nexport const POW_CHALLENGE_SIZE = 24; // 4 + 4 + 16\nexport const POW_RESPONSE_SIZE = 12; // 4 + 8\nconst MAX_DIFFICULTY = 32;\n\nexport interface PowChallenge {\n difficultyBits: number;\n salt: Buffer;\n}\n\nexport function parsePowChallenge(data: Buffer): PowChallenge {\n if (data.length < POW_CHALLENGE_SIZE) {\n throw new Error(\n `PoW challenge too short: ${data.length} bytes, expected ${POW_CHALLENGE_SIZE}`,\n );\n }\n\n const magic = data.readUInt32LE(0);\n if (magic !== POW_CHALLENGE_MAGIC) {\n throw new Error(\n `Invalid PoW magic: 0x${magic.toString(16)}, expected 0x${POW_CHALLENGE_MAGIC.toString(16)}`,\n );\n }\n\n const difficultyBits = data.readInt32LE(4);\n if (difficultyBits < 0 || difficultyBits > MAX_DIFFICULTY) {\n throw new Error(`PoW difficulty out of range: ${difficultyBits}`);\n }\n\n const salt = Buffer.alloc(16);\n data.copy(salt, 0, 8, 24);\n\n return { difficultyBits, salt };\n}\n\n/**\n * Check PoW: read first 8 bytes of hash as LE uint64,\n * count leading zeros of that value.\n *\n * The C++ implementation does:\n * count_leading_zeroes_u64(*(uint64_t*)hash_bytes) >= difficulty\n * On x86 (LE), this reads hash[0..7] in LE order, making hash[7]\n * the most significant byte of the uint64.\n */\nfunction checkPow(hash: Buffer, difficultyBits: number): boolean {\n // Read first 8 hash bytes as LE uint64, then count leading zeros\n // Leading zeros of LE uint64 → check bytes 7,6,5,... (MSB first)\n let remaining = difficultyBits;\n for (let i = 7; i >= 0 && remaining > 0; i--) {\n const byte = hash[i]!;\n if (remaining >= 8) {\n if (byte !== 0) return false;\n remaining -= 8;\n } else {\n // Check top `remaining` bits of this byte\n const mask = 0xff << (8 - remaining);\n if ((byte & mask) !== 0) return false;\n remaining = 0;\n }\n }\n return true;\n}\n\nexport function solvePow(challenge: PowChallenge): bigint {\n const { difficultyBits, salt } = challenge;\n\n if (difficultyBits === 0) return 0n;\n\n // Preallocate buffer: salt(16) + nonce(8)\n const input = Buffer.alloc(24);\n salt.copy(input, 0);\n\n for (let nonce = 0n; ; nonce++) {\n input.writeBigUInt64LE(nonce, 16);\n const hash = crypto.createHash('sha256').update(input).digest();\n if (checkPow(hash, difficultyBits)) {\n return nonce;\n }\n }\n}\n\nexport function buildPowResponse(nonce: bigint): Buffer {\n const buf = Buffer.alloc(POW_RESPONSE_SIZE);\n buf.writeUInt32LE(POW_RESPONSE_MAGIC, 0);\n buf.writeBigUInt64LE(nonce, 4);\n return buf;\n}\n","/**\n * TL Schema definitions with constructor IDs.\n *\n * Constructor IDs are CRC32 of the normalized TL definition string.\n * IDs with # suffix in the .tl file are explicit; others are computed.\n *\n * The schema maps _type names to their constructor ID and field definitions.\n */\n\nexport type TLFieldType =\n | 'int'\n | 'long'\n | 'double'\n | 'int128'\n | 'int256'\n | 'string'\n | 'bytes'\n | 'Bool'\n | 'true' // bare true (flag field present = true)\n | { vector: TLFieldType; bare?: boolean }\n | { ref: string }; // reference to another TL type by _type name\n\nexport interface TLFieldDef {\n name: string;\n type: TLFieldType;\n flag?: { field: string; bit: number }; // conditional field\n}\n\nexport interface TLConstructorDef {\n id: number; // CRC32 constructor ID (uint32)\n fields: TLFieldDef[];\n isFunction?: boolean;\n}\n\n/**\n * CRC32 lookup table (IEEE polynomial)\n */\nconst crc32Table = new Uint32Array(256);\nfor (let i = 0; i < 256; i++) {\n let c = i;\n for (let j = 0; j < 8; j++) {\n if (c & 1) {\n c = 0xedb88320 ^ (c >>> 1);\n } else {\n c = c >>> 1;\n }\n }\n crc32Table[i] = c;\n}\n\nexport function crc32(str: string): number {\n const bytes = Buffer.from(str, 'utf-8');\n let crc = 0xffffffff;\n for (let i = 0; i < bytes.length; i++) {\n crc = crc32Table[(crc ^ bytes[i]!) & 0xff]! ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\n/**\n * Compute TL constructor ID from its definition line.\n * We normalize by removing comments and extra spaces.\n */\nfunction tlId(definition: string): number {\n return crc32(definition.trim());\n}\n\n// --- TCP Layer ---\n// From cocoon_api.tl:\n// tcp.ping id:long = tcp.Packet;\n// tcp.pong id:long = tcp.Packet;\n// tcp.packet data:bytes = tcp.Packet;\n// tcp.queryAnswer id:long data:bytes = tcp.Packet;\n// tcp.queryError id:long code:int message:string = tcp.Packet;\n// tcp.query id:long data:bytes = tcp.Packet;\n// tcp.connected id:long = tcp.Packet;\n// tcp.connect id:long = tcp.Packet;\n\nexport const TL_SCHEMA: Record<string, TLConstructorDef> = {\n // --- TCP Layer ---\n 'tcp.ping': {\n id: tlId('tcp.ping id:long = tcp.Packet'),\n fields: [{ name: 'id', type: 'long' }],\n },\n 'tcp.pong': {\n id: tlId('tcp.pong id:long = tcp.Packet'),\n fields: [{ name: 'id', type: 'long' }],\n },\n 'tcp.packet': {\n id: tlId('tcp.packet data:bytes = tcp.Packet'),\n fields: [{ name: 'data', type: 'bytes' }],\n },\n 'tcp.queryAnswer': {\n id: tlId('tcp.queryAnswer id:long data:bytes = tcp.Packet'),\n fields: [\n { name: 'id', type: 'long' },\n { name: 'data', type: 'bytes' },\n ],\n },\n 'tcp.queryError': {\n id: tlId('tcp.queryError id:long code:int message:string = tcp.Packet'),\n fields: [\n { name: 'id', type: 'long' },\n { name: 'code', type: 'int' },\n { name: 'message', type: 'string' },\n ],\n },\n 'tcp.query': {\n id: tlId('tcp.query id:long data:bytes = tcp.Packet'),\n fields: [\n { name: 'id', type: 'long' },\n { name: 'data', type: 'bytes' },\n ],\n },\n 'tcp.connected': {\n id: tlId('tcp.connected id:long = tcp.Packet'),\n fields: [{ name: 'id', type: 'long' }],\n },\n 'tcp.connect': {\n id: tlId('tcp.connect id:long = tcp.Packet'),\n fields: [{ name: 'id', type: 'long' }],\n },\n\n // --- Tokens ---\n tokensUsed: {\n id: tlId(\n 'tokensUsed prompt_tokens_used:long cached_tokens_used:long completion_tokens_used:long reasoning_tokens_used:long total_tokens_used:long = TokensUsed',\n ),\n fields: [\n { name: 'promptTokensUsed', type: 'long' },\n { name: 'cachedTokensUsed', type: 'long' },\n { name: 'completionTokensUsed', type: 'long' },\n { name: 'reasoningTokensUsed', type: 'long' },\n { name: 'totalTokensUsed', type: 'long' },\n ],\n },\n\n // --- Client/Proxy Params ---\n // worker.params has explicit ID: #869c73ed\n 'worker.params': {\n id: 0x869c73ed,\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'workerOwnerAddress', type: 'string' },\n { name: 'model', type: 'string' },\n { name: 'coefficient', type: 'int' },\n { name: 'isTest', type: 'Bool', flag: { field: 'flags', bit: 0 } },\n { name: 'proxyCnt', type: 'int', flag: { field: 'flags', bit: 0 } },\n { name: 'maxActiveRequests', type: 'int', flag: { field: 'flags', bit: 0 } },\n { name: 'minProtoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n { name: 'maxProtoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n ],\n },\n\n // proxy.params has explicit ID: #d5c5609f\n 'proxy.params': {\n id: 0xd5c5609f,\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'proxyPublicKey', type: 'int256' },\n { name: 'proxyOwnerAddress', type: 'string' },\n { name: 'proxyScAddress', type: 'string' },\n { name: 'isTest', type: 'Bool', flag: { field: 'flags', bit: 0 } },\n { name: 'protoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n ],\n },\n\n // client.params has explicit ID: #40fdca64\n 'client.params': {\n id: 0x40fdca64,\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'clientOwnerAddress', type: 'string' },\n { name: 'isTest', type: 'Bool', flag: { field: 'flags', bit: 0 } },\n { name: 'minProtoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n { name: 'maxProtoVersion', type: 'int', flag: { field: 'flags', bit: 1 } },\n ],\n },\n\n // --- Auth ---\n 'client.proxyConnectionAuthShort': {\n id: tlId(\n 'client.proxyConnectionAuthShort secret_hash:int256 nonce:long = client.ProxyConnectionAuth',\n ),\n fields: [\n { name: 'secretHash', type: 'int256' },\n { name: 'nonce', type: 'long' },\n ],\n },\n 'client.proxyConnectionAuthLong': {\n id: tlId('client.proxyConnectionAuthLong nonce:long = client.ProxyConnectionAuth'),\n fields: [{ name: 'nonce', type: 'long' }],\n },\n\n // --- Signed Payment ---\n 'proxy.signedPayment': {\n id: tlId('proxy.signedPayment data:bytes = proxy.SignedPayment'),\n fields: [{ name: 'data', type: 'bytes' }],\n },\n 'proxy.signedPaymentEmpty': {\n id: tlId('proxy.signedPaymentEmpty = proxy.SignedPayment'),\n fields: [],\n },\n\n // --- Connected To Proxy ---\n 'client.connectedToProxy': {\n id: tlId(\n 'client.connectedToProxy params:proxy.params client_sc_address:string auth:client.ProxyConnectionAuth signed_payment:proxy.SignedPayment = client.ConnectedToProxy',\n ),\n fields: [\n { name: 'params', type: { ref: 'proxy.params' } },\n { name: 'clientScAddress', type: 'string' },\n { name: 'auth', type: { ref: 'client.ProxyConnectionAuth' } },\n { name: 'signedPayment', type: { ref: 'proxy.SignedPayment' } },\n ],\n },\n\n // --- Auth Responses ---\n 'client.authorizationWithProxySuccess': {\n id: tlId(\n 'client.authorizationWithProxySuccess signed_payment:proxy.SignedPayment tokens_committed_to_db:long max_tokens:long = client.AuthorizationWithProxy',\n ),\n fields: [\n { name: 'signedPayment', type: { ref: 'proxy.SignedPayment' } },\n { name: 'tokensCommittedToDb', type: 'long' },\n { name: 'maxTokens', type: 'long' },\n ],\n },\n 'client.authorizationWithProxyFailed': {\n id: tlId(\n 'client.authorizationWithProxyFailed error_code:int error:string = client.AuthorizationWithProxy',\n ),\n fields: [\n { name: 'errorCode', type: 'int' },\n { name: 'error', type: 'string' },\n ],\n },\n\n // --- Query Final Info ---\n 'client.queryFinalInfo': {\n id: tlId(\n 'client.queryFinalInfo flags:# tokens_used:tokensUsed worker_debug:flags.0?string proxy_debug:flags.0?string proxy_start_time:flags.1?double proxy_end_time:flags.1?double worker_start_time:flags.1?double worker_end_time:flags.1?double = client.QueryFinalInfo',\n ),\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'tokensUsed', type: { ref: 'tokensUsed' } },\n { name: 'workerDebug', type: 'string', flag: { field: 'flags', bit: 0 } },\n { name: 'proxyDebug', type: 'string', flag: { field: 'flags', bit: 0 } },\n { name: 'proxyStartTime', type: 'double', flag: { field: 'flags', bit: 1 } },\n { name: 'proxyEndTime', type: 'double', flag: { field: 'flags', bit: 1 } },\n { name: 'workerStartTime', type: 'double', flag: { field: 'flags', bit: 1 } },\n { name: 'workerEndTime', type: 'double', flag: { field: 'flags', bit: 1 } },\n ],\n },\n\n // --- Query Answer Ex variants ---\n // Legacy variants (still sent by some proxy paths):\n 'client.queryAnswer': {\n id: tlId(\n 'client.queryAnswer answer:bytes is_completed:Bool request_id:int256 request_tokens_used:tokensUsed = client.QueryAnswer',\n ),\n fields: [\n { name: 'answer', type: 'bytes' },\n { name: 'isCompleted', type: 'Bool' },\n { name: 'requestId', type: 'int256' },\n { name: 'requestTokensUsed', type: { ref: 'tokensUsed' } },\n ],\n },\n 'client.queryAnswerError': {\n id: tlId(\n 'client.queryAnswerError error_code:int error:string request_id:int256 request_tokens_used:tokensUsed = client.QueryAnswer',\n ),\n fields: [\n { name: 'errorCode', type: 'int' },\n { name: 'error', type: 'string' },\n { name: 'requestId', type: 'int256' },\n { name: 'requestTokensUsed', type: { ref: 'tokensUsed' } },\n ],\n },\n 'client.queryAnswerPart': {\n id: tlId(\n 'client.queryAnswerPart answer:bytes is_completed:Bool request_id:int256 request_tokens_used:tokensUsed = client.QueryAnswerPart',\n ),\n fields: [\n { name: 'answer', type: 'bytes' },\n { name: 'isCompleted', type: 'Bool' },\n { name: 'requestId', type: 'int256' },\n { name: 'requestTokensUsed', type: { ref: 'tokensUsed' } },\n ],\n },\n 'client.queryAnswerPartError': {\n id: tlId(\n 'client.queryAnswerPartError error_code:int error:string request_id:int256 request_tokens_used:tokensUsed = client.QueryAnswerPart',\n ),\n fields: [\n { name: 'errorCode', type: 'int' },\n { name: 'error', type: 'string' },\n { name: 'requestId', type: 'int256' },\n { name: 'requestTokensUsed', type: { ref: 'tokensUsed' } },\n ],\n },\n\n 'client.queryAnswerEx': {\n id: tlId(\n 'client.queryAnswerEx request_id:int256 answer:bytes flags:# final_info:flags.0?client.queryFinalInfo = client.QueryAnswerEx',\n ),\n fields: [\n { name: 'requestId', type: 'int256' },\n { name: 'answer', type: 'bytes' },\n { name: 'flags', type: 'int' },\n {\n name: 'finalInfo',\n type: { ref: 'client.queryFinalInfo' },\n flag: { field: 'flags', bit: 0 },\n },\n ],\n },\n 'client.queryAnswerErrorEx': {\n id: tlId(\n 'client.queryAnswerErrorEx request_id:int256 error_code:int error:string flags:# final_info:flags.0?client.queryFinalInfo = client.QueryAnswerEx',\n ),\n fields: [\n { name: 'requestId', type: 'int256' },\n { name: 'errorCode', type: 'int' },\n { name: 'error', type: 'string' },\n { name: 'flags', type: 'int' },\n {\n name: 'finalInfo',\n type: { ref: 'client.queryFinalInfo' },\n flag: { field: 'flags', bit: 0 },\n },\n ],\n },\n 'client.queryAnswerPartEx': {\n id: tlId(\n 'client.queryAnswerPartEx request_id:int256 answer:bytes flags:# final_info:flags.0?client.queryFinalInfo = client.QueryAnswerEx',\n ),\n fields: [\n { name: 'requestId', type: 'int256' },\n { name: 'answer', type: 'bytes' },\n { name: 'flags', type: 'int' },\n {\n name: 'finalInfo',\n type: { ref: 'client.queryFinalInfo' },\n flag: { field: 'flags', bit: 0 },\n },\n ],\n },\n\n // --- Worker Types V2 ---\n // client.workerInstanceV2 has explicit ID: #3ea93d00\n 'client.workerInstanceV2': {\n id: 0x3ea93d00,\n fields: [\n { name: 'flags', type: 'int' },\n { name: 'coefficient', type: 'int' },\n { name: 'activeRequests', type: 'int' },\n { name: 'maxActiveRequests', type: 'int' },\n ],\n },\n 'client.workerTypeV2': {\n // NOTE: Telegram TL canonical CRC for vector fields uses \"vector T\" syntax.\n // Equivalent canonical form:\n // \"client.workerTypeV2 name:string workers:vector client.workerInstanceV2 = client.WorkerTypeV2\"\n id: 0xb27d8197,\n fields: [\n { name: 'name', type: 'string' },\n { name: 'workers', type: { vector: { ref: 'client.workerInstanceV2' }, bare: true } },\n ],\n },\n 'client.workerTypesV2': {\n // Canonical form:\n // \"client.workerTypesV2 types:vector client.workerTypeV2 = client.WorkerTypesV2\"\n id: 0x0cf0dc67,\n fields: [{ name: 'types', type: { vector: { ref: 'client.workerTypeV2' }, bare: true } }],\n },\n\n // --- Payment ---\n 'client.paymentStatus': {\n id: tlId(\n 'client.paymentStatus signed_payment:proxy.SignedPayment db_tokens:long max_tokens:long = client.PaymentStatus',\n ),\n fields: [\n { name: 'signedPayment', type: { ref: 'proxy.SignedPayment' } },\n { name: 'dbTokens', type: 'long' },\n { name: 'maxTokens', type: 'long' },\n ],\n },\n\n // Payment request from proxy to client (may be sent during query flow).\n 'proxy.clientRequestPayment': {\n id: tlId(\n 'proxy.clientRequestPayment request_id:int256 signed_payment:proxy.SignedPayment db_tokens:long max_tokens:long request_tokens:long = proxy.WorkerRequestPayment',\n ),\n fields: [\n { name: 'requestId', type: 'int256' },\n { name: 'signedPayment', type: { ref: 'proxy.SignedPayment' } },\n { name: 'dbTokens', type: 'long' },\n { name: 'maxTokens', type: 'long' },\n { name: 'requestTokens', type: 'long' },\n ],\n },\n\n 'client.refund': {\n id: tlId('client.refund data:bytes = client.Refund'),\n fields: [{ name: 'data', type: 'bytes' }],\n },\n 'client.refundRejected': {\n id: tlId('client.refundRejected active_queries:long = client.Refund'),\n fields: [{ name: 'activeQueries', type: 'long' }],\n },\n\n // --- HTTP ---\n 'http.header': {\n id: tlId('http.header name:string value:string = http.Header'),\n fields: [\n { name: 'name', type: 'string' },\n { name: 'value', type: 'string' },\n ],\n },\n 'http.response': {\n // Canonical vector form for CRC:\n // \"http.response http_version:string status_code:int reason:string headers:vector http.header payload:bytes = http.Response\"\n id: 0x1cd0c42b,\n fields: [\n { name: 'httpVersion', type: 'string' },\n { name: 'statusCode', type: 'int' },\n { name: 'reason', type: 'string' },\n { name: 'headers', type: { vector: { ref: 'http.header' }, bare: true } },\n { name: 'payload', type: 'bytes' },\n ],\n },\n 'http.request': {\n // Canonical vector form for CRC:\n // \"http.request method:string url:string http_version:string headers:vector http.header payload:bytes = http.Response\"\n id: 0x47492de5,\n fields: [\n { name: 'method', type: 'string' },\n { name: 'url', type: 'string' },\n { name: 'httpVersion', type: 'string' },\n { name: 'headers', type: { vector: { ref: 'http.header' }, bare: true } },\n { name: 'payload', type: 'bytes' },\n ],\n isFunction: true,\n },\n\n // --- Root Config ---\n 'rootConfig.registeredProxy': {\n id: tlId('rootConfig.registeredProxy seqno:int address:string = rootConfig.RegisteredProxy'),\n fields: [\n { name: 'seqno', type: 'int' },\n { name: 'address', type: 'string' },\n ],\n },\n\n // --- Functions ---\n 'client.connectToProxy': {\n id: tlId(\n 'client.connectToProxy params:client.params min_config_version:int = client.ConnectedToProxy',\n ),\n fields: [\n { name: 'params', type: { ref: 'client.params' } },\n { name: 'minConfigVersion', type: 'int' },\n ],\n isFunction: true,\n },\n 'client.authorizeWithProxyShort': {\n id: tlId('client.authorizeWithProxyShort data:bytes = client.AuthorizationWithProxy'),\n fields: [{ name: 'data', type: 'bytes' }],\n isFunction: true,\n },\n 'client.authorizeWithProxyLong': {\n id: tlId('client.authorizeWithProxyLong = client.AuthorizationWithProxy'),\n fields: [],\n isFunction: true,\n },\n 'client.runQueryEx': {\n id: tlId(\n 'client.runQueryEx model_name:string query:bytes max_coefficient:int max_tokens:int timeout:double request_id:int256 min_config_version:int flags:# enable_debug:flags.0?Bool = client.QueryAnswerEx',\n ),\n fields: [\n { name: 'modelName', type: 'string' },\n { name: 'query', type: 'bytes' },\n { name: 'maxCoefficient', type: 'int' },\n { name: 'maxTokens', type: 'int' },\n { name: 'timeout', type: 'double' },\n { name: 'requestId', type: 'int256' },\n { name: 'minConfigVersion', type: 'int' },\n { name: 'flags', type: 'int' },\n { name: 'enableDebug', type: 'Bool', flag: { field: 'flags', bit: 0 } },\n ],\n isFunction: true,\n },\n 'client.getWorkerTypesV2': {\n id: tlId('client.getWorkerTypesV2 = client.WorkerTypesV2'),\n fields: [],\n isFunction: true,\n },\n 'client.updatePaymentStatus': {\n id: tlId('client.updatePaymentStatus = client.PaymentStatus'),\n fields: [],\n isFunction: true,\n },\n 'client.requestRefund': {\n id: tlId('client.requestRefund = client.Refund'),\n fields: [],\n isFunction: true,\n },\n};\n\n// Build reverse lookup: constructor ID → type name\nexport const CONSTRUCTOR_ID_MAP: Map<number, string> = new Map();\nfor (const [name, def] of Object.entries(TL_SCHEMA)) {\n CONSTRUCTOR_ID_MAP.set(def.id, name);\n}\n\n// Polymorphic type → concrete constructors\nexport const POLYMORPHIC_TYPES: Record<string, string[]> = {\n 'tcp.Packet': [\n 'tcp.ping',\n 'tcp.pong',\n 'tcp.packet',\n 'tcp.queryAnswer',\n 'tcp.queryError',\n 'tcp.query',\n 'tcp.connected',\n 'tcp.connect',\n ],\n 'client.ProxyConnectionAuth': [\n 'client.proxyConnectionAuthShort',\n 'client.proxyConnectionAuthLong',\n ],\n 'proxy.SignedPayment': ['proxy.signedPayment', 'proxy.signedPaymentEmpty'],\n 'client.AuthorizationWithProxy': [\n 'client.authorizationWithProxySuccess',\n 'client.authorizationWithProxyFailed',\n ],\n 'client.QueryAnswerEx': [\n 'client.queryAnswerEx',\n 'client.queryAnswerErrorEx',\n 'client.queryAnswerPartEx',\n ],\n 'client.Refund': ['client.refund', 'client.refundRejected'],\n};\n","/**\n * TL Binary Serializer.\n *\n * Serializes TL objects into binary format following the TL specification:\n * - int: 4 bytes LE\n * - long: 8 bytes LE\n * - double: 8 bytes LE (IEEE 754)\n * - int128: 16 bytes raw\n * - int256: 32 bytes raw\n * - string/bytes: length-prefixed with padding to 4-byte alignment\n * - vector: constructor_id(0x1cb5c415) + count + elements\n * - Bool: boolTrue(0x997275b5) or boolFalse(0xbc799737)\n */\n\nimport {\n TL_SCHEMA,\n POLYMORPHIC_TYPES,\n type TLFieldType,\n type TLConstructorDef,\n} from './schema.js';\n\nconst VECTOR_ID = 0x1cb5c415;\nconst BOOL_TRUE_ID = 0x997275b5;\nconst BOOL_FALSE_ID = 0xbc799737;\n\nexport class TLSerializer {\n private buffers: Buffer[] = [];\n private totalLength = 0;\n\n writeInt(value: number): void {\n const buf = Buffer.alloc(4);\n buf.writeInt32LE(value, 0);\n this.push(buf);\n }\n\n writeUInt(value: number): void {\n const buf = Buffer.alloc(4);\n buf.writeUInt32LE(value, 0);\n this.push(buf);\n }\n\n writeLong(value: bigint): void {\n const buf = Buffer.alloc(8);\n buf.writeBigInt64LE(value, 0);\n this.push(buf);\n }\n\n writeDouble(value: number): void {\n const buf = Buffer.alloc(8);\n buf.writeDoubleLE(value, 0);\n this.push(buf);\n }\n\n writeInt128(value: Buffer): void {\n if (value.length !== 16) throw new Error(`int128 must be 16 bytes, got ${value.length}`);\n this.push(value);\n }\n\n writeInt256(value: Buffer): void {\n if (value.length !== 32) throw new Error(`int256 must be 32 bytes, got ${value.length}`);\n this.push(value);\n }\n\n writeBytes(value: Buffer): void {\n let headerLen: number;\n if (value.length < 254) {\n const header = Buffer.alloc(1);\n header[0] = value.length;\n this.push(header);\n headerLen = 1;\n } else {\n const header = Buffer.alloc(4);\n header[0] = 254;\n header[1] = value.length & 0xff;\n header[2] = (value.length >> 8) & 0xff;\n header[3] = (value.length >> 16) & 0xff;\n this.push(header);\n headerLen = 4;\n }\n this.push(value);\n // Pad to 4-byte alignment\n const totalLen = headerLen + value.length;\n const padding = (4 - (totalLen % 4)) % 4;\n if (padding > 0) {\n this.push(Buffer.alloc(padding));\n }\n }\n\n writeString(value: string): void {\n this.writeBytes(Buffer.from(value, 'utf-8'));\n }\n\n writeBool(value: boolean): void {\n this.writeUInt(value ? BOOL_TRUE_ID : BOOL_FALSE_ID);\n }\n\n writeVector(items: unknown[], itemType: TLFieldType, bare = false): void {\n if (!bare) {\n this.writeUInt(VECTOR_ID);\n }\n this.writeInt(items.length);\n for (const item of items) {\n this.writeField(item, itemType);\n }\n }\n\n writeConstructorId(id: number): void {\n this.writeUInt(id);\n }\n\n /**\n * Serialize a TL object by its _type, writing constructor ID + fields.\n * boxed=true writes the constructor ID prefix.\n */\n writeObject(obj: Record<string, unknown>, boxed = true): void {\n const typeName = obj['_type'] as string;\n if (!typeName) throw new Error('TL object must have _type field');\n\n const schema = TL_SCHEMA[typeName];\n if (!schema) throw new Error(`Unknown TL type: ${typeName}`);\n\n if (boxed) {\n this.writeConstructorId(schema.id);\n }\n\n // Compute flags before writing\n this.writeFields(obj, schema);\n }\n\n private writeFields(obj: Record<string, unknown>, schema: TLConstructorDef): void {\n // First pass: compute flags values\n const flagValues: Record<string, number> = {};\n for (const field of schema.fields) {\n if (field.type === 'int' && field.name.toLowerCase().includes('flag')) {\n // Check if this is an explicit flags field\n const isFlags = schema.fields.some((f) => f.flag?.field === field.name);\n if (isFlags) {\n let flags = 0;\n for (const f of schema.fields) {\n if (f.flag?.field === field.name && obj[f.name] !== undefined && obj[f.name] !== null) {\n flags |= 1 << f.flag.bit;\n }\n }\n flagValues[field.name] = flags;\n }\n }\n }\n\n for (const field of schema.fields) {\n // Check if this is a flag field we computed\n if (field.name in flagValues) {\n this.writeInt(flagValues[field.name]!);\n continue;\n }\n\n // Skip conditional fields that are not present\n if (field.flag) {\n const flagVal = flagValues[field.flag.field] ?? (obj[field.flag.field] as number) ?? 0;\n if (!(flagVal & (1 << field.flag.bit))) {\n continue;\n }\n }\n\n const value = obj[field.name];\n this.writeField(value, field.type);\n }\n }\n\n writeField(value: unknown, type: TLFieldType): void {\n if (typeof type === 'string') {\n switch (type) {\n case 'int':\n this.writeInt(value as number);\n break;\n case 'long':\n this.writeLong(value as bigint);\n break;\n case 'double':\n this.writeDouble(value as number);\n break;\n case 'int128':\n this.writeInt128(value as Buffer);\n break;\n case 'int256':\n this.writeInt256(value as Buffer);\n break;\n case 'string':\n this.writeString(value as string);\n break;\n case 'bytes':\n this.writeBytes(value as Buffer);\n break;\n case 'Bool':\n this.writeBool(value as boolean);\n break;\n case 'true':\n // bare true — presence is encoded by the flag bit, no data written\n break;\n default:\n throw new Error(`Unknown primitive type: ${type}`);\n }\n } else if ('vector' in type) {\n this.writeVector(value as unknown[], type.vector, Boolean(type.bare));\n } else if ('ref' in type) {\n // Concrete constructor refs are bare in TL (no nested constructor ID).\n // Polymorphic refs are boxed and must include constructor ID.\n const isPolymorphicRef = type.ref in POLYMORPHIC_TYPES;\n if (isPolymorphicRef) {\n this.writeObject(value as Record<string, unknown>, true);\n return;\n }\n\n if (!(type.ref in TL_SCHEMA)) {\n throw new Error(`Unknown TL ref type: ${type.ref}`);\n }\n\n const obj = value as Record<string, unknown>;\n const nestedType = obj['_type'] as string | undefined;\n if (nestedType && nestedType !== type.ref) {\n throw new Error(`Expected nested type ${type.ref}, got ${nestedType}`);\n }\n this.writeObject(nestedType ? obj : { ...obj, _type: type.ref }, false);\n }\n }\n\n private push(buf: Buffer): void {\n this.buffers.push(buf);\n this.totalLength += buf.length;\n }\n\n toBuffer(): Buffer {\n return Buffer.concat(this.buffers, this.totalLength);\n }\n}\n\n/**\n * Serialize a TL object to a Buffer.\n */\nexport function serializeTLObject(obj: Record<string, unknown>, boxed = true): Buffer {\n const s = new TLSerializer();\n s.writeObject(obj, boxed);\n return s.toBuffer();\n}\n","/**\n * TL Binary Deserializer.\n *\n * Deserializes TL binary data into JavaScript objects.\n */\n\nimport {\n TL_SCHEMA,\n CONSTRUCTOR_ID_MAP,\n POLYMORPHIC_TYPES,\n type TLFieldType,\n type TLConstructorDef,\n} from './schema.js';\n\nconst VECTOR_ID = 0x1cb5c415;\nconst BOOL_TRUE_ID = 0x997275b5;\nconst BOOL_FALSE_ID = 0xbc799737;\n\nexport class TLDeserializer {\n private buffer: Buffer;\n private offset: number;\n\n constructor(buffer: Buffer) {\n this.buffer = buffer;\n this.offset = 0;\n }\n\n get remaining(): number {\n return this.buffer.length - this.offset;\n }\n\n readInt(): number {\n this.checkRemaining(4);\n const value = this.buffer.readInt32LE(this.offset);\n this.offset += 4;\n return value;\n }\n\n readUInt(): number {\n this.checkRemaining(4);\n const value = this.buffer.readUInt32LE(this.offset);\n this.offset += 4;\n return value;\n }\n\n readLong(): bigint {\n this.checkRemaining(8);\n const value = this.buffer.readBigInt64LE(this.offset);\n this.offset += 8;\n return value;\n }\n\n readDouble(): number {\n this.checkRemaining(8);\n const value = this.buffer.readDoubleLE(this.offset);\n this.offset += 8;\n return value;\n }\n\n readInt128(): Buffer {\n this.checkRemaining(16);\n const value = Buffer.alloc(16);\n this.buffer.copy(value, 0, this.offset, this.offset + 16);\n this.offset += 16;\n return value;\n }\n\n readInt256(): Buffer {\n this.checkRemaining(32);\n const value = Buffer.alloc(32);\n this.buffer.copy(value, 0, this.offset, this.offset + 32);\n this.offset += 32;\n return value;\n }\n\n readBytes(): Buffer {\n this.checkRemaining(1);\n let length: number;\n let headerLen: number;\n\n const firstByte = this.buffer[this.offset]!;\n if (firstByte < 254) {\n length = firstByte;\n headerLen = 1;\n this.offset += 1;\n } else {\n this.checkRemaining(4);\n length =\n this.buffer[this.offset + 1]! |\n (this.buffer[this.offset + 2]! << 8) |\n (this.buffer[this.offset + 3]! << 16);\n headerLen = 4;\n this.offset += 4;\n }\n\n this.checkRemaining(length);\n const value = Buffer.alloc(length);\n this.buffer.copy(value, 0, this.offset, this.offset + length);\n this.offset += length;\n\n // Skip padding\n const totalLen = headerLen + length;\n const padding = (4 - (totalLen % 4)) % 4;\n this.offset += padding;\n\n return value;\n }\n\n readString(): string {\n return this.readBytes().toString('utf-8');\n }\n\n readBool(): boolean {\n const id = this.readUInt();\n if (id === BOOL_TRUE_ID) return true;\n if (id === BOOL_FALSE_ID) return false;\n throw new Error(`Invalid Bool constructor ID: 0x${id.toString(16)}`);\n }\n\n readVector(itemType: TLFieldType, bare = false): unknown[] {\n if (!bare) {\n const id = this.readUInt();\n if (id !== VECTOR_ID) {\n throw new Error(\n `Expected vector constructor ID 0x${VECTOR_ID.toString(16)}, got 0x${id.toString(16)}`,\n );\n }\n }\n const count = this.readInt();\n const items: unknown[] = [];\n for (let i = 0; i < count; i++) {\n items.push(this.readField(itemType));\n }\n return items;\n }\n\n /**\n * Read a boxed TL object: reads constructor ID, looks up schema, reads fields.\n */\n readObject(): Record<string, unknown> {\n const constructorId = this.readUInt();\n const typeName = CONSTRUCTOR_ID_MAP.get(constructorId);\n if (!typeName) {\n throw new Error(\n `Unknown TL constructor ID: 0x${constructorId.toString(16).padStart(8, '0')}`,\n );\n }\n\n const schema = TL_SCHEMA[typeName]!;\n return this.readFields(typeName, schema);\n }\n\n /**\n * Read fields of a known TL type (without reading constructor ID).\n */\n readObjectBare(typeName: string): Record<string, unknown> {\n const schema = TL_SCHEMA[typeName];\n if (!schema) throw new Error(`Unknown TL type: ${typeName}`);\n return this.readFields(typeName, schema);\n }\n\n private readFields(typeName: string, schema: TLConstructorDef): Record<string, unknown> {\n const result: Record<string, unknown> = { _type: typeName };\n const flagValues: Record<string, number> = {};\n\n for (const field of schema.fields) {\n // Check if this is a conditional field\n if (field.flag) {\n const flagVal = flagValues[field.flag.field] ?? 0;\n if (!(flagVal & (1 << field.flag.bit))) {\n continue; // Field not present\n }\n }\n\n const value = this.readField(field.type);\n result[field.name] = value;\n\n // Track flag values for conditional fields\n if (field.type === 'int' && schema.fields.some((f) => f.flag?.field === field.name)) {\n flagValues[field.name] = value as number;\n }\n }\n\n return result;\n }\n\n readField(type: TLFieldType): unknown {\n if (typeof type === 'string') {\n switch (type) {\n case 'int':\n return this.readInt();\n case 'long':\n return this.readLong();\n case 'double':\n return this.readDouble();\n case 'int128':\n return this.readInt128();\n case 'int256':\n return this.readInt256();\n case 'string':\n return this.readString();\n case 'bytes':\n return this.readBytes();\n case 'Bool':\n return this.readBool();\n case 'true':\n return true; // Bare true is present by virtue of the flag being set\n default:\n throw new Error(`Unknown primitive type: ${type}`);\n }\n } else if ('vector' in type) {\n return this.readVector(type.vector, Boolean(type.bare));\n } else if ('ref' in type) {\n if (type.ref in POLYMORPHIC_TYPES) {\n // Boxed polymorphic type — constructor ID determines concrete type.\n return this.readObject();\n }\n if (type.ref in TL_SCHEMA) {\n // Concrete constructor refs are bare (no nested constructor ID).\n return this.readObjectBare(type.ref);\n }\n throw new Error(`Unknown TL ref type: ${type.ref}`);\n }\n\n throw new Error(`Unhandled field type: ${JSON.stringify(type)}`);\n }\n\n private checkRemaining(needed: number): void {\n if (this.offset + needed > this.buffer.length) {\n throw new Error(\n `Buffer underflow: need ${needed} bytes at offset ${this.offset}, ` +\n `but only ${this.buffer.length - this.offset} remain`,\n );\n }\n }\n}\n\n/**\n * Deserialize a boxed TL object from a Buffer.\n */\nexport function deserializeTLObject(buffer: Buffer): Record<string, unknown> {\n const d = new TLDeserializer(buffer);\n return d.readObject();\n}\n","/**\n * Cocoon protocol handshake.\n *\n * Flow:\n * 1. Client sends tcp.connect(id) → Server replies tcp.connected(id)\n * 2. Client sends client.connectToProxy(params, minConfigVersion)\n * → Server replies client.connectedToProxy(params, clientScAddress, auth, signedPayment)\n * 3. Auth: short (secret hash match) or long (blockchain registration)\n * - Short: client.authorizeWithProxyShort(secretData)\n * - Long: client.authorizeWithProxyLong() (after on-chain tx)\n * → Server replies client.AuthorizationWithProxy (success or failed)\n */\n\nimport { serializeTLObject } from '../tl/serializer.js';\nimport { deserializeTLObject } from '../tl/deserializer.js';\nimport { CocoonConnection } from './connection.js';\nimport { ConnectionError, AuthenticationError, ProtocolError } from '../error.js';\nimport type {\n TcpConnect,\n TcpConnected,\n ClientParams,\n ClientConnectToProxy,\n ClientConnectedToProxy,\n ClientAuthorizeWithProxyShort,\n ClientAuthorizationWithProxy,\n ProxyParams,\n ProxySignedPaymentType,\n} from '../tl/types.js';\nimport { TL_SCHEMA } from '../tl/schema.js';\nimport crypto from 'node:crypto';\n\nexport interface HandshakeResult {\n proxyParams: ProxyParams;\n clientScAddress: string;\n signedPayment: ProxySignedPaymentType;\n tokensCommittedToDb: bigint;\n maxTokens: bigint;\n protoVersion: number;\n}\n\nexport interface LongAuthContext {\n nonce: bigint;\n clientScAddress: string;\n proxyParams: ProxyParams;\n}\n\nexport type LongAuthHandler = (context: LongAuthContext) => Promise<void>;\n\n/**\n * Perform the full TCP + proxy handshake and authentication.\n */\nexport async function performHandshake(\n conn: CocoonConnection,\n ownerAddress: string,\n secretString: string,\n configVersion: number,\n onLongAuthRequired?: LongAuthHandler,\n): Promise<HandshakeResult> {\n // Step 1: TCP connect\n const tcpId = crypto.randomBytes(8).readBigInt64LE();\n const tcpConnect: TcpConnect = { _type: 'tcp.connect', id: tcpId };\n conn.send(serializeTLObject(tcpConnect as unknown as Record<string, unknown>));\n\n const tcpResponse = await waitForFrame(conn, 30_000);\n const tcpConnected = deserializeTLObject(tcpResponse) as unknown as TcpConnected;\n if (tcpConnected._type !== 'tcp.connected') {\n throw new ProtocolError(`Expected tcp.connected, got ${tcpConnected._type}`);\n }\n\n // Step 2: Connect to proxy\n const clientParams: ClientParams = {\n _type: 'client.params',\n flags: 3, // bit 0 (isTest) + bit 1 (proto versions)\n clientOwnerAddress: ownerAddress,\n isTest: false,\n minProtoVersion: 0,\n maxProtoVersion: 1,\n };\n\n const connectReq: ClientConnectToProxy = {\n _type: 'client.connectToProxy',\n params: clientParams,\n minConfigVersion: configVersion,\n };\n\n // Wrap in tcp.query for handshake\n const queryId = crypto.randomBytes(8).readBigInt64LE();\n sendQuery(conn, queryId, serializeTLObject(connectReq as unknown as Record<string, unknown>));\n\n const connectResponseData = await waitForQueryAnswer(\n conn,\n queryId,\n 30_000,\n 'connectToProxy response',\n );\n const connected = deserializeTLObject(connectResponseData) as unknown as ClientConnectedToProxy;\n if (connected._type !== 'client.connectedToProxy') {\n throw new ProtocolError(`Expected client.connectedToProxy, got ${connected._type}`);\n }\n\n const protoVersion = connected.params.protoVersion ?? 0;\n\n // Step 3: Authenticate\n // Determine auth type from connected response\n const auth = connected.auth;\n let authResult: ClientAuthorizationWithProxy;\n\n if (auth._type === 'client.proxyConnectionAuthShort') {\n // Compute our secret hash and compare\n const ourSecretHash = Buffer.from(crypto.createHash('sha256').update(secretString).digest());\n\n if (ourSecretHash.equals(auth.secretHash)) {\n // Short auth — send secret string\n const authReq: ClientAuthorizeWithProxyShort = {\n _type: 'client.authorizeWithProxyShort',\n data: Buffer.from(secretString, 'utf-8'),\n };\n const authQueryId = crypto.randomBytes(8).readBigInt64LE();\n sendQuery(\n conn,\n authQueryId,\n serializeTLObject(authReq as unknown as Record<string, unknown>),\n );\n const authResponseData = await waitForQueryAnswer(\n conn,\n authQueryId,\n 300_000,\n 'short auth response',\n );\n authResult = deserializeTLObject(authResponseData) as unknown as ClientAuthorizationWithProxy;\n } else {\n // Fallback to long auth\n authResult = await performLongAuth(\n conn,\n connected,\n auth.nonce,\n onLongAuthRequired,\n 'Proxy requested long auth because provided SECRET does not match on-chain secret hash',\n );\n }\n } else {\n // Long auth required\n authResult = await performLongAuth(\n conn,\n connected,\n auth.nonce,\n onLongAuthRequired,\n 'Proxy requires long auth (wallet is not registered for this proxy or SECRET is unavailable)',\n );\n }\n\n if (authResult._type === 'client.authorizationWithProxyFailed') {\n throw new AuthenticationError(`Proxy auth failed: ${authResult.error}`, authResult.errorCode);\n }\n\n if (authResult._type !== 'client.authorizationWithProxySuccess') {\n throw new ProtocolError(\n `Unexpected auth response type: ${(authResult as { _type: string })._type}`,\n );\n }\n\n return {\n proxyParams: connected.params,\n clientScAddress: connected.clientScAddress,\n signedPayment: authResult.signedPayment,\n tokensCommittedToDb: authResult.tokensCommittedToDb,\n maxTokens: authResult.maxTokens,\n protoVersion,\n };\n}\n\nfunction buildHandshakeCloseError(stage: string, error?: Error): ConnectionError {\n const suffix =\n ' This usually means RA-TLS/mTLS client credentials were rejected by the proxy.';\n return new ConnectionError(\n `Connection closed while waiting for ${stage}.${suffix}`,\n error,\n );\n}\n\nasync function performLongAuth(\n conn: CocoonConnection,\n connected: ClientConnectedToProxy,\n nonce: bigint,\n onLongAuthRequired: LongAuthHandler | undefined,\n missingHandlerMessage: string,\n): Promise<ClientAuthorizationWithProxy> {\n if (!onLongAuthRequired) {\n throw new AuthenticationError(\n `${missingHandlerMessage}. Provide SECRET for short auth, or explicitly enable automatic long-auth registration`,\n );\n }\n\n await onLongAuthRequired({\n nonce,\n clientScAddress: connected.clientScAddress,\n proxyParams: connected.params,\n });\n\n const authQueryId = crypto.randomBytes(8).readBigInt64LE();\n const authReq = { _type: 'client.authorizeWithProxyLong' };\n sendQuery(conn, authQueryId, serializeTLObject(authReq as unknown as Record<string, unknown>));\n const authResponseData = await waitForQueryAnswer(\n conn,\n authQueryId,\n 300_000,\n 'long auth response',\n );\n return deserializeTLObject(authResponseData) as unknown as ClientAuthorizationWithProxy;\n}\n\nfunction sendQuery(conn: CocoonConnection, queryId: bigint, data: Buffer): void {\n const queryObj = {\n _type: 'tcp.query',\n id: queryId,\n data,\n };\n conn.send(serializeTLObject(queryObj as unknown as Record<string, unknown>));\n}\n\nfunction waitForFrame(conn: CocoonConnection, timeoutMs: number): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => cleanup(() => reject(new ConnectionError('Timeout waiting for frame'))), timeoutMs);\n\n const cleanup = (next?: () => void) => {\n clearTimeout(timer);\n conn.removeListener('frame', onFrame);\n conn.removeListener('close', onClose);\n if (next) next();\n };\n\n const onFrame = (data: Buffer) => {\n cleanup(() => resolve(data));\n };\n const onClose = (error?: Error) => {\n cleanup(() => reject(buildHandshakeCloseError('handshake frame', error)));\n };\n\n conn.once('frame', onFrame);\n conn.once('close', onClose);\n });\n}\n\nfunction waitForQueryAnswer(\n conn: CocoonConnection,\n queryId: bigint,\n timeoutMs: number,\n stage = 'query answer',\n): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(\n () => cleanup(() => reject(new ConnectionError(`Timeout waiting for ${stage}`))),\n timeoutMs,\n );\n\n const cleanup = (next?: () => void) => {\n clearTimeout(timer);\n conn.removeListener('frame', onFrame);\n conn.removeListener('close', onClose);\n if (next) next();\n };\n\n const onClose = (error?: Error) => {\n cleanup(() => reject(buildHandshakeCloseError(stage, error)));\n };\n\n const onFrame = (data: Buffer) => {\n let obj: Record<string, unknown>;\n try {\n obj = deserializeTLObject(data);\n } catch (err) {\n cleanup(() =>\n reject(new ProtocolError(`Failed to deserialize handshake frame: ${String(err)}`)),\n );\n return;\n }\n\n if (obj['_type'] === 'tcp.queryAnswer') {\n const answerId = obj['id'] as bigint;\n if (answerId === queryId) {\n cleanup(() => resolve(obj['data'] as Buffer));\n return;\n }\n } else if (obj['_type'] === 'tcp.queryError') {\n const errorId = obj['id'] as bigint;\n if (errorId === queryId) {\n cleanup(() =>\n reject(new ProtocolError(`Query error: ${obj['message']}`, obj['code'] as number)),\n );\n return;\n }\n }\n // Not our answer, keep listening.\n };\n\n conn.on('frame', onFrame);\n conn.once('close', onClose);\n });\n}\n\nexport { sendQuery, waitForFrame, waitForQueryAnswer };\n// Re-export for use in session\nvoid TL_SCHEMA; // ensure import is preserved\n","/**\n * Stream<T> — an async iterable wrapper for streaming responses.\n * Follows the OpenAI SDK pattern.\n */\n\nexport class Stream<T> implements AsyncIterable<T> {\n private controller: ReadableStreamDefaultController<T> | null = null;\n private stream: ReadableStream<T>;\n private _done = false;\n\n constructor() {\n this.stream = new ReadableStream<T>({\n start: (controller) => {\n this.controller = controller;\n },\n });\n }\n\n /**\n * Push a chunk into the stream.\n */\n push(chunk: T): void {\n if (this._done) return;\n this.controller?.enqueue(chunk);\n }\n\n /**\n * Signal that the stream is complete.\n */\n end(): void {\n if (this._done) return;\n this._done = true;\n this.controller?.close();\n }\n\n /**\n * Signal an error on the stream.\n */\n error(err: Error): void {\n if (this._done) return;\n this._done = true;\n this.controller?.error(err);\n }\n\n get done(): boolean {\n return this._done;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n const reader = this.stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","/**\n * Chat Completions resource — the main API for AI inference.\n *\n * Implements both non-streaming and streaming modes:\n * - Non-streaming: collects all queryAnswerPartEx + final queryAnswerEx,\n * parses the HTTP response body as JSON, returns ChatCompletion.\n * - Streaming: wraps parts in Stream<ChatCompletionChunk>, parses SSE from chunks.\n */\n\nimport type { CocoonSession } from '../../core/protocol/session.js';\nimport { buildHttpRequest } from '../../core/protocol/session.js';\nimport { deserializeTLObject } from '../../core/tl/deserializer.js';\nimport { Stream } from '../../core/streaming.js';\nimport { APIError, ProtocolError } from '../../core/error.js';\nimport type {\n ChatCompletionCreateParams,\n ChatCompletion,\n ChatCompletionChunk,\n} from '../../types/chat.js';\nimport type { HttpResponse } from '../../core/tl/types.js';\n\ntype SessionProvider = () => Promise<CocoonSession>;\n\nexport class Completions {\n constructor(private readonly getSession: SessionProvider) {}\n\n private extractHttpData(answer: Buffer): {\n payload: Buffer;\n statusCode?: number;\n reason?: string;\n } {\n try {\n const httpResponse = deserializeTLObject(answer) as unknown as HttpResponse;\n if (httpResponse._type === 'http.response') {\n return {\n payload: httpResponse.payload,\n statusCode: httpResponse.statusCode,\n reason: httpResponse.reason,\n };\n }\n } catch {\n // Not a boxed http.response TL object, treat as raw payload chunk.\n }\n return { payload: answer };\n }\n\n private parseErrorPayload(payload: Buffer, fallbackMessage: string): { message: string; body: unknown } {\n if (payload.length === 0) {\n return { message: fallbackMessage, body: { error: fallbackMessage } };\n }\n const text = payload.toString('utf-8');\n try {\n const parsed = JSON.parse(text) as Record<string, unknown>;\n const message =\n typeof parsed.message === 'string'\n ? parsed.message\n : typeof parsed.error === 'string'\n ? parsed.error\n : fallbackMessage;\n return { message, body: parsed };\n } catch {\n return { message: text || fallbackMessage, body: { error: text || fallbackMessage } };\n }\n }\n\n /**\n * Create a chat completion.\n *\n * @param params - OpenAI-compatible chat completion parameters\n * @returns ChatCompletion (non-streaming) or Stream<ChatCompletionChunk> (streaming)\n */\n async create(\n params: ChatCompletionCreateParams & { stream: true },\n ): Promise<Stream<ChatCompletionChunk>>;\n async create(params: ChatCompletionCreateParams & { stream?: false }): Promise<ChatCompletion>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | Stream<ChatCompletionChunk>>;\n async create(\n params: ChatCompletionCreateParams,\n ): Promise<ChatCompletion | Stream<ChatCompletionChunk>> {\n const session = await this.getSession();\n\n // Build the JSON body (OpenAI-compatible)\n const body = JSON.stringify({\n model: params.model,\n messages: params.messages,\n stream: params.stream ?? false,\n ...(params.temperature !== undefined && { temperature: params.temperature }),\n ...(params.top_p !== undefined && { top_p: params.top_p }),\n ...(params.max_tokens !== undefined && { max_tokens: params.max_tokens }),\n ...(params.max_completion_tokens !== undefined && {\n max_completion_tokens: params.max_completion_tokens,\n }),\n ...(params.stop !== undefined && { stop: params.stop }),\n ...(params.presence_penalty !== undefined && { presence_penalty: params.presence_penalty }),\n ...(params.frequency_penalty !== undefined && {\n frequency_penalty: params.frequency_penalty,\n }),\n });\n\n const httpRequest = buildHttpRequest(\n 'POST',\n '/v1/chat/completions',\n Buffer.from(body, 'utf-8'),\n );\n\n if (params.stream) {\n return this.createStreaming(session, params, httpRequest);\n }\n\n return this.createNonStreaming(session, params, httpRequest);\n }\n\n private async createNonStreaming(\n session: CocoonSession,\n params: ChatCompletionCreateParams,\n httpRequest: import('../../core/tl/types.js').HttpRequest,\n ): Promise<ChatCompletion> {\n const chunks: Buffer[] = [];\n let sawAnswer = false;\n let statusCode: number | undefined;\n let statusReason: string | undefined;\n\n const finalAnswer = await session.sendQuery(params.model, httpRequest, {\n maxCoefficient: params.max_coefficient,\n maxTokens: params.max_tokens ?? params.max_completion_tokens,\n timeout: params.timeout,\n onPart: (part) => {\n if (!('answer' in part) || !part.answer) {\n return;\n }\n sawAnswer = true;\n const extracted = this.extractHttpData(part.answer as Buffer);\n if (extracted.statusCode !== undefined) {\n statusCode = extracted.statusCode;\n statusReason = extracted.reason;\n }\n if (extracted.payload.length > 0) {\n chunks.push(extracted.payload);\n }\n },\n });\n\n if (finalAnswer._type === 'client.queryAnswerErrorEx') {\n throw new APIError(finalAnswer.error, 500, {\n error_code: finalAnswer.errorCode,\n error: finalAnswer.error,\n });\n }\n\n // Safety fallback in case caller didn't receive chunk callbacks.\n if (!sawAnswer && 'answer' in finalAnswer && finalAnswer.answer) {\n const extracted = this.extractHttpData(finalAnswer.answer as Buffer);\n if (extracted.statusCode !== undefined) {\n statusCode = extracted.statusCode;\n statusReason = extracted.reason;\n }\n if (extracted.payload.length > 0) {\n chunks.push(extracted.payload);\n }\n }\n\n const fullPayload = Buffer.concat(chunks);\n if (statusCode !== undefined && statusCode >= 400) {\n const fallback = statusReason ? `${statusCode} ${statusReason}` : `HTTP ${statusCode}`;\n const parsed = this.parseErrorPayload(fullPayload, fallback);\n throw new APIError(parsed.message, statusCode, parsed.body);\n }\n if (fullPayload.length === 0) {\n throw new ProtocolError('Empty response from proxy');\n }\n\n try {\n return JSON.parse(fullPayload.toString('utf-8')) as ChatCompletion;\n } catch (error) {\n throw new ProtocolError(\n `Failed to parse completion payload as JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n private async createStreaming(\n session: CocoonSession,\n params: ChatCompletionCreateParams,\n httpRequest: import('../../core/tl/types.js').HttpRequest,\n ): Promise<Stream<ChatCompletionChunk>> {\n const stream = new Stream<ChatCompletionChunk>();\n let sseBuffer = '';\n let headersParsed = false;\n let statusCode: number | undefined;\n let statusReason: string | undefined;\n const errorChunks: Buffer[] = [];\n\n // Process streaming in background\n session\n .sendQuery(params.model, httpRequest, {\n maxCoefficient: params.max_coefficient,\n maxTokens: params.max_tokens ?? params.max_completion_tokens,\n timeout: params.timeout,\n onPart: (part) => {\n try {\n let rawData: Buffer | undefined;\n\n if ('answer' in part && part.answer) {\n const answer = part.answer as Buffer;\n\n if (!headersParsed) {\n // First chunk may contain HTTP response headers as TL object\n try {\n const httpResponse = deserializeTLObject(answer) as unknown as HttpResponse;\n if (httpResponse._type === 'http.response') {\n headersParsed = true;\n statusCode = httpResponse.statusCode;\n statusReason = httpResponse.reason;\n rawData = httpResponse.payload;\n } else {\n rawData = answer;\n }\n } catch {\n // Not a TL object, raw SSE data\n rawData = answer;\n headersParsed = true;\n }\n } else {\n rawData = answer;\n }\n }\n\n if (rawData && rawData.length > 0) {\n if (statusCode !== undefined && statusCode >= 400) {\n errorChunks.push(rawData);\n return;\n }\n sseBuffer += rawData.toString('utf-8');\n this.processSSEBuffer(sseBuffer, stream);\n // Keep unprocessed remainder\n const lastNewline = sseBuffer.lastIndexOf('\\n');\n if (lastNewline >= 0) {\n sseBuffer = sseBuffer.substring(lastNewline + 1);\n }\n }\n } catch (e) {\n stream.error(e instanceof Error ? e : new Error(String(e)));\n }\n },\n })\n .then(() => {\n if (statusCode !== undefined && statusCode >= 400) {\n const parsed = this.parseErrorPayload(\n Buffer.concat(errorChunks),\n statusReason ? `${statusCode} ${statusReason}` : `HTTP ${statusCode}`,\n );\n stream.error(new APIError(parsed.message, statusCode, parsed.body));\n return;\n }\n\n // Process any remaining buffer\n if (sseBuffer.trim().length > 0) {\n this.processSSEBuffer(sseBuffer + '\\n', stream);\n }\n stream.end();\n })\n .catch((err) => {\n stream.error(err instanceof Error ? err : new Error(String(err)));\n });\n\n return stream;\n }\n\n private processSSEBuffer(buffer: string, stream: Stream<ChatCompletionChunk>): void {\n const lines = buffer.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed === '') continue;\n if (trimmed === 'data: [DONE]') continue;\n\n if (trimmed.startsWith('data: ')) {\n const jsonStr = trimmed.substring(6);\n try {\n const chunk = JSON.parse(jsonStr) as ChatCompletionChunk;\n stream.push(chunk);\n } catch {\n // Partial JSON, will be completed in next chunk\n }\n }\n }\n }\n}\n","/**\n * Models resource — list available AI models on the network.\n *\n * Uses client.getWorkerTypesV2 TL function to query the proxy.\n */\n\nimport type { CocoonSession } from '../../core/protocol/session.js';\nimport type { ClientWorkerTypesV2 } from '../../core/tl/types.js';\nimport type { Model, ModelList } from '../../types/models.js';\n\ntype SessionProvider = () => Promise<CocoonSession>;\n\nexport class Models {\n constructor(private readonly getSession: SessionProvider) {}\n\n /**\n * List all available models on the network.\n */\n async list(): Promise<ModelList> {\n const session = await this.getSession();\n\n const result = await session.sendRpcQuery({\n _type: 'client.getWorkerTypesV2',\n });\n\n const workerTypes = result as unknown as ClientWorkerTypesV2;\n\n const models: Model[] = workerTypes.types.map((wt) => {\n const totalWorkers = wt.workers.length;\n const coefficients = wt.workers.map((w) => w.coefficient);\n const minCoeff = coefficients.length > 0 ? Math.min(...coefficients) : 0;\n const maxCoeff = coefficients.length > 0 ? Math.max(...coefficients) : 0;\n\n return {\n id: wt.name,\n object: 'model' as const,\n created: Math.floor(Date.now() / 1000),\n owned_by: 'cocoon',\n active_workers: totalWorkers,\n coefficient_min: minCoeff,\n coefficient_max: maxCoeff,\n };\n });\n\n return {\n object: 'list',\n data: models,\n };\n }\n}\n","/**\n * Mnemonic wallet for Cocoon.\n *\n * Converts a 24-word mnemonic into a keypair and wallet address.\n * Uses @ton/crypto for key derivation and @ton/ton for wallet contract.\n */\n\nimport { mnemonicToPrivateKey } from '@ton/crypto';\nimport { WalletContractV4, TonClient, TonClient4 } from '@ton/ton';\nimport { Address, type Sender } from '@ton/core';\nimport crypto from 'node:crypto';\n\nexport interface WalletInfo {\n address: Address;\n publicKey: Buffer;\n secretKey: Buffer;\n}\n\nexport class MnemonicWallet {\n private mnemonic: string[];\n private keyPair: { publicKey: Buffer; secretKey: Buffer } | null = null;\n private wallet: WalletContractV4 | null = null;\n private _address: Address | null = null;\n private tonClient: TonClient | null = null;\n private tonClient4: TonClient4 | null = null;\n\n constructor(\n mnemonic: string,\n network: 'mainnet' | 'testnet' = 'mainnet',\n options?: { tonEndpoint?: string; tonV4Endpoint?: string },\n ) {\n this.mnemonic = mnemonic.trim().split(/\\s+/);\n if (this.mnemonic.length !== 24) {\n throw new Error(`Expected 24 mnemonic words, got ${this.mnemonic.length}`);\n }\n this.network = network;\n this.tonEndpoint = options?.tonEndpoint;\n this.tonV4Endpoint = options?.tonV4Endpoint;\n }\n\n private readonly network: 'mainnet' | 'testnet';\n private readonly tonEndpoint?: string;\n private readonly tonV4Endpoint?: string;\n\n async init(): Promise<void> {\n if (this.keyPair) return;\n\n this.keyPair = await mnemonicToPrivateKey(this.mnemonic);\n\n this.wallet = WalletContractV4.create({\n workchain: 0,\n publicKey: this.keyPair.publicKey,\n });\n\n this._address = this.wallet.address;\n }\n\n get address(): Address {\n if (!this._address) throw new Error('Wallet not initialized. Call init() first.');\n return this._address;\n }\n\n get addressString(): string {\n return this.address.toString({ bounceable: true, testOnly: this.network === 'testnet' });\n }\n\n get publicKey(): Buffer {\n if (!this.keyPair) throw new Error('Wallet not initialized. Call init() first.');\n return this.keyPair.publicKey;\n }\n\n get secretKey(): Buffer {\n if (!this.keyPair) throw new Error('Wallet not initialized. Call init() first.');\n return this.keyPair.secretKey;\n }\n\n /**\n * Compute SHA-256 hash of a secret string (for short auth).\n */\n secretHash(secret: string): Buffer {\n return crypto.createHash('sha256').update(secret).digest();\n }\n\n /**\n * Get or create a TonClient for blockchain queries.\n */\n getTonClient(): TonClient {\n if (!this.tonClient) {\n const endpoint =\n this.tonEndpoint ??\n (this.network === 'mainnet'\n ? 'https://toncenter.com/api/v2/jsonRPC'\n : 'https://testnet.toncenter.com/api/v2/jsonRPC');\n\n this.tonClient = new TonClient({ endpoint });\n }\n return this.tonClient;\n }\n\n /**\n * Get or create a TonClient4 for sending transactions via v4 HTTP API.\n */\n getTonClient4(): TonClient4 {\n if (!this.tonClient4) {\n const endpoint =\n this.tonV4Endpoint ??\n (this.network === 'mainnet'\n ? 'https://mainnet-v4.tonhubapi.com'\n : 'https://testnet-v4.tonhubapi.com');\n this.tonClient4 = new TonClient4({ endpoint });\n }\n return this.tonClient4;\n }\n\n /**\n * Create a sender for sending transactions.\n */\n async createSender(): Promise<Sender> {\n if (!this.wallet || !this.keyPair) {\n throw new Error('Wallet not initialized');\n }\n\n const client = this.getTonClient4();\n const contract = client.open(this.wallet);\n\n return contract.sender(this.keyPair.secretKey);\n }\n}\n","/**\n * Proxy discovery via TON Root Contract.\n *\n * Queries the Root Contract to get the list of registered proxies,\n * then parses the addresses for client connections.\n */\n\nimport { Address, TonClient } from '@ton/ton';\nimport { CocoonRoot, type RootParams, type ProxyInfo } from './contracts/root.js';\n\nexport interface DiscoveryOptions {\n network: 'mainnet' | 'testnet';\n rootContractAddress?: string;\n tonApiEndpoint?: string;\n}\n\n// Known root contract addresses\nconst ROOT_CONTRACTS: Record<string, string> = {\n mainnet: 'EQCns7bYSp0igFvS1wpb5wsZjCKCV19MD5AVzI4EyxsnU73k',\n testnet: 'EQBT4hy4vMEZ9uxSCuhw_gBKh9_AwmHXLe7Wo0O4Vh-4kRjJ',\n};\n\nexport class ProxyDiscovery {\n private tonClient: TonClient;\n private rootAddress: Address;\n private cachedParams: RootParams | null = null;\n private cacheTime = 0;\n private readonly cacheTtl = 60_000; // 1 minute\n\n constructor(options: DiscoveryOptions) {\n const endpoint =\n options.tonApiEndpoint ??\n (options.network === 'mainnet'\n ? 'https://toncenter.com/api/v2/jsonRPC'\n : 'https://testnet.toncenter.com/api/v2/jsonRPC');\n\n this.tonClient = new TonClient({ endpoint });\n\n const addr = options.rootContractAddress ?? ROOT_CONTRACTS[options.network];\n if (!addr) {\n throw new Error(`No root contract address for network: ${options.network}`);\n }\n this.rootAddress = Address.parse(addr);\n }\n\n /**\n * Get all registered proxies from the root contract.\n */\n async getProxies(): Promise<ProxyInfo[]> {\n const params = await this.getRootParams();\n return params.registeredProxies;\n }\n\n /**\n * Get a random proxy for connection.\n */\n async getRandomProxy(): Promise<ProxyInfo> {\n const proxies = await this.getProxies();\n if (proxies.length === 0) {\n throw new Error('No proxies available in the network');\n }\n const idx = Math.floor(Math.random() * proxies.length);\n return proxies[idx]!;\n }\n\n /**\n * Get root contract parameters (cached).\n */\n async getRootParams(): Promise<RootParams> {\n const now = Date.now();\n if (this.cachedParams && now - this.cacheTime < this.cacheTtl) {\n return this.cachedParams;\n }\n\n const root = new CocoonRoot(this.tonClient, this.rootAddress);\n const result = await root.getAllParams();\n if (!result) {\n throw new Error('Root contract is not initialized');\n }\n this.cachedParams = result;\n this.cacheTime = now;\n return this.cachedParams;\n }\n}\n","/**\n * CocoonRoot smart contract wrapper.\n *\n * Reads the root contract raw state to get network configuration:\n * - List of registered proxies with their addresses\n * - Supported worker/proxy/model hashes\n * - Pricing parameters\n *\n * On-chain cell layout (from official cocoon-contracts wrapper):\n * top-level:\n * ownerAddress:address version:uint32 ref(data) ref(params)\n * data ref:\n * proxyHashes:dict registeredProxies:dict lastProxySeqno:uint32\n * workerHashes:dict modelHashes:dict\n * params ref:\n * structVersion:uint8 paramsVersion:uint32 uniqueId:uint32 isTest:bit\n * pricePerToken:coins workerFeePerToken:coins ...multipliers...\n * delays minStakes ref(proxyScCode) ref(workerScCode) ref(clientScCode)\n */\n\nimport { Address, Cell, Dictionary, Slice, TonClient, beginCell } from '@ton/ton';\n\nexport interface ProxyInfo {\n seqno: number;\n /** Proxy address, typically \"host:workerPort host:clientPort\" */\n address: string;\n}\n\nexport interface CocoonParams {\n structVersion: number;\n paramsVersion: number;\n uniqueId: number;\n isTest: boolean;\n pricePerToken: bigint;\n workerFeePerToken: bigint;\n promptTokensPriceMultiplier: number;\n cachedTokensPriceMultiplier: number;\n completionTokensPriceMultiplier: number;\n reasoningTokensPriceMultiplier: number;\n proxyDelayBeforeClose: number;\n clientDelayBeforeClose: number;\n minProxyStake: bigint;\n minClientStake: bigint;\n}\n\nexport interface RootContractCodes {\n proxyScCode: Cell | null;\n workerScCode: Cell | null;\n clientScCode: Cell | null;\n}\n\nexport interface RootParams {\n ownerAddress: Address;\n registeredProxies: ProxyInfo[];\n lastProxySeqno: number;\n version: number;\n params: CocoonParams;\n codes: RootContractCodes;\n}\n\n/**\n * Build the client params cell as RootContractConfig::serialize_client_params_cell(0).\n * This is needed for client_sc deployment state-init.\n */\nexport function buildClientParamsCell(params: CocoonParams): Cell {\n const b = beginCell()\n .storeUint(params.structVersion, 8)\n .storeUint(params.paramsVersion, 32)\n .storeUint(params.uniqueId, 32)\n .storeBit(params.isTest)\n .storeCoins(params.pricePerToken)\n .storeCoins(params.workerFeePerToken);\n\n if (params.structVersion >= 2) {\n if (params.structVersion >= 3) {\n b.storeUint(params.promptTokensPriceMultiplier, 32);\n }\n b.storeUint(params.cachedTokensPriceMultiplier, 32);\n if (params.structVersion >= 3) {\n b.storeUint(params.completionTokensPriceMultiplier, 32);\n }\n b.storeUint(params.reasoningTokensPriceMultiplier, 32);\n }\n\n b.storeUint(params.proxyDelayBeforeClose, 32);\n b.storeUint(params.clientDelayBeforeClose, 32);\n\n if (params.structVersion >= 1) {\n b.storeCoins(params.minProxyStake);\n b.storeCoins(params.minClientStake);\n }\n\n // serialize_client_params_cell(0): no code refs included.\n b.storeMaybeRef(null).storeMaybeRef(null).storeMaybeRef(null);\n return b.endCell();\n}\n\n/** Value codec for the registered_proxies dictionary (Uint32 → ProxyInfo). */\nfunction proxyInfoValue() {\n return {\n serialize: () => {\n throw new Error('ProxyInfo serialization not needed for read-only usage');\n },\n parse: (src: Slice) => {\n src.loadBit(); // type bit (always 0)\n const strlen = src.loadUint(7);\n const buf = src.loadBuffer(strlen);\n return { addr: buf.toString('utf-8') };\n },\n };\n}\n\nexport class CocoonRoot {\n constructor(\n private readonly client: TonClient,\n private readonly address: Address,\n ) {}\n\n /**\n * Get all parameters by reading the raw contract state and parsing the Cell.\n * Returns null if the contract is not initialized.\n */\n async getAllParams(): Promise<RootParams | null> {\n const state = await this.client.getContractState(this.address);\n\n if (!state.data) {\n return null;\n }\n\n const cell = Cell.fromBoc(Buffer.from(state.data))[0]!;\n const cs = cell.beginParse();\n\n // Top-level: ownerAddress + version + ref(data) + ref(params)\n const ownerAddress = cs.loadAddress();\n const version = cs.loadUint(32);\n\n // Data ref: proxyHashes, registeredProxies, lastProxySeqno, workerHashes, modelHashes\n const data = cs.loadRef().beginParse();\n\n // Skip proxyHashes dict (inline maybe-ref)\n if (data.loadBit()) data.loadRef();\n\n // registeredProxies dict (inline maybe-ref)\n const proxiesDict = data.loadDict<number, { addr: string }>(\n Dictionary.Keys.Uint(32),\n proxyInfoValue(),\n );\n\n const lastProxySeqno = data.loadUint(32);\n\n // Skip workerHashes and modelHashes\n if (data.loadBit()) data.loadRef();\n if (data.loadBit()) data.loadRef();\n\n // Params ref\n const pcs = cs.loadRef().beginParse();\n\n const structVersion = pcs.loadUint(8);\n const paramsVersion = pcs.loadUint(32);\n const uniqueId = pcs.loadUint(32);\n const isTest = pcs.loadBit();\n const pricePerToken = pcs.loadCoins();\n const workerFeePerToken = pcs.loadCoins();\n\n let promptTokensPriceMultiplier = 10000;\n if (structVersion >= 3) {\n promptTokensPriceMultiplier = pcs.loadUint(32);\n }\n let cachedTokensPriceMultiplier = 10000;\n if (structVersion >= 2) {\n cachedTokensPriceMultiplier = pcs.loadUint(32);\n }\n let completionTokensPriceMultiplier = 10000;\n if (structVersion >= 3) {\n completionTokensPriceMultiplier = pcs.loadUint(32);\n }\n let reasoningTokensPriceMultiplier = 10000;\n if (structVersion >= 2) {\n reasoningTokensPriceMultiplier = pcs.loadUint(32);\n }\n\n const proxyDelayBeforeClose = pcs.loadUint(32);\n const clientDelayBeforeClose = pcs.loadUint(32);\n\n let minProxyStake = 1000000000n; // 1 TON default\n let minClientStake = 1000000000n;\n if (structVersion >= 1) {\n minProxyStake = pcs.loadCoins();\n minClientStake = pcs.loadCoins();\n }\n\n const proxyScCode = pcs.loadMaybeRef();\n const workerScCode = pcs.loadMaybeRef();\n const clientScCode = pcs.loadMaybeRef();\n\n // Convert proxies dict to array\n const registeredProxies: ProxyInfo[] = [];\n if (proxiesDict) {\n for (const [seqno, info] of proxiesDict) {\n registeredProxies.push({ seqno, address: info.addr });\n }\n }\n\n return {\n ownerAddress,\n registeredProxies,\n lastProxySeqno,\n version,\n params: {\n structVersion,\n paramsVersion,\n uniqueId,\n isTest,\n pricePerToken,\n workerFeePerToken,\n promptTokensPriceMultiplier,\n cachedTokensPriceMultiplier,\n completionTokensPriceMultiplier,\n reasoningTokensPriceMultiplier,\n proxyDelayBeforeClose,\n clientDelayBeforeClose,\n minProxyStake,\n minClientStake,\n },\n codes: {\n proxyScCode,\n workerScCode,\n clientScCode,\n },\n };\n }\n}\n","/**\n * CocoonClient smart contract wrapper.\n *\n * Handles client registration with a proxy and balance management.\n * The client contract is deployed per client-proxy pair.\n */\n\nimport { Address, beginCell, type Cell, toNano } from '@ton/ton';\nimport type { Sender, StateInit } from '@ton/core';\n\n// Opcodes from the Cocoon smart contracts\nconst OPCODES = {\n ownerClientRegister: 0xc45f9f3b,\n ownerClientChangeSecretHash: 0xa9357034,\n extClientTopUp: 0xf172e6c2,\n} as const;\n\nexport class CocoonClientContract {\n constructor(private readonly address: Address) {}\n\n /**\n * Create a registration message body for the proxy.\n * This is sent to the client smart contract to register with a proxy.\n */\n static createRegisterBody(\n nonce: bigint,\n sendExcessesTo: Address,\n queryId = 0n,\n ): Cell {\n const nonceU64 = BigInt.asUintN(64, nonce);\n const queryIdU64 = BigInt.asUintN(64, queryId);\n return beginCell()\n .storeUint(OPCODES.ownerClientRegister, 32)\n .storeUint(queryIdU64, 64)\n .storeUint(nonceU64, 64)\n .storeAddress(sendExcessesTo)\n .endCell();\n }\n\n /**\n * Create a message body to change the secret hash.\n */\n static createChangeSecretHashBody(\n secretHash: Buffer,\n sendExcessesTo: Address,\n queryId = 0n,\n ): Cell {\n const queryIdU64 = BigInt.asUintN(64, queryId);\n return beginCell()\n .storeUint(OPCODES.ownerClientChangeSecretHash, 32)\n .storeUint(queryIdU64, 64)\n .storeBuffer(secretHash, 32)\n .storeAddress(sendExcessesTo)\n .endCell();\n }\n\n /**\n * Create a top-up message body.\n */\n static createTopUpBody(coins: bigint, sendExcessesTo: Address, queryId = 0n): Cell {\n const queryIdU64 = BigInt.asUintN(64, queryId);\n return beginCell()\n .storeUint(OPCODES.extClientTopUp, 32)\n .storeUint(queryIdU64, 64)\n .storeCoins(coins)\n .storeAddress(sendExcessesTo)\n .endCell();\n }\n\n /**\n * Build client_sc data cell for deployment.\n * Mirrors ClientContract::init_data_cell in upstream C++ code.\n */\n static createDeployDataCell(\n ownerAddress: Address,\n proxyScAddress: Address,\n proxyPublicKey: Buffer,\n minClientStake: bigint,\n clientParamsCell: Cell,\n ): Cell {\n if (proxyPublicKey.length !== 32) {\n throw new Error(`proxyPublicKey must be 32 bytes, got ${proxyPublicKey.length}`);\n }\n\n const configDataRef = beginCell()\n .storeAddress(ownerAddress)\n .storeAddress(proxyScAddress)\n .storeBuffer(proxyPublicKey, 32)\n .endCell();\n\n return beginCell()\n .storeUint(0, 2) // state\n .storeCoins(0n) // balance\n .storeCoins(minClientStake) // stake\n .storeInt(0n, 64) // tokens_used\n .storeInt(0, 32) // unlock_ts\n .storeBuffer(Buffer.alloc(32), 32) // secret_hash\n .storeRef(configDataRef)\n .storeRef(clientParamsCell)\n .endCell();\n }\n\n static createStateInit(clientCode: Cell, dataCell: Cell): StateInit {\n return {\n code: clientCode,\n data: dataCell,\n };\n }\n\n /**\n * Send a registration transaction to the client contract.\n */\n async register(\n sender: Sender,\n ownerAddress: Address,\n nonce: bigint,\n amount = toNano('1'),\n init?: StateInit,\n ): Promise<void> {\n const body = CocoonClientContract.createRegisterBody(nonce, ownerAddress);\n const message: {\n to: Address;\n value: bigint;\n body: Cell;\n init?: StateInit;\n } = {\n to: this.address,\n value: amount,\n body,\n };\n if (init) {\n message.init = init;\n }\n await sender.send(message);\n }\n\n /**\n * Top up the client contract balance.\n */\n async topUp(sender: Sender, ownerAddress: Address, amount: bigint): Promise<void> {\n const body = CocoonClientContract.createTopUpBody(amount, ownerAddress);\n await sender.send({\n to: this.address,\n value: amount + toNano('0.7'),\n body,\n });\n }\n\n /**\n * Change the secret hash for short auth.\n */\n async changeSecretHash(\n sender: Sender,\n ownerAddress: Address,\n secretHash: Buffer,\n amount = toNano('0.7'),\n ): Promise<void> {\n const body = CocoonClientContract.createChangeSecretHashBody(secretHash, ownerAddress);\n await sender.send({\n to: this.address,\n value: amount,\n body,\n });\n }\n}\n","/**\n * Cocoon SDK Client — the main entry point.\n *\n * Usage:\n * const client = new Cocoon({\n * wallet: '24 word mnemonic...',\n * network: 'mainnet',\n * });\n *\n * const response = await client.chat.completions.create({\n * model: 'deepseek-r1',\n * messages: [{ role: 'user', content: 'Hello!' }],\n * });\n */\n\nimport { Completions } from './resources/chat/completions.js';\nimport { Models } from './resources/models/models.js';\nimport { MnemonicWallet } from './ton/wallet.js';\nimport { ProxyDiscovery } from './ton/discovery.js';\nimport { CocoonClientContract } from './ton/contracts/client-contract.js';\nimport { buildClientParamsCell } from './ton/contracts/root.js';\nimport { CocoonSession, type SessionOptions } from './core/protocol/session.js';\nimport { ConnectionError } from './core/error.js';\nimport type {\n AttestationProvider,\n AttestationContext,\n} from './core/protocol/attestation.js';\nimport crypto from 'node:crypto';\nimport { Address, toNano } from '@ton/ton';\nimport { contractAddress } from '@ton/core';\n\nexport interface CocoonOptions {\n /** 24-word mnemonic phrase */\n wallet: string;\n /** Network: mainnet or testnet. Default: mainnet */\n network?: 'mainnet' | 'testnet';\n /** Direct proxy URL (bypasses discovery). Format: host:port */\n proxyUrl?: string;\n /** Request timeout in ms. Default: 120000 */\n timeout?: number;\n /** Optional TON JSON-RPC endpoint for on-chain operations (registration, wallet tx). */\n tonEndpoint?: string;\n /** Optional TON v4 endpoint used for wallet transaction sending. */\n tonV4Endpoint?: string;\n /** Secret string for short auth. Auto-generated if not provided. */\n secretString?: string;\n /** Use TLS for proxy connection. Default: true */\n useTls?: boolean;\n /** PEM-encoded TLS client certificate for RA-TLS / mTLS authentication */\n tlsCert?: string | Buffer;\n /** PEM-encoded TLS client private key for RA-TLS / mTLS authentication */\n tlsKey?: string | Buffer;\n /** Dynamic provider for RA-TLS credentials (e.g. sidecar, file rotation). */\n attestationProvider?: AttestationProvider;\n /**\n * If true, automatically perform on-chain long-auth registration when proxy requests it.\n * This sends a TON transaction from the mnemonic wallet.\n * Default: true\n */\n autoRegisterOnLongAuth?: boolean;\n /** Amount in TON to attach to auto long-auth registration tx. Default: \"1\" */\n longAuthRegisterAmountTon?: string;\n}\n\nexport class Cocoon {\n readonly chat: { completions: Completions };\n readonly models: Models;\n\n private readonly mnemonicWallet: MnemonicWallet;\n private readonly discovery: ProxyDiscovery | null;\n private session: CocoonSession | null = null;\n private connecting: Promise<CocoonSession> | null = null;\n\n private readonly options: Required<Pick<CocoonOptions, 'network' | 'timeout' | 'useTls'>> &\n Required<Pick<CocoonOptions, 'autoRegisterOnLongAuth' | 'longAuthRegisterAmountTon'>> &\n CocoonOptions;\n\n constructor(options: CocoonOptions) {\n if ((options.tlsCert && !options.tlsKey) || (!options.tlsCert && options.tlsKey)) {\n throw new ConnectionError(\n 'Both tlsCert and tlsKey must be provided together for mTLS',\n );\n }\n if (options.attestationProvider && (options.tlsCert || options.tlsKey)) {\n throw new ConnectionError(\n 'Use either attestationProvider or tlsCert/tlsKey, not both',\n );\n }\n\n this.options = {\n network: 'mainnet',\n timeout: 120_000,\n useTls: true,\n // Safety-first default for SDK consumers: don't submit on-chain tx implicitly.\n autoRegisterOnLongAuth: false,\n longAuthRegisterAmountTon: '1',\n ...options,\n };\n\n this.mnemonicWallet = new MnemonicWallet(options.wallet, this.options.network, {\n tonEndpoint: this.options.tonEndpoint,\n tonV4Endpoint: this.options.tonV4Endpoint,\n });\n\n // Set up discovery unless a direct proxyUrl is given\n if (!options.proxyUrl) {\n this.discovery = new ProxyDiscovery({ network: this.options.network });\n } else {\n this.discovery = null;\n }\n\n // Create resource namespaces with lazy session provider\n const getSession = () => this.ensureSession();\n this.chat = { completions: new Completions(getSession) };\n this.models = new Models(getSession);\n }\n\n /**\n * Explicitly connect to a proxy. Called lazily on first API call if not called manually.\n */\n async connect(): Promise<void> {\n await this.ensureSession();\n }\n\n /**\n * Disconnect from the proxy.\n */\n async disconnect(): Promise<void> {\n if (this.session) {\n await this.session.disconnect();\n this.session = null;\n }\n this.connecting = null;\n }\n\n private async ensureSession(): Promise<CocoonSession> {\n if (this.session?.connected) {\n return this.session;\n }\n\n // Prevent concurrent connect attempts\n if (this.connecting) {\n return this.connecting;\n }\n\n this.connecting = this.createSession();\n try {\n this.session = await this.connecting;\n return this.session;\n } finally {\n this.connecting = null;\n }\n }\n\n private async createSession(): Promise<CocoonSession> {\n // Initialize wallet\n await this.mnemonicWallet.init();\n\n // Determine proxy address\n let host: string;\n let port: number;\n\n if (this.options.proxyUrl) {\n const parts = this.options.proxyUrl.split(':');\n host = parts.slice(0, -1).join(':');\n port = parseInt(parts[parts.length - 1]!, 10);\n if (!host || isNaN(port)) {\n throw new ConnectionError(`Invalid proxyUrl: ${this.options.proxyUrl}`);\n }\n } else if (this.discovery) {\n const proxy = await this.discovery.getRandomProxy();\n // Proxy address format: \"host:workerPort host:clientPort\"\n // We need the client port (second entry)\n const entries = proxy.address.trim().split(/\\s+/);\n const clientEntry = entries.length > 1 ? entries[1]! : entries[0]!;\n const lastColon = clientEntry.lastIndexOf(':');\n host = clientEntry.substring(0, lastColon);\n port = parseInt(clientEntry.substring(lastColon + 1), 10);\n if (!host || isNaN(port)) {\n throw new ConnectionError(`Invalid proxy address from discovery: ${proxy.address}`);\n }\n } else {\n throw new ConnectionError('No proxy URL or discovery available');\n }\n\n // Resolve TLS credentials (static or via provider).\n let tlsCert = this.options.tlsCert;\n let tlsKey = this.options.tlsKey;\n\n if (this.options.attestationProvider) {\n const context: AttestationContext = {\n host,\n port,\n network: this.options.network,\n };\n const credentials = await this.options.attestationProvider.getClientTlsCredentials(context);\n tlsCert = credentials.cert;\n tlsKey = credentials.key;\n }\n\n if ((tlsCert && !tlsKey) || (!tlsCert && tlsKey)) {\n throw new ConnectionError('Attestation provider returned incomplete TLS credentials');\n }\n\n // Generate or use secret string\n const secretString = this.options.secretString ?? crypto.randomBytes(32).toString('hex');\n\n const onLongAuthRequired = this.options.autoRegisterOnLongAuth\n ? async (context: {\n nonce: bigint;\n clientScAddress: string;\n proxyParams: {\n proxyScAddress: string;\n proxyPublicKey: Buffer;\n };\n }): Promise<void> => {\n try {\n const sender = await this.mnemonicWallet.createSender();\n const clientScAddress = Address.parse(context.clientScAddress);\n const clientContract = new CocoonClientContract(clientScAddress);\n\n const v4Client = this.mnemonicWallet.getTonClient4();\n const last = await v4Client.getLastBlock();\n const account = await v4Client.getAccount(last.last.seqno, clientScAddress);\n\n let init;\n if (account.account.state.type !== 'active') {\n const discovery =\n this.discovery ??\n new ProxyDiscovery({\n network: this.options.network,\n tonApiEndpoint: this.options.tonEndpoint,\n });\n const rootParams = await discovery.getRootParams();\n const clientCode = rootParams.codes.clientScCode;\n if (!clientCode) {\n throw new Error(\n 'Root contract does not contain client_sc_code; cannot deploy client contract',\n );\n }\n const clientParamsCell = buildClientParamsCell(rootParams.params);\n const dataCell = CocoonClientContract.createDeployDataCell(\n this.mnemonicWallet.address,\n Address.parse(context.proxyParams.proxyScAddress),\n context.proxyParams.proxyPublicKey,\n rootParams.params.minClientStake,\n clientParamsCell,\n );\n init = CocoonClientContract.createStateInit(clientCode, dataCell);\n\n const expectedAddress = contractAddress(0, init);\n if (!expectedAddress.equals(clientScAddress)) {\n throw new Error(\n `Computed client_sc mismatch: expected ${context.clientScAddress}, got ${expectedAddress.toString({ bounceable: true, testOnly: this.options.network === 'testnet' })}`,\n );\n }\n }\n\n await clientContract.register(\n sender,\n this.mnemonicWallet.address,\n context.nonce,\n toNano(this.options.longAuthRegisterAmountTon),\n init,\n );\n } catch (err) {\n throw new ConnectionError(\n `Auto long-auth registration failed: ${\n err instanceof Error ? err.message : String(err)\n }. Configure tonEndpoint / wallet balance or provide a valid SECRET`,\n err instanceof Error ? err : undefined,\n );\n }\n }\n : undefined;\n\n const sessionOptions: SessionOptions = {\n host,\n port,\n useTls: this.options.useTls,\n timeout: this.options.timeout,\n ownerAddress: this.mnemonicWallet.addressString,\n secretString,\n tlsCert,\n tlsKey,\n onLongAuthRequired,\n };\n\n const session = new CocoonSession(sessionOptions);\n await session.connect();\n\n // Handle session close\n session.on('close', () => {\n if (this.session === session) {\n this.session = null;\n }\n });\n\n return session;\n }\n}\n","import { readFile } from 'node:fs/promises';\n\nexport interface ClientTlsCredentials {\n cert: string | Buffer;\n key: string | Buffer;\n}\n\nexport interface AttestationContext {\n host: string;\n port: number;\n network: 'mainnet' | 'testnet';\n}\n\n/**\n * Provides RA-TLS client credentials (certificate + private key) for mTLS.\n * Implementations may load static values, files, or fetch from sidecars.\n */\nexport interface AttestationProvider {\n getClientTlsCredentials(context: AttestationContext): Promise<ClientTlsCredentials>;\n}\n\n/**\n * Uses already available in-memory credentials.\n */\nexport class StaticAttestationProvider implements AttestationProvider {\n constructor(private readonly credentials: ClientTlsCredentials) {}\n\n async getClientTlsCredentials(): Promise<ClientTlsCredentials> {\n return this.credentials;\n }\n}\n\n/**\n * Loads credentials from PEM files on each call.\n * Useful when credentials are rotated externally.\n */\nexport class FileAttestationProvider implements AttestationProvider {\n constructor(\n private readonly certPath: string,\n private readonly keyPath: string,\n ) {}\n\n async getClientTlsCredentials(): Promise<ClientTlsCredentials> {\n const [cert, key] = await Promise.all([\n readFile(this.certPath),\n readFile(this.keyPath),\n ]);\n return { cert, key };\n }\n}\n"],"mappings":"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","names":["import_node_crypto","import_node_events","crypto","VECTOR_ID","BOOL_TRUE_ID","BOOL_FALSE_ID","import_node_crypto","crypto","crypto","import_node_crypto","crypto","import_ton","import_ton","import_ton","import_node_crypto","import_ton","crypto"]}