@tokentestai/ais 0.1.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/LICENSE +21 -0
- package/README.en.md +238 -0
- package/README.fr.md +238 -0
- package/README.ja.md +234 -0
- package/README.ko.md +234 -0
- package/README.md +234 -0
- package/dist/chunk-WVTDLVUU.js +1400 -0
- package/dist/chunk-WVTDLVUU.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +6145 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +547 -0
- package/dist/index.js +5784 -0
- package/dist/index.js.map +1 -0
- package/dist/postinstall.d.ts +27 -0
- package/dist/postinstall.js +54 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +62 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli-app.ts","../src/ais-runtime.ts","../src/detector/context-detector.ts","../src/detector/entropy-detector.ts","../src/detector/pattern-detector.ts","../src/detector/combined-detector.ts","../src/interceptor/stream-replacer.ts","../src/interceptor/bidirectional.ts","../src/pty/wrapper.ts","../src/proxy/environment.ts","../src/proxy/server.ts","../src/proxy/responses-compat.ts","../src/proxy/websocket-relay.ts","../src/storage/encrypted-vault.ts","../src/storage/keychain.ts","../src/storage/storage-manager.ts","../src/vault/session-vault.ts","../src/cli-options.ts","../src/package-info.ts","../src/update/self-update.ts","../src/update/check.ts","../src/cli.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { createInterface } from 'node:readline/promises';\nimport { Writable } from 'node:stream';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nimport { AisStore, type AisState } from './ais/index.js';\nimport {\n PROTECT_TOOLS,\n loadAutomationState,\n saveAutomationState,\n type AutomationState,\n type LoadedAutomationState,\n type ProtectTool,\n} from './automation/index.js';\nimport { AisRuntime, type AisStats, type AisRuntimeOptions } from './ais-runtime.js';\nimport { parseCliInvocation, type CliGlobalOptions } from './cli-options.js';\nimport {\n createDefaultConfig,\n expandHomePath,\n loadConfig,\n saveConfig,\n type AisConfig,\n} from './config.js';\nimport { PatternDetector } from './detector/pattern-detector.js';\nimport { getPackageInfo, VERSION } from './package-info.js';\nimport {\n refreshProtectRuntime,\n resolveProtectedCommand,\n restoreProtectRuntime,\n syncProtectRuntime,\n type ProtectRuntimeOptions,\n type ProtectShellRunner,\n} from './protect/index.js';\nimport { EncryptedVault, StorageManager } from './storage/index.js';\nimport {\n maybeRunStartupSelfUpdate,\n resolveCurrentPackageRootFromUrl,\n runManualSelfUpdate,\n type UpdateCommandRunner,\n} from './update/self-update.js';\nimport type { SecretType, VaultEntry } from './vault/types.js';\n\nconst HELP_TEXT = `AIS - Local protection for AI agent secrets\n\nUsage:\n ais <command> [args...] Wrap an AI agent with secret protection\n ais add <name> [secret] Register a secret in the vault\n ais ais [show] Open the AIS TUI for recent records\n ais protect <action> Manage default protection preferences\n ais list List registered secrets\n ais remove <name> Remove a secret from the vault\n ais status Show current local status\n ais update Check now and install a newer version when available\n ais config View or create configuration\n\nOptions:\n -v, --version Show version\n -h, --help Show help\n -d, --debug Enable debug output\n -c, --config <path> Use a custom config file\n --proxy-port <port> Use a fixed local proxy port\n --skip-update-check Skip the automatic update check for this run\n --dry-run Detect but do not replace\n --no-entropy Disable entropy detection\n --no-context Disable context keyword detection\n\nExamples:\n ais claude\n ais -- codex --sandbox danger-full-access\n ais ais\n ais protect off codex\n ais config set update.channel next\n ais add github-token\n ais add github-token ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`;\n\ntype AisRuntimeLike = {\n getStats(): AisStats;\n start(command: string, args: string[]): Promise<void>;\n};\n\nexport interface CliRunOptions {\n createAisRuntime?: (options: AisRuntimeOptions) => AisRuntimeLike;\n currentCliPath?: string;\n env?: NodeJS.ProcessEnv;\n fetch?: typeof fetch;\n now?: () => number;\n protectNodePath?: string;\n protectShellPath?: string;\n protectShellRunner?: ProtectShellRunner;\n readSecret?: (name: string) => Promise<string>;\n stderr?: Pick<Writable, 'write'>;\n stdin?: NodeJS.ReadStream;\n stdout?: Pick<Writable, 'write'>;\n updateCommandRunner?: UpdateCommandRunner;\n updateCurrentPackageRoot?: string;\n}\n\nexport async function runCli(args: string[], options: CliRunOptions = {}): Promise<number> {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const env = options.env ?? process.env;\n const invocation = parseCliInvocation(args);\n\n try {\n if (invocation.type === 'error') {\n writeLine(stderr, invocation.message);\n return 1;\n }\n\n if (invocation.type === 'help') {\n writeLine(stdout, HELP_TEXT);\n return 0;\n }\n\n if (invocation.type === 'version') {\n writeLine(stdout, VERSION);\n return 0;\n }\n\n const loadedConfig = await loadConfig(invocation.options.config);\n const config = loadedConfig.config;\n const loadedAutomationState = await loadAutomationState(config.automation.statePath);\n const packageInfo = getPackageInfo();\n const updateCurrentPackageRoot = resolveUpdateCurrentPackageRoot(options, packageInfo.name);\n const storageManager = new StorageManager({\n env,\n persistDetectedSecrets: config.storage.persistSecrets,\n vaultPath: expandHomePath(config.storage.vaultPath),\n });\n const protectRuntimeOptions = buildProtectRuntimeOptions(env, options);\n const aisStore = new AisStore({\n path: config.ais.statePath,\n recentLimit: config.ais.recentLimit,\n });\n await aisStore.load();\n writeAutomationStateRecoveryWarning(stderr, loadedAutomationState);\n\n switch (invocation.type) {\n case 'ais': {\n if (invocation.action === 'show') {\n if (shouldRunInteractiveAis(options.stdin ?? process.stdin, stdout)) {\n await runAisTui(aisStore, loadedConfig.path);\n } else {\n writeLine(stdout, formatAisDashboard(aisStore.getState(), loadedConfig.path, aisStore.getPath()));\n }\n return 0;\n }\n\n if (invocation.action === 'exclude' || invocation.action === 'include') {\n const excluded = invocation.action === 'exclude';\n const target = invocation.target ?? '';\n const found = aisStore.setRecordExcluded(target, excluded);\n if (!found) {\n throw new Error(`AIS recent record not found: ${target}`);\n }\n\n await aisStore.save();\n writeLine(\n stdout,\n excluded ? `AIS recent record ${target} will stay plain next time.` : `AIS recent record ${target} is protected again.`,\n );\n return 0;\n }\n\n const secretType = invocation.secretType;\n if (!secretType) {\n throw new Error('AIS type action requires a secret type.');\n }\n\n const excluded = invocation.action === 'exclude-type';\n aisStore.setTypeExcluded(secretType, excluded);\n await aisStore.save();\n writeLine(\n stdout,\n excluded ? `AIS type ${secretType} will stay plain next time.` : `AIS type ${secretType} is protected again.`,\n );\n return 0;\n }\n\n case 'config': {\n if (invocation.action === 'show') {\n if (!loadedConfig.exists) {\n await saveConfig(config, loadedConfig.path);\n }\n\n writeLine(stdout, `Config: ${loadedConfig.path}`);\n writeLine(stdout, JSON.stringify(config, null, 2));\n return 0;\n }\n\n if (invocation.action === 'get') {\n const value = readConfigValue(config, invocation.key);\n writeLine(stdout, formatConfigValue(invocation.key, value));\n return 0;\n }\n\n const nextConfig = setConfigValue(config, invocation.key, invocation.value);\n await saveConfig(nextConfig, loadedConfig.path);\n writeLine(stdout, `Config updated: ${formatConfigValue(invocation.key, readConfigValue(nextConfig, invocation.key))}`);\n return 0;\n }\n\n case 'protect': {\n if (invocation.action === 'status') {\n const refreshed = await refreshProtectRuntime(loadedAutomationState.state, protectRuntimeOptions);\n if (refreshed.changed) {\n await saveAutomationState(refreshed.state, loadedAutomationState.path);\n }\n\n writeLine(stdout, formatProtectStatus(config, { ...loadedAutomationState, state: refreshed.state }));\n return 0;\n }\n\n if (invocation.action === 'restore') {\n const restored = await restoreProtectRuntime(config, loadedAutomationState.state, protectRuntimeOptions);\n await saveConfig(restored.config, loadedConfig.path);\n await saveAutomationState(restored.state, loadedAutomationState.path);\n writeProtectMessages(stderr, restored);\n writeLine(stdout, 'Protect restored to the original command layout.');\n return restored.errors.length === 0 ? 0 : 1;\n }\n\n if (invocation.action !== 'on' && invocation.action !== 'off') {\n throw new Error(`Unsupported protect action: ${String(invocation.action)}`);\n }\n\n const nextConfig = applyProtectPreference(config, invocation.action, invocation.target);\n const syncedProtect = await syncProtectRuntime(nextConfig, loadedAutomationState.state, protectRuntimeOptions);\n await saveConfig(nextConfig, loadedConfig.path);\n await saveAutomationState(syncedProtect.state, loadedAutomationState.path);\n writeProtectMessages(stderr, syncedProtect);\n writeLine(stdout, `Protect updated: ${invocation.target}=${invocation.action === 'on' ? 'on' : 'off'}`);\n return syncedProtect.errors.length === 0 ? 0 : 1;\n }\n\n case 'add': {\n const created = await storageManager.setup();\n if (created) {\n writeWelcome(stdout, storageManager.getVaultPath());\n }\n\n const secret =\n invocation.secret ??\n (await (options.readSecret ?? defaultReadSecret)(invocation.name, options.stdin ?? process.stdin, stderr));\n if (secret.trim().length === 0) {\n throw new Error('Secret cannot be empty.');\n }\n\n if (invocation.secret) {\n writeLine(stderr, '注意:secret 已出现在命令历史中,请删除对应的 history 记录。');\n }\n\n const vault = await storageManager.initialize();\n const token = vault.register(\n secret,\n inferSecretType(invocation.name, secret, config),\n {\n name: invocation.name,\n source: 'manual',\n },\n );\n await storageManager.save(vault);\n aisStore.recordSecret(secret, inferSecretType(invocation.name, secret, config), {\n name: invocation.name,\n source: 'manual',\n });\n await aisStore.save();\n\n writeLine(stdout, `Secret \"${invocation.name}\" registered as ${token}`);\n writeLine(stdout, 'Saved to vault.');\n return 0;\n }\n\n case 'list': {\n const vault = await storageManager.initialize();\n const entries = vault.snapshot();\n writeLine(stdout, formatList(entries, options.now ?? Date.now));\n return 0;\n }\n\n case 'remove': {\n const vault = await storageManager.initialize();\n const removed = vault.removeByName(invocation.name);\n if (!removed) {\n throw new Error(`Secret \"${invocation.name}\" not found.`);\n }\n\n await storageManager.save(vault);\n writeLine(stdout, `Secret \"${invocation.name}\" removed from vault.`);\n return 0;\n }\n\n case 'status': {\n const vault = await storageManager.initialize();\n const refreshed = await refreshProtectRuntime(loadedAutomationState.state, protectRuntimeOptions);\n if (refreshed.changed) {\n await saveAutomationState(refreshed.state, loadedAutomationState.path);\n }\n writeLine(\n stdout,\n formatStatus(\n vault.snapshot(),\n loadedConfig.path,\n storageManager.getVaultPath(),\n aisStore.getPath(),\n {\n ...loadedAutomationState,\n state: refreshed.state,\n },\n config,\n ),\n );\n return 0;\n }\n\n case 'update': {\n const updateResult = await runManualSelfUpdate(\n loadedAutomationState.state,\n {\n channel: config.update.channel,\n },\n {\n automationStatePath: loadedAutomationState.path,\n commandRunner: options.updateCommandRunner,\n currentPackageRoot: updateCurrentPackageRoot,\n env,\n fetchImpl: options.fetch,\n now: options.now,\n packageInfo,\n },\n );\n\n if (updateResult.changed) {\n await saveAutomationState(updateResult.state, loadedAutomationState.path);\n }\n if (updateResult.message) {\n writeLine(updateResult.status === 'failed' ? stderr : stdout, updateResult.message);\n }\n\n return updateResult.status === 'failed' ? 1 : 0;\n }\n\n case 'wrap': {\n const created = await storageManager.setup();\n if (created) {\n writeWelcome(stdout, storageManager.getVaultPath());\n }\n\n const updateCheck = await maybeRunStartupSelfUpdate(\n loadedAutomationState.state,\n {\n ...config.update,\n skipCheck: invocation.options.skipUpdateCheck,\n },\n {\n automationStatePath: loadedAutomationState.path,\n commandRunner: options.updateCommandRunner,\n currentPackageRoot: updateCurrentPackageRoot,\n env,\n fetchImpl: options.fetch,\n now: options.now,\n packageInfo,\n },\n );\n const automationState = updateCheck.state;\n if (updateCheck.changed) {\n await saveAutomationState(automationState, loadedAutomationState.path);\n }\n if (updateCheck.message) {\n writeLine(stderr, updateCheck.message);\n }\n\n const aisRuntime = (options.createAisRuntime ?? ((nextOptions) => new AisRuntime(nextOptions)))({\n debug: invocation.options.debug || config.display.debug,\n detector: buildDetectorOptions(config, invocation.options),\n dryRun: invocation.options.dryRun,\n env,\n proxy:\n invocation.options.proxyPort === undefined\n ? undefined\n : {\n maxPortAttempts: 1,\n port: invocation.options.proxyPort,\n },\n storage: {\n env,\n persistDetectedSecrets: config.storage.persistSecrets,\n vaultPath: storageManager.getVaultPath(),\n },\n ais: {\n recentLimit: config.ais.recentLimit,\n path: aisStore.getPath(),\n store: aisStore,\n },\n automation: {\n path: loadedAutomationState.path,\n protect: config.protect,\n state: automationState,\n update: {\n ...config.update,\n skipCheck: invocation.options.skipUpdateCheck,\n },\n },\n });\n\n const resolvedCommand = await resolveProtectedCommand(invocation.command, env, {\n homeDir: env.HOME,\n });\n await aisRuntime.start(resolvedCommand, invocation.args);\n return 0;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n writeLine(stderr, message);\n return 1;\n }\n}\n\nfunction buildDetectorOptions(config: AisConfig, options: CliGlobalOptions): AisRuntimeOptions['detector'] {\n return {\n customPatterns: config.customPatterns,\n enableContext: options.noContext ? false : config.detection.context,\n enableEntropy: options.noEntropy ? false : config.detection.entropy,\n enablePattern: config.detection.patterns,\n entropyThreshold: config.detection.entropyThreshold,\n };\n}\n\nfunction resolveUpdateCurrentPackageRoot(options: CliRunOptions, packageName: string): string | undefined {\n if (options.updateCurrentPackageRoot) {\n return options.updateCurrentPackageRoot;\n }\n\n const candidatePath = options.currentCliPath ?? process.argv[1];\n if (!candidatePath) {\n return undefined;\n }\n\n try {\n return resolveCurrentPackageRootFromUrl(pathToFileURL(candidatePath).href, packageName);\n } catch {\n return undefined;\n }\n}\n\nfunction buildProtectRuntimeOptions(env: NodeJS.ProcessEnv, options: CliRunOptions): ProtectRuntimeOptions {\n return {\n aisCliPath: resolvePackagedCliPath(options.currentCliPath),\n env,\n nodePath: options.protectNodePath,\n now: options.now,\n shellPath: options.protectShellPath,\n shellRunner: options.protectShellRunner,\n };\n}\n\nfunction resolvePackagedCliPath(currentCliPath?: string): string | undefined {\n if (currentCliPath) {\n return currentCliPath;\n }\n\n const candidatePaths = [\n fileURLToPath(new URL('../dist/cli.js', import.meta.url)),\n fileURLToPath(new URL('./cli.js', import.meta.url)),\n process.argv[1],\n ].filter((value): value is string => typeof value === 'string' && value.length > 0);\n\n return candidatePaths.find((candidatePath) => existsSync(candidatePath));\n}\n\nfunction writeProtectMessages(\n stderr: Pick<Writable, 'write'>,\n result: {\n errors: string[];\n warnings: string[];\n },\n): void {\n for (const warning of result.warnings) {\n writeLine(stderr, warning);\n }\n\n for (const error of result.errors) {\n writeLine(stderr, error);\n }\n}\n\nfunction formatList(entries: VaultEntry[], now: () => number): string {\n if (entries.length === 0) {\n return 'No stored secrets.';\n }\n\n const namedEntries = entries.filter((entry) => entry.name);\n const unnamedCount = entries.length - namedEntries.length;\n\n if (namedEntries.length === 0) {\n return `No named secrets.\\nUnnamed stored secrets: ${unnamedCount}`;\n }\n\n const rows = [\n ['Name', 'Type', 'Token', 'Added'],\n ...namedEntries\n .sort((left, right) => (left.name ?? '').localeCompare(right.name ?? ''))\n .map((entry) => [\n entry.name ?? '',\n entry.type,\n entry.token,\n formatRelativeAge(entry.createdAt, now()),\n ]),\n ];\n const widths = rows[0].map((_, columnIndex) =>\n Math.max(...rows.map((row) => row[columnIndex].length)),\n );\n const formattedRows = rows.map((row) =>\n row\n .map((cell, columnIndex) => cell.padEnd(widths[columnIndex]))\n .join(' ')\n .trimEnd(),\n );\n\n if (unnamedCount === 0) {\n return formattedRows.join('\\n');\n }\n\n return `${formattedRows.join('\\n')}\\nUnnamed stored secrets: ${unnamedCount}`;\n}\n\nfunction formatRelativeAge(createdAt: number, now: number): string {\n const diff = Math.max(0, now - createdAt);\n const minute = 60_000;\n const hour = 60 * minute;\n const day = 24 * hour;\n\n if (diff < minute) {\n return 'just now';\n }\n\n if (diff < hour) {\n return `${Math.floor(diff / minute)}m ago`;\n }\n\n if (diff < day) {\n return `${Math.floor(diff / hour)}h ago`;\n }\n\n return `${Math.floor(diff / day)}d ago`;\n}\n\nfunction formatStatus(\n entries: VaultEntry[],\n configPath: string,\n vaultPath: string,\n aisStatePath: string,\n automationState: LoadedAutomationState,\n config: AisConfig,\n): string {\n const namedCount = entries.filter((entry) => entry.name).length;\n\n return [\n 'Session: inactive',\n `Vault: ${entries.length} secrets stored (${namedCount} named)`,\n `Config: ${configPath}`,\n `Vault file: ${vaultPath}`,\n `AIS state: ${aisStatePath}`,\n `Automation state: ${automationState.path}`,\n formatUpdateStatus(config, automationState.state),\n formatProtectSummary(config, automationState.state),\n ].join('\\n');\n}\n\nfunction formatUpdateStatus(config: AisConfig, state: AutomationState): string {\n const checkedAt = state.update.lastCheckedAt ? new Date(state.update.lastCheckedAt).toISOString() : 'never';\n const remoteVersion = state.update.lastRemoteVersion ?? '-';\n const localVersion = state.update.lastLocalVersion ?? VERSION;\n\n return [\n `Update: ${config.update.enabled ? 'enabled' : 'disabled'} | channel=${config.update.channel} | every=${config.update.checkIntervalMinutes}m | silent=${config.update.silent ? 'yes' : 'no'} | last=${state.update.lastResult}`,\n `Update detail: checkedAt=${checkedAt} | local=${localVersion} | remote=${remoteVersion} | skipNext=${state.update.skipNextCheck ? 'yes' : 'no'}`,\n ].join('\\n');\n}\n\nfunction formatProtectSummary(config: AisConfig, state: AutomationState): string {\n const toolLines = PROTECT_TOOLS.map((tool) => formatProtectToolLine(tool, config, state));\n return [\n `Protect: ${config.protect.enabled ? 'enabled' : 'disabled'}`,\n ...toolLines,\n ].join('\\n');\n}\n\nfunction formatProtectStatus(config: AisConfig, automationState: LoadedAutomationState): string {\n return [\n `Automation state: ${automationState.path}`,\n formatProtectSummary(config, automationState.state),\n ].join('\\n');\n}\n\nfunction formatProtectToolLine(tool: ProtectTool, config: AisConfig, state: AutomationState): string {\n const runtime = state.protect.tools[tool];\n const desired = config.protect.enabled && config.protect.tools[tool] ? 'on' : 'off';\n const applied = runtime.installed ? 'yes' : 'no';\n const suspended = runtime.suspended ? 'yes' : 'no';\n const restoreParts = [\n runtime.managedPath ? `managed=${runtime.managedPath}` : '',\n runtime.backupPath ? `backup=${runtime.backupPath}` : '',\n runtime.originalCommandPath ? `original=${runtime.originalCommandPath}` : '',\n ].filter(Boolean);\n const restore = restoreParts.length === 0 ? 'restore=empty' : `restore=${restoreParts.join(',')}`;\n const error = runtime.lastError ? ` | error=${runtime.lastError}` : '';\n\n return `Protect ${tool}: desired=${desired} | applied=${applied} | suspended=${suspended} | ${restore}${error}`;\n}\n\nfunction writeAutomationStateRecoveryWarning(\n stderr: Pick<Writable, 'write'>,\n loadedAutomationState: LoadedAutomationState,\n): void {\n if (!loadedAutomationState.recoveryReason) {\n return;\n }\n\n const recoveredFrom = loadedAutomationState.recoveredFrom ?? loadedAutomationState.path;\n writeLine(\n stderr,\n `Automation state was reset after a load failure (${loadedAutomationState.recoveryReason}). Previous file: ${recoveredFrom}`,\n );\n}\n\nfunction readConfigValue(config: AisConfig, key: string): boolean | number | string {\n switch (key) {\n case 'automation.statePath':\n return config.automation.statePath;\n case 'protect.enabled':\n return config.protect.enabled;\n case 'protect.tools.claude':\n return config.protect.tools.claude;\n case 'protect.tools.codex':\n return config.protect.tools.codex;\n case 'protect.tools.openclaw':\n return config.protect.tools.openclaw;\n case 'update.channel':\n return config.update.channel;\n case 'update.checkIntervalMinutes':\n return config.update.checkIntervalMinutes;\n case 'update.enabled':\n return config.update.enabled;\n case 'update.silent':\n return config.update.silent;\n default:\n throw new Error(`Unsupported config key: ${key}`);\n }\n}\n\nfunction setConfigValue(config: AisConfig, key: string, rawValue: string): AisConfig {\n const nextConfig = structuredClone(config);\n\n switch (key) {\n case 'automation.statePath':\n nextConfig.automation.statePath = rawValue;\n return nextConfig;\n case 'protect.enabled':\n nextConfig.protect.enabled = parseBooleanValue(rawValue, key);\n return nextConfig;\n case 'protect.tools.claude':\n nextConfig.protect.tools.claude = parseBooleanValue(rawValue, key);\n return nextConfig;\n case 'protect.tools.codex':\n nextConfig.protect.tools.codex = parseBooleanValue(rawValue, key);\n return nextConfig;\n case 'protect.tools.openclaw':\n nextConfig.protect.tools.openclaw = parseBooleanValue(rawValue, key);\n return nextConfig;\n case 'update.channel':\n if (rawValue !== 'latest' && rawValue !== 'next') {\n throw new Error('update.channel must be \"latest\" or \"next\".');\n }\n\n nextConfig.update.channel = rawValue;\n return nextConfig;\n case 'update.checkIntervalMinutes':\n nextConfig.update.checkIntervalMinutes = parsePositiveIntegerValue(rawValue, key);\n return nextConfig;\n case 'update.enabled':\n nextConfig.update.enabled = parseBooleanValue(rawValue, key);\n return nextConfig;\n case 'update.silent':\n nextConfig.update.silent = parseBooleanValue(rawValue, key);\n return nextConfig;\n default:\n throw new Error(`Unsupported config key: ${key}`);\n }\n}\n\nfunction formatConfigValue(key: string, value: boolean | number | string): string {\n return `${key}=${value}`;\n}\n\nfunction parseBooleanValue(rawValue: string, key: string): boolean {\n const normalized = rawValue.trim().toLowerCase();\n if (normalized === 'true') {\n return true;\n }\n\n if (normalized === 'false') {\n return false;\n }\n\n throw new Error(`${key} must be \"true\" or \"false\".`);\n}\n\nfunction parsePositiveIntegerValue(rawValue: string, key: string): number {\n if (!/^\\d+$/.test(rawValue)) {\n throw new Error(`${key} must be a positive integer.`);\n }\n\n const parsed = Number.parseInt(rawValue, 10);\n if (parsed < 1) {\n throw new Error(`${key} must be a positive integer.`);\n }\n\n return parsed;\n}\n\nfunction applyProtectPreference(\n config: AisConfig,\n action: 'off' | 'on',\n target: ProtectTool | 'all',\n): AisConfig {\n const nextConfig = structuredClone(config);\n\n if (target === 'all') {\n nextConfig.protect.enabled = action === 'on';\n if (action === 'on') {\n nextConfig.protect.tools.claude = true;\n nextConfig.protect.tools.codex = true;\n nextConfig.protect.tools.openclaw = true;\n }\n\n return nextConfig;\n }\n\n if (action === 'on') {\n nextConfig.protect.enabled = true;\n }\n\n nextConfig.protect.tools[target] = action === 'on';\n return nextConfig;\n}\n\nfunction inferSecretType(name: string, secret: string, config: AisConfig): SecretType {\n const exactMatch = new PatternDetector({\n customPatterns: config.customPatterns,\n })\n .detect(secret)\n .find((match) => match.start === 0 && match.end === secret.length);\n\n if (exactMatch) {\n return exactMatch.type;\n }\n\n const normalized = name.toLowerCase();\n if (normalized.includes('password') || normalized.includes('passwd') || normalized.includes('pass')) {\n return 'PASSWORD';\n }\n\n if (normalized.includes('private') || normalized.includes('pem') || normalized.includes('ssh')) {\n return 'PRIVATE_KEY';\n }\n\n if (normalized.includes('jwt')) {\n return 'JWT';\n }\n\n if (normalized.includes('bearer')) {\n return 'BEARER_TOKEN';\n }\n\n if (normalized.includes('token') || normalized.includes('key') || normalized.includes('secret')) {\n return 'APIKEY';\n }\n\n return 'GENERIC';\n}\n\nasync function defaultReadSecret(\n name: string,\n stdin: NodeJS.ReadStream,\n output: Pick<Writable, 'write'>,\n): Promise<string> {\n if (!stdin.isTTY) {\n return readSecretFromPipe(stdin);\n }\n\n return readSecretFromTerminal(name, stdin, output);\n}\n\nasync function readSecretFromPipe(stdin: NodeJS.ReadStream): Promise<string> {\n const chunks: Buffer[] = [];\n\n for await (const chunk of stdin) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n\n return Buffer.concat(chunks).toString('utf8').replace(/\\r?\\n$/, '');\n}\n\nasync function readSecretFromTerminal(\n name: string,\n stdin: NodeJS.ReadStream,\n output: Pick<Writable, 'write'>,\n): Promise<string> {\n writeRaw(output, `Enter secret for \"${name}\": `);\n const originalRawMode = stdin.isRaw;\n stdin.setRawMode?.(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n return new Promise<string>((resolve, reject) => {\n let secret = '';\n\n const cleanup = () => {\n stdin.off('data', onData);\n stdin.setRawMode?.(originalRawMode ?? false);\n writeRaw(output, '\\n');\n };\n\n const onData = (chunk: string | Buffer) => {\n const text = typeof chunk === 'string' ? chunk : chunk.toString('utf8');\n\n for (const char of text) {\n if (char === '\\r' || char === '\\n') {\n cleanup();\n resolve(secret);\n return;\n }\n\n if (char === '\\u0003') {\n cleanup();\n reject(new Error('Secret input cancelled.'));\n return;\n }\n\n if (char === '\\u007f' || char === '\\b') {\n secret = secret.slice(0, -1);\n continue;\n }\n\n secret += char;\n }\n };\n\n stdin.on('data', onData);\n });\n}\n\nfunction writeLine(stream: Pick<Writable, 'write'>, message: string): void {\n writeRaw(stream, `${message}\\n`);\n}\n\nfunction writeRaw(stream: Pick<Writable, 'write'>, message: string): void {\n stream.write(message);\n}\n\nfunction writeWelcome(output: Pick<Writable, 'write'>, vaultPath: string): void {\n writeLine(output, 'Welcome to AIS!');\n writeLine(output, 'Setting up secure vault...');\n writeLine(output, `Vault created at ${vaultPath}`);\n writeLine(output, 'You are ready. Run: ais claude');\n}\n\nfunction formatAisDashboard(state: AisState, configPath: string, aisStatePath: string): string {\n const recentLines =\n state.recentRecords.length === 0\n ? ['- No recent protected records yet.']\n : state.recentRecords.map((record, index) => {\n const status = state.excludedRecordIds.includes(record.id) ? 'excluded' : 'protected';\n const name = record.name ? ` | name=${record.name}` : '';\n return `${index + 1}. ${record.preview} | ${record.type} | id=${record.id} | ${status}${name}`;\n });\n const excludedTypes =\n state.excludedTypes.length === 0 ? ['- None'] : state.excludedTypes.map((type) => `- ${type}`);\n\n return [\n 'AIS TUI',\n `Config: ${configPath}`,\n `AIS state: ${aisStatePath}`,\n '',\n 'Recent protected records:',\n ...recentLines,\n '',\n 'Excluded types:',\n ...excludedTypes,\n '',\n 'Direct commands:',\n ' ais ais',\n ' ais ais exclude <id>',\n ' ais ais include <id>',\n ' ais ais exclude-type <type>',\n ' ais ais include-type <type>',\n ].join('\\n');\n}\n\nasync function runAisTui(store: AisStore, configPath: string): Promise<void> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n while (true) {\n writeLine(process.stdout, formatAisDashboard(store.getState(), configPath, store.getPath()));\n const answer = (await rl.question(\n 'AIS> 输入编号切换某条,输入 type:PASSWORD 切换某一类,直接回车退出: ',\n )).trim();\n if (answer.length === 0 || answer.toLowerCase() === 'q') {\n break;\n }\n\n if (/^\\d+$/.test(answer)) {\n const index = Number.parseInt(answer, 10) - 1;\n const state = store.getState();\n const record = state.recentRecords[index];\n if (!record) {\n writeLine(process.stdout, `AIS: recent index ${answer} not found.`);\n continue;\n }\n\n const excluded = !state.excludedRecordIds.includes(record.id);\n store.setRecordExcluded(record.id, excluded);\n await store.save();\n writeLine(\n process.stdout,\n excluded ? `AIS: ${record.id} will stay plain next time.` : `AIS: ${record.id} is protected again.`,\n );\n continue;\n }\n\n const typeMatch = answer.match(/^type:(.+)$/i);\n if (typeMatch) {\n const normalizedType = typeMatch[1].trim().toUpperCase();\n if (!isKnownAisType(normalizedType)) {\n writeLine(process.stdout, `AIS: unknown type ${typeMatch[1].trim()}.`);\n continue;\n }\n\n const state = store.getState();\n const excluded = !state.excludedTypes.includes(normalizedType);\n store.setTypeExcluded(normalizedType, excluded);\n await store.save();\n writeLine(\n process.stdout,\n excluded\n ? `AIS: type ${normalizedType} will stay plain next time.`\n : `AIS: type ${normalizedType} is protected again.`,\n );\n continue;\n }\n\n writeLine(process.stdout, 'AIS: unsupported action.');\n }\n } finally {\n rl.close();\n }\n}\n\nfunction shouldRunInteractiveAis(\n stdin: NodeJS.ReadStream,\n stdout: Pick<Writable, 'write'>,\n): stdout is NodeJS.WriteStream & Pick<Writable, 'write'> {\n return stdin === process.stdin && stdout === process.stdout && stdin.isTTY && process.stdout.isTTY;\n}\n\nfunction isKnownAisType(value: string): value is SecretType {\n return ['PASSWORD', 'APIKEY', 'DBCONN', 'PRIVATE_KEY', 'BEARER_TOKEN', 'JWT', 'GENERIC'].includes(value);\n}\n\nexport function getHelpText(): string {\n return HELP_TEXT;\n}\n\nexport async function ensureDefaultConfig(path?: string): Promise<AisConfig> {\n const config = createDefaultConfig();\n await saveConfig(config, path);\n return config;\n}\n\nexport function hasVault(path: string): boolean {\n return EncryptedVault.exists(path);\n}\n","import { appendFileSync, mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { AisStore, type AisStoreOptions } from './ais/index.js';\nimport type { AutomationState, ProtectTool, UpdateChannel } from './automation/index.js';\nimport { CombinedDetector, type CombinedDetectorOptions } from './detector/index.js';\nimport { BidirectionalInterceptor } from './interceptor/bidirectional.js';\nimport { createPtyWrapper, type PtyWrapperOptions } from './pty/wrapper.js';\nimport {\n buildProxyEnvironment,\n getDefaultProxyTargets,\n ProxyServer,\n type ProxyOptions,\n} from './proxy/index.js';\nimport { StorageManager, type StorageManagerOptions } from './storage/index.js';\nimport { SessionVault, type SessionVaultOptions } from './vault/session-vault.js';\nimport type { SecretType } from './vault/types.js';\n\nconst DEFAULT_DETECTION_WINDOW = 4096;\nconst VAULT_TOKEN_PATTERN = /__VAULT_[A-Z_]+_[0-9a-f]{8,9}__/g;\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\ninterface ReplacementRule {\n source: string;\n target: string;\n}\n\ninterface PlainAnsiView {\n consumedRawLength: number;\n ends: number[];\n plain: string;\n starts: number[];\n}\n\ninterface ReplacementMatch {\n end: number;\n replacement: string;\n start: number;\n}\n\ninterface RestoreResult {\n output: string;\n replacements: number;\n}\n\ninterface RegisteredSecretResult {\n created: boolean;\n token: string;\n}\n\nexport interface RegisterSecretValueOptions {\n name?: string;\n}\n\nexport interface AisStats {\n detectedSecrets: number;\n maskedInputs: number;\n proxyEnabled: boolean;\n proxyPort: number | null;\n registeredSecrets: number;\n restoredOutputs: number;\n}\n\nexport interface AisRuntimeOptions {\n ais?: (AisStoreOptions & { store?: AisStore }) | false;\n automation?: {\n path: string;\n protect: {\n enabled: boolean;\n tools: Record<ProtectTool, boolean>;\n };\n state: AutomationState;\n update: {\n channel: UpdateChannel;\n checkIntervalMinutes: number;\n enabled: boolean;\n silent: boolean;\n skipCheck: boolean;\n };\n };\n cwd?: string;\n debug?: boolean;\n detectionWindow?: number;\n detector?: CombinedDetectorOptions;\n dryRun?: boolean;\n env?: NodeJS.ProcessEnv;\n logFile?: string;\n proxy?: Omit<ProxyOptions, 'vault'>;\n storage?: (StorageManagerOptions & { manager?: StorageManager }) | false;\n stdin?: PtyWrapperOptions['stdin'];\n stdout?: PtyWrapperOptions['stdout'];\n vault?: SessionVaultOptions;\n}\n\nfunction sortReplacementRules(rules: ReplacementRule[]): ReplacementRule[] {\n return rules.sort((left, right) => {\n if (right.source.length !== left.source.length) {\n return right.source.length - left.source.length;\n }\n\n return left.source.localeCompare(right.source);\n });\n}\n\nfunction buildPrefixes(sources: string[]): Set<string> {\n return new Set(\n sources.flatMap((source) =>\n Array.from({ length: Math.max(0, source.length - 1) }, (_, index) => source.slice(0, index + 1)),\n ),\n );\n}\n\nfunction redactSecret(secret: string): string {\n if (secret.length <= 3) {\n return `${secret.slice(0, 1)}***`;\n }\n\n return `${secret.slice(0, 6)}***`;\n}\n\nfunction parseAnsiView(input: string): PlainAnsiView {\n let cursor = 0;\n let plain = '';\n const starts: number[] = [];\n const ends: number[] = [];\n\n while (cursor < input.length) {\n if (input[cursor] !== '\\x1b') {\n starts.push(cursor);\n plain += input[cursor];\n cursor += 1;\n ends.push(cursor);\n continue;\n }\n\n const ansiLength = readAnsiEscapeLength(input, cursor);\n if (ansiLength === 0) {\n break;\n }\n\n cursor += ansiLength;\n }\n\n return {\n plain,\n starts,\n ends,\n consumedRawLength: cursor,\n };\n}\n\nfunction readAnsiEscapeLength(input: string, start: number): number {\n if (input[start] !== '\\x1b' || input[start + 1] !== '[') {\n return 0;\n }\n\n for (let cursor = start + 2; cursor < input.length; cursor += 1) {\n const code = input.charCodeAt(cursor);\n if (code >= 0x40 && code <= 0x7e) {\n return cursor - start + 1;\n }\n }\n\n return 0;\n}\n\nfunction findReplacementMatches(input: string, rules: ReplacementRule[]): ReplacementMatch[] {\n const matches: ReplacementMatch[] = [];\n let cursor = 0;\n\n while (cursor < input.length) {\n const matchedRule = rules.find((rule) => input.startsWith(rule.source, cursor));\n if (!matchedRule) {\n cursor += 1;\n continue;\n }\n\n matches.push({\n start: cursor,\n end: cursor + matchedRule.source.length,\n replacement: matchedRule.target,\n });\n cursor += matchedRule.source.length;\n }\n\n return matches;\n}\n\nfunction replaceKnownValues(input: string, rules: ReplacementRule[]): RestoreResult {\n if (rules.length === 0 || input.length === 0) {\n return { output: input, replacements: 0 };\n }\n\n let output = input;\n let replacements = 0;\n\n for (const rule of rules) {\n let nextOutput = '';\n let lastIndex = 0;\n let matched = false;\n let matchIndex = output.indexOf(rule.source);\n\n while (matchIndex !== -1) {\n matched = true;\n replacements += 1;\n nextOutput += output.slice(lastIndex, matchIndex);\n nextOutput += rule.target;\n lastIndex = matchIndex + rule.source.length;\n matchIndex = output.indexOf(rule.source, lastIndex);\n }\n\n if (matched) {\n nextOutput += output.slice(lastIndex);\n output = nextOutput;\n }\n }\n\n return { output, replacements };\n}\n\nexport function stripVaultArtifacts(input: string): string {\n const sanitized = input.replace(VAULT_TOKEN_PATTERN, '');\n const trailingVaultPrefix = sanitized.lastIndexOf('__VAULT_');\n if (trailingVaultPrefix === -1) {\n return sanitized;\n }\n\n return sanitized.slice(0, trailingVaultPrefix);\n}\n\nfunction normalizeProxyDetectionInput(input: string): string {\n return input\n .replaceAll('\\\\r', '\\r')\n .replaceAll('\\\\n', '\\n')\n .replaceAll('\\\\\"', '\"')\n .replaceAll('\\\\\\\\', '\\\\');\n}\n\nclass StdoutRestorer {\n private buffer = '';\n private prefixes = new Set<string>();\n private rules: ReplacementRule[] = [];\n private syncedRevision = -1;\n\n constructor(private readonly vault: SessionVault) {}\n\n push(chunk: string): RestoreResult {\n this.syncRules();\n\n const input = this.buffer + chunk;\n const view = parseAnsiView(input);\n const processableRaw = input.slice(0, view.consumedRawLength);\n const trailingRaw = input.slice(view.consumedRawLength);\n\n if (this.rules.length === 0) {\n this.buffer = trailingRaw;\n return {\n output: processableRaw,\n replacements: 0,\n };\n }\n\n if (view.plain.length === 0) {\n this.buffer = trailingRaw;\n return {\n output: processableRaw,\n replacements: 0,\n };\n }\n\n const tentativeLimit = view.plain.length - this.getLookbehindLength(view.plain);\n if (tentativeLimit <= 0) {\n this.buffer = input;\n return { output: '', replacements: 0 };\n }\n\n const matches = findReplacementMatches(view.plain, this.rules);\n const safeVisibleLimit = this.getSafeVisibleLimit(matches, tentativeLimit);\n const rawLimit =\n safeVisibleLimit >= view.plain.length\n ? view.consumedRawLength\n : safeVisibleLimit === 0\n ? 0\n : view.ends[safeVisibleLimit - 1];\n\n const replaced = this.replaceRaw(processableRaw, view, matches, safeVisibleLimit, rawLimit);\n this.buffer = input.slice(rawLimit);\n return replaced;\n }\n\n flush(): RestoreResult {\n this.syncRules();\n\n if (this.buffer.length === 0) {\n return { output: '', replacements: 0 };\n }\n\n if (this.rules.length === 0) {\n const remaining = this.buffer;\n this.buffer = '';\n return { output: remaining, replacements: 0 };\n }\n\n const input = this.buffer;\n this.buffer = '';\n const view = parseAnsiView(input);\n const replaced = this.replaceRaw(\n input.slice(0, view.consumedRawLength),\n view,\n findReplacementMatches(view.plain, this.rules),\n view.plain.length,\n view.consumedRawLength,\n );\n\n return {\n output: replaced.output + input.slice(view.consumedRawLength),\n replacements: replaced.replacements,\n };\n }\n\n private getLookbehindLength(input: string): number {\n const longestCandidate = Math.min(\n input.length,\n Math.max(0, ...this.rules.map((rule) => rule.source.length - 1)),\n );\n\n for (let length = longestCandidate; length > 0; length -= 1) {\n if (this.prefixes.has(input.slice(-length))) {\n return length;\n }\n }\n\n return 0;\n }\n\n private getSafeVisibleLimit(matches: ReplacementMatch[], tentativeLimit: number): number {\n let safeLimit = tentativeLimit;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n for (const match of matches) {\n if (match.start >= safeLimit) {\n continue;\n }\n\n if (match.end > safeLimit) {\n safeLimit = match.start;\n changed = true;\n }\n }\n }\n\n return safeLimit;\n }\n\n private replaceRaw(\n raw: string,\n view: PlainAnsiView,\n matches: ReplacementMatch[],\n visibleLimit: number,\n rawLimit: number,\n ): RestoreResult {\n if (raw.length === 0) {\n return { output: '', replacements: 0 };\n }\n\n if (visibleLimit === 0) {\n return {\n output: raw.slice(0, rawLimit),\n replacements: 0,\n };\n }\n\n let cursor = 0;\n let output = '';\n let replacements = 0;\n\n for (const match of matches) {\n if (match.end > visibleLimit) {\n break;\n }\n\n const rawStart = view.starts[match.start];\n const rawEnd = view.ends[match.end - 1];\n\n if (rawStart < cursor || rawEnd > rawLimit) {\n continue;\n }\n\n output += raw.slice(cursor, rawStart);\n output += match.replacement;\n cursor = rawEnd;\n replacements += 1;\n }\n\n output += raw.slice(cursor, rawLimit);\n return { output, replacements };\n }\n\n private syncRules(): void {\n if (this.syncedRevision === this.vault.revision) {\n return;\n }\n\n this.rules = sortReplacementRules(\n this.vault\n .getTokenToSecretPairs()\n .map(([source, target]) => ({\n source,\n target,\n })),\n );\n this.prefixes = buildPrefixes(this.rules.map((rule) => rule.source));\n this.syncedRevision = this.vault.revision;\n }\n}\n\nexport class AisRuntime {\n private readonly argvDetector: CombinedDetector;\n private readonly detector: CombinedDetector;\n private readonly detectionBuffers = {\n proxy: '',\n stdin: '',\n };\n private readonly aisStore?: AisStore;\n private readonly interceptor: BidirectionalInterceptor;\n private proxyPort: number | null = null;\n private readonly proxy: ProxyServer;\n private readonly storageManager?: StorageManager;\n private storageLoaded = false;\n private readonly stdoutRestorer: StdoutRestorer;\n private readonly vault: SessionVault;\n private readonly stats = {\n detectedSecrets: 0,\n maskedInputs: 0,\n restoredOutputs: 0,\n };\n private running = false;\n\n constructor(private readonly options: AisRuntimeOptions = {}) {\n this.vault = new SessionVault(options.vault);\n this.detector = new CombinedDetector(options.detector);\n this.argvDetector = new CombinedDetector({\n ...(options.detector ?? {}),\n enableEntropy: false,\n });\n this.interceptor = new BidirectionalInterceptor(this.vault);\n this.stdoutRestorer = new StdoutRestorer(this.vault);\n const mergedEnv = {\n ...process.env,\n ...(options.env ?? {}),\n };\n\n this.proxy = new ProxyServer({\n ...(options.proxy ?? {}),\n onRequestText: (data) => {\n options.proxy?.onRequestText?.(data);\n this.handleProxyRequestText(data);\n },\n targets: {\n ...getDefaultProxyTargets(mergedEnv),\n ...(options.proxy?.targets ?? {}),\n },\n vault: this.vault,\n });\n this.storageManager =\n options.storage && 'manager' in options.storage && options.storage.manager\n ? options.storage.manager\n : options.storage\n ? new StorageManager(options.storage)\n : undefined;\n this.aisStore =\n options.ais && 'store' in options.ais && options.ais.store\n ? options.ais.store\n : options.ais\n ? new AisStore(options.ais)\n : undefined;\n }\n\n async start(command: string, args: string[]): Promise<void> {\n if (this.running) {\n throw new Error('AIS is already running');\n }\n\n this.running = true;\n this.resetDetectionBuffers();\n let aisSaveError: unknown;\n let startError: unknown;\n let storageSaveError: unknown;\n\n const runtimeEnv = {\n ...process.env,\n ...(this.options.env ?? {}),\n };\n\n try {\n await this.loadAisState();\n await this.loadStoredSecrets();\n const preparedArgs = this.prepareArgs(args);\n let commandEnv = runtimeEnv;\n\n if (this.options.dryRun) {\n this.debug('dry-run enabled, proxy disabled');\n } else {\n try {\n this.proxyPort = await this.proxy.start();\n commandEnv = buildProxyEnvironment(this.proxy.getBaseUrl(), runtimeEnv);\n this.debug(`proxy started on :${this.proxyPort}`);\n } catch (error) {\n this.proxyPort = null;\n this.warn(`proxy failed to start, HTTP API requests are NOT protected (${toErrorMessage(error)})`);\n this.debug(`proxy failed (${toErrorMessage(error)}), fallback to PTY-only mode`);\n }\n }\n\n await createPtyWrapper(command, preparedArgs, {\n cwd: this.options.cwd,\n env: commandEnv,\n stdin: this.options.stdin,\n stdout: this.options.stdout,\n onStdinData: (data) => this.handleStdin(data),\n flushStdinData: () => this.flushStdin(),\n onStdoutData: (data) => this.handleStdout(data),\n flushStdoutData: () => this.flushStdout(),\n });\n } catch (error) {\n startError = error;\n } finally {\n this.running = false;\n this.resetDetectionBuffers();\n this.proxyPort = null;\n await this.proxy.stop().catch(() => undefined);\n\n if (this.storageManager) {\n try {\n await this.storageManager.save(this.vault);\n } catch (error) {\n storageSaveError = error;\n if (startError) {\n this.debug(`storage save failed (${toErrorMessage(error)})`);\n }\n }\n }\n\n if (this.aisStore) {\n try {\n await this.aisStore.save();\n } catch (error) {\n aisSaveError = error;\n if (startError || storageSaveError) {\n this.debug(`ais save failed (${toErrorMessage(error)})`);\n }\n }\n }\n }\n\n if (startError) {\n throw startError;\n }\n\n if (storageSaveError) {\n throw storageSaveError;\n }\n\n if (aisSaveError) {\n throw aisSaveError;\n }\n }\n\n registerSecret(\n secret: string,\n type: SecretType = 'GENERIC',\n options: RegisterSecretValueOptions = {},\n ): string {\n return this.registerSecretValue(secret, type, 'manual', options).token;\n }\n\n getStats(): AisStats {\n return {\n detectedSecrets: this.stats.detectedSecrets,\n maskedInputs: this.stats.maskedInputs,\n proxyEnabled: this.proxyPort !== null,\n proxyPort: this.proxyPort,\n registeredSecrets: this.vault.size,\n restoredOutputs: this.stats.restoredOutputs,\n };\n }\n\n private debug(message: string): void {\n if (!this.options.debug) {\n return;\n }\n\n this.writeMessage(message);\n }\n\n private warn(message: string): void {\n this.writeMessage(`WARNING: ${message}`);\n }\n\n private writeMessage(message: string): void {\n const line = `[AIS] ${message}`;\n process.stderr.write(`${line}\\n`);\n\n if (!this.options.logFile) {\n return;\n }\n\n mkdirSync(dirname(this.options.logFile), { recursive: true });\n appendFileSync(this.options.logFile, `${line}\\n`, 'utf8');\n }\n\n private async loadStoredSecrets(): Promise<void> {\n if (this.storageLoaded || !this.storageManager) {\n return;\n }\n\n const storedVault = await this.storageManager.initialize();\n for (const entry of storedVault.snapshot()) {\n if (this.aisStore?.isExcluded(entry.secret, entry.type)) {\n this.debug(`storage: skipped excluded secret ${redactSecret(entry.secret)}`);\n continue;\n }\n\n this.vault.register(entry.secret, entry.type, {\n createdAt: entry.createdAt,\n hitCount: entry.hitCount,\n name: entry.name,\n source: entry.source,\n token: entry.token,\n });\n }\n\n this.storageLoaded = true;\n }\n\n private async loadAisState(): Promise<void> {\n if (!this.aisStore) {\n return;\n }\n\n await this.aisStore.load();\n }\n\n private detectSecrets(input: string, source: 'argv' | 'stdin' | 'proxy'): void {\n if (input.length === 0) {\n return;\n }\n\n const normalizedInput = source === 'proxy' ? normalizeProxyDetectionInput(input) : input;\n const scanTarget =\n source === 'argv'\n ? stripVaultArtifacts(normalizedInput)\n : source === 'proxy'\n ? stripVaultArtifacts(normalizedInput)\n : (() => {\n const bufferSize = this.options.detectionWindow ?? DEFAULT_DETECTION_WINDOW;\n const nextBuffer = stripVaultArtifacts(`${this.detectionBuffers[source]}${normalizedInput}`);\n this.detectionBuffers[source] = nextBuffer.slice(-bufferSize);\n return this.detectionBuffers[source];\n })();\n\n if (scanTarget.length === 0) {\n return;\n }\n\n const detector = source === 'argv' ? this.argvDetector : this.detector;\n\n for (const detected of detector.detect(scanTarget)) {\n if (detected.value.startsWith('__VAULT_')) {\n continue;\n }\n\n const result = this.registerSecretValue(detected.value, detected.type, source);\n if (result.created) {\n this.stats.detectedSecrets += 1;\n }\n }\n }\n\n private flushStdin(): string {\n if (this.options.dryRun) {\n return '';\n }\n\n return this.interceptor.flush().input;\n }\n\n private flushStdout(): string {\n if (this.options.dryRun) {\n return '';\n }\n\n const restored = this.stdoutRestorer.flush();\n this.stats.restoredOutputs += restored.replacements;\n return restored.output;\n }\n\n private handleStdin(data: string): string {\n this.detectSecrets(data, 'stdin');\n\n if (this.options.dryRun) {\n return data;\n }\n\n const masked = this.interceptor.processInput(data);\n if (masked !== data) {\n this.stats.maskedInputs += 1;\n }\n\n return masked;\n }\n\n private handleStdout(data: string): string {\n if (this.options.dryRun) {\n return data;\n }\n\n const restored = this.stdoutRestorer.push(data);\n this.stats.restoredOutputs += restored.replacements;\n return restored.output;\n }\n\n private handleProxyRequestText(data: string): void {\n this.detectSecrets(data, 'proxy');\n }\n\n private prepareArgs(args: string[]): string[] {\n if (args.length === 0) {\n return args;\n }\n\n const preparedArgs = args.map((arg, index) => {\n if (shouldSkipArgInspection(args[index - 1])) {\n return arg;\n }\n\n this.detectSecrets(arg, 'argv');\n return replaceKnownValues(\n arg,\n this.vault\n .getSecretToTokenPairs()\n .map(([source, target]) => ({\n source,\n target,\n })),\n ).output;\n });\n\n return this.options.dryRun ? args : preparedArgs;\n }\n\n private registerSecretValue(\n secret: string,\n type: SecretType,\n source: 'argv' | 'manual' | 'stdin' | 'proxy',\n options: RegisterSecretValueOptions = {},\n ): RegisteredSecretResult {\n if (source !== 'manual' && this.aisStore?.isExcluded(secret, type)) {\n this.debug(`${source}: skipped excluded secret ${redactSecret(secret)}`);\n return {\n created: false,\n token: secret,\n };\n }\n\n const previousRevision = this.vault.revision;\n const token = this.vault.register(secret, type, {\n name: options.name,\n source,\n });\n const created = this.vault.revision !== previousRevision;\n this.aisStore?.recordSecret(secret, type, {\n name: options.name,\n source,\n });\n\n if (created) {\n this.debug(`${source}: detected secret ${redactSecret(secret)} -> ${token}`);\n }\n\n return { created, token };\n }\n\n private resetDetectionBuffers(): void {\n this.detectionBuffers.proxy = '';\n this.detectionBuffers.stdin = '';\n }\n}\n\nfunction shouldSkipArgInspection(previousArg?: string): boolean {\n return ['-c', '-e', '-lc', '--command', '--eval'].includes(previousArg ?? '');\n}\n","import type { SecretType } from '../vault/types.js';\n\nimport type { DetectedSecret, SecretDetector } from './types.js';\n\ninterface ContextRule {\n id: string;\n expression: RegExp;\n getType(keyword: string): SecretType;\n}\n\nconst INLINE_SPACING = String.raw`[^\\S\\r\\n]*`;\nconst ENGLISH_CONNECTORS = new Set(['and', 'or', 'but']);\nconst HARD_VALUE_BOUNDARIES = new Set(['\\n', '\\r', ',', ';', ',', ';', '、', ')', ']', '}', '\"', '\\'']);\n\nconst CONTEXT_RULES: ContextRule[] = [\n {\n id: 'context_cn_keyword',\n expression: new RegExp(String.raw`(密码|密钥|口令)${INLINE_SPACING}(?:是|为|=|:|:)${INLINE_SPACING}`, 'g'),\n getType(keyword) {\n return keyword === '密钥' ? 'APIKEY' : 'PASSWORD';\n },\n },\n {\n id: 'context_en_keyword',\n expression: new RegExp(\n String.raw`\\b(password|passwd|api[_-]?key|token|secret)\\b${INLINE_SPACING}(?:=|:|:|is)${INLINE_SPACING}`,\n 'gi',\n ),\n getType(keyword) {\n return classifyKeyword(keyword);\n },\n },\n {\n id: 'context_assignment',\n expression: new RegExp(\n String.raw`\\b([A-Za-z_][A-Za-z0-9_]*(?:PASSWORD|PASSWD|API_KEY|TOKEN|SECRET)[A-Za-z0-9_]*)\\b${INLINE_SPACING}=${INLINE_SPACING}`,\n 'g',\n ),\n getType(keyword) {\n return classifyKeyword(keyword);\n },\n },\n];\n\nfunction classifyKeyword(keyword: string): SecretType {\n const normalized = keyword.toLowerCase();\n\n if (normalized.includes('password') || normalized.includes('passwd') || normalized.includes('口令')) {\n return 'PASSWORD';\n }\n\n if (normalized.includes('api_key') || normalized.includes('api-key') || normalized.includes('密钥')) {\n return 'APIKEY';\n }\n\n if (normalized.includes('token')) {\n return 'BEARER_TOKEN';\n }\n\n return 'GENERIC';\n}\n\nfunction isAsciiLetter(character: string): boolean {\n return /[A-Za-z]/.test(character);\n}\n\nfunction isAsciiIdentifierPart(character: string): boolean {\n return /[A-Za-z0-9_-]/.test(character);\n}\n\nfunction isHanCharacter(character: string): boolean {\n return /\\p{Script=Han}/u.test(character);\n}\n\nfunction skipInlineWhitespace(input: string, start: number): number {\n let cursor = start;\n\n while (cursor < input.length) {\n const character = input[cursor];\n if (character === '\\n' || character === '\\r' || !/\\s/.test(character)) {\n break;\n }\n\n cursor += 1;\n }\n\n return cursor;\n}\n\nfunction readConnector(input: string, start: number): number {\n const lowerRest = input.slice(start).toLowerCase();\n\n for (const connector of ENGLISH_CONNECTORS) {\n if (!lowerRest.startsWith(connector)) {\n continue;\n }\n\n const nextCharacter = input[start + connector.length] ?? '';\n if (!isAsciiIdentifierPart(nextCharacter)) {\n return start + connector.length;\n }\n }\n\n return start;\n}\n\nfunction readFieldName(input: string, start: number): number {\n if (start >= input.length) {\n return start;\n }\n\n const firstCharacter = input[start];\n if (isAsciiLetter(firstCharacter) || firstCharacter === '_') {\n let cursor = start + 1;\n while (cursor < input.length && isAsciiIdentifierPart(input[cursor])) {\n cursor += 1;\n }\n\n return cursor;\n }\n\n if (!isHanCharacter(firstCharacter)) {\n return start;\n }\n\n let cursor = start + 1;\n while (cursor < input.length && isHanCharacter(input[cursor])) {\n cursor += 1;\n }\n\n return cursor;\n}\n\nfunction readFieldOperator(input: string, start: number): number {\n const singleCharacterOperator = input[start];\n if (singleCharacterOperator === '=' || singleCharacterOperator === ':' || singleCharacterOperator === ':') {\n return start + 1;\n }\n\n if (singleCharacterOperator === '是' || singleCharacterOperator === '为') {\n return start + 1;\n }\n\n const lowerRest = input.slice(start, start + 2).toLowerCase();\n if (lowerRest === 'is') {\n const nextCharacter = input[start + 2] ?? '';\n if (!isAsciiIdentifierPart(nextCharacter)) {\n return start + 2;\n }\n }\n\n return start;\n}\n\nfunction startsNextField(input: string, start: number): boolean {\n let cursor = skipInlineWhitespace(input, start);\n if (cursor >= input.length || input[cursor] === '\\n' || input[cursor] === '\\r') {\n return false;\n }\n\n const afterConnector = readConnector(input, cursor);\n if (afterConnector > cursor) {\n cursor = skipInlineWhitespace(input, afterConnector);\n }\n\n const afterFieldName = readFieldName(input, cursor);\n if (afterFieldName === cursor) {\n return false;\n }\n\n cursor = skipInlineWhitespace(input, afterFieldName);\n const afterOperator = readFieldOperator(input, cursor);\n\n return afterOperator > cursor;\n}\n\nfunction extractValue(\n input: string,\n start: number,\n): {\n end: number;\n value: string;\n} | null {\n const openingQuote = input[start];\n if (openingQuote === '\"' || openingQuote === '\\'') {\n const closingIndex = input.indexOf(openingQuote, start + 1);\n if (closingIndex <= start + 1) {\n return null;\n }\n\n const quotedValue = input.slice(start + 1, closingIndex);\n if (quotedValue.includes('\\n') || quotedValue.includes('\\r')) {\n return null;\n }\n\n return {\n value: quotedValue,\n end: closingIndex + 1,\n };\n }\n\n let cursor = start;\n while (cursor < input.length) {\n const character = input[cursor];\n if (HARD_VALUE_BOUNDARIES.has(character)) {\n break;\n }\n\n if (/\\s/.test(character) && startsNextField(input, cursor)) {\n break;\n }\n\n cursor += 1;\n }\n\n const rawValue = input.slice(start, cursor).trimEnd();\n if (rawValue.length === 0) {\n return null;\n }\n\n return {\n value: rawValue,\n end: start + rawValue.length,\n };\n}\n\nfunction dedupe(matches: DetectedSecret[]): DetectedSecret[] {\n const seen = new Set<string>();\n\n return matches.filter((match) => {\n const key = `${match.start}:${match.end}:${match.patternId}`;\n if (seen.has(key)) {\n return false;\n }\n\n seen.add(key);\n return true;\n });\n}\n\nexport class ContextDetector implements SecretDetector {\n detect(input: string): DetectedSecret[] {\n const matches: DetectedSecret[] = [];\n\n for (const rule of CONTEXT_RULES) {\n for (const match of input.matchAll(rule.expression)) {\n const keyword = match[1];\n if (!keyword || match.index === undefined) {\n continue;\n }\n\n const start = match.index + match[0].length;\n const value = extractValue(input, start);\n if (!value) {\n continue;\n }\n\n matches.push({\n value: value.value,\n type: rule.getType(keyword),\n confidence: 'medium',\n start,\n end: value.end,\n patternId: rule.id,\n });\n }\n }\n\n return dedupe(matches).sort((left, right) => left.start - right.start || left.end - right.end);\n }\n}\n","import type { DetectedSecret, SecretDetector } from './types.js';\n\nconst MIN_SECRET_LENGTH = 20;\nconst HEX_ENTROPY_THRESHOLD = 3.5;\nconst BASE64_ENTROPY_THRESHOLD = 4.5;\n\nconst HEX_CANDIDATE_REGEX = /(?<![A-Fa-f0-9])([A-Fa-f0-9]{20,})(?![A-Fa-f0-9])/g;\nconst BASE64_CANDIDATE_REGEX = /(?<![A-Za-z0-9+/_-])([A-Za-z0-9+/_-]{20,}={0,2})(?![A-Za-z0-9+/_-])/g;\n\nexport interface EntropyDetectorOptions {\n threshold?: number;\n}\n\nfunction calculateShannonEntropy(value: string): number {\n const counts = new Map<string, number>();\n\n for (const char of value) {\n counts.set(char, (counts.get(char) ?? 0) + 1);\n }\n\n let entropy = 0;\n for (const count of counts.values()) {\n const probability = count / value.length;\n entropy -= probability * Math.log2(probability);\n }\n\n return entropy;\n}\n\nfunction countCharacterGroups(value: string): number {\n return [\n /[a-z]/.test(value),\n /[A-Z]/.test(value),\n /\\d/.test(value),\n /[+/_=-]/.test(value),\n ].filter(Boolean).length;\n}\n\nfunction isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction isVersion(value: string): boolean {\n return /^v?\\d+(?:\\.\\d+){1,3}(?:[-+][A-Za-z0-9.-]+)?$/.test(value);\n}\n\nfunction isGitSha(value: string): boolean {\n return /^[0-9a-f]{40}$/i.test(value);\n}\n\nfunction isUrl(value: string): boolean {\n return /^[a-z][a-z0-9+.-]*:\\/\\/\\S+$/i.test(value);\n}\n\nfunction isEmail(value: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\n}\n\nfunction isVariableName(value: string): boolean {\n return /^[A-Z_][A-Z0-9_]*$/.test(value) || /^[a-z_][a-z0-9_]*$/.test(value);\n}\n\nfunction isWhitelisted(value: string): boolean {\n return (\n isUuid(value) ||\n isVersion(value) ||\n isGitSha(value) ||\n isUrl(value) ||\n isEmail(value) ||\n isVariableName(value)\n );\n}\n\nfunction detectFromRegex(\n input: string,\n expression: RegExp,\n patternId: string,\n threshold: number,\n isValidCandidate: (value: string) => boolean,\n): DetectedSecret[] {\n const matches: DetectedSecret[] = [];\n\n for (const match of input.matchAll(expression)) {\n const value = match[1];\n if (!value || match.index === undefined) {\n continue;\n }\n\n if (value.length < MIN_SECRET_LENGTH || isWhitelisted(value) || !isValidCandidate(value)) {\n continue;\n }\n\n if (calculateShannonEntropy(value) <= threshold) {\n continue;\n }\n\n const start = match.index + match[0].indexOf(value);\n matches.push({\n value,\n type: 'GENERIC',\n confidence: 'low',\n start,\n end: start + value.length,\n patternId,\n });\n }\n\n return matches;\n}\n\nfunction isHexCandidate(value: string): boolean {\n return /^[A-Fa-f0-9]+$/.test(value) && !isGitSha(value);\n}\n\nfunction isBase64Candidate(value: string): boolean {\n if (!/^[A-Za-z0-9+/_-]+={0,2}$/.test(value)) {\n return false;\n }\n\n return countCharacterGroups(value) >= 3;\n}\n\nfunction dedupe(matches: DetectedSecret[]): DetectedSecret[] {\n const seen = new Set<string>();\n\n return matches.filter((match) => {\n const key = `${match.start}:${match.end}`;\n if (seen.has(key)) {\n return false;\n }\n\n seen.add(key);\n return true;\n });\n}\n\nexport class EntropyDetector implements SecretDetector {\n constructor(private readonly options: EntropyDetectorOptions = {}) {}\n\n detect(input: string): DetectedSecret[] {\n const threshold = this.options.threshold;\n const matches = [\n ...detectFromRegex(\n input,\n HEX_CANDIDATE_REGEX,\n 'entropy_hex',\n threshold ?? HEX_ENTROPY_THRESHOLD,\n isHexCandidate,\n ),\n ...detectFromRegex(\n input,\n BASE64_CANDIDATE_REGEX,\n 'entropy_base64',\n threshold ?? BASE64_ENTROPY_THRESHOLD,\n isBase64Candidate,\n ),\n ];\n\n return dedupe(matches).sort((left, right) => left.start - right.start || left.end - right.end);\n }\n}\n\nexport { calculateShannonEntropy };\n","import type { SecretType } from '../vault/types.js';\n\nimport type { DetectedSecret, SecretDetector } from './types.js';\n\ninterface PatternDefinition {\n extractValue(match: RegExpMatchArray): string | null;\n id: string;\n type: SecretType;\n expression: RegExp;\n}\n\nexport interface CustomPatternDefinition {\n id: string;\n regex: string;\n type: SecretType;\n}\n\nexport interface PatternDetectorOptions {\n customPatterns?: CustomPatternDefinition[];\n}\n\nconst PRIVATE_KEY_BLOCK_PATTERN =\n /(-----BEGIN ((?:RSA |EC |OPENSSH )?PRIVATE KEY)-----[\\s\\S]*?-----END \\2-----|-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----)/g;\nconst AWS_SECRET_VALUE_PATTERN = /[A-Za-z0-9/+=]{40}/;\n\nexport const KNOWN_SECRET_PATTERNS: PatternDefinition[] = [\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'anthropic_key',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9_-])(sk-ant-api\\d{2}-[A-Za-z0-9_-]{80,})(?![A-Za-z0-9_-])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'openai_project',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9_-])(sk-proj-[A-Za-z0-9_-]{40,})(?![A-Za-z0-9_-])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'openai_key',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9])(sk-(?!proj-)[A-Za-z0-9]{20,})(?![A-Za-z0-9])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'aws_access',\n type: 'APIKEY',\n expression: /(?<![A-Z0-9])((?:AKIA|AGPA|AROA|AIPA)[A-Z0-9]{16})(?![A-Z0-9])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'aws_secret',\n type: 'APIKEY',\n expression: new RegExp(\n String.raw`(?:\\bAWS_SECRET_ACCESS_KEY\\b|\\baws_secret_access_key\\b)\\s*[:=]\\s*(${AWS_SECRET_VALUE_PATTERN.source})(?![A-Za-z0-9/+=])`,\n 'g',\n ),\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'aws_secret',\n type: 'APIKEY',\n expression: new RegExp(\n String.raw`(?:AKIA|AGPA|AROA|AIPA)[A-Z0-9]{16}[=:,\\s]{1,10}(${AWS_SECRET_VALUE_PATTERN.source})(?![A-Za-z0-9/+=])`,\n 'g',\n ),\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'github_pat',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9_])(ghp_[0-9a-zA-Z]{36})(?![A-Za-z0-9_])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'stripe_live',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9_])(sk_live_[0-9a-zA-Z]{24,})(?![A-Za-z0-9_])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'slack_token',\n type: 'APIKEY',\n expression: /(?<![A-Za-z0-9-])(xox[baprs]-[0-9a-zA-Z-]{10,72})(?![A-Za-z0-9-])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'jwt_token',\n type: 'JWT',\n expression: /(?<![A-Za-z0-9_-])(eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)(?![A-Za-z0-9_-])/g,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'rsa_private',\n type: 'PRIVATE_KEY',\n expression: PRIVATE_KEY_BLOCK_PATTERN,\n },\n {\n extractValue(match) {\n return match[1] ?? null;\n },\n id: 'db_connection',\n type: 'DBCONN',\n expression: /((?:mysql|postgres(?:ql)?|mongodb|redis):\\/\\/[^:\\s'\"]+:[^@\\s'\"]+@[^\\s'\"]+)/g,\n },\n];\n\nexport class PatternDetector implements SecretDetector {\n private readonly patterns: PatternDefinition[];\n\n constructor(options: PatternDetectorOptions = {}) {\n this.patterns = [\n ...KNOWN_SECRET_PATTERNS,\n ...buildCustomPatterns(options.customPatterns ?? []),\n ];\n }\n\n detect(input: string): DetectedSecret[] {\n const matches: DetectedSecret[] = [];\n\n for (const pattern of this.patterns) {\n for (const match of input.matchAll(pattern.expression)) {\n const value = pattern.extractValue(match);\n if (!value || match.index === undefined) {\n continue;\n }\n\n const start = match.index + match[0].indexOf(value);\n matches.push({\n value,\n type: pattern.type,\n confidence: 'high',\n start,\n end: start + value.length,\n patternId: pattern.id,\n });\n }\n }\n\n return matches.sort((left, right) => left.start - right.start || left.end - right.end);\n }\n}\n\nfunction buildCustomPatterns(patterns: CustomPatternDefinition[]): PatternDefinition[] {\n return patterns.map((pattern) => ({\n id: pattern.id,\n type: pattern.type,\n expression: new RegExp(pattern.regex, 'g'),\n extractValue(match) {\n return match[0] ?? null;\n },\n }));\n}\n","import { ContextDetector } from './context-detector.js';\nimport { EntropyDetector } from './entropy-detector.js';\nimport { PatternDetector, type CustomPatternDefinition } from './pattern-detector.js';\nimport type { DetectedSecret, SecretDetector } from './types.js';\n\nexport interface CombinedDetectorOptions {\n customPatterns?: CustomPatternDefinition[];\n enablePattern?: boolean;\n enableContext?: boolean;\n enableEntropy?: boolean;\n entropyThreshold?: number;\n}\n\nfunction overlaps(left: DetectedSecret, right: DetectedSecret): boolean {\n return left.start < right.end && right.start < left.end;\n}\n\nexport class CombinedDetector implements SecretDetector {\n private readonly stages: SecretDetector[];\n\n constructor(options: CombinedDetectorOptions = {}) {\n this.stages = [];\n\n if (options.enablePattern !== false) {\n this.stages.push(\n new PatternDetector({\n customPatterns: options.customPatterns,\n }),\n );\n }\n\n if (options.enableContext !== false) {\n this.stages.push(new ContextDetector());\n }\n\n if (options.enableEntropy !== false) {\n this.stages.push(\n new EntropyDetector({\n threshold: options.entropyThreshold,\n }),\n );\n }\n }\n\n detect(input: string): DetectedSecret[] {\n const accepted: DetectedSecret[] = [];\n\n for (const stage of this.stages) {\n for (const match of stage.detect(input)) {\n if (accepted.some((existing) => overlaps(existing, match))) {\n continue;\n }\n\n accepted.push(match);\n }\n }\n\n return accepted.sort((left, right) => left.start - right.start || left.end - right.end);\n }\n}\n","interface ReplacementRule {\n source: string;\n target: string;\n}\n\ninterface ReplacementMatcher {\n findMatches(input: string): Match[];\n}\n\ninterface TrieNode {\n fail: number;\n next: Map<string, number>;\n outputs: number[];\n}\n\ninterface Match {\n end: number;\n replacement: string;\n sourceLength: number;\n start: number;\n}\n\nconst SIMPLE_MATCHER_LIMIT = 10;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction sortRules(rules: ReplacementRule[]): ReplacementRule[] {\n return rules.sort((left, right) => {\n if (right.source.length !== left.source.length) {\n return right.source.length - left.source.length;\n }\n\n return left.source.localeCompare(right.source);\n });\n}\n\nclass RegexMatcher implements ReplacementMatcher {\n private readonly pattern: RegExp;\n private readonly replacements: Map<string, string>;\n\n constructor(rules: ReplacementRule[]) {\n this.replacements = new Map(rules.map((rule) => [rule.source, rule.target]));\n this.pattern = new RegExp(rules.map((rule) => escapeRegExp(rule.source)).join('|'), 'g');\n }\n\n findMatches(input: string): Match[] {\n if (input.length === 0) {\n return [];\n }\n\n this.pattern.lastIndex = 0;\n\n return Array.from(input.matchAll(this.pattern), (match) => {\n const value = match[0];\n const start = match.index ?? 0;\n\n return {\n start,\n end: start + value.length,\n sourceLength: value.length,\n replacement: this.replacements.get(value) ?? value,\n };\n });\n }\n}\n\nclass SingleRuleMatcher implements ReplacementMatcher {\n constructor(private readonly rule: ReplacementRule) {}\n\n findMatches(input: string): Match[] {\n if (input.length === 0 || this.rule.source.length === 0) {\n return [];\n }\n\n const matches: Match[] = [];\n let start = input.indexOf(this.rule.source);\n\n while (start !== -1) {\n matches.push({\n start,\n end: start + this.rule.source.length,\n sourceLength: this.rule.source.length,\n replacement: this.rule.target,\n });\n start = input.indexOf(this.rule.source, start + this.rule.source.length);\n }\n\n return matches;\n }\n}\n\nclass AhoCorasickMatcher implements ReplacementMatcher {\n private readonly nodes: TrieNode[] = [{ fail: 0, next: new Map(), outputs: [] }];\n private readonly rules: ReplacementRule[];\n\n constructor(rules: ReplacementRule[]) {\n this.rules = rules;\n this.buildTrie();\n this.buildFailureLinks();\n }\n\n findMatches(input: string): Match[] {\n if (input.length === 0) {\n return [];\n }\n\n const matches: Match[] = [];\n let nodeIndex = 0;\n\n for (let position = 0; position < input.length; position += 1) {\n const character = input[position];\n\n while (nodeIndex !== 0 && !this.nodes[nodeIndex].next.has(character)) {\n nodeIndex = this.nodes[nodeIndex].fail;\n }\n\n nodeIndex = this.nodes[nodeIndex].next.get(character) ?? 0;\n\n for (const ruleIndex of this.nodes[nodeIndex].outputs) {\n const rule = this.rules[ruleIndex];\n matches.push({\n start: position - rule.source.length + 1,\n end: position + 1,\n sourceLength: rule.source.length,\n replacement: rule.target,\n });\n }\n }\n\n return matches;\n }\n\n private buildTrie(): void {\n this.rules.forEach((rule, ruleIndex) => {\n let nodeIndex = 0;\n\n for (const character of rule.source) {\n const nextIndex = this.nodes[nodeIndex].next.get(character);\n\n if (nextIndex !== undefined) {\n nodeIndex = nextIndex;\n continue;\n }\n\n const createdIndex = this.nodes.length;\n this.nodes.push({ fail: 0, next: new Map(), outputs: [] });\n this.nodes[nodeIndex].next.set(character, createdIndex);\n nodeIndex = createdIndex;\n }\n\n this.nodes[nodeIndex].outputs.push(ruleIndex);\n });\n }\n\n private buildFailureLinks(): void {\n const queue: number[] = [];\n\n for (const childIndex of this.nodes[0].next.values()) {\n this.nodes[childIndex].fail = 0;\n queue.push(childIndex);\n }\n\n while (queue.length > 0) {\n const currentIndex = queue.shift();\n\n if (currentIndex === undefined) {\n break;\n }\n\n const currentNode = this.nodes[currentIndex];\n\n for (const [character, childIndex] of currentNode.next.entries()) {\n let fallbackIndex = currentNode.fail;\n\n while (fallbackIndex !== 0 && !this.nodes[fallbackIndex].next.has(character)) {\n fallbackIndex = this.nodes[fallbackIndex].fail;\n }\n\n const failureTarget = this.nodes[fallbackIndex].next.get(character) ?? 0;\n this.nodes[childIndex].fail = failureTarget;\n this.nodes[childIndex].outputs.push(...this.nodes[failureTarget].outputs);\n queue.push(childIndex);\n }\n }\n }\n}\n\nfunction createMatcher(rules: ReplacementRule[]): ReplacementMatcher | null {\n if (rules.length === 0) {\n return null;\n }\n\n if (rules.length === 1) {\n return new SingleRuleMatcher(rules[0]);\n }\n\n if (rules.length < SIMPLE_MATCHER_LIMIT) {\n return new RegexMatcher(rules);\n }\n\n return new AhoCorasickMatcher(rules);\n}\n\nfunction normalizeRules(replacements: Map<string, string>): ReplacementRule[] {\n return sortRules(\n Array.from(replacements.entries(), ([source, target]) => ({ source, target })).filter(\n (rule) => rule.source.length > 0,\n ),\n );\n}\n\nfunction sortMatches(matches: Match[]): Match[] {\n if (matches.length < 2) {\n return matches;\n }\n\n return matches.sort((left, right) => {\n if (left.start !== right.start) {\n return left.start - right.start;\n }\n\n if (right.sourceLength !== left.sourceLength) {\n return right.sourceLength - left.sourceLength;\n }\n\n return left.end - right.end;\n });\n}\n\nfunction replaceUpTo(input: string, matches: Match[], limit: number): string {\n if (limit <= 0) {\n return '';\n }\n\n let cursor = 0;\n let result = '';\n\n for (const match of matches) {\n if (match.start >= limit) {\n break;\n }\n\n if (match.start < cursor || match.end > limit) {\n continue;\n }\n\n result += input.slice(cursor, match.start);\n result += match.replacement;\n cursor = match.end;\n }\n\n return result + input.slice(cursor, limit);\n}\n\nexport class StreamReplacer {\n private buffer = '';\n private matcher: ReplacementMatcher | null = null;\n private maxPatternLen = 0;\n private prefixes = new Set<string>();\n\n constructor(replacements: Map<string, string>) {\n this.updateRules(replacements);\n }\n\n push(chunk: string): string {\n const input = this.buffer + chunk;\n\n if (this.matcher === null || this.maxPatternLen === 0) {\n this.buffer = '';\n return input;\n }\n\n const lookbehindLength = this.getLookbehindLength(input);\n const tentativeLimit = input.length - lookbehindLength;\n\n if (tentativeLimit <= 0) {\n this.buffer = input;\n return '';\n }\n\n const matches = sortMatches(this.matcher.findMatches(input));\n const safeLimit = this.getSafeLimit(matches, tentativeLimit);\n\n this.buffer = input.slice(safeLimit);\n return replaceUpTo(input, matches, safeLimit);\n }\n\n flush(): string {\n if (this.buffer.length === 0) {\n return '';\n }\n\n const remaining = this.buffer;\n this.buffer = '';\n\n if (this.matcher === null) {\n return remaining;\n }\n\n return replaceUpTo(remaining, sortMatches(this.matcher.findMatches(remaining)), remaining.length);\n }\n\n updateRules(replacements: Map<string, string>): void {\n const rules = normalizeRules(replacements);\n\n this.maxPatternLen = rules.reduce((currentMax, rule) => Math.max(currentMax, rule.source.length), 0);\n this.prefixes = new Set(\n rules.flatMap((rule) =>\n Array.from({ length: Math.max(0, rule.source.length - 1) }, (_, index) =>\n rule.source.slice(0, index + 1),\n ),\n ),\n );\n this.matcher = createMatcher(rules);\n }\n\n private getLookbehindLength(input: string): number {\n const longestCandidate = Math.min(input.length, Math.max(0, this.maxPatternLen - 1));\n\n for (let length = longestCandidate; length > 0; length -= 1) {\n if (this.prefixes.has(input.slice(-length))) {\n return length;\n }\n }\n\n return 0;\n }\n\n private getSafeLimit(matches: Match[], tentativeLimit: number): number {\n let safeLimit = tentativeLimit;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n for (const match of matches) {\n if (match.start >= safeLimit) {\n continue;\n }\n\n if (match.end > safeLimit) {\n safeLimit = match.start;\n changed = true;\n }\n }\n }\n\n return safeLimit;\n }\n}\n","import { SessionVault } from '../vault/session-vault.js';\n\nimport { StreamReplacer } from './stream-replacer.js';\n\nexport interface BidirectionalFlushResult {\n apiResponse: string;\n input: string;\n output: string;\n}\n\nfunction buildReplacementMap(pairs: Array<[string, string]>): Map<string, string> {\n return new Map(pairs);\n}\n\nexport class BidirectionalInterceptor {\n private readonly apiResponseReplacer = new StreamReplacer(new Map());\n private readonly inputReplacer = new StreamReplacer(new Map());\n private readonly outputReplacer = new StreamReplacer(new Map());\n private syncedRevision = -1;\n\n constructor(private readonly vault: SessionVault) {\n this.updateRules();\n }\n\n processInput(chunk: string): string {\n this.syncRules();\n return this.inputReplacer.push(chunk);\n }\n\n processOutput(chunk: string): string {\n this.syncRules();\n return this.outputReplacer.push(chunk);\n }\n\n processApiResponse(chunk: string): string {\n this.syncRules();\n return this.apiResponseReplacer.push(chunk);\n }\n\n flush(): BidirectionalFlushResult {\n this.syncRules();\n\n return {\n input: this.inputReplacer.flush(),\n output: this.outputReplacer.flush(),\n apiResponse: this.apiResponseReplacer.flush(),\n };\n }\n\n updateRules(): void {\n const secretToToken = buildReplacementMap(this.vault.getSecretToTokenPairs());\n const tokenToSecret = buildReplacementMap(this.vault.getTokenToSecretPairs());\n\n this.inputReplacer.updateRules(secretToToken);\n this.outputReplacer.updateRules(tokenToSecret);\n this.apiResponseReplacer.updateRules(tokenToSecret);\n this.syncedRevision = this.vault.revision;\n }\n\n private syncRules(): void {\n if (this.syncedRevision === this.vault.revision) {\n return;\n }\n\n this.updateRules();\n }\n}\n","import { chmodSync, existsSync, statSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { dirname, join } from 'node:path';\nimport { type Readable, type Writable } from 'node:stream';\n\nimport * as pty from 'node-pty';\n\nexport interface PtyWrapperOptions {\n flushStdinData?: () => string;\n flushStdoutData?: () => string;\n onStdinData?: (data: string) => string;\n onStdoutData?: (data: string) => string;\n stdin?: Readable & {\n isRaw?: boolean;\n isTTY?: boolean;\n setRawMode?: (mode: boolean) => void;\n };\n stdout?: Writable & {\n columns?: number;\n isTTY?: boolean;\n rows?: number;\n };\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n}\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\nconst require = createRequire(import.meta.url);\nconst nodePtyPackageDirectory = dirname(require.resolve('node-pty/package.json'));\n\nfunction identity(data: string): string {\n return data;\n}\n\nfunction empty(): string {\n return '';\n}\n\nfunction getColumns(stdout: PtyWrapperOptions['stdout']): number {\n return stdout?.columns && stdout.columns > 0 ? stdout.columns : DEFAULT_COLUMNS;\n}\n\nfunction getRows(stdout: PtyWrapperOptions['stdout']): number {\n return stdout?.rows && stdout.rows > 0 ? stdout.rows : DEFAULT_ROWS;\n}\n\nfunction forwardSignal(terminal: pty.IPty, signal: NodeJS.Signals): void {\n if (process.platform === 'win32') {\n terminal.kill();\n return;\n }\n\n terminal.kill(signal);\n}\n\nfunction ensureSpawnHelperExecutable(): void {\n if (process.platform === 'win32') {\n return;\n }\n\n const candidates = [\n join(nodePtyPackageDirectory, 'prebuilds', `${process.platform}-${process.arch}`, 'spawn-helper'),\n join(nodePtyPackageDirectory, 'build', 'Release', 'spawn-helper'),\n join(nodePtyPackageDirectory, 'build', 'Debug', 'spawn-helper'),\n ];\n\n for (const helperPath of candidates) {\n if (!existsSync(helperPath)) {\n continue;\n }\n\n const currentMode = statSync(helperPath).mode & 0o777;\n if ((currentMode & 0o111) !== 0) {\n return;\n }\n\n chmodSync(helperPath, currentMode | 0o755);\n return;\n }\n}\n\nexport async function runPtyCommand(\n command: string,\n args: string[],\n options: PtyWrapperOptions = {},\n): Promise<number> {\n const stdin = options.stdin ?? process.stdin;\n const stdout = options.stdout ?? process.stdout;\n const flushStdinData = options.flushStdinData ?? empty;\n const flushStdoutData = options.flushStdoutData ?? empty;\n const onStdinData = options.onStdinData ?? identity;\n const onStdoutData = options.onStdoutData ?? identity;\n const env = options.env ?? process.env;\n\n ensureSpawnHelperExecutable();\n\n const terminal = pty.spawn(command, args, {\n name: env.TERM ?? 'xterm-color',\n cols: getColumns(stdout),\n rows: getRows(stdout),\n cwd: options.cwd ?? process.cwd(),\n env,\n });\n\n let cleanedUp = false;\n const wasRawModeEnabled = Boolean(stdin.isRaw);\n const canToggleRawMode = Boolean(stdin.isTTY && typeof stdin.setRawMode === 'function');\n\n const syncWindowSize = (): void => {\n try {\n terminal.resize(getColumns(stdout), getRows(stdout));\n } catch {\n // 子进程已退出时,尺寸同步失败可直接忽略。\n }\n };\n\n const handleStdinData = (chunk: string | Buffer): void => {\n const nextData = onStdinData(chunk.toString());\n if (nextData.length > 0) {\n terminal.write(nextData);\n }\n };\n\n const handleStdinEnd = (): void => {\n const nextData = flushStdinData();\n if (nextData.length > 0) {\n terminal.write(nextData);\n }\n };\n\n const handleSigint = (): void => {\n forwardSignal(terminal, 'SIGINT');\n };\n\n const handleSigterm = (): void => {\n forwardSignal(terminal, 'SIGTERM');\n };\n\n const handleSigwinch = (): void => {\n syncWindowSize();\n };\n\n const stdoutDisposable = terminal.onData((data) => {\n const nextData = onStdoutData(data);\n if (nextData.length > 0) {\n stdout.write(nextData);\n }\n });\n\n const cleanup = (): void => {\n if (cleanedUp) {\n return;\n }\n\n cleanedUp = true;\n const finalStdout = flushStdoutData();\n if (finalStdout.length > 0) {\n stdout.write(finalStdout);\n }\n stdoutDisposable.dispose();\n stdin.removeListener('data', handleStdinData);\n stdin.removeListener('end', handleStdinEnd);\n process.removeListener('SIGINT', handleSigint);\n process.removeListener('SIGTERM', handleSigterm);\n process.removeListener('SIGWINCH', handleSigwinch);\n\n if (canToggleRawMode && !wasRawModeEnabled) {\n stdin.setRawMode?.(false);\n }\n\n stdin.pause();\n };\n\n stdin.on('data', handleStdinData);\n stdin.on('end', handleStdinEnd);\n stdin.resume();\n\n if (canToggleRawMode && !wasRawModeEnabled) {\n stdin.setRawMode?.(true);\n }\n\n process.on('SIGINT', handleSigint);\n process.on('SIGTERM', handleSigterm);\n process.on('SIGWINCH', handleSigwinch);\n\n try {\n return await new Promise<number>((resolve) => {\n terminal.onExit(({ exitCode }) => {\n cleanup();\n resolve(exitCode);\n });\n\n syncWindowSize();\n });\n } finally {\n cleanup();\n }\n}\n\nexport async function createPtyWrapper(\n command: string,\n args: string[],\n options?: PtyWrapperOptions,\n): Promise<void> {\n process.exitCode = await runPtyCommand(command, args, options);\n}\n","import type { ProxyTargets } from './types.js';\n\nconst DEFAULT_TARGETS: ProxyTargets = {\n anthropic: 'https://api.anthropic.com',\n openai: 'https://api.openai.com',\n};\n\nfunction trimTrailingSlash(value: string): string {\n return value.endsWith('/') ? value.slice(0, -1) : value;\n}\n\nexport function getDefaultProxyTargets(env: NodeJS.ProcessEnv = process.env): ProxyTargets {\n return {\n anthropic:\n env.__AIS_REAL_ANTHROPIC_URL ?? env.ANTHROPIC_BASE_URL ?? DEFAULT_TARGETS.anthropic,\n openai: env.__AIS_REAL_OPENAI_URL ?? env.OPENAI_BASE_URL ?? DEFAULT_TARGETS.openai,\n };\n}\n\nexport function buildProxyEnvironment(\n proxyBaseUrl: string,\n env: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const resolvedProxyUrl = trimTrailingSlash(proxyBaseUrl);\n\n return {\n ...env,\n ANTHROPIC_BASE_URL: resolvedProxyUrl,\n OPENAI_BASE_URL: resolvedProxyUrl,\n __AIS_REAL_ANTHROPIC_URL:\n env.__AIS_REAL_ANTHROPIC_URL ??\n env.ANTHROPIC_BASE_URL ??\n DEFAULT_TARGETS.anthropic,\n __AIS_REAL_OPENAI_URL:\n env.__AIS_REAL_OPENAI_URL ?? env.OPENAI_BASE_URL ?? DEFAULT_TARGETS.openai,\n };\n}\n\nexport { DEFAULT_TARGETS as DEFAULT_PROXY_TARGETS };\n","import {\n createServer,\n request as createHttpRequest,\n type IncomingHttpHeaders,\n type IncomingMessage,\n type OutgoingHttpHeaders,\n type RequestOptions,\n type Server,\n type ServerResponse,\n STATUS_CODES,\n} from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { request as createHttpsRequest } from 'node:https';\nimport type { AddressInfo } from 'node:net';\nimport { join } from 'node:path';\nimport type { Duplex } from 'node:stream';\n\nimport { StreamReplacer } from '../interceptor/stream-replacer.js';\nimport { SessionVault } from '../vault/session-vault.js';\n\nimport { getDefaultProxyTargets } from './environment.js';\nimport {\n type ChatMessage,\n createResponsesCompatibilityStatusBody,\n ResponsesCompatibilitySseTransformer,\n ResponsesCompatibilityStore,\n translateChatCompletionJsonToResponses,\n translateResponsesRequest,\n} from './responses-compat.js';\nimport { relayWebSocket } from './websocket-relay.js';\nimport type { ProxyProvider, ProxyTargets } from './types.js';\n\nconst DEFAULT_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 18080;\nconst DEFAULT_PUBLIC_HOST = 'localhost';\nconst DEFAULT_TIMEOUT_MS = 120_000;\nconst DEFAULT_MAX_PORT_ATTEMPTS = 20;\nconst HOP_BY_HOP_HEADERS = new Set([\n 'connection',\n 'keep-alive',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'proxy-connection',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n]);\n\nconst WEBSOCKET_REQUEST_HEADERS_TO_DROP = new Set([\n 'content-length',\n 'keep-alive',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'proxy-connection',\n 'sec-websocket-extensions',\n 'te',\n 'trailer',\n 'transfer-encoding',\n]);\n\nconst CAPTURE_REDACTED_HEADERS = new Set([\n 'authorization',\n 'cookie',\n 'proxy-authorization',\n 'set-cookie',\n 'x-api-key',\n]);\n\ninterface TextFieldTemplate {\n apply: (payload: unknown, value: string) => void;\n payload: unknown;\n}\n\ninterface ResolvedTarget {\n provider: ProxyProvider;\n url: URL;\n}\n\ninterface SseTrackedField {\n apply: (value: string) => void;\n key: string;\n template: TextFieldTemplate;\n value: string;\n}\n\nexport interface ProxyOptions {\n captureDir?: string;\n defaultProvider?: ProxyProvider;\n host?: string;\n maxPortAttempts?: number;\n onRequestText?: (body: string) => void;\n port?: number;\n publicHost?: string;\n targetBaseUrl?: string;\n targets?: Partial<ProxyTargets>;\n timeoutMs?: number;\n vault: SessionVault;\n}\n\nfunction cloneJsonValue<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction getFirstHeaderValue(value: string | string[] | undefined): string | undefined {\n if (Array.isArray(value)) {\n return value[0];\n }\n\n return value;\n}\n\nfunction isTextBasedContentType(headers: IncomingHttpHeaders): boolean {\n const contentType = getFirstHeaderValue(headers['content-type'])?.toLowerCase();\n if (!contentType) {\n return true;\n }\n\n return (\n contentType.startsWith('text/') ||\n contentType.includes('application/json') ||\n contentType.includes('+json') ||\n contentType.includes('application/x-ndjson')\n );\n}\n\nfunction isSseResponse(headers: IncomingHttpHeaders): boolean {\n const contentType = getFirstHeaderValue(headers['content-type'])?.toLowerCase();\n return contentType?.includes('text/event-stream') ?? false;\n}\n\nfunction copyHeaders(\n headers: IncomingHttpHeaders,\n options: { preserveUpgradeHeaders?: boolean } = {},\n): OutgoingHttpHeaders {\n const result: OutgoingHttpHeaders = {};\n\n for (const [key, value] of Object.entries(headers)) {\n const normalizedKey = key.toLowerCase();\n const keepUpgradeHeader =\n options.preserveUpgradeHeaders === true &&\n (normalizedKey === 'connection' || normalizedKey === 'upgrade');\n\n if (value === undefined || (HOP_BY_HOP_HEADERS.has(normalizedKey) && !keepUpgradeHeader)) {\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\nfunction buildUpstreamHeaders(\n headers: IncomingHttpHeaders,\n targetUrl: URL,\n body: Buffer,\n): OutgoingHttpHeaders {\n const result = copyHeaders(headers);\n result.host = targetUrl.host;\n result['accept-encoding'] = 'identity';\n\n if (body.length > 0) {\n result['content-length'] = String(body.length);\n } else {\n delete result['content-length'];\n }\n\n return result;\n}\n\nfunction stripResponsesCompatibilityHeaders(headers: OutgoingHttpHeaders): OutgoingHttpHeaders {\n const result: OutgoingHttpHeaders = {};\n\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() === 'openai-beta') {\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n}\n\nfunction normalizeHeadersForCapture(\n headers: IncomingHttpHeaders | OutgoingHttpHeaders,\n): Record<string, string | string[]> {\n return Object.fromEntries(\n Object.entries(headers)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => {\n if (CAPTURE_REDACTED_HEADERS.has(key.toLowerCase())) {\n return [key, '<redacted>'];\n }\n\n if (Array.isArray(value)) {\n return [key, value.map((entry) => String(entry))];\n }\n\n return [key, String(value)];\n }),\n );\n}\n\nfunction parseJsonForCapture(text: string): unknown {\n if (text.length === 0) {\n return null;\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\ninterface ResponsesCompatibilityCaptureContext {\n clientHeaders: Record<string, string | string[]>;\n clientPath: string;\n clientRequestBody: unknown;\n translatedRequestBody: unknown;\n translatedRequestHeaders: Record<string, string | string[]>;\n translatedUpstreamUrl: string;\n}\n\nfunction buildUpstreamWebSocketHeaders(headers: IncomingHttpHeaders): OutgoingHttpHeaders {\n const result = copyHeaders(headers, { preserveUpgradeHeaders: true });\n result['accept-encoding'] = 'identity';\n result.connection = getFirstHeaderValue(headers.connection) ?? 'Upgrade';\n result.upgrade = getFirstHeaderValue(headers.upgrade) ?? 'websocket';\n\n for (const key of WEBSOCKET_REQUEST_HEADERS_TO_DROP) {\n delete result[key];\n }\n\n return result;\n}\n\nfunction buildClientHeaders(\n headers: IncomingHttpHeaders,\n contentLength?: number,\n): OutgoingHttpHeaders {\n const result = copyHeaders(headers);\n\n if (contentLength === undefined) {\n delete result['content-length'];\n } else {\n result['content-length'] = String(contentLength);\n }\n\n return result;\n}\n\nfunction formatRawHeaderLines(headers: OutgoingHttpHeaders): string {\n let output = '';\n\n for (const [key, value] of Object.entries(headers)) {\n if (value === undefined) {\n continue;\n }\n\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n output += `${key}: ${entry}\\r\\n`;\n });\n continue;\n }\n\n output += `${key}: ${String(value)}\\r\\n`;\n }\n\n return output;\n}\n\nfunction writeRawHttpResponse(options: {\n body?: Buffer;\n headers?: OutgoingHttpHeaders;\n socket: Duplex;\n statusCode: number;\n statusMessage: string;\n version?: string;\n}): void {\n const {\n body = Buffer.alloc(0),\n headers = {},\n socket,\n statusCode,\n statusMessage,\n version = '1.1',\n } = options;\n const headerBlock = formatRawHeaderLines(headers);\n socket.write(`HTTP/${version} ${statusCode} ${statusMessage}\\r\\n${headerBlock}\\r\\n`);\n if (body.length > 0) {\n socket.write(body);\n }\n}\n\nfunction buildUpstreamUrl(baseUrl: string, requestPath: string): URL {\n const base = new URL(baseUrl);\n const requestUrl = new URL(requestPath, 'http://ais.local');\n const normalizedBasePath = base.pathname.endsWith('/')\n ? base.pathname.slice(0, -1)\n : base.pathname;\n\n base.pathname = `${normalizedBasePath}${requestUrl.pathname}`.replace(/\\/{2,}/g, '/');\n base.search = requestUrl.search;\n\n return base;\n}\n\nfunction normalizeRequestPath(value: string): string {\n if (value.length === 0) {\n return '/';\n }\n\n return value.startsWith('/') ? value : `/${value}`;\n}\n\nfunction isResponsesCompatibilityRoot(path: string): boolean {\n const lowerPath = path.toLowerCase();\n return lowerPath === '/v1/responses' || lowerPath === '/responses';\n}\n\nfunction getResponsesCompatibilityResponseId(path: string): string | null {\n const lowerPath = path.toLowerCase();\n const match = lowerPath.match(/^\\/(?:v1\\/)?responses\\/([^/]+)$/);\n return match ? match[1] : null;\n}\n\nfunction stripProviderPrefix(path: string, provider: ProxyProvider): string {\n const prefix = `/${provider}`;\n\n if (path === prefix) {\n return '/';\n }\n\n if (path.startsWith(`${prefix}/`)) {\n return path.slice(prefix.length);\n }\n\n return path;\n}\n\nfunction resolveConfiguredTargets(options: ProxyOptions): ProxyTargets {\n const targets = {\n ...getDefaultProxyTargets(),\n ...options.targets,\n };\n\n if (options.targetBaseUrl) {\n targets.anthropic = options.targetBaseUrl;\n targets.openai = options.targetBaseUrl;\n }\n\n return targets;\n}\n\nfunction resolveProvider(\n request: IncomingMessage,\n targets: ProxyTargets,\n defaultProvider?: ProxyProvider,\n): ResolvedTarget {\n const requestPath = normalizeRequestPath(request.url ?? '/');\n\n if (requestPath === '/health') {\n throw new Error('Health requests should not be resolved as upstream targets');\n }\n\n const anthropicTarget = stripProviderPrefix(requestPath, 'anthropic') !== requestPath;\n if (anthropicTarget) {\n return {\n provider: 'anthropic',\n url: buildUpstreamUrl(targets.anthropic, stripProviderPrefix(requestPath, 'anthropic')),\n };\n }\n\n const openAiTarget = stripProviderPrefix(requestPath, 'openai') !== requestPath;\n if (openAiTarget) {\n return {\n provider: 'openai',\n url: buildUpstreamUrl(targets.openai, stripProviderPrefix(requestPath, 'openai')),\n };\n }\n\n const lowerPath = requestPath.toLowerCase();\n const anthropicHeadersPresent =\n getFirstHeaderValue(request.headers['anthropic-version']) !== undefined ||\n getFirstHeaderValue(request.headers['x-api-key']) !== undefined;\n const openAiHeadersPresent =\n getFirstHeaderValue(request.headers.authorization) !== undefined ||\n getFirstHeaderValue(request.headers['openai-organization']) !== undefined ||\n getFirstHeaderValue(request.headers['openai-beta']) !== undefined;\n\n if (anthropicHeadersPresent) {\n return {\n provider: 'anthropic',\n url: buildUpstreamUrl(targets.anthropic, requestPath),\n };\n }\n\n if (openAiHeadersPresent) {\n return {\n provider: 'openai',\n url: buildUpstreamUrl(targets.openai, requestPath),\n };\n }\n\n if (lowerPath.startsWith('/v1/messages') || lowerPath.startsWith('/v1/complete')) {\n return {\n provider: 'anthropic',\n url: buildUpstreamUrl(targets.anthropic, requestPath),\n };\n }\n\n if (\n lowerPath.startsWith('/v1/chat/') ||\n lowerPath.startsWith('/v1/completions') ||\n lowerPath.startsWith('/v1/responses') ||\n lowerPath.startsWith('/responses') ||\n lowerPath.startsWith('/v1/embeddings') ||\n lowerPath.startsWith('/v1/audio')\n ) {\n return {\n provider: 'openai',\n url: buildUpstreamUrl(targets.openai, requestPath),\n };\n }\n\n if (defaultProvider) {\n return {\n provider: defaultProvider,\n url: buildUpstreamUrl(targets[defaultProvider], requestPath),\n };\n }\n\n throw new Error(`Unable to determine upstream provider for request path: ${requestPath}`);\n}\n\nfunction applyWholeBodyReplacement(body: Buffer, replacements: Map<string, string>): Buffer {\n if (body.length === 0 || replacements.size === 0) {\n return body;\n }\n\n const replacer = new StreamReplacer(replacements);\n const replaced = replacer.push(body.toString('utf8')) + replacer.flush();\n\n return Buffer.from(replaced, 'utf8');\n}\n\nclass SseFieldReplacer {\n private buffer = '';\n private readonly prefixes: Set<string>;\n private readonly sources: string[];\n\n constructor(private readonly replacements: Map<string, string>) {\n this.sources = Array.from(replacements.keys()).sort((left, right) => {\n if (right.length !== left.length) {\n return right.length - left.length;\n }\n\n return left.localeCompare(right);\n });\n this.prefixes = new Set(\n this.sources.flatMap((source) =>\n Array.from({ length: Math.max(0, source.length - 1) }, (_, index) =>\n source.slice(0, index + 1),\n ),\n ),\n );\n }\n\n push(chunk: string): string {\n const input = this.buffer + chunk;\n\n if (this.sources.length === 0) {\n this.buffer = '';\n return input;\n }\n\n const tentativeLimit = input.length - this.getLookbehindLength(input);\n if (tentativeLimit <= 0) {\n this.buffer = input;\n return '';\n }\n\n const safeLimit = this.getSafeLimit(input, tentativeLimit);\n this.buffer = input.slice(safeLimit);\n\n return this.replaceText(input.slice(0, safeLimit));\n }\n\n flush(): string {\n if (this.buffer.length === 0) {\n return '';\n }\n\n const value = this.replaceText(this.buffer);\n this.buffer = '';\n return value;\n }\n\n private getLookbehindLength(input: string): number {\n const longestCandidate = Math.min(\n input.length,\n Math.max(0, ...this.sources.map((source) => source.length - 1)),\n );\n\n for (let length = longestCandidate; length > 0; length -= 1) {\n if (this.prefixes.has(input.slice(-length))) {\n return length;\n }\n }\n\n return 0;\n }\n\n private getSafeLimit(input: string, tentativeLimit: number): number {\n let safeLimit = tentativeLimit;\n let changed = true;\n\n while (changed) {\n changed = false;\n\n for (const source of this.sources) {\n const searchFrom = Math.min(input.length - 1, Math.max(0, safeLimit - 1));\n const matchStart = input.lastIndexOf(source, searchFrom);\n\n if (matchStart !== -1 && matchStart < safeLimit && matchStart + source.length > safeLimit) {\n safeLimit = matchStart;\n changed = true;\n }\n }\n }\n\n return safeLimit;\n }\n\n private replaceText(value: string): string {\n if (value.length === 0) {\n return '';\n }\n\n return applyWholeBodyReplacement(Buffer.from(value, 'utf8'), this.replacements).toString('utf8');\n }\n}\n\nfunction setAnthropicTrackedField(payload: Record<string, unknown>, field: string, value: string): void {\n if (field === 'completion') {\n payload.completion = value;\n return;\n }\n\n const [containerKey, nestedKey] = field.split('.');\n const container = payload[containerKey];\n if (!isRecord(container)) {\n return;\n }\n\n container[nestedKey] = value;\n}\n\nfunction clearAnthropicTrackedFields(payload: Record<string, unknown>): void {\n if (typeof payload.completion === 'string') {\n payload.completion = '';\n }\n\n if (isRecord(payload.delta) && typeof payload.delta.text === 'string') {\n payload.delta.text = '';\n }\n\n if (isRecord(payload.delta) && typeof payload.delta.partial_json === 'string') {\n payload.delta.partial_json = '';\n }\n\n if (isRecord(payload.content_block) && typeof payload.content_block.text === 'string') {\n payload.content_block.text = '';\n }\n}\n\nfunction createAnthropicFields(payload: Record<string, unknown>): SseTrackedField[] {\n const tracked: SseTrackedField[] = [];\n const index = typeof payload.index === 'number' ? payload.index : 0;\n\n const createTemplate = (field: string): TextFieldTemplate => {\n const templatePayload = cloneJsonValue(payload);\n clearAnthropicTrackedFields(templatePayload);\n\n return {\n payload: templatePayload,\n apply: (draft, value) => {\n if (!isRecord(draft)) {\n return;\n }\n\n setAnthropicTrackedField(draft, field, value);\n },\n };\n };\n\n if (isRecord(payload.delta) && typeof payload.delta.text === 'string') {\n tracked.push({\n key: `anthropic:${index}:delta.text`,\n value: payload.delta.text,\n apply: (value) => {\n if (isRecord(payload.delta)) {\n payload.delta.text = value;\n }\n },\n template: createTemplate('delta.text'),\n });\n }\n\n if (isRecord(payload.delta) && typeof payload.delta.partial_json === 'string') {\n tracked.push({\n key: `anthropic:${index}:delta.partial_json`,\n value: payload.delta.partial_json,\n apply: (value) => {\n if (isRecord(payload.delta)) {\n payload.delta.partial_json = value;\n }\n },\n template: createTemplate('delta.partial_json'),\n });\n }\n\n if (isRecord(payload.content_block) && typeof payload.content_block.text === 'string') {\n tracked.push({\n key: `anthropic:${index}:content_block.text`,\n value: payload.content_block.text,\n apply: (value) => {\n if (isRecord(payload.content_block)) {\n payload.content_block.text = value;\n }\n },\n template: createTemplate('content_block.text'),\n });\n }\n\n if (typeof payload.completion === 'string') {\n tracked.push({\n key: 'anthropic:completion',\n value: payload.completion,\n apply: (value) => {\n payload.completion = value;\n },\n template: createTemplate('completion'),\n });\n }\n\n return tracked;\n}\n\nfunction clearOpenAiTrackedFields(payload: Record<string, unknown>): void {\n if (!Array.isArray(payload.choices)) {\n return;\n }\n\n payload.choices.forEach((choice) => {\n if (!isRecord(choice)) {\n return;\n }\n\n if (typeof choice.text === 'string') {\n choice.text = '';\n }\n\n if (isRecord(choice.delta) && typeof choice.delta.content === 'string') {\n choice.delta.content = '';\n }\n\n if (\n isRecord(choice.delta) &&\n isRecord(choice.delta.function_call) &&\n typeof choice.delta.function_call.arguments === 'string'\n ) {\n choice.delta.function_call.arguments = '';\n }\n\n if (isRecord(choice.delta) && Array.isArray(choice.delta.tool_calls)) {\n choice.delta.tool_calls.forEach((toolCall) => {\n if (!isRecord(toolCall) || !isRecord(toolCall.function)) {\n return;\n }\n\n if (typeof toolCall.function.arguments === 'string') {\n toolCall.function.arguments = '';\n }\n });\n }\n });\n}\n\nfunction setOpenAiTrackedField(\n payload: Record<string, unknown>,\n choiceIndex: number,\n fieldPath: string,\n value: string,\n): void {\n if (!Array.isArray(payload.choices)) {\n return;\n }\n\n const choice = payload.choices.find((item, index) => {\n if (!isRecord(item)) {\n return false;\n }\n\n if (typeof item.index === 'number') {\n return item.index === choiceIndex;\n }\n\n return index === choiceIndex;\n });\n\n if (!isRecord(choice)) {\n return;\n }\n\n if (fieldPath === 'text') {\n choice.text = value;\n return;\n }\n\n if (fieldPath === 'delta.content') {\n if (isRecord(choice.delta)) {\n choice.delta.content = value;\n }\n\n return;\n }\n\n if (fieldPath === 'delta.function_call.arguments') {\n if (isRecord(choice.delta) && isRecord(choice.delta.function_call)) {\n choice.delta.function_call.arguments = value;\n }\n\n return;\n }\n\n const toolCallMatch = fieldPath.match(/^delta\\.tool_calls\\.(\\d+)\\.function\\.arguments$/);\n if (!toolCallMatch) {\n return;\n }\n\n const toolCallIndex = Number(toolCallMatch[1]);\n if (!isRecord(choice.delta) || !Array.isArray(choice.delta.tool_calls)) {\n return;\n }\n\n const toolCall = choice.delta.tool_calls[toolCallIndex];\n if (!isRecord(toolCall) || !isRecord(toolCall.function)) {\n return;\n }\n\n toolCall.function.arguments = value;\n}\n\nfunction createOpenAiFields(payload: Record<string, unknown>): SseTrackedField[] {\n if (!Array.isArray(payload.choices)) {\n return [];\n }\n\n const tracked: SseTrackedField[] = [];\n\n payload.choices.forEach((choice, position) => {\n if (!isRecord(choice)) {\n return;\n }\n\n const choiceIndex = typeof choice.index === 'number' ? choice.index : position;\n const createTemplate = (fieldPath: string): TextFieldTemplate => {\n const templatePayload = cloneJsonValue(payload);\n clearOpenAiTrackedFields(templatePayload);\n\n return {\n payload: templatePayload,\n apply: (draft, value) => {\n if (!isRecord(draft)) {\n return;\n }\n\n setOpenAiTrackedField(draft, choiceIndex, fieldPath, value);\n },\n };\n };\n\n if (typeof choice.text === 'string') {\n tracked.push({\n key: `openai:${choiceIndex}:text`,\n value: choice.text,\n apply: (value) => {\n choice.text = value;\n },\n template: createTemplate('text'),\n });\n }\n\n if (isRecord(choice.delta) && typeof choice.delta.content === 'string') {\n tracked.push({\n key: `openai:${choiceIndex}:delta.content`,\n value: choice.delta.content,\n apply: (value) => {\n if (isRecord(choice.delta)) {\n choice.delta.content = value;\n }\n },\n template: createTemplate('delta.content'),\n });\n }\n\n if (\n isRecord(choice.delta) &&\n isRecord(choice.delta.function_call) &&\n typeof choice.delta.function_call.arguments === 'string'\n ) {\n tracked.push({\n key: `openai:${choiceIndex}:delta.function_call.arguments`,\n value: choice.delta.function_call.arguments,\n apply: (value) => {\n if (isRecord(choice.delta) && isRecord(choice.delta.function_call)) {\n choice.delta.function_call.arguments = value;\n }\n },\n template: createTemplate('delta.function_call.arguments'),\n });\n }\n\n if (isRecord(choice.delta) && Array.isArray(choice.delta.tool_calls)) {\n choice.delta.tool_calls.forEach((toolCall, toolCallIndex) => {\n if (!isRecord(toolCall) || !isRecord(toolCall.function)) {\n return;\n }\n\n if (typeof toolCall.function.arguments !== 'string') {\n return;\n }\n\n tracked.push({\n key: `openai:${choiceIndex}:delta.tool_calls.${toolCallIndex}.function.arguments`,\n value: toolCall.function.arguments,\n apply: (value) => {\n if (\n isRecord(choice.delta) &&\n Array.isArray(choice.delta.tool_calls) &&\n isRecord(choice.delta.tool_calls[toolCallIndex]) &&\n isRecord(choice.delta.tool_calls[toolCallIndex].function)\n ) {\n choice.delta.tool_calls[toolCallIndex].function.arguments = value;\n }\n },\n template: createTemplate(`delta.tool_calls.${toolCallIndex}.function.arguments`),\n });\n });\n }\n });\n\n return tracked;\n}\n\nclass SseTransformer {\n private buffer = '';\n private readonly replacers = new Map<string, SseFieldReplacer>();\n private readonly templates = new Map<string, TextFieldTemplate>();\n\n constructor(\n private readonly provider: ProxyProvider,\n private readonly replacements: Map<string, string>,\n ) {}\n\n push(chunk: string): string {\n const input = this.buffer + chunk;\n const parts = input.split(/(\\r?\\n)/);\n const lastPart = parts.pop();\n this.buffer = lastPart ?? '';\n\n let output = '';\n\n for (let index = 0; index < parts.length; index += 2) {\n const line = parts[index] ?? '';\n const separator = parts[index + 1] ?? '';\n output += this.transformLine(line) + separator;\n }\n\n return output;\n }\n\n flush(): string {\n let output = '';\n\n if (this.buffer.length > 0) {\n output += this.transformLine(this.buffer);\n this.buffer = '';\n }\n\n for (const [key, replacer] of this.replacers.entries()) {\n const remaining = replacer.flush();\n if (remaining.length === 0) {\n continue;\n }\n\n const template = this.templates.get(key);\n if (!template) {\n continue;\n }\n\n const payload = cloneJsonValue(template.payload);\n template.apply(payload, remaining);\n output += `data: ${JSON.stringify(payload)}\\n\\n`;\n }\n\n return output;\n }\n\n private getFields(payload: Record<string, unknown>): SseTrackedField[] {\n if (this.provider === 'anthropic') {\n return createAnthropicFields(payload);\n }\n\n return createOpenAiFields(payload);\n }\n\n private getReplacer(key: string): SseFieldReplacer {\n const existing = this.replacers.get(key);\n if (existing) {\n return existing;\n }\n\n const created = new SseFieldReplacer(this.replacements);\n this.replacers.set(key, created);\n return created;\n }\n\n private transformLine(line: string): string {\n if (!line.startsWith('data:')) {\n return line;\n }\n\n const prefix = line.startsWith('data: ') ? 'data: ' : 'data:';\n const payload = line.slice(prefix.length);\n\n if (payload === '[DONE]') {\n return line;\n }\n\n try {\n const parsed = JSON.parse(payload) as unknown;\n if (!isRecord(parsed)) {\n return line;\n }\n\n const fields = this.getFields(parsed);\n if (fields.length === 0) {\n return line;\n }\n\n fields.forEach((field) => {\n const replacer = this.getReplacer(field.key);\n const replaced = replacer.push(field.value);\n field.apply(replaced);\n this.templates.set(field.key, field.template);\n });\n\n return `${prefix}${JSON.stringify(parsed)}`;\n } catch {\n return line;\n }\n }\n}\n\nasync function readRequestBody(request: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n\n request.on('data', (chunk: Buffer | string) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n\n request.once('end', () => {\n resolve(Buffer.concat(chunks));\n });\n request.once('error', reject);\n request.once('aborted', () => {\n reject(new Error('Client request was aborted'));\n });\n });\n}\n\nfunction sendProxyError(response: ServerResponse, statusCode: number, message: string): void {\n const body = JSON.stringify({ error: message });\n\n response.writeHead(statusCode, {\n 'content-length': String(Buffer.byteLength(body)),\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(body);\n}\n\nexport class ProxyServer {\n private activePort: number | null = null;\n private readonly activeUpgradeSockets = new Set<Duplex>();\n private readonly captureDir?: string;\n private readonly defaultProvider?: ProxyProvider;\n private readonly host: string;\n private readonly maxPortAttempts: number;\n private readonly port: number;\n private readonly publicHost: string;\n private readonly responsesCompatibilityStore = new ResponsesCompatibilityStore();\n private server: Server | null = null;\n private readonly targets: ProxyTargets;\n private readonly timeoutMs: number;\n\n constructor(private readonly options: ProxyOptions) {\n this.captureDir = options.captureDir ?? process.env.AIS_PROXY_CAPTURE_DIR;\n this.defaultProvider = options.defaultProvider;\n this.host = options.host ?? DEFAULT_HOST;\n this.maxPortAttempts = options.maxPortAttempts ?? DEFAULT_MAX_PORT_ATTEMPTS;\n this.port = options.port ?? DEFAULT_PORT;\n this.publicHost = options.publicHost ?? DEFAULT_PUBLIC_HOST;\n this.targets = resolveConfiguredTargets(options);\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n }\n\n getBaseUrl(): string {\n const currentPort = this.activePort ?? this.port;\n return `http://${this.publicHost}:${currentPort}`;\n }\n\n async start(): Promise<number> {\n if (this.server && this.activePort !== null) {\n return this.activePort;\n }\n\n let nextPort = this.port;\n let attemptsRemaining = this.maxPortAttempts;\n\n while (attemptsRemaining > 0) {\n const server = createServer((request, response) => {\n void this.handleRequest(request, response);\n });\n server.on('upgrade', (request, socket, head) => {\n void this.handleUpgrade(request, socket, head);\n });\n\n try {\n const listeningPort = await new Promise<number>((resolve, reject) => {\n const onError = (error: Error & { code?: string }) => {\n server.removeListener('listening', onListening);\n reject(error);\n };\n const onListening = () => {\n server.removeListener('error', onError);\n const address = server.address() as AddressInfo | null;\n resolve(address?.port ?? nextPort);\n };\n\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(nextPort, this.host);\n });\n\n this.server = server;\n this.activePort = listeningPort;\n return listeningPort;\n } catch (error) {\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n\n const code = error instanceof Error && 'code' in error ? error.code : undefined;\n if (code !== 'EADDRINUSE') {\n throw error;\n }\n\n attemptsRemaining -= 1;\n nextPort += 1;\n }\n }\n\n throw new Error(`Unable to start proxy after ${this.maxPortAttempts} port attempts`);\n }\n\n async stop(): Promise<void> {\n if (!this.server) {\n return;\n }\n\n const server = this.server;\n this.server = null;\n this.activePort = null;\n\n for (const socket of this.activeUpgradeSockets) {\n socket.destroy();\n }\n this.activeUpgradeSockets.clear();\n this.responsesCompatibilityStore.clear();\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n }\n\n private async handleUpgrade(\n request: IncomingMessage,\n clientSocket: Duplex,\n head: Buffer,\n ): Promise<void> {\n const path = normalizeRequestPath(request.url ?? '/');\n\n if (path === '/health') {\n this.sendUpgradeError(clientSocket, 400, 'Health requests do not support upgrade');\n clientSocket.end();\n return;\n }\n\n let target: ResolvedTarget;\n try {\n target = resolveProvider(request, this.targets, this.defaultProvider);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to resolve upstream target';\n this.sendUpgradeError(clientSocket, 502, message);\n clientSocket.end();\n return;\n }\n\n const requestFactory = target.url.protocol === 'https:' ? createHttpsRequest : createHttpRequest;\n const headers = buildUpstreamWebSocketHeaders(request.headers);\n headers.host = target.url.host;\n\n const requestOptions: RequestOptions = {\n headers,\n hostname: target.url.hostname,\n method: request.method ?? 'GET',\n path: `${target.url.pathname}${target.url.search}`,\n port: target.url.port ? Number(target.url.port) : undefined,\n protocol: target.url.protocol,\n };\n\n clientSocket.once('error', () => undefined);\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const upstreamRequest = requestFactory(requestOptions);\n\n upstreamRequest.setTimeout(this.timeoutMs, () => {\n upstreamRequest.destroy(new Error(`Upstream request timed out after ${this.timeoutMs}ms`));\n });\n\n upstreamRequest.once('upgrade', (upstreamResponse, upstreamSocket, upstreamHead) => {\n if (settled) {\n return;\n }\n\n settled = true;\n this.trackUpgradeSocket(clientSocket);\n this.trackUpgradeSocket(upstreamSocket);\n writeRawHttpResponse({\n headers: copyHeaders(upstreamResponse.headers, { preserveUpgradeHeaders: true }),\n socket: clientSocket,\n statusCode: upstreamResponse.statusCode ?? 101,\n statusMessage:\n upstreamResponse.statusMessage ?? STATUS_CODES[upstreamResponse.statusCode ?? 101] ?? 'Switching Protocols',\n version: upstreamResponse.httpVersion,\n });\n\n relayWebSocket({\n clientHead: head,\n clientSocket,\n clientToUpstreamReplacements: new Map(this.options.vault.getSecretToTokenPairs()),\n upstreamHead,\n upstreamSocket,\n upstreamToClientReplacements: new Map(this.options.vault.getTokenToSecretPairs()),\n });\n resolve();\n });\n\n upstreamRequest.once('response', (upstreamResponse) => {\n if (settled) {\n return;\n }\n\n settled = true;\n void this.forwardUpgradeFallbackResponse(upstreamResponse, clientSocket)\n .catch((error) => {\n if (!clientSocket.destroyed) {\n clientSocket.destroy(error instanceof Error ? error : undefined);\n }\n })\n .finally(resolve);\n });\n\n upstreamRequest.once('error', (error) => {\n if (settled) {\n return;\n }\n\n settled = true;\n const isTimeout = error.message.includes('timed out');\n this.sendUpgradeError(clientSocket, isTimeout ? 504 : 502, error.message);\n clientSocket.end();\n resolve();\n });\n\n upstreamRequest.end();\n });\n }\n\n private async handleRequest(request: IncomingMessage, response: ServerResponse): Promise<void> {\n const path = normalizeRequestPath(request.url ?? '/');\n\n if (path === '/health') {\n const body = JSON.stringify({ ok: true });\n response.writeHead(200, {\n 'content-length': String(Buffer.byteLength(body)),\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(body);\n return;\n }\n\n let target: ResolvedTarget;\n try {\n target = resolveProvider(request, this.targets, this.defaultProvider);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to resolve upstream target';\n sendProxyError(response, 502, message);\n return;\n }\n\n if (target.provider === 'openai') {\n const handledRead = this.handleResponsesCompatibilityRead(request, response, path);\n if (handledRead) {\n return;\n }\n }\n\n try {\n const originalBody = await readRequestBody(request);\n const requestBody =\n originalBody.length > 0 && isTextBasedContentType(request.headers)\n ? this.inspectAndMaskTextBody(originalBody)\n : originalBody;\n\n if (\n target.provider === 'openai' &&\n request.method === 'POST' &&\n isResponsesCompatibilityRoot(path)\n ) {\n await this.forwardResponsesRequestWithFallback(request, response, target, requestBody);\n return;\n }\n\n await this.forwardRequest(request, response, target, requestBody);\n } catch (error) {\n if (!response.headersSent) {\n const message = error instanceof Error ? error.message : 'Proxy request failed';\n sendProxyError(response, 502, message);\n } else if (!response.writableEnded) {\n response.destroy(error instanceof Error ? error : undefined);\n }\n }\n }\n\n private handleResponsesCompatibilityRead(\n request: IncomingMessage,\n response: ServerResponse,\n path: string,\n ): boolean {\n if (request.method !== 'GET') {\n return false;\n }\n\n if (isResponsesCompatibilityRoot(path)) {\n const body = createResponsesCompatibilityStatusBody();\n response.writeHead(200, {\n 'content-length': String(Buffer.byteLength(body)),\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(body);\n return true;\n }\n\n const responseId = getResponsesCompatibilityResponseId(path);\n if (!responseId) {\n return false;\n }\n\n const storedResponse = this.responsesCompatibilityStore.getResponse(responseId);\n if (!storedResponse) {\n sendProxyError(response, 404, `Unknown compatibility response id: ${responseId}`);\n return true;\n }\n\n const body = JSON.stringify(storedResponse);\n response.writeHead(200, {\n 'content-length': String(Buffer.byteLength(body)),\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(body);\n return true;\n }\n\n private async forwardResponsesRequestWithFallback(\n clientRequest: IncomingMessage,\n clientResponse: ServerResponse,\n target: ResolvedTarget,\n body: Buffer,\n ): Promise<void> {\n const requestFactory =\n target.url.protocol === 'https:' ? createHttpsRequest : createHttpRequest;\n const directHeaders = buildUpstreamHeaders(clientRequest.headers, target.url, body);\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const upstreamRequest = requestFactory(\n {\n headers: directHeaders,\n hostname: target.url.hostname,\n method: clientRequest.method,\n path: `${target.url.pathname}${target.url.search}`,\n port: target.url.port ? Number(target.url.port) : undefined,\n protocol: target.url.protocol,\n },\n (upstreamResponse) => {\n const statusCode = upstreamResponse.statusCode ?? 200;\n const shouldFallback =\n statusCode >= 400 && (statusCode === 404 || statusCode === 405 || statusCode === 500);\n\n if (!shouldFallback) {\n void this.forwardResponse(target.provider, upstreamResponse, clientResponse)\n .then(() => {\n settled = true;\n resolve();\n })\n .catch((error) => {\n settled = true;\n reject(error);\n });\n return;\n }\n\n upstreamResponse.resume();\n void this.forwardTranslatedResponsesCompatibilityRequest(\n clientRequest,\n clientResponse,\n target,\n body,\n )\n .then(() => {\n settled = true;\n resolve();\n })\n .catch((error) => {\n settled = true;\n reject(error);\n });\n },\n );\n\n upstreamRequest.setTimeout(this.timeoutMs, () => {\n upstreamRequest.destroy(new Error(`Upstream request timed out after ${this.timeoutMs}ms`));\n });\n\n upstreamRequest.once('error', (error) => {\n if (settled) {\n return;\n }\n\n const isTimeout = error.message.includes('timed out');\n if (!clientResponse.headersSent) {\n sendProxyError(clientResponse, isTimeout ? 504 : 502, error.message);\n }\n\n reject(error);\n });\n\n upstreamRequest.write(body);\n upstreamRequest.end();\n });\n }\n\n private async forwardTranslatedResponsesCompatibilityRequest(\n clientRequest: IncomingMessage,\n clientResponse: ServerResponse,\n target: ResolvedTarget,\n body: Buffer,\n ): Promise<void> {\n const translated = translateResponsesRequest(body.toString('utf8'), this.responsesCompatibilityStore);\n const upstreamUrl = new URL(target.url.toString());\n upstreamUrl.pathname = upstreamUrl.pathname.replace(/\\/responses$/, '/chat/completions');\n upstreamUrl.search = '';\n\n const requestFactory =\n upstreamUrl.protocol === 'https:' ? createHttpsRequest : createHttpRequest;\n const translatedBodyText = JSON.stringify(translated.chatRequest);\n const upstreamBody = Buffer.from(translatedBodyText, 'utf8');\n const headers = stripResponsesCompatibilityHeaders(\n buildUpstreamHeaders(clientRequest.headers, upstreamUrl, upstreamBody),\n );\n const captureContext: ResponsesCompatibilityCaptureContext | undefined = this.captureDir\n ? {\n clientHeaders: normalizeHeadersForCapture(clientRequest.headers),\n clientPath: clientRequest.url ?? '/',\n clientRequestBody: parseJsonForCapture(body.toString('utf8')),\n translatedRequestBody: parseJsonForCapture(translatedBodyText),\n translatedRequestHeaders: normalizeHeadersForCapture(headers),\n translatedUpstreamUrl: upstreamUrl.toString(),\n }\n : undefined;\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const upstreamRequest = requestFactory(\n {\n headers,\n hostname: upstreamUrl.hostname,\n method: 'POST',\n path: upstreamUrl.pathname,\n port: upstreamUrl.port ? Number(upstreamUrl.port) : undefined,\n protocol: upstreamUrl.protocol,\n },\n (upstreamResponse) => {\n void this.forwardResponsesCompatibilityResponse(\n upstreamResponse,\n clientResponse,\n translated.messages,\n typeof translated.chatRequest.model === 'string' ? translated.chatRequest.model : undefined,\n captureContext,\n )\n .then(() => {\n settled = true;\n resolve();\n })\n .catch((error) => {\n settled = true;\n reject(error);\n });\n },\n );\n\n upstreamRequest.setTimeout(this.timeoutMs, () => {\n upstreamRequest.destroy(new Error(`Upstream request timed out after ${this.timeoutMs}ms`));\n });\n\n upstreamRequest.once('error', (error) => {\n if (settled) {\n return;\n }\n\n const isTimeout = error.message.includes('timed out');\n if (!clientResponse.headersSent) {\n sendProxyError(clientResponse, isTimeout ? 504 : 502, error.message);\n }\n\n reject(error);\n });\n\n upstreamRequest.write(upstreamBody);\n upstreamRequest.end();\n });\n }\n\n private async forwardResponsesCompatibilityResponse(\n upstreamResponse: IncomingMessage,\n clientResponse: ServerResponse,\n messages: ChatMessage[],\n model: string | undefined,\n captureContext?: ResponsesCompatibilityCaptureContext,\n ): Promise<void> {\n const upstreamStatusCode = upstreamResponse.statusCode ?? 200;\n const tokenToSecret = new Map(this.options.vault.getTokenToSecretPairs());\n\n if (isSseResponse(upstreamResponse.headers)) {\n const headers = buildClientHeaders(\n {\n ...upstreamResponse.headers,\n 'content-type': 'text/event-stream; charset=utf-8',\n },\n );\n clientResponse.writeHead(upstreamStatusCode, headers);\n\n const restoreTransformer = new SseTransformer('openai', tokenToSecret);\n const transformer = new ResponsesCompatibilitySseTransformer(messages, model);\n clientResponse.write(transformer.start());\n const rawChunks: string[] = [];\n\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n const rawChunk = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : chunk;\n rawChunks.push(rawChunk);\n const restoredChunk = restoreTransformer.push(rawChunk);\n const output = restoredChunk.length > 0 ? transformer.push(restoredChunk) : '';\n if (output.length > 0) {\n clientResponse.write(output);\n }\n });\n\n upstreamResponse.once('end', () => {\n void (async () => {\n const restoredTail = restoreTransformer.flush();\n if (restoredTail.length > 0) {\n const restoredOutput = transformer.push(restoredTail);\n if (restoredOutput.length > 0) {\n clientResponse.write(restoredOutput);\n }\n }\n const finalized = transformer.finish();\n if (captureContext) {\n await this.writeResponsesCompatibilityCapture(captureContext, {\n responseBody: rawChunks.join(''),\n responseHeaders: normalizeHeadersForCapture(upstreamResponse.headers),\n responseStatusCode: upstreamStatusCode,\n });\n }\n\n if (finalized.output.length > 0) {\n clientResponse.write(finalized.output);\n }\n this.responsesCompatibilityStore.set(finalized.responseId, {\n messages: finalized.storedMessages,\n response: finalized.response,\n });\n clientResponse.end();\n resolve();\n })().catch(reject);\n });\n upstreamResponse.once('error', reject);\n });\n return;\n }\n\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n upstreamResponse.once('end', resolve);\n upstreamResponse.once('error', reject);\n });\n\n const rawBodyText = Buffer.concat(chunks).toString('utf8');\n if (captureContext) {\n await this.writeResponsesCompatibilityCapture(captureContext, {\n responseBody: rawBodyText,\n responseHeaders: normalizeHeadersForCapture(upstreamResponse.headers),\n responseStatusCode: upstreamStatusCode,\n });\n }\n\n const restoredBodyText = applyWholeBodyReplacement(\n Buffer.from(rawBodyText, 'utf8'),\n tokenToSecret,\n ).toString('utf8');\n\n if (upstreamStatusCode >= 400) {\n clientResponse.writeHead(upstreamStatusCode, {\n 'content-length': String(Buffer.byteLength(restoredBodyText)),\n 'content-type':\n getFirstHeaderValue(upstreamResponse.headers['content-type']) ??\n 'application/json; charset=utf-8',\n });\n clientResponse.end(restoredBodyText);\n return;\n }\n\n const translated = translateChatCompletionJsonToResponses(restoredBodyText, messages);\n this.responsesCompatibilityStore.set(translated.responseId, {\n messages: translated.storedMessages,\n response: translated.response,\n });\n clientResponse.writeHead(upstreamStatusCode, {\n 'content-length': String(Buffer.byteLength(translated.bodyText)),\n 'content-type': 'application/json; charset=utf-8',\n });\n clientResponse.end(translated.bodyText);\n }\n\n private async forwardUpgradeFallbackResponse(\n upstreamResponse: IncomingMessage,\n clientSocket: Duplex,\n ): Promise<void> {\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n upstreamResponse.once('end', resolve);\n upstreamResponse.once('error', reject);\n });\n\n const tokenToSecret = new Map(this.options.vault.getTokenToSecretPairs());\n const body = isTextBasedContentType(upstreamResponse.headers)\n ? applyWholeBodyReplacement(Buffer.concat(chunks), tokenToSecret)\n : Buffer.concat(chunks);\n const headers = buildClientHeaders(upstreamResponse.headers, body.length);\n writeRawHttpResponse({\n body,\n headers,\n socket: clientSocket,\n statusCode: upstreamResponse.statusCode ?? 502,\n statusMessage: upstreamResponse.statusMessage ?? 'Bad Gateway',\n version: upstreamResponse.httpVersion,\n });\n clientSocket.end();\n }\n\n private sendUpgradeError(socket: Duplex, statusCode: number, message: string): void {\n const body = Buffer.from(JSON.stringify({ error: message }), 'utf8');\n writeRawHttpResponse({\n body,\n headers: {\n 'content-length': String(body.length),\n 'content-type': 'application/json; charset=utf-8',\n },\n socket,\n statusCode,\n statusMessage:\n statusCode === 400 ? 'Bad Request' : statusCode === 504 ? 'Gateway Timeout' : 'Bad Gateway',\n });\n }\n\n private trackUpgradeSocket(socket: Duplex): void {\n this.activeUpgradeSockets.add(socket);\n socket.once('close', () => {\n this.activeUpgradeSockets.delete(socket);\n });\n }\n\n private async forwardRequest(\n clientRequest: IncomingMessage,\n clientResponse: ServerResponse,\n target: ResolvedTarget,\n body: Buffer,\n ): Promise<void> {\n const requestFactory = target.url.protocol === 'https:' ? createHttpsRequest : createHttpRequest;\n const headers = buildUpstreamHeaders(clientRequest.headers, target.url, body);\n\n const requestOptions: RequestOptions = {\n headers,\n hostname: target.url.hostname,\n method: clientRequest.method,\n path: `${target.url.pathname}${target.url.search}`,\n port: target.url.port ? Number(target.url.port) : undefined,\n protocol: target.url.protocol,\n };\n\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const upstreamRequest = requestFactory(requestOptions, (upstreamResponse) => {\n const closeUpstream = () => {\n if (!clientResponse.writableEnded && !upstreamResponse.destroyed) {\n upstreamResponse.destroy();\n }\n };\n\n clientRequest.once('aborted', closeUpstream);\n clientResponse.once('close', closeUpstream);\n\n void this.forwardResponse(target.provider, upstreamResponse, clientResponse)\n .then(() => {\n settled = true;\n resolve();\n })\n .catch((error) => {\n settled = true;\n reject(error);\n });\n });\n\n upstreamRequest.setTimeout(this.timeoutMs, () => {\n upstreamRequest.destroy(new Error(`Upstream request timed out after ${this.timeoutMs}ms`));\n });\n\n upstreamRequest.once('error', (error) => {\n if (settled) {\n return;\n }\n\n const isTimeout = error.message.includes('timed out');\n if (!clientResponse.headersSent) {\n sendProxyError(clientResponse, isTimeout ? 504 : 502, error.message);\n }\n\n reject(error);\n });\n\n if (body.length > 0) {\n upstreamRequest.write(body);\n }\n\n upstreamRequest.end();\n });\n }\n\n private async forwardResponse(\n provider: ProxyProvider,\n upstreamResponse: IncomingMessage,\n clientResponse: ServerResponse,\n ): Promise<void> {\n const tokenToSecret = new Map(this.options.vault.getTokenToSecretPairs());\n\n if (isSseResponse(upstreamResponse.headers)) {\n const headers = buildClientHeaders(upstreamResponse.headers);\n clientResponse.writeHead(upstreamResponse.statusCode ?? 200, headers);\n\n const transformer = new SseTransformer(provider, tokenToSecret);\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n const output = transformer.push(Buffer.isBuffer(chunk) ? chunk.toString('utf8') : chunk);\n if (output.length > 0) {\n clientResponse.write(output);\n }\n });\n\n upstreamResponse.once('end', () => {\n const remaining = transformer.flush();\n if (remaining.length > 0) {\n clientResponse.write(remaining);\n }\n\n clientResponse.end();\n resolve();\n });\n upstreamResponse.once('error', reject);\n });\n\n return;\n }\n\n if (!isTextBasedContentType(upstreamResponse.headers)) {\n clientResponse.writeHead(\n upstreamResponse.statusCode ?? 200,\n buildClientHeaders(upstreamResponse.headers),\n );\n\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk) => {\n clientResponse.write(chunk);\n });\n upstreamResponse.once('end', () => {\n clientResponse.end();\n resolve();\n });\n upstreamResponse.once('error', reject);\n });\n\n return;\n }\n\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n upstreamResponse.on('data', (chunk: Buffer | string) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n upstreamResponse.once('end', resolve);\n upstreamResponse.once('error', reject);\n });\n\n const body = applyWholeBodyReplacement(Buffer.concat(chunks), tokenToSecret);\n const headers = buildClientHeaders(upstreamResponse.headers, body.length);\n clientResponse.writeHead(upstreamResponse.statusCode ?? 200, headers);\n clientResponse.end(body);\n }\n\n private inspectAndMaskTextBody(body: Buffer): Buffer {\n const text = body.toString('utf8');\n this.options.onRequestText?.(text);\n\n return applyWholeBodyReplacement(\n Buffer.from(text, 'utf8'),\n new Map(this.options.vault.getSecretToTokenPairs()),\n );\n }\n\n private async writeResponsesCompatibilityCapture(\n context: ResponsesCompatibilityCaptureContext,\n response: {\n responseBody: string;\n responseHeaders: Record<string, string | string[]>;\n responseStatusCode: number;\n },\n ): Promise<void> {\n if (!this.captureDir) {\n return;\n }\n\n try {\n await mkdir(this.captureDir, { recursive: true });\n const outputPath = join(\n this.captureDir,\n `responses-compat-${Date.now()}-${randomUUID().replace(/-/g, '')}.json`,\n );\n const payload = {\n clientHeaders: context.clientHeaders,\n clientPath: context.clientPath,\n clientRequestBody: context.clientRequestBody,\n responseBody: parseJsonForCapture(response.responseBody),\n responseHeaders: response.responseHeaders,\n responseStatusCode: response.responseStatusCode,\n translatedRequestBody: context.translatedRequestBody,\n translatedRequestHeaders: context.translatedRequestHeaders,\n translatedUpstreamUrl: context.translatedUpstreamUrl,\n };\n\n await writeFile(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8');\n } catch {\n // 证据落盘失败不能影响真实转发。\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\n\nconst DEFAULT_RESPONSES_FALLBACK_MAX_TOKENS = 4096;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction cloneValue<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\ntype ChatMessageRole = 'assistant' | 'system' | 'tool' | 'user';\n\ninterface ChatToolCall {\n function: {\n arguments: string;\n name: string;\n };\n id: string;\n type: 'function';\n}\n\nexport interface ChatMessage {\n content: string | Array<Record<string, unknown>>;\n role: ChatMessageRole;\n tool_call_id?: string;\n tool_calls?: ChatToolCall[];\n}\n\nfunction normalizeChatRole(role: unknown): ChatMessageRole | undefined {\n if (role === 'assistant' || role === 'system' || role === 'tool' || role === 'user') {\n return role;\n }\n\n if (role === 'developer') {\n return 'system';\n }\n\n return undefined;\n}\n\ninterface StoredResponse {\n messages: ChatMessage[];\n response: Record<string, unknown>;\n}\n\nexport class ResponsesCompatibilityStore {\n private readonly responses = new Map<string, StoredResponse>();\n\n getMessages(responseId: string): ChatMessage[] | undefined {\n const stored = this.responses.get(responseId);\n return stored ? cloneValue(stored.messages) : undefined;\n }\n\n getResponse(responseId: string): Record<string, unknown> | undefined {\n const stored = this.responses.get(responseId);\n return stored ? cloneValue(stored.response) : undefined;\n }\n\n set(responseId: string, stored: StoredResponse): void {\n this.responses.set(responseId, {\n messages: cloneValue(stored.messages),\n response: cloneValue(stored.response),\n });\n }\n\n clear(): void {\n this.responses.clear();\n }\n}\n\nexport interface ResponsesCompatibilityRequest {\n chatRequest: Record<string, unknown>;\n messages: ChatMessage[];\n}\n\nexport interface ResponsesCompatibilityJsonResult {\n bodyText: string;\n response: Record<string, unknown>;\n responseId: string;\n storedMessages: ChatMessage[];\n}\n\ninterface ToolState {\n arguments: string;\n callId: string;\n itemId: string;\n name: string;\n outputIndex: number;\n}\n\nfunction toStringValue(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n if (value === undefined || value === null) {\n return '';\n }\n\n return JSON.stringify(value);\n}\n\nfunction normalizeContentParts(content: unknown): string | Array<Record<string, unknown>> {\n if (typeof content === 'string') {\n return content;\n }\n\n if (!Array.isArray(content)) {\n return toStringValue(content);\n }\n\n const parts = content.flatMap((entry): Array<Record<string, unknown>> => {\n if (!isRecord(entry)) {\n const text = toStringValue(entry);\n return text.length > 0 ? [{ type: 'text', text }] : [];\n }\n\n const type = typeof entry.type === 'string' ? entry.type : '';\n if (type === 'input_text' || type === 'output_text' || type === 'text') {\n const text = toStringValue(entry.text);\n return text.length > 0 ? [{ type: 'text', text }] : [];\n }\n\n if (type === 'input_image') {\n const imageUrl =\n typeof entry.image_url === 'string'\n ? entry.image_url\n : isRecord(entry.image_url) && typeof entry.image_url.url === 'string'\n ? entry.image_url.url\n : '';\n return imageUrl.length > 0 ? [{ type: 'image_url', image_url: { url: imageUrl } }] : [];\n }\n\n return [];\n });\n\n if (parts.length === 0) {\n return '';\n }\n\n if (parts.every((part) => part.type === 'text')) {\n return parts.map((part) => toStringValue(part.text)).join('');\n }\n\n return parts;\n}\n\nfunction appendChatMessage(messages: ChatMessage[], message: ChatMessage): void {\n const normalizedContent = normalizeContentParts(message.content);\n\n if (normalizedContent === '' || (Array.isArray(normalizedContent) && normalizedContent.length === 0)) {\n return;\n }\n\n messages.push({\n ...message,\n content: normalizedContent,\n });\n}\n\nfunction toJoinedText(content: ChatMessage['content']): string {\n const normalized = normalizeContentParts(content);\n if (typeof normalized === 'string') {\n return normalized;\n }\n\n return normalized\n .map((entry) => (typeof entry.text === 'string' ? entry.text : ''))\n .filter((entry) => entry.length > 0)\n .join('\\n');\n}\n\nfunction mergeAdjacentSystemMessages(messages: ChatMessage[]): ChatMessage[] {\n const merged: ChatMessage[] = [];\n\n messages.forEach((message) => {\n if (message.role !== 'system') {\n merged.push(message);\n return;\n }\n\n const previous = merged[merged.length - 1];\n if (\n !previous ||\n previous.role !== 'system' ||\n previous.tool_call_id !== undefined ||\n previous.tool_calls !== undefined\n ) {\n merged.push(message);\n return;\n }\n\n const combined = [toJoinedText(previous.content), toJoinedText(message.content)]\n .filter((entry) => entry.length > 0)\n .join('\\n\\n');\n\n previous.content = combined;\n });\n\n return merged;\n}\n\nfunction appendResponsesInput(messages: ChatMessage[], input: unknown): void {\n if (typeof input === 'string') {\n appendChatMessage(messages, { role: 'user', content: input });\n return;\n }\n\n if (!Array.isArray(input)) {\n if (input !== undefined && input !== null) {\n appendChatMessage(messages, { role: 'user', content: toStringValue(input) });\n }\n return;\n }\n\n input.forEach((entry) => {\n if (typeof entry === 'string') {\n appendChatMessage(messages, { role: 'user', content: entry });\n return;\n }\n\n if (!isRecord(entry)) {\n appendChatMessage(messages, { role: 'user', content: toStringValue(entry) });\n return;\n }\n\n const role =\n normalizeChatRole(entry.role) ??\n (entry.type === 'message' ? normalizeChatRole(entry.role) : undefined);\n const type = typeof entry.type === 'string' ? entry.type : '';\n\n if (role) {\n appendChatMessage(messages, {\n role,\n content: normalizeContentParts(entry.content ?? ''),\n });\n return;\n }\n\n if (type === 'function_call_output') {\n messages.push({\n role: 'tool',\n tool_call_id:\n typeof entry.call_id === 'string' && entry.call_id.length > 0\n ? entry.call_id\n : `call_${randomUUID().replace(/-/g, '')}`,\n content: toStringValue(entry.output),\n });\n return;\n }\n\n if (type === 'function_call') {\n const name = typeof entry.name === 'string' ? entry.name : 'tool';\n const callId =\n typeof entry.call_id === 'string' && entry.call_id.length > 0\n ? entry.call_id\n : `call_${randomUUID().replace(/-/g, '')}`;\n messages.push({\n role: 'assistant',\n content: '',\n tool_calls: [\n {\n id: callId,\n type: 'function',\n function: {\n name,\n arguments: toStringValue(entry.arguments),\n },\n },\n ],\n });\n return;\n }\n\n if (type === 'input_text' || type === 'input_image') {\n appendChatMessage(messages, {\n role: 'user',\n content: [entry],\n });\n return;\n }\n\n appendChatMessage(messages, {\n role: 'user',\n content: normalizeContentParts(entry.content ?? entry.text ?? entry),\n });\n });\n}\n\nfunction translateTools(tools: unknown): unknown {\n if (!Array.isArray(tools)) {\n return undefined;\n }\n\n const translated = tools.flatMap((entry) => {\n if (!isRecord(entry) || entry.type !== 'function') {\n return [];\n }\n\n const name = typeof entry.name === 'string' ? entry.name : '';\n if (name.length === 0) {\n return [];\n }\n\n return [\n {\n type: 'function',\n function: removeUndefined({\n name,\n description: typeof entry.description === 'string' ? entry.description : undefined,\n parameters: isRecord(entry.parameters) ? entry.parameters : entry.parameters ?? undefined,\n strict: entry.strict === true ? true : undefined,\n }),\n },\n ];\n });\n\n return translated.length > 0 ? translated : undefined;\n}\n\nfunction translateToolChoice(toolChoice: unknown): unknown {\n if (toolChoice === undefined || toolChoice === null) {\n return undefined;\n }\n\n if (typeof toolChoice === 'string') {\n return toolChoice;\n }\n\n if (!isRecord(toolChoice) || toolChoice.type !== 'function') {\n return undefined;\n }\n\n if (typeof toolChoice.name === 'string') {\n return {\n type: 'function',\n function: {\n name: toolChoice.name,\n },\n };\n }\n\n if (isRecord(toolChoice.function) && typeof toolChoice.function.name === 'string') {\n return {\n type: 'function',\n function: {\n name: toolChoice.function.name,\n },\n };\n }\n\n return undefined;\n}\n\nfunction resolveMaxTokens(payload: Record<string, unknown>): number {\n const candidates = [\n payload.max_output_tokens,\n payload.max_completion_tokens,\n payload.max_tokens,\n ];\n\n for (const candidate of candidates) {\n if (typeof candidate === 'number' && Number.isFinite(candidate) && candidate > 0) {\n return candidate;\n }\n }\n\n return DEFAULT_RESPONSES_FALLBACK_MAX_TOKENS;\n}\n\nfunction removeUndefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nexport function translateResponsesRequest(\n bodyText: string,\n store: ResponsesCompatibilityStore,\n): ResponsesCompatibilityRequest {\n const payload = JSON.parse(bodyText) as Record<string, unknown>;\n const previousResponseId =\n typeof payload.previous_response_id === 'string' ? payload.previous_response_id : '';\n const messages =\n previousResponseId.length > 0 ? store.getMessages(previousResponseId) ?? [] : [];\n\n if (\n messages.length === 0 &&\n typeof payload.instructions === 'string' &&\n payload.instructions.trim().length > 0\n ) {\n appendChatMessage(messages, {\n role: 'system',\n content: payload.instructions,\n });\n }\n\n appendResponsesInput(messages, payload.input);\n const normalizedMessages = mergeAdjacentSystemMessages(messages);\n const translatedToolChoice = translateToolChoice(payload.tool_choice);\n\n const chatRequest = removeUndefined({\n messages: normalizedMessages,\n model: payload.model,\n max_tokens: resolveMaxTokens(payload),\n parallel_tool_calls: payload.parallel_tool_calls === true ? true : undefined,\n stream: typeof payload.stream === 'boolean' ? payload.stream : undefined,\n temperature: typeof payload.temperature === 'number' ? payload.temperature : undefined,\n tool_choice: translatedToolChoice === 'auto' ? undefined : translatedToolChoice,\n tools: translateTools(payload.tools),\n top_p: typeof payload.top_p === 'number' ? payload.top_p : undefined,\n user: typeof payload.user === 'string' ? payload.user : undefined,\n });\n\n return {\n chatRequest,\n messages: normalizedMessages,\n };\n}\n\nfunction buildResponseMessageItem(content: string, itemId: string): Record<string, unknown> {\n return {\n id: itemId,\n type: 'message',\n role: 'assistant',\n status: 'completed',\n content: [\n {\n type: 'output_text',\n text: content,\n annotations: [],\n },\n ],\n };\n}\n\nfunction buildResponseFunctionCallItem(toolCall: ChatToolCall): Record<string, unknown> {\n return {\n id: `fc_${randomUUID().replace(/-/g, '')}`,\n type: 'function_call',\n call_id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n status: 'completed',\n };\n}\n\nfunction getAssistantMessage(\n payload: Record<string, unknown>,\n): { normalizedText: string; responseItems: Array<Record<string, unknown>>; storedMessage: ChatMessage } {\n const choices = Array.isArray(payload.choices) ? payload.choices : [];\n const firstChoice = choices.find(isRecord);\n const message =\n firstChoice && isRecord(firstChoice.message) ? firstChoice.message : ({} as Record<string, unknown>);\n const textContent = normalizeContentParts(message.content ?? '');\n const storedMessage: ChatMessage = {\n role: 'assistant',\n content: textContent,\n };\n\n const responseItems: Array<Record<string, unknown>> = [];\n\n const normalizedText =\n typeof textContent === 'string'\n ? textContent\n : Array.isArray(textContent)\n ? textContent\n .map((entry) => (typeof entry.text === 'string' ? entry.text : ''))\n .filter((entry) => entry.length > 0)\n .join('')\n : '';\n if (normalizedText.length > 0) {\n responseItems.push(buildResponseMessageItem(normalizedText, `msg_${randomUUID().replace(/-/g, '')}`));\n }\n\n const toolCalls = Array.isArray(message.tool_calls)\n ? message.tool_calls.filter(isRecord).flatMap((toolCall) => {\n if (!isRecord(toolCall.function) || typeof toolCall.function.name !== 'string') {\n return [];\n }\n\n return [\n {\n id:\n typeof toolCall.id === 'string' && toolCall.id.length > 0\n ? toolCall.id\n : `call_${randomUUID().replace(/-/g, '')}`,\n type: 'function' as const,\n function: {\n name: toolCall.function.name,\n arguments:\n typeof toolCall.function.arguments === 'string'\n ? toolCall.function.arguments\n : toStringValue(toolCall.function.arguments),\n },\n },\n ];\n })\n : [];\n\n if (toolCalls.length > 0) {\n storedMessage.tool_calls = toolCalls;\n responseItems.push(...toolCalls.map((toolCall) => buildResponseFunctionCallItem(toolCall)));\n }\n\n return {\n normalizedText,\n responseItems,\n storedMessage,\n };\n}\n\nexport function translateChatCompletionJsonToResponses(\n bodyText: string,\n messages: ChatMessage[],\n): ResponsesCompatibilityJsonResult {\n const payload = JSON.parse(bodyText) as Record<string, unknown>;\n const responseId = `resp_${randomUUID().replace(/-/g, '')}`;\n const { normalizedText, responseItems, storedMessage } = getAssistantMessage(payload);\n const response = {\n id: responseId,\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: typeof payload.model === 'string' ? payload.model : undefined,\n output: responseItems,\n output_text: normalizedText.length > 0 ? normalizedText : undefined,\n status: 'completed',\n };\n\n const storedMessages = cloneValue(messages);\n storedMessages.push(storedMessage);\n\n return {\n bodyText: JSON.stringify(removeUndefined(response)),\n response: removeUndefined(response),\n responseId,\n storedMessages,\n };\n}\n\nfunction createEvent(type: string, extra: Record<string, unknown>): string {\n return `data: ${JSON.stringify({ type, ...extra })}\\n\\n`;\n}\n\nexport class ResponsesCompatibilitySseTransformer {\n private buffer = '';\n private contentPartAdded = false;\n private readonly createdAt = Math.floor(Date.now() / 1000);\n private finalized = false;\n private readonly messageItemId = `msg_${randomUUID().replace(/-/g, '')}`;\n private messageOutputIndex: number | null = null;\n private readonly responseId = `resp_${randomUUID().replace(/-/g, '')}`;\n private text = '';\n private readonly toolStates = new Map<number, ToolState>();\n\n constructor(\n private readonly messages: ChatMessage[],\n private readonly model: string | undefined,\n ) {}\n\n start(): string {\n return createEvent('response.created', {\n response: {\n id: this.responseId,\n object: 'response',\n created_at: this.createdAt,\n model: this.model,\n output: [],\n output_text: '',\n status: 'in_progress',\n },\n });\n }\n\n push(chunk: string): string {\n const input = this.buffer + chunk;\n const parts = input.split(/(\\r?\\n)/);\n const lastPart = parts.pop();\n this.buffer = lastPart ?? '';\n\n let output = '';\n for (let index = 0; index < parts.length; index += 2) {\n const line = parts[index] ?? '';\n output += this.transformLine(line);\n }\n\n return output;\n }\n\n finish(): { output: string; response: Record<string, unknown>; responseId: string; storedMessages: ChatMessage[] } {\n let output = '';\n if (this.buffer.length > 0) {\n output += this.transformLine(this.buffer);\n this.buffer = '';\n }\n output += this.finalize();\n const response = this.buildResponseObject();\n const storedMessages = cloneValue(this.messages);\n storedMessages.push(this.buildAssistantMessage());\n return {\n output,\n response,\n responseId: this.responseId,\n storedMessages,\n };\n }\n\n private transformLine(line: string): string {\n if (!line.startsWith('data: ')) {\n return '';\n }\n\n const payloadText = line.slice(6);\n if (payloadText === '[DONE]') {\n return this.finalize();\n }\n\n let payload: Record<string, unknown>;\n try {\n const parsed = JSON.parse(payloadText) as unknown;\n if (!isRecord(parsed)) {\n return '';\n }\n payload = parsed;\n } catch {\n return '';\n }\n\n const choices = Array.isArray(payload.choices) ? payload.choices : [];\n const choice = choices.find(isRecord);\n if (!choice) {\n return '';\n }\n\n const delta = isRecord(choice.delta) ? choice.delta : {};\n let output = '';\n\n if (typeof delta.content === 'string' && delta.content.length > 0) {\n output += this.pushContent(delta.content);\n }\n\n if (Array.isArray(delta.tool_calls)) {\n delta.tool_calls.filter(isRecord).forEach((toolCall, position) => {\n output += this.pushToolCall(toolCall, position);\n });\n }\n\n if (choice.finish_reason !== undefined && choice.finish_reason !== null) {\n output += this.finalize();\n }\n\n return output;\n }\n\n private pushContent(delta: string): string {\n this.text += delta;\n\n if (this.messageOutputIndex === null) {\n this.messageOutputIndex = 0;\n let output = createEvent('response.output_item.added', {\n item: {\n id: this.messageItemId,\n type: 'message',\n role: 'assistant',\n status: 'in_progress',\n content: [],\n },\n output_index: this.messageOutputIndex,\n });\n output += createEvent('response.content_part.added', {\n content_index: 0,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n part: {\n type: 'output_text',\n text: '',\n annotations: [],\n },\n });\n this.contentPartAdded = true;\n output += createEvent('response.output_text.delta', {\n content_index: 0,\n delta,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n });\n return output;\n }\n\n return createEvent('response.output_text.delta', {\n content_index: 0,\n delta,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n });\n }\n\n private pushToolCall(toolCall: Record<string, unknown>, position: number): string {\n const index = typeof toolCall.index === 'number' ? toolCall.index : position;\n const existing = this.toolStates.get(index);\n const functionPayload = isRecord(toolCall.function) ? toolCall.function : {};\n const state =\n existing ??\n {\n arguments: '',\n callId:\n typeof toolCall.id === 'string' && toolCall.id.length > 0\n ? toolCall.id\n : `call_${randomUUID().replace(/-/g, '')}`,\n itemId: `fc_${randomUUID().replace(/-/g, '')}`,\n name: typeof functionPayload.name === 'string' ? functionPayload.name : 'tool',\n outputIndex:\n (this.messageOutputIndex === null ? 0 : 1) + Array.from(this.toolStates.keys()).length,\n };\n\n if (typeof functionPayload.name === 'string' && functionPayload.name.length > 0) {\n state.name = functionPayload.name;\n }\n\n let output = '';\n if (!existing) {\n output += createEvent('response.output_item.added', {\n item: {\n id: state.itemId,\n type: 'function_call',\n call_id: state.callId,\n name: state.name,\n arguments: '',\n status: 'in_progress',\n },\n output_index: state.outputIndex,\n });\n this.toolStates.set(index, state);\n }\n\n if (typeof functionPayload.arguments === 'string' && functionPayload.arguments.length > 0) {\n state.arguments += functionPayload.arguments;\n output += createEvent('response.function_call_arguments.delta', {\n delta: functionPayload.arguments,\n item_id: state.itemId,\n output_index: state.outputIndex,\n });\n }\n\n return output;\n }\n\n private finalize(): string {\n if (this.finalized) {\n return '';\n }\n\n this.finalized = true;\n let output = '';\n\n if (this.messageOutputIndex !== null && this.contentPartAdded) {\n output += createEvent('response.output_text.done', {\n content_index: 0,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n text: this.text,\n });\n output += createEvent('response.content_part.done', {\n content_index: 0,\n item_id: this.messageItemId,\n output_index: this.messageOutputIndex,\n part: {\n type: 'output_text',\n text: this.text,\n annotations: [],\n },\n });\n output += createEvent('response.output_item.done', {\n item: buildResponseMessageItem(this.text, this.messageItemId),\n output_index: this.messageOutputIndex,\n });\n }\n\n Array.from(this.toolStates.values())\n .sort((left, right) => left.outputIndex - right.outputIndex)\n .forEach((toolState) => {\n output += createEvent('response.function_call_arguments.done', {\n arguments: toolState.arguments,\n item_id: toolState.itemId,\n output_index: toolState.outputIndex,\n });\n output += createEvent('response.output_item.done', {\n item: {\n id: toolState.itemId,\n type: 'function_call',\n call_id: toolState.callId,\n name: toolState.name,\n arguments: toolState.arguments,\n status: 'completed',\n },\n output_index: toolState.outputIndex,\n });\n });\n\n output += createEvent('response.completed', {\n response: this.buildResponseObject(),\n });\n\n return output;\n }\n\n private buildAssistantMessage(): ChatMessage {\n const toolCalls = Array.from(this.toolStates.values())\n .sort((left, right) => left.outputIndex - right.outputIndex)\n .map((toolState) => ({\n id: toolState.callId,\n type: 'function' as const,\n function: {\n name: toolState.name,\n arguments: toolState.arguments,\n },\n }));\n\n return {\n role: 'assistant',\n content: this.text,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n };\n }\n\n private buildResponseObject(): Record<string, unknown> {\n const output: Array<Record<string, unknown>> = [];\n\n if (this.messageOutputIndex !== null && this.text.length > 0) {\n output.push(buildResponseMessageItem(this.text, this.messageItemId));\n }\n\n Array.from(this.toolStates.values())\n .sort((left, right) => left.outputIndex - right.outputIndex)\n .forEach((toolState) => {\n output.push({\n id: toolState.itemId,\n type: 'function_call',\n call_id: toolState.callId,\n name: toolState.name,\n arguments: toolState.arguments,\n status: 'completed',\n });\n });\n\n return removeUndefined({\n id: this.responseId,\n object: 'response',\n created_at: this.createdAt,\n model: this.model,\n output,\n output_text: this.text.length > 0 ? this.text : undefined,\n status: 'completed',\n });\n }\n}\n\nexport function createResponsesCompatibilityStatusBody(): string {\n return JSON.stringify({\n object: 'response_compatibility',\n mode: 'chat_completions',\n status: 'available',\n });\n}\n","import type { Duplex } from 'node:stream';\n\nimport { StreamReplacer } from '../interceptor/stream-replacer.js';\n\ninterface ParsedWebSocketFrame {\n firstByte: number;\n masked: boolean;\n maskingKey?: Buffer;\n opcode: number;\n payload: Buffer;\n rawLength: number;\n}\n\nexport interface WebSocketRelayOptions {\n clientHead?: Buffer;\n clientSocket: Duplex;\n clientToUpstreamReplacements: Map<string, string>;\n upstreamHead?: Buffer;\n upstreamSocket: Duplex;\n upstreamToClientReplacements: Map<string, string>;\n}\n\nfunction applyMask(payload: Buffer, maskingKey: Buffer): void {\n for (let index = 0; index < payload.length; index += 1) {\n payload[index] ^= maskingKey[index % 4];\n }\n}\n\nfunction buildFrame(frame: ParsedWebSocketFrame, payload: Buffer): Buffer {\n let headerLength = 2;\n\n if (payload.length >= 126 && payload.length <= 0xffff) {\n headerLength += 2;\n } else if (payload.length > 0xffff) {\n headerLength += 8;\n }\n\n if (frame.masked) {\n headerLength += 4;\n }\n\n const output = Buffer.alloc(headerLength + payload.length);\n output[0] = frame.firstByte;\n\n let offset = 2;\n if (payload.length < 126) {\n output[1] = (frame.masked ? 0x80 : 0) | payload.length;\n } else if (payload.length <= 0xffff) {\n output[1] = (frame.masked ? 0x80 : 0) | 126;\n output.writeUInt16BE(payload.length, offset);\n offset += 2;\n } else {\n output[1] = (frame.masked ? 0x80 : 0) | 127;\n output.writeBigUInt64BE(BigInt(payload.length), offset);\n offset += 8;\n }\n\n if (frame.masked) {\n const maskingKey = frame.maskingKey ?? Buffer.from([0, 0, 0, 0]);\n maskingKey.copy(output, offset);\n offset += 4;\n }\n\n payload.copy(output, offset);\n if (frame.masked && frame.maskingKey) {\n applyMask(output.subarray(offset), frame.maskingKey);\n }\n\n return output;\n}\n\nfunction parseFrame(input: Buffer): ParsedWebSocketFrame | null {\n if (input.length < 2) {\n return null;\n }\n\n const firstByte = input[0];\n const secondByte = input[1];\n const masked = Boolean(secondByte & 0x80);\n const payloadLengthCode = secondByte & 0x7f;\n let offset = 2;\n let payloadLength = 0;\n\n if (payloadLengthCode < 126) {\n payloadLength = payloadLengthCode;\n } else if (payloadLengthCode === 126) {\n if (input.length < offset + 2) {\n return null;\n }\n\n payloadLength = input.readUInt16BE(offset);\n offset += 2;\n } else {\n if (input.length < offset + 8) {\n return null;\n }\n\n payloadLength = Number(input.readBigUInt64BE(offset));\n offset += 8;\n }\n\n let maskingKey: Buffer | undefined;\n if (masked) {\n if (input.length < offset + 4) {\n return null;\n }\n\n maskingKey = Buffer.from(input.subarray(offset, offset + 4));\n offset += 4;\n }\n\n if (input.length < offset + payloadLength) {\n return null;\n }\n\n const payload = Buffer.from(input.subarray(offset, offset + payloadLength));\n if (maskingKey) {\n applyMask(payload, maskingKey);\n }\n\n return {\n firstByte,\n masked,\n maskingKey,\n opcode: firstByte & 0x0f,\n payload,\n rawLength: offset + payloadLength,\n };\n}\n\nclass TextFrameTransformer {\n private buffer = Buffer.alloc(0);\n private readonly replacer: StreamReplacer;\n private withinTextMessage = false;\n\n constructor(replacements: Map<string, string>) {\n this.replacer = new StreamReplacer(replacements);\n }\n\n push(chunk: Buffer): Buffer {\n this.buffer =\n this.buffer.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffer, chunk]);\n\n const output: Buffer[] = [];\n\n while (true) {\n const frame = parseFrame(this.buffer);\n if (!frame) {\n break;\n }\n\n this.buffer = this.buffer.subarray(frame.rawLength);\n output.push(this.transformFrame(frame));\n }\n\n return output.length === 0 ? Buffer.alloc(0) : Buffer.concat(output);\n }\n\n flush(): Buffer {\n this.buffer = Buffer.alloc(0);\n this.withinTextMessage = false;\n this.replacer.flush();\n\n return Buffer.alloc(0);\n }\n\n private transformFrame(frame: ParsedWebSocketFrame): Buffer {\n const textFrame = frame.opcode === 0x1 || (frame.opcode === 0x0 && this.withinTextMessage);\n if (!textFrame) {\n return buildFrame(frame, frame.payload);\n }\n\n const finalChunk = Boolean(frame.firstByte & 0x80);\n let transformed = this.replacer.push(frame.payload.toString('utf8'));\n\n if (finalChunk) {\n transformed += this.replacer.flush();\n this.withinTextMessage = false;\n } else {\n this.withinTextMessage = true;\n }\n\n return buildFrame(frame, Buffer.from(transformed, 'utf8'));\n }\n}\n\nfunction forwardFrames(\n source: Duplex,\n target: Duplex,\n transformer: TextFrameTransformer,\n head?: Buffer,\n): void {\n const writeChunk = (chunk: Buffer) => {\n const output = transformer.push(chunk);\n if (output.length > 0) {\n target.write(output);\n }\n };\n\n if (head && head.length > 0) {\n writeChunk(head);\n }\n\n source.on('data', (chunk: Buffer | string) => {\n writeChunk(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n source.once('end', () => {\n const remaining = transformer.flush();\n if (remaining.length > 0) {\n target.write(remaining);\n }\n\n target.end();\n });\n source.once('close', () => {\n if (!target.destroyed) {\n target.destroy();\n }\n });\n source.once('error', (error) => {\n target.destroy(error);\n });\n}\n\nexport function relayWebSocket(options: WebSocketRelayOptions): void {\n const clientToUpstream = new TextFrameTransformer(options.clientToUpstreamReplacements);\n const upstreamToClient = new TextFrameTransformer(options.upstreamToClientReplacements);\n\n forwardFrames(\n options.clientSocket,\n options.upstreamSocket,\n clientToUpstream,\n options.clientHead,\n );\n forwardFrames(\n options.upstreamSocket,\n options.clientSocket,\n upstreamToClient,\n options.upstreamHead,\n );\n}\n","import {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n scrypt as scryptCallback,\n} from 'node:crypto';\nimport { chmodSync, existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nimport { isSecretSource, isSecretType, type VaultEntry } from '../vault/types.js';\n\nexport const DEFAULT_VAULT_PATH = join(homedir(), '.ais', 'vault.enc');\nconst AES_ALGORITHM = 'aes-256-gcm';\nconst KEY_LENGTH = 32;\nconst SALT_LENGTH = 16;\nconst IV_LENGTH = 12;\nconst AUTH_TAG_LENGTH = 16;\nconst MIN_PAYLOAD_LENGTH = SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH;\nconst FILE_MODE = 0o600;\nconst SCRYPT_OPTIONS = {\n N: 2 ** 14,\n r: 8,\n p: 1,\n};\n\nfunction isVaultEntry(value: unknown): value is VaultEntry {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const entry = value as Partial<VaultEntry>;\n return (\n typeof entry.token === 'string' &&\n typeof entry.secret === 'string' &&\n isSecretType(entry.type) &&\n typeof entry.createdAt === 'number' &&\n Number.isFinite(entry.createdAt) &&\n typeof entry.hitCount === 'number' &&\n Number.isFinite(entry.hitCount) &&\n (entry.name === undefined || typeof entry.name === 'string') &&\n (entry.source === undefined || isSecretSource(entry.source))\n );\n}\n\nfunction parseVaultData(raw: string): Record<string, VaultEntry> {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error('Vault file is corrupted');\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('Vault file is corrupted');\n }\n\n const result: Record<string, VaultEntry> = {};\n\n for (const [secret, entry] of Object.entries(parsed)) {\n if (!isVaultEntry(entry) || entry.secret !== secret) {\n throw new Error('Vault file is corrupted');\n }\n\n result[secret] = {\n token: entry.token,\n secret: entry.secret,\n type: entry.type,\n createdAt: entry.createdAt,\n hitCount: entry.hitCount,\n name: entry.name,\n source: entry.source,\n };\n }\n\n return result;\n}\n\nasync function deriveKey(password: Buffer, salt: Buffer): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n scryptCallback(password, salt, KEY_LENGTH, SCRYPT_OPTIONS, (error, derivedKey) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(Buffer.from(derivedKey));\n });\n });\n}\n\nexport class EncryptedVault {\n static exists(path = DEFAULT_VAULT_PATH): boolean {\n return existsSync(path);\n }\n\n static async save(\n data: Record<string, VaultEntry>,\n password: string,\n path = DEFAULT_VAULT_PATH,\n ): Promise<void> {\n const passwordBuffer = Buffer.from(password, 'utf8');\n const plaintextBuffer = Buffer.from(JSON.stringify(data), 'utf8');\n const salt = randomBytes(SALT_LENGTH);\n const iv = randomBytes(IV_LENGTH);\n let key: Buffer | null = null;\n let ciphertext: Buffer | null = null;\n let authTag: Buffer | null = null;\n\n try {\n key = await deriveKey(passwordBuffer, salt);\n const cipher = createCipheriv(AES_ALGORITHM, key, iv);\n ciphertext = Buffer.concat([cipher.update(plaintextBuffer), cipher.final()]);\n authTag = cipher.getAuthTag();\n const payload = Buffer.concat([salt, iv, authTag, ciphertext]);\n\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, payload, { mode: FILE_MODE });\n chmodSync(path, FILE_MODE);\n payload.fill(0);\n } finally {\n passwordBuffer.fill(0);\n plaintextBuffer.fill(0);\n salt.fill(0);\n iv.fill(0);\n key?.fill(0);\n ciphertext?.fill(0);\n authTag?.fill(0);\n }\n }\n\n static async load(password: string, path = DEFAULT_VAULT_PATH): Promise<Record<string, VaultEntry>> {\n if (!this.exists(path)) {\n return {};\n }\n\n const payload = await readFile(path);\n if (payload.length < MIN_PAYLOAD_LENGTH) {\n payload.fill(0);\n throw new Error('Vault file is corrupted');\n }\n\n const passwordBuffer = Buffer.from(password, 'utf8');\n const salt = Buffer.from(payload.subarray(0, SALT_LENGTH));\n const iv = Buffer.from(payload.subarray(SALT_LENGTH, SALT_LENGTH + IV_LENGTH));\n const authTag = Buffer.from(\n payload.subarray(SALT_LENGTH + IV_LENGTH, SALT_LENGTH + IV_LENGTH + AUTH_TAG_LENGTH),\n );\n const ciphertext = Buffer.from(payload.subarray(MIN_PAYLOAD_LENGTH));\n let key: Buffer | null = null;\n let plaintext: Buffer | null = null;\n\n try {\n key = await deriveKey(passwordBuffer, salt);\n const decipher = createDecipheriv(AES_ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);\n return parseVaultData(plaintext.toString('utf8'));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to decrypt vault: ${error.message}`);\n }\n\n throw new Error('Failed to decrypt vault: invalid password or corrupted file');\n } finally {\n payload.fill(0);\n passwordBuffer.fill(0);\n salt.fill(0);\n iv.fill(0);\n authTag.fill(0);\n ciphertext.fill(0);\n key?.fill(0);\n plaintext?.fill(0);\n }\n }\n}\n","interface KeychainModule {\n deletePassword(service: string, account: string): Promise<boolean>;\n getPassword(service: string, account: string): Promise<string | null>;\n setPassword(service: string, account: string, password: string): Promise<void>;\n}\n\ntype KeychainModuleLoader = () => Promise<KeychainModule | { default: KeychainModule }>;\n\nconst DEFAULT_ACCOUNT = 'vault-password';\nconst defaultLoader: KeychainModuleLoader = async () => import('keytar');\n\nlet keychainModuleLoader: KeychainModuleLoader = defaultLoader;\n\nfunction normalizeKeychainModule(\n module: KeychainModule | { default: KeychainModule },\n): KeychainModule {\n return 'default' in module ? module.default : module;\n}\n\nasync function loadKeychainModule(): Promise<KeychainModule | null> {\n try {\n return normalizeKeychainModule(await keychainModuleLoader());\n } catch {\n return null;\n }\n}\n\nexport function setKeychainModuleLoaderForTesting(loader: KeychainModuleLoader): void {\n keychainModuleLoader = loader;\n}\n\nexport function resetKeychainModuleLoaderForTesting(): void {\n keychainModuleLoader = defaultLoader;\n}\n\nexport class KeychainStore {\n static readonly SERVICE = 'ais';\n private static readonly ACCOUNT = DEFAULT_ACCOUNT;\n\n static async setVaultPassword(password: string): Promise<void> {\n const keychain = await loadKeychainModule();\n if (!keychain) {\n throw new Error('System keychain is not available');\n }\n\n try {\n await keychain.setPassword(this.SERVICE, this.ACCOUNT, password);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`System keychain is not available: ${message}`);\n }\n }\n\n static async getVaultPassword(): Promise<string | null> {\n const keychain = await loadKeychainModule();\n if (!keychain) {\n return null;\n }\n\n try {\n return await keychain.getPassword(this.SERVICE, this.ACCOUNT);\n } catch {\n return null;\n }\n }\n\n static async deleteVaultPassword(): Promise<void> {\n const keychain = await loadKeychainModule();\n if (!keychain) {\n return;\n }\n\n try {\n await keychain.deletePassword(this.SERVICE, this.ACCOUNT);\n } catch {\n // 忽略删除失败,避免在无图形环境下中断主流程。\n }\n }\n\n static async isAvailable(): Promise<boolean> {\n const keychain = await loadKeychainModule();\n if (!keychain) {\n return false;\n }\n\n try {\n await keychain.getPassword(this.SERVICE, this.ACCOUNT);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { randomBytes } from 'node:crypto';\n\nimport { SessionVault, type SessionVaultOptions } from '../vault/session-vault.js';\nimport { DEFAULT_VAULT_PATH, EncryptedVault } from './encrypted-vault.js';\nimport { KeychainStore } from './keychain.js';\n\nconst PASSWORD_ENV_NAME = 'AIS_VAULT_PASSWORD';\n\ninterface KeychainStoreLike {\n getVaultPassword(): Promise<string | null>;\n isAvailable(): Promise<boolean>;\n setVaultPassword(password: string): Promise<void>;\n}\n\nexport interface StorageManagerOptions {\n env?: NodeJS.ProcessEnv;\n keychain?: KeychainStoreLike;\n persistDetectedSecrets?: boolean;\n vaultOptions?: SessionVaultOptions;\n vaultPassword?: string;\n vaultPath?: string;\n}\n\nfunction buildVaultRecord(vault: SessionVault, persistDetectedSecrets: boolean) {\n return Object.fromEntries(\n vault\n .snapshot()\n .filter((entry) => persistDetectedSecrets || entry.source === 'manual')\n .map((entry) => [entry.secret, entry]),\n );\n}\n\nexport class StorageManager {\n private cachedPassword: string | null = null;\n private readonly env: NodeJS.ProcessEnv;\n private readonly keychain: KeychainStoreLike;\n\n constructor(private readonly options: StorageManagerOptions = {}) {\n this.env = options.env ?? process.env;\n this.keychain = options.keychain ?? KeychainStore;\n }\n\n async initialize(): Promise<SessionVault> {\n const vault = new SessionVault(this.options.vaultOptions);\n const password = await this.getReadablePassword();\n\n if (!password) {\n return vault;\n }\n\n const persistedEntries = await EncryptedVault.load(password, this.options.vaultPath);\n for (const entry of Object.values(persistedEntries)) {\n vault.register(entry.secret, entry.type, {\n createdAt: entry.createdAt,\n hitCount: entry.hitCount,\n name: entry.name,\n source: entry.source ?? 'manual',\n token: entry.token,\n });\n }\n\n return vault;\n }\n\n async save(vault: SessionVault): Promise<void> {\n const password = await this.getWritablePassword();\n await EncryptedVault.save(\n buildVaultRecord(vault, this.options.persistDetectedSecrets !== false),\n password,\n this.options.vaultPath,\n );\n }\n\n async setup(): Promise<boolean> {\n const password = await this.getWritablePassword();\n if (EncryptedVault.exists(this.options.vaultPath)) {\n return false;\n }\n\n await EncryptedVault.save({}, password, this.options.vaultPath);\n return true;\n }\n\n getVaultPath(): string {\n return this.options.vaultPath ?? DEFAULT_VAULT_PATH;\n }\n\n private async getReadablePassword(): Promise<string | null> {\n const directPassword = this.getDirectPassword();\n if (directPassword) {\n this.cachedPassword = directPassword;\n return directPassword;\n }\n\n if (this.cachedPassword) {\n return this.cachedPassword;\n }\n\n const storedPassword = await this.keychain.getVaultPassword();\n if (storedPassword) {\n this.cachedPassword = storedPassword;\n return storedPassword;\n }\n\n if (EncryptedVault.exists(this.options.vaultPath)) {\n throw new Error(\n `Vault password is unavailable. Set ${PASSWORD_ENV_NAME} or enable the system keychain.`,\n );\n }\n\n return null;\n }\n\n private async getWritablePassword(): Promise<string> {\n const directPassword = this.getDirectPassword();\n if (directPassword) {\n this.cachedPassword = directPassword;\n return directPassword;\n }\n\n if (this.cachedPassword) {\n return this.cachedPassword;\n }\n\n const storedPassword = await this.keychain.getVaultPassword();\n if (storedPassword) {\n this.cachedPassword = storedPassword;\n return storedPassword;\n }\n\n if (await this.keychain.isAvailable()) {\n const seed = randomBytes(32);\n const generatedPassword = seed.toString('base64url');\n seed.fill(0);\n await this.keychain.setVaultPassword(generatedPassword);\n this.cachedPassword = generatedPassword;\n return generatedPassword;\n }\n\n throw new Error(\n `Vault password is unavailable. Set ${PASSWORD_ENV_NAME} when the system keychain cannot be used.`,\n );\n }\n\n private getDirectPassword(): string | null {\n return this.options.vaultPassword ?? this.env[PASSWORD_ENV_NAME] ?? null;\n }\n}\n","import { createHash, randomUUID } from 'node:crypto';\n\nimport type { SecretSource, SecretType, TokenGenerator, VaultEntry } from './types.js';\n\nconst TOKEN_PREFIX = '__VAULT_';\nconst TOKEN_SUFFIX = '__';\nconst BASE_HASH_LENGTH = 8;\nconst MAX_HASH_LENGTH = 9;\nconst MAX_COLLISION_SUFFIX = 15;\nconst TOKEN_PATTERN = /^__VAULT_([A-Z_]+)_([0-9a-f]{8,9})__$/;\n\nexport const TOKEN_REGEX = /__VAULT_[A-Z_]+_[0-9a-f]{8,9}__/g;\nexport const TOKEN_MAX_LENGTH = `${TOKEN_PREFIX}PRIVATE_KEY_${'f'.repeat(MAX_HASH_LENGTH)}${TOKEN_SUFFIX}`.length;\n\nexport interface SessionVaultOptions {\n sessionId?: string;\n tokenGenerator?: TokenGenerator;\n}\n\nexport interface RegisterSecretOptions {\n createdAt?: number;\n hitCount?: number;\n name?: string;\n source?: SecretSource;\n token?: string;\n}\n\nfunction buildToken(type: SecretType, hash: string): string {\n return `${TOKEN_PREFIX}${type}_${hash}${TOKEN_SUFFIX}`;\n}\n\nfunction buildCollisionToken(\n secret: string,\n type: SecretType,\n sessionId: string,\n baseToken: string,\n attempt: number,\n): string {\n const match = baseToken.match(TOKEN_PATTERN);\n if (!match) {\n throw new Error(`Invalid vault token format: ${baseToken}`);\n }\n\n if (attempt <= MAX_COLLISION_SUFFIX) {\n return buildToken(type, `${match[2].slice(0, BASE_HASH_LENGTH)}${attempt.toString(16)}`);\n }\n\n const hash = createHash('sha256')\n .update(`${secret}${sessionId}:${attempt}`)\n .digest('hex')\n .slice(0, MAX_HASH_LENGTH);\n\n return buildToken(type, hash);\n}\n\nfunction sortPairsBySourceLength<T extends readonly [string, string]>(pairs: T[]): T[] {\n return pairs.sort((left, right) => {\n if (right[0].length !== left[0].length) {\n return right[0].length - left[0].length;\n }\n\n return left[0].localeCompare(right[0]);\n });\n}\n\nexport function generateToken(secret: string, type: SecretType, sessionId: string): string {\n const hash = createHash('sha256')\n .update(secret + sessionId)\n .digest('hex')\n .slice(0, BASE_HASH_LENGTH);\n\n return buildToken(type, hash);\n}\n\nexport class SessionVault {\n private readonly nameToSecret = new Map<string, string>();\n private revisionNumber = 0;\n private readonly secretToEntry = new Map<string, VaultEntry>();\n private readonly tokenToEntry = new Map<string, VaultEntry>();\n private readonly sessionId: string;\n private readonly tokenGenerator: TokenGenerator;\n\n constructor(options: SessionVaultOptions = {}) {\n this.sessionId = options.sessionId ?? randomUUID();\n this.tokenGenerator = options.tokenGenerator ?? generateToken;\n }\n\n get size(): number {\n return this.secretToEntry.size;\n }\n\n get revision(): number {\n return this.revisionNumber;\n }\n\n register(secret: string, type: SecretType, options: RegisterSecretOptions = {}): string {\n const existingEntry = this.secretToEntry.get(secret);\n if (existingEntry) {\n this.updateExistingEntry(existingEntry, type, options);\n return existingEntry.token;\n }\n\n const createdAt = options.createdAt ?? Date.now();\n const baseToken = options.token ?? this.tokenGenerator(secret, type, this.sessionId);\n let token = baseToken;\n let attempt = 0;\n\n while (true) {\n const entryWithSameToken = this.tokenToEntry.get(token);\n if (!entryWithSameToken) {\n break;\n }\n\n if (entryWithSameToken.secret === secret) {\n return entryWithSameToken.token;\n }\n\n attempt += 1;\n token = buildCollisionToken(secret, type, this.sessionId, baseToken, attempt);\n }\n\n const entry: VaultEntry = {\n token,\n secret,\n type,\n createdAt,\n hitCount: options.hitCount ?? 0,\n name: normalizeEntryName(options.name),\n source: options.source ?? 'manual',\n };\n\n this.assertNameAvailable(entry.name, entry.secret);\n this.secretToEntry.set(secret, entry);\n this.tokenToEntry.set(token, entry);\n if (entry.name) {\n this.nameToSecret.set(entry.name, secret);\n }\n this.revisionNumber += 1;\n\n return token;\n }\n\n findByName(name: string): VaultEntry | null {\n const normalizedName = normalizeEntryName(name);\n if (!normalizedName) {\n return null;\n }\n\n const secret = this.nameToSecret.get(normalizedName);\n if (!secret) {\n return null;\n }\n\n return cloneEntry(this.secretToEntry.get(secret));\n }\n\n resolve(token: string): string | null {\n const entry = this.tokenToEntry.get(token);\n if (!entry) {\n return null;\n }\n\n entry.hitCount += 1;\n return entry.secret;\n }\n\n getSecretToTokenPairs(): Array<[string, string]> {\n return sortPairsBySourceLength(\n Array.from(this.secretToEntry.values(), (entry) => [entry.secret, entry.token] as const),\n ).map(([secret, token]) => [secret, token]);\n }\n\n snapshot(): VaultEntry[] {\n return Array.from(this.secretToEntry.values(), (entry) => ({\n ...entry,\n })).sort((left, right) => left.secret.localeCompare(right.secret));\n }\n\n removeByName(name: string): VaultEntry | null {\n const normalizedName = normalizeEntryName(name);\n if (!normalizedName) {\n return null;\n }\n\n const secret = this.nameToSecret.get(normalizedName);\n if (!secret) {\n return null;\n }\n\n return this.removeBySecret(secret);\n }\n\n getTokenToSecretPairs(): Array<[string, string]> {\n return sortPairsBySourceLength(\n Array.from(this.tokenToEntry.values(), (entry) => [entry.token, entry.secret] as const),\n ).map(([token, secret]) => [token, secret]);\n }\n\n isToken(value: string): boolean {\n return this.tokenToEntry.has(value);\n }\n\n destroy(): void {\n if (this.secretToEntry.size > 0 || this.tokenToEntry.size > 0) {\n this.revisionNumber += 1;\n }\n\n this.nameToSecret.clear();\n this.secretToEntry.clear();\n this.tokenToEntry.clear();\n }\n\n private removeBySecret(secret: string): VaultEntry | null {\n const entry = this.secretToEntry.get(secret);\n if (!entry) {\n return null;\n }\n\n this.secretToEntry.delete(secret);\n this.tokenToEntry.delete(entry.token);\n if (entry.name) {\n this.nameToSecret.delete(entry.name);\n }\n this.revisionNumber += 1;\n\n return {\n ...entry,\n };\n }\n\n private updateExistingEntry(\n entry: VaultEntry,\n type: SecretType,\n options: RegisterSecretOptions,\n ): void {\n let changed = false;\n\n if (entry.type !== type) {\n entry.type = type;\n changed = true;\n }\n\n if (options.createdAt !== undefined && entry.createdAt !== options.createdAt) {\n entry.createdAt = options.createdAt;\n changed = true;\n }\n\n if (options.hitCount !== undefined && entry.hitCount !== options.hitCount) {\n entry.hitCount = options.hitCount;\n changed = true;\n }\n\n if (options.source && entry.source !== options.source) {\n entry.source = options.source;\n changed = true;\n }\n\n const nextName = normalizeEntryName(options.name);\n if (nextName !== undefined && nextName !== entry.name) {\n this.assertNameAvailable(nextName, entry.secret);\n if (entry.name) {\n this.nameToSecret.delete(entry.name);\n }\n\n entry.name = nextName;\n if (nextName) {\n this.nameToSecret.set(nextName, entry.secret);\n }\n changed = true;\n }\n\n if (changed) {\n this.revisionNumber += 1;\n }\n }\n\n private assertNameAvailable(name: string | undefined, secret: string): void {\n if (!name) {\n return;\n }\n\n const existingSecret = this.nameToSecret.get(name);\n if (existingSecret && existingSecret !== secret) {\n throw new Error(`Secret name already exists: ${name}`);\n }\n }\n}\n\nfunction cloneEntry(entry: VaultEntry | undefined): VaultEntry | null {\n if (!entry) {\n return null;\n }\n\n return {\n ...entry,\n };\n}\n\nfunction normalizeEntryName(name: string | undefined): string | undefined {\n if (name === undefined) {\n return undefined;\n }\n\n const trimmed = name.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n","import { parseArgs } from 'node:util';\n\nimport { isProtectTool, type ProtectTool } from './automation/index.js';\nimport { isSecretType, type SecretType } from './vault/types.js';\n\nconst KNOWN_SUBCOMMANDS = new Set(['add', 'ais', 'config', 'list', 'protect', 'remove', 'status', 'update']);\nconst OPTIONS_WITH_VALUES = ['--config', '-c', '--proxy-port'] as const;\n\nexport interface CliGlobalOptions {\n config?: string;\n debug: boolean;\n dryRun: boolean;\n help: boolean;\n noContext: boolean;\n noEntropy: boolean;\n proxyPort?: number;\n skipUpdateCheck: boolean;\n version: boolean;\n}\n\nexport type CliInvocation =\n | { type: 'add'; name: string; options: CliGlobalOptions; secret?: string }\n | {\n action: 'exclude' | 'exclude-type' | 'include' | 'include-type' | 'show';\n options: CliGlobalOptions;\n target?: string;\n type: 'ais';\n secretType?: SecretType;\n }\n | { action: 'get'; key: string; options: CliGlobalOptions; type: 'config' }\n | { action: 'set'; key: string; options: CliGlobalOptions; type: 'config'; value: string }\n | { action: 'show'; options: CliGlobalOptions; type: 'config' }\n | { type: 'error'; message: string }\n | { type: 'help'; options: CliGlobalOptions }\n | { type: 'list'; options: CliGlobalOptions }\n | { action: 'off' | 'on'; options: CliGlobalOptions; target: ProtectTool | 'all'; type: 'protect' }\n | { action: 'restore' | 'status'; options: CliGlobalOptions; type: 'protect' }\n | { type: 'remove'; name: string; options: CliGlobalOptions }\n | { type: 'status'; options: CliGlobalOptions }\n | { type: 'update'; options: CliGlobalOptions }\n | { type: 'version'; options: CliGlobalOptions }\n | { type: 'wrap'; args: string[]; command: string; options: CliGlobalOptions };\n\nexport function parseCliInvocation(args: string[]): CliInvocation {\n let optionArgs: string[];\n let remainder: string[];\n\n try {\n ({ optionArgs, remainder } = splitLeadingGlobalOptions(args));\n } catch (error) {\n return {\n type: 'error',\n message: error instanceof Error ? error.message : String(error),\n };\n }\n\n let parsedOptions: CliGlobalOptions;\n\n try {\n parsedOptions = parseGlobalOptions(optionArgs);\n } catch (error) {\n return {\n type: 'error',\n message: error instanceof Error ? error.message : String(error),\n };\n }\n\n if (parsedOptions.help) {\n return {\n type: 'help',\n options: parsedOptions,\n };\n }\n\n if (parsedOptions.version) {\n return {\n type: 'version',\n options: parsedOptions,\n };\n }\n\n if (remainder.length === 0) {\n return {\n type: 'error',\n message: 'Missing command. Use --help to see available commands.',\n };\n }\n\n const [command, ...rest] = remainder;\n if (KNOWN_SUBCOMMANDS.has(command)) {\n return parseSubcommand(command, rest, parsedOptions);\n }\n\n return {\n type: 'wrap',\n command,\n args: rest,\n options: parsedOptions,\n };\n}\n\nfunction parseGlobalOptions(args: string[]): CliGlobalOptions {\n const { values } = parseArgs({\n args,\n options: {\n version: { type: 'boolean', short: 'v' },\n help: { type: 'boolean', short: 'h' },\n debug: { type: 'boolean', short: 'd' },\n 'dry-run': { type: 'boolean' },\n config: { type: 'string', short: 'c' },\n 'no-entropy': { type: 'boolean' },\n 'no-context': { type: 'boolean' },\n 'proxy-port': { type: 'string' },\n 'skip-update-check': { type: 'boolean' },\n },\n allowPositionals: false,\n strict: true,\n });\n\n return {\n config: values.config,\n debug: values.debug ?? false,\n dryRun: values['dry-run'] ?? false,\n help: values.help ?? false,\n noContext: values['no-context'] ?? false,\n noEntropy: values['no-entropy'] ?? false,\n proxyPort: parseProxyPort(values['proxy-port']),\n skipUpdateCheck: values['skip-update-check'] ?? false,\n version: values.version ?? false,\n };\n}\n\nfunction parseProxyPort(value: string | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!/^\\d+$/.test(value)) {\n throw new Error('Option --proxy-port requires a numeric value.');\n }\n\n const parsed = Number.parseInt(value, 10);\n if (parsed < 1 || parsed > 65535) {\n throw new Error('Option --proxy-port must be between 1 and 65535.');\n }\n\n return parsed;\n}\n\nfunction parseSubcommand(\n command: string,\n args: string[],\n options: CliGlobalOptions,\n): CliInvocation {\n switch (command) {\n case 'add':\n if (args.length === 0 || args.length > 2) {\n return {\n type: 'error',\n message: 'Usage: ais add <name> [secret]',\n };\n }\n\n return {\n type: 'add',\n name: args[0],\n secret: args[1],\n options,\n };\n\n case 'ais':\n return parseAisSubcommand(args, options);\n\n case 'list':\n return expectNoExtraArgs(command, args, {\n type: 'list',\n options,\n });\n\n case 'remove':\n if (args.length !== 1) {\n return {\n type: 'error',\n message: 'Usage: ais remove <name>',\n };\n }\n\n return {\n type: 'remove',\n name: args[0],\n options,\n };\n\n case 'status':\n return expectNoExtraArgs(command, args, {\n type: 'status',\n options,\n });\n\n case 'config':\n return parseConfigSubcommand(args, options);\n\n case 'protect':\n return parseProtectSubcommand(args, options);\n\n case 'update':\n return expectNoExtraArgs(command, args, {\n type: 'update',\n options,\n });\n\n default:\n return {\n type: 'error',\n message: `Unknown subcommand: ${command}`,\n };\n }\n}\n\nfunction expectNoExtraArgs<T extends CliInvocation>(command: string, args: string[], invocation: T): CliInvocation {\n if (args.length > 0) {\n return {\n type: 'error',\n message: `Usage: ais ${command}`,\n };\n }\n\n return invocation;\n}\n\nfunction parseAisSubcommand(args: string[], options: CliGlobalOptions): CliInvocation {\n if (args.length === 0) {\n return {\n type: 'ais',\n action: 'show',\n options,\n };\n }\n\n const [action, target] = args;\n if (action === 'show') {\n if (args.length !== 1) {\n return {\n type: 'error',\n message: 'Usage: ais ais show',\n };\n }\n\n return {\n type: 'ais',\n action: 'show',\n options,\n };\n }\n\n if (action === 'exclude' || action === 'include') {\n if (args.length !== 2 || !target) {\n return {\n type: 'error',\n message: `Usage: ais ais ${action} <id>`,\n };\n }\n\n return {\n type: 'ais',\n action,\n options,\n target,\n };\n }\n\n if (action === 'exclude-type' || action === 'include-type') {\n if (args.length !== 2 || !target) {\n return {\n type: 'error',\n message: `Usage: ais ais ${action} <type>`,\n };\n }\n\n const normalizedType = target.toUpperCase();\n if (!isSecretType(normalizedType)) {\n return {\n type: 'error',\n message: `Unknown secret type: ${target}`,\n };\n }\n\n return {\n type: 'ais',\n action,\n options,\n secretType: normalizedType,\n target: normalizedType,\n };\n }\n\n return {\n type: 'error',\n message: 'Usage: ais ais [show|exclude <id>|include <id>|exclude-type <type>|include-type <type>]',\n };\n}\n\nfunction parseConfigSubcommand(args: string[], options: CliGlobalOptions): CliInvocation {\n if (args.length === 0) {\n return {\n type: 'config',\n action: 'show',\n options,\n };\n }\n\n const [action, key, value] = args;\n if (action === 'show') {\n if (args.length !== 1) {\n return {\n type: 'error',\n message: 'Usage: ais config show',\n };\n }\n\n return {\n type: 'config',\n action: 'show',\n options,\n };\n }\n\n if (action === 'get') {\n if (args.length !== 2 || !key) {\n return {\n type: 'error',\n message: 'Usage: ais config get <key>',\n };\n }\n\n return {\n type: 'config',\n action: 'get',\n key,\n options,\n };\n }\n\n if (action === 'set') {\n if (args.length !== 3 || !key || value === undefined) {\n return {\n type: 'error',\n message: 'Usage: ais config set <key> <value>',\n };\n }\n\n return {\n type: 'config',\n action: 'set',\n key,\n options,\n value,\n };\n }\n\n return {\n type: 'error',\n message: 'Usage: ais config [show|get <key>|set <key> <value>]',\n };\n}\n\nfunction parseProtectSubcommand(args: string[], options: CliGlobalOptions): CliInvocation {\n if (args.length === 0) {\n return {\n type: 'protect',\n action: 'status',\n options,\n };\n }\n\n const [action, target] = args;\n if (action === 'status') {\n if (args.length !== 1) {\n return {\n type: 'error',\n message: 'Usage: ais protect status',\n };\n }\n\n return {\n type: 'protect',\n action: 'status',\n options,\n };\n }\n\n if (action === 'restore') {\n if (args.length !== 1) {\n return {\n type: 'error',\n message: 'Usage: ais protect restore',\n };\n }\n\n return {\n type: 'protect',\n action: 'restore',\n options,\n };\n }\n\n if (action === 'on' || action === 'off') {\n if (args.length !== 2 || !target) {\n return {\n type: 'error',\n message: `Usage: ais protect ${action} <tool|all>`,\n };\n }\n\n if (target !== 'all' && !isProtectTool(target)) {\n return {\n type: 'error',\n message: `Unknown protect target: ${target}`,\n };\n }\n\n return {\n type: 'protect',\n action,\n options,\n target,\n };\n }\n\n return {\n type: 'error',\n message: 'Usage: ais protect [status|on <tool|all>|off <tool|all>|restore]',\n };\n}\n\nfunction splitLeadingGlobalOptions(args: string[]): {\n optionArgs: string[];\n remainder: string[];\n} {\n if (args[0] === '--') {\n return {\n optionArgs: [],\n remainder: args.slice(1),\n };\n }\n\n const optionArgs: string[] = [];\n let index = 0;\n\n while (index < args.length) {\n const current = args[index];\n\n if (current === '--') {\n return {\n optionArgs,\n remainder: args.slice(index + 1),\n };\n }\n\n if (current === '-' || !current.startsWith('-')) {\n break;\n }\n\n optionArgs.push(current);\n\n if (expectsSeparateValue(current)) {\n const next = args[index + 1];\n if (!next) {\n throw new Error(`Option ${current} requires a value.`);\n }\n\n optionArgs.push(next);\n index += 2;\n continue;\n }\n\n index += 1;\n }\n\n return {\n optionArgs,\n remainder: args.slice(index),\n };\n}\n\nfunction expectsSeparateValue(arg: string): boolean {\n if (arg.startsWith('--config=')) {\n return false;\n }\n\n return OPTIONS_WITH_VALUES.includes(arg as (typeof OPTIONS_WITH_VALUES)[number]);\n}\n","import { readFileSync } from 'node:fs';\n\nexport interface PackageInfo {\n name: string;\n version: string;\n}\n\nlet cachedPackageInfo: PackageInfo | undefined;\n\nexport function getPackageInfo(): PackageInfo {\n if (cachedPackageInfo) {\n return cachedPackageInfo;\n }\n\n cachedPackageInfo = readPackageInfo();\n return cachedPackageInfo;\n}\n\nexport const PACKAGE_NAME = getPackageInfo().name;\nexport const VERSION = getPackageInfo().version;\n\nfunction readPackageInfo(): PackageInfo {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));\n } catch (error) {\n throw new Error(`Failed to load package info: ${toErrorMessage(error)}`);\n }\n\n if (!isRecord(parsed)) {\n throw new Error('Failed to load package info: package.json root must be an object');\n }\n\n return {\n name: expectString(parsed.name, 'name'),\n version: expectString(parsed.version, 'version'),\n };\n}\n\nfunction expectString(value: unknown, key: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`Failed to load package info: package.json ${key} must be a non-empty string`);\n }\n\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { spawn } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { chmod, lstat, mkdir, open, readFile, readlink, realpath, rm, symlink, writeFile } from 'node:fs/promises';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { cloneAutomationState, type AutomationState } from '../automation/index.js';\nimport { maybeCheckForUpdates, type MaybeCheckForUpdatesOptions, type UpdateCheckSettings } from './check.js';\n\nconst NPM_COMMAND = 'npm';\nconst NPM_REGISTRY_URL = 'https://registry.npmjs.org';\nconst UPDATE_LOCK_STALE_MS = 30 * 60_000;\n\nexport interface UpdateCommandResult {\n exitCode: number;\n stderr: string;\n stdout: string;\n}\n\nexport type UpdateCommandRunner = (\n command: string,\n args: string[],\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n },\n) => Promise<UpdateCommandResult>;\n\nexport interface SelfUpdateOptions extends MaybeCheckForUpdatesOptions {\n automationStatePath: string;\n commandRunner?: UpdateCommandRunner;\n currentPackageRoot?: string;\n}\n\nexport interface SelfUpdateOutcome {\n changed: boolean;\n message?: string;\n state: AutomationState;\n status: 'available' | 'failed' | 'locked' | 'skipped' | 'up-to-date' | 'updated';\n}\n\ninterface InstallPaths {\n binPath: string;\n currentPackageRoot: string;\n globalPackageRoot: string;\n}\n\ninterface UpdateLockPayload {\n packageName: string;\n pid: number;\n remoteVersion: string;\n startedAt: number;\n}\n\ninterface HeldLock {\n release(): Promise<void>;\n}\n\ntype BinBackup =\n | { contents: Buffer; kind: 'file'; mode: number; originalPath: string }\n | { kind: 'missing'; originalPath: string }\n | { kind: 'symlink'; originalPath: string; target: string };\n\ninterface InstallBackup {\n bin: BinBackup;\n packageBackupPath: string;\n}\n\nexport async function maybeRunStartupSelfUpdate(\n state: AutomationState,\n settings: UpdateCheckSettings,\n options: SelfUpdateOptions,\n): Promise<SelfUpdateOutcome> {\n const check = await maybeCheckForUpdates(state, settings, options);\n\n if (check.state.update.lastResult !== 'available' || !check.state.update.lastRemoteVersion) {\n return {\n changed: check.changed,\n message: check.message,\n state: check.state,\n status: normalizeStatus(check.state.update.lastResult),\n };\n }\n\n return applyAvailableUpdate(state, check.state, options, {\n localVersion: options.packageInfo.version,\n packageName: options.packageInfo.name,\n remoteVersion: check.state.update.lastRemoteVersion,\n });\n}\n\nexport async function runManualSelfUpdate(\n state: AutomationState,\n settings: Pick<UpdateCheckSettings, 'channel'>,\n options: SelfUpdateOptions,\n): Promise<SelfUpdateOutcome> {\n const check = await maybeCheckForUpdates(\n state,\n {\n channel: settings.channel,\n checkIntervalMinutes: 0,\n enabled: true,\n forceCheck: true,\n silent: false,\n skipCheck: false,\n },\n options,\n );\n\n if (check.state.update.lastResult !== 'available' || !check.state.update.lastRemoteVersion) {\n return {\n changed: check.changed,\n message: check.message,\n state: check.state,\n status: normalizeStatus(check.state.update.lastResult),\n };\n }\n\n return applyAvailableUpdate(state, check.state, options, {\n localVersion: options.packageInfo.version,\n packageName: options.packageInfo.name,\n remoteVersion: check.state.update.lastRemoteVersion,\n });\n}\n\nexport function resolveUpdateLockPath(automationStatePath: string): string {\n return `${automationStatePath}.update.lock`;\n}\n\nexport function resolveCurrentPackageRootFromUrl(moduleUrl: string, packageName: string): string {\n let currentDirectory = dirname(fileURLToPath(moduleUrl));\n\n for (let depth = 0; depth < 8; depth += 1) {\n const packageJsonPath = join(currentDirectory, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const parsed = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as unknown;\n if (isRecord(parsed) && parsed.name === packageName) {\n return currentDirectory;\n }\n } catch {\n // 包描述损坏时继续往上找,直到命中正确的包根目录。\n }\n }\n\n const parentDirectory = dirname(currentDirectory);\n if (parentDirectory === currentDirectory) {\n break;\n }\n currentDirectory = parentDirectory;\n }\n\n throw new Error(`current package root could not be resolved for ${packageName}`);\n}\n\nasync function applyAvailableUpdate(\n previousState: AutomationState,\n checkedState: AutomationState,\n options: SelfUpdateOptions,\n update: {\n localVersion: string;\n packageName: string;\n remoteVersion: string;\n },\n): Promise<SelfUpdateOutcome> {\n const now = (options.now ?? Date.now)();\n const lock = await acquireLock(resolveUpdateLockPath(options.automationStatePath), {\n packageName: update.packageName,\n pid: process.pid,\n remoteVersion: update.remoteVersion,\n startedAt: now,\n });\n\n if (!lock) {\n return {\n changed: hasStateChanged(previousState, checkedState),\n message: formatLockedMessage(update.packageName, update.localVersion, update.remoteVersion),\n state: checkedState,\n status: 'locked',\n };\n }\n\n let backup: InstallBackup | undefined;\n try {\n const runner = options.commandRunner ?? runUpdateCommand;\n const installPaths = await resolveInstallPaths(update.packageName, runner, options);\n\n if (installPaths.currentPackageRoot !== installPaths.globalPackageRoot) {\n return {\n changed: hasStateChanged(previousState, checkedState),\n message: formatUnsupportedInstallMessage(update.packageName, update.localVersion, update.remoteVersion),\n state: checkedState,\n status: 'skipped',\n };\n }\n\n backup = await createInstallBackup(installPaths, dirname(options.automationStatePath), update.packageName);\n\n const installResult = await runner(\n NPM_COMMAND,\n [\n 'install',\n '-g',\n `${update.packageName}@${update.remoteVersion}`,\n '--registry',\n NPM_REGISTRY_URL,\n '--loglevel=error',\n '--fund=false',\n '--audit=false',\n ],\n {\n env: options.env,\n },\n );\n\n if (installResult.exitCode !== 0) {\n return await finalizeFailedInstall(previousState, checkedState, installPaths, backup, update, installResult);\n }\n\n const installedVersion = await readInstalledVersion(installPaths.globalPackageRoot);\n if (installedVersion !== update.remoteVersion) {\n return await finalizeFailedInstall(previousState, checkedState, installPaths, backup, update, {\n exitCode: 1,\n stderr: `installed version mismatch: expected ${update.remoteVersion}, got ${installedVersion}`,\n stdout: '',\n });\n }\n\n const nextState = cloneAutomationState(checkedState);\n nextState.update.lastError = undefined;\n nextState.update.lastLocalVersion = update.remoteVersion;\n nextState.update.lastRemoteVersion = update.remoteVersion;\n nextState.update.lastResult = 'updated';\n\n return {\n changed: hasStateChanged(previousState, nextState),\n message: formatSuccessMessage(update.packageName, update.localVersion, update.remoteVersion),\n state: nextState,\n status: 'updated',\n };\n } catch (error) {\n const nextState = cloneAutomationState(checkedState);\n nextState.update.lastError = toErrorMessage(error);\n nextState.update.lastLocalVersion = update.localVersion;\n nextState.update.lastRemoteVersion = update.remoteVersion;\n nextState.update.lastResult = 'failed';\n\n return {\n changed: hasStateChanged(previousState, nextState),\n message: formatFailureMessage(update.packageName, update.localVersion, update.remoteVersion, toErrorMessage(error)),\n state: nextState,\n status: 'failed',\n };\n } finally {\n await lock.release();\n if (backup) {\n await rm(backup.packageBackupPath, { force: true, recursive: true });\n }\n }\n}\n\nasync function finalizeFailedInstall(\n previousState: AutomationState,\n checkedState: AutomationState,\n installPaths: InstallPaths,\n backup: InstallBackup,\n update: {\n localVersion: string;\n packageName: string;\n remoteVersion: string;\n },\n installResult: UpdateCommandResult,\n): Promise<SelfUpdateOutcome> {\n const installError = extractCommandError(installResult);\n const restoreNeeded = !(await isCurrentInstallHealthy(installPaths, backup, update.localVersion));\n\n let restoreMessage = 'previous installation kept intact';\n let combinedError = installError;\n\n if (restoreNeeded) {\n try {\n await restoreInstallBackup(installPaths, backup);\n restoreMessage = 'restored previous installation';\n } catch (restoreError) {\n const restoreText = toErrorMessage(restoreError);\n restoreMessage = `restore attempt failed: ${restoreText}`;\n combinedError = `${installError}; restore failed: ${restoreText}`;\n }\n }\n\n const nextState = cloneAutomationState(checkedState);\n nextState.update.lastError = combinedError;\n nextState.update.lastLocalVersion = update.localVersion;\n nextState.update.lastRemoteVersion = update.remoteVersion;\n nextState.update.lastResult = 'failed';\n\n return {\n changed: hasStateChanged(previousState, nextState),\n message: formatInstallFailureMessage(update.packageName, update.localVersion, update.remoteVersion, combinedError, restoreMessage),\n state: nextState,\n status: 'failed',\n };\n}\n\nasync function resolveInstallPaths(\n packageName: string,\n runner: UpdateCommandRunner,\n options: SelfUpdateOptions,\n): Promise<InstallPaths> {\n const globalRootOutput = await runCommandOrThrow(runner, NPM_COMMAND, ['root', '-g'], options.env);\n const globalPrefixOutput = await runCommandOrThrow(runner, NPM_COMMAND, ['prefix', '-g'], options.env);\n\n const globalNodeModulesRoot = requireTrimmedOutput(globalRootOutput, 'npm root -g');\n const globalPrefix = requireTrimmedOutput(globalPrefixOutput, 'npm prefix -g');\n const currentPackageRoot = options.currentPackageRoot ?? resolveCurrentPackageRootFromUrl(import.meta.url, packageName);\n\n return {\n binPath: resolve(globalPrefix, 'bin', getBinName(packageName)),\n currentPackageRoot: await normalizePath(currentPackageRoot),\n globalPackageRoot: await normalizePath(join(globalNodeModulesRoot, ...packageName.split('/'))),\n };\n}\n\nasync function createInstallBackup(\n installPaths: InstallPaths,\n backupBaseDirectory: string,\n packageName: string,\n): Promise<InstallBackup> {\n if (!existsSync(installPaths.globalPackageRoot)) {\n throw new Error(`installed package path not found: ${installPaths.globalPackageRoot}`);\n }\n\n const backupDirectory = join(backupBaseDirectory, '.ais-update-backups');\n await mkdir(backupDirectory, { recursive: true });\n\n const packageBackupPath = join(backupDirectory, `${getBinName(packageName)}-${Date.now()}.tar`);\n await archiveDirectory(installPaths.globalPackageRoot, packageBackupPath);\n\n return {\n bin: await backupBinPath(installPaths.binPath),\n packageBackupPath,\n };\n}\n\nasync function backupBinPath(binPath: string): Promise<BinBackup> {\n if (!(await pathExists(binPath))) {\n return {\n kind: 'missing',\n originalPath: binPath,\n };\n }\n\n const stats = await lstat(binPath);\n if (stats.isSymbolicLink()) {\n return {\n kind: 'symlink',\n originalPath: binPath,\n target: await readlink(binPath),\n };\n }\n\n return {\n contents: await readFile(binPath),\n kind: 'file',\n mode: stats.mode,\n originalPath: binPath,\n };\n}\n\nasync function restoreInstallBackup(installPaths: InstallPaths, backup: InstallBackup): Promise<void> {\n await rm(installPaths.globalPackageRoot, { force: true, recursive: true });\n await mkdir(dirname(installPaths.globalPackageRoot), { recursive: true });\n await extractArchive(backup.packageBackupPath, dirname(installPaths.globalPackageRoot));\n await restoreBinPath(backup.bin);\n}\n\nasync function restoreBinPath(backup: BinBackup): Promise<void> {\n switch (backup.kind) {\n case 'missing':\n await rm(backup.originalPath, { force: true, recursive: true });\n return;\n\n case 'symlink':\n await rm(backup.originalPath, { force: true, recursive: true });\n await mkdir(dirname(backup.originalPath), { recursive: true });\n await symlink(backup.target, backup.originalPath);\n return;\n\n case 'file':\n await rm(backup.originalPath, { force: true, recursive: true });\n await mkdir(dirname(backup.originalPath), { recursive: true });\n await writeFile(backup.originalPath, backup.contents);\n await chmod(backup.originalPath, backup.mode);\n return;\n }\n}\n\nasync function isCurrentInstallHealthy(\n installPaths: InstallPaths,\n backup: InstallBackup,\n expectedVersion: string,\n): Promise<boolean> {\n try {\n const currentVersion = await readInstalledVersion(installPaths.globalPackageRoot);\n if (currentVersion !== expectedVersion) {\n return false;\n }\n } catch {\n return false;\n }\n\n if (backup.bin.kind === 'missing') {\n return !(await pathExists(installPaths.binPath));\n }\n\n return pathExists(installPaths.binPath);\n}\n\nasync function readInstalledVersion(packageRoot: string): Promise<string> {\n const raw = JSON.parse(await readFile(join(packageRoot, 'package.json'), 'utf8')) as unknown;\n if (!isRecord(raw) || typeof raw.version !== 'string' || raw.version.trim().length === 0) {\n throw new Error(`package.json at ${packageRoot} does not contain a valid version`);\n }\n\n return raw.version;\n}\n\nasync function acquireLock(lockPath: string, payload: UpdateLockPayload): Promise<HeldLock | undefined> {\n const directory = dirname(lockPath);\n await mkdir(directory, { recursive: true });\n\n const stale = await shouldTreatLockAsStale(lockPath, payload.startedAt);\n if (stale) {\n await rm(lockPath, { force: true });\n }\n\n try {\n const handle = await open(lockPath, 'wx', 0o600);\n await handle.writeFile(`${JSON.stringify(payload, null, 2)}\\n`);\n await handle.close();\n\n return {\n async release() {\n await rm(lockPath, { force: true });\n },\n };\n } catch (error) {\n if (isFileExistsError(error)) {\n return undefined;\n }\n\n throw error;\n }\n}\n\nasync function shouldTreatLockAsStale(lockPath: string, now: number): Promise<boolean> {\n if (!(await pathExists(lockPath))) {\n return false;\n }\n\n try {\n const payload = JSON.parse(await readFile(lockPath, 'utf8')) as unknown;\n if (!isRecord(payload)) {\n return true;\n }\n\n const startedAt = typeof payload.startedAt === 'number' ? payload.startedAt : undefined;\n const pid = typeof payload.pid === 'number' ? payload.pid : undefined;\n\n if (startedAt === undefined || now - startedAt > UPDATE_LOCK_STALE_MS) {\n return true;\n }\n\n if (pid === undefined) {\n return true;\n }\n\n return !isProcessAlive(pid);\n } catch {\n return true;\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return error instanceof Error && 'code' in error && error.code === 'EPERM';\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await lstat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function normalizePath(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch {\n return resolve(path);\n }\n}\n\nasync function archiveDirectory(sourcePath: string, archivePath: string): Promise<void> {\n await runCommandOrThrow(runUpdateCommand, 'tar', ['-cf', archivePath, '-C', dirname(sourcePath), basename(sourcePath)]);\n}\n\nasync function extractArchive(archivePath: string, destinationDirectory: string): Promise<void> {\n await runCommandOrThrow(runUpdateCommand, 'tar', ['-xf', archivePath, '-C', destinationDirectory]);\n}\n\nasync function runCommandOrThrow(\n runner: UpdateCommandRunner,\n command: string,\n args: string[],\n env?: NodeJS.ProcessEnv,\n): Promise<string> {\n const result = await runner(command, args, { env });\n if (result.exitCode !== 0) {\n throw new Error(extractCommandError(result));\n }\n\n return result.stdout;\n}\n\nfunction requireTrimmedOutput(output: string, commandLabel: string): string {\n const trimmed = output.trim();\n if (trimmed.length === 0) {\n throw new Error(`${commandLabel} returned an empty response`);\n }\n\n return trimmed;\n}\n\nasync function runUpdateCommand(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n },\n): Promise<UpdateCommandResult> {\n return new Promise<UpdateCommandResult>((resolvePromise, rejectPromise) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n stdout += typeof chunk === 'string' ? chunk : chunk.toString('utf8');\n });\n\n child.stderr.on('data', (chunk: Buffer | string) => {\n stderr += typeof chunk === 'string' ? chunk : chunk.toString('utf8');\n });\n\n child.on('error', rejectPromise);\n child.on('close', (exitCode) => {\n resolvePromise({\n exitCode: exitCode ?? 1,\n stderr,\n stdout,\n });\n });\n });\n}\n\nfunction normalizeStatus(result: AutomationState['update']['lastResult']): SelfUpdateOutcome['status'] {\n switch (result) {\n case 'updated':\n return 'updated';\n case 'up-to-date':\n return 'up-to-date';\n case 'failed':\n return 'failed';\n case 'available':\n return 'available';\n default:\n return 'skipped';\n }\n}\n\nfunction hasStateChanged(previousState: AutomationState, nextState: AutomationState): boolean {\n return JSON.stringify(previousState) !== JSON.stringify(nextState);\n}\n\nfunction getBinName(packageName: string): string {\n const parts = packageName.split('/');\n return parts[parts.length - 1];\n}\n\nfunction formatLockedMessage(packageName: string, localVersion: string, remoteVersion: string): string {\n return `Update available: ${packageName}@${remoteVersion} is already being installed by another AIS process. Continuing with ${localVersion}.`;\n}\n\nfunction formatUnsupportedInstallMessage(packageName: string, localVersion: string, remoteVersion: string): string {\n return `Update available: ${packageName}@${remoteVersion}, but auto update only runs from the npm global installation. Continuing with ${localVersion}.`;\n}\n\nfunction formatSuccessMessage(packageName: string, localVersion: string, remoteVersion: string): string {\n return `Updated ${packageName} from ${localVersion} to ${remoteVersion}. Continuing this run with ${localVersion}; the new version will be used next time.`;\n}\n\nfunction formatFailureMessage(\n packageName: string,\n localVersion: string,\n remoteVersion: string,\n errorMessage: string,\n): string {\n return `Update failed for ${packageName}@${remoteVersion}. Continuing with ${localVersion}: ${errorMessage}`;\n}\n\nfunction formatInstallFailureMessage(\n packageName: string,\n localVersion: string,\n remoteVersion: string,\n errorMessage: string,\n restoreMessage: string,\n): string {\n return `Update failed for ${packageName}@${remoteVersion}. ${restoreMessage}; continuing with ${localVersion}. ${errorMessage}`;\n}\n\nfunction extractCommandError(result: UpdateCommandResult): string {\n const stderr = result.stderr.trim();\n if (stderr.length > 0) {\n return stderr;\n }\n\n const stdout = result.stdout.trim();\n if (stdout.length > 0) {\n return stdout;\n }\n\n return `command exited with ${result.exitCode}`;\n}\n\nfunction isFileExistsError(error: unknown): boolean {\n return error instanceof Error && 'code' in error && error.code === 'EEXIST';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { cloneAutomationState, type AutomationState, type UpdateChannel } from '../automation/index.js';\nimport type { PackageInfo } from '../package-info.js';\n\nconst DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org';\nconst UPDATE_CHECK_TIMEOUT_MS = 1500;\nconst SEMVER_PATTERN =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nexport interface UpdateCheckSettings {\n channel: UpdateChannel;\n checkIntervalMinutes: number;\n enabled: boolean;\n forceCheck?: boolean;\n silent: boolean;\n skipCheck: boolean;\n}\n\nexport interface MaybeCheckForUpdatesOptions {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: typeof fetch;\n now?: () => number;\n packageInfo: PackageInfo;\n}\n\nexport interface UpdateCheckOutcome {\n changed: boolean;\n message?: string;\n state: AutomationState;\n}\n\ninterface RegistryManifest {\n 'dist-tags': Record<string, unknown>;\n}\n\ninterface ParsedSemver {\n major: number;\n minor: number;\n patch: number;\n prerelease: Array<number | string>;\n}\n\nexport async function maybeCheckForUpdates(\n state: AutomationState,\n settings: UpdateCheckSettings,\n options: MaybeCheckForUpdatesOptions,\n): Promise<UpdateCheckOutcome> {\n const now = (options.now ?? Date.now)();\n const nextState = cloneAutomationState(state);\n const { packageInfo } = options;\n\n nextState.update.lastChannel = settings.channel;\n nextState.update.lastLocalVersion = packageInfo.version;\n\n if (!settings.enabled) {\n nextState.update.lastResult = 'skipped';\n nextState.update.lastError = undefined;\n return buildOutcome(state, nextState);\n }\n\n if (settings.skipCheck) {\n nextState.update.lastResult = 'skipped';\n nextState.update.lastError = undefined;\n return buildOutcome(state, nextState);\n }\n\n if (nextState.update.skipNextCheck) {\n nextState.update.lastResult = 'skipped';\n nextState.update.lastError = undefined;\n nextState.update.skipNextCheck = false;\n return buildOutcome(state, nextState);\n }\n\n if (!settings.forceCheck && shouldThrottle(state, settings, packageInfo.version, now)) {\n return buildOutcome(state, nextState);\n }\n\n try {\n const remoteVersion = await fetchRemoteVersion(settings.channel, options.fetchImpl ?? fetch, options.packageInfo.name);\n nextState.update.lastCheckedAt = now;\n nextState.update.lastError = undefined;\n nextState.update.lastRemoteVersion = remoteVersion;\n nextState.update.lastResult = compareVersions(remoteVersion, packageInfo.version) > 0 ? 'available' : 'up-to-date';\n\n const message =\n nextState.update.lastResult === 'available'\n ? formatUpdateAvailableMessage(packageInfo.name, packageInfo.version, remoteVersion, settings.channel)\n : settings.silent\n ? undefined\n : formatUpToDateMessage(packageInfo.version, settings.channel);\n\n return buildOutcome(state, nextState, message);\n } catch (error) {\n nextState.update.lastCheckedAt = now;\n nextState.update.lastError = toErrorMessage(error);\n nextState.update.lastRemoteVersion = undefined;\n nextState.update.lastResult = 'failed';\n\n return buildOutcome(\n state,\n nextState,\n settings.silent ? undefined : formatFailureMessage(nextState.update.lastError),\n );\n }\n}\n\nexport function compareVersions(left: string, right: string): number {\n const leftVersion = parseSemver(left);\n const rightVersion = parseSemver(right);\n\n if (leftVersion.major !== rightVersion.major) {\n return leftVersion.major - rightVersion.major;\n }\n\n if (leftVersion.minor !== rightVersion.minor) {\n return leftVersion.minor - rightVersion.minor;\n }\n\n if (leftVersion.patch !== rightVersion.patch) {\n return leftVersion.patch - rightVersion.patch;\n }\n\n if (leftVersion.prerelease.length === 0 && rightVersion.prerelease.length === 0) {\n return 0;\n }\n\n if (leftVersion.prerelease.length === 0) {\n return 1;\n }\n\n if (rightVersion.prerelease.length === 0) {\n return -1;\n }\n\n const length = Math.max(leftVersion.prerelease.length, rightVersion.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const leftIdentifier = leftVersion.prerelease[index];\n const rightIdentifier = rightVersion.prerelease[index];\n\n if (leftIdentifier === undefined) {\n return -1;\n }\n\n if (rightIdentifier === undefined) {\n return 1;\n }\n\n if (leftIdentifier === rightIdentifier) {\n continue;\n }\n\n const leftIsNumber = typeof leftIdentifier === 'number';\n const rightIsNumber = typeof rightIdentifier === 'number';\n\n if (leftIsNumber && rightIsNumber) {\n return leftIdentifier - rightIdentifier;\n }\n\n if (leftIsNumber) {\n return -1;\n }\n\n if (rightIsNumber) {\n return 1;\n }\n\n return leftIdentifier.localeCompare(rightIdentifier);\n }\n\n return 0;\n}\n\nasync function fetchRemoteVersion(\n channel: UpdateChannel,\n fetchImpl: typeof fetch,\n packageName: string,\n): Promise<string> {\n const response = await fetchWithTimeout(fetchImpl, buildRegistryUrl(packageName));\n const payload = (await response.json()) as unknown;\n const manifest = parseRegistryManifest(payload);\n const version = manifest['dist-tags'][channel];\n\n if (typeof version !== 'string' || version.trim().length === 0) {\n throw new Error(`registry did not return a version for channel \"${channel}\"`);\n }\n\n parseSemver(version);\n return version;\n}\n\nasync function fetchWithTimeout(fetchImpl: typeof fetch, url: string): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), UPDATE_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetchImpl(url, {\n headers: {\n accept: 'application/json',\n },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw new Error(`registry responded with ${response.status}`);\n }\n\n return response;\n } catch (error) {\n if (isAbortError(error)) {\n throw new Error(`timed out after ${UPDATE_CHECK_TIMEOUT_MS}ms`);\n }\n\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction buildRegistryUrl(packageName: string): string {\n const base = normalizeRegistryBase(DEFAULT_REGISTRY_URL);\n return new URL(encodeURIComponent(packageName), base).toString();\n}\n\nfunction normalizeRegistryBase(input: string): string {\n return input.endsWith('/') ? input : `${input}/`;\n}\n\nfunction parseRegistryManifest(value: unknown): RegistryManifest {\n if (!isRecord(value)) {\n throw new Error('registry response root must be an object');\n }\n\n if (!isRecord(value['dist-tags'])) {\n throw new Error('registry response dist-tags must be an object');\n }\n\n return {\n 'dist-tags': value['dist-tags'],\n };\n}\n\nfunction parseSemver(version: string): ParsedSemver {\n const match = SEMVER_PATTERN.exec(version);\n if (!match) {\n throw new Error(`invalid version: ${version}`);\n }\n\n const prerelease = match[4]\n ? match[4].split('.').map((identifier) => (/^\\d+$/.test(identifier) ? Number.parseInt(identifier, 10) : identifier))\n : [];\n\n return {\n major: Number.parseInt(match[1], 10),\n minor: Number.parseInt(match[2], 10),\n patch: Number.parseInt(match[3], 10),\n prerelease,\n };\n}\n\nfunction shouldThrottle(\n state: AutomationState,\n settings: UpdateCheckSettings,\n currentVersion: string,\n now: number,\n): boolean {\n if (state.update.lastCheckedAt === undefined) {\n return false;\n }\n\n if (state.update.lastChannel !== settings.channel) {\n return false;\n }\n\n if (state.update.lastLocalVersion !== currentVersion) {\n return false;\n }\n\n const intervalMs = settings.checkIntervalMinutes * 60_000;\n return now - state.update.lastCheckedAt < intervalMs;\n}\n\nfunction buildOutcome(previousState: AutomationState, nextState: AutomationState, message?: string): UpdateCheckOutcome {\n return {\n changed: JSON.stringify(previousState) !== JSON.stringify(nextState),\n message,\n state: nextState,\n };\n}\n\nfunction formatUpdateAvailableMessage(\n packageName: string,\n localVersion: string,\n remoteVersion: string,\n channel: UpdateChannel,\n): string {\n return `Update available: ${packageName}@${remoteVersion} on ${channel}. Continuing with ${localVersion}. Install manually for now: npm install -g ${packageName}@${remoteVersion} --registry ${DEFAULT_REGISTRY_URL}`;\n}\n\nfunction formatUpToDateMessage(localVersion: string, channel: UpdateChannel): string {\n return `Update check: already on ${localVersion} for channel ${channel}.`;\n}\n\nfunction formatFailureMessage(errorMessage: string): string {\n return `Update check failed, continuing without update: ${errorMessage}`;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortError';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { runCli } from './cli-app.js';\n\nconst exitCode = await runCli(process.argv.slice(2));\nif (exitCode !== 0) {\n process.exit(exitCode);\n}\n"],"mappings":"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","names":["existsSync","fileURLToPath","dirname","cursor","dedupe","require","resolve","exitCode","randomUUID","join","isRecord","resolve","body","headers","join","randomUUID","chmodSync","existsSync","mkdir","writeFile","dirname","join","join","resolve","existsSync","mkdir","dirname","writeFile","chmodSync","randomBytes","randomUUID","randomUUID","randomBytes","dirname","toErrorMessage","isRecord","spawn","existsSync","readFileSync","mkdir","readFile","writeFile","dirname","join","toErrorMessage","isRecord","dirname","join","existsSync","readFileSync","isRecord","toErrorMessage","formatFailureMessage","mkdir","readFile","writeFile","spawn","exitCode","excluded","fileURLToPath","existsSync","resolve"]}
|