@ceki/sdk 1.12.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -8
- package/dist/cli.js +956 -116
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +425 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +167 -5
- package/dist/index.d.ts +167 -5
- package/dist/index.js +414 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/client.ts","../src/config.ts","../src/errors.ts","../src/browser.ts","../src/chat.ts","../src/profile.ts","../src/state.ts","../src/humanize/keymap.ts","../src/humanize/humanizer.ts","../src/humanize/profile.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { connect } from './client.js';\nimport {\n CekiBrowserError,\n AuthError,\n CaptchaTimeoutError,\n SessionNotFound,\n SessionExpired,\n NotOwner,\n TimeoutError,\n ConnectionLost,\n TransportError,\n} from './errors.js';\nimport { saveSession, loadSession, deleteSession, getLastSeenTs, updateLastSeenTs } from './state.js';\nimport type { ConnectOptions, ChatMessage } from './types.js';\nimport type { Client } from './client.js';\nimport type { Browser } from './browser.js';\n\nfunction out(data: unknown): void {\n process.stdout.write(JSON.stringify(data) + '\\n');\n}\n\nfunction err(error: string, code = 'error'): void {\n process.stderr.write(JSON.stringify({ error, code }) + '\\n');\n}\n\nfunction getApiKey(): string {\n const key = process.env.CEKI_API_KEY;\n if (!key) {\n err('CEKI_API_KEY not set', 'auth');\n process.exit(2);\n }\n return key;\n}\n\nfunction connectOptions(): Partial<ConnectOptions> {\n return { reconnect: false };\n}\n\nasync function resumeBrowser(apiKey: string, sessionId: string): Promise<[Client, Browser]> {\n const client = await connect(apiKey, connectOptions());\n const browser = await client.resume(sessionId, { human: null });\n return [client, browser];\n}\n\nasync function closeClient(client: Client): Promise<void> {\n try { await client.disconnect(); } catch { /* ignore */ }\n}\n\nfunction parseBool(val: string): boolean {\n return val === 'true' || val === '1' || val === 'yes';\n}\n\n// --- Command handlers ---\n\nasync function cmdRent(args: string[]): Promise<void> {\n let scheduleId: number | null = null;\n let fingerprintFrom: string | null = null;\n let mode: 'incognito' | 'main' = 'incognito';\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--schedule' && args[i + 1]) scheduleId = parseInt(args[++i], 10);\n if (args[i] === '--fingerprint-from' && args[i + 1]) fingerprintFrom = args[++i];\n if (args[i] === '--mode' && args[i + 1]) {\n const v = args[++i];\n if (v !== 'incognito' && v !== 'main') {\n err('invalid mode, must be incognito or main', 'args');\n process.exit(1);\n }\n mode = v;\n }\n }\n if (scheduleId == null) {\n err('--schedule is required', 'args');\n process.exit(1);\n }\n\n const apiKey = getApiKey();\n let fpData: boolean | Record<string, unknown> = true;\n if (fingerprintFrom) {\n const profile = JSON.parse(fs.readFileSync(fingerprintFrom, 'utf-8'));\n fpData = profile.fingerprint || true;\n }\n\n const client = await connect(apiKey, connectOptions());\n try {\n const browser = await client.rent(scheduleId, { human: null, fingerprint: fpData, mode });\n saveSession(browser.sessionId, {\n session_id: browser.sessionId,\n chat_topic_id: browser.chatTopicId,\n schedule_id: browser.scheduleId,\n last_seen_ts: null,\n });\n out({\n session_id: browser.sessionId,\n chat_topic_id: browser.chatTopicId,\n schedule_id: browser.scheduleId,\n });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdSearch(args: string[]): Promise<void> {\n let limit = 20;\n const filters: Record<string, string> = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--limit' && args[i + 1]) limit = parseInt(args[++i], 10);\n if (args[i] === '--filter' && args[i + 1]) {\n const [k, ...v] = args[++i].split('=');\n filters[k] = v.join('=');\n }\n }\n\n const apiKey = getApiKey();\n const client = await connect(apiKey, connectOptions());\n try {\n const results = await client.search(filters, limit);\n out(results);\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdSessions(args: string[]): Promise<void> {\n let showAll = false;\n let limit = 50;\n let jsonOutput = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--all') showAll = true;\n else if (args[i] === '--json') jsonOutput = true;\n else if (args[i] === '--limit' && args[i + 1]) limit = Number(args[++i]);\n }\n const apiKey = getApiKey();\n const client = await connect(apiKey, connectOptions());\n try {\n const results = await client.listSessions({ active: !showAll, limit });\n if (jsonOutput) {\n out(results);\n } else {\n if (!results.length) {\n process.stdout.write('No sessions found.\\n');\n return;\n }\n const header = 'SID'.padEnd(8) + 'SCHEDULE'.padEnd(10) + 'STARTED'.padEnd(22) + 'DURATION'.padEnd(10) + 'EARNED'.padEnd(9) + 'STATUS'.padEnd(10) + 'RENTER'.padEnd(16) + 'PROVIDER';\n process.stdout.write(header + '\\n');\n for (const s of results) {\n const started = s.started_at ?? '—';\n const mins = Math.floor(s.duration / 60);\n const secs = s.duration % 60;\n const dur = `${mins}:${String(secs).padStart(2, '0')}`;\n const earned = `$${s.earned.toFixed(2)}`;\n const renter = (s.renter as Record<string, string>)?.name ?? '—';\n const provider = (s.provider as Record<string, string>)?.name ?? '—';\n const line = String(s.id).padEnd(8) + String(s.schedule_id).padEnd(10) + started.padEnd(22) + dur.padEnd(10) + earned.padEnd(9) + s.status.padEnd(10) + renter.padEnd(16) + provider;\n process.stdout.write(line + '\\n');\n }\n }\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdMyBrowsers(): Promise<void> {\n const apiKey = getApiKey();\n const client = await connect(apiKey, connectOptions());\n try {\n const results = await client.myBrowsers();\n out(results);\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdSnapshot(sid: string, args: string[]): Promise<void> {\n let outputPath: string | null = null;\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '-o' || args[i] === '--output') && args[i + 1]) outputPath = args[++i];\n }\n if (!outputPath) {\n err('-o/--output is required', 'args');\n process.exit(1);\n }\n\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const lastSeen = getLastSeenTs(sid);\n browser._lastSeenTs = lastSeen;\n const snap = await browser.snapshot();\n const pngBuf = Buffer.from(snap.screenshot, 'base64');\n fs.writeFileSync(outputPath, pngBuf);\n if (browser._lastSeenTs) {\n updateLastSeenTs(sid, browser._lastSeenTs);\n }\n const chatList = snap.chat.map((m: ChatMessage) => ({\n from: m.sender_id,\n text: m.text,\n ts: m.created_at,\n }));\n out({ screenshot: outputPath, chat: chatList, ts: snap.ts.toISOString() });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdNavigate(sid: string, args: string[]): Promise<void> {\n const url = args[0];\n if (!url) {\n err('URL is required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.navigate(url);\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdClick(sid: string, args: string[]): Promise<void> {\n const x = parseInt(args[0], 10);\n const y = parseInt(args[1], 10);\n if (isNaN(x) || isNaN(y)) {\n err('x and y coordinates are required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.click(x, y);\n out({ ok: true, pointer: [x, y] });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdType(sid: string, args: string[]): Promise<void> {\n let text = '';\n let natural = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--natural') natural = true;\n else if (!text) text = args[i];\n }\n if (!text) {\n err('text is required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const human = natural ? 'natural' as const : null;\n const client = await connect(apiKey, connectOptions());\n try {\n const browser = await client.resume(sid, { human });\n if (!natural) {\n browser._humanizer = null;\n }\n await browser.type(text);\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdScroll(sid: string, args: string[]): Promise<void> {\n const x = parseInt(args[0], 10);\n const y = parseInt(args[1], 10);\n const dy = parseInt(args[2], 10);\n if (isNaN(x) || isNaN(y) || isNaN(dy)) {\n err('x, y, dy are required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.scroll({ x, y, deltaY: dy });\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdChat(sid: string, action: string, args: string[]): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n switch (action) {\n case 'send': {\n const text = args[0];\n if (!text) {\n err('text is required', 'args');\n process.exit(1);\n }\n const result = await browser.chat.send(text);\n out({ ok: true, message_id: result.messageId });\n break;\n }\n case 'send-image': {\n let imagePath: string | null = null;\n let text: string | undefined;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--image' && args[i + 1]) imagePath = args[++i];\n if (args[i] === '--text' && args[i + 1]) text = args[++i];\n }\n if (!imagePath) {\n err('--image is required', 'args');\n process.exit(1);\n }\n if (text) {\n await browser.chat.send(text);\n }\n const result = await browser.chat.sendImage(imagePath);\n out({ ok: true, message_id: result.messageId });\n break;\n }\n case 'next': {\n let timeout = 60;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--timeout' && args[i + 1]) timeout = parseFloat(args[++i]);\n }\n const lastSeen = getLastSeenTs(sid);\n const msgs = await browser.chat.history({ since: lastSeen ?? undefined });\n if (msgs.length > 0) {\n const m = msgs[0];\n updateLastSeenTs(sid, m.created_at);\n out({ from: m.sender_id, text: m.text, ts: m.created_at });\n } else {\n let resolved = false;\n const waitPromise = new Promise<ChatMessage | null>((resolve) => {\n const timer = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n resolve(null);\n }\n }, timeout * 1000);\n\n browser.chat.onMessage((msg: ChatMessage) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timer);\n resolve(msg);\n }\n });\n });\n\n const msg = await waitPromise;\n if (msg) {\n updateLastSeenTs(sid, msg.created_at);\n out({ from: msg.sender_id, text: msg.text, ts: msg.created_at });\n } else {\n out(null);\n }\n }\n break;\n }\n case 'history': {\n let since: string | undefined;\n let limit = 50;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--since' && args[i + 1]) {\n const val = args[++i];\n const asNum = Number(val);\n if (!isNaN(asNum) && val.match(/^\\d+(\\.\\d+)?$/)) {\n since = new Date(asNum * 1000).toISOString();\n } else {\n since = val;\n }\n }\n if (args[i] === '--limit' && args[i + 1]) limit = parseInt(args[++i], 10);\n }\n const msgs = await browser.chat.history({ since, limit });\n out(msgs.map((m: ChatMessage) => ({ from: m.sender_id, text: m.text, ts: m.created_at })));\n break;\n }\n default:\n err(`Unknown chat action: ${action}`, 'args');\n process.exit(1);\n }\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdStop(sid: string): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.close();\n deleteSession(sid);\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdProfile(sid: string, action: string, args: string[]): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n switch (action) {\n case 'export': {\n let outputPath: string | null = null;\n let domains: string[] | undefined;\n let noSessionStorage = false;\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '-o' || args[i] === '--output') && args[i + 1]) outputPath = args[++i];\n if (args[i] === '--domains' && args[i + 1]) domains = args[++i].split(',').map(d => d.trim());\n if (args[i] === '--no-session-storage') noSessionStorage = true;\n }\n if (!outputPath) {\n err('-o/--output is required', 'args');\n process.exit(1);\n }\n const profile = await browser.profile.export({\n domains,\n includeSessionStorage: !noSessionStorage,\n });\n fs.writeFileSync(outputPath, JSON.stringify(profile, null, 2), 'utf-8');\n out({ ok: true, path: outputPath });\n break;\n }\n case 'import': {\n let inputPath: string | null = null;\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '-i' || args[i] === '--input') && args[i + 1]) inputPath = args[++i];\n }\n if (!inputPath) {\n err('-i/--input is required', 'args');\n process.exit(1);\n }\n const profileData = JSON.parse(fs.readFileSync(inputPath, 'utf-8'));\n await browser.profile.import(profileData);\n out({ ok: true });\n break;\n }\n default:\n err(`Unknown profile action: ${action}`, 'args');\n process.exit(1);\n }\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdWait(sid: string): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const reason = await browser.waitUntilEnded();\n out({ ended: true, reason });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdScreenshot(sid: string, args: string[]): Promise<void> {\n let outputPath: string | null = null;\n let fullPage = false;\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '-o' || args[i] === '--output') && args[i + 1]) outputPath = args[++i];\n if (args[i] === '--full') fullPage = true;\n }\n if (!outputPath) {\n err('-o/--output is required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const data = await browser.screenshot({ format: 'png', fullPage });\n fs.writeFileSync(outputPath, data as Buffer);\n out({ ok: true, path: outputPath });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdSwitchTab(sid: string): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.switchTab();\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdConfigure(sid: string, args: string[]): Promise<void> {\n const opts: Record<string, unknown> = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--masking-mode' && args[i + 1]) opts.maskingMode = parseBool(args[++i]);\n if (args[i] === '--fingerprint' && args[i + 1]) opts.fingerprint = parseBool(args[++i]);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.configure(opts as { maskingMode?: boolean; fingerprint?: boolean });\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdCdp(sid: string, args: string[]): Promise<void> {\n let method: string | null = null;\n let params: Record<string, unknown> = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--method' && args[i + 1]) method = args[++i];\n if (args[i] === '--params' && args[i + 1]) params = JSON.parse(args[++i]);\n }\n if (!method) {\n err('--method is required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const result = await browser.send({ method, params });\n out(result);\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdRequestCaptcha(sid: string, args: string[]): Promise<void> {\n let acceptance = 60;\n let completion = 120;\n let manual = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--acceptance' && args[i + 1]) acceptance = parseFloat(args[++i]);\n if (args[i] === '--completion' && args[i + 1]) completion = parseFloat(args[++i]);\n if (args[i] === '--manual') manual = true;\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const result = await browser.requestCaptcha({\n acceptanceTimeout: acceptance,\n completionTimeout: completion,\n autoAccept: !manual,\n });\n out({\n solved: result.solved,\n proof_message_id: result.proofMessageId,\n cancel_reason: result.cancelReason,\n child_event_id: result.childEventId,\n correction_id: result.correctionId,\n });\n if (!result.solved) process.exit(1);\n } catch (e) {\n if (e instanceof CaptchaTimeoutError) {\n out({ solved: false, cancel_reason: `timeout:${e.phase}`, child_event_id: null, correction_id: null });\n process.exit(1);\n }\n throw e;\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdUpload(sid: string, args: string[]): Promise<void> {\n let selector: string | null = null;\n let filePath: string | null = null;\n let filename: string | undefined;\n let mime: string | undefined;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--selector' && args[i + 1]) selector = args[++i];\n if (args[i] === '--file' && args[i + 1]) filePath = args[++i];\n if (args[i] === '--filename' && args[i + 1]) filename = args[++i];\n if (args[i] === '--mime' && args[i + 1]) mime = args[++i];\n }\n if (!selector || !filePath) {\n err('--selector and --file are required', 'args');\n process.exit(1);\n }\n if (!fs.existsSync(filePath)) {\n err(`File not found: ${filePath}`, 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const result = await browser.upload(selector, filePath, filename, mime);\n out(result);\n } finally {\n await closeClient(client);\n }\n}\n\n// --- Help ---\n\nfunction printHelp(): void {\n console.log(`ceki — CLI for browser.ceki.me rental\n\nUsage: ceki <command> [options]\n\nCommands:\n rent --schedule N [--fingerprint-from PATH]\n my-browsers\n search [--limit N] [--filter k=v]...\n snapshot <sid> -o PATH\n screenshot <sid> -o PATH [--full]\n navigate <sid> <url>\n click <sid> <x> <y>\n type <sid> \"<text>\" [--natural]\n scroll <sid> <x> <y> <dy>\n switch-tab <sid>\n configure <sid> [--masking-mode true|false] [--fingerprint true|false]\n cdp <sid> --method <M> [--params JSON]\n upload <sid> --selector CSS --file PATH [--filename NAME] [--mime TYPE]\n request-captcha <sid> [--acceptance N] [--completion M] [--manual]\n wait <sid>\n chat <sid> send \"<text>\"\n chat <sid> send-image --image PATH [--text \"...\"]\n chat <sid> next [--timeout N]\n chat <sid> history [--since TS] [--limit N]\n profile export <sid> -o file [--domains a,b,c] [--no-session-storage]\n profile import <sid> -i file\n stop <sid>\n\nEnvironment:\n CEKI_API_KEY (required)\n CEKI_RELAY_URL (default: wss://browser.ceki.me/ws/agent)\n CEKI_API_URL (default: https://api.ceki.me)\n CEKI_CHAT_URL (default: https://chat.ceki.me/api/chat)\n CEKI_BASIC_AUTH_USER / CEKI_BASIC_AUTH_PASS (optional)\n\nExit codes: 0=success, 1=error, 2=auth, 3=session_not_found, 4=timeout, 5=network`);\n}\n\n// --- Main ---\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n\n if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {\n printHelp();\n process.exit(0);\n }\n\n if (argv[0] === '--version' || argv[0] === '-v') {\n const pkgPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', 'package.json');\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n console.log(pkg.version);\n } catch {\n console.log('unknown');\n }\n process.exit(0);\n }\n\n const command = argv[0];\n const rest = argv.slice(1);\n\n switch (command) {\n case 'rent':\n await cmdRent(rest);\n break;\n case 'search':\n await cmdSearch(rest);\n break;\n case 'sessions':\n await cmdSessions(rest);\n break;\n case 'my-browsers':\n await cmdMyBrowsers();\n break;\n case 'snapshot':\n await cmdSnapshot(rest[0], rest.slice(1));\n break;\n case 'navigate':\n await cmdNavigate(rest[0], rest.slice(1));\n break;\n case 'click':\n await cmdClick(rest[0], rest.slice(1));\n break;\n case 'type':\n await cmdType(rest[0], rest.slice(1));\n break;\n case 'scroll':\n await cmdScroll(rest[0], rest.slice(1));\n break;\n case 'switch-tab':\n await cmdSwitchTab(rest[0]);\n break;\n case 'configure':\n await cmdConfigure(rest[0], rest.slice(1));\n break;\n case 'cdp':\n await cmdCdp(rest[0], rest.slice(1));\n break;\n case 'upload':\n await cmdUpload(rest[0], rest.slice(1));\n break;\n case 'request-captcha':\n await cmdRequestCaptcha(rest[0], rest.slice(1));\n break;\n case 'wait':\n await cmdWait(rest[0]);\n break;\n case 'stop':\n await cmdStop(rest[0]);\n break;\n case 'screenshot':\n await cmdScreenshot(rest[0], rest.slice(1));\n break;\n case 'chat':\n if (rest.length < 2) {\n err('Usage: ceki chat <sid> <action> [args]', 'args');\n process.exit(1);\n }\n await cmdChat(rest[0], rest[1], rest.slice(2));\n break;\n case 'profile':\n if (rest.length < 2) {\n err('Usage: ceki profile export|import <sid> [args]', 'args');\n process.exit(1);\n }\n await cmdProfile(rest[1], rest[0], rest.slice(2));\n break;\n default:\n err(`Unknown command: ${command}`, 'args');\n process.exit(1);\n }\n}\n\nmain().catch((e: unknown) => {\n if (e instanceof SessionExpired || e instanceof SessionNotFound) {\n err(String(e), 'session_not_found');\n process.exit(3);\n }\n if (e instanceof NotOwner) {\n err(String(e), 'not_owner');\n process.exit(3);\n }\n if (e instanceof TimeoutError) {\n err(String(e), 'timeout');\n process.exit(4);\n }\n if (e instanceof ConnectionLost || e instanceof AuthError || e instanceof TransportError) {\n err(String(e), 'network');\n process.exit(5);\n }\n if (e instanceof CekiBrowserError) {\n err(String(e), 'ceki_error');\n process.exit(1);\n }\n err(e instanceof Error ? e.message : String(e), 'error');\n process.exit(1);\n});\n","import WebSocket from 'ws';\nimport { resolveConfig } from './config.js';\nimport {\n CekiBrowserError,\n AuthError,\n SessionNotFound,\n SessionExpired,\n NotOwner,\n TimeoutError,\n SessionEnded,\n InsufficientFunds,\n RateLimitExceeded,\n ConnectionLost,\n ProviderOffline,\n CdpUnrecoverable,\n TransportError,\n} from './errors.js';\nimport { Browser } from './browser.js';\nimport { Humanizer } from './humanize/humanizer.js';\nimport { HumanProfile } from './humanize/profile.js';\nimport type { ConnectOptions, BrowserOption, Match, RentOptions, SessionInfo } from './types.js';\n\nconst BACKOFF_SCHEDULE = [1, 2, 4, 8, 16, 32, 60];\nconst MAX_RECONNECT_ATTEMPTS = 10;\nconst PING_INTERVAL = 30000;\nconst PONG_TIMEOUT = 90000;\n\ninterface PendingRent {\n scheduleId: number;\n eventId: string | null;\n resolve: (match: Match) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n opts?: RentOptions;\n}\n\ninterface PendingResume {\n sessionId: string;\n resolve: (match: Match) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n opts?: RentOptions;\n}\n\nexport class Client {\n /** @internal */ _apiKey: string;\n /** @internal */ _chatUrl: string;\n /** @internal */ _basicAuth: [string, string] | undefined;\n /** @internal */ _activeBrowsers: Map<string, Browser> = new Map();\n\n private _ws: WebSocket | null = null;\n /** @internal */ _apiUrl: string;\n private _relayUrl: string;\n private _reconnect: boolean;\n private _reconnectAttempt = 0;\n private _reconnecting = false;\n private _closed = false;\n\n private _pingTimer: ReturnType<typeof setInterval> | null = null;\n private _pongTimer: ReturnType<typeof setTimeout> | null = null;\n private _lastPongAt = 0;\n\n private _pendingRents: Map<string, PendingRent> = new Map(); // keyed by `rent:<scheduleId>` or eventId\n private _pendingResumes: Map<string, PendingResume> = new Map(); // keyed by sessionId\n\n private _connectResolve: (() => void) | null = null;\n private _connectReject: ((err: Error) => void) | null = null;\n\n constructor(apiKey: string, opts?: Partial<ConnectOptions>) {\n const cfg = resolveConfig(opts);\n this._apiKey = apiKey;\n this._apiUrl = cfg.apiUrl;\n this._relayUrl = cfg.relayUrl;\n this._chatUrl = cfg.chatUrl;\n this._basicAuth = cfg.basicAuth;\n this._reconnect = cfg.reconnect;\n }\n\n /** Factory: create client and connect */\n static async create(apiKey: string, opts?: Partial<ConnectOptions>): Promise<Client> {\n const client = new Client(apiKey, opts);\n await client._connect();\n return client;\n }\n\n /** @internal */\n _wsSend(msg: Record<string, unknown>): void {\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n throw new ConnectionLost('WebSocket not connected');\n }\n this._ws.send(JSON.stringify(msg));\n }\n\n async search(\n filters?: Record<string, unknown>,\n limit?: number,\n ): Promise<BrowserOption[]> {\n const params = new URLSearchParams();\n if (limit != null) params.set('limit', String(limit));\n if (filters) {\n for (const [key, value] of Object.entries(filters)) {\n if (value != null) params.set(key, String(value));\n }\n }\n\n const url = `${this._apiUrl}/api/browsers/search?${params.toString()}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._apiKey}`,\n };\n if (this._basicAuth) {\n const encoded = Buffer.from(`${this._basicAuth[0]}:${this._basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n\n const resp = await fetch(url, { headers });\n if (!resp.ok) {\n throw new TransportError(`Search request failed: ${resp.status} ${resp.statusText}`);\n }\n const body = await resp.json();\n const data = (body as Record<string, unknown>).data ?? body;\n return (Array.isArray(data) ? data : []) as BrowserOption[];\n }\n\n async listSessions(opts?: { active?: boolean; limit?: number }): Promise<SessionInfo[]> {\n const active = opts?.active ?? true;\n const limit = opts?.limit ?? 50;\n const params = new URLSearchParams({\n active: active ? '1' : '0',\n limit: String(limit),\n });\n const url = `${this._apiUrl}/api/agent/sessions?${params.toString()}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._apiKey}`,\n };\n if (this._basicAuth) {\n const encoded = Buffer.from(`${this._basicAuth[0]}:${this._basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n const resp = await fetch(url, { headers });\n if (!resp.ok) {\n throw new TransportError(`listSessions request failed: ${resp.status} ${resp.statusText}`);\n }\n const body = await resp.json();\n const items = (body as Record<string, unknown>).data ?? body;\n return (Array.isArray(items) ? items : []) as SessionInfo[];\n }\n\n async myBrowsers(): Promise<BrowserOption[]> {\n const url = `${this._apiUrl}/api/agent/browsers`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._apiKey}`,\n };\n if (this._basicAuth) {\n const encoded = Buffer.from(`${this._basicAuth[0]}:${this._basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n const resp = await fetch(url, { headers });\n if (!resp.ok) {\n throw new TransportError(`myBrowsers request failed: ${resp.status} ${resp.statusText}`);\n }\n const body = await resp.json();\n const items = (body as Record<string, unknown>).browsers ?? (body as Record<string, unknown>).data ?? body;\n return (Array.isArray(items) ? items : []) as BrowserOption[];\n }\n\n async rent(scheduleId: number, opts?: RentOptions): Promise<Browser> {\n const rentMsg: Record<string, unknown> = { type: 'rent', browser_id: scheduleId };\n if (opts?.mode) rentMsg.mode = opts.mode;\n this._wsSend(rentMsg);\n\n const key = `rent:${scheduleId}`;\n\n return new Promise<Browser>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingRents.delete(key);\n reject(new TimeoutError('Rent timed out after 90s'));\n }, 90000);\n\n this._pendingRents.set(key, {\n scheduleId,\n eventId: null,\n opts,\n resolve: (match: Match) => {\n const humanizer = this._resolveHumanizer(opts);\n const browser = new Browser(this, match, humanizer);\n this._activeBrowsers.set(browser.sessionId, browser);\n if (opts?.maskingMode) {\n browser.configure({ maskingMode: true }).catch(() => {});\n }\n if (opts?.fingerprint) {\n browser.configure({ fingerprint: opts.fingerprint }).catch(() => {});\n }\n resolve(browser);\n },\n reject,\n timer,\n });\n });\n }\n\n async resume(sessionId: string, opts?: RentOptions): Promise<Browser> {\n this._wsSend({ type: 'resume', session_id: sessionId });\n\n return new Promise<Browser>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingResumes.delete(sessionId);\n reject(new TimeoutError('Resume timed out after 10s'));\n }, 10000);\n\n this._pendingResumes.set(sessionId, {\n sessionId,\n opts,\n resolve: (match: Match) => {\n const humanizer = this._resolveHumanizer(opts);\n const browser = new Browser(this, match, humanizer);\n this._activeBrowsers.set(browser.sessionId, browser);\n resolve(browser);\n },\n reject,\n timer,\n });\n });\n }\n\n async close(): Promise<void> {\n this._closed = true;\n\n // Close all active browsers\n const closePromises: Promise<void>[] = [];\n for (const browser of this._activeBrowsers.values()) {\n closePromises.push(browser.close().catch(() => {}));\n }\n await Promise.allSettled(closePromises);\n\n // Reject pending rents\n for (const [key, pending] of this._pendingRents) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Client closed'));\n }\n this._pendingRents.clear();\n\n // Reject pending resumes\n for (const [key, pending] of this._pendingResumes) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Client closed'));\n }\n this._pendingResumes.clear();\n\n this._stopHeartbeat();\n this._closeWs();\n }\n\n async disconnect(): Promise<void> {\n this._closed = true;\n this._activeBrowsers.clear();\n this._pendingRents.clear();\n this._pendingResumes.clear();\n this._stopHeartbeat();\n this._closeWs();\n }\n\n // --- Private methods ---\n\n private async _connect(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this._connectResolve = resolve;\n this._connectReject = reject;\n this._openWs();\n });\n }\n\n private _openWs(): void {\n const protocols = [`bearer.${this._apiKey}`];\n this._ws = new WebSocket(this._relayUrl, protocols);\n\n this._ws.on('open', () => {\n this._reconnectAttempt = 0;\n this._reconnecting = false;\n this._lastPongAt = Date.now();\n this._startHeartbeat();\n\n if (this._connectResolve) {\n this._connectResolve();\n this._connectResolve = null;\n this._connectReject = null;\n }\n });\n\n this._ws.on('message', (data: WebSocket.Data) => {\n this._handleMessage(data);\n });\n\n this._ws.on('close', (code: number, reason: Buffer) => {\n this._stopHeartbeat();\n const reasonStr = reason.toString();\n\n if (code === 4401 || code === 4403) {\n const err = new AuthError(reasonStr || `Auth failed (${code})`);\n if (this._connectReject) {\n this._connectReject(err);\n this._connectResolve = null;\n this._connectReject = null;\n }\n return;\n }\n\n if (!this._closed && this._reconnect) {\n this._scheduleReconnect();\n }\n });\n\n this._ws.on('error', (err: Error) => {\n if (this._connectReject) {\n this._connectReject(new TransportError(err.message));\n this._connectResolve = null;\n this._connectReject = null;\n }\n });\n }\n\n private _closeWs(): void {\n if (this._ws) {\n try {\n this._ws.removeAllListeners();\n this._ws.close();\n } catch {\n // ignore close errors\n }\n this._ws = null;\n }\n }\n\n private _scheduleReconnect(): void {\n if (this._closed || this._reconnecting) return;\n if (this._reconnectAttempt >= MAX_RECONNECT_ATTEMPTS) {\n // Reject all pending operations\n const err = new ConnectionLost('Max reconnection attempts exceeded');\n this._rejectAllPending(err);\n return;\n }\n\n this._reconnecting = true;\n const backoffIdx = Math.min(this._reconnectAttempt, BACKOFF_SCHEDULE.length - 1);\n const delay = BACKOFF_SCHEDULE[backoffIdx] * 1000;\n this._reconnectAttempt++;\n\n setTimeout(() => {\n if (this._closed) return;\n this._closeWs();\n this._connectResolve = () => {\n // After reconnect, resume all active browsers\n for (const browser of this._activeBrowsers.values()) {\n this._wsSend({ type: 'resume', session_id: browser.sessionId });\n }\n };\n this._connectReject = () => {\n // Reconnect failed, try again\n this._reconnecting = false;\n this._scheduleReconnect();\n };\n this._openWs();\n }, delay);\n }\n\n private _startHeartbeat(): void {\n this._stopHeartbeat();\n this._pingTimer = setInterval(() => {\n try {\n this._wsSend({ type: 'ping' });\n } catch {\n // If send fails, WS close handler will trigger reconnect\n }\n }, PING_INTERVAL);\n\n this._pongTimer = setTimeout(() => {\n this._checkPongTimeout();\n }, PONG_TIMEOUT);\n }\n\n private _stopHeartbeat(): void {\n if (this._pingTimer) {\n clearInterval(this._pingTimer);\n this._pingTimer = null;\n }\n if (this._pongTimer) {\n clearTimeout(this._pongTimer);\n this._pongTimer = null;\n }\n }\n\n private _checkPongTimeout(): void {\n if (this._closed) return;\n const elapsed = Date.now() - this._lastPongAt;\n if (elapsed >= PONG_TIMEOUT) {\n // Heartbeat timeout — close and reconnect\n this._closeWs();\n if (this._reconnect) {\n this._scheduleReconnect();\n }\n } else {\n // Schedule next check\n this._pongTimer = setTimeout(() => {\n this._checkPongTimeout();\n }, PONG_TIMEOUT - elapsed);\n }\n }\n\n private _handleMessage(data: WebSocket.Data): void {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(data.toString()) as Record<string, unknown>;\n } catch {\n return;\n }\n\n const type = String(msg.type ?? '');\n const sessionId = msg.session_id ? String(msg.session_id) : null;\n\n switch (type) {\n case 'pong':\n this._lastPongAt = Date.now();\n break;\n\n case 'rent_pending':\n this._onRentPending(msg);\n break;\n\n case 'match':\n this._onMatch(msg);\n break;\n\n case 'rent.error':\n this._onRentError(msg);\n break;\n\n case 'resume_ok':\n this._onResumeOk(msg);\n break;\n\n case 'resume_failed':\n this._onResumeFailed(msg);\n break;\n\n case 'cdp_response':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onCdpResponse(msg);\n }\n break;\n\n case 'cdp_event':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onCdpEvent(msg);\n }\n break;\n\n case 'tab_opened':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onTabOpened(msg);\n }\n break;\n\n case 'session.ended':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onSessionEnded(msg);\n }\n break;\n\n case 'session.provider_disconnected':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onProviderDisconnected();\n }\n break;\n\n case 'session.provider_reconnected':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onProviderReconnected();\n }\n break;\n\n case 'user_events':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onUserEvents(msg);\n }\n break;\n\n case 'chat.message':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onChatMessage((msg.payload ?? msg) as Record<string, unknown>);\n }\n break;\n\n case 'chat.read':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onChatRead((msg.payload ?? msg) as Record<string, unknown>);\n }\n break;\n\n case 'chat.send_ack':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onChatSendAck(msg);\n }\n break;\n\n case 'chat.error':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onChatSendError(msg);\n }\n break;\n\n case 'error':\n this._onError(msg);\n break;\n }\n }\n\n private _onRentPending(msg: Record<string, unknown>): void {\n const eventId = String(msg.event_id ?? '');\n // Update pending rent with eventId for matching\n for (const [key, pending] of this._pendingRents) {\n if (!pending.eventId) {\n pending.eventId = eventId;\n // Re-key by eventId for faster lookup on match\n this._pendingRents.delete(key);\n this._pendingRents.set(`event:${eventId}`, pending);\n break;\n }\n }\n }\n\n private _onMatch(msg: Record<string, unknown>): void {\n const eventId = String(msg.event_id ?? '');\n const scheduleId = Number(msg.schedule_id ?? 0);\n const sessionId = String(msg.session_id ?? '');\n\n if (msg.requires_ack) {\n try { this._wsSend({ type: 'match_ack', session_id: sessionId }); } catch { /* ignore */ }\n }\n\n // Try eventId match first\n let pending = this._pendingRents.get(`event:${eventId}`);\n if (!pending) {\n // Fallback to scheduleId match\n pending = this._pendingRents.get(`rent:${scheduleId}`);\n }\n\n if (pending) {\n clearTimeout(pending.timer);\n const key = pending.eventId ? `event:${pending.eventId}` : `rent:${pending.scheduleId}`;\n this._pendingRents.delete(key);\n\n const match: Match = {\n session_id: sessionId,\n schedule_id: scheduleId,\n event_id: eventId || null,\n chat_topic_id: msg.chat_topic_id ? String(msg.chat_topic_id) : null,\n provider_user_id: msg.provider_user_id != null ? Number(msg.provider_user_id) : null,\n started_at: Date.now(),\n browser_info: (msg.browser_info as Record<string, unknown>) ?? {},\n };\n\n pending.resolve(match);\n }\n }\n\n private _onRentError(msg: Record<string, unknown>): void {\n const eventId = String(msg.event_id ?? '');\n const code = String(msg.code ?? '');\n const message = String(msg.message ?? '');\n\n let pending = this._pendingRents.get(`event:${eventId}`);\n if (!pending) {\n // Try to find any pending rent\n for (const [key, p] of this._pendingRents) {\n pending = p;\n this._pendingRents.delete(key);\n break;\n }\n } else {\n this._pendingRents.delete(`event:${eventId}`);\n }\n\n if (pending) {\n clearTimeout(pending.timer);\n if (code === 'provider_offline') {\n pending.reject(new ProviderOffline(message));\n } else {\n pending.reject(new TransportError(message || `Rent error: ${code}`));\n }\n }\n }\n\n private _onResumeOk(msg: Record<string, unknown>): void {\n const sessionId = String(msg.session_id ?? '');\n const pending = this._pendingResumes.get(sessionId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this._pendingResumes.delete(sessionId);\n\n const match: Match = {\n session_id: sessionId,\n event_id: msg.event_id != null ? String(msg.event_id) : null,\n schedule_id: Number(msg.schedule_id ?? 0),\n chat_topic_id: msg.chat_topic_id ? String(msg.chat_topic_id) : null,\n provider_user_id: msg.provider_user_id != null ? Number(msg.provider_user_id) : null,\n started_at: Date.now(),\n browser_info: (msg.browser_info as Record<string, unknown>) ?? {},\n };\n\n pending.resolve(match);\n }\n\n private _onResumeFailed(msg: Record<string, unknown>): void {\n const sessionId = String(msg.session_id ?? '');\n const reason = String(msg.reason ?? '');\n const pending = this._pendingResumes.get(sessionId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this._pendingResumes.delete(sessionId);\n\n switch (reason) {\n case 'expired':\n pending.reject(new SessionExpired());\n break;\n case 'not_owner':\n pending.reject(new NotOwner());\n break;\n case 'not_found':\n pending.reject(new SessionNotFound());\n break;\n default:\n pending.reject(new SessionNotFound(reason));\n }\n }\n\n private _onError(msg: Record<string, unknown>): void {\n const code = Number(msg.code ?? 0);\n const reason = String(msg.reason ?? msg.message ?? '');\n const sessionId = msg.session_id ? String(msg.session_id) : null;\n\n // Route session-specific errors to browser\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n if (browser) {\n switch (code) {\n case -1011: // heartbeat timeout\n browser._onSessionEnded({ reason: 'heartbeat_timeout' });\n return;\n case -1012:\n browser._onError({ reason: 'insufficient_funds' });\n return;\n case -1013:\n browser._onError({ reason: 'rate_limit_exceeded' });\n return;\n case -1015: // provider_declined\n browser._onSessionEnded({ reason: 'provider_declined' });\n return;\n case -1018: // killed\n browser._onSessionEnded({ reason: 'killed' });\n return;\n case -1050:\n browser._onError({ reason: `cdp_unrecoverable: ${reason}` });\n return;\n default:\n browser._onError(msg);\n return;\n }\n }\n }\n\n // Global errors — reject pending operations\n let err: CekiBrowserError;\n switch (code) {\n case -1012:\n err = new InsufficientFunds(reason);\n this._rejectAllPending(err);\n break;\n case -1013:\n err = new RateLimitExceeded(0, reason);\n this._rejectAllPending(err);\n break;\n case -1015:\n err = new ProviderOffline(reason);\n this._rejectFirstPendingRent(err);\n break;\n default:\n err = new CekiBrowserError(reason || `relay error ${code}`);\n this._rejectFirstPendingRent(err);\n break;\n }\n }\n\n private _rejectFirstPendingRent(err: Error): void {\n const eventId = this._pendingRents.keys().next().value;\n if (eventId != null) {\n const pending = this._pendingRents.get(eventId)!;\n clearTimeout(pending.timer);\n this._pendingRents.delete(eventId);\n pending.reject(err);\n }\n }\n\n private _rejectAllPending(err: Error): void {\n for (const [key, pending] of this._pendingRents) {\n clearTimeout(pending.timer);\n pending.reject(err);\n }\n this._pendingRents.clear();\n\n for (const [key, pending] of this._pendingResumes) {\n clearTimeout(pending.timer);\n pending.reject(err);\n }\n this._pendingResumes.clear();\n }\n\n private _resolveHumanizer(opts?: RentOptions): Humanizer | null {\n if (process.env.CEKI_HUMAN_DISABLE === '1') return null;\n const human = opts?.human;\n if (human === null || human === undefined) {\n const envPreset = process.env.CEKI_HUMAN_PROFILE;\n const envPath = process.env.CEKI_HUMAN_PROFILE_PATH;\n if (envPath) return new Humanizer(HumanProfile.load(envPath));\n if (envPreset) return new Humanizer(HumanProfile.loadPreset(envPreset));\n return new Humanizer(HumanProfile.loadPreset('natural'));\n }\n if (human === 'natural' || human === 'careful') {\n return new Humanizer(HumanProfile.loadPreset(human));\n }\n return null;\n }\n}\n\n/** Factory function: create a connected Client */\nexport async function connect(apiKey: string, opts?: Partial<ConnectOptions>): Promise<Client> {\n return Client.create(apiKey, opts);\n}\n","import type { ConnectOptions } from './types.js';\n\nexport const defaults = {\n apiUrl: 'https://api.ceki.me',\n relayUrl: 'wss://browser.ceki.me/ws/agent',\n chatUrl: 'https://chat.ceki.me/api/chat',\n};\n\nexport function resolveConfig(opts?: Partial<ConnectOptions>) {\n return {\n apiUrl: opts?.apiUrl ?? process.env.CEKI_API_URL ?? defaults.apiUrl,\n relayUrl: opts?.relayUrl ?? process.env.CEKI_RELAY_URL ?? defaults.relayUrl,\n chatUrl: opts?.chatUrl ?? process.env.CEKI_CHAT_URL ?? defaults.chatUrl,\n basicAuth: opts?.basicAuth ?? (process.env.CEKI_BASIC_AUTH_USER && process.env.CEKI_BASIC_AUTH_PASS\n ? [process.env.CEKI_BASIC_AUTH_USER, process.env.CEKI_BASIC_AUTH_PASS] as [string, string]\n : undefined),\n reconnect: opts?.reconnect ?? true,\n };\n}\n","export class CekiBrowserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CekiBrowserError';\n }\n}\n\nexport class AuthError extends CekiBrowserError {\n constructor(message = 'Authentication failed') {\n super(message);\n this.name = 'AuthError';\n }\n}\n\nexport class SessionNotFound extends CekiBrowserError {\n constructor(message = 'Session not found') {\n super(message);\n this.name = 'SessionNotFound';\n }\n}\n\nexport class SessionExpired extends SessionNotFound {\n constructor(message = 'Session expired') {\n super(message);\n this.name = 'SessionExpired';\n }\n}\n\nexport class NotOwner extends CekiBrowserError {\n constructor(message = 'Not session owner') {\n super(message);\n this.name = 'NotOwner';\n }\n}\n\nexport class TransportError extends CekiBrowserError {\n constructor(message = 'Transport error') {\n super(message);\n this.name = 'TransportError';\n }\n}\n\nexport class TimeoutError extends CekiBrowserError {\n constructor(message = 'Operation timed out') {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n\nexport class SessionEnded extends CekiBrowserError {\n reason: string;\n constructor(reason: string) {\n super(`Session ended: ${reason}`);\n this.name = 'SessionEnded';\n this.reason = reason;\n }\n}\n\nexport class InsufficientFunds extends CekiBrowserError {\n constructor(message = 'Insufficient funds') {\n super(message);\n this.name = 'InsufficientFunds';\n }\n}\n\nexport class RateLimitExceeded extends CekiBrowserError {\n retryAfter: number;\n constructor(retryAfter = 0, message = 'Rate limit exceeded') {\n super(message);\n this.name = 'RateLimitExceeded';\n this.retryAfter = retryAfter;\n }\n}\n\nexport class ConnectionLost extends CekiBrowserError {\n constructor(message = 'Connection lost') {\n super(message);\n this.name = 'ConnectionLost';\n }\n}\n\nexport class ProviderOffline extends CekiBrowserError {\n constructor(message = 'Provider offline') {\n super(message);\n this.name = 'ProviderOffline';\n }\n}\n\nexport class ProviderDisconnected extends CekiBrowserError {\n constructor(message = 'Provider disconnected') {\n super(message);\n this.name = 'ProviderDisconnected';\n }\n}\n\nexport class CdpUnrecoverable extends CekiBrowserError {\n lastError: string;\n constructor(lastError: string) {\n super(`CDP unrecoverable: ${lastError}`);\n this.name = 'CdpUnrecoverable';\n this.lastError = lastError;\n }\n}\n\nexport class CaptchaError extends CekiBrowserError {\n constructor(message = 'Captcha error') {\n super(message);\n this.name = 'CaptchaError';\n }\n}\n\nexport class CaptchaTimeoutError extends CaptchaError {\n phase: 'acceptance' | 'completion';\n constructor(phase: 'acceptance' | 'completion') {\n super(`Captcha timeout: ${phase}`);\n this.name = 'CaptchaTimeoutError';\n this.phase = phase;\n }\n}\n\nexport class ChatSendFailed extends CekiBrowserError {\n status: number;\n messageText: string;\n constructor(status: number, messageText: string) {\n super(`Chat send failed (${status})`);\n this.name = 'ChatSendFailed';\n this.status = status;\n this.messageText = messageText;\n }\n}\n","import mime from 'mime-types';\nimport { TimeoutError, SessionEnded, CaptchaError, CaptchaTimeoutError } from './errors.js';\nimport { BrowserChat } from './chat.js';\nimport { BrowserProfile } from './profile.js';\nimport { saveSession, getLastSeenTs, updateLastSeenTs } from './state.js';\nimport type { Match, ScreenshotOptions, ScrollOptions, Snapshot, ChatMessage, CaptchaOptions, CaptchaResult } from './types.js';\nimport type { Client } from './client.js';\n\nimport { Humanizer } from './humanize/humanizer.js';\nimport { HumanProfile } from './humanize/profile.js';\nimport { keymapForChar } from './humanize/keymap.js';\nexport type { Humanizer, HumanProfile };\n\ninterface PendingCdp {\n resolve: (value: unknown) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\ntype EventHandler = (method: string, params: Record<string, unknown>) => void;\ntype TabHandler = (url: string) => void;\ntype VoidHandler = () => void;\ntype UserEventHandler = (events: Record<string, unknown>[]) => void;\n\nexport class Browser {\n readonly sessionId: string;\n readonly browserId: number;\n readonly scheduleId: number;\n readonly chatTopicId: string | null;\n readonly browserInfo: Record<string, unknown>;\n readonly providerUserId: number | null;\n /** @internal */ _eventId: string | null;\n\n readonly chat: BrowserChat;\n readonly profile: BrowserProfile;\n\n /** @internal */ _client: Client;\n /** @internal */ _humanizer: Humanizer | null = null;\n /** @internal */ _lastPointer: [number, number] | null = null;\n /** @internal */ _lastSeenTs: string | null = null;\n /** @internal */ _cdpCounter = 1;\n /** @internal */ _pendingCdp: Map<number, PendingCdp> = new Map();\n /** @internal */ _ended: Promise<string>;\n /** @internal */ _endedReason: string | null = null;\n /** @internal */ _resolveEnded!: (reason: string) => void;\n\n private _eventHandlers: EventHandler[] = [];\n private _tabHandlers: TabHandler[] = [];\n private _disconnectHandlers: VoidHandler[] = [];\n private _reconnectHandlers: VoidHandler[] = [];\n private _userEventHandlers: UserEventHandler[] = [];\n\n /** @internal */\n get _apiKey(): string {\n return this._client._apiKey;\n }\n\n /** @internal */\n get _chatUrl(): string {\n return this._client._chatUrl;\n }\n\n /** @internal */\n get _basicAuth(): [string, string] | undefined {\n return this._client._basicAuth;\n }\n\n constructor(client: Client, match: Match, humanizer?: Humanizer | null) {\n this._client = client;\n this.sessionId = match.session_id;\n this.browserId = match.schedule_id;\n this.scheduleId = match.schedule_id;\n this.chatTopicId = match.chat_topic_id ?? null;\n this.browserInfo = match.browser_info ?? {};\n this.providerUserId = match.provider_user_id ?? null;\n this._eventId = match.event_id ?? null;\n this._humanizer = humanizer ?? null;\n\n this.chat = new BrowserChat(this);\n this.profile = new BrowserProfile(this);\n\n this._ended = new Promise<string>((resolve) => {\n this._resolveEnded = resolve;\n });\n\n // Load last_seen_ts from state\n this._lastSeenTs = getLastSeenTs(this.sessionId);\n\n // Save session state\n saveSession(this.sessionId, {\n session_id: this.sessionId,\n chat_topic_id: this.chatTopicId,\n schedule_id: this.scheduleId,\n last_seen_ts: this._lastSeenTs,\n });\n }\n\n /** @internal — send raw message via client WS */\n _sendRaw(msg: Record<string, unknown>): void {\n this._client._wsSend(msg);\n }\n\n async send(\n cdp: { method: string; params?: Record<string, unknown> },\n timeout = 30000,\n ): Promise<unknown> {\n if (this._endedReason) {\n throw new SessionEnded(this._endedReason);\n }\n\n const id = this._cdpCounter++;\n const msg = {\n type: 'cdp' as const,\n session_id: this.sessionId,\n id,\n method: cdp.method,\n params: cdp.params ?? {},\n };\n\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingCdp.delete(id);\n reject(new TimeoutError(`CDP ${cdp.method} timed out after ${timeout}ms`));\n }, timeout);\n this._pendingCdp.set(id, { resolve, reject, timer });\n this._sendRaw(msg);\n });\n }\n\n async navigate(url: string, timeout = 30000): Promise<{ url: string; frameId?: string }> {\n if (this._humanizer) await this._humanizer.before('navigate');\n const result = await this.send({ method: 'Page.navigate', params: { url } }, timeout) as Record<string, unknown>;\n if (this._humanizer) await this._humanizer.after('navigate');\n return {\n url: String(result?.url ?? url),\n frameId: result?.frameId ? String(result.frameId) : undefined,\n };\n }\n\n async click(x: number, y: number): Promise<void> {\n if (this._humanizer) await this._humanizer.before('click');\n\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mousePressed', x, y, button: 'left', clickCount: 1 },\n });\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mouseReleased', x, y, button: 'left', clickCount: 1 },\n });\n\n this._lastPointer = [x, y];\n\n if (this._humanizer) await this._humanizer.after('click');\n }\n\n private async _sendKeystroke(char: string): Promise<void> {\n const mapping = keymapForChar(char);\n if (!mapping) {\n await this.send({ method: 'Input.insertText', params: { text: char } });\n return;\n }\n const { code, key, vk, needsShift } = mapping;\n if (needsShift) {\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: { type: 'keyDown', key: 'Shift', code: 'ShiftLeft', windowsVirtualKeyCode: 16, nativeVirtualKeyCode: 16 },\n });\n }\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: {\n type: 'keyDown', key, code, text: char,\n unmodifiedText: needsShift ? char.toLowerCase() : char,\n windowsVirtualKeyCode: vk, nativeVirtualKeyCode: vk,\n ...(needsShift ? { modifiers: 8 } : {}),\n },\n });\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: {\n type: 'keyUp', key, code,\n windowsVirtualKeyCode: vk, nativeVirtualKeyCode: vk,\n ...(needsShift ? { modifiers: 8 } : {}),\n },\n });\n if (needsShift) {\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: { type: 'keyUp', key: 'Shift', code: 'ShiftLeft', windowsVirtualKeyCode: 16, nativeVirtualKeyCode: 16 },\n });\n }\n }\n\n async type(text: string): Promise<void> {\n // task 413 — typing humanizer moved into the extension. The SDK now\n // sends ONE Ceki.typeText command instead of N per-char dispatchKey\n // events, so long inputs no longer burn through the 500 cmd / 60s\n // relay cap and the inter-key delays land without WS jitter.\n if (this._humanizer) {\n await this._humanizer.before('type');\n\n // Re-click last pointer position to focus (kept on the SDK side so\n // pre-focus stays exactly as before; this is one command, not N).\n if (this._lastPointer) {\n const [px, py] = this._lastPointer;\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mousePressed', x: px, y: py, button: 'left', clickCount: 1 },\n });\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mouseReleased', x: px, y: py, button: 'left', clickCount: 1 },\n });\n }\n }\n\n const human = this._humanizer\n ? (['natural', 'careful'].includes(this._humanizer.profile.name) ? this._humanizer.profile.name : 'natural')\n : null;\n await this.send({ method: 'Ceki.typeText', params: { text, human } });\n\n if (this._humanizer) {\n await this._humanizer.after('type');\n }\n }\n\n async scroll(opts?: ScrollOptions): Promise<void> {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const deltaX = opts?.deltaX ?? 0;\n const deltaY = opts?.deltaY ?? -300;\n\n if (this._humanizer) await this._humanizer.before('scroll');\n\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mouseWheel', x, y, deltaX, deltaY },\n });\n\n this._lastPointer = [x, y];\n\n if (this._humanizer) await this._humanizer.after('scroll');\n }\n\n async screenshot(opts?: ScreenshotOptions): Promise<{ data: string } | Buffer> {\n const format = opts?.format ?? 'base64';\n const fullPage = opts?.fullPage ?? false;\n\n let clip: Record<string, unknown> | undefined;\n\n if (fullPage) {\n const metrics = await this.send({ method: 'Page.getLayoutMetrics' }) as Record<string, unknown>;\n const contentSize = metrics?.contentSize as Record<string, unknown> | undefined;\n if (contentSize) {\n const width = Number(contentSize.width ?? 1920);\n const height = Math.min(Number(contentSize.height ?? 1080), 16384);\n clip = { x: 0, y: 0, width, height, scale: 1 };\n }\n }\n\n const params: Record<string, unknown> = { format: 'png' };\n if (clip) params.clip = clip;\n\n const result = await this.send({ method: 'Page.captureScreenshot', params }) as Record<string, unknown>;\n const data = String(result?.data ?? '');\n\n if (format === 'png') {\n return Buffer.from(data, 'base64');\n }\n\n return { data };\n }\n\n async snapshot(): Promise<Snapshot> {\n const [ssResult, chatMessages] = await Promise.all([\n this.screenshot({ format: 'base64' }),\n this.chat.history({ since: this._lastSeenTs ?? undefined }),\n ]);\n\n const screenshotData = (ssResult as { data: string }).data;\n\n if (chatMessages.length > 0) {\n const lastMsg = chatMessages[chatMessages.length - 1];\n this._lastSeenTs = lastMsg.created_at;\n updateLastSeenTs(this.sessionId, this._lastSeenTs);\n }\n\n return {\n screenshot: screenshotData,\n chat: chatMessages,\n ts: new Date(),\n };\n }\n\n private static _detectMime(filename: string): string {\n return mime.lookup(filename) || 'application/octet-stream';\n }\n\n async upload(\n selector: string,\n source: string | Buffer,\n filename?: string,\n mime?: string,\n ): Promise<{ ok: boolean; filename: string; size: number }> {\n let buf: Buffer;\n let resolvedFilename: string;\n\n if (typeof source === 'string') {\n const fs = await import('node:fs');\n const path = await import('node:path');\n buf = fs.readFileSync(source);\n resolvedFilename = filename ?? path.basename(source);\n } else {\n buf = Buffer.isBuffer(source) ? source : Buffer.from(source);\n resolvedFilename = filename ?? 'file';\n }\n\n const mimeType = mime ?? Browser._detectMime(resolvedFilename);\n console.info(`upload: file=${resolvedFilename} mime=${mimeType} size=${buf.length}`);\n\n const b64 = buf.toString('base64');\n const size = buf.length;\n\n const expression = `\n (function() {\n var input = document.querySelector(${JSON.stringify(selector)});\n if (!input) return JSON.stringify({ok: false, error: 'Element not found'});\n var b64 = ${JSON.stringify(b64)};\n var binary = atob(b64);\n var bytes = new Uint8Array(binary.length);\n for (var i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n var file = new File([bytes], ${JSON.stringify(resolvedFilename)}, {type: ${JSON.stringify(mimeType)}});\n var dt = new DataTransfer();\n dt.items.add(file);\n input.files = dt.files;\n input.dispatchEvent(new Event('change', {bubbles: true}));\n return JSON.stringify({ok: true, filename: ${JSON.stringify(resolvedFilename)}, size: ${size}});\n })()\n `.trim();\n\n const result = await this.send({\n method: 'Runtime.evaluate',\n params: { expression, returnByValue: true },\n }) as Record<string, unknown>;\n\n const resultObj = result?.result as Record<string, unknown> | undefined;\n\n try {\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: { type: 'keyDown', key: 'Escape', code: 'Escape', windowsVirtualKeyCode: 27, nativeVirtualKeyCode: 27 },\n });\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: { type: 'keyUp', key: 'Escape', code: 'Escape', windowsVirtualKeyCode: 27, nativeVirtualKeyCode: 27 },\n });\n } catch {\n // ignore — best-effort dialog dismiss\n }\n\n if (resultObj?.value) {\n return JSON.parse(String(resultObj.value)) as { ok: boolean; filename: string; size: number };\n }\n return { ok: true, filename: resolvedFilename, size };\n }\n\n async switchTab(): Promise<void> {\n this._sendRaw({ type: 'switch_tab', session_id: this.sessionId });\n }\n\n async configure(opts: { maskingMode?: boolean; fingerprint?: boolean | Record<string, unknown> }): Promise<void> {\n const msg: Record<string, unknown> = {\n type: 'session.configure',\n session_id: this.sessionId,\n };\n if (opts.maskingMode !== undefined) msg.masking_mode = opts.maskingMode;\n if (opts.fingerprint !== undefined) msg.fingerprint = opts.fingerprint;\n this._sendRaw(msg);\n }\n\n async close(timeout = 10000): Promise<void> {\n if (this._endedReason) return;\n\n this._sendRaw({\n type: 'session.end',\n session_id: this.sessionId,\n reason: 'user_stop',\n });\n\n await Promise.race([\n this._ended,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new TimeoutError('Close timed out')), timeout)\n ),\n ]).catch(() => {\n // If timed out, force cleanup\n });\n\n this._cleanup();\n }\n\n async release(timeout?: number): Promise<void> {\n return this.close(timeout);\n }\n\n async waitUntilEnded(): Promise<string> {\n return this._ended;\n }\n\n onEvent(cb: EventHandler): void {\n this._eventHandlers.push(cb);\n }\n\n onTabOpened(cb: TabHandler): void {\n this._tabHandlers.push(cb);\n }\n\n onProviderDisconnected(cb: VoidHandler): void {\n this._disconnectHandlers.push(cb);\n }\n\n onProviderReconnected(cb: VoidHandler): void {\n this._reconnectHandlers.push(cb);\n }\n\n onUserEvent(cb: UserEventHandler): void {\n this._userEventHandlers.push(cb);\n }\n\n // --- Captcha / human action ---\n\n private _apiHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._apiKey}`,\n 'Content-Type': 'application/json',\n };\n const basicAuth = this._basicAuth;\n if (basicAuth) {\n const encoded = Buffer.from(`${basicAuth[0]}:${basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n return headers;\n }\n\n async requestCaptcha(opts?: CaptchaOptions): Promise<CaptchaResult> {\n let acceptanceTimeout = opts?.acceptanceTimeout ?? 60;\n let completionTimeout = opts?.completionTimeout ?? 120;\n const autoAccept = opts?.autoAccept ?? true;\n\n if (acceptanceTimeout < 30) throw new Error('acceptanceTimeout must be >= 30 seconds');\n if (completionTimeout < 30) throw new Error('completionTimeout must be >= 30 seconds');\n\n acceptanceTimeout = Math.min(acceptanceTimeout, 300);\n completionTimeout = Math.min(completionTimeout, 600);\n\n const { id: childEventId } = await this._createCaptchaEvent(acceptanceTimeout, completionTimeout);\n const completionDeadline = Date.now() + completionTimeout * 1000;\n\n const buffer: Record<string, unknown>[] = [];\n let waiter: ((action: Record<string, unknown>) => void) | null = null;\n\n this.chat._actionCallbacks.set(childEventId, (action) => {\n if (waiter) {\n const w = waiter;\n waiter = null;\n w(action);\n } else {\n buffer.push(action);\n }\n });\n\n const nextAction = (timeoutMs: number): Promise<Record<string, unknown>> => {\n if (buffer.length > 0) return Promise.resolve(buffer.shift()!);\n return new Promise<Record<string, unknown>>((resolve, reject) => {\n const timer = setTimeout(() => {\n waiter = null;\n reject(new Error('timeout'));\n }, timeoutMs);\n waiter = (action) => {\n clearTimeout(timer);\n resolve(action);\n };\n });\n };\n\n const cleanup = () => {\n this.chat._actionCallbacks.delete(childEventId);\n waiter = null;\n };\n\n const makeResult = async (\n data: Record<string, unknown>,\n solved: boolean,\n ): Promise<CaptchaResult> => {\n const correctionId = data.correction_id != null ? Number(data.correction_id) : null;\n const proofMessageId = data.proof_message_id != null ? String(data.proof_message_id) : null;\n let voted = false;\n\n const result: CaptchaResult = {\n solved,\n proofMessageId,\n cancelReason: null,\n childEventId,\n correctionId,\n acceptWork: async () => {\n if (voted) return;\n if (!correctionId) throw new CaptchaError('no correction_id — provider has not proposed completion');\n voted = true;\n await fetch(`${this._client._apiUrl}/api/agent/kal/event/${childEventId}/vote`, {\n method: 'POST',\n headers: this._apiHeaders(),\n body: JSON.stringify({ ids: [correctionId], vote: true }),\n });\n },\n rejectWork: async (reason?: string) => {\n if (voted) return;\n if (!correctionId) throw new CaptchaError('no correction_id — provider has not proposed completion');\n voted = true;\n const body: Record<string, unknown> = { ids: [correctionId], vote: false };\n if (reason) body.reason = reason;\n await fetch(`${this._client._apiUrl}/api/agent/kal/event/${childEventId}/vote`, {\n method: 'POST',\n headers: this._apiHeaders(),\n body: JSON.stringify(body),\n });\n },\n };\n\n if (autoAccept && solved && correctionId) {\n await new Promise<void>(r => setTimeout(r, 2000));\n await result.acceptWork();\n }\n\n return result;\n };\n\n let accepted = false;\n\n try {\n // Phase 1: wait for acceptance\n const acceptDeadline = Date.now() + acceptanceTimeout * 1000;\n while (true) {\n const remaining = acceptDeadline - Date.now();\n if (remaining <= 0) throw new Error('timeout');\n const action = await nextAction(remaining);\n const kind = String(action.kind ?? '');\n const data = (action.data ?? {}) as Record<string, unknown>;\n\n if (kind === 'human_action_accepted') {\n accepted = true;\n break;\n }\n if (kind === 'human_action_completed') {\n cleanup();\n return await makeResult(data, true);\n }\n if (kind === 'human_action_failed' || kind === 'human_action_declined' || kind === 'human_action_withdrew') {\n cleanup();\n return {\n solved: false,\n proofMessageId: null,\n cancelReason: kind.replace('human_action_', ''),\n childEventId,\n correctionId: null,\n acceptWork: async () => {},\n rejectWork: async () => {},\n };\n }\n }\n\n // Phase 2: wait for completion\n while (true) {\n const remaining = completionDeadline - Date.now();\n if (remaining <= 0) throw new Error('timeout');\n const action = await nextAction(remaining);\n const kind = String(action.kind ?? '');\n const data = (action.data ?? {}) as Record<string, unknown>;\n\n if (kind === 'human_action_completed') {\n cleanup();\n return await makeResult(data, true);\n }\n if (kind === 'human_action_failed' || kind === 'human_action_withdrew') {\n cleanup();\n return {\n solved: false,\n proofMessageId: null,\n cancelReason: kind.replace('human_action_', ''),\n childEventId,\n correctionId: null,\n acceptWork: async () => {},\n rejectWork: async () => {},\n };\n }\n }\n } catch {\n cleanup();\n const phase = accepted ? 'completion' : 'acceptance';\n await this._expireCaptchaEvent(childEventId);\n throw new CaptchaTimeoutError(phase);\n }\n }\n\n private async _createCaptchaEvent(acceptanceTimeout: number, completionTimeout: number): Promise<{ id: number; amount: number }> {\n const body = {\n acceptance_deadline_at: Math.floor(acceptanceTimeout),\n completion_deadline_at: Math.floor(completionTimeout),\n };\n\n const resp = await fetch(`${this._client._apiUrl}/api/agent/sessions/${this._eventId}/captcha-request`, {\n method: 'POST',\n headers: this._apiHeaders(),\n body: JSON.stringify(body),\n });\n if (!resp.ok) {\n throw new Error(`Captcha request failed: ${resp.status}`);\n }\n const result = await resp.json() as { id: number; amount: number };\n if (!result.id) throw new Error('Captcha request did not return an id');\n return { id: result.id, amount: result.amount };\n }\n\n private async _expireCaptchaEvent(childEventId: number): Promise<void> {\n try {\n await fetch(`${this._client._apiUrl}/api/agent/kal/event/${childEventId}`, {\n method: 'PATCH',\n headers: this._apiHeaders(),\n body: JSON.stringify({ status_id: 777 }),\n });\n } catch { /* best effort */ }\n }\n\n // --- Internal handlers called by Client dispatch ---\n\n /** @internal */\n _onCdpResponse(msg: Record<string, unknown>): void {\n const id = Number(msg.id);\n const pending = this._pendingCdp.get(id);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this._pendingCdp.delete(id);\n\n if (msg.ok === false) {\n const error = msg.error as Record<string, unknown> | undefined;\n pending.reject(new Error(String(error?.message ?? error?.code ?? 'CDP error')));\n } else {\n pending.resolve(msg.result ?? null);\n }\n }\n\n /** @internal */\n _onCdpEvent(msg: Record<string, unknown>): void {\n const method = String(msg.method ?? '');\n const params = (msg.params ?? {}) as Record<string, unknown>;\n for (const h of this._eventHandlers) {\n try {\n h(method, params);\n } catch {\n // handler errors should not break dispatch\n }\n }\n }\n\n /** @internal */\n _onTabOpened(msg: Record<string, unknown>): void {\n const url = String(msg.url ?? '');\n for (const h of this._tabHandlers) {\n try {\n h(url);\n } catch {\n // handler errors should not break dispatch\n }\n }\n }\n\n /** @internal */\n _onSessionEnded(msg: Record<string, unknown>): void {\n const reason = String(msg.reason ?? 'unknown');\n this._endedReason = reason;\n this._resolveEnded(reason);\n this._rejectAllPending(new SessionEnded(reason));\n this._cleanup();\n }\n\n /** @internal */\n _onProviderDisconnected(): void {\n for (const h of this._disconnectHandlers) {\n try { h(); } catch { /* ignore */ }\n }\n }\n\n /** @internal */\n _onProviderReconnected(): void {\n for (const h of this._reconnectHandlers) {\n try { h(); } catch { /* ignore */ }\n }\n }\n\n /** @internal */\n _onError(msg: Record<string, unknown>): void {\n const reason = String(msg.reason ?? msg.message ?? 'unknown error');\n this._endedReason = reason;\n this._resolveEnded(reason);\n this._rejectAllPending(new SessionEnded(reason));\n this._cleanup();\n }\n\n /** @internal */\n _onUserEvents(msg: Record<string, unknown>): void {\n const events = (msg.events ?? []) as Record<string, unknown>[];\n for (const h of this._userEventHandlers) {\n try { h(events); } catch { /* ignore */ }\n }\n }\n\n /** @internal */\n _onChatMessage(payload: Record<string, unknown>): void {\n this.chat._onMessage(payload);\n }\n\n /** @internal */\n _onChatRead(payload: Record<string, unknown>): void {\n this.chat._onRead(payload);\n }\n\n /** @internal */\n _onChatSendAck(msg: Record<string, unknown>): void {\n this.chat._onSendAck(msg);\n }\n\n /** @internal */\n _onChatSendError(msg: Record<string, unknown>): void {\n this.chat._onSendError(msg);\n }\n\n private _rejectAllPending(err: Error): void {\n for (const [id, pending] of this._pendingCdp) {\n clearTimeout(pending.timer);\n pending.reject(err);\n }\n this._pendingCdp.clear();\n }\n\n private _cleanup(): void {\n this._client._activeBrowsers.delete(this.sessionId);\n }\n}\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { TimeoutError, ChatSendFailed } from './errors.js';\nimport type { ChatMessage, ReadReceipt, ChatHistoryOptions } from './types.js';\nimport type { Browser } from './browser.js';\n\ntype MessageHandler = (msg: ChatMessage) => void | Promise<void>;\ntype ReadHandler = (receipt: ReadReceipt) => void | Promise<void>;\n\ninterface PendingSend {\n resolve: (value: { messageId: string; sentAt: string }) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst MAX_IMAGE_SIZE = 5 * 1024 * 1024; // 5MB\n\nfunction detectMime(buf: Buffer): { mime: string; ext: string } {\n if (buf.length >= 4 && buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47) {\n return { mime: 'image/png', ext: 'png' };\n }\n if (buf.length >= 3 && buf[0] === 0xff && buf[1] === 0xd8 && buf[2] === 0xff) {\n return { mime: 'image/jpeg', ext: 'jpg' };\n }\n if (buf.length >= 12 && buf[0] === 0x52 && buf[1] === 0x49 && buf[2] === 0x46 && buf[3] === 0x46\n && buf[8] === 0x57 && buf[9] === 0x45 && buf[10] === 0x42 && buf[11] === 0x50) {\n return { mime: 'image/webp', ext: 'webp' };\n }\n return { mime: 'application/octet-stream', ext: 'bin' };\n}\n\nfunction randomHex(len: number): string {\n return crypto.randomBytes(len / 2).toString('hex');\n}\n\nexport class BrowserChat {\n private _browser: Browser;\n private _topicId: string | null;\n private _messageHandlers: MessageHandler[] = [];\n private _readHandlers: ReadHandler[] = [];\n private _pendingSends: Map<string, PendingSend> = new Map();\n /** @internal */ _actionCallbacks: Map<number, (action: Record<string, unknown>) => void> = new Map();\n\n constructor(browser: Browser) {\n this._browser = browser;\n this._topicId = browser.chatTopicId;\n }\n\n get topicId(): string | null {\n return this._topicId;\n }\n\n async send(text: string): Promise<{ messageId: string; sentAt: string }> {\n const clientMsgId = randomHex(32);\n const msg = {\n type: 'chat.send' as const,\n session_id: this._browser.sessionId,\n client_msg_id: clientMsgId,\n text,\n };\n\n return new Promise<{ messageId: string; sentAt: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingSends.delete(clientMsgId);\n reject(new TimeoutError('Chat send timed out'));\n }, 15000);\n this._pendingSends.set(clientMsgId, { resolve, reject, timer });\n this._browser._sendRaw(msg);\n });\n }\n\n async sendImage(source: string | Buffer, text?: string): Promise<{ messageId: string; sentAt: string }> {\n let buf: Buffer;\n let filename: string;\n\n if (typeof source === 'string') {\n buf = fs.readFileSync(source);\n filename = path.basename(source);\n } else {\n buf = Buffer.isBuffer(source) ? source : Buffer.from(source);\n filename = 'image';\n }\n\n if (buf.length > MAX_IMAGE_SIZE) {\n throw new Error(`Image too large: ${buf.length} bytes (max ${MAX_IMAGE_SIZE})`);\n }\n\n const { mime, ext } = detectMime(buf);\n if (!filename.includes('.')) {\n filename = `${filename}.${ext}`;\n }\n\n const clientMsgId = randomHex(32);\n const data_b64 = buf.toString('base64');\n\n const msg: Record<string, unknown> = {\n type: 'chat.send_image',\n session_id: this._browser.sessionId,\n client_msg_id: clientMsgId,\n filename,\n mime,\n data_b64,\n };\n if (text) msg.text = text;\n\n return new Promise<{ messageId: string; sentAt: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingSends.delete(clientMsgId);\n reject(new TimeoutError('Chat sendImage timed out'));\n }, 15000);\n this._pendingSends.set(clientMsgId, { resolve, reject, timer });\n this._browser._sendRaw(msg);\n });\n }\n\n onMessage(cb: MessageHandler): void {\n this._messageHandlers.push(cb);\n }\n\n onRead(cb: ReadHandler): void {\n this._readHandlers.push(cb);\n }\n\n async history(opts?: ChatHistoryOptions): Promise<ChatMessage[]> {\n if (!this._topicId) return [];\n\n const params = new URLSearchParams();\n params.set('topic_id', this._topicId);\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.beforeId) params.set('before', opts.beforeId);\n if (opts?.since) params.set('since', opts.since);\n\n const url = `${this._browser._chatUrl}/messages?${params.toString()}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._browser._apiKey}`,\n };\n\n const basicAuth = this._browser._basicAuth;\n if (basicAuth) {\n const encoded = Buffer.from(`${basicAuth[0]}:${basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n\n const resp = await fetch(url, { headers });\n if (!resp.ok) {\n throw new Error(`Chat history request failed: ${resp.status} ${resp.statusText}`);\n }\n\n const body = await resp.json() as Record<string, unknown>;\n const messages = (body.messages ?? body.data ?? body) as Record<string, unknown>[];\n if (!Array.isArray(messages)) return [];\n\n return messages.map(parseChatMessage);\n }\n\n /** @internal */\n _onMessage(payload: Record<string, unknown>): void {\n const msgData = (payload.message ?? payload) as Record<string, unknown>;\n if (msgData.type === 'action' && msgData.action) {\n const action = msgData.action as Record<string, unknown>;\n const eventId = Number(action.event_id);\n if (eventId && this._actionCallbacks.has(eventId)) {\n this._actionCallbacks.get(eventId)!(action);\n }\n }\n const msg = parseChatMessage(msgData);\n for (const h of this._messageHandlers) {\n try {\n const result = h(msg);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch(() => {});\n }\n } catch {\n // handler errors should not break dispatch\n }\n }\n }\n\n /** @internal */\n _onRead(payload: Record<string, unknown>): void {\n const receipt: ReadReceipt = {\n topic_id: String(payload.topic_id ?? this._topicId ?? ''),\n last_read_message_id: String(payload.last_read_message_id ?? ''),\n read_at: Number(payload.read_at ?? 0),\n };\n for (const h of this._readHandlers) {\n try {\n const result = h(receipt);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch(() => {});\n }\n } catch {\n // handler errors should not break dispatch\n }\n }\n }\n\n /** @internal */\n _onSendAck(msg: Record<string, unknown>): void {\n const clientMsgId = String(msg.client_msg_id ?? '');\n const pending = this._pendingSends.get(clientMsgId);\n if (!pending) return;\n clearTimeout(pending.timer);\n this._pendingSends.delete(clientMsgId);\n pending.resolve({\n messageId: String(msg.message_id ?? ''),\n sentAt: String(msg.sent_at ?? ''),\n });\n }\n\n /** @internal */\n _onSendError(msg: Record<string, unknown>): void {\n const clientMsgId = String(msg.client_msg_id ?? '');\n const pending = this._pendingSends.get(clientMsgId);\n if (!pending) return;\n clearTimeout(pending.timer);\n this._pendingSends.delete(clientMsgId);\n pending.reject(new ChatSendFailed(\n Number(msg.status ?? 0),\n String(msg.message ?? ''),\n ));\n }\n}\n\nfunction parseChatMessage(data: Record<string, unknown>): ChatMessage {\n const action = data.action as Record<string, unknown> | undefined;\n return {\n id: String(data.id ?? data._id ?? data.message_id ?? ''),\n topic_id: String(data.topic_id ?? ''),\n sender_id: data.sender_id != null ? Number(data.sender_id) : null,\n text: data.text != null ? String(data.text) : null,\n media: (data.media as Record<string, unknown>[] | null) ?? null,\n type: String(data.type ?? 'text'),\n created_at: String(data.created_at ?? ''),\n edited_at: data.edited_at != null ? String(data.edited_at) : null,\n deleted_at: data.deleted_at != null ? String(data.deleted_at) : null,\n action: action ? {\n kind: String(action.kind ?? ''),\n event_id: Number(action.event_id ?? 0),\n data: (action.data as Record<string, unknown>) ?? undefined,\n } : null,\n };\n}\n","import type { Browser } from './browser.js';\nimport type { Profile, ProfileExportOptions } from './types.js';\n\nexport class BrowserProfile {\n private _browser: Browser;\n\n constructor(browser: Browser) {\n this._browser = browser;\n }\n\n async export(opts?: ProfileExportOptions): Promise<Profile> {\n // 1. Try fingerprint (graceful fail)\n let fingerprint: Record<string, unknown> | null = null;\n try {\n const fpResult = await this._browser.send({ method: 'Browser.getFingerprint' });\n fingerprint = (fpResult as Record<string, unknown>) ?? null;\n } catch {\n fingerprint = null;\n }\n\n // 2. Get cookies\n let cookies: Record<string, unknown>[] = [];\n try {\n const cookieResult = await this._browser.send({ method: 'Network.getCookies' }) as Record<string, unknown>;\n const allCookies = (cookieResult?.cookies ?? []) as Record<string, unknown>[];\n\n if (opts?.domains && opts.domains.length > 0) {\n const domainSet = new Set(opts.domains.map(d => d.toLowerCase()));\n cookies = allCookies.filter(c => {\n const cookieDomain = String(c.domain ?? '').toLowerCase().replace(/^\\./, '');\n return domainSet.has(cookieDomain) || opts!.domains!.some(d =>\n cookieDomain.endsWith('.' + d.toLowerCase()) || cookieDomain === d.toLowerCase()\n );\n });\n } else {\n cookies = allCookies;\n }\n } catch {\n cookies = [];\n }\n\n // 3. Get localStorage\n let localStorage: Record<string, string> = {};\n try {\n const lsResult = await this._browser.send({\n method: 'Runtime.evaluate',\n params: { expression: 'JSON.stringify(localStorage)', returnByValue: true },\n }) as Record<string, unknown>;\n const resultObj = lsResult?.result as Record<string, unknown> | undefined;\n if (resultObj?.value) {\n localStorage = JSON.parse(String(resultObj.value)) as Record<string, string>;\n }\n } catch {\n localStorage = {};\n }\n\n // 4. Get sessionStorage\n let sessionStorage: Record<string, string> = {};\n if (opts?.includeSessionStorage !== false) {\n try {\n const ssResult = await this._browser.send({\n method: 'Runtime.evaluate',\n params: { expression: 'JSON.stringify(sessionStorage)', returnByValue: true },\n }) as Record<string, unknown>;\n const resultObj = ssResult?.result as Record<string, unknown> | undefined;\n if (resultObj?.value) {\n sessionStorage = JSON.parse(String(resultObj.value)) as Record<string, string>;\n }\n } catch {\n sessionStorage = {};\n }\n }\n\n // 5. Get origin\n let origin = '';\n try {\n const originResult = await this._browser.send({\n method: 'Runtime.evaluate',\n params: { expression: 'location.origin', returnByValue: true },\n }) as Record<string, unknown>;\n const resultObj = originResult?.result as Record<string, unknown> | undefined;\n if (resultObj?.value) {\n origin = String(resultObj.value);\n }\n } catch {\n origin = '';\n }\n\n return {\n schema_version: 2,\n fingerprint,\n origin,\n cookies,\n localStorage,\n sessionStorage,\n };\n }\n\n async import(profile: Profile): Promise<void> {\n if (profile.schema_version !== 1 && profile.schema_version !== 2) {\n throw new Error(`Unsupported profile schema_version: ${profile.schema_version}`);\n }\n\n // Set cookies\n if (profile.cookies && profile.cookies.length > 0) {\n await this._browser.send({\n method: 'Network.setCookies',\n params: { cookies: profile.cookies },\n });\n }\n\n // Inject localStorage\n if (profile.localStorage && Object.keys(profile.localStorage).length > 0) {\n const entries = JSON.stringify(profile.localStorage);\n await this._browser.send({\n method: 'Runtime.evaluate',\n params: {\n expression: `(function(){var d=${entries};for(var k in d)localStorage.setItem(k,d[k])})()`,\n returnByValue: true,\n },\n });\n }\n\n // Inject sessionStorage\n if (profile.sessionStorage && Object.keys(profile.sessionStorage).length > 0) {\n const entries = JSON.stringify(profile.sessionStorage);\n await this._browser.send({\n method: 'Runtime.evaluate',\n params: {\n expression: `(function(){var d=${entries};for(var k in d)sessionStorage.setItem(k,d[k])})()`,\n returnByValue: true,\n },\n });\n }\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nconst STATE_DIR = path.join(os.homedir(), '.ceki', 'sessions');\n\nfunction statePath(sid: string): string {\n return path.join(STATE_DIR, `${sid}.json`);\n}\n\nexport function loadSession(sid: string): Record<string, unknown> | null {\n try {\n const raw = fs.readFileSync(statePath(sid), 'utf-8');\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function saveSession(sid: string, data: Record<string, unknown>): void {\n fs.mkdirSync(STATE_DIR, { recursive: true });\n const payload = { ...data, updated_at: new Date().toISOString() };\n fs.writeFileSync(statePath(sid), JSON.stringify(payload, null, 2), 'utf-8');\n}\n\nexport function deleteSession(sid: string): void {\n try {\n fs.unlinkSync(statePath(sid));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n}\n\nexport function getLastSeenTs(sid: string): string | null {\n const data = loadSession(sid);\n if (!data) return null;\n return (data.last_seen_ts as string) ?? null;\n}\n\nexport function updateLastSeenTs(sid: string, ts: string): void {\n const data = loadSession(sid) ?? {};\n data.last_seen_ts = ts;\n saveSession(sid, data);\n}\n","export interface KeyMapping {\n code: string;\n key: string;\n vk: number;\n needsShift: boolean;\n}\n\nconst STATIC_MAP: Record<string, KeyMapping> = {\n ' ': { code: 'Space', key: ' ', vk: 32, needsShift: false },\n '\\n': { code: 'Enter', key: 'Enter', vk: 13, needsShift: false },\n '\\t': { code: 'Tab', key: 'Tab', vk: 9, needsShift: false },\n\n // Shifted digits\n '!': { code: 'Digit1', key: '!', vk: 49, needsShift: true },\n '@': { code: 'Digit2', key: '@', vk: 50, needsShift: true },\n '#': { code: 'Digit3', key: '#', vk: 51, needsShift: true },\n '$': { code: 'Digit4', key: '$', vk: 52, needsShift: true },\n '%': { code: 'Digit5', key: '%', vk: 53, needsShift: true },\n '^': { code: 'Digit6', key: '^', vk: 54, needsShift: true },\n '&': { code: 'Digit7', key: '&', vk: 55, needsShift: true },\n '*': { code: 'Digit8', key: '*', vk: 56, needsShift: true },\n '(': { code: 'Digit9', key: '(', vk: 57, needsShift: true },\n ')': { code: 'Digit0', key: ')', vk: 48, needsShift: true },\n\n // Punctuation (unshifted)\n '-': { code: 'Minus', key: '-', vk: 189, needsShift: false },\n '=': { code: 'Equal', key: '=', vk: 187, needsShift: false },\n '[': { code: 'BracketLeft', key: '[', vk: 219, needsShift: false },\n ']': { code: 'BracketRight', key: ']', vk: 221, needsShift: false },\n '\\\\': { code: 'Backslash', key: '\\\\', vk: 220, needsShift: false },\n ';': { code: 'Semicolon', key: ';', vk: 186, needsShift: false },\n \"'\": { code: 'Quote', key: \"'\", vk: 222, needsShift: false },\n ',': { code: 'Comma', key: ',', vk: 188, needsShift: false },\n '.': { code: 'Period', key: '.', vk: 190, needsShift: false },\n '/': { code: 'Slash', key: '/', vk: 191, needsShift: false },\n '`': { code: 'Backquote', key: '`', vk: 192, needsShift: false },\n\n // Punctuation (shifted)\n '_': { code: 'Minus', key: '_', vk: 189, needsShift: true },\n '+': { code: 'Equal', key: '+', vk: 187, needsShift: true },\n '{': { code: 'BracketLeft', key: '{', vk: 219, needsShift: true },\n '}': { code: 'BracketRight', key: '}', vk: 221, needsShift: true },\n '|': { code: 'Backslash', key: '|', vk: 220, needsShift: true },\n ':': { code: 'Semicolon', key: ':', vk: 186, needsShift: true },\n '\"': { code: 'Quote', key: '\"', vk: 222, needsShift: true },\n '<': { code: 'Comma', key: '<', vk: 188, needsShift: true },\n '>': { code: 'Period', key: '>', vk: 190, needsShift: true },\n '?': { code: 'Slash', key: '?', vk: 191, needsShift: true },\n '~': { code: 'Backquote', key: '~', vk: 192, needsShift: true },\n};\n\nexport function keymapForChar(char: string): KeyMapping | null {\n // a-z\n if (char >= 'a' && char <= 'z') {\n const upper = char.toUpperCase();\n return {\n code: `Key${upper}`,\n key: char,\n vk: upper.charCodeAt(0),\n needsShift: false,\n };\n }\n\n // A-Z\n if (char >= 'A' && char <= 'Z') {\n return {\n code: `Key${char}`,\n key: char,\n vk: char.charCodeAt(0),\n needsShift: true,\n };\n }\n\n // 0-9\n if (char >= '0' && char <= '9') {\n return {\n code: `Digit${char}`,\n key: char,\n vk: char.charCodeAt(0),\n needsShift: false,\n };\n }\n\n // Static map\n const mapping = STATIC_MAP[char];\n if (mapping) return mapping;\n\n // Non-ASCII or unknown — fallback\n return null;\n}\n","import { HumanProfile } from './profile.js';\n\nfunction seededRandom(seed: number | null): () => number {\n if (seed === null || seed === undefined) {\n return Math.random;\n }\n let s = seed;\n return () => {\n s = (s * 1664525 + 1013904223) & 0xffffffff;\n return (s >>> 0) / 0xffffffff;\n };\n}\n\nfunction gaussianRandom(rng: () => number, mean: number, sigma: number): number {\n let u1: number, u2: number;\n do { u1 = rng(); } while (u1 === 0);\n u2 = rng();\n const z = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math.PI * u2);\n return mean + z * sigma;\n}\n\nexport class Humanizer {\n readonly profile: HumanProfile;\n private _rng: () => number;\n\n constructor(profile: HumanProfile) {\n this.profile = profile;\n this._rng = seededRandom(profile.raw.rng_seed ?? null);\n }\n\n async before(action: string): Promise<void> {\n const [lo, hi] = this.profile.getRange(action, 'pre');\n if (lo === 0 && hi === 0) return;\n const delay = lo + this._rng() * (hi - lo);\n await sleep(delay);\n }\n\n async after(action: string): Promise<void> {\n const [lo, hi] = this.profile.getRange(action, 'post');\n if (lo === 0 && hi === 0) return;\n const delay = lo + this._rng() * (hi - lo);\n await sleep(delay);\n }\n\n typeDelay(): number {\n const typing = this.profile.raw.typing ?? {};\n const wpm = typing.wpm ?? 110;\n const jitter = typing.jitter ?? 0.35;\n const thinkProb = typing.thinking_pause_prob ?? 0;\n const thinkMs = typing.thinking_pause_ms ?? [300, 1200];\n\n const meanInterval = 60_000 / (wpm * 5);\n const sigma = meanInterval * jitter;\n\n let delay = gaussianRandom(this._rng, meanInterval, sigma);\n delay = Math.max(delay, 20);\n\n if (thinkProb > 0 && this._rng() < thinkProb) {\n delay += thinkMs[0] + this._rng() * (thinkMs[1] - thinkMs[0]);\n }\n\n return delay;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import * as fs from 'node:fs';\n\nexport interface HumanProfileRaw {\n version?: number;\n name?: string;\n typing?: {\n wpm?: number;\n jitter?: number;\n thinking_pause_prob?: number;\n thinking_pause_ms?: [number, number];\n typo_prob?: number;\n };\n pre_action_ms?: Record<string, [number, number]>;\n post_action_ms?: Record<string, [number, number]>;\n mouse?: {\n move_before_click?: boolean;\n trajectory?: string;\n };\n rng_seed?: number | null;\n}\n\nconst PRESETS: Record<string, HumanProfileRaw> = {\n natural: {\n version: 1,\n name: 'natural',\n typing: { wpm: 110, jitter: 0.35, thinking_pause_prob: 0.012, thinking_pause_ms: [300, 1200], typo_prob: 0.0 },\n pre_action_ms: { click: [80, 350], type: [120, 500], scroll: [50, 250], navigate: [0, 0], screenshot: [0, 0] },\n post_action_ms: { click: [150, 800], type: [150, 800], scroll: [200, 900], navigate: [400, 1800], screenshot: [0, 0] },\n mouse: { move_before_click: false, trajectory: 'off' },\n rng_seed: null,\n },\n careful: {\n version: 1,\n name: 'careful',\n typing: { wpm: 80, jitter: 0.4, thinking_pause_prob: 0.025, thinking_pause_ms: [400, 1800], typo_prob: 0.0 },\n pre_action_ms: { click: [200, 600], type: [250, 800], scroll: [100, 400], navigate: [0, 0], screenshot: [0, 0] },\n post_action_ms: { click: [400, 1500], type: [300, 1200], scroll: [300, 1200], navigate: [800, 3000], screenshot: [0, 0] },\n mouse: { move_before_click: false, trajectory: 'off' },\n rng_seed: null,\n },\n};\n\nconst DEFAULTS: HumanProfileRaw = {\n version: 1,\n name: 'custom',\n typing: {\n wpm: 110,\n jitter: 0.35,\n thinking_pause_prob: 0.012,\n thinking_pause_ms: [300, 1200],\n typo_prob: 0.0,\n },\n pre_action_ms: {\n click: [80, 350],\n type: [120, 500],\n scroll: [50, 250],\n navigate: [0, 0],\n screenshot: [0, 0],\n },\n post_action_ms: {\n click: [150, 800],\n type: [150, 800],\n scroll: [200, 900],\n navigate: [400, 1800],\n screenshot: [0, 0],\n },\n mouse: {\n move_before_click: false,\n trajectory: 'off',\n },\n rng_seed: null,\n};\n\nfunction deepMerge(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n if (\n key in result &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key]) &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport class HumanProfile {\n readonly name: string;\n readonly raw: HumanProfileRaw;\n\n constructor(name: string, raw: HumanProfileRaw) {\n this.name = name;\n this.raw = raw;\n }\n\n static fromDict(d: Record<string, unknown>): HumanProfile {\n const merged = deepMerge(\n DEFAULTS as unknown as Record<string, unknown>,\n d,\n ) as HumanProfileRaw;\n const name = (d.name as string) ?? 'custom';\n merged.name = name;\n return new HumanProfile(name, merged);\n }\n\n static load(filePath: string): HumanProfile {\n const raw = fs.readFileSync(filePath, 'utf-8');\n const data = JSON.parse(raw) as Record<string, unknown>;\n return HumanProfile.fromDict(data);\n }\n\n static loadPreset(name: string): HumanProfile {\n const preset = PRESETS[name];\n if (!preset) {\n throw new Error(`Preset '${name}' not found. Available: ${Object.keys(PRESETS).join(', ')}`);\n }\n return HumanProfile.fromDict(preset as unknown as Record<string, unknown>);\n }\n\n getRange(action: string, phase: 'pre' | 'post'): [number, number] {\n const key = `${phase}_action_ms` as keyof HumanProfileRaw;\n const mapping = this.raw[key] as Record<string, [number, number]> | undefined;\n const pair = mapping?.[action];\n if (Array.isArray(pair) && pair.length === 2) {\n return [pair[0], pair[1]];\n }\n return [0, 0];\n }\n\n typingInterval(): number {\n const wpm = this.raw.typing?.wpm ?? 110;\n return 60_000 / (wpm * 5);\n }\n\n toDict(): HumanProfileRaw {\n return JSON.parse(JSON.stringify(this.raw)) as HumanProfileRaw;\n }\n\n toJSON(indent = 2): string {\n return JSON.stringify(this.raw, null, indent);\n }\n}\n"],"mappings":"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","names":["fs","path","resolve","mime","fs","path","err","resolve","mime","fs","path","err","resolve","fs","resolve","err","resolve","msg","mime"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/client.ts","../src/config.ts","../src/errors.ts","../src/browser.ts","../src/chat.ts","../src/profile.ts","../src/state.ts","../src/humanize/keymap.ts","../src/humanize/humanizer.ts","../src/humanize/profile.ts","../src/contract.ts","../src/timelog.ts","../src/contract-cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { connect } from './client.js';\nimport {\n CekiBrowserError,\n AuthError,\n CaptchaTimeoutError,\n SessionNotFound,\n SessionExpired,\n NotOwner,\n TimeoutError,\n ConnectionLost,\n TransportError,\n} from './errors.js';\nimport { saveSession, loadSession, deleteSession, getLastSeenTs, updateLastSeenTs } from './state.js';\nimport type { ConnectOptions, ChatMessage } from './types.js';\nimport type { Client } from './client.js';\nimport type { Browser } from './browser.js';\nimport { cmdContract, cmdTimelog } from './contract-cli.js';\n\nfunction out(data: unknown): void {\n process.stdout.write(JSON.stringify(data) + '\\n');\n}\n\nfunction err(error: string, code = 'error'): void {\n process.stderr.write(JSON.stringify({ error, code }) + '\\n');\n}\n\nfunction getApiKey(): string {\n const key = process.env.CEKI_API_KEY;\n if (!key) {\n err('CEKI_API_KEY not set', 'auth');\n process.exit(2);\n }\n return key;\n}\n\nfunction connectOptions(): Partial<ConnectOptions> {\n return { reconnect: false };\n}\n\nasync function resumeBrowser(apiKey: string, sessionId: string): Promise<[Client, Browser]> {\n const client = await connect(apiKey, connectOptions());\n const browser = await client.resume(sessionId, { human: null });\n return [client, browser];\n}\n\nasync function closeClient(client: Client): Promise<void> {\n try { await client.disconnect(); } catch { /* ignore */ }\n}\n\nfunction parseBool(val: string): boolean {\n return val === 'true' || val === '1' || val === 'yes';\n}\n\n// --- Command handlers ---\n\nasync function cmdRent(args: string[]): Promise<void> {\n let scheduleId: number | null = null;\n let fingerprintFrom: string | null = null;\n let mode: 'incognito' | 'main' = 'incognito';\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--schedule' && args[i + 1]) scheduleId = parseInt(args[++i], 10);\n if (args[i] === '--fingerprint-from' && args[i + 1]) fingerprintFrom = args[++i];\n if (args[i] === '--mode' && args[i + 1]) {\n const v = args[++i];\n if (v !== 'incognito' && v !== 'main') {\n err('invalid mode, must be incognito or main', 'args');\n process.exit(1);\n }\n mode = v;\n }\n }\n if (scheduleId == null) {\n err('--schedule is required', 'args');\n process.exit(1);\n }\n\n const apiKey = getApiKey();\n let fpData: boolean | Record<string, unknown> = true;\n if (fingerprintFrom) {\n const profile = JSON.parse(fs.readFileSync(fingerprintFrom, 'utf-8'));\n fpData = profile.fingerprint || true;\n }\n\n const client = await connect(apiKey, connectOptions());\n try {\n const browser = await client.rent(scheduleId, { human: null, fingerprint: fpData, mode });\n saveSession(browser.sessionId, {\n session_id: browser.sessionId,\n chat_topic_id: browser.chatTopicId,\n schedule_id: browser.scheduleId,\n last_seen_ts: null,\n });\n out({\n session_id: browser.sessionId,\n chat_topic_id: browser.chatTopicId,\n schedule_id: browser.scheduleId,\n });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdSearch(args: string[]): Promise<void> {\n let limit = 20;\n const filters: Record<string, string> = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--limit' && args[i + 1]) limit = parseInt(args[++i], 10);\n if (args[i] === '--filter' && args[i + 1]) {\n const [k, ...v] = args[++i].split('=');\n filters[k] = v.join('=');\n }\n }\n\n const apiKey = getApiKey();\n const client = await connect(apiKey, connectOptions());\n try {\n const results = await client.search(filters, limit);\n out(results);\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdSessions(args: string[]): Promise<void> {\n let showAll = false;\n let limit = 50;\n let jsonOutput = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--all') showAll = true;\n else if (args[i] === '--json') jsonOutput = true;\n else if (args[i] === '--limit' && args[i + 1]) limit = Number(args[++i]);\n }\n const apiKey = getApiKey();\n const client = await connect(apiKey, connectOptions());\n try {\n const results = await client.listSessions({ active: !showAll, limit });\n if (jsonOutput) {\n out(results);\n } else {\n if (!results.length) {\n process.stdout.write('No sessions found.\\n');\n return;\n }\n const header = 'SID'.padEnd(8) + 'SCHEDULE'.padEnd(10) + 'STARTED'.padEnd(22) + 'DURATION'.padEnd(10) + 'EARNED'.padEnd(9) + 'STATUS'.padEnd(10) + 'RENTER'.padEnd(16) + 'PROVIDER';\n process.stdout.write(header + '\\n');\n for (const s of results) {\n const started = s.started_at ?? '—';\n const mins = Math.floor(s.duration / 60);\n const secs = s.duration % 60;\n const dur = `${mins}:${String(secs).padStart(2, '0')}`;\n const earned = `$${s.earned.toFixed(2)}`;\n const renter = (s.renter as Record<string, string>)?.name ?? '—';\n const provider = (s.provider as Record<string, string>)?.name ?? '—';\n const line = String(s.id).padEnd(8) + String(s.schedule_id).padEnd(10) + started.padEnd(22) + dur.padEnd(10) + earned.padEnd(9) + s.status.padEnd(10) + renter.padEnd(16) + provider;\n process.stdout.write(line + '\\n');\n }\n }\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdMyBrowsers(): Promise<void> {\n const apiKey = getApiKey();\n const client = await connect(apiKey, connectOptions());\n try {\n const results = await client.myBrowsers();\n out(results);\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdSnapshot(sid: string, args: string[]): Promise<void> {\n let outputPath: string | null = null;\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '-o' || args[i] === '--output') && args[i + 1]) outputPath = args[++i];\n }\n if (!outputPath) {\n err('-o/--output is required', 'args');\n process.exit(1);\n }\n\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const lastSeen = getLastSeenTs(sid);\n browser._lastSeenTs = lastSeen;\n const snap = await browser.snapshot();\n const pngBuf = Buffer.from(snap.screenshot, 'base64');\n fs.writeFileSync(outputPath, pngBuf);\n if (browser._lastSeenTs) {\n updateLastSeenTs(sid, browser._lastSeenTs);\n }\n const chatList = snap.chat.map((m: ChatMessage) => ({\n from: m.sender_id,\n text: m.text,\n ts: m.created_at,\n }));\n out({ screenshot: outputPath, chat: chatList, ts: snap.ts.toISOString() });\n } finally {\n await closeClient(client);\n }\n}\n\nfunction parseNoHuman(args: string[]): boolean {\n return args.includes('--no-human') || args.includes('--raw');\n}\n\nasync function cmdNavigate(sid: string, args: string[]): Promise<void> {\n const url = args.find((a) => !a.startsWith('--'));\n if (!url) {\n err('URL is required', 'args');\n process.exit(1);\n }\n const raw = parseNoHuman(args);\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.navigate(url, 30000, raw ? { human: false } : undefined);\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdClick(sid: string, args: string[]): Promise<void> {\n const positional = args.filter((a) => !a.startsWith('--'));\n const x = parseInt(positional[0], 10);\n const y = parseInt(positional[1], 10);\n if (isNaN(x) || isNaN(y)) {\n err('x and y coordinates are required', 'args');\n process.exit(1);\n }\n const raw = parseNoHuman(args);\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.click(x, y, raw ? { human: false } : undefined);\n out({ ok: true, pointer: [x, y] });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdType(sid: string, args: string[]): Promise<void> {\n // task 429/431 — typing is humanized BY DEFAULT in both modes. --no-human\n // (or --raw) flattens THIS call only. --natural is a no-op alias kept for\n // backwards compatibility.\n let text = '';\n let raw = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--no-human' || args[i] === '--raw') raw = true;\n else if (args[i] === '--natural') { /* no-op alias */ }\n else if (!text) text = args[i];\n }\n if (!text) {\n err('text is required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const client = await connect(apiKey, connectOptions());\n try {\n const browser = await client.resume(sid);\n await browser.type(text, raw ? { human: false } : undefined);\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdScroll(sid: string, args: string[]): Promise<void> {\n const positional = args.filter((a) => !a.startsWith('--'));\n const x = parseInt(positional[0], 10);\n const y = parseInt(positional[1], 10);\n const dy = parseInt(positional[2], 10);\n if (isNaN(x) || isNaN(y) || isNaN(dy)) {\n err('x, y, dy are required', 'args');\n process.exit(1);\n }\n const raw = parseNoHuman(args);\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const scrollOpts: Record<string, unknown> = { x, y, deltaY: dy };\n if (raw) scrollOpts.human = false;\n await browser.scroll(scrollOpts);\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdChat(sid: string, action: string, args: string[]): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n switch (action) {\n case 'send': {\n const text = args[0];\n if (!text) {\n err('text is required', 'args');\n process.exit(1);\n }\n const result = await browser.chat.send(text);\n out({ ok: true, message_id: result.messageId });\n break;\n }\n case 'send-image': {\n let imagePath: string | null = null;\n let text: string | undefined;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--image' && args[i + 1]) imagePath = args[++i];\n if (args[i] === '--text' && args[i + 1]) text = args[++i];\n }\n if (!imagePath) {\n err('--image is required', 'args');\n process.exit(1);\n }\n if (text) {\n await browser.chat.send(text);\n }\n const result = await browser.chat.sendImage(imagePath);\n out({ ok: true, message_id: result.messageId });\n break;\n }\n case 'next': {\n let timeout = 60;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--timeout' && args[i + 1]) timeout = parseFloat(args[++i]);\n }\n const lastSeen = getLastSeenTs(sid);\n const msgs = await browser.chat.history({ since: lastSeen ?? undefined });\n if (msgs.length > 0) {\n const m = msgs[0];\n updateLastSeenTs(sid, m.created_at);\n out({ from: m.sender_id, text: m.text, ts: m.created_at });\n } else {\n let resolved = false;\n const waitPromise = new Promise<ChatMessage | null>((resolve) => {\n const timer = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n resolve(null);\n }\n }, timeout * 1000);\n\n browser.chat.onMessage((msg: ChatMessage) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timer);\n resolve(msg);\n }\n });\n });\n\n const msg = await waitPromise;\n if (msg) {\n updateLastSeenTs(sid, msg.created_at);\n out({ from: msg.sender_id, text: msg.text, ts: msg.created_at });\n } else {\n out(null);\n }\n }\n break;\n }\n case 'history': {\n let since: string | undefined;\n let limit = 50;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--since' && args[i + 1]) {\n const val = args[++i];\n const asNum = Number(val);\n if (!isNaN(asNum) && val.match(/^\\d+(\\.\\d+)?$/)) {\n since = new Date(asNum * 1000).toISOString();\n } else {\n since = val;\n }\n }\n if (args[i] === '--limit' && args[i + 1]) limit = parseInt(args[++i], 10);\n }\n const msgs = await browser.chat.history({ since, limit });\n out(msgs.map((m: ChatMessage) => ({ from: m.sender_id, text: m.text, ts: m.created_at })));\n break;\n }\n default:\n err(`Unknown chat action: ${action}`, 'args');\n process.exit(1);\n }\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdStop(sid: string): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.close();\n deleteSession(sid);\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdProfile(sid: string, action: string, args: string[]): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n switch (action) {\n case 'export': {\n let outputPath: string | null = null;\n let domains: string[] | undefined;\n let noSessionStorage = false;\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '-o' || args[i] === '--output') && args[i + 1]) outputPath = args[++i];\n if (args[i] === '--domains' && args[i + 1]) domains = args[++i].split(',').map(d => d.trim());\n if (args[i] === '--no-session-storage') noSessionStorage = true;\n }\n if (!outputPath) {\n err('-o/--output is required', 'args');\n process.exit(1);\n }\n const profile = await browser.profile.export({\n domains,\n includeSessionStorage: !noSessionStorage,\n });\n fs.writeFileSync(outputPath, JSON.stringify(profile, null, 2), 'utf-8');\n out({ ok: true, path: outputPath });\n break;\n }\n case 'import': {\n let inputPath: string | null = null;\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '-i' || args[i] === '--input') && args[i + 1]) inputPath = args[++i];\n }\n if (!inputPath) {\n err('-i/--input is required', 'args');\n process.exit(1);\n }\n const profileData = JSON.parse(fs.readFileSync(inputPath, 'utf-8'));\n await browser.profile.import(profileData);\n out({ ok: true });\n break;\n }\n default:\n err(`Unknown profile action: ${action}`, 'args');\n process.exit(1);\n }\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdWait(sid: string): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const reason = await browser.waitUntilEnded();\n out({ ended: true, reason });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdScreenshot(sid: string, args: string[]): Promise<void> {\n let outputPath: string | null = null;\n let fullPage = false;\n for (let i = 0; i < args.length; i++) {\n if ((args[i] === '-o' || args[i] === '--output') && args[i + 1]) outputPath = args[++i];\n if (args[i] === '--full') fullPage = true;\n }\n if (!outputPath) {\n err('-o/--output is required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const data = await browser.screenshot({ format: 'png', fullPage });\n fs.writeFileSync(outputPath, data as Buffer);\n out({ ok: true, path: outputPath });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdSwitchTab(sid: string): Promise<void> {\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.switchTab();\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdConfigure(sid: string, args: string[]): Promise<void> {\n const opts: Record<string, unknown> = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--masking-mode' && args[i + 1]) opts.maskingMode = parseBool(args[++i]);\n if (args[i] === '--fingerprint' && args[i + 1]) opts.fingerprint = parseBool(args[++i]);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n await browser.configure(opts as { maskingMode?: boolean; fingerprint?: boolean });\n out({ ok: true });\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdCdp(sid: string, args: string[]): Promise<void> {\n let method: string | null = null;\n let params: Record<string, unknown> = {};\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--method' && args[i + 1]) method = args[++i];\n if (args[i] === '--params' && args[i + 1]) params = JSON.parse(args[++i]);\n }\n if (!method) {\n err('--method is required', 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const result = await browser.send({ method, params });\n out(result);\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdRequestCaptcha(sid: string, args: string[]): Promise<void> {\n let acceptance = 60;\n let completion = 120;\n let manual = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--acceptance' && args[i + 1]) acceptance = parseFloat(args[++i]);\n if (args[i] === '--completion' && args[i + 1]) completion = parseFloat(args[++i]);\n if (args[i] === '--manual') manual = true;\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const result = await browser.requestCaptcha({\n acceptanceTimeout: acceptance,\n completionTimeout: completion,\n autoAccept: !manual,\n });\n out({\n solved: result.solved,\n proof_message_id: result.proofMessageId,\n cancel_reason: result.cancelReason,\n child_event_id: result.childEventId,\n correction_id: result.correctionId,\n });\n if (!result.solved) process.exit(1);\n } catch (e) {\n if (e instanceof CaptchaTimeoutError) {\n out({ solved: false, cancel_reason: `timeout:${e.phase}`, child_event_id: null, correction_id: null });\n process.exit(1);\n }\n throw e;\n } finally {\n await closeClient(client);\n }\n}\n\nasync function cmdUpload(sid: string, args: string[]): Promise<void> {\n let selector: string | null = null;\n let filePath: string | null = null;\n let filename: string | undefined;\n let mime: string | undefined;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === '--selector' && args[i + 1]) selector = args[++i];\n if (args[i] === '--file' && args[i + 1]) filePath = args[++i];\n if (args[i] === '--filename' && args[i + 1]) filename = args[++i];\n if (args[i] === '--mime' && args[i + 1]) mime = args[++i];\n }\n if (!selector || !filePath) {\n err('--selector and --file are required', 'args');\n process.exit(1);\n }\n if (!fs.existsSync(filePath)) {\n err(`File not found: ${filePath}`, 'args');\n process.exit(1);\n }\n const apiKey = getApiKey();\n const [client, browser] = await resumeBrowser(apiKey, sid);\n try {\n const result = await browser.upload(selector, filePath, filename, mime);\n out(result);\n } finally {\n await closeClient(client);\n }\n}\n\n// --- Help ---\n\nfunction printHelp(): void {\n console.log(`ceki — CLI for browser.ceki.me rental\n\nUsage: ceki <command> [options]\n\nCommands:\n rent --schedule N [--fingerprint-from PATH]\n my-browsers\n search [--limit N] [--filter k=v]...\n snapshot <sid> -o PATH\n screenshot <sid> -o PATH [--full]\n navigate <sid> <url> [--no-human|--raw]\n click <sid> <x> <y> [--no-human|--raw]\n type <sid> \"<text>\" [--no-human|--raw] (humanized by default)\n scroll <sid> <x> <y> <dy> [--no-human|--raw]\n switch-tab <sid>\n configure <sid> [--masking-mode true|false] [--fingerprint true|false]\n cdp <sid> --method <M> [--params JSON]\n upload <sid> --selector CSS --file PATH [--filename NAME] [--mime TYPE]\n request-captcha <sid> [--acceptance N] [--completion M] [--manual]\n wait <sid>\n chat <sid> send \"<text>\"\n chat <sid> send-image --image PATH [--text \"...\"]\n chat <sid> next [--timeout N]\n chat <sid> history [--since TS] [--limit N]\n profile export <sid> -o file [--domains a,b,c] [--no-session-storage]\n profile import <sid> -i file\n stop <sid>\n\n contract list\n contract members <cid>\n contract tasks [cid] (default: CEKI_CONTRACT_IDS)\n contract my-jobs\n contract task <eid>\n contract children <eid>\n contract history <eid> [--limit N]\n contract create [cid] --label X [--type N] [--status N] [--kal-schedule N]\n [--start S] [--end E] [--timezone TZ] [--date D]\n [--duration N] [--amount N] [--currency C]\n [--benefitable agent:N|user:N]\n [--reviewer agent:N|user:N] [--qa agent:N|user:N]\n [--participant agent:N:reviewer|user:N:qa|agent:N:role:NUM]...\n [--desc text] [--data JSON]\n contract comment <eid> [--label X] [--type N] [--status N] [--start S]\n [--end E] [--date D] [--duration N] [--amount N]\n [--currency C] [--benefitable agent:N] [--desc text]\n contract propose <eid> [--status N] [--label X] [--desc text] [--start S]\n [--end E] [--date D] [--duration N] [--amount N]\n [--currency C] [--benefitable agent:N]\n contract progress <eid> [--status N] --desc TEXT\n contract vote <eid> --ids 1,2,3 --vote true|false\n contract poll\n contract watch [interval]\n contract tools\n contract raw <tool> [JSON]\n\n timelog start <event_id>\n timelog stop <event_id> [--label TEXT]\n timelog check <event_id>\n\nEnvironment:\n CEKI_API_KEY (required)\n CEKI_RELAY_URL (default: wss://browser.ceki.me/ws/agent)\n CEKI_API_URL (default: https://api.ceki.me)\n CEKI_CHAT_URL (default: https://chat.ceki.me/api/chat)\n CEKI_BASIC_AUTH_USER / CEKI_BASIC_AUTH_PASS (optional)\n CEKI_AGENT_TOKEN (contract/timelog; falls back to CEKI_API_KEY)\n CEKI_AGENT_MCP_ENDPOINT (override /mcp/agent endpoint)\n CEKI_CONTRACT_IDS (default contract for 'contract tasks'/'create')\n\nExit codes: 0=success, 1=error, 2=auth, 3=session_not_found, 4=timeout, 5=network`);\n}\n\n// --- Main ---\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n\n if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {\n printHelp();\n process.exit(0);\n }\n\n if (argv[0] === '--version' || argv[0] === '-v') {\n const pkgPath = path.resolve(path.dirname(new URL(import.meta.url).pathname), '..', 'package.json');\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n console.log(pkg.version);\n } catch {\n console.log('unknown');\n }\n process.exit(0);\n }\n\n const command = argv[0];\n const rest = argv.slice(1);\n\n if (command === 'contract') {\n process.exit(await cmdContract(rest));\n }\n if (command === 'timelog') {\n process.exit(await cmdTimelog(rest));\n }\n\n switch (command) {\n case 'rent':\n await cmdRent(rest);\n break;\n case 'search':\n await cmdSearch(rest);\n break;\n case 'sessions':\n await cmdSessions(rest);\n break;\n case 'my-browsers':\n await cmdMyBrowsers();\n break;\n case 'snapshot':\n await cmdSnapshot(rest[0], rest.slice(1));\n break;\n case 'navigate':\n await cmdNavigate(rest[0], rest.slice(1));\n break;\n case 'click':\n await cmdClick(rest[0], rest.slice(1));\n break;\n case 'type':\n await cmdType(rest[0], rest.slice(1));\n break;\n case 'scroll':\n await cmdScroll(rest[0], rest.slice(1));\n break;\n case 'switch-tab':\n await cmdSwitchTab(rest[0]);\n break;\n case 'configure':\n await cmdConfigure(rest[0], rest.slice(1));\n break;\n case 'cdp':\n await cmdCdp(rest[0], rest.slice(1));\n break;\n case 'upload':\n await cmdUpload(rest[0], rest.slice(1));\n break;\n case 'request-captcha':\n await cmdRequestCaptcha(rest[0], rest.slice(1));\n break;\n case 'wait':\n await cmdWait(rest[0]);\n break;\n case 'stop':\n await cmdStop(rest[0]);\n break;\n case 'screenshot':\n await cmdScreenshot(rest[0], rest.slice(1));\n break;\n case 'chat':\n if (rest.length < 2) {\n err('Usage: ceki chat <sid> <action> [args]', 'args');\n process.exit(1);\n }\n await cmdChat(rest[0], rest[1], rest.slice(2));\n break;\n case 'profile':\n if (rest.length < 2) {\n err('Usage: ceki profile export|import <sid> [args]', 'args');\n process.exit(1);\n }\n await cmdProfile(rest[1], rest[0], rest.slice(2));\n break;\n default:\n err(`Unknown command: ${command}`, 'args');\n process.exit(1);\n }\n}\n\nmain().catch((e: unknown) => {\n if (e instanceof SessionExpired || e instanceof SessionNotFound) {\n err(String(e), 'session_not_found');\n process.exit(3);\n }\n if (e instanceof NotOwner) {\n err(String(e), 'not_owner');\n process.exit(3);\n }\n if (e instanceof TimeoutError) {\n err(String(e), 'timeout');\n process.exit(4);\n }\n if (e instanceof ConnectionLost || e instanceof AuthError || e instanceof TransportError) {\n err(String(e), 'network');\n process.exit(5);\n }\n if (e instanceof CekiBrowserError) {\n err(String(e), 'ceki_error');\n process.exit(1);\n }\n err(e instanceof Error ? e.message : String(e), 'error');\n process.exit(1);\n});\n","import WebSocket from 'ws';\nimport { resolveConfig } from './config.js';\nimport {\n CekiBrowserError,\n AuthError,\n SessionNotFound,\n SessionExpired,\n NotOwner,\n TimeoutError,\n SessionEnded,\n InsufficientFunds,\n RateLimitExceeded,\n ConnectionLost,\n ProviderOffline,\n CdpUnrecoverable,\n TransportError,\n} from './errors.js';\nimport { Browser } from './browser.js';\nimport { Humanizer } from './humanize/humanizer.js';\nimport { HumanProfile } from './humanize/profile.js';\nimport type { ConnectOptions, BrowserOption, Match, RentOptions, SessionInfo } from './types.js';\n\nconst BACKOFF_SCHEDULE = [1, 2, 4, 8, 16, 32, 60];\nconst MAX_RECONNECT_ATTEMPTS = 10;\nconst PING_INTERVAL = 30000;\nconst PONG_TIMEOUT = 90000;\n\ninterface PendingRent {\n scheduleId: number;\n eventId: string | null;\n resolve: (match: Match) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n opts?: RentOptions;\n}\n\ninterface PendingResume {\n sessionId: string;\n resolve: (match: Match) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n opts?: RentOptions;\n}\n\nexport class Client {\n /** @internal */ _apiKey: string;\n /** @internal */ _chatUrl: string;\n /** @internal */ _basicAuth: [string, string] | undefined;\n /** @internal */ _activeBrowsers: Map<string, Browser> = new Map();\n\n private _ws: WebSocket | null = null;\n /** @internal */ _apiUrl: string;\n private _relayUrl: string;\n private _reconnect: boolean;\n private _reconnectAttempt = 0;\n private _reconnecting = false;\n private _closed = false;\n\n private _pingTimer: ReturnType<typeof setInterval> | null = null;\n private _pongTimer: ReturnType<typeof setTimeout> | null = null;\n private _lastPongAt = 0;\n\n private _pendingRents: Map<string, PendingRent> = new Map(); // keyed by `rent:<scheduleId>` or eventId\n private _pendingResumes: Map<string, PendingResume> = new Map(); // keyed by sessionId\n\n private _connectResolve: (() => void) | null = null;\n private _connectReject: ((err: Error) => void) | null = null;\n\n constructor(apiKey: string, opts?: Partial<ConnectOptions>) {\n const cfg = resolveConfig(opts);\n this._apiKey = apiKey;\n this._apiUrl = cfg.apiUrl;\n this._relayUrl = cfg.relayUrl;\n this._chatUrl = cfg.chatUrl;\n this._basicAuth = cfg.basicAuth;\n this._reconnect = cfg.reconnect;\n }\n\n /** Factory: create client and connect */\n static async create(apiKey: string, opts?: Partial<ConnectOptions>): Promise<Client> {\n const client = new Client(apiKey, opts);\n await client._connect();\n return client;\n }\n\n /** @internal */\n _wsSend(msg: Record<string, unknown>): void {\n if (!this._ws || this._ws.readyState !== WebSocket.OPEN) {\n throw new ConnectionLost('WebSocket not connected');\n }\n this._ws.send(JSON.stringify(msg));\n }\n\n async search(\n filters?: Record<string, unknown>,\n limit?: number,\n ): Promise<BrowserOption[]> {\n const params = new URLSearchParams();\n if (limit != null) params.set('limit', String(limit));\n if (filters) {\n for (const [key, value] of Object.entries(filters)) {\n if (value != null) params.set(key, String(value));\n }\n }\n\n const url = `${this._apiUrl}/api/browsers/search?${params.toString()}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._apiKey}`,\n };\n if (this._basicAuth) {\n const encoded = Buffer.from(`${this._basicAuth[0]}:${this._basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n\n const resp = await fetch(url, { headers });\n if (!resp.ok) {\n throw new TransportError(`Search request failed: ${resp.status} ${resp.statusText}`);\n }\n const body = await resp.json();\n const data = (body as Record<string, unknown>).data ?? body;\n return (Array.isArray(data) ? data : []) as BrowserOption[];\n }\n\n async listSessions(opts?: { active?: boolean; limit?: number }): Promise<SessionInfo[]> {\n const active = opts?.active ?? true;\n const limit = opts?.limit ?? 50;\n const params = new URLSearchParams({\n active: active ? '1' : '0',\n limit: String(limit),\n });\n const url = `${this._apiUrl}/api/agent/sessions?${params.toString()}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._apiKey}`,\n };\n if (this._basicAuth) {\n const encoded = Buffer.from(`${this._basicAuth[0]}:${this._basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n const resp = await fetch(url, { headers });\n if (!resp.ok) {\n throw new TransportError(`listSessions request failed: ${resp.status} ${resp.statusText}`);\n }\n const body = await resp.json();\n const items = (body as Record<string, unknown>).data ?? body;\n return (Array.isArray(items) ? items : []) as SessionInfo[];\n }\n\n async myBrowsers(): Promise<BrowserOption[]> {\n const url = `${this._apiUrl}/api/agent/browsers`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._apiKey}`,\n };\n if (this._basicAuth) {\n const encoded = Buffer.from(`${this._basicAuth[0]}:${this._basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n const resp = await fetch(url, { headers });\n if (!resp.ok) {\n throw new TransportError(`myBrowsers request failed: ${resp.status} ${resp.statusText}`);\n }\n const body = await resp.json();\n const items = (body as Record<string, unknown>).browsers ?? (body as Record<string, unknown>).data ?? body;\n return (Array.isArray(items) ? items : []) as BrowserOption[];\n }\n\n async rent(scheduleId: number, opts?: RentOptions): Promise<Browser> {\n const rentMsg: Record<string, unknown> = { type: 'rent', browser_id: scheduleId };\n if (opts?.mode) rentMsg.mode = opts.mode;\n this._wsSend(rentMsg);\n\n const key = `rent:${scheduleId}`;\n\n return new Promise<Browser>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingRents.delete(key);\n reject(new TimeoutError('Rent timed out after 90s'));\n }, 90000);\n\n this._pendingRents.set(key, {\n scheduleId,\n eventId: null,\n opts,\n resolve: (match: Match) => {\n const humanizer = this._resolveHumanizer(opts);\n const browser = new Browser(this, match, humanizer);\n this._activeBrowsers.set(browser.sessionId, browser);\n if (opts?.maskingMode) {\n browser.configure({ maskingMode: true }).catch(() => {});\n }\n if (opts?.fingerprint) {\n browser.configure({ fingerprint: opts.fingerprint }).catch(() => {});\n }\n resolve(browser);\n },\n reject,\n timer,\n });\n });\n }\n\n async resume(sessionId: string, opts?: RentOptions): Promise<Browser> {\n this._wsSend({ type: 'resume', session_id: sessionId });\n\n return new Promise<Browser>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingResumes.delete(sessionId);\n reject(new TimeoutError('Resume timed out after 10s'));\n }, 10000);\n\n this._pendingResumes.set(sessionId, {\n sessionId,\n opts,\n resolve: (match: Match) => {\n const humanizer = this._resolveHumanizer(opts);\n const browser = new Browser(this, match, humanizer);\n this._activeBrowsers.set(browser.sessionId, browser);\n resolve(browser);\n },\n reject,\n timer,\n });\n });\n }\n\n async close(): Promise<void> {\n this._closed = true;\n\n // Close all active browsers\n const closePromises: Promise<void>[] = [];\n for (const browser of this._activeBrowsers.values()) {\n closePromises.push(browser.close().catch(() => {}));\n }\n await Promise.allSettled(closePromises);\n\n // Reject pending rents\n for (const [key, pending] of this._pendingRents) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Client closed'));\n }\n this._pendingRents.clear();\n\n // Reject pending resumes\n for (const [key, pending] of this._pendingResumes) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Client closed'));\n }\n this._pendingResumes.clear();\n\n this._stopHeartbeat();\n this._closeWs();\n }\n\n async disconnect(): Promise<void> {\n this._closed = true;\n this._activeBrowsers.clear();\n this._pendingRents.clear();\n this._pendingResumes.clear();\n this._stopHeartbeat();\n this._closeWs();\n }\n\n // --- Private methods ---\n\n private async _connect(): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this._connectResolve = resolve;\n this._connectReject = reject;\n this._openWs();\n });\n }\n\n private _openWs(): void {\n const protocols = [`bearer.${this._apiKey}`];\n this._ws = new WebSocket(this._relayUrl, protocols);\n\n this._ws.on('open', () => {\n this._reconnectAttempt = 0;\n this._reconnecting = false;\n this._lastPongAt = Date.now();\n this._startHeartbeat();\n\n if (this._connectResolve) {\n this._connectResolve();\n this._connectResolve = null;\n this._connectReject = null;\n }\n });\n\n this._ws.on('message', (data: WebSocket.Data) => {\n this._handleMessage(data);\n });\n\n this._ws.on('close', (code: number, reason: Buffer) => {\n this._stopHeartbeat();\n const reasonStr = reason.toString();\n\n if (code === 4401 || code === 4403) {\n const err = new AuthError(reasonStr || `Auth failed (${code})`);\n if (this._connectReject) {\n this._connectReject(err);\n this._connectResolve = null;\n this._connectReject = null;\n }\n return;\n }\n\n if (!this._closed && this._reconnect) {\n this._scheduleReconnect();\n }\n });\n\n this._ws.on('error', (err: Error) => {\n if (this._connectReject) {\n this._connectReject(new TransportError(err.message));\n this._connectResolve = null;\n this._connectReject = null;\n }\n });\n }\n\n private _closeWs(): void {\n if (this._ws) {\n try {\n this._ws.removeAllListeners();\n this._ws.close();\n } catch {\n // ignore close errors\n }\n this._ws = null;\n }\n }\n\n private _scheduleReconnect(): void {\n if (this._closed || this._reconnecting) return;\n if (this._reconnectAttempt >= MAX_RECONNECT_ATTEMPTS) {\n // Reject all pending operations\n const err = new ConnectionLost('Max reconnection attempts exceeded');\n this._rejectAllPending(err);\n return;\n }\n\n this._reconnecting = true;\n const backoffIdx = Math.min(this._reconnectAttempt, BACKOFF_SCHEDULE.length - 1);\n const delay = BACKOFF_SCHEDULE[backoffIdx] * 1000;\n this._reconnectAttempt++;\n\n setTimeout(() => {\n if (this._closed) return;\n this._closeWs();\n this._connectResolve = () => {\n // After reconnect, resume all active browsers\n for (const browser of this._activeBrowsers.values()) {\n this._wsSend({ type: 'resume', session_id: browser.sessionId });\n }\n };\n this._connectReject = () => {\n // Reconnect failed, try again\n this._reconnecting = false;\n this._scheduleReconnect();\n };\n this._openWs();\n }, delay);\n }\n\n private _startHeartbeat(): void {\n this._stopHeartbeat();\n this._pingTimer = setInterval(() => {\n try {\n this._wsSend({ type: 'ping' });\n } catch {\n // If send fails, WS close handler will trigger reconnect\n }\n }, PING_INTERVAL);\n\n this._pongTimer = setTimeout(() => {\n this._checkPongTimeout();\n }, PONG_TIMEOUT);\n }\n\n private _stopHeartbeat(): void {\n if (this._pingTimer) {\n clearInterval(this._pingTimer);\n this._pingTimer = null;\n }\n if (this._pongTimer) {\n clearTimeout(this._pongTimer);\n this._pongTimer = null;\n }\n }\n\n private _checkPongTimeout(): void {\n if (this._closed) return;\n const elapsed = Date.now() - this._lastPongAt;\n if (elapsed >= PONG_TIMEOUT) {\n // Heartbeat timeout — close and reconnect\n this._closeWs();\n if (this._reconnect) {\n this._scheduleReconnect();\n }\n } else {\n // Schedule next check\n this._pongTimer = setTimeout(() => {\n this._checkPongTimeout();\n }, PONG_TIMEOUT - elapsed);\n }\n }\n\n private _handleMessage(data: WebSocket.Data): void {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(data.toString()) as Record<string, unknown>;\n } catch {\n return;\n }\n\n const type = String(msg.type ?? '');\n const sessionId = msg.session_id ? String(msg.session_id) : null;\n\n switch (type) {\n case 'pong':\n this._lastPongAt = Date.now();\n break;\n\n case 'rent_pending':\n this._onRentPending(msg);\n break;\n\n case 'match':\n this._onMatch(msg);\n break;\n\n case 'rent.error':\n this._onRentError(msg);\n break;\n\n case 'resume_ok':\n this._onResumeOk(msg);\n break;\n\n case 'resume_failed':\n this._onResumeFailed(msg);\n break;\n\n case 'cdp_response':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onCdpResponse(msg);\n }\n break;\n\n case 'cdp_event':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onCdpEvent(msg);\n }\n break;\n\n case 'tab_opened':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onTabOpened(msg);\n }\n break;\n\n case 'session.ended':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onSessionEnded(msg);\n }\n break;\n\n case 'session.provider_disconnected':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onProviderDisconnected();\n }\n break;\n\n case 'session.provider_reconnected':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onProviderReconnected();\n }\n break;\n\n case 'user_events':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onUserEvents(msg);\n }\n break;\n\n case 'chat.message':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onChatMessage((msg.payload ?? msg) as Record<string, unknown>);\n }\n break;\n\n case 'chat.read':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onChatRead((msg.payload ?? msg) as Record<string, unknown>);\n }\n break;\n\n case 'chat.send_ack':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onChatSendAck(msg);\n }\n break;\n\n case 'chat.error':\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n browser?._onChatSendError(msg);\n }\n break;\n\n case 'error':\n this._onError(msg);\n break;\n }\n }\n\n private _onRentPending(msg: Record<string, unknown>): void {\n const eventId = String(msg.event_id ?? '');\n // Update pending rent with eventId for matching\n for (const [key, pending] of this._pendingRents) {\n if (!pending.eventId) {\n pending.eventId = eventId;\n // Re-key by eventId for faster lookup on match\n this._pendingRents.delete(key);\n this._pendingRents.set(`event:${eventId}`, pending);\n break;\n }\n }\n }\n\n private _onMatch(msg: Record<string, unknown>): void {\n const eventId = String(msg.event_id ?? '');\n const scheduleId = Number(msg.schedule_id ?? 0);\n const sessionId = String(msg.session_id ?? '');\n\n if (msg.requires_ack) {\n try { this._wsSend({ type: 'match_ack', session_id: sessionId }); } catch { /* ignore */ }\n }\n\n // Try eventId match first\n let pending = this._pendingRents.get(`event:${eventId}`);\n if (!pending) {\n // Fallback to scheduleId match\n pending = this._pendingRents.get(`rent:${scheduleId}`);\n }\n\n if (pending) {\n clearTimeout(pending.timer);\n const key = pending.eventId ? `event:${pending.eventId}` : `rent:${pending.scheduleId}`;\n this._pendingRents.delete(key);\n\n const match: Match = {\n session_id: sessionId,\n schedule_id: scheduleId,\n event_id: eventId || null,\n chat_topic_id: msg.chat_topic_id ? String(msg.chat_topic_id) : null,\n provider_user_id: msg.provider_user_id != null ? Number(msg.provider_user_id) : null,\n started_at: Date.now(),\n browser_info: (msg.browser_info as Record<string, unknown>) ?? {},\n };\n\n pending.resolve(match);\n }\n }\n\n private _onRentError(msg: Record<string, unknown>): void {\n const eventId = String(msg.event_id ?? '');\n const code = String(msg.code ?? '');\n const message = String(msg.message ?? '');\n\n let pending = this._pendingRents.get(`event:${eventId}`);\n if (!pending) {\n // Try to find any pending rent\n for (const [key, p] of this._pendingRents) {\n pending = p;\n this._pendingRents.delete(key);\n break;\n }\n } else {\n this._pendingRents.delete(`event:${eventId}`);\n }\n\n if (pending) {\n clearTimeout(pending.timer);\n if (code === 'provider_offline') {\n pending.reject(new ProviderOffline(message));\n } else {\n pending.reject(new TransportError(message || `Rent error: ${code}`));\n }\n }\n }\n\n private _onResumeOk(msg: Record<string, unknown>): void {\n const sessionId = String(msg.session_id ?? '');\n const pending = this._pendingResumes.get(sessionId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this._pendingResumes.delete(sessionId);\n\n const match: Match = {\n session_id: sessionId,\n event_id: msg.event_id != null ? String(msg.event_id) : null,\n schedule_id: Number(msg.schedule_id ?? 0),\n chat_topic_id: msg.chat_topic_id ? String(msg.chat_topic_id) : null,\n provider_user_id: msg.provider_user_id != null ? Number(msg.provider_user_id) : null,\n started_at: Date.now(),\n browser_info: (msg.browser_info as Record<string, unknown>) ?? {},\n };\n\n pending.resolve(match);\n }\n\n private _onResumeFailed(msg: Record<string, unknown>): void {\n const sessionId = String(msg.session_id ?? '');\n const reason = String(msg.reason ?? '');\n const pending = this._pendingResumes.get(sessionId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this._pendingResumes.delete(sessionId);\n\n switch (reason) {\n case 'expired':\n pending.reject(new SessionExpired());\n break;\n case 'not_owner':\n pending.reject(new NotOwner());\n break;\n case 'not_found':\n pending.reject(new SessionNotFound());\n break;\n default:\n pending.reject(new SessionNotFound(reason));\n }\n }\n\n private _onError(msg: Record<string, unknown>): void {\n const code = Number(msg.code ?? 0);\n const reason = String(msg.reason ?? msg.message ?? '');\n const sessionId = msg.session_id ? String(msg.session_id) : null;\n\n // Route session-specific errors to browser\n if (sessionId) {\n const browser = this._activeBrowsers.get(sessionId);\n if (browser) {\n switch (code) {\n case -1011: // heartbeat timeout\n browser._onSessionEnded({ reason: 'heartbeat_timeout' });\n return;\n case -1012:\n browser._onError({ reason: 'insufficient_funds' });\n return;\n case -1013:\n browser._onError({ reason: 'rate_limit_exceeded' });\n return;\n case -1015: // provider_declined\n browser._onSessionEnded({ reason: 'provider_declined' });\n return;\n case -1018: // killed\n browser._onSessionEnded({ reason: 'killed' });\n return;\n case -1050:\n browser._onError({ reason: `cdp_unrecoverable: ${reason}` });\n return;\n default:\n browser._onError(msg);\n return;\n }\n }\n }\n\n // Global errors — reject pending operations\n let err: CekiBrowserError;\n switch (code) {\n case -1012:\n err = new InsufficientFunds(reason);\n this._rejectAllPending(err);\n break;\n case -1013:\n err = new RateLimitExceeded(0, reason);\n this._rejectAllPending(err);\n break;\n case -1015:\n err = new ProviderOffline(reason);\n this._rejectFirstPendingRent(err);\n break;\n default:\n err = new CekiBrowserError(reason || `relay error ${code}`);\n this._rejectFirstPendingRent(err);\n break;\n }\n }\n\n private _rejectFirstPendingRent(err: Error): void {\n const eventId = this._pendingRents.keys().next().value;\n if (eventId != null) {\n const pending = this._pendingRents.get(eventId)!;\n clearTimeout(pending.timer);\n this._pendingRents.delete(eventId);\n pending.reject(err);\n }\n }\n\n private _rejectAllPending(err: Error): void {\n for (const [key, pending] of this._pendingRents) {\n clearTimeout(pending.timer);\n pending.reject(err);\n }\n this._pendingRents.clear();\n\n for (const [key, pending] of this._pendingResumes) {\n clearTimeout(pending.timer);\n pending.reject(err);\n }\n this._pendingResumes.clear();\n }\n\n private _resolveHumanizer(opts?: RentOptions): Humanizer | null {\n if (process.env.CEKI_HUMAN_DISABLE === '1') return null;\n const human = opts?.human;\n if (human === null || human === undefined) {\n const envPreset = process.env.CEKI_HUMAN_PROFILE;\n const envPath = process.env.CEKI_HUMAN_PROFILE_PATH;\n if (envPath) return new Humanizer(HumanProfile.load(envPath));\n if (envPreset) return new Humanizer(HumanProfile.loadPreset(envPreset));\n return new Humanizer(HumanProfile.loadPreset('natural'));\n }\n if (human === 'natural' || human === 'careful') {\n return new Humanizer(HumanProfile.loadPreset(human));\n }\n return null;\n }\n}\n\n/** Factory function: create a connected Client */\nexport async function connect(apiKey: string, opts?: Partial<ConnectOptions>): Promise<Client> {\n return Client.create(apiKey, opts);\n}\n","import type { ConnectOptions } from './types.js';\n\nexport const defaults = {\n apiUrl: 'https://api.ceki.me',\n relayUrl: 'wss://browser.ceki.me/ws/agent',\n chatUrl: 'https://chat.ceki.me/api/chat',\n};\n\nexport function resolveConfig(opts?: Partial<ConnectOptions>) {\n return {\n apiUrl: opts?.apiUrl ?? process.env.CEKI_API_URL ?? defaults.apiUrl,\n relayUrl: opts?.relayUrl ?? process.env.CEKI_RELAY_URL ?? defaults.relayUrl,\n chatUrl: opts?.chatUrl ?? process.env.CEKI_CHAT_URL ?? defaults.chatUrl,\n basicAuth: opts?.basicAuth ?? (process.env.CEKI_BASIC_AUTH_USER && process.env.CEKI_BASIC_AUTH_PASS\n ? [process.env.CEKI_BASIC_AUTH_USER, process.env.CEKI_BASIC_AUTH_PASS] as [string, string]\n : undefined),\n reconnect: opts?.reconnect ?? true,\n };\n}\n","export class CekiBrowserError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CekiBrowserError';\n }\n}\n\nexport class AuthError extends CekiBrowserError {\n constructor(message = 'Authentication failed') {\n super(message);\n this.name = 'AuthError';\n }\n}\n\nexport class SessionNotFound extends CekiBrowserError {\n constructor(message = 'Session not found') {\n super(message);\n this.name = 'SessionNotFound';\n }\n}\n\nexport class SessionExpired extends SessionNotFound {\n constructor(message = 'Session expired') {\n super(message);\n this.name = 'SessionExpired';\n }\n}\n\nexport class NotOwner extends CekiBrowserError {\n constructor(message = 'Not session owner') {\n super(message);\n this.name = 'NotOwner';\n }\n}\n\nexport class TransportError extends CekiBrowserError {\n constructor(message = 'Transport error') {\n super(message);\n this.name = 'TransportError';\n }\n}\n\nexport class TimeoutError extends CekiBrowserError {\n constructor(message = 'Operation timed out') {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n\nexport class SessionEnded extends CekiBrowserError {\n reason: string;\n constructor(reason: string) {\n super(`Session ended: ${reason}`);\n this.name = 'SessionEnded';\n this.reason = reason;\n }\n}\n\nexport class InsufficientFunds extends CekiBrowserError {\n constructor(message = 'Insufficient funds') {\n super(message);\n this.name = 'InsufficientFunds';\n }\n}\n\nexport class RateLimitExceeded extends CekiBrowserError {\n retryAfter: number;\n constructor(retryAfter = 0, message = 'Rate limit exceeded') {\n super(message);\n this.name = 'RateLimitExceeded';\n this.retryAfter = retryAfter;\n }\n}\n\nexport class ConnectionLost extends CekiBrowserError {\n constructor(message = 'Connection lost') {\n super(message);\n this.name = 'ConnectionLost';\n }\n}\n\nexport class ProviderOffline extends CekiBrowserError {\n constructor(message = 'Provider offline') {\n super(message);\n this.name = 'ProviderOffline';\n }\n}\n\nexport class ProviderDisconnected extends CekiBrowserError {\n constructor(message = 'Provider disconnected') {\n super(message);\n this.name = 'ProviderDisconnected';\n }\n}\n\nexport class CdpUnrecoverable extends CekiBrowserError {\n lastError: string;\n constructor(lastError: string) {\n super(`CDP unrecoverable: ${lastError}`);\n this.name = 'CdpUnrecoverable';\n this.lastError = lastError;\n }\n}\n\nexport class CaptchaError extends CekiBrowserError {\n constructor(message = 'Captcha error') {\n super(message);\n this.name = 'CaptchaError';\n }\n}\n\nexport class CaptchaTimeoutError extends CaptchaError {\n phase: 'acceptance' | 'completion';\n constructor(phase: 'acceptance' | 'completion') {\n super(`Captcha timeout: ${phase}`);\n this.name = 'CaptchaTimeoutError';\n this.phase = phase;\n }\n}\n\nexport class ChatSendFailed extends CekiBrowserError {\n status: number;\n messageText: string;\n constructor(status: number, messageText: string) {\n super(`Chat send failed (${status})`);\n this.name = 'ChatSendFailed';\n this.status = status;\n this.messageText = messageText;\n }\n}\n","import mime from 'mime-types';\nimport { TimeoutError, SessionEnded, CaptchaError, CaptchaTimeoutError } from './errors.js';\nimport { BrowserChat } from './chat.js';\nimport { BrowserProfile } from './profile.js';\nimport { saveSession, getLastSeenTs, updateLastSeenTs } from './state.js';\nimport type { Match, ScreenshotOptions, ScrollOptions, Snapshot, ChatMessage, CaptchaOptions, CaptchaResult } from './types.js';\nimport type { Client } from './client.js';\n\nimport { Humanizer } from './humanize/humanizer.js';\nimport { HumanProfile } from './humanize/profile.js';\nimport { keymapForChar } from './humanize/keymap.js';\nexport type { Humanizer, HumanProfile };\n\ninterface PendingCdp {\n resolve: (value: unknown) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\ntype EventHandler = (method: string, params: Record<string, unknown>) => void;\ntype TabHandler = (url: string) => void;\ntype VoidHandler = () => void;\ntype UserEventHandler = (events: Record<string, unknown>[]) => void;\n\nexport class Browser {\n readonly sessionId: string;\n readonly browserId: number;\n readonly scheduleId: number;\n readonly chatTopicId: string | null;\n readonly browserInfo: Record<string, unknown>;\n readonly providerUserId: number | null;\n /** @internal */ _eventId: string | null;\n\n readonly chat: BrowserChat;\n readonly profile: BrowserProfile;\n\n /** @internal */ _client: Client;\n /** @internal */ _humanizer: Humanizer | null = null;\n /** @internal */ _lastPointer: [number, number] | null = null;\n /** @internal */ _lastSeenTs: string | null = null;\n /** @internal */ _cdpCounter = 1;\n /** @internal */ _pendingCdp: Map<number, PendingCdp> = new Map();\n /** @internal */ _ended: Promise<string>;\n /** @internal */ _endedReason: string | null = null;\n /** @internal */ _resolveEnded!: (reason: string) => void;\n\n private _eventHandlers: EventHandler[] = [];\n private _tabHandlers: TabHandler[] = [];\n private _disconnectHandlers: VoidHandler[] = [];\n private _reconnectHandlers: VoidHandler[] = [];\n private _userEventHandlers: UserEventHandler[] = [];\n\n /** @internal */\n get _apiKey(): string {\n return this._client._apiKey;\n }\n\n /** @internal */\n get _chatUrl(): string {\n return this._client._chatUrl;\n }\n\n /** @internal */\n get _basicAuth(): [string, string] | undefined {\n return this._client._basicAuth;\n }\n\n constructor(client: Client, match: Match, humanizer?: Humanizer | null) {\n this._client = client;\n this.sessionId = match.session_id;\n this.browserId = match.schedule_id;\n this.scheduleId = match.schedule_id;\n this.chatTopicId = match.chat_topic_id ?? null;\n this.browserInfo = match.browser_info ?? {};\n this.providerUserId = match.provider_user_id ?? null;\n this._eventId = match.event_id ?? null;\n this._humanizer = humanizer ?? null;\n\n this.chat = new BrowserChat(this);\n this.profile = new BrowserProfile(this);\n\n this._ended = new Promise<string>((resolve) => {\n this._resolveEnded = resolve;\n });\n\n // Load last_seen_ts from state\n this._lastSeenTs = getLastSeenTs(this.sessionId);\n\n // Save session state\n saveSession(this.sessionId, {\n session_id: this.sessionId,\n chat_topic_id: this.chatTopicId,\n schedule_id: this.scheduleId,\n last_seen_ts: this._lastSeenTs,\n });\n }\n\n /** @internal — send raw message via client WS */\n _sendRaw(msg: Record<string, unknown>): void {\n this._client._wsSend(msg);\n }\n\n async send(\n cdp: { method: string; params?: Record<string, unknown> },\n timeout = 30000,\n ): Promise<unknown> {\n if (this._endedReason) {\n throw new SessionEnded(this._endedReason);\n }\n\n const id = this._cdpCounter++;\n const msg = {\n type: 'cdp' as const,\n session_id: this.sessionId,\n id,\n method: cdp.method,\n params: cdp.params ?? {},\n };\n\n return new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingCdp.delete(id);\n reject(new TimeoutError(`CDP ${cdp.method} timed out after ${timeout}ms`));\n }, timeout);\n this._pendingCdp.set(id, { resolve, reject, timer });\n this._sendRaw(msg);\n });\n }\n\n // task 427 — per-call kill-switch. human=false bypasses humanizer timings\n // AND tells the extension to skip mouse-jitter via the `_ceki_raw` marker\n // (see cdp.ts). human=true forces humanizer; human undefined = session\n // default. Global env CEKI_HUMAN_DISABLE=1 nulls this._humanizer in the\n // constructor so all paths become raw.\n private _humanizeForCall(human?: boolean): Humanizer | null {\n if (human === false) return null;\n return this._humanizer;\n }\n\n async navigate(url: string, timeout = 30000, opts?: { human?: boolean }): Promise<{ url: string; frameId?: string }> {\n const h = this._humanizeForCall(opts?.human);\n if (h) await h.before('navigate');\n const result = await this.send({ method: 'Page.navigate', params: { url } }, timeout) as Record<string, unknown>;\n if (h) await h.after('navigate');\n return {\n url: String(result?.url ?? url),\n frameId: result?.frameId ? String(result.frameId) : undefined,\n };\n }\n\n async click(x: number, y: number, opts?: { human?: boolean }): Promise<void> {\n const h = this._humanizeForCall(opts?.human);\n if (h) await h.before('click');\n\n const rawFlag: Record<string, unknown> = h === null ? { _ceki_raw: true } : {};\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mousePressed', x, y, button: 'left', clickCount: 1, ...rawFlag },\n });\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mouseReleased', x, y, button: 'left', clickCount: 1 },\n });\n\n this._lastPointer = [x, y];\n\n if (h) await h.after('click');\n }\n\n private async _sendKeystroke(char: string): Promise<void> {\n const mapping = keymapForChar(char);\n if (!mapping) {\n await this.send({ method: 'Input.insertText', params: { text: char } });\n return;\n }\n const { code, key, vk, needsShift } = mapping;\n if (needsShift) {\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: { type: 'keyDown', key: 'Shift', code: 'ShiftLeft', windowsVirtualKeyCode: 16, nativeVirtualKeyCode: 16 },\n });\n }\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: {\n type: 'keyDown', key, code, text: char,\n unmodifiedText: needsShift ? char.toLowerCase() : char,\n windowsVirtualKeyCode: vk, nativeVirtualKeyCode: vk,\n ...(needsShift ? { modifiers: 8 } : {}),\n },\n });\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: {\n type: 'keyUp', key, code,\n windowsVirtualKeyCode: vk, nativeVirtualKeyCode: vk,\n ...(needsShift ? { modifiers: 8 } : {}),\n },\n });\n if (needsShift) {\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: { type: 'keyUp', key: 'Shift', code: 'ShiftLeft', windowsVirtualKeyCode: 16, nativeVirtualKeyCode: 16 },\n });\n }\n }\n\n async type(text: string, opts?: { human?: boolean }): Promise<void> {\n // task 413 — typing humanizer moved into the extension. The SDK now\n // sends ONE Ceki.typeText command instead of N per-char dispatchKey\n // events, so long inputs no longer burn through the 500 cmd / 60s\n // relay cap and the inter-key delays land without WS jitter.\n const h = this._humanizeForCall(opts?.human);\n if (h) {\n await h.before('type');\n\n // Re-click last pointer position to focus (kept on the SDK side so\n // pre-focus stays exactly as before; this is one command, not N).\n if (this._lastPointer) {\n const [px, py] = this._lastPointer;\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mousePressed', x: px, y: py, button: 'left', clickCount: 1 },\n });\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mouseReleased', x: px, y: py, button: 'left', clickCount: 1 },\n });\n }\n }\n\n const human = h\n ? (['natural', 'careful'].includes(h.profile.name) ? h.profile.name : 'natural')\n : null;\n await this.send({ method: 'Ceki.typeText', params: { text, human } });\n\n if (h) {\n await h.after('type');\n }\n }\n\n async scroll(opts?: ScrollOptions & { human?: boolean }): Promise<void> {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const deltaX = opts?.deltaX ?? 0;\n const deltaY = opts?.deltaY ?? -300;\n\n const h = this._humanizeForCall(opts?.human);\n if (h) await h.before('scroll');\n\n await this.send({\n method: 'Input.dispatchMouseEvent',\n params: { type: 'mouseWheel', x, y, deltaX, deltaY },\n });\n\n this._lastPointer = [x, y];\n\n if (h) await h.after('scroll');\n }\n\n async screenshot(opts?: ScreenshotOptions): Promise<{ data: string } | Buffer> {\n const format = opts?.format ?? 'base64';\n const fullPage = opts?.fullPage ?? false;\n\n let clip: Record<string, unknown> | undefined;\n\n if (fullPage) {\n const metrics = await this.send({ method: 'Page.getLayoutMetrics' }) as Record<string, unknown>;\n const contentSize = metrics?.contentSize as Record<string, unknown> | undefined;\n if (contentSize) {\n const width = Number(contentSize.width ?? 1920);\n const height = Math.min(Number(contentSize.height ?? 1080), 16384);\n clip = { x: 0, y: 0, width, height, scale: 1 };\n }\n }\n\n const params: Record<string, unknown> = { format: 'png' };\n if (clip) params.clip = clip;\n\n const result = await this.send({ method: 'Page.captureScreenshot', params }) as Record<string, unknown>;\n const data = String(result?.data ?? '');\n\n if (format === 'png') {\n return Buffer.from(data, 'base64');\n }\n\n return { data };\n }\n\n async snapshot(): Promise<Snapshot> {\n const [ssResult, chatMessages] = await Promise.all([\n this.screenshot({ format: 'base64' }),\n this.chat.history({ since: this._lastSeenTs ?? undefined }),\n ]);\n\n const screenshotData = (ssResult as { data: string }).data;\n\n if (chatMessages.length > 0) {\n const lastMsg = chatMessages[chatMessages.length - 1];\n this._lastSeenTs = lastMsg.created_at;\n updateLastSeenTs(this.sessionId, this._lastSeenTs);\n }\n\n return {\n screenshot: screenshotData,\n chat: chatMessages,\n ts: new Date(),\n };\n }\n\n private static _detectMime(filename: string): string {\n return mime.lookup(filename) || 'application/octet-stream';\n }\n\n async upload(\n selector: string,\n source: string | Buffer,\n filename?: string,\n mime?: string,\n ): Promise<{ ok: boolean; filename: string; size: number }> {\n let buf: Buffer;\n let resolvedFilename: string;\n\n if (typeof source === 'string') {\n const fs = await import('node:fs');\n const path = await import('node:path');\n buf = fs.readFileSync(source);\n resolvedFilename = filename ?? path.basename(source);\n } else {\n buf = Buffer.isBuffer(source) ? source : Buffer.from(source);\n resolvedFilename = filename ?? 'file';\n }\n\n const mimeType = mime ?? Browser._detectMime(resolvedFilename);\n console.info(`upload: file=${resolvedFilename} mime=${mimeType} size=${buf.length}`);\n\n const b64 = buf.toString('base64');\n const size = buf.length;\n\n const expression = `\n (function() {\n var input = document.querySelector(${JSON.stringify(selector)});\n if (!input) return JSON.stringify({ok: false, error: 'Element not found'});\n var b64 = ${JSON.stringify(b64)};\n var binary = atob(b64);\n var bytes = new Uint8Array(binary.length);\n for (var i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n var file = new File([bytes], ${JSON.stringify(resolvedFilename)}, {type: ${JSON.stringify(mimeType)}});\n var dt = new DataTransfer();\n dt.items.add(file);\n input.files = dt.files;\n input.dispatchEvent(new Event('change', {bubbles: true}));\n return JSON.stringify({ok: true, filename: ${JSON.stringify(resolvedFilename)}, size: ${size}});\n })()\n `.trim();\n\n const result = await this.send({\n method: 'Runtime.evaluate',\n params: { expression, returnByValue: true },\n }) as Record<string, unknown>;\n\n const resultObj = result?.result as Record<string, unknown> | undefined;\n\n try {\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: { type: 'keyDown', key: 'Escape', code: 'Escape', windowsVirtualKeyCode: 27, nativeVirtualKeyCode: 27 },\n });\n await this.send({\n method: 'Input.dispatchKeyEvent',\n params: { type: 'keyUp', key: 'Escape', code: 'Escape', windowsVirtualKeyCode: 27, nativeVirtualKeyCode: 27 },\n });\n } catch {\n // ignore — best-effort dialog dismiss\n }\n\n if (resultObj?.value) {\n return JSON.parse(String(resultObj.value)) as { ok: boolean; filename: string; size: number };\n }\n return { ok: true, filename: resolvedFilename, size };\n }\n\n async switchTab(): Promise<void> {\n this._sendRaw({ type: 'switch_tab', session_id: this.sessionId });\n }\n\n async configure(opts: { maskingMode?: boolean; fingerprint?: boolean | Record<string, unknown> }): Promise<void> {\n const msg: Record<string, unknown> = {\n type: 'session.configure',\n session_id: this.sessionId,\n };\n if (opts.maskingMode !== undefined) msg.masking_mode = opts.maskingMode;\n if (opts.fingerprint !== undefined) msg.fingerprint = opts.fingerprint;\n this._sendRaw(msg);\n }\n\n async close(timeout = 10000): Promise<void> {\n if (this._endedReason) return;\n\n this._sendRaw({\n type: 'session.end',\n session_id: this.sessionId,\n reason: 'user_stop',\n });\n\n await Promise.race([\n this._ended,\n new Promise<void>((_, reject) =>\n setTimeout(() => reject(new TimeoutError('Close timed out')), timeout)\n ),\n ]).catch(() => {\n // If timed out, force cleanup\n });\n\n this._cleanup();\n }\n\n async release(timeout?: number): Promise<void> {\n return this.close(timeout);\n }\n\n async waitUntilEnded(): Promise<string> {\n return this._ended;\n }\n\n onEvent(cb: EventHandler): void {\n this._eventHandlers.push(cb);\n }\n\n onTabOpened(cb: TabHandler): void {\n this._tabHandlers.push(cb);\n }\n\n onProviderDisconnected(cb: VoidHandler): void {\n this._disconnectHandlers.push(cb);\n }\n\n onProviderReconnected(cb: VoidHandler): void {\n this._reconnectHandlers.push(cb);\n }\n\n onUserEvent(cb: UserEventHandler): void {\n this._userEventHandlers.push(cb);\n }\n\n // --- Captcha / human action ---\n\n private _apiHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._apiKey}`,\n 'Content-Type': 'application/json',\n };\n const basicAuth = this._basicAuth;\n if (basicAuth) {\n const encoded = Buffer.from(`${basicAuth[0]}:${basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n return headers;\n }\n\n async requestCaptcha(opts?: CaptchaOptions): Promise<CaptchaResult> {\n let acceptanceTimeout = opts?.acceptanceTimeout ?? 60;\n let completionTimeout = opts?.completionTimeout ?? 120;\n const autoAccept = opts?.autoAccept ?? true;\n\n if (acceptanceTimeout < 30) throw new Error('acceptanceTimeout must be >= 30 seconds');\n if (completionTimeout < 30) throw new Error('completionTimeout must be >= 30 seconds');\n\n acceptanceTimeout = Math.min(acceptanceTimeout, 300);\n completionTimeout = Math.min(completionTimeout, 600);\n\n const { id: childEventId } = await this._createCaptchaEvent(acceptanceTimeout, completionTimeout);\n const completionDeadline = Date.now() + completionTimeout * 1000;\n\n const buffer: Record<string, unknown>[] = [];\n let waiter: ((action: Record<string, unknown>) => void) | null = null;\n\n this.chat._actionCallbacks.set(childEventId, (action) => {\n if (waiter) {\n const w = waiter;\n waiter = null;\n w(action);\n } else {\n buffer.push(action);\n }\n });\n\n const nextAction = (timeoutMs: number): Promise<Record<string, unknown>> => {\n if (buffer.length > 0) return Promise.resolve(buffer.shift()!);\n return new Promise<Record<string, unknown>>((resolve, reject) => {\n const timer = setTimeout(() => {\n waiter = null;\n reject(new Error('timeout'));\n }, timeoutMs);\n waiter = (action) => {\n clearTimeout(timer);\n resolve(action);\n };\n });\n };\n\n const cleanup = () => {\n this.chat._actionCallbacks.delete(childEventId);\n waiter = null;\n };\n\n const makeResult = async (\n data: Record<string, unknown>,\n solved: boolean,\n ): Promise<CaptchaResult> => {\n const correctionId = data.correction_id != null ? Number(data.correction_id) : null;\n const proofMessageId = data.proof_message_id != null ? String(data.proof_message_id) : null;\n let voted = false;\n\n const result: CaptchaResult = {\n solved,\n proofMessageId,\n cancelReason: null,\n childEventId,\n correctionId,\n acceptWork: async () => {\n if (voted) return;\n if (!correctionId) throw new CaptchaError('no correction_id — provider has not proposed completion');\n voted = true;\n await fetch(`${this._client._apiUrl}/api/agent/kal/event/${childEventId}/vote`, {\n method: 'POST',\n headers: this._apiHeaders(),\n body: JSON.stringify({ ids: [correctionId], vote: true }),\n });\n },\n rejectWork: async (reason?: string) => {\n if (voted) return;\n if (!correctionId) throw new CaptchaError('no correction_id — provider has not proposed completion');\n voted = true;\n const body: Record<string, unknown> = { ids: [correctionId], vote: false };\n if (reason) body.reason = reason;\n await fetch(`${this._client._apiUrl}/api/agent/kal/event/${childEventId}/vote`, {\n method: 'POST',\n headers: this._apiHeaders(),\n body: JSON.stringify(body),\n });\n },\n };\n\n if (autoAccept && solved && correctionId) {\n await new Promise<void>(r => setTimeout(r, 2000));\n await result.acceptWork();\n }\n\n return result;\n };\n\n let accepted = false;\n\n try {\n // Phase 1: wait for acceptance\n const acceptDeadline = Date.now() + acceptanceTimeout * 1000;\n while (true) {\n const remaining = acceptDeadline - Date.now();\n if (remaining <= 0) throw new Error('timeout');\n const action = await nextAction(remaining);\n const kind = String(action.kind ?? '');\n const data = (action.data ?? {}) as Record<string, unknown>;\n\n if (kind === 'human_action_accepted') {\n accepted = true;\n break;\n }\n if (kind === 'human_action_completed') {\n cleanup();\n return await makeResult(data, true);\n }\n if (kind === 'human_action_failed' || kind === 'human_action_declined' || kind === 'human_action_withdrew') {\n cleanup();\n return {\n solved: false,\n proofMessageId: null,\n cancelReason: kind.replace('human_action_', ''),\n childEventId,\n correctionId: null,\n acceptWork: async () => {},\n rejectWork: async () => {},\n };\n }\n }\n\n // Phase 2: wait for completion\n while (true) {\n const remaining = completionDeadline - Date.now();\n if (remaining <= 0) throw new Error('timeout');\n const action = await nextAction(remaining);\n const kind = String(action.kind ?? '');\n const data = (action.data ?? {}) as Record<string, unknown>;\n\n if (kind === 'human_action_completed') {\n cleanup();\n return await makeResult(data, true);\n }\n if (kind === 'human_action_failed' || kind === 'human_action_withdrew') {\n cleanup();\n return {\n solved: false,\n proofMessageId: null,\n cancelReason: kind.replace('human_action_', ''),\n childEventId,\n correctionId: null,\n acceptWork: async () => {},\n rejectWork: async () => {},\n };\n }\n }\n } catch {\n cleanup();\n const phase = accepted ? 'completion' : 'acceptance';\n await this._expireCaptchaEvent(childEventId);\n throw new CaptchaTimeoutError(phase);\n }\n }\n\n private async _createCaptchaEvent(acceptanceTimeout: number, completionTimeout: number): Promise<{ id: number; amount: number }> {\n const body = {\n acceptance_deadline_at: Math.floor(acceptanceTimeout),\n completion_deadline_at: Math.floor(completionTimeout),\n };\n\n const resp = await fetch(`${this._client._apiUrl}/api/agent/sessions/${this._eventId}/captcha-request`, {\n method: 'POST',\n headers: this._apiHeaders(),\n body: JSON.stringify(body),\n });\n if (!resp.ok) {\n throw new Error(`Captcha request failed: ${resp.status}`);\n }\n const result = await resp.json() as { id: number; amount: number };\n if (!result.id) throw new Error('Captcha request did not return an id');\n return { id: result.id, amount: result.amount };\n }\n\n private async _expireCaptchaEvent(childEventId: number): Promise<void> {\n try {\n await fetch(`${this._client._apiUrl}/api/agent/kal/event/${childEventId}`, {\n method: 'PATCH',\n headers: this._apiHeaders(),\n body: JSON.stringify({ status_id: 777 }),\n });\n } catch { /* best effort */ }\n }\n\n // --- Internal handlers called by Client dispatch ---\n\n /** @internal */\n _onCdpResponse(msg: Record<string, unknown>): void {\n const id = Number(msg.id);\n const pending = this._pendingCdp.get(id);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this._pendingCdp.delete(id);\n\n if (msg.ok === false) {\n const error = msg.error as Record<string, unknown> | undefined;\n pending.reject(new Error(String(error?.message ?? error?.code ?? 'CDP error')));\n } else {\n pending.resolve(msg.result ?? null);\n }\n }\n\n /** @internal */\n _onCdpEvent(msg: Record<string, unknown>): void {\n const method = String(msg.method ?? '');\n const params = (msg.params ?? {}) as Record<string, unknown>;\n for (const h of this._eventHandlers) {\n try {\n h(method, params);\n } catch {\n // handler errors should not break dispatch\n }\n }\n }\n\n /** @internal */\n _onTabOpened(msg: Record<string, unknown>): void {\n const url = String(msg.url ?? '');\n for (const h of this._tabHandlers) {\n try {\n h(url);\n } catch {\n // handler errors should not break dispatch\n }\n }\n }\n\n /** @internal */\n _onSessionEnded(msg: Record<string, unknown>): void {\n const reason = String(msg.reason ?? 'unknown');\n this._endedReason = reason;\n this._resolveEnded(reason);\n this._rejectAllPending(new SessionEnded(reason));\n this._cleanup();\n }\n\n /** @internal */\n _onProviderDisconnected(): void {\n for (const h of this._disconnectHandlers) {\n try { h(); } catch { /* ignore */ }\n }\n }\n\n /** @internal */\n _onProviderReconnected(): void {\n for (const h of this._reconnectHandlers) {\n try { h(); } catch { /* ignore */ }\n }\n }\n\n /** @internal */\n _onError(msg: Record<string, unknown>): void {\n const reason = String(msg.reason ?? msg.message ?? 'unknown error');\n this._endedReason = reason;\n this._resolveEnded(reason);\n this._rejectAllPending(new SessionEnded(reason));\n this._cleanup();\n }\n\n /** @internal */\n _onUserEvents(msg: Record<string, unknown>): void {\n const events = (msg.events ?? []) as Record<string, unknown>[];\n for (const h of this._userEventHandlers) {\n try { h(events); } catch { /* ignore */ }\n }\n }\n\n /** @internal */\n _onChatMessage(payload: Record<string, unknown>): void {\n this.chat._onMessage(payload);\n }\n\n /** @internal */\n _onChatRead(payload: Record<string, unknown>): void {\n this.chat._onRead(payload);\n }\n\n /** @internal */\n _onChatSendAck(msg: Record<string, unknown>): void {\n this.chat._onSendAck(msg);\n }\n\n /** @internal */\n _onChatSendError(msg: Record<string, unknown>): void {\n this.chat._onSendError(msg);\n }\n\n private _rejectAllPending(err: Error): void {\n for (const [id, pending] of this._pendingCdp) {\n clearTimeout(pending.timer);\n pending.reject(err);\n }\n this._pendingCdp.clear();\n }\n\n private _cleanup(): void {\n this._client._activeBrowsers.delete(this.sessionId);\n }\n}\n","import * as crypto from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { TimeoutError, ChatSendFailed } from './errors.js';\nimport type { ChatMessage, ReadReceipt, ChatHistoryOptions } from './types.js';\nimport type { Browser } from './browser.js';\n\ntype MessageHandler = (msg: ChatMessage) => void | Promise<void>;\ntype ReadHandler = (receipt: ReadReceipt) => void | Promise<void>;\n\ninterface PendingSend {\n resolve: (value: { messageId: string; sentAt: string }) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nconst MAX_IMAGE_SIZE = 5 * 1024 * 1024; // 5MB\n\nfunction detectMime(buf: Buffer): { mime: string; ext: string } {\n if (buf.length >= 4 && buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47) {\n return { mime: 'image/png', ext: 'png' };\n }\n if (buf.length >= 3 && buf[0] === 0xff && buf[1] === 0xd8 && buf[2] === 0xff) {\n return { mime: 'image/jpeg', ext: 'jpg' };\n }\n if (buf.length >= 12 && buf[0] === 0x52 && buf[1] === 0x49 && buf[2] === 0x46 && buf[3] === 0x46\n && buf[8] === 0x57 && buf[9] === 0x45 && buf[10] === 0x42 && buf[11] === 0x50) {\n return { mime: 'image/webp', ext: 'webp' };\n }\n return { mime: 'application/octet-stream', ext: 'bin' };\n}\n\nfunction randomHex(len: number): string {\n return crypto.randomBytes(len / 2).toString('hex');\n}\n\nexport class BrowserChat {\n private _browser: Browser;\n private _topicId: string | null;\n private _messageHandlers: MessageHandler[] = [];\n private _readHandlers: ReadHandler[] = [];\n private _pendingSends: Map<string, PendingSend> = new Map();\n /** @internal */ _actionCallbacks: Map<number, (action: Record<string, unknown>) => void> = new Map();\n\n constructor(browser: Browser) {\n this._browser = browser;\n this._topicId = browser.chatTopicId;\n }\n\n get topicId(): string | null {\n return this._topicId;\n }\n\n async send(text: string): Promise<{ messageId: string; sentAt: string }> {\n const clientMsgId = randomHex(32);\n const msg = {\n type: 'chat.send' as const,\n session_id: this._browser.sessionId,\n client_msg_id: clientMsgId,\n text,\n };\n\n return new Promise<{ messageId: string; sentAt: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingSends.delete(clientMsgId);\n reject(new TimeoutError('Chat send timed out'));\n }, 15000);\n this._pendingSends.set(clientMsgId, { resolve, reject, timer });\n this._browser._sendRaw(msg);\n });\n }\n\n async sendImage(source: string | Buffer, text?: string): Promise<{ messageId: string; sentAt: string }> {\n let buf: Buffer;\n let filename: string;\n\n if (typeof source === 'string') {\n buf = fs.readFileSync(source);\n filename = path.basename(source);\n } else {\n buf = Buffer.isBuffer(source) ? source : Buffer.from(source);\n filename = 'image';\n }\n\n if (buf.length > MAX_IMAGE_SIZE) {\n throw new Error(`Image too large: ${buf.length} bytes (max ${MAX_IMAGE_SIZE})`);\n }\n\n const { mime, ext } = detectMime(buf);\n if (!filename.includes('.')) {\n filename = `${filename}.${ext}`;\n }\n\n const clientMsgId = randomHex(32);\n const data_b64 = buf.toString('base64');\n\n const msg: Record<string, unknown> = {\n type: 'chat.send_image',\n session_id: this._browser.sessionId,\n client_msg_id: clientMsgId,\n filename,\n mime,\n data_b64,\n };\n if (text) msg.text = text;\n\n return new Promise<{ messageId: string; sentAt: string }>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingSends.delete(clientMsgId);\n reject(new TimeoutError('Chat sendImage timed out'));\n }, 15000);\n this._pendingSends.set(clientMsgId, { resolve, reject, timer });\n this._browser._sendRaw(msg);\n });\n }\n\n onMessage(cb: MessageHandler): void {\n this._messageHandlers.push(cb);\n }\n\n onRead(cb: ReadHandler): void {\n this._readHandlers.push(cb);\n }\n\n async history(opts?: ChatHistoryOptions): Promise<ChatMessage[]> {\n if (!this._topicId) return [];\n\n const params = new URLSearchParams();\n params.set('topic_id', this._topicId);\n if (opts?.limit != null) params.set('limit', String(opts.limit));\n if (opts?.beforeId) params.set('before', opts.beforeId);\n if (opts?.since) params.set('since', opts.since);\n\n const url = `${this._browser._chatUrl}/messages?${params.toString()}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this._browser._apiKey}`,\n };\n\n const basicAuth = this._browser._basicAuth;\n if (basicAuth) {\n const encoded = Buffer.from(`${basicAuth[0]}:${basicAuth[1]}`).toString('base64');\n headers['X-Basic-Auth'] = `Basic ${encoded}`;\n }\n\n const resp = await fetch(url, { headers });\n if (!resp.ok) {\n throw new Error(`Chat history request failed: ${resp.status} ${resp.statusText}`);\n }\n\n const body = await resp.json() as Record<string, unknown>;\n const messages = (body.messages ?? body.data ?? body) as Record<string, unknown>[];\n if (!Array.isArray(messages)) return [];\n\n return messages.map(parseChatMessage);\n }\n\n /** @internal */\n _onMessage(payload: Record<string, unknown>): void {\n const msgData = (payload.message ?? payload) as Record<string, unknown>;\n if (msgData.type === 'action' && msgData.action) {\n const action = msgData.action as Record<string, unknown>;\n const eventId = Number(action.event_id);\n if (eventId && this._actionCallbacks.has(eventId)) {\n this._actionCallbacks.get(eventId)!(action);\n }\n }\n const msg = parseChatMessage(msgData);\n for (const h of this._messageHandlers) {\n try {\n const result = h(msg);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch(() => {});\n }\n } catch {\n // handler errors should not break dispatch\n }\n }\n }\n\n /** @internal */\n _onRead(payload: Record<string, unknown>): void {\n const receipt: ReadReceipt = {\n topic_id: String(payload.topic_id ?? this._topicId ?? ''),\n last_read_message_id: String(payload.last_read_message_id ?? ''),\n read_at: Number(payload.read_at ?? 0),\n };\n for (const h of this._readHandlers) {\n try {\n const result = h(receipt);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n (result as Promise<void>).catch(() => {});\n }\n } catch {\n // handler errors should not break dispatch\n }\n }\n }\n\n /** @internal */\n _onSendAck(msg: Record<string, unknown>): void {\n const clientMsgId = String(msg.client_msg_id ?? '');\n const pending = this._pendingSends.get(clientMsgId);\n if (!pending) return;\n clearTimeout(pending.timer);\n this._pendingSends.delete(clientMsgId);\n pending.resolve({\n messageId: String(msg.message_id ?? ''),\n sentAt: String(msg.sent_at ?? ''),\n });\n }\n\n /** @internal */\n _onSendError(msg: Record<string, unknown>): void {\n const clientMsgId = String(msg.client_msg_id ?? '');\n const pending = this._pendingSends.get(clientMsgId);\n if (!pending) return;\n clearTimeout(pending.timer);\n this._pendingSends.delete(clientMsgId);\n pending.reject(new ChatSendFailed(\n Number(msg.status ?? 0),\n String(msg.message ?? ''),\n ));\n }\n}\n\nfunction parseChatMessage(data: Record<string, unknown>): ChatMessage {\n const action = data.action as Record<string, unknown> | undefined;\n return {\n id: String(data.id ?? data._id ?? data.message_id ?? ''),\n topic_id: String(data.topic_id ?? ''),\n sender_id: data.sender_id != null ? Number(data.sender_id) : null,\n text: data.text != null ? String(data.text) : null,\n media: (data.media as Record<string, unknown>[] | null) ?? null,\n type: String(data.type ?? 'text'),\n created_at: String(data.created_at ?? ''),\n edited_at: data.edited_at != null ? String(data.edited_at) : null,\n deleted_at: data.deleted_at != null ? String(data.deleted_at) : null,\n action: action ? {\n kind: String(action.kind ?? ''),\n event_id: Number(action.event_id ?? 0),\n data: (action.data as Record<string, unknown>) ?? undefined,\n } : null,\n };\n}\n","import type { Browser } from './browser.js';\nimport type { Profile, ProfileExportOptions } from './types.js';\n\nexport class BrowserProfile {\n private _browser: Browser;\n\n constructor(browser: Browser) {\n this._browser = browser;\n }\n\n async export(opts?: ProfileExportOptions): Promise<Profile> {\n // 1. Try fingerprint (graceful fail)\n let fingerprint: Record<string, unknown> | null = null;\n try {\n const fpResult = await this._browser.send({ method: 'Browser.getFingerprint' });\n fingerprint = (fpResult as Record<string, unknown>) ?? null;\n } catch {\n fingerprint = null;\n }\n\n // 2. Get cookies\n let cookies: Record<string, unknown>[] = [];\n try {\n const cookieResult = await this._browser.send({ method: 'Network.getCookies' }) as Record<string, unknown>;\n const allCookies = (cookieResult?.cookies ?? []) as Record<string, unknown>[];\n\n if (opts?.domains && opts.domains.length > 0) {\n const domainSet = new Set(opts.domains.map(d => d.toLowerCase()));\n cookies = allCookies.filter(c => {\n const cookieDomain = String(c.domain ?? '').toLowerCase().replace(/^\\./, '');\n return domainSet.has(cookieDomain) || opts!.domains!.some(d =>\n cookieDomain.endsWith('.' + d.toLowerCase()) || cookieDomain === d.toLowerCase()\n );\n });\n } else {\n cookies = allCookies;\n }\n } catch {\n cookies = [];\n }\n\n // 3. Get localStorage\n let localStorage: Record<string, string> = {};\n try {\n const lsResult = await this._browser.send({\n method: 'Runtime.evaluate',\n params: { expression: 'JSON.stringify(localStorage)', returnByValue: true },\n }) as Record<string, unknown>;\n const resultObj = lsResult?.result as Record<string, unknown> | undefined;\n if (resultObj?.value) {\n localStorage = JSON.parse(String(resultObj.value)) as Record<string, string>;\n }\n } catch {\n localStorage = {};\n }\n\n // 4. Get sessionStorage\n let sessionStorage: Record<string, string> = {};\n if (opts?.includeSessionStorage !== false) {\n try {\n const ssResult = await this._browser.send({\n method: 'Runtime.evaluate',\n params: { expression: 'JSON.stringify(sessionStorage)', returnByValue: true },\n }) as Record<string, unknown>;\n const resultObj = ssResult?.result as Record<string, unknown> | undefined;\n if (resultObj?.value) {\n sessionStorage = JSON.parse(String(resultObj.value)) as Record<string, string>;\n }\n } catch {\n sessionStorage = {};\n }\n }\n\n // 5. Get origin\n let origin = '';\n try {\n const originResult = await this._browser.send({\n method: 'Runtime.evaluate',\n params: { expression: 'location.origin', returnByValue: true },\n }) as Record<string, unknown>;\n const resultObj = originResult?.result as Record<string, unknown> | undefined;\n if (resultObj?.value) {\n origin = String(resultObj.value);\n }\n } catch {\n origin = '';\n }\n\n return {\n schema_version: 2,\n fingerprint,\n origin,\n cookies,\n localStorage,\n sessionStorage,\n };\n }\n\n async import(profile: Profile): Promise<void> {\n if (profile.schema_version !== 1 && profile.schema_version !== 2) {\n throw new Error(`Unsupported profile schema_version: ${profile.schema_version}`);\n }\n\n // Set cookies\n if (profile.cookies && profile.cookies.length > 0) {\n await this._browser.send({\n method: 'Network.setCookies',\n params: { cookies: profile.cookies },\n });\n }\n\n // Inject localStorage\n if (profile.localStorage && Object.keys(profile.localStorage).length > 0) {\n const entries = JSON.stringify(profile.localStorage);\n await this._browser.send({\n method: 'Runtime.evaluate',\n params: {\n expression: `(function(){var d=${entries};for(var k in d)localStorage.setItem(k,d[k])})()`,\n returnByValue: true,\n },\n });\n }\n\n // Inject sessionStorage\n if (profile.sessionStorage && Object.keys(profile.sessionStorage).length > 0) {\n const entries = JSON.stringify(profile.sessionStorage);\n await this._browser.send({\n method: 'Runtime.evaluate',\n params: {\n expression: `(function(){var d=${entries};for(var k in d)sessionStorage.setItem(k,d[k])})()`,\n returnByValue: true,\n },\n });\n }\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\n\nconst STATE_DIR = path.join(os.homedir(), '.ceki', 'sessions');\n\nfunction statePath(sid: string): string {\n return path.join(STATE_DIR, `${sid}.json`);\n}\n\nexport function loadSession(sid: string): Record<string, unknown> | null {\n try {\n const raw = fs.readFileSync(statePath(sid), 'utf-8');\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function saveSession(sid: string, data: Record<string, unknown>): void {\n fs.mkdirSync(STATE_DIR, { recursive: true });\n const payload = { ...data, updated_at: new Date().toISOString() };\n fs.writeFileSync(statePath(sid), JSON.stringify(payload, null, 2), 'utf-8');\n}\n\nexport function deleteSession(sid: string): void {\n try {\n fs.unlinkSync(statePath(sid));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n}\n\nexport function getLastSeenTs(sid: string): string | null {\n const data = loadSession(sid);\n if (!data) return null;\n return (data.last_seen_ts as string) ?? null;\n}\n\nexport function updateLastSeenTs(sid: string, ts: string): void {\n const data = loadSession(sid) ?? {};\n data.last_seen_ts = ts;\n saveSession(sid, data);\n}\n","export interface KeyMapping {\n code: string;\n key: string;\n vk: number;\n needsShift: boolean;\n}\n\nconst STATIC_MAP: Record<string, KeyMapping> = {\n ' ': { code: 'Space', key: ' ', vk: 32, needsShift: false },\n '\\n': { code: 'Enter', key: 'Enter', vk: 13, needsShift: false },\n '\\t': { code: 'Tab', key: 'Tab', vk: 9, needsShift: false },\n\n // Shifted digits\n '!': { code: 'Digit1', key: '!', vk: 49, needsShift: true },\n '@': { code: 'Digit2', key: '@', vk: 50, needsShift: true },\n '#': { code: 'Digit3', key: '#', vk: 51, needsShift: true },\n '$': { code: 'Digit4', key: '$', vk: 52, needsShift: true },\n '%': { code: 'Digit5', key: '%', vk: 53, needsShift: true },\n '^': { code: 'Digit6', key: '^', vk: 54, needsShift: true },\n '&': { code: 'Digit7', key: '&', vk: 55, needsShift: true },\n '*': { code: 'Digit8', key: '*', vk: 56, needsShift: true },\n '(': { code: 'Digit9', key: '(', vk: 57, needsShift: true },\n ')': { code: 'Digit0', key: ')', vk: 48, needsShift: true },\n\n // Punctuation (unshifted)\n '-': { code: 'Minus', key: '-', vk: 189, needsShift: false },\n '=': { code: 'Equal', key: '=', vk: 187, needsShift: false },\n '[': { code: 'BracketLeft', key: '[', vk: 219, needsShift: false },\n ']': { code: 'BracketRight', key: ']', vk: 221, needsShift: false },\n '\\\\': { code: 'Backslash', key: '\\\\', vk: 220, needsShift: false },\n ';': { code: 'Semicolon', key: ';', vk: 186, needsShift: false },\n \"'\": { code: 'Quote', key: \"'\", vk: 222, needsShift: false },\n ',': { code: 'Comma', key: ',', vk: 188, needsShift: false },\n '.': { code: 'Period', key: '.', vk: 190, needsShift: false },\n '/': { code: 'Slash', key: '/', vk: 191, needsShift: false },\n '`': { code: 'Backquote', key: '`', vk: 192, needsShift: false },\n\n // Punctuation (shifted)\n '_': { code: 'Minus', key: '_', vk: 189, needsShift: true },\n '+': { code: 'Equal', key: '+', vk: 187, needsShift: true },\n '{': { code: 'BracketLeft', key: '{', vk: 219, needsShift: true },\n '}': { code: 'BracketRight', key: '}', vk: 221, needsShift: true },\n '|': { code: 'Backslash', key: '|', vk: 220, needsShift: true },\n ':': { code: 'Semicolon', key: ':', vk: 186, needsShift: true },\n '\"': { code: 'Quote', key: '\"', vk: 222, needsShift: true },\n '<': { code: 'Comma', key: '<', vk: 188, needsShift: true },\n '>': { code: 'Period', key: '>', vk: 190, needsShift: true },\n '?': { code: 'Slash', key: '?', vk: 191, needsShift: true },\n '~': { code: 'Backquote', key: '~', vk: 192, needsShift: true },\n};\n\nexport function keymapForChar(char: string): KeyMapping | null {\n // a-z\n if (char >= 'a' && char <= 'z') {\n const upper = char.toUpperCase();\n return {\n code: `Key${upper}`,\n key: char,\n vk: upper.charCodeAt(0),\n needsShift: false,\n };\n }\n\n // A-Z\n if (char >= 'A' && char <= 'Z') {\n return {\n code: `Key${char}`,\n key: char,\n vk: char.charCodeAt(0),\n needsShift: true,\n };\n }\n\n // 0-9\n if (char >= '0' && char <= '9') {\n return {\n code: `Digit${char}`,\n key: char,\n vk: char.charCodeAt(0),\n needsShift: false,\n };\n }\n\n // Static map\n const mapping = STATIC_MAP[char];\n if (mapping) return mapping;\n\n // Non-ASCII or unknown — fallback\n return null;\n}\n","import { HumanProfile } from './profile.js';\n\nfunction seededRandom(seed: number | null): () => number {\n if (seed === null || seed === undefined) {\n return Math.random;\n }\n let s = seed;\n return () => {\n s = (s * 1664525 + 1013904223) & 0xffffffff;\n return (s >>> 0) / 0xffffffff;\n };\n}\n\nfunction gaussianRandom(rng: () => number, mean: number, sigma: number): number {\n let u1: number, u2: number;\n do { u1 = rng(); } while (u1 === 0);\n u2 = rng();\n const z = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math.PI * u2);\n return mean + z * sigma;\n}\n\nexport class Humanizer {\n readonly profile: HumanProfile;\n private _rng: () => number;\n\n constructor(profile: HumanProfile) {\n this.profile = profile;\n this._rng = seededRandom(profile.raw.rng_seed ?? null);\n }\n\n async before(action: string): Promise<void> {\n const [lo, hi] = this.profile.getRange(action, 'pre');\n if (lo === 0 && hi === 0) return;\n const delay = lo + this._rng() * (hi - lo);\n await sleep(delay);\n }\n\n async after(action: string): Promise<void> {\n const [lo, hi] = this.profile.getRange(action, 'post');\n if (lo === 0 && hi === 0) return;\n const delay = lo + this._rng() * (hi - lo);\n await sleep(delay);\n }\n\n typeDelay(): number {\n const typing = this.profile.raw.typing ?? {};\n const wpm = typing.wpm ?? 110;\n const jitter = typing.jitter ?? 0.35;\n const thinkProb = typing.thinking_pause_prob ?? 0;\n const thinkMs = typing.thinking_pause_ms ?? [300, 1200];\n\n const meanInterval = 60_000 / (wpm * 5);\n const sigma = meanInterval * jitter;\n\n let delay = gaussianRandom(this._rng, meanInterval, sigma);\n delay = Math.max(delay, 20);\n\n if (thinkProb > 0 && this._rng() < thinkProb) {\n delay += thinkMs[0] + this._rng() * (thinkMs[1] - thinkMs[0]);\n }\n\n return delay;\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n","import * as fs from 'node:fs';\n\nexport interface HumanProfileRaw {\n version?: number;\n name?: string;\n typing?: {\n wpm?: number;\n jitter?: number;\n thinking_pause_prob?: number;\n thinking_pause_ms?: [number, number];\n typo_prob?: number;\n };\n pre_action_ms?: Record<string, [number, number]>;\n post_action_ms?: Record<string, [number, number]>;\n mouse?: {\n move_before_click?: boolean;\n trajectory?: string;\n };\n rng_seed?: number | null;\n}\n\nconst PRESETS: Record<string, HumanProfileRaw> = {\n natural: {\n version: 1,\n name: 'natural',\n typing: { wpm: 110, jitter: 0.35, thinking_pause_prob: 0.012, thinking_pause_ms: [300, 1200], typo_prob: 0.0 },\n pre_action_ms: { click: [80, 350], type: [120, 500], scroll: [50, 250], navigate: [0, 0], screenshot: [0, 0] },\n post_action_ms: { click: [150, 800], type: [150, 800], scroll: [200, 900], navigate: [400, 1800], screenshot: [0, 0] },\n mouse: { move_before_click: false, trajectory: 'off' },\n rng_seed: null,\n },\n careful: {\n version: 1,\n name: 'careful',\n typing: { wpm: 80, jitter: 0.4, thinking_pause_prob: 0.025, thinking_pause_ms: [400, 1800], typo_prob: 0.0 },\n pre_action_ms: { click: [200, 600], type: [250, 800], scroll: [100, 400], navigate: [0, 0], screenshot: [0, 0] },\n post_action_ms: { click: [400, 1500], type: [300, 1200], scroll: [300, 1200], navigate: [800, 3000], screenshot: [0, 0] },\n mouse: { move_before_click: false, trajectory: 'off' },\n rng_seed: null,\n },\n};\n\nconst DEFAULTS: HumanProfileRaw = {\n version: 1,\n name: 'custom',\n typing: {\n wpm: 110,\n jitter: 0.35,\n thinking_pause_prob: 0.012,\n thinking_pause_ms: [300, 1200],\n typo_prob: 0.0,\n },\n pre_action_ms: {\n click: [80, 350],\n type: [120, 500],\n scroll: [50, 250],\n navigate: [0, 0],\n screenshot: [0, 0],\n },\n post_action_ms: {\n click: [150, 800],\n type: [150, 800],\n scroll: [200, 900],\n navigate: [400, 1800],\n screenshot: [0, 0],\n },\n mouse: {\n move_before_click: false,\n trajectory: 'off',\n },\n rng_seed: null,\n};\n\nfunction deepMerge(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(override)) {\n if (\n key in result &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key]) &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n );\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport class HumanProfile {\n readonly name: string;\n readonly raw: HumanProfileRaw;\n\n constructor(name: string, raw: HumanProfileRaw) {\n this.name = name;\n this.raw = raw;\n }\n\n static fromDict(d: Record<string, unknown>): HumanProfile {\n const merged = deepMerge(\n DEFAULTS as unknown as Record<string, unknown>,\n d,\n ) as HumanProfileRaw;\n const name = (d.name as string) ?? 'custom';\n merged.name = name;\n return new HumanProfile(name, merged);\n }\n\n static load(filePath: string): HumanProfile {\n const raw = fs.readFileSync(filePath, 'utf-8');\n const data = JSON.parse(raw) as Record<string, unknown>;\n return HumanProfile.fromDict(data);\n }\n\n static loadPreset(name: string): HumanProfile {\n const preset = PRESETS[name];\n if (!preset) {\n throw new Error(`Preset '${name}' not found. Available: ${Object.keys(PRESETS).join(', ')}`);\n }\n return HumanProfile.fromDict(preset as unknown as Record<string, unknown>);\n }\n\n getRange(action: string, phase: 'pre' | 'post'): [number, number] {\n const key = `${phase}_action_ms` as keyof HumanProfileRaw;\n const mapping = this.raw[key] as Record<string, [number, number]> | undefined;\n const pair = mapping?.[action];\n if (Array.isArray(pair) && pair.length === 2) {\n return [pair[0], pair[1]];\n }\n return [0, 0];\n }\n\n typingInterval(): number {\n const wpm = this.raw.typing?.wpm ?? 110;\n return 60_000 / (wpm * 5);\n }\n\n toDict(): HumanProfileRaw {\n return JSON.parse(JSON.stringify(this.raw)) as HumanProfileRaw;\n }\n\n toJSON(indent = 2): string {\n return JSON.stringify(this.raw, null, indent);\n }\n}\n","// Client for /mcp/agent contract tools (1:1 port of python-sdk ContractClient).\n\nimport { defaults } from './config.js';\n\n// Contract role IDs (back/2542 users[] payload — renamed from participants[]).\nexport const ROLE_REVIEWER = 5;\nexport const ROLE_QA = 6;\n\nexport type Benefitable = { type: string; value: number };\nexport type ParticipantSpec = {\n participable_id: number;\n type: 'agent' | 'user' | string;\n role_id: number;\n};\n\nexport class ContractError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ContractError';\n }\n}\n\n/** Parse 'agent:N' / 'user:N' into {type, value}. Throws on malformed input. */\nexport function parseBenefitable(value: string | null | undefined): Benefitable | null {\n if (value === null || value === undefined || value === '') return null;\n const parts = String(value).split(':');\n if (parts.length !== 2) {\n throw new Error(`benefitable must be 'type:id', got: ${JSON.stringify(value)}`);\n }\n const [btype, bid] = parts;\n const num = Number.parseInt(bid, 10);\n if (!Number.isFinite(num) || Number.isNaN(num)) {\n throw new Error(`benefitable id must be int, got: ${JSON.stringify(bid)}`);\n }\n return { type: btype, value: num };\n}\n\n/** Parse 'agent:N' / 'user:N' into {participable_id, type, role_id}.\n *\n * Wire shape declared by the create-contract-event MCP tool schema:\n * `participable_id` + `type` (short token: 'agent' or 'user') + `role_id`.\n * The MCP tool drops any field it does not know about, so sending\n * `participable_type` (FQCN) silently loses the type and the backend\n * membership lookup defaults to user → misleading 422 \"Participant must\n * be a member of the contract\". Send `type`.\n */\nexport function parseParticipant(\n value: string | null | undefined,\n roleId: number,\n): ParticipantSpec | null {\n const base = parseBenefitable(value);\n if (base === null) return null;\n return {\n participable_id: base.value,\n type: base.type as 'agent' | 'user',\n role_id: roleId,\n };\n}\n\n/** Strip undefined and null values; keep 0, false, '', [], {}. */\nexport function cleanArgs<T extends Record<string, unknown>>(o: T): Partial<T> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) {\n if (v !== undefined && v !== null) {\n out[k] = v;\n }\n }\n return out as Partial<T>;\n}\n\n/** Derive a short (<=60 char) label from a desc's first non-empty line. */\nexport function deriveLabel(desc: string | null | undefined): string {\n if (!desc) return 'progress';\n const lines = String(desc).split(/\\r?\\n/);\n for (const ln of lines) {\n const t = ln.trim();\n if (t) return t.slice(0, 60);\n }\n return 'progress';\n}\n\nexport function contractIdsFromEnv(): string[] {\n const raw = (process.env.CEKI_CONTRACT_IDS ?? '').trim();\n if (!raw) return [];\n try {\n const parsed = JSON.parse(raw);\n if (Array.isArray(parsed)) return parsed.map((x) => String(x));\n } catch {\n /* fall through */\n }\n return raw\n .replace(/\\[/g, '')\n .replace(/\\]/g, '')\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nfunction resolveEndpoint(): string {\n const override = process.env.CEKI_AGENT_MCP_ENDPOINT;\n if (override) return override.replace(/\\/+$/, '');\n const base = (process.env.CEKI_API_URL ?? defaults.apiUrl).replace(/\\/+$/, '');\n return `${base}/mcp/agent`;\n}\n\nfunction resolveApiBase(): string {\n const override = process.env.CEKI_API_BASE;\n if (override) return override.replace(/\\/+$/, '');\n const base = (process.env.CEKI_API_URL ?? defaults.apiUrl).replace(/\\/+$/, '');\n return `${base}/api`;\n}\n\nfunction resolveToken(): string {\n return process.env.CEKI_AGENT_TOKEN ?? process.env.CEKI_API_KEY ?? '';\n}\n\nconst TOOL_MAP = {\n list: 'get-my-contracts',\n members: 'get-contract-members',\n tasks: 'get-contract-events',\n 'my-jobs': 'get-my-jobs',\n task: 'get-event',\n children: 'get-event-children',\n history: 'get-event-history',\n create: 'create-contract-event',\n comment: 'comment',\n propose: 'propose-correction',\n vote: 'vote-correction',\n} as const;\n\n/** Injectable HTTP transport — vitest swaps this out in tests. */\nexport type HttpResponse = {\n status: number;\n text(): Promise<string>;\n json(): Promise<unknown>;\n};\n\nexport interface HttpClient {\n post(\n url: string,\n init: { headers: Record<string, string>; body: string },\n ): Promise<HttpResponse>;\n get(url: string, init: { headers: Record<string, string> }): Promise<HttpResponse>;\n}\n\nclass FetchHttpClient implements HttpClient {\n constructor(private timeoutMs: number) {}\n private withTimeout(): { signal: AbortSignal; cancel: () => void } {\n const ctl = new AbortController();\n const t = setTimeout(() => ctl.abort(), this.timeoutMs);\n return { signal: ctl.signal, cancel: () => clearTimeout(t) };\n }\n async post(\n url: string,\n init: { headers: Record<string, string>; body: string },\n ): Promise<HttpResponse> {\n const { signal, cancel } = this.withTimeout();\n try {\n const r = await fetch(url, { method: 'POST', headers: init.headers, body: init.body, signal });\n const text = await r.text();\n return {\n status: r.status,\n text: async () => text,\n json: async () => {\n try {\n return JSON.parse(text);\n } catch {\n return { raw: text };\n }\n },\n };\n } finally {\n cancel();\n }\n }\n async get(url: string, init: { headers: Record<string, string> }): Promise<HttpResponse> {\n const { signal, cancel } = this.withTimeout();\n try {\n const r = await fetch(url, { method: 'GET', headers: init.headers, signal });\n const text = await r.text();\n return {\n status: r.status,\n text: async () => text,\n json: async () => {\n try {\n return JSON.parse(text);\n } catch {\n return { raw: text };\n }\n },\n };\n } finally {\n cancel();\n }\n }\n}\n\nexport type ContractClientOptions = {\n endpoint?: string;\n apiBase?: string;\n token?: string;\n http?: HttpClient;\n timeoutMs?: number;\n};\n\nexport type CreateOptions = {\n label: string;\n type?: number;\n status?: number;\n kalScheduleId?: number;\n start?: string;\n end?: string;\n timezone?: string;\n date?: string;\n duration?: number;\n amount?: number;\n currency?: string;\n description?: string;\n data?: Record<string, unknown>;\n benefitable?: string;\n reviewer?: string;\n qa?: string;\n participants?: ParticipantSpec[];\n};\n\nexport type CommentOptions = {\n label?: string;\n type?: number;\n status?: number;\n start?: string;\n end?: string;\n date?: string;\n duration?: number;\n amount?: number;\n currency?: string;\n description?: string;\n benefitable?: string;\n};\n\nexport type ProposeOptions = {\n status?: number;\n label?: string;\n description?: string;\n start?: string;\n end?: string;\n date?: string;\n duration?: number;\n amount?: number;\n currency?: string;\n benefitable?: string;\n};\n\nexport type ProgressOptions = {\n status?: number;\n desc: string;\n};\n\nexport type ProgressResult = {\n status_correction: unknown;\n comment: unknown;\n};\n\nexport class ContractClient {\n readonly endpoint: string;\n readonly apiBase: string;\n readonly token: string;\n private http: HttpClient;\n\n constructor(opts: ContractClientOptions = {}) {\n this.endpoint = (opts.endpoint ?? resolveEndpoint()).replace(/\\/+$/, '');\n this.apiBase = (opts.apiBase ?? resolveApiBase()).replace(/\\/+$/, '');\n this.token = opts.token !== undefined ? opts.token : resolveToken();\n this.http = opts.http ?? new FetchHttpClient(opts.timeoutMs ?? 30000);\n }\n\n private headers(): Record<string, string> {\n if (!this.token) {\n throw new ContractError('agent token not set (CEKI_AGENT_TOKEN or CEKI_API_KEY)');\n }\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${this.token}`,\n };\n }\n\n private async rpc(method: string, params: Record<string, unknown>): Promise<Record<string, unknown>> {\n const body = JSON.stringify({\n jsonrpc: '2.0',\n id: Date.now(),\n method,\n params,\n });\n const resp = await this.http.post(this.endpoint, { headers: this.headers(), body });\n let parsed: unknown;\n try {\n parsed = await resp.json();\n } catch {\n parsed = { raw: await resp.text() };\n }\n if (resp.status !== 200) {\n const snippet = JSON.stringify(parsed).slice(0, 400);\n throw new ContractError(`HTTP ${resp.status}: ${snippet}`);\n }\n return (parsed as Record<string, unknown>) ?? {};\n }\n\n /** Call MCP tool; unwrap content[].text (JSON-parsed) or structuredContent. */\n async call(tool: string, args: Record<string, unknown> = {}): Promise<unknown> {\n const body = await this.rpc('tools/call', { name: tool, arguments: args });\n if (body['error']) {\n throw new ContractError(`${tool} → ${JSON.stringify(body['error']).slice(0, 400)}`);\n }\n const result = (body['result'] as Record<string, unknown>) ?? {};\n const content = result['content'];\n if (Array.isArray(content)) {\n const texts = content\n .filter((c) => (c as Record<string, unknown>)['type'] === 'text')\n .map((c) => String((c as Record<string, unknown>)['text'] ?? ''));\n const joined = texts.join('\\n');\n try {\n return JSON.parse(joined);\n } catch {\n return joined;\n }\n }\n if (result['structuredContent'] !== undefined) return result['structuredContent'];\n return result;\n }\n\n async tools(): Promise<unknown> {\n const body = await this.rpc('tools/list', {});\n const result = (body['result'] as Record<string, unknown>) ?? {};\n const tools = result['tools'];\n if (Array.isArray(tools)) return tools.map((t) => (t as Record<string, unknown>)['name']);\n return body;\n }\n\n async raw(tool: string, args: Record<string, unknown> = {}): Promise<unknown> {\n return this.call(tool, args);\n }\n\n // ── domain helpers ──────────────────────────────────────────────\n\n async listContracts(): Promise<unknown> {\n return this.call(TOOL_MAP.list, {});\n }\n\n async members(contractId: number): Promise<unknown> {\n return this.call(TOOL_MAP.members, { contract_id: Number(contractId) });\n }\n\n async tasks(contractId: number): Promise<unknown> {\n return this.call(TOOL_MAP.tasks, { contract_id: Number(contractId) });\n }\n\n async myJobs(): Promise<unknown> {\n return this.call(TOOL_MAP['my-jobs'], {});\n }\n\n async task(eventId: number): Promise<unknown> {\n return this.call(TOOL_MAP.task, { event_id: Number(eventId) });\n }\n\n async children(eventId: number): Promise<unknown> {\n return this.call(TOOL_MAP.children, { event_id: Number(eventId) });\n }\n\n async history(eventId: number, opts: { limit?: number } = {}): Promise<unknown> {\n const args = cleanArgs({ event_id: Number(eventId), limit: opts.limit });\n return this.call(TOOL_MAP.history, args as Record<string, unknown>);\n }\n\n async create(contractId: number, opts: CreateOptions): Promise<unknown> {\n // back/2542: reviewer/qa now live inside users[] (renamed from\n // participants[]). Element shape unchanged. The `participants`\n // option name is kept as a stable SDK API for callers, but on\n // the wire it is emitted under the `users` key.\n const users: ParticipantSpec[] = [];\n const rev = parseParticipant(opts.reviewer, ROLE_REVIEWER);\n if (rev !== null) users.push(rev);\n const qa = parseParticipant(opts.qa, ROLE_QA);\n if (qa !== null) users.push(qa);\n if (opts.participants && opts.participants.length) {\n users.push(...opts.participants);\n }\n\n const args = cleanArgs({\n contract_id: Number(contractId),\n label: opts.label,\n type_id: opts.type,\n status_id: opts.status,\n kal_schedule_id: opts.kalScheduleId,\n start: opts.start,\n end: opts.end,\n timezone: opts.timezone,\n date: opts.date,\n duration: opts.duration,\n amount: opts.amount,\n currency: opts.currency,\n description: opts.description,\n data: opts.data,\n benefitable: opts.benefitable !== undefined ? parseBenefitable(opts.benefitable) : undefined,\n users: users.length > 0 ? users : undefined,\n });\n return this.call(TOOL_MAP.create, args as Record<string, unknown>);\n }\n\n async comment(eventId: number, opts: CommentOptions = {}): Promise<unknown> {\n const args = cleanArgs({\n event_id: Number(eventId),\n label: opts.label,\n type_id: opts.type,\n status_id: opts.status,\n start: opts.start,\n end: opts.end,\n date: opts.date,\n duration: opts.duration,\n amount: opts.amount,\n currency: opts.currency,\n description: opts.description,\n benefitable: opts.benefitable !== undefined ? parseBenefitable(opts.benefitable) : undefined,\n });\n return this.call(TOOL_MAP.comment, args as Record<string, unknown>);\n }\n\n async propose(eventId: number, opts: ProposeOptions = {}): Promise<unknown> {\n const args = cleanArgs({\n event_id: Number(eventId),\n status_id: opts.status,\n label: opts.label,\n description: opts.description,\n start: opts.start,\n end: opts.end,\n date: opts.date,\n duration: opts.duration,\n amount: opts.amount,\n currency: opts.currency,\n benefitable: opts.benefitable !== undefined ? parseBenefitable(opts.benefitable) : undefined,\n });\n return this.call(TOOL_MAP.propose, args as Record<string, unknown>);\n }\n\n /** Status correction (optional) + progress comment in one shot.\n *\n * The event's own description is NOT touched. `desc` becomes the\n * body of a child comment-event, not a label/description overwrite\n * on the parent event. Use this for Hand/QA/Reviewer progress\n * reports — `propose --desc` would clobber the parent spec.\n */\n async progress(eventId: number, opts: ProgressOptions): Promise<ProgressResult> {\n let statusResult: unknown = null;\n if (opts.status !== undefined && opts.status !== null) {\n statusResult = await this.propose(eventId, { status: Number(opts.status) });\n }\n // Backend requires `label` on comment events — derive one from desc\n // (server-side validation rejects label-less comments).\n const label = deriveLabel(opts.desc);\n const commentResult = await this.comment(eventId, { label, description: opts.desc });\n return { status_correction: statusResult, comment: commentResult };\n }\n\n async vote(eventId: number, ids: number[], vote: boolean): Promise<unknown> {\n return this.call(TOOL_MAP.vote, {\n event_id: Number(eventId),\n ids: ids.map((i) => Number(i)),\n vote: Boolean(vote),\n });\n }\n\n // ── polling (REST, not MCP) ────────────────────────────────────\n\n /** GET /agent/polling. Returns [] on 429 (rate-limit, 10/min/token). */\n async poll(): Promise<unknown[]> {\n const resp = await this.http.get(`${this.apiBase}/agent/polling`, {\n headers: { Accept: 'application/json', Authorization: `Bearer ${this.token}` },\n });\n if (resp.status === 429) return [];\n if (resp.status !== 200) {\n let body: unknown;\n try {\n body = await resp.json();\n } catch {\n body = await resp.text();\n }\n throw new ContractError(`polling HTTP ${resp.status}: ${JSON.stringify(body).slice(0, 300)}`);\n }\n const body = (await resp.json()) as unknown;\n if (Array.isArray(body)) return body;\n if (body && typeof body === 'object') {\n const obj = body as Record<string, unknown>;\n for (const k of ['notifications', 'data', 'items']) {\n const v = obj[k];\n if (Array.isArray(v)) return v;\n }\n }\n return [];\n }\n}\n","// Client for /mcp/agent timelog tools (start/stop/check by event_id).\n// Thin wrapper around ContractClient — same transport, same auth, same env.\n\nimport { ContractClient, ContractError, type ContractClientOptions } from './contract.js';\n\nconst TOOL_MAP = {\n start: 'timelog-start',\n stop: 'timelog-stop',\n check: 'timelog-check',\n} as const;\n\nexport type TimelogClientOptions = ContractClientOptions & {\n contract?: ContractClient;\n};\n\nexport class TimelogClient {\n private c: ContractClient;\n\n constructor(opts: TimelogClientOptions = {}) {\n if (opts.contract) {\n this.c = opts.contract;\n } else {\n this.c = new ContractClient(opts);\n }\n }\n\n async start(eventId: number): Promise<unknown> {\n return this.c.call(TOOL_MAP.start, { event_id: Number(eventId) });\n }\n\n async stop(eventId: number, label?: string): Promise<unknown> {\n const args: Record<string, unknown> = { event_id: Number(eventId) };\n if (label !== undefined && label !== null) args['label'] = label;\n return this.c.call(TOOL_MAP.stop, args);\n }\n\n async check(eventId: number): Promise<unknown> {\n return this.c.call(TOOL_MAP.check, { event_id: Number(eventId) });\n }\n}\n\nexport { ContractError };\n","// CLI handlers for `ceki contract …` and `ceki timelog …` subcommands.\n\nimport {\n ContractClient,\n ContractError,\n ROLE_QA,\n ROLE_REVIEWER,\n contractIdsFromEnv,\n type ParticipantSpec,\n} from './contract.js';\nimport { TimelogClient } from './timelog.js';\n\nfunction out(data: unknown): void {\n if (typeof data === 'string') {\n process.stdout.write(data + '\\n');\n } else {\n process.stdout.write(JSON.stringify(data, null, 2) + '\\n');\n }\n}\n\nfunction err(message: string, code = 'error'): void {\n process.stderr.write(JSON.stringify({ error: message, code }) + '\\n');\n}\n\n/** Parse 'agent:5:reviewer' / 'user:7:qa' / 'agent:5:role:42'. */\nexport function parseParticipantSpec(spec: string): ParticipantSpec {\n if (!spec || typeof spec !== 'string') {\n throw new Error(`--participant must be a non-empty string, got: ${JSON.stringify(spec)}`);\n }\n const parts = spec.split(':');\n if (parts.length < 3) {\n throw new Error(\n `--participant must be 'type:id:role' (e.g. agent:5:reviewer), got: ${JSON.stringify(spec)}`,\n );\n }\n const [ptype, pid, role, ...rest] = parts;\n if (ptype !== 'agent' && ptype !== 'user') {\n throw new Error(`--participant type must be 'agent' or 'user', got: ${JSON.stringify(ptype)}`);\n }\n const value = Number.parseInt(pid, 10);\n if (!Number.isFinite(value) || Number.isNaN(value)) {\n throw new Error(`--participant id must be int, got: ${JSON.stringify(pid)}`);\n }\n const roleMap: Record<string, number> = { reviewer: ROLE_REVIEWER, qa: ROLE_QA };\n let roleId: number;\n if (role in roleMap) {\n roleId = roleMap[role];\n } else if (role === 'role') {\n if (rest.length === 0) {\n throw new Error(`--participant 'role:NUMBER' needs a number, got: ${JSON.stringify(spec)}`);\n }\n const n = Number.parseInt(rest[0], 10);\n if (!Number.isFinite(n) || Number.isNaN(n)) {\n throw new Error(`--participant role id must be int, got: ${JSON.stringify(rest[0])}`);\n }\n roleId = n;\n } else {\n throw new Error(\n `--participant unknown role ${JSON.stringify(role)}; expected 'reviewer', 'qa', or 'role:NUMBER'`,\n );\n }\n return { participable_id: value, type: ptype, role_id: roleId };\n}\n\n// ── tiny argv parser (no commander) — matches python argparse semantics ──\n\ntype Args = {\n positional: string[];\n flags: Record<string, string | string[] | true>;\n};\n\nfunction parseArgs(argv: string[]): Args {\n const positional: string[] = [];\n const flags: Record<string, string | string[] | true> = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a.startsWith('--')) {\n const name = a.slice(2);\n const next = argv[i + 1];\n if (next === undefined || next.startsWith('--')) {\n flags[name] = true;\n } else {\n // repeatable: collect into array\n if (flags[name] !== undefined) {\n const cur = flags[name];\n if (Array.isArray(cur)) cur.push(next);\n else flags[name] = [cur as string, next];\n } else {\n flags[name] = next;\n }\n i++;\n }\n } else {\n positional.push(a);\n }\n }\n return { positional, flags };\n}\n\nfunction flagStr(args: Args, key: string): string | undefined {\n const v = args.flags[key];\n if (v === undefined || v === true) return undefined;\n if (Array.isArray(v)) return v[v.length - 1];\n return v;\n}\n\nfunction flagInt(args: Args, key: string): number | undefined {\n const v = flagStr(args, key);\n if (v === undefined) return undefined;\n const n = Number.parseInt(v, 10);\n if (Number.isNaN(n)) throw new Error(`--${key} must be int, got: ${JSON.stringify(v)}`);\n return n;\n}\n\nfunction flagList(args: Args, key: string): string[] {\n const v = args.flags[key];\n if (v === undefined) return [];\n if (v === true) return [];\n if (Array.isArray(v)) return v;\n return [v as string];\n}\n\nfunction requireFlag(args: Args, key: string): string {\n const v = flagStr(args, key);\n if (v === undefined) throw new Error(`--${key} is required`);\n return v;\n}\n\nfunction dump(value: unknown): void {\n out(value);\n}\n\n// ── contract subcommand dispatcher ──────────────────────────────────────\n\n/** Factory hook so tests can inject a fake ContractClient. */\nlet contractClientFactory: () => ContractClient = () => new ContractClient();\n\nexport function _setContractClientFactory(f: () => ContractClient): void {\n contractClientFactory = f;\n}\nexport function _resetContractClientFactory(): void {\n contractClientFactory = () => new ContractClient();\n}\n\nlet timelogClientFactory: () => TimelogClient = () => new TimelogClient();\n\nexport function _setTimelogClientFactory(f: () => TimelogClient): void {\n timelogClientFactory = f;\n}\nexport function _resetTimelogClientFactory(): void {\n timelogClientFactory = () => new TimelogClient();\n}\n\nexport async function cmdContract(argv: string[]): Promise<number> {\n const action = argv[0];\n if (!action) {\n err('contract: subcommand required', 'args');\n return 1;\n }\n const rest = argv.slice(1);\n const args = parseArgs(rest);\n const client = contractClientFactory();\n\n try {\n switch (action) {\n case 'list': {\n dump(await client.listContracts());\n return 0;\n }\n case 'members': {\n const cid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(cid)) {\n err('contract members: cid required', 'args');\n return 1;\n }\n dump(await client.members(cid));\n return 0;\n }\n case 'tasks': {\n const explicit = args.positional[0];\n const ids =\n explicit !== undefined ? [explicit] : contractIdsFromEnv();\n if (ids.length === 0) {\n err('no contract id (positional or CEKI_CONTRACT_IDS)', 'args');\n return 1;\n }\n for (const cid of ids) {\n process.stdout.write(`--- contract ${cid} ---\\n`);\n dump(await client.tasks(Number(cid)));\n }\n return 0;\n }\n case 'my-jobs': {\n dump(await client.myJobs());\n return 0;\n }\n case 'task': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('contract task: eid required', 'args');\n return 1;\n }\n dump(await client.task(eid));\n return 0;\n }\n case 'children': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('contract children: eid required', 'args');\n return 1;\n }\n dump(await client.children(eid));\n return 0;\n }\n case 'history': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('contract history: eid required', 'args');\n return 1;\n }\n dump(await client.history(eid, { limit: flagInt(args, 'limit') }));\n return 0;\n }\n case 'create': {\n const explicit = args.positional[0];\n let cid: number;\n if (explicit !== undefined) {\n cid = Number.parseInt(explicit, 10);\n } else {\n const envIds = contractIdsFromEnv();\n if (envIds.length === 0) {\n err('contract id required (positional or CEKI_CONTRACT_IDS)', 'args');\n return 1;\n }\n cid = Number.parseInt(envIds[0], 10);\n }\n if (Number.isNaN(cid)) {\n err('contract create: cid must be int', 'args');\n return 1;\n }\n const label = requireFlag(args, 'label');\n const dataRaw = flagStr(args, 'data');\n const dataObj = dataRaw ? JSON.parse(dataRaw) : undefined;\n let extras: ParticipantSpec[] = [];\n try {\n extras = flagList(args, 'participant').map(parseParticipantSpec);\n } catch (e) {\n err((e as Error).message, 'args');\n return 1;\n }\n dump(\n await client.create(cid, {\n label,\n type: flagInt(args, 'type'),\n status: flagInt(args, 'status'),\n kalScheduleId: flagInt(args, 'kal-schedule'),\n start: flagStr(args, 'start'),\n end: flagStr(args, 'end'),\n timezone: flagStr(args, 'timezone'),\n date: flagStr(args, 'date'),\n duration: flagInt(args, 'duration'),\n amount: flagInt(args, 'amount'),\n currency: flagStr(args, 'currency'),\n description: flagStr(args, 'desc'),\n data: dataObj,\n benefitable: flagStr(args, 'benefitable'),\n reviewer: flagStr(args, 'reviewer'),\n qa: flagStr(args, 'qa'),\n participants: extras.length > 0 ? extras : undefined,\n }),\n );\n return 0;\n }\n case 'comment': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('contract comment: eid required', 'args');\n return 1;\n }\n dump(\n await client.comment(eid, {\n label: flagStr(args, 'label'),\n type: flagInt(args, 'type'),\n status: flagInt(args, 'status'),\n start: flagStr(args, 'start'),\n end: flagStr(args, 'end'),\n date: flagStr(args, 'date'),\n duration: flagInt(args, 'duration'),\n amount: flagInt(args, 'amount'),\n currency: flagStr(args, 'currency'),\n description: flagStr(args, 'desc'),\n benefitable: flagStr(args, 'benefitable'),\n }),\n );\n return 0;\n }\n case 'propose': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('contract propose: eid required', 'args');\n return 1;\n }\n dump(\n await client.propose(eid, {\n status: flagInt(args, 'status'),\n label: flagStr(args, 'label'),\n description: flagStr(args, 'desc'),\n start: flagStr(args, 'start'),\n end: flagStr(args, 'end'),\n date: flagStr(args, 'date'),\n duration: flagInt(args, 'duration'),\n amount: flagInt(args, 'amount'),\n currency: flagStr(args, 'currency'),\n benefitable: flagStr(args, 'benefitable'),\n }),\n );\n return 0;\n }\n case 'progress': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('contract progress: eid required', 'args');\n return 1;\n }\n const desc = flagStr(args, 'desc');\n if (desc === undefined) {\n err('contract progress: --desc is required', 'args');\n return 1;\n }\n dump(\n await client.progress(eid, {\n status: flagInt(args, 'status'),\n desc,\n }),\n );\n return 0;\n }\n case 'vote': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('contract vote: eid required', 'args');\n return 1;\n }\n const idsRaw = requireFlag(args, 'ids');\n const voteRaw = requireFlag(args, 'vote');\n const ids = idsRaw\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .map((s) => Number.parseInt(s, 10));\n const vote = ['true', '1', 'yes'].includes(voteRaw.toLowerCase());\n dump(await client.vote(eid, ids, vote));\n return 0;\n }\n case 'poll': {\n const items = await client.poll();\n dump({ count: items.length, notifications: items });\n return 0;\n }\n case 'watch': {\n const interval = Math.max(6, Number.parseInt(args.positional[0] ?? '8', 10) || 8);\n process.stderr.write(\n `[watch] poll every ${interval}s (limit 10/min/token; do not go below 6s)\\n`,\n );\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const items = await client.poll();\n if (items.length > 0) {\n const ts = new Date().toISOString();\n for (const n of items) {\n process.stdout.write(JSON.stringify({ ts, notification: n }) + '\\n');\n }\n }\n await new Promise((r) => setTimeout(r, interval * 1000));\n }\n }\n case 'tools': {\n dump(await client.tools());\n return 0;\n }\n case 'raw': {\n const tool = args.positional[0];\n if (!tool) {\n err('contract raw: tool name required', 'args');\n return 1;\n }\n const payloadRaw = args.positional[1] ?? '{}';\n const payload = JSON.parse(payloadRaw);\n dump(await client.raw(tool, payload));\n return 0;\n }\n default: {\n err(`unknown contract action: ${action}`, 'args');\n return 1;\n }\n }\n } catch (e) {\n if (e instanceof ContractError) {\n err(e.message, 'contract');\n return 1;\n }\n err((e as Error).message ?? String(e), 'error');\n return 1;\n }\n}\n\nexport async function cmdTimelog(argv: string[]): Promise<number> {\n const action = argv[0];\n if (!action) {\n err('timelog: subcommand required', 'args');\n return 1;\n }\n const rest = argv.slice(1);\n const args = parseArgs(rest);\n const client = timelogClientFactory();\n try {\n switch (action) {\n case 'start': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('timelog start: event_id required', 'args');\n return 1;\n }\n dump(await client.start(eid));\n return 0;\n }\n case 'stop': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('timelog stop: event_id required', 'args');\n return 1;\n }\n dump(await client.stop(eid, flagStr(args, 'label')));\n return 0;\n }\n case 'check': {\n const eid = Number.parseInt(args.positional[0] ?? '', 10);\n if (Number.isNaN(eid)) {\n err('timelog check: event_id required', 'args');\n return 1;\n }\n dump(await client.check(eid));\n return 0;\n }\n default: {\n err(`unknown timelog action: ${action}`, 'args');\n return 1;\n }\n }\n } catch (e) {\n if (e instanceof ContractError) {\n err(e.message, 'timelog');\n return 1;\n }\n err((e as Error).message ?? String(e), 'error');\n return 1;\n }\n}\n"],"mappings":"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","names":["fs","path","resolve","mime","fs","path","err","resolve","mime","fs","path","err","resolve","fs","resolve","err","out","body","TOOL_MAP","out","err","resolve","msg","mime"]}
|