opencode-anthropic-multi-account 0.2.14 → 0.2.16
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/dist/chunk-IETVH43F.js +114 -0
- package/dist/chunk-IETVH43F.js.map +1 -0
- package/dist/chunk-RVXWLAVK.js +1130 -0
- package/dist/chunk-RVXWLAVK.js.map +1 -0
- package/dist/fingerprint-capture.d.ts +67 -0
- package/dist/fingerprint-capture.js +28 -0
- package/dist/fingerprint-capture.js.map +1 -0
- package/dist/index.js +1379 -704
- package/dist/index.js.map +1 -1
- package/dist/scrub-template.d.ts +12 -0
- package/dist/scrub-template.js +15 -0
- package/dist/scrub-template.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/fingerprint-capture.ts","../src/fingerprint-data.json","../src/cli-version.ts","../src/oauth-config-detect.ts","../src/fixtures/defaults/cc-derived-defaults.json","../src/utils.ts","../src/constants.ts","../src/config.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { createServer, type IncomingMessage } from \"node:http\";\nimport { basename, dirname, join } from \"node:path\";\nimport {\n existsSync,\n readFileSync,\n renameSync,\n} from \"node:fs\";\nimport {\n mkdir,\n rename,\n writeFile,\n} from \"node:fs/promises\";\nimport bundledTemplateJson from \"./fingerprint-data.json\";\nimport { detectCliVersion } from \"./cli-version\";\nimport { findCCBinary } from \"./oauth-config-detect\";\nimport { scrubTemplate } from \"./scrub-template\";\nimport { getConfigDir } from \"./utils\";\n\nconst CURRENT_SCHEMA_VERSION = 1;\nconst LIVE_TTL_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_CAPTURE_TIMEOUT_MS = 10_000;\nconst CACHE_FILE_NAME = \"fingerprint-cache.json\";\nconst CORRUPT_SUFFIX = \".corrupt\";\nconst LOOPBACK_HOST = \"127.0.0.1\";\nconst STATIC_HEADER_NAMES = [\n \"accept\",\n \"anthropic-beta\",\n \"anthropic-dangerous-direct-browser-access\",\n \"anthropic-version\",\n \"content-type\",\n \"user-agent\",\n \"x-app\",\n \"x-stainless-timeout\",\n] as const;\nconst SUPPORTED_CC_RANGE = {\n min: \"1.0.0\",\n maxTested: \"2.1.104\",\n} as const;\n\ntype TemplateSource = \"bundled\" | \"cached\" | \"live\";\n\ntype TemplateTool = {\n name: string;\n [key: string]: unknown;\n};\n\nexport interface TemplateData {\n _version: number;\n _schemaVersion?: number;\n _captured: string;\n _source: TemplateSource;\n agent_identity: string;\n system_prompt: string;\n tools: TemplateTool[];\n tool_names: string[];\n anthropic_beta?: string;\n cc_version?: string;\n header_order?: string[];\n header_values?: Record<string, string>;\n body_field_order?: string[];\n}\n\nexport interface CapturedRequest {\n body: Record<string, unknown>;\n headers: Record<string, string>;\n rawHeaders: string[];\n}\n\nexport interface DriftResult {\n drifted: boolean;\n cachedVersion: string | null;\n installedVersion: string | null;\n message: string;\n}\n\nexport interface CompatResult {\n status: \"unknown\" | \"below-min\" | \"untested-above\" | \"ok\";\n installedVersion: string | null;\n range: typeof SUPPORTED_CC_RANGE;\n message: string;\n}\n\ninterface FingerprintCaptureTestOverrides {\n now?: () => number;\n findClaudeBinary?: () => string | null;\n runClaudeCapture?: (params: {\n binaryPath: string;\n baseUrl: string;\n timeoutMs: number;\n }) => Promise<void>;\n detectCliVersion?: () => string;\n}\n\nconst bundledTemplate = bundledTemplateJson as TemplateData;\n\nlet fingerprintCaptureTestOverrides: FingerprintCaptureTestOverrides = {};\n\nfunction now(): number {\n return fingerprintCaptureTestOverrides.now?.() ?? Date.now();\n}\n\nfunction getCachePath(): string {\n return join(getConfigDir(), CACHE_FILE_NAME);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isTemplateTool(value: unknown): value is TemplateTool {\n return isRecord(value) && typeof value.name === \"string\" && value.name.length > 0;\n}\n\nfunction isTemplateData(value: unknown): value is TemplateData {\n if (!isRecord(value)) {\n return false;\n }\n\n return typeof value._version === \"number\"\n && typeof value._captured === \"string\"\n && typeof value._source === \"string\"\n && typeof value.agent_identity === \"string\"\n && typeof value.system_prompt === \"string\"\n && Array.isArray(value.tools)\n && value.tools.every(isTemplateTool)\n && Array.isArray(value.tool_names)\n && value.tool_names.every((toolName) => typeof toolName === \"string\");\n}\n\nfunction hasUsableToolSchemas(template: TemplateData): boolean {\n return template.tools.length > 0\n && template.tools.every((tool) => tool.name.startsWith(\"mcp__\") || isRecord(tool.input_schema));\n}\n\nfunction isUsableTemplate(template: TemplateData): boolean {\n return template._schemaVersion === CURRENT_SCHEMA_VERSION\n && hasUsableToolSchemas(template);\n}\n\nfunction cloneTemplate(template: TemplateData, sourceOverride?: TemplateSource): TemplateData {\n return {\n ...template,\n _source: sourceOverride ?? template._source,\n tools: template.tools.map((tool) => ({ ...tool })),\n tool_names: [...template.tool_names],\n header_order: template.header_order ? [...template.header_order] : undefined,\n header_values: template.header_values ? { ...template.header_values } : undefined,\n body_field_order: template.body_field_order ? [...template.body_field_order] : undefined,\n };\n}\n\nexport function prepareBundledTemplate(template: TemplateData): TemplateData {\n const rest = cloneTemplate(template, \"bundled\");\n\n return {\n ...rest,\n _version: CURRENT_SCHEMA_VERSION,\n _schemaVersion: CURRENT_SCHEMA_VERSION,\n _source: \"bundled\",\n tool_names: rest.tools.map((tool) => tool.name),\n };\n}\n\nfunction loadBundledTemplate(): TemplateData {\n if (bundledTemplate._schemaVersion !== CURRENT_SCHEMA_VERSION) {\n throw new Error(\n `bundled fingerprint schema version ${bundledTemplate._schemaVersion} does not match CURRENT_SCHEMA_VERSION ${CURRENT_SCHEMA_VERSION}`,\n );\n }\n\n return prepareBundledTemplate(bundledTemplate);\n}\n\nfunction quarantineCorruptCache(cachePath: string): void {\n if (!existsSync(cachePath)) {\n return;\n }\n\n try {\n const quarantinedPath = `${cachePath}${CORRUPT_SUFFIX}-${now()}-${process.pid}`;\n renameSync(cachePath, quarantinedPath);\n } catch {\n }\n}\n\nfunction readLiveCacheSync(sourceOverride: TemplateSource = \"cached\"): TemplateData | null {\n const cachePath = getCachePath();\n\n try {\n const parsed = JSON.parse(readFileSync(cachePath, \"utf8\")) as unknown;\n if (!isTemplateData(parsed)) {\n quarantineCorruptCache(cachePath);\n return null;\n }\n\n return cloneTemplate(parsed, sourceOverride);\n } catch (error) {\n if (existsSync(cachePath)) {\n const isMissingFileError = error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n if (!isMissingFileError) {\n quarantineCorruptCache(cachePath);\n }\n }\n return null;\n }\n}\n\nfunction isFreshTemplate(template: TemplateData): boolean {\n const capturedAt = Date.parse(template._captured);\n return Number.isFinite(capturedAt) && (now() - capturedAt) < LIVE_TTL_MS;\n}\n\nasync function atomicWriteJson(targetPath: string, payload: unknown): Promise<void> {\n const tmpPath = join(\n dirname(targetPath),\n `${basename(targetPath)}.${process.pid}.${now()}.tmp`,\n );\n\n await mkdir(dirname(targetPath), { recursive: true });\n await writeFile(tmpPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await rename(tmpPath, targetPath);\n}\n\nasync function writeLiveCache(template: TemplateData): Promise<void> {\n await atomicWriteJson(getCachePath(), cloneTemplate(template, \"live\"));\n}\n\nfunction toText(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (isRecord(value) && typeof value.text === \"string\") {\n return value.text;\n }\n\n return null;\n}\n\nfunction pickTextBlock(value: unknown): string | null {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n for (const item of value) {\n const text = toText(item);\n if (text) {\n return text;\n }\n }\n return null;\n }\n\n return toText(value);\n}\n\nfunction extractCCVersion(...sources: Array<string | undefined>): string | undefined {\n for (const source of sources) {\n if (!source) {\n continue;\n }\n\n const billingMatch = /cc_version=([0-9]+\\.[0-9]+\\.[0-9]+)/i.exec(source);\n if (billingMatch?.[1]) {\n return billingMatch[1];\n }\n\n const userAgentMatch = /(?:claude(?:-code)?[\\s/]|v)([0-9]+\\.[0-9]+\\.[0-9]+)/i.exec(source);\n if (userAgentMatch?.[1]) {\n return userAgentMatch[1];\n }\n }\n\n return undefined;\n}\n\nfunction extractHeaderOrder(rawHeaders: string[]): string[] | undefined {\n if (rawHeaders.length === 0) {\n return undefined;\n }\n\n const seen = new Set<string>();\n const orderedHeaders: string[] = [];\n\n for (let index = 0; index < rawHeaders.length; index += 2) {\n const headerName = rawHeaders[index];\n if (!headerName) {\n continue;\n }\n\n const key = headerName.toLowerCase();\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n orderedHeaders.push(headerName);\n }\n\n return orderedHeaders.length > 0 ? orderedHeaders : undefined;\n}\n\nfunction extractStaticHeaderValues(headers: Record<string, string>): Record<string, string> | undefined {\n const values: Record<string, string> = {};\n\n for (const headerName of STATIC_HEADER_NAMES) {\n const value = headers[headerName];\n if (typeof value === \"string\" && value.length > 0) {\n values[headerName] = value;\n }\n }\n\n return Object.keys(values).length > 0 ? values : undefined;\n}\n\nfunction normalizeHeaders(req: IncomingMessage): Record<string, string> {\n const normalized: Record<string, string> = {};\n\n for (const [headerName, headerValue] of Object.entries(req.headers)) {\n if (typeof headerValue === \"string\") {\n normalized[headerName] = headerValue;\n continue;\n }\n\n if (Array.isArray(headerValue)) {\n normalized[headerName] = headerValue.join(\",\");\n }\n }\n\n return normalized;\n}\n\nfunction createSseResponseBody(): string {\n return [\n 'event: message_start\\ndata: {\"type\":\"message_start\",\"message\":{\"id\":\"msg_capture\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-sonnet-4-5\",\"content\":[]}}\\n',\n 'event: content_block_start\\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"}}\\n',\n 'event: content_block_delta\\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"ok\"}}\\n',\n 'event: content_block_stop\\ndata: {\"type\":\"content_block_stop\",\"index\":0}\\n',\n 'event: message_delta\\ndata: {\"type\":\"message_delta\",\"delta\":{\"stop_reason\":\"end_turn\"},\"usage\":{\"input_tokens\":1,\"output_tokens\":1}}\\n',\n 'event: message_stop\\ndata: {\"type\":\"message_stop\"}\\n',\n ].join(\"\\n\");\n}\n\nasync function captureRequestBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n\n req.on(\"data\", (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n req.on(\"end\", () => {\n resolve(Buffer.concat(chunks).toString(\"utf8\"));\n });\n req.on(\"error\", reject);\n });\n}\n\nasync function runClaudeCapture(params: {\n binaryPath: string;\n baseUrl: string;\n timeoutMs: number;\n}): Promise<void> {\n if (fingerprintCaptureTestOverrides.runClaudeCapture) {\n await fingerprintCaptureTestOverrides.runClaudeCapture(params);\n return;\n }\n\n const isNodeScript = /\\.(?:cjs|mjs|js)$/.test(params.binaryPath);\n const command = isNodeScript ? process.execPath : params.binaryPath;\n const args = isNodeScript\n ? [params.binaryPath, \"--print\", \"-p\", \"hi\"]\n : [\"--print\", \"-p\", \"hi\"];\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, {\n env: {\n ...process.env,\n ANTHROPIC_BASE_URL: params.baseUrl,\n },\n stdio: \"ignore\",\n });\n\n const timeout = setTimeout(() => {\n child.kill(\"SIGKILL\");\n reject(new Error(\"capture timed out\"));\n }, params.timeoutMs);\n\n child.once(\"error\", (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n\n child.once(\"close\", () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n}\n\nfunction findClaudeBinary(): string | null {\n if (fingerprintCaptureTestOverrides.findClaudeBinary) {\n return fingerprintCaptureTestOverrides.findClaudeBinary();\n }\n\n return findCCBinary();\n}\n\nfunction probeInstalledCCVersion(): string | null {\n try {\n return fingerprintCaptureTestOverrides.detectCliVersion?.() ?? detectCliVersion();\n } catch {\n return null;\n }\n}\n\nexport function loadTemplate(): TemplateData {\n const cached = readLiveCacheSync(\"cached\");\n if (cached && isUsableTemplate(cached)) {\n return cached;\n }\n\n return loadBundledTemplate();\n}\n\nexport function extractTemplate(captured: CapturedRequest): TemplateData | null {\n const systemBlocks = captured.body.system;\n const tools = captured.body.tools;\n\n if (!Array.isArray(systemBlocks) || systemBlocks.length !== 3 || !Array.isArray(tools) || tools.length === 0) {\n return null;\n }\n\n const billingHeader = pickTextBlock(systemBlocks[0]);\n const agentIdentity = pickTextBlock(systemBlocks[1]);\n const systemPrompt = pickTextBlock(systemBlocks[2]);\n const extractedTools = tools.filter(isTemplateTool).map((tool) => ({ ...tool }));\n\n if (!billingHeader || !agentIdentity || !systemPrompt || extractedTools.length === 0) {\n return null;\n }\n\n const toolNames = extractedTools.map((tool) => tool.name);\n const headerValues = extractStaticHeaderValues(captured.headers);\n const bodyFieldOrder = Object.keys(captured.body);\n\n return {\n _version: CURRENT_SCHEMA_VERSION,\n _schemaVersion: CURRENT_SCHEMA_VERSION,\n _captured: new Date(now()).toISOString(),\n _source: \"live\",\n agent_identity: agentIdentity,\n system_prompt: systemPrompt,\n tools: extractedTools,\n tool_names: toolNames,\n anthropic_beta: captured.headers[\"anthropic-beta\"],\n cc_version: extractCCVersion(billingHeader, captured.headers[\"user-agent\"]),\n header_order: extractHeaderOrder(captured.rawHeaders),\n header_values: headerValues,\n body_field_order: bodyFieldOrder.length > 0 ? bodyFieldOrder : undefined,\n };\n}\n\nexport async function captureLiveTemplateAsync(timeoutMs = DEFAULT_CAPTURE_TIMEOUT_MS): Promise<TemplateData | null> {\n const binaryPath = findClaudeBinary();\n if (!binaryPath) {\n return null;\n }\n\n let capturedRequest: CapturedRequest | null = null;\n const responseBody = createSseResponseBody();\n const server = createServer(async (req, res) => {\n try {\n const bodyText = await captureRequestBody(req);\n const parsedBody = JSON.parse(bodyText) as Record<string, unknown>;\n capturedRequest = {\n body: parsedBody,\n headers: normalizeHeaders(req),\n rawHeaders: [...req.rawHeaders],\n };\n res.writeHead(200, {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"anthropic-ratelimit-unified-status\": \"accepted\",\n });\n res.end(responseBody);\n } catch {\n res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end('{\"error\":\"capture_failed\"}');\n }\n });\n\n try {\n const address = await new Promise<{ port: number }>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(0, LOOPBACK_HOST, () => {\n const resolvedAddress = server.address();\n if (resolvedAddress && typeof resolvedAddress === \"object\") {\n resolve({ port: resolvedAddress.port });\n return;\n }\n\n reject(new Error(\"capture server failed to bind\"));\n });\n });\n\n const baseUrl = `http://${LOOPBACK_HOST}:${address.port}`;\n await runClaudeCapture({ binaryPath, baseUrl, timeoutMs });\n\n if (!capturedRequest) {\n return null;\n }\n\n return extractTemplate(capturedRequest);\n } catch {\n return null;\n } finally {\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n }\n}\n\nexport async function refreshLiveFingerprintAsync(options?: {\n force?: boolean;\n silent?: boolean;\n timeoutMs?: number;\n}): Promise<TemplateData | null> {\n if (!options?.force) {\n const cached = readLiveCacheSync(\"cached\");\n if (cached && isUsableTemplate(cached) && isFreshTemplate(cached)) {\n return cached;\n }\n }\n\n if (!findClaudeBinary()) {\n return null;\n }\n\n try {\n const live = await captureLiveTemplateAsync(options?.timeoutMs ?? DEFAULT_CAPTURE_TIMEOUT_MS);\n if (!live) {\n return null;\n }\n\n const scrubbed = scrubTemplate(live, { dropMcpTools: false });\n await writeLiveCache(scrubbed);\n return scrubbed;\n } catch {\n return null;\n }\n}\n\nfunction parseVersion(version: string): [number, number, number] | null {\n const match = /^(\\d+)\\.(\\d+)\\.(\\d+)$/.exec(version);\n if (!match) {\n return null;\n }\n\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nfunction compareVersions(left: string, right: string): number | null {\n const leftVersion = parseVersion(left);\n const rightVersion = parseVersion(right);\n if (!leftVersion || !rightVersion) {\n return null;\n }\n\n for (let index = 0; index < leftVersion.length; index += 1) {\n const leftPart = leftVersion[index] ?? 0;\n const rightPart = rightVersion[index] ?? 0;\n const diff = leftPart - rightPart;\n if (diff !== 0) {\n return diff;\n }\n }\n\n return 0;\n}\n\nexport function detectDrift(template: TemplateData, installedOverride?: string | null): DriftResult {\n const cachedVersion = template.cc_version ?? null;\n const installedVersion = installedOverride ?? probeInstalledCCVersion();\n\n if (!cachedVersion) {\n return {\n drifted: false,\n cachedVersion: null,\n installedVersion,\n message: \"template version unavailable\",\n };\n }\n\n if (!installedVersion) {\n return {\n drifted: false,\n cachedVersion,\n installedVersion: null,\n message: \"probe failed\",\n };\n }\n\n if (installedVersion === cachedVersion) {\n return {\n drifted: false,\n cachedVersion,\n installedVersion,\n message: `cache v${cachedVersion} matches installed v${installedVersion}`,\n };\n }\n\n return {\n drifted: true,\n cachedVersion,\n installedVersion,\n message: `cache v${cachedVersion} != installed v${installedVersion}`,\n };\n}\n\nexport function checkCCCompat(installedOverride?: string | null): CompatResult {\n const installedVersion = installedOverride ?? probeInstalledCCVersion();\n if (!installedVersion) {\n return {\n status: \"unknown\",\n installedVersion: null,\n range: SUPPORTED_CC_RANGE,\n message: \"installed Claude Code version is unknown\",\n };\n }\n\n const minComparison = compareVersions(installedVersion, SUPPORTED_CC_RANGE.min);\n const maxComparison = compareVersions(installedVersion, SUPPORTED_CC_RANGE.maxTested);\n\n if (minComparison === null || maxComparison === null) {\n return {\n status: \"unknown\",\n installedVersion,\n range: SUPPORTED_CC_RANGE,\n message: `installed Claude Code version \\\"${installedVersion}\\\" is not a strict semver`,\n };\n }\n\n if (minComparison < 0) {\n return {\n status: \"below-min\",\n installedVersion,\n range: SUPPORTED_CC_RANGE,\n message: `installed Claude Code v${installedVersion} is below supported minimum v${SUPPORTED_CC_RANGE.min}`,\n };\n }\n\n if (maxComparison > 0) {\n return {\n status: \"untested-above\",\n installedVersion,\n range: SUPPORTED_CC_RANGE,\n message: `installed Claude Code v${installedVersion} is above max tested v${SUPPORTED_CC_RANGE.maxTested}`,\n };\n }\n\n return {\n status: \"ok\",\n installedVersion,\n range: SUPPORTED_CC_RANGE,\n message: `installed Claude Code v${installedVersion} is within supported range`,\n };\n}\n\nexport function setFingerprintCaptureTestOverridesForTest(overrides: FingerprintCaptureTestOverrides | null): void {\n fingerprintCaptureTestOverrides = overrides ?? {};\n}\n\nexport function resetFingerprintCaptureForTest(): void {\n fingerprintCaptureTestOverrides = {};\n}\n\nexport {\n LIVE_TTL_MS,\n SUPPORTED_CC_RANGE,\n};\n","{\n \"_version\": 1,\n \"_schemaVersion\": 1,\n \"_captured\": \"2026-04-18T02:05:42.332Z\",\n \"_source\": \"bundled\",\n \"agent_identity\": \"You are Claude Code, an interactive CLI tool that helps users with software engineering tasks.\",\n \"system_prompt\": \"You are Claude Code, an interactive CLI tool that helps users with software engineering tasks. Use the available tools to inspect the workspace, make precise changes, and verify the result before responding.\\n\\nYour default posture is practical, careful, and completion-oriented. Build context from the repository before making assumptions. Prefer direct evidence from files, commands, tests, and diagnostics over memory or guesswork.\\n\\nWhen working on code:\\n- inspect existing patterns before editing\\n- keep changes scoped to the requested outcome\\n- preserve surrounding style, naming, and structure\\n- avoid speculative refactors unless they are required to complete the requested task\\n- verify every meaningful change with the strongest local check available\\n\\nWhen using tools:\\n- use read, search, and symbol tools to understand the codebase before writing code\\n- use shell commands for builds, tests, package scripts, and runtime verification\\n- explain non-trivial actions briefly and clearly\\n- prefer small, reviewable edits over broad rewrites\\n- if multiple independent checks are available, run them efficiently\\n\\nWhen editing files:\\n- keep the implementation easy to read from top to bottom\\n- use descriptive names instead of magic values\\n- avoid hidden side effects and surprising behavior\\n- keep related logic together\\n- add comments only when they clarify non-obvious intent\\n\\nWhen validating work:\\n- run diagnostics on touched files when possible\\n- run focused tests for affected behavior\\n- run typechecking in typed projects\\n- run builds when the package exposes a build step\\n- if a check fails, fix the root cause and re-run verification\\n\\nWhen responding to the user:\\n- be concise, direct, and accurate\\n- focus on the task that was requested\\n- summarize what changed and what was verified\\n- mention important assumptions or follow-up risks only when they matter\\n\\nOperational guidance:\\n- treat repository state as the source of truth\\n- prefer deterministic behavior over clever shortcuts\\n- do not invent undocumented APIs or file formats when local evidence is missing\\n- if a requested detail is ambiguous, choose the simplest implementation that still satisfies the observable contract\\n- preserve user data and existing behavior unless the requested change requires otherwise\\n\\nSafety guidance:\\n- support defensive security work, debugging, testing, and code maintenance\\n- refuse requests to create or improve malware, credential theft, bulk secret harvesting, or other clearly harmful capabilities\\n- do not exfiltrate secrets from the environment, local files, or external services\\n- avoid destructive operations unless they are explicitly required and safe to perform\\n\\nTool execution discipline:\\n- use task tracking for multi-step work so progress stays visible\\n- complete one active step at a time\\n- after each code change, move immediately to verification\\n- if verification reveals a problem, continue until the implementation and checks agree\\n\\nRepository interaction discipline:\\n- prefer local source files, tests, and configuration over informal assumptions\\n- preserve compatibility with existing consumers when editing shared interfaces\\n- keep bundled fallback data conservative when live capture data is unavailable\\n- when request templates depend on multiple system blocks, preserve the extracted fields that downstream code needs rather than reconstructing unrelated runtime state\\n\\nYou should act like a reliable engineering assistant inside a terminal environment: inspect first, edit precisely, verify thoroughly, and only then report the result.\",\n \"tools\": [\n {\n \"name\": \"Bash\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"Read\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"Write\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"Edit\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"Glob\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"Grep\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"WebFetch\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"TodoWrite\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"TaskCreate\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"TaskGet\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"TaskList\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"TaskOutput\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"TaskStop\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"LSP\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"Monitor\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"NotebookEdit\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n },\n {\n \"name\": \"Skill\",\n \"input_schema\": {\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"type\": \"object\",\n \"properties\": {},\n \"additionalProperties\": true\n }\n }\n ],\n \"tool_names\": [\n \"Bash\",\n \"Read\",\n \"Write\",\n \"Edit\",\n \"Glob\",\n \"Grep\",\n \"WebFetch\",\n \"TodoWrite\",\n \"TaskCreate\",\n \"TaskGet\",\n \"TaskList\",\n \"TaskOutput\",\n \"TaskStop\",\n \"LSP\",\n \"Monitor\",\n \"NotebookEdit\",\n \"Skill\"\n ],\n \"anthropic_beta\": \"claude-code-20250219,oauth-2025-04-20,context-1m-2025-08-07,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advisor-tool-2026-03-01,effort-2025-11-24\",\n \"header_values\": {\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-beta\": \"claude-code-20250219,oauth-2025-04-20,context-1m-2025-08-07,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advisor-tool-2026-03-01,effort-2025-11-24\",\n \"x-app\": \"cli\"\n },\n \"header_order\": [\n \"Accept\",\n \"Authorization\",\n \"Content-Type\",\n \"User-Agent\",\n \"X-Claude-Code-Session-Id\",\n \"X-Stainless-Arch\",\n \"X-Stainless-Lang\",\n \"X-Stainless-OS\",\n \"X-Stainless-Package-Version\",\n \"X-Stainless-Retry-Count\",\n \"X-Stainless-Runtime\",\n \"X-Stainless-Runtime-Version\",\n \"X-Stainless-Timeout\",\n \"anthropic-beta\",\n \"anthropic-dangerous-direct-browser-access\",\n \"anthropic-version\",\n \"x-app\",\n \"Connection\",\n \"Host\",\n \"Accept-Encoding\",\n \"Content-Length\"\n ],\n \"body_field_order\": [\n \"model\",\n \"messages\",\n \"system\",\n \"tools\",\n \"metadata\",\n \"max_tokens\",\n \"thinking\",\n \"context_management\",\n \"output_config\",\n \"stream\"\n ],\n \"cc_version\": \"2.1.111\"\n}\n","import { execFileSync } from \"node:child_process\";\n\nconst DEFAULT_CLI_VERSION = \"2.1.100\";\nconst CLI_VERSION_PATTERN = /(\\d+\\.\\d+\\.\\d+)/;\nconst CLAUDE_VERSION_TIMEOUT_MS = 3_000;\n\nlet detectedVersion: string | null = null;\n\nfunction parseCliVersion(output: string): string | null {\n return output.match(CLI_VERSION_PATTERN)?.[1] ?? null;\n}\n\nexport function detectCliVersion(): string {\n if (detectedVersion !== null) {\n return detectedVersion;\n }\n\n const overriddenVersion = process.env.ANTHROPIC_CLI_VERSION;\n if (overriddenVersion) {\n detectedVersion = overriddenVersion;\n return detectedVersion;\n }\n\n try {\n const output = execFileSync(\"claude\", [\"--version\"], {\n encoding: \"utf8\",\n timeout: CLAUDE_VERSION_TIMEOUT_MS,\n });\n detectedVersion = parseCliVersion(output) ?? DEFAULT_CLI_VERSION;\n } catch {\n detectedVersion = DEFAULT_CLI_VERSION;\n }\n\n return detectedVersion;\n}\n\nexport function resetDetectedVersionForTest(): void {\n detectedVersion = null;\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir, platform } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport derivedDefaultsJson from \"./fixtures/defaults/cc-derived-defaults.json\";\nimport { getConfigDir } from \"./utils\";\n\nexport interface DetectedOAuthConfig {\n clientId: string;\n authorizeUrl: string;\n tokenUrl: string;\n scopes: string;\n baseApiUrl: string;\n source: \"detected\" | \"cached\" | \"fallback\";\n ccPath?: string;\n ccHash?: string;\n}\n\ntype DetectedOAuthConfigPayload = Omit<DetectedOAuthConfig, \"source\" | \"ccPath\" | \"ccHash\">;\ntype OAuthConfigCache = Record<string, DetectedOAuthConfigPayload>;\n\ninterface CacheFilePayload {\n entries?: Record<string, unknown>;\n savedAt?: number;\n}\n\ninterface DetectorTestOverrides {\n findCCBinary?: () => string | null;\n readBinaryFile?: (path: string) => Promise<Buffer>;\n}\n\nconst CONFIG_SCAN_WINDOW_CHARS = 4096;\nconst CONFIG_SCAN_LOOKBACK_CHARS = 512;\nconst REJECTED_SCOPE = [\"org\", \"create_api_key\"].join(\":\");\nconst SAFE_FALLBACK_SCOPES = \"user:profile user:inference user:sessions:claude_code user:mcp_servers user:file_upload\";\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst CACHE_FILE_NAME = \"anthropic-oauth-config-cache.json\";\nconst derivedDefaults = derivedDefaultsJson as {\n oauth?: {\n clientId?: string;\n authorizeUrl?: string;\n tokenUrl?: string;\n scopes?: string;\n baseApiUrl?: string;\n };\n};\n\nexport const FALLBACK: DetectedOAuthConfig = {\n clientId: derivedDefaults.oauth?.clientId || \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\",\n authorizeUrl: derivedDefaults.oauth?.authorizeUrl || \"https://claude.com/cai/oauth/authorize\",\n tokenUrl: derivedDefaults.oauth?.tokenUrl || \"https://platform.claude.com/v1/oauth/token\",\n scopes: sanitizeScopes(derivedDefaults.oauth?.scopes),\n baseApiUrl: derivedDefaults.oauth?.baseApiUrl || \"https://api.anthropic.com\",\n source: \"fallback\",\n};\n\nfunction sanitizeScopes(scopes: string | null | undefined): string {\n if (!scopes || scopes.includes(REJECTED_SCOPE)) {\n return SAFE_FALLBACK_SCOPES;\n }\n\n return scopes;\n}\n\nfunction pickNearestScopes(block: string, centerIndex: number): string | null {\n return pickNearestValue(block, centerIndex, /SCOPES\\s*:\\s*\"([^\"]+)\"/gi)\n || pickNearestValue(block, centerIndex, /scope[s]?\\s*:\\s*\"([^\"]+)\"/gi)\n || null;\n}\n\nfunction isLikelyLocalUrl(value: string | undefined): boolean {\n if (!value) {\n return false;\n }\n\n try {\n const host = new URL(value).hostname.toLowerCase();\n return host === \"localhost\"\n || host === \"127.0.0.1\"\n || host === \"0.0.0.0\"\n || host.endsWith(\".local\");\n } catch {\n return false;\n }\n}\n\nfunction extractCandidateBlocks(binaryText: string): string[] {\n const blocks: string[] = [];\n const seenRanges = new Set<string>();\n const clientIdMatches = [...binaryText.matchAll(/CLIENT_ID\\s*:\\s*\"([0-9a-f-]{36})\"/gi)];\n\n for (let index = 0; index < clientIdMatches.length; index += 1) {\n const currentMatch = clientIdMatches[index];\n if (!currentMatch) {\n continue;\n }\n\n const currentIndex = currentMatch.index ?? 0;\n const previousClientIdIndex = clientIdMatches[index - 1]?.index;\n const nextClientIdIndex = clientIdMatches[index + 1]?.index;\n const leftBoundary = previousClientIdIndex === undefined\n ? Math.max(0, currentIndex - CONFIG_SCAN_LOOKBACK_CHARS)\n : Math.floor((previousClientIdIndex + currentIndex) / 2);\n const rightBoundary = nextClientIdIndex === undefined\n ? Math.min(binaryText.length, currentIndex + CONFIG_SCAN_WINDOW_CHARS)\n : Math.floor((currentIndex + nextClientIdIndex) / 2);\n const start = Math.max(0, leftBoundary);\n const end = Math.min(binaryText.length, Math.max(currentIndex + 1, rightBoundary));\n const key = `${start}:${end}`;\n\n if (seenRanges.has(key)) {\n continue;\n }\n\n seenRanges.add(key);\n blocks.push(binaryText.slice(start, end));\n }\n\n if (blocks.length === 0 && binaryText.length > 0) {\n blocks.push(binaryText.slice(0, Math.min(binaryText.length, CONFIG_SCAN_WINDOW_CHARS)));\n }\n\n return blocks;\n}\n\ninterface ScoredOAuthCandidate {\n payload: DetectedOAuthConfigPayload;\n score: number;\n}\n\nfunction pickNearestValue(block: string, centerIndex: number, pattern: RegExp): string | undefined {\n let nearestValue: string | undefined;\n let nearestDistance = Number.POSITIVE_INFINITY;\n\n for (const match of block.matchAll(pattern)) {\n const matchIndex = match.index ?? 0;\n const distance = Math.abs(matchIndex - centerIndex);\n\n if (distance < nearestDistance) {\n nearestDistance = distance;\n nearestValue = match[1];\n }\n }\n\n return nearestValue;\n}\n\nfunction scoreCandidate(candidate: DetectedOAuthConfigPayload, extractedScopes: string | null): number {\n let score = 0;\n\n if (UUID_PATTERN.test(candidate.clientId)) score += 4;\n if (candidate.baseApiUrl.startsWith(\"https://\")) score += 3;\n if (!isLikelyLocalUrl(candidate.baseApiUrl)) score += 5;\n if (!isLikelyLocalUrl(candidate.authorizeUrl)) score += 2;\n if (!isLikelyLocalUrl(candidate.tokenUrl)) score += 2;\n if (extractedScopes) score += 2;\n if (candidate.scopes.includes(\"user:sessions:claude_code\")) score += 1;\n\n return score;\n}\n\nfunction extractCandidateFromBlock(block: string): ScoredOAuthCandidate | null {\n const clientIdMatch = /CLIENT_ID\\s*:\\s*\"([0-9a-f-]{36})\"/i.exec(block);\n if (!clientIdMatch?.[1]) {\n return null;\n }\n\n const clientIdIndex = clientIdMatch.index ?? 0;\n const authorizeUrl = pickNearestValue(block, clientIdIndex, /CLAUDE_AI_AUTHORIZE_URL\\s*:\\s*\"([^\"]+)\"/gi);\n const baseApiUrl = pickNearestValue(block, clientIdIndex, /BASE_API_URL\\s*:\\s*\"([^\"]+)\"/gi);\n const tokenUrl = pickNearestValue(block, clientIdIndex, /TOKEN_URL\\s*:\\s*\"(https:\\/\\/[^\\\"]*\\/oauth\\/token[^\\\"]*)\"/gi);\n const extractedScopes = pickNearestScopes(block, clientIdIndex);\n\n const payload: DetectedOAuthConfigPayload = {\n clientId: clientIdMatch[1],\n authorizeUrl: authorizeUrl || FALLBACK.authorizeUrl,\n tokenUrl: tokenUrl || FALLBACK.tokenUrl,\n scopes: sanitizeScopes(extractedScopes),\n baseApiUrl: baseApiUrl || FALLBACK.baseApiUrl,\n };\n\n if (!isDetectedOAuthConfigPayload(payload)) {\n return null;\n }\n\n return {\n payload,\n score: scoreCandidate(payload, extractedScopes),\n };\n}\n\nlet memoizedConfig: DetectedOAuthConfig | null = null;\nlet detectorTestOverrides: DetectorTestOverrides = {};\n\nfunction candidatePaths(): string[] {\n const home = homedir();\n\n if (platform() === \"win32\") {\n return [\n join(home, \".local\", \"bin\", \"claude.exe\"),\n join(home, \"AppData\", \"Roaming\", \"npm\", \"node_modules\", \"@anthropic-ai\", \"claude-code\", \"cli.js\"),\n join(home, \"AppData\", \"Roaming\", \"npm\", \"node_modules\", \"@anthropic-ai\", \"claude-code\", \"cli.mjs\"),\n join(home, \".claude\", \"local\", \"node_modules\", \"@anthropic-ai\", \"claude-code\", \"cli.js\"),\n join(home, \".claude\", \"local\", \"node_modules\", \"@anthropic-ai\", \"claude-code\", \"cli.mjs\"),\n ];\n }\n\n return [\n join(home, \".local\", \"bin\", \"claude\"),\n \"/usr/local/bin/claude\",\n \"/opt/homebrew/bin/claude\",\n \"/usr/local/lib/node_modules/@anthropic-ai/claude-code/cli.js\",\n \"/usr/local/lib/node_modules/@anthropic-ai/claude-code/cli.mjs\",\n \"/opt/homebrew/lib/node_modules/@anthropic-ai/claude-code/cli.js\",\n join(home, \".claude\", \"local\", \"node_modules\", \"@anthropic-ai\", \"claude-code\", \"cli.js\"),\n join(home, \".claude\", \"local\", \"node_modules\", \"@anthropic-ai\", \"claude-code\", \"cli.mjs\"),\n ];\n}\n\nfunction getCachePath(): string {\n return join(getConfigDir(), CACHE_FILE_NAME);\n}\n\nfunction isValidUrl(value: string): boolean {\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isDetectedOAuthConfigPayload(value: unknown): value is DetectedOAuthConfigPayload {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const candidate = value as Partial<DetectedOAuthConfigPayload>;\n return typeof candidate.clientId === \"string\"\n && UUID_PATTERN.test(candidate.clientId)\n && typeof candidate.authorizeUrl === \"string\"\n && isValidUrl(candidate.authorizeUrl)\n && typeof candidate.tokenUrl === \"string\"\n && isValidUrl(candidate.tokenUrl)\n && typeof candidate.scopes === \"string\"\n && candidate.scopes.length > 0;\n}\n\nfunction toFallbackConfig(ccPath?: string, ccHash?: string): DetectedOAuthConfig {\n return {\n ...FALLBACK,\n ...(ccPath ? { ccPath } : {}),\n ...(ccHash ? { ccHash } : {}),\n };\n}\n\nexport function findCCBinary(): string | null {\n const override = process.env.DARIO_CC_PATH;\n if (override && existsSync(override)) {\n return override;\n }\n\n for (const candidatePath of candidatePaths()) {\n if (existsSync(candidatePath)) {\n return candidatePath;\n }\n }\n\n return null;\n}\n\nexport async function fingerprintBinary(path: string): Promise<string> {\n const binaryContents = await readFile(path);\n return createHash(\"sha256\").update(binaryContents).digest(\"hex\").slice(0, 16);\n}\n\nexport function scanBinaryForOAuthConfig(buf: Buffer): DetectedOAuthConfigPayload | null {\n const binaryText = buf.toString(\"latin1\");\n const candidates = extractCandidateBlocks(binaryText)\n .map(extractCandidateFromBlock)\n .filter((candidate): candidate is ScoredOAuthCandidate => candidate !== null)\n .sort((left, right) => right.score - left.score);\n\n return candidates[0]?.payload ?? null;\n}\n\nexport async function loadCache(): Promise<OAuthConfigCache> {\n try {\n const raw = await readFile(getCachePath(), \"utf-8\");\n const parsed = JSON.parse(raw) as CacheFilePayload;\n\n if (typeof parsed !== \"object\" || parsed === null || typeof parsed.entries !== \"object\" || parsed.entries === null) {\n return {};\n }\n\n const validEntries: OAuthConfigCache = {};\n\n for (const [hash, value] of Object.entries(parsed.entries)) {\n if (isDetectedOAuthConfigPayload(value)) {\n validEntries[hash] = value;\n }\n }\n\n return validEntries;\n } catch {\n return {};\n }\n}\n\nexport async function saveCache(hash: string, config: DetectedOAuthConfigPayload): Promise<void> {\n try {\n const cachePath = getCachePath();\n const currentEntries = await loadCache();\n currentEntries[hash] = config;\n\n await mkdir(dirname(cachePath), { recursive: true });\n await writeFile(\n cachePath,\n JSON.stringify({ entries: currentEntries, savedAt: Date.now() }, null, 2),\n \"utf-8\",\n );\n } catch {\n }\n}\n\nexport async function detectOAuthConfig(): Promise<DetectedOAuthConfig> {\n if (memoizedConfig) {\n return memoizedConfig;\n }\n\n try {\n const ccPath = (detectorTestOverrides.findCCBinary || findCCBinary)();\n if (!ccPath) {\n memoizedConfig = FALLBACK;\n return memoizedConfig;\n }\n\n const ccHash = await fingerprintBinary(ccPath);\n const cachedEntries = await loadCache();\n const cachedConfig = cachedEntries[ccHash];\n\n if (cachedConfig) {\n memoizedConfig = {\n ...cachedConfig,\n source: \"cached\",\n ccPath,\n ccHash,\n };\n return memoizedConfig;\n }\n\n const readBinaryFile = detectorTestOverrides.readBinaryFile || readFile;\n const scannedConfig = scanBinaryForOAuthConfig(await readBinaryFile(ccPath));\n if (!scannedConfig || !isDetectedOAuthConfigPayload(scannedConfig)) {\n memoizedConfig = toFallbackConfig(ccPath, ccHash);\n return memoizedConfig;\n }\n\n await saveCache(ccHash, scannedConfig);\n memoizedConfig = {\n ...scannedConfig,\n source: \"detected\",\n ccPath,\n ccHash,\n };\n return memoizedConfig;\n } catch {\n memoizedConfig = FALLBACK;\n return memoizedConfig;\n }\n}\n\nexport function resetOAuthConfigDetectionForTest(): void {\n memoizedConfig = null;\n detectorTestOverrides = {};\n}\n\nexport function setOAuthConfigDetectionOverridesForTest(overrides: DetectorTestOverrides | null): void {\n detectorTestOverrides = overrides ?? {};\n}\n","{\n \"request\": {\n \"baseApiUrl\": \"https://api.anthropic.com\",\n \"anthropicVersion\": \"2023-06-01\",\n \"xApp\": \"cli\",\n \"betaHeader\": \"claude-code-20250219,oauth-2025-04-20,context-1m-2025-08-07,interleaved-thinking-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05,advisor-tool-2026-03-01,effort-2025-11-24\"\n },\n \"oauth\": {\n \"clientId\": \"9d1c250a-e61b-44d9-88ed-5944d1962f5e\",\n \"authorizeUrl\": \"https://claude.com/cai/oauth/authorize\",\n \"tokenUrl\": \"https://platform.claude.com/v1/oauth/token\",\n \"scopes\": \"user:profile user:inference user:sessions:claude_code user:mcp_servers user:file_upload\",\n \"baseApiUrl\": \"https://api.anthropic.com\"\n }\n}\n","export {\n createMinimalClient,\n formatWaitTime,\n getAccountLabel,\n getConfigDir,\n getErrorCode,\n sleep,\n} from \"opencode-multi-account-core\";\nimport type { PluginClient } from \"./types\";\nimport { ANTHROPIC_OAUTH_ADAPTER } from \"./constants\";\nimport { getConfig } from \"./config\";\n\nexport async function showToast(\n client: PluginClient,\n message: string,\n variant: \"info\" | \"warning\" | \"success\" | \"error\",\n): Promise<void> {\n if (getConfig().quiet_mode) return;\n try {\n await client.tui.showToast({ body: { message, variant } });\n } catch {\n }\n}\n\nexport function debugLog(\n client: PluginClient,\n message: string,\n extra?: Record<string, unknown>,\n): void {\n if (!getConfig().debug) return;\n client.app.log({\n body: { service: ANTHROPIC_OAUTH_ADAPTER.serviceLogName, level: \"debug\", message, extra },\n }).catch(() => {});\n}\n","import { anthropicOAuthAdapter } from \"opencode-multi-account-core\";\n\nexport const ANTHROPIC_OAUTH_ADAPTER = anthropicOAuthAdapter;\n\nexport const ANTHROPIC_CLIENT_ID = ANTHROPIC_OAUTH_ADAPTER.oauthClientId;\nexport const ANTHROPIC_TOKEN_ENDPOINT = ANTHROPIC_OAUTH_ADAPTER.tokenEndpoint;\nexport const ANTHROPIC_USAGE_ENDPOINT = ANTHROPIC_OAUTH_ADAPTER.usageEndpoint;\nexport const ANTHROPIC_PROFILE_ENDPOINT = ANTHROPIC_OAUTH_ADAPTER.profileEndpoint;\n\nexport const ACCOUNTS_FILENAME = ANTHROPIC_OAUTH_ADAPTER.accountStorageFilename;\nexport const CLAIMS_FILENAME = \"anthropic-multi-account-claims.json\";\nexport const PLAN_LABELS = ANTHROPIC_OAUTH_ADAPTER.planLabels;\n\nexport const TOKEN_EXPIRY_BUFFER_MS = 60_000;\nexport const TOKEN_REFRESH_TIMEOUT_MS = 30_000;\n","import {\n createConfigLoader,\n} from \"opencode-multi-account-core\";\n\nconst configLoader = createConfigLoader(\"claude-multiauth.json\");\n\nexport {\n configLoader,\n};\n\nexport const { getConfig, loadConfig, resetConfigCache, updateConfigField } = configLoader;\n"],"mappings":"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","names":["dirname","join","existsSync","mkdir","writeFile","CACHE_FILE_NAME","getCachePath","join","existsSync","dirname","mkdir","writeFile"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
declare const LIVE_TTL_MS: number;
|
|
2
|
+
declare const SUPPORTED_CC_RANGE: {
|
|
3
|
+
readonly min: "1.0.0";
|
|
4
|
+
readonly maxTested: "2.1.104";
|
|
5
|
+
};
|
|
6
|
+
type TemplateSource = "bundled" | "cached" | "live";
|
|
7
|
+
type TemplateTool = {
|
|
8
|
+
name: string;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
};
|
|
11
|
+
interface TemplateData {
|
|
12
|
+
_version: number;
|
|
13
|
+
_schemaVersion?: number;
|
|
14
|
+
_captured: string;
|
|
15
|
+
_source: TemplateSource;
|
|
16
|
+
agent_identity: string;
|
|
17
|
+
system_prompt: string;
|
|
18
|
+
tools: TemplateTool[];
|
|
19
|
+
tool_names: string[];
|
|
20
|
+
anthropic_beta?: string;
|
|
21
|
+
cc_version?: string;
|
|
22
|
+
header_order?: string[];
|
|
23
|
+
header_values?: Record<string, string>;
|
|
24
|
+
body_field_order?: string[];
|
|
25
|
+
}
|
|
26
|
+
interface CapturedRequest {
|
|
27
|
+
body: Record<string, unknown>;
|
|
28
|
+
headers: Record<string, string>;
|
|
29
|
+
rawHeaders: string[];
|
|
30
|
+
}
|
|
31
|
+
interface DriftResult {
|
|
32
|
+
drifted: boolean;
|
|
33
|
+
cachedVersion: string | null;
|
|
34
|
+
installedVersion: string | null;
|
|
35
|
+
message: string;
|
|
36
|
+
}
|
|
37
|
+
interface CompatResult {
|
|
38
|
+
status: "unknown" | "below-min" | "untested-above" | "ok";
|
|
39
|
+
installedVersion: string | null;
|
|
40
|
+
range: typeof SUPPORTED_CC_RANGE;
|
|
41
|
+
message: string;
|
|
42
|
+
}
|
|
43
|
+
interface FingerprintCaptureTestOverrides {
|
|
44
|
+
now?: () => number;
|
|
45
|
+
findClaudeBinary?: () => string | null;
|
|
46
|
+
runClaudeCapture?: (params: {
|
|
47
|
+
binaryPath: string;
|
|
48
|
+
baseUrl: string;
|
|
49
|
+
timeoutMs: number;
|
|
50
|
+
}) => Promise<void>;
|
|
51
|
+
detectCliVersion?: () => string;
|
|
52
|
+
}
|
|
53
|
+
declare function prepareBundledTemplate(template: TemplateData): TemplateData;
|
|
54
|
+
declare function loadTemplate(): TemplateData;
|
|
55
|
+
declare function extractTemplate(captured: CapturedRequest): TemplateData | null;
|
|
56
|
+
declare function captureLiveTemplateAsync(timeoutMs?: number): Promise<TemplateData | null>;
|
|
57
|
+
declare function refreshLiveFingerprintAsync(options?: {
|
|
58
|
+
force?: boolean;
|
|
59
|
+
silent?: boolean;
|
|
60
|
+
timeoutMs?: number;
|
|
61
|
+
}): Promise<TemplateData | null>;
|
|
62
|
+
declare function detectDrift(template: TemplateData, installedOverride?: string | null): DriftResult;
|
|
63
|
+
declare function checkCCCompat(installedOverride?: string | null): CompatResult;
|
|
64
|
+
declare function setFingerprintCaptureTestOverridesForTest(overrides: FingerprintCaptureTestOverrides | null): void;
|
|
65
|
+
declare function resetFingerprintCaptureForTest(): void;
|
|
66
|
+
|
|
67
|
+
export { type CapturedRequest, type CompatResult, type DriftResult, LIVE_TTL_MS, SUPPORTED_CC_RANGE, type TemplateData, captureLiveTemplateAsync, checkCCCompat, detectDrift, extractTemplate, loadTemplate, prepareBundledTemplate, refreshLiveFingerprintAsync, resetFingerprintCaptureForTest, setFingerprintCaptureTestOverridesForTest };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LIVE_TTL_MS,
|
|
3
|
+
SUPPORTED_CC_RANGE,
|
|
4
|
+
captureLiveTemplateAsync,
|
|
5
|
+
checkCCCompat,
|
|
6
|
+
detectDrift,
|
|
7
|
+
extractTemplate,
|
|
8
|
+
loadTemplate,
|
|
9
|
+
prepareBundledTemplate,
|
|
10
|
+
refreshLiveFingerprintAsync,
|
|
11
|
+
resetFingerprintCaptureForTest,
|
|
12
|
+
setFingerprintCaptureTestOverridesForTest
|
|
13
|
+
} from "./chunk-RVXWLAVK.js";
|
|
14
|
+
import "./chunk-IETVH43F.js";
|
|
15
|
+
export {
|
|
16
|
+
LIVE_TTL_MS,
|
|
17
|
+
SUPPORTED_CC_RANGE,
|
|
18
|
+
captureLiveTemplateAsync,
|
|
19
|
+
checkCCCompat,
|
|
20
|
+
detectDrift,
|
|
21
|
+
extractTemplate,
|
|
22
|
+
loadTemplate,
|
|
23
|
+
prepareBundledTemplate,
|
|
24
|
+
refreshLiveFingerprintAsync,
|
|
25
|
+
resetFingerprintCaptureForTest,
|
|
26
|
+
setFingerprintCaptureTestOverridesForTest
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=fingerprint-capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|