@xisui-pa/chatserver 1.0.0 → 1.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/README.md +142 -39
- package/dist/index.js +1670 -569
- package/dist/index.js.map +1 -1
- package/dist/models/chatserver-models.js +116 -59
- package/dist/models/chatserver-models.js.map +1 -1
- package/package.json +1 -1
- package/schemas/config.schema.json +14 -13
- package/schemas/models.schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models/chatserver-models.js","mappings":"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","sources":["webpack:///./src/config-dir.ts","webpack:///./src/limit.ts","webpack:///./src/messagers/audio.ts","webpack:///./src/messagers/media.ts","webpack:///./src/models/add.ts","webpack:///./src/models/audio-conversion.ts","webpack:///./src/models/cli-support.ts","webpack:///./src/models/command-support.ts","webpack:///./src/models/credentials.ts","webpack:///./src/models/list.ts","webpack:///./src/models/model-store.ts","webpack:///./src/models/remove.ts","webpack:///./src/models/responses-client.ts","webpack:///./src/models/retry.ts","webpack:///./src/models/setup.ts","webpack:///./src/models/speech-client.ts","webpack:///./src/models/test-stt.ts","webpack:///./src/models/test-tts.ts","webpack:///./src/models/test.ts","webpack:///./src/models/transcriptions-client.ts","webpack:///./src/models/update.ts","webpack:///./src/models/voice-synthesizer.ts","webpack:///external node-commonjs \"node:child_process\"","webpack:///external node-commonjs \"node:crypto\"","webpack:///external node-commonjs \"node:fs\"","webpack:///external node-commonjs \"node:os\"","webpack:///external node-commonjs \"node:path\"","webpack:///external node-commonjs \"node:readline/promises\"","webpack:///external node-commonjs \"node:timers/promises\"","webpack:///webpack/bootstrap","webpack:///./src/models/chatserver-models.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\n/**\n * Returns the platform-appropriate per-user config folder.\n */\nexport function getDefaultConfigDir(platform: NodeJS.Platform = process.platform): string {\n const home = os.homedir();\n\n switch (platform) {\n case 'win32': {\n const appData = process.env.APPDATA ?? path.join(home, 'AppData', 'Roaming');\n return path.join(appData, 'chatserver');\n }\n case 'darwin':\n return path.join(home, 'Library', 'Application Support', 'chatserver');\n default: {\n const configHome = process.env.XDG_CONFIG_HOME ?? path.join(home, '.config');\n return path.join(configHome, 'chatserver');\n }\n }\n}\n","// Keep matching config schema defaults and bounds in sync when changing them here.\n\n// Model input and conversation snapshots.\n/**\n * Budget calculations with the current values:\n * - Recent-message JSON: CONVERSATION_TEXT_TOKENS - CONVERSATION_METADATA_TOKENS\n * = 8,000 - 1,500 = 6,500 tokens; the snapshot including metadata gets 8,000.\n * - Combined text allowance: CONVERSATION_TEXT_TOKENS + MESSAGER_CONTEXT_TOKENS\n * + MAX_MEMORY_TOKEN_LIMIT = 8,000 + 2,000 + 16,000 = 26,000 tokens.\n * With the default memory limit: 8,000 + 2,000 + 1,000 = 11,000 tokens.\n * Metadata is already included in CONVERSATION_TEXT_TOKENS; do not add it again.\n * Actual memory uses messager.memoryTokenLimit; context and memory may be absent.\n * These sums exclude instructions, tool definitions/results, image estimates, and\n * wrapping serialization overhead. The complete input must fit MODEL_INPUT_TOKENS\n * (64,000 tokens), checked separately for each model request.\n */\n/** Text budget for the recent-message snapshot and its metadata. */\nexport const CONVERSATION_TEXT_TOKENS = 8_000;\n/** Snapshot tokens reserved for metadata rather than message text. */\nexport const CONVERSATION_METADATA_TOKENS = 1_500;\n/** Maximum recent source messages retained per conversation. */\nexport const MAX_MESSAGES_PER_SNAPSHOT = 30;\n/** Maximum text tokens retained from one source message. */\nexport const MESSAGE_TEXT_TOKENS = 2_000;\n/** Fallback text budget when the last snapshot message is still too large. */\nexport const MIN_MESSAGE_TEXT_TOKENS = 500;\n/** Maximum tokens for a sender or channel identifier in model input. */\nexport const CONVERSATION_ID_TOKENS = 100;\n/** Maximum tokens for one sender display name in conversational context. */\nexport const SENDER_NAME_TOKENS = 100;\n/** Separate token budget for the optional messager context file. */\nexport const MESSAGER_CONTEXT_TOKENS = 2_000;\n/** Total application input budget, including instructions, tools, and images. */\nexport const MODEL_INPUT_TOKENS = 64_000;\n/** Maximum retained tokens from one tool result. */\nexport const TOOL_RESULT_TOKENS = 8_000;\n/** Estimated input tokens reserved per image, independent of provider billing. */\nexport const IMAGE_TOKEN_RESERVE = 2_048;\n/** Tokens reserved for the truncation marker when bounding text. */\nexport const TRUNCATION_MARKER_TOKENS = 8;\n\n// Public replies and persistent conversation memory.\n/** Prompt target for a complete, concise public reply. */\nexport const SOFT_REPLY_TOKEN_LIMIT = 150;\n/** Hard token cap applied to outgoing reply text. */\nexport const HARD_REPLY_TOKEN_LIMIT = 200;\n/** Default per-conversation budget for memory notes and confirmed replies. */\nexport const DEFAULT_MEMORY_TOKEN_LIMIT = 1_000;\n/** Smallest configurable memory budget, allowing room for entry metadata. */\nexport const MIN_MEMORY_TOKEN_LIMIT = 100;\n/** Largest configurable memory budget and memory input allowance. */\nexport const MAX_MEMORY_TOKEN_LIMIT = 16_000;\n/** Memory lifetime measured from the earliest original source. */\nexport const MEMORY_RETENTION_MS = 3 * 24 * 60 * 60 * 1_000;\n/** Interval between cleanup passes over inactive memory files. */\nexport const MEMORY_CLEANUP_INTERVAL_MS = 60 * 60 * 1_000;\n/** Maximum memory file size accepted from disk. */\nexport const MAX_MEMORY_FILE_BYTES = 256 * 1_024;\n/** Maximum retained text tokens in a single memory note. */\nexport const MEMORY_NOTE_TOKENS = 300;\n/** Maximum characters accepted in a model-proposed memory note. */\nexport const MAX_MEMORY_NOTE_CHARS = 4_000;\n/** Maximum new or replacement memory notes proposed per turn. */\nexport const MAX_MEMORY_NOTES_PER_UPDATE = 20;\n/** Maximum existing note IDs the model may forget per turn. */\nexport const MAX_MEMORY_FORGET_IDS = 50;\n/** Maximum supporting source IDs per proposed memory note. */\nexport const MAX_MEMORY_SOURCE_IDS = 64;\n/** Maximum characters in a stored memory ID or cited source ID. */\nexport const MAX_MEMORY_ID_CHARS = 128;\n\n// Images, voice input, and local audio conversion.\n/** Default maximum generated image width in pixels. */\nexport const DEFAULT_IMAGE_WIDTH_LIMIT = 1024;\n/** Default maximum generated image height in pixels. */\nexport const DEFAULT_IMAGE_HEIGHT_LIMIT = 1024;\n/** Daily image generation allowance shared by a messager's conversations. */\nexport const DEFAULT_DAILY_IMAGE_GEN_LIMIT = 10;\n/** Maximum decoded bytes in one received image. */\nexport const MAX_IMAGE_BYTES = 5 * 1_024 * 1_024;\n/** Maximum base64 characters encoding an allowed image. */\nexport const MAX_ENCODED_IMAGE_BYTES = 4 * Math.ceil(MAX_IMAGE_BYTES / 3);\n/** Maximum decoded bytes in one voice recording or converted audio file. */\nexport const MAX_AUDIO_BYTES = 20 * 1_024 * 1_024;\n/** Maximum base64 characters encoding an allowed voice recording. */\nexport const MAX_ENCODED_AUDIO_BYTES = 4 * Math.ceil(MAX_AUDIO_BYTES / 3);\n/** Maximum images attached to a single model snapshot. */\nexport const MAX_IMAGES_PER_SNAPSHOT = 4;\n/** Maximum persisted images per conversation; oldest images are evicted first. */\nexport const MAX_CACHED_IMAGES_PER_CONVERSATION = 30;\n/** Maximum bytes in a conversation's image map, separate from its text memory. */\nexport const MAX_IMAGE_CACHE_FILE_BYTES = 64 * 1_024 * 1_024;\n/** Prompt allowance for references to older cached images, excluding image bytes. */\nexport const CACHED_IMAGE_REFERENCE_TOKENS = 1_000;\n/** Maximum download attempts per image or voice source. */\nexport const MAX_MEDIA_ATTEMPTS = 3;\n/** Extra JSON response bytes allowed around base64 media. */\nexport const MEDIA_RESPONSE_OVERHEAD_BYTES = 64 * 1_024;\n/** Maximum characters accepted from a speech-to-text model. */\nexport const MAX_TRANSCRIPT_CHARS = 32_000;\n/** Default deadline for a local audio conversion command. */\nexport const AUDIO_CONVERSION_TIMEOUT_MS = 30_000;\n/** Maximum stderr characters retained from an audio converter. */\nexport const AUDIO_CONVERSION_STDERR_CHARS = 8_192;\n/** Maximum retries when deleting audio conversion temporary files. */\nexport const AUDIO_CLEANUP_RETRIES = 3;\n/** Delay between retries deleting conversion temporary files. */\nexport const AUDIO_CLEANUP_RETRY_DELAY_MS = 100;\n/** Minimum independently sampled silence before and after a synthesized reply. */\nexport const MIN_VOICE_PADDING_MS = 500;\n/** Inclusive maximum independently sampled silence at each end of a voice reply. */\nexport const MAX_VOICE_PADDING_MS = 2_000;\n/** Maximum characters submitted to a speech synthesis endpoint. */\nexport const MAX_TTS_INPUT_CHARS = 4_096;\n/** Maximum wait for a WeChat voice job to confirm delivery. */\nexport const WECHAT_VOICE_JOB_TIMEOUT_MS = 180_000;\n/** Interval between status checks of a submitted WeChat voice job. */\nexport const WECHAT_VOICE_JOB_POLL_MS = 1_000;\n/** Deadline for a best-effort voice-job cancellation after failure or shutdown. */\nexport const WECHAT_VOICE_CANCEL_TIMEOUT_MS = 5_000;\n\n// Model requests, pacing, and transport defaults.\n/** Largest duration supported by Node timers; a platform bound. */\nexport const MAX_TIMER_MS = 2_147_483_647;\n/** Default provider deadline for generation and transcription requests. */\nexport const DEFAULT_MODEL_TIMEOUT_MS = 180_000;\n/** Retries after the initial attempt of a complete model generation. */\nexport const MAX_MODEL_RETRIES = 3;\n/** Delay between complete model-generation retries. */\nexport const MODEL_RETRY_DELAY_MS = 10_000;\n/** Maximum calls per tool category and local tool-producing rounds per generation attempt. */\nexport const MAX_MODEL_TOOL_CALLS = 8;\n/** Maximum wait for model discovery in guided setup. */\nexport const MODEL_DISCOVERY_TIMEOUT_MS = 10_000;\n/** Maximum choices printed when guided setup also accepts a custom value. */\nexport const MAX_SETUP_CHOICES = 30;\n/** Minimum random delay before a reply slot becomes available. */\nexport const MIN_REPLY_DELAY_MS = 60_000;\n/** Inclusive maximum random delay before a reply slot becomes available. */\nexport const MAX_REPLY_DELAY_MS = 180_000;\n/** Maximum deferred conversation retries for pending media. */\nexport const MAX_PENDING_MEDIA_RETRIES = 2;\n/** Initial delay for pending-media retries; doubles on each retry. */\nexport const PENDING_MEDIA_RETRY_DELAY_MS = 30_000;\n/** Default delay after a completed WeChat poll. */\nexport const WECHAT_POLL_INTERVAL_MS = 30_000;\n/** Default deadline for each WeChat REST request. */\nexport const WECHAT_REQUEST_TIMEOUT_MS = 30_000;\n/** Default maximum timestamp gap for adjacent same-sender bundles. */\nexport const WECHAT_BUNDLE_GAP_MS = 20_000;\n/** Maximum exponent used by WeChat polling failure backoff. */\nexport const WECHAT_MAX_BACKOFF_EXPONENT = 6;\n/** Chat rows requested per WeChat API page. */\nexport const WECHAT_CHAT_PAGE_SIZE = 100;\n/** Message rows requested per WeChat API page. */\nexport const WECHAT_MESSAGE_PAGE_SIZE = 50;\n/** Default interval between ignore-file reload checks; zero disables caching. */\nexport const IGNORE_FILE_RELOAD_INTERVAL_MS = 1_000;\n\n// Tool execution and web content.\n/** Maximum characters in one serialized tool argument object. */\nexport const MAX_TOOL_ARGUMENT_CHARS = 16_384;\n/** Maximum characters in one serialized tool execution result. */\nexport const MAX_TOOL_OUTPUT_CHARS = 32_768;\n/** Maximum transferred bytes in a downloaded web page. */\nexport const MAX_WEB_DOWNLOAD_BYTES = 1_048_576;\n/** Maximum decoded bytes in a web page after decompression. */\nexport const MAX_WEB_DECODED_BYTES = 1_048_576;\n/** Shared deadline for a web download and all its redirects. */\nexport const WEB_REQUEST_TIMEOUT_MS = 15_000;\n/** Maximum redirects followed while reading a public web page. */\nexport const MAX_WEB_REDIRECTS = 5;\n/** Maximum characters in a URL accepted by read_url. */\nexport const MAX_READ_URL_CHARS = 2_048;\n/** Maximum readable characters extracted from one web page. */\nexport const MAX_WEB_TEXT_CHARS = 20_000;\n/** Text-length threshold for marking a page as possibly truncated. */\nexport const WEB_TRUNCATION_THRESHOLD_CHARS = MAX_WEB_TEXT_CHARS - 100;\n/** Maximum HTML nodes visited during traversal or text extraction. */\nexport const MAX_HTML_NODES = 100_000;\n/** Maximum characters retained in a web page title. */\nexport const MAX_WEB_TITLE_CHARS = 500;\n/** Maximum results returned by the built-in web search provider. */\nexport const MAX_SEARCH_RESULTS = 5;\n/** Maximum characters accepted in a web search query. */\nexport const MAX_SEARCH_QUERY_CHARS = 500;\n/** Maximum characters retained in one search-result snippet. */\nexport const MAX_SEARCH_SNIPPET_CHARS = 1_000;\n/** Maximum characters retained in one search-result title. */\nexport const MAX_SEARCH_TITLE_CHARS = 300;\n/** Maximum characters accepted in a calculator expression. */\nexport const MAX_CALCULATE_EXPRESSION_CHARS = 1_000;\n/** Maximum arithmetic grammar tokens accepted by the calculator. */\nexport const MAX_CALCULATE_TOKENS = 256;\n/** Maximum arguments accepted by the calculator's min/max functions. */\nexport const MAX_CALCULATE_ARGUMENTS = 16;\n/** Maximum characters accepted in a current_time timezone name. */\nexport const MAX_TIMEZONE_CHARS = 100;\n","import { MAX_AUDIO_BYTES, MAX_ENCODED_AUDIO_BYTES } from '../limit';\nimport { AudioFile } from './interface';\nimport { MediaUnavailableError } from './media';\n\nconst formats: Record<string, string> = {\n mp3: 'audio/mpeg', mpeg: 'audio/mpeg', mpga: 'audio/mpeg',\n wav: 'audio/wav', ogg: 'audio/ogg', flac: 'audio/flac',\n m4a: 'audio/mp4', mp4: 'audio/mp4', webm: 'audio/webm'\n};\n\n/** Decodes supported upstream audio without writing files or attempting local conversion. */\nexport function audioFile(data: string, format: string, id: number): AudioFile {\n const extension = format.toLowerCase();\n const mimeType = formats[extension];\n if (!Object.hasOwn(formats, extension)) {\n throw new MediaUnavailableError(`Unsupported voice format \"${format}\"; agent-wechat must convert SILK to MP3.`);\n }\n if (!data || data.length > MAX_ENCODED_AUDIO_BYTES || data.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/.test(data)) {\n throw new MediaUnavailableError(`Voice data must be valid base64 no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const bytes = Buffer.from(data, 'base64');\n if (bytes.length > MAX_AUDIO_BYTES || bytes.toString('base64') !== data ||\n bytes.subarray(0, 16).toString('ascii').includes('#!SILK')) {\n throw new MediaUnavailableError('Voice data is invalid, oversized, or unconverted SILK.');\n }\n return { data: bytes, filename: `voice_${id}.${extension}`, mimeType };\n}\n","/** A terminal media failure; retrying the same bytes will not help. */\nexport class MediaUnavailableError extends Error {}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { createCredentialStore } from './credentials';\nimport { CliError, hasFlag, optionalValue, promptLine, resolveConfigDir } from './cli-support';\nimport { modelTimeoutOption, newApiKey, parseCommandOptions } from './command-support';\nimport { setupBaseUrl, setupInteractive, setupModelId, setupPrompt, setupProvider, setupValue } from './setup';\nimport {\n ensureProvider,\n findModel,\n findProvider,\n loadModels,\n saveModels,\n upsertModel\n} from './model-store';\n\n/**\n * Help text for `chatserver-models add`.\n */\nexport const ADD_HELP = `Usage: chatserver-models add [options]\n\nAdds a model to a provider in models.json and stores the provider's API key in the OS\ncredential manager. The provider is created when it does not exist yet.\nRun without options for guided setup. Missing provider/model details are prompted\nin a terminal; available model IDs are fetched from the provider when possible.\n\nOptions:\n --provider <name> Provider name, also the credential account\n --model <id> Model identifier sent to the API\n --name <name> Name used to refer to the model (default: the model id)\n --base-url <url> OpenAI-compatible base URL (required for new providers)\n --api-key <key> API key to store for the provider\n --timeout <ms> Provider model timeout (default: ${DEFAULT_MODEL_TIMEOUT_MS} for new providers)\n --config_dir <dir> Config folder\n --force Overwrite an existing model without asking\n -i, --interactive Prompt for the optional model name too\n -h, --help Show this help\n\nWhen the provider has no stored key, the API key is read from --api-key,\nOPENAI_API_KEY, or an interactive prompt, in that order. It is never written to\nmodels.json.\nWithout a terminal, pass --provider and --model, plus --base-url for new providers.\n`;\n\n/**\n * Adds a model to a provider, creating the provider when needed.\n */\nexport async function runAdd(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: {\n '--provider': 'provider',\n '--name': 'name',\n '--model': 'model',\n '--base-url': 'baseUrl',\n '--api-key': 'apiKey',\n '--timeout': 'timeout'\n },\n booleanFlags: { '--force': 'force', '--interactive': 'interactive', '-i': 'interactive' }\n });\n\n if (hasFlag(cli, 'help')) {\n console.log(ADD_HELP);\n return;\n }\n\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n const guided = setupInteractive(cli, optionalValue(cli, 'provider') === undefined || optionalValue(cli, 'model') === undefined);\n const suppliedId = setupValue(cli, 'model', '--model');\n const suppliedName = setupValue(cli, 'name', '--name');\n const suppliedKey = setupValue(cli, 'apiKey', '--api-key');\n const urlValue = setupValue(cli, 'baseUrl', '--base-url');\n let baseUrl = urlValue === undefined ? undefined : setupBaseUrl(urlValue);\n const timeoutValue = optionalValue(cli, 'timeout');\n const timeoutMs = timeoutValue === undefined ? undefined : modelTimeoutOption(timeoutValue);\n const file = await loadModels(configDir);\n const providerName = await setupProvider(file, cli, true);\n if (providerName.includes('/')) {\n throw new CliError('Provider names cannot contain / because config references use provider/model-id.');\n }\n if (suppliedId === undefined && !process.stdin.isTTY) {\n throw new CliError('--model is required without a terminal.');\n }\n\n const existingProvider = findProvider(file, providerName);\n if (existingProvider === undefined && baseUrl === undefined) {\n if (!process.stdin.isTTY) {\n throw new CliError('--base-url is required when creating a provider.');\n }\n baseUrl = await setupPrompt('API base URL (for example http://host.local:1234/v1)', undefined, setupBaseUrl);\n }\n const provider = existingProvider ?? ensureProvider(file, providerName, baseUrl ?? '');\n\n if (existingProvider !== undefined && baseUrl !== undefined) {\n provider.baseUrl = baseUrl;\n }\n if (timeoutMs !== undefined) {\n provider.timeoutMs = timeoutMs;\n }\n\n // Reuse the provider's saved key. An unrelated OPENAI_API_KEY must not rotate it.\n const credentials = createCredentialStore();\n const storedKey = suppliedKey === undefined ? await credentials.get(providerName) : undefined;\n const needsKey = suppliedKey !== undefined || !storedKey;\n const apiKey = suppliedKey ?? (storedKey || await newApiKey(cli, providerName));\n const modelId = suppliedId ?? await setupModelId(provider, apiKey);\n const name = suppliedName ?? (guided ? await setupPrompt('Model name', modelId) : modelId);\n\n if (findModel(provider, name) !== undefined && !hasFlag(cli, 'force')) {\n if (!process.stdin.isTTY) {\n throw new CliError(`Model \"${name}\" already exists. Re-run with --force to overwrite it.`);\n }\n const answer = await promptLine(`Model \"${name}\" already exists. Overwrite? [y/N] `);\n if (!/^y(es)?$/i.test(answer)) {\n console.log('Cancelled.');\n return;\n }\n }\n\n if (needsKey) {\n await credentials.set(providerName, apiKey);\n console.log(`API key stored in the ${credentials.name} (account: \"${providerName}\").`);\n }\n\n upsertModel(provider, { id: modelId, name });\n const modelsPath = await saveModels(configDir, file);\n\n console.log(`Saved model \"${name}\" (${modelId}) to ${modelsPath}.`);\n console.log(`Config reference: ${providerName}/${modelId}`);\n console.log(`Test it with: chatserver-models test --provider \"${providerName}\" --name \"${name}\" --config_dir \"${configDir}\"`);\n}\n","import {\n AUDIO_CLEANUP_RETRIES,\n AUDIO_CLEANUP_RETRY_DELAY_MS,\n AUDIO_CONVERSION_STDERR_CHARS,\n AUDIO_CONVERSION_TIMEOUT_MS,\n MAX_AUDIO_BYTES,\n MAX_TIMER_MS\n} from '../limit';\nimport { spawn } from 'node:child_process';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { AudioFile } from '../messagers/interface';\n\n/** Runs a configured command with bounded diagnostics, cancellation, and a process-tree deadline. */\nasync function runConversion(command: string, directory: string, timeoutMs: number, signal?: AbortSignal): Promise<void> {\n signal?.throwIfAborted();\n return new Promise((resolve, reject) => {\n const child = spawn(command, {\n cwd: directory, shell: true, windowsHide: true,\n detached: process.platform !== 'win32', stdio: ['ignore', 'ignore', 'pipe']\n });\n let stderr = '';\n let settled = false;\n const finish = (error?: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n if (error === undefined) {\n resolve();\n } else {\n reject(error);\n }\n };\n const stop = (error: Error): void => {\n if (settled) {\n return;\n }\n if (child.pid !== undefined) {\n if (process.platform === 'win32') {\n const killer = spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' });\n killer.on('error', () => child.kill('SIGKILL'));\n killer.unref();\n } else {\n try {\n process.kill(-child.pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n }\n }\n child.stderr?.destroy();\n child.unref();\n finish(error);\n };\n const abort = (): void => stop(signal?.reason instanceof Error ? signal.reason : new Error('Audio conversion cancelled.'));\n const timer = setTimeout(() => stop(new Error(`Audio conversion timed out after ${timeoutMs} ms.`)), timeoutMs);\n child.stderr?.setEncoding('utf8');\n child.stderr?.on('data', (chunk: string) => {\n stderr = (stderr + chunk).slice(0, AUDIO_CONVERSION_STDERR_CHARS);\n });\n child.on('error', () => finish(new Error('Unable to start audioConversionCmd. Check the command and installed converter.')));\n child.on('close', (code) => finish(code === 0 ? undefined :\n new Error(`Audio conversion failed (exit ${code ?? 'unknown'})${stderr.trim() ? `: ${stderr.trim()}` : '.'}`)));\n signal?.addEventListener('abort', abort, { once: true });\n if (signal?.aborted) {\n abort();\n }\n });\n}\n\n/** Converts input to a real WAV file in an isolated temporary directory, then removes both files. */\nexport async function convertAudio(\n audio: AudioFile,\n command: string,\n signal?: AbortSignal,\n timeoutMs = AUDIO_CONVERSION_TIMEOUT_MS\n): Promise<AudioFile> {\n signal?.throwIfAborted();\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_TIMER_MS) {\n throw new Error(`Audio conversion timeout must be a positive integer up to ${MAX_TIMER_MS}.`);\n }\n if (!command.includes('{input}') || !command.includes('{output}')) {\n throw new Error('audioConversionCmd must contain {input} and {output} placeholders.');\n }\n if (!audio.data.byteLength || audio.data.byteLength > MAX_AUDIO_BYTES) {\n throw new Error(`Audio conversion input must be nonempty and no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const directory = await fs.mkdtemp(path.join(os.tmpdir(), 'chatserver-audio-'));\n const extension = path.extname(audio.filename);\n const inputName = `input${/^\\.[a-z0-9]+$/i.test(extension) ? extension : '.bin'}`;\n const outputName = 'output.wav';\n try {\n await fs.writeFile(path.join(directory, inputName), audio.data, { mode: 0o600 });\n // Only generated ASCII filenames enter the command; message content and paths never do.\n const expanded = command.replaceAll('{input}', inputName).replaceAll('{output}', outputName);\n await runConversion(expanded, directory, timeoutMs, signal);\n signal?.throwIfAborted();\n const outputPath = path.join(directory, outputName);\n let stat;\n try {\n stat = await fs.lstat(outputPath);\n } catch {\n throw new Error('audioConversionCmd did not create its {output} WAV file.');\n }\n if (!stat.isFile() || stat.size < 44 || stat.size > MAX_AUDIO_BYTES) {\n throw new Error(`Converted audio must be a nonempty WAV file no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const data = await fs.readFile(outputPath);\n if (data.subarray(0, 4).toString('ascii') !== 'RIFF' || data.subarray(8, 12).toString('ascii') !== 'WAVE') {\n throw new Error('audioConversionCmd must produce WAV data, not just rename the input.');\n }\n return { data, mimeType: 'audio/wav', filename: `${path.basename(audio.filename, extension) || 'voice'}.wav` };\n } finally {\n await fs.rm(directory, { recursive: true, force: true, maxRetries: AUDIO_CLEANUP_RETRIES, retryDelay: AUDIO_CLEANUP_RETRY_DELAY_MS });\n }\n}\n","import path from 'node:path';\nimport * as readline from 'node:readline/promises';\nimport { getDefaultConfigDir } from '../config-dir';\n\n/**\n * Raised for invalid command-line usage.\n */\nexport class CliError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = 'CliError';\n }\n}\n\n/**\n * Describes which command-line options carry a value and which are booleans.\n */\nexport interface CommandLineSpec {\n /** Map of flag spelling (including dashes) to a stable value key. */\n valueFlags: Record<string, string>;\n /** Map of flag spelling (including dashes) to a stable boolean key. */\n booleanFlags: Record<string, string>;\n}\n\n/**\n * Parsed command line.\n */\nexport interface CommandLine {\n /** Values keyed by the names from {@link CommandLineSpec.valueFlags}. */\n values: Map<string, string>;\n /** Boolean flags keyed by the names from {@link CommandLineSpec.booleanFlags}. */\n flags: Set<string>;\n /** Arguments that were not options. */\n positionals: string[];\n}\n\n/**\n * Splits `--flag=value` into its name and inline value.\n */\nfunction splitFlag(arg: string): [string, string | undefined] {\n const index = arg.indexOf('=');\n if (index === -1) {\n return [arg, undefined];\n }\n return [arg.slice(0, index), arg.slice(index + 1)];\n}\n\n/**\n * Parses `--flag value`, `--flag=value`, and boolean flags.\n */\nexport function parseCommandLine(argv: string[], spec: CommandLineSpec): CommandLine {\n const values = new Map<string, string>();\n const flags = new Set<string>();\n const positionals: string[] = [];\n\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i];\n\n if (!arg.startsWith('-')) {\n positionals.push(arg);\n continue;\n }\n\n const [name, inlineValue] = splitFlag(arg);\n const valueKey = spec.valueFlags[name];\n\n if (valueKey !== undefined) {\n const value = inlineValue ?? argv[i + 1];\n if (value === undefined || (inlineValue === undefined && value.startsWith('-'))) {\n throw new CliError(`${name} requires a value.`);\n }\n values.set(valueKey, value);\n if (inlineValue === undefined) {\n i += 1;\n }\n continue;\n }\n\n const flagKey = spec.booleanFlags[name];\n if (flagKey !== undefined) {\n if (inlineValue !== undefined) {\n throw new CliError(`${name} does not take a value.`);\n }\n flags.add(flagKey);\n continue;\n }\n\n throw new CliError(`Unknown option: ${name}. Run with --help for usage.`);\n }\n\n return { values, flags, positionals };\n}\n\n/**\n * Reads an option's value.\n */\nexport function optionalValue(cli: CommandLine, key: string): string | undefined {\n return cli.values.get(key);\n}\n\n/**\n * Reads an option's value, failing when it is missing.\n */\nexport function requireValue(cli: CommandLine, key: string, label: string): string {\n const value = cli.values.get(key);\n if (value === undefined || value === '') {\n throw new CliError(`${label} is required.`);\n }\n return value;\n}\n\n/**\n * Returns true when a boolean flag was supplied.\n */\nexport function hasFlag(cli: CommandLine, key: string): boolean {\n return cli.flags.has(key);\n}\n\n/**\n * Resolves the config folder from an option, the environment, or the per-user default.\n */\nexport function resolveConfigDir(option?: string): string {\n return path.resolve(option ?? process.env.CHATSERVER_CONFIG_DIR ?? getDefaultConfigDir());\n}\n\n/**\n * Prompts for a line of text.\n */\nexport async function promptLine(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n return (await rl.question(question)).trim();\n } finally {\n rl.close();\n }\n}\n\n/**\n * Prompts for a secret without echoing keystrokes when stdin is a terminal.\n */\nexport function promptHidden(question: string): Promise<string> {\n const stdin = process.stdin;\n\n if (!stdin.isTTY) {\n throw new CliError('Cannot prompt for a secret without a terminal. Pass --api-key instead.');\n }\n\n return new Promise((resolve, reject) => {\n process.stdout.write(question);\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n let value = '';\n\n const onData = (chunk: string): void => {\n for (const char of chunk) {\n if (char === '\\r' || char === '\\n') {\n finish(value);\n return;\n }\n if (char === '\\u0003') {\n finish(undefined, new CliError('Cancelled.'));\n return;\n }\n if (char === '\\u007f' || char === '\\b') {\n value = value.slice(0, -1);\n continue;\n }\n value += char;\n }\n };\n\n const finish = (result: string | undefined, error?: Error): void => {\n stdin.setRawMode(false);\n stdin.pause();\n stdin.removeListener('data', onData);\n process.stdout.write('\\n');\n if (error !== undefined) {\n reject(error);\n return;\n }\n resolve(result ?? '');\n };\n\n stdin.on('data', onData);\n });\n}\n\n/**\n * Prints an error and marks the process as failed.\n */\nexport function reportError(error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`[models] ${message}`);\n process.exitCode = 1;\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { getModelApiKey } from './credentials';\nimport {\n CliError,\n CommandLine,\n CommandLineSpec,\n optionalValue,\n parseCommandLine,\n promptHidden,\n requireValue,\n resolveConfigDir\n} from './cli-support';\nimport { findModel, findProvider, getModelsPath, loadModels, ModelEntry, ModelsFile, ProviderConfig } from './model-store';\nimport { resolveModelTimeoutMs } from './responses-client';\n\n/**\n * Default prompt used by `test` when --prompt is not supplied.\n */\nexport const DEFAULT_PROMPT = 'Say hello in one short sentence.';\n\nconst COMMON_VALUE_FLAGS: Record<string, string> = {\n '--config_dir': 'configDir',\n '--config-dir': 'configDir',\n '-c': 'configDir'\n};\n\nconst COMMON_BOOLEAN_FLAGS: Record<string, string> = {\n '-h': 'help',\n '--help': 'help'\n};\n\n/**\n * Parses options for one command, merging in the shared flags.\n */\nexport function parseCommandOptions(argv: string[], spec: CommandLineSpec): CommandLine {\n return parseCommandLine(argv, {\n valueFlags: { ...COMMON_VALUE_FLAGS, ...spec.valueFlags },\n booleanFlags: { ...COMMON_BOOLEAN_FLAGS, ...spec.booleanFlags }\n });\n}\n\n/**\n * Looks up a provider or fails with the available names.\n */\nexport async function requireProvider(\n configDir: string,\n name: string\n): Promise<{ file: ModelsFile; provider: ProviderConfig }> {\n const file = await loadModels(configDir);\n const provider = findProvider(file, name);\n if (provider === undefined) {\n const available = file.providers.map((entry) => entry.provider).join(', ') || '(none)';\n throw new CliError(\n `Provider \"${name}\" not found in ${getModelsPath(configDir)}. Available: ${available}.`\n );\n }\n return { file, provider };\n}\n\n/**\n * Looks up a model within a provider or fails with the available names.\n */\nexport function requireModel(provider: ProviderConfig, name: string): ModelEntry {\n const model = findModel(provider, name);\n if (model === undefined) {\n const available = provider.models.map((entry) => entry.name).join(', ') || '(none)';\n throw new CliError(\n `Model \"${name}\" not found for provider \"${provider.provider}\". Available: ${available}.`\n );\n }\n return model;\n}\n\n/**\n * Reads the CLI timeout using the same validation as models.json and HTTP calls.\n */\nexport function modelTimeoutOption(\n value: string | undefined,\n fallback: number = DEFAULT_MODEL_TIMEOUT_MS\n): number {\n try {\n return resolveModelTimeoutMs(value === undefined ? fallback : Number(value));\n } catch (error) {\n throw new CliError(`--timeout: ${(error as Error).message}`);\n }\n}\n\n/**\n * Reads a new API key from the command line, the environment, or a prompt.\n */\nexport async function newApiKey(cli: CommandLine, provider: string): Promise<string> {\n const fromOption = optionalValue(cli, 'apiKey');\n if (fromOption !== undefined && fromOption !== '') {\n return fromOption;\n }\n\n const fromEnvironment = process.env.OPENAI_API_KEY;\n if (fromEnvironment !== undefined && fromEnvironment !== '') {\n return fromEnvironment;\n }\n\n const value = await promptHidden(`API key for provider \"${provider}\": `);\n if (value === '') {\n throw new CliError('An API key is required.');\n }\n return value;\n}\n\n/**\n * Finds the API key used to call a provider's models.\n */\nexport async function existingApiKey(provider: ProviderConfig): Promise<string> {\n return getModelApiKey(provider.provider);\n}\n\n/** Resolves the same model alias, provider key, and timeout for every model-test command. */\nexport async function loadTestModel(cli: CommandLine): Promise<{\n provider: ProviderConfig; model: ModelEntry; apiKey: string; timeoutMs: number;\n}> {\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n const providerName = requireValue(cli, 'provider', '--provider');\n const name = requireValue(cli, 'name', '--name');\n const { provider } = await requireProvider(configDir, providerName);\n const model = requireModel(provider, name);\n const timeoutMs = modelTimeoutOption(optionalValue(cli, 'timeout'), provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS);\n const apiKey = await existingApiKey(provider);\n return { provider, model, apiKey, timeoutMs };\n}\n","import { execFile, spawn } from 'node:child_process';\n\n/**\n * Service name used for every credential this project stores, keeping ChatServer keys\n * separate from anything else in the OS credential manager.\n */\nexport const CREDENTIAL_SERVICE = 'chatserver-models';\n\n/**\n * Raised when credentials cannot be read from or written to the OS credential manager.\n */\nexport class CredentialError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = 'CredentialError';\n }\n}\n\n/**\n * Stores and retrieves secrets in the operating system's credential manager.\n */\nexport interface CredentialStore {\n /** Human-readable backend name, used in logs and errors. */\n readonly name: string;\n /** Returns the secret for `account`, or undefined when nothing is stored. */\n get(account: string): Promise<string | undefined>;\n /** Creates or replaces the secret for `account`. */\n set(account: string, secret: string): Promise<void>;\n /** Removes the secret for `account`, ignoring entries that do not exist. */\n delete(account: string): Promise<void>;\n}\n\n/**\n * Runs a command and resolves with its standard output.\n */\nfunction run(\n command: string,\n args: string[],\n environment?: NodeJS.ProcessEnv\n): Promise<string> {\n const env = environment === undefined ? process.env : { ...process.env, ...environment };\n\n return new Promise((resolve, reject) => {\n execFile(command, args, { encoding: 'utf8', env }, (error, stdout) => {\n if (error !== null) {\n reject(error);\n return;\n }\n resolve(stdout);\n });\n });\n}\n\n/**\n * Runs a command, writing `input` to its standard input.\n */\nfunction runWithInput(command: string, args: string[], input: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: ['pipe', 'ignore', 'pipe'] });\n let stderr = '';\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(stderr.trim() || `${command} exited with code ${code ?? 'unknown'}`));\n });\n\n child.stdin.end(input);\n });\n}\n\n/**\n * Removes a single trailing newline without touching other whitespace in a secret.\n */\nfunction stripTrailingNewline(value: string): string {\n return value.replace(/\\r?\\n$/, '');\n}\n\n/**\n * Escapes a value for use inside a single-quoted PowerShell string.\n */\nfunction powerShellQuote(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\n/**\n * macOS backend built on the `security` command (Keychain).\n */\nclass MacOsKeychainStore implements CredentialStore {\n public readonly name = 'macOS Keychain';\n\n public async get(account: string): Promise<string | undefined> {\n try {\n const stdout = await run('security', [\n 'find-generic-password',\n '-s',\n CREDENTIAL_SERVICE,\n '-a',\n account,\n '-w'\n ]);\n return stripTrailingNewline(stdout) || undefined;\n } catch {\n // The item does not exist, or the user denied access.\n return undefined;\n }\n }\n\n public async set(account: string, secret: string): Promise<void> {\n try {\n await run('security', [\n 'add-generic-password',\n '-s',\n CREDENTIAL_SERVICE,\n '-a',\n account,\n '-w',\n secret,\n '-U'\n ]);\n } catch {\n // execFile errors include the full command, including the password argument.\n throw new CredentialError(\n `Unable to store the API key in the ${this.name}. Check Keychain access permissions.`\n );\n }\n }\n\n public async delete(account: string): Promise<void> {\n try {\n await run('security', [\n 'delete-generic-password',\n '-s',\n CREDENTIAL_SERVICE,\n '-a',\n account\n ]);\n } catch {\n // Nothing stored: nothing to remove.\n }\n }\n}\n\n/**\n * Linux backend built on `secret-tool` from libsecret (GNOME Keyring, KWallet, ...).\n */\nclass SecretServiceStore implements CredentialStore {\n public readonly name = 'Secret Service (secret-tool)';\n\n public async get(account: string): Promise<string | undefined> {\n try {\n const stdout = await run('secret-tool', [\n 'lookup',\n 'service',\n CREDENTIAL_SERVICE,\n 'account',\n account\n ]);\n return stripTrailingNewline(stdout) || undefined;\n } catch {\n return undefined;\n }\n }\n\n public async set(account: string, secret: string): Promise<void> {\n try {\n await runWithInput(\n 'secret-tool',\n [\n 'store',\n '--label',\n `ChatServer model ${account}`,\n 'service',\n CREDENTIAL_SERVICE,\n 'account',\n account\n ],\n secret\n );\n } catch {\n throw new CredentialError(\n `Unable to store the API key in the ${this.name}. ` +\n 'Install libsecret and make sure a keyring is running.'\n );\n }\n }\n\n public async delete(account: string): Promise<void> {\n try {\n await run('secret-tool', [\n 'clear',\n 'service',\n CREDENTIAL_SERVICE,\n 'account',\n account\n ]);\n } catch {\n // Nothing stored: nothing to remove.\n }\n }\n}\n\n/**\n * Windows backend using the CredentialManager PowerShell module.\n *\n * The module is not part of Windows, so the error explains how to install it.\n */\nclass WindowsCredentialStore implements CredentialStore {\n public readonly name = 'Windows Credential Manager';\n\n public async get(account: string): Promise<string | undefined> {\n const script = [\n '$ErrorActionPreference = \"Stop\"',\n 'Import-Module CredentialManager -ErrorAction Stop',\n `$cred = Get-StoredCredential -Target ${powerShellQuote(this.target(account))}`,\n 'if ($null -eq $cred) { exit 3 }',\n '[Console]::Out.Write($cred.GetNetworkCredential().Password)'\n ].join('; ');\n\n try {\n const stdout = await run('powershell', ['-NoProfile', '-NonInteractive', '-Command', script]);\n return stdout || undefined;\n } catch (error) {\n if ((error as { code?: number }).code === 3) {\n return undefined;\n }\n throw new CredentialError(this.installHint());\n }\n }\n\n public async set(account: string, secret: string): Promise<void> {\n const script = [\n '$ErrorActionPreference = \"Stop\"',\n 'Import-Module CredentialManager -ErrorAction Stop',\n `New-StoredCredential -Target ${powerShellQuote(this.target(account))} ` +\n `-UserName ${powerShellQuote(account)} -Password $env:CHATSERVER_SECRET ` +\n '-Persist LocalMachine | Out-Null'\n ].join('; ');\n\n try {\n await run('powershell', ['-NoProfile', '-NonInteractive', '-Command', script], {\n CHATSERVER_SECRET: secret\n });\n } catch {\n throw new CredentialError(this.installHint());\n }\n }\n\n public async delete(account: string): Promise<void> {\n const script = [\n '$ErrorActionPreference = \"Stop\"',\n 'Import-Module CredentialManager -ErrorAction Stop',\n `Remove-StoredCredential -Target ${powerShellQuote(this.target(account))} | Out-Null`\n ].join('; ');\n\n try {\n await run('powershell', ['-NoProfile', '-NonInteractive', '-Command', script]);\n } catch {\n // Nothing stored: nothing to remove.\n }\n }\n\n private target(account: string): string {\n return `${CREDENTIAL_SERVICE}:${account}`;\n }\n\n private installHint(): string {\n return (\n `Unable to use the ${this.name}. Install the CredentialManager PowerShell module ` +\n '(Install-Module CredentialManager -Scope CurrentUser). Check credential manager access permissions.'\n );\n }\n}\n\n/**\n * Returns the credential manager integration for the current platform.\n */\nexport function createCredentialStore(platform: NodeJS.Platform = process.platform): CredentialStore {\n switch (platform) {\n case 'darwin':\n return new MacOsKeychainStore();\n case 'linux':\n return new SecretServiceStore();\n case 'win32':\n return new WindowsCredentialStore();\n default:\n throw new CredentialError(\n `No credential manager integration for platform \"${platform}\". ` +\n 'Set CHATSERVER_MODEL_API_KEY or OPENAI_API_KEY instead.'\n );\n }\n}\n\n/** Reads a provider API key, allowing the same override as the model CLI. */\nexport async function getModelApiKey(provider: string): Promise<string> {\n const override = process.env.CHATSERVER_MODEL_API_KEY;\n if (override !== undefined && override !== '') {\n return override;\n }\n const credentials = createCredentialStore();\n const stored = await credentials.get(provider);\n if (stored === undefined || stored === '') {\n throw new CredentialError(\n `No API key found in the ${credentials.name} for provider \"${provider}\". ` +\n 'Run \"chatserver-models add\" or \"chatserver-models update --api-key\" to store one, ' +\n 'or set CHATSERVER_MODEL_API_KEY.'\n );\n }\n return stored;\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { hasFlag, optionalValue, resolveConfigDir } from './cli-support';\nimport { parseCommandOptions } from './command-support';\nimport { getModelsPath, loadModels } from './model-store';\n\n/**\n * Column widths used by `list` output.\n */\nconst PROVIDER_COLUMN_WIDTH = 16;\nconst NAME_COLUMN_WIDTH = 20;\nconst MODEL_ID_COLUMN_WIDTH = 24;\nconst TIMEOUT_COLUMN_WIDTH = 14;\n\n/**\n * Help text for `chatserver-models list`.\n */\nexport const LIST_HELP = `Usage: chatserver-models list [options]\n\nLists the providers and models in models.json. API keys are not printed.\n\nOptions:\n --json Print the configuration as JSON\n --config_dir <dir> Config folder\n -h, --help Show this help\n`;\n\n/**\n * Prints the configured providers and models.\n */\nexport async function runList(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, { valueFlags: {}, booleanFlags: { '--json': 'json' } });\n\n if (hasFlag(cli, 'help')) {\n console.log(LIST_HELP);\n return;\n }\n\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n const file = await loadModels(configDir);\n\n if (hasFlag(cli, 'json')) {\n console.log(JSON.stringify(file, null, 2));\n return;\n }\n\n if (file.providers.length === 0) {\n console.log(`No providers configured in ${getModelsPath(configDir)}.`);\n return;\n }\n\n console.log(`Providers in ${getModelsPath(configDir)}:`);\n console.log('');\n console.log(\n `${'PROVIDER'.padEnd(PROVIDER_COLUMN_WIDTH)}${'MODEL'.padEnd(NAME_COLUMN_WIDTH)}` +\n `${'MODEL ID'.padEnd(MODEL_ID_COLUMN_WIDTH)}${'TIMEOUT (MS)'.padEnd(TIMEOUT_COLUMN_WIDTH)}BASE URL`\n );\n\n let modelCount = 0;\n for (const provider of file.providers) {\n if (provider.models.length === 0) {\n console.log(\n `${provider.provider.padEnd(PROVIDER_COLUMN_WIDTH)}${'(no models)'.padEnd(NAME_COLUMN_WIDTH)}` +\n `${''.padEnd(MODEL_ID_COLUMN_WIDTH)}` +\n `${String(provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS).padEnd(TIMEOUT_COLUMN_WIDTH)}${provider.baseUrl}`\n );\n continue;\n }\n\n for (const model of provider.models) {\n modelCount += 1;\n console.log(\n `${provider.provider.padEnd(PROVIDER_COLUMN_WIDTH)}` +\n `${model.name.padEnd(NAME_COLUMN_WIDTH)}` +\n `${model.id.padEnd(MODEL_ID_COLUMN_WIDTH)}` +\n `${String(provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS).padEnd(TIMEOUT_COLUMN_WIDTH)}${provider.baseUrl}`\n );\n }\n }\n\n if (modelCount === 0) {\n console.log('');\n console.log('No models configured yet.');\n }\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { promises as fsp } from 'node:fs';\nimport path from 'node:path';\nimport { resolveModelTimeoutMs } from './responses-client';\n\n/**\n * Name of the file that holds model configurations inside the config folder.\n */\nexport const MODELS_FILE_NAME = 'models.json';\n\n/**\n * One model served by a provider.\n *\n * API keys are never stored here. Each provider's key lives in the OS credential\n * manager under the provider name.\n */\nexport interface ModelEntry {\n /** Model identifier sent to the API, for example `gpt-4.1-mini`. */\n id: string;\n /** Name used to refer to this model on the command line. */\n name: string;\n /** Accepts native image content in function_call_output; omitted means false. */\n supportsImageToolResults?: boolean;\n}\n\n/**\n * A provider and the models it serves.\n */\nexport interface ProviderConfig {\n /** Provider name, also the credential manager account for its API key. */\n provider: string;\n /** Required API base URL for Responses (chat) or audio/transcriptions (STT). */\n baseUrl: string;\n /** Timeout for this provider's model requests and tool cycles; defaults to 180000 ms. */\n timeoutMs?: number;\n /** Models available from this provider. */\n models: ModelEntry[];\n}\n\n/**\n * Contents of `models.json`.\n */\nexport interface ModelsFile {\n /** Optional editor schema reference, preserved when the CLI saves this file. */\n $schema?: string;\n version: 1;\n providers: ProviderConfig[];\n}\n\n/**\n * Raised when `models.json` is malformed.\n */\nexport class ModelStoreError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = 'ModelStoreError';\n }\n}\n\n/**\n * Returns the path of `models.json` inside a config folder.\n */\nexport function getModelsPath(configDir: string): string {\n return path.join(configDir, MODELS_FILE_NAME);\n}\n\n/**\n * Returns true for plain JSON objects (not null, arrays, or primitives).\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Validates one model entry.\n */\nfunction parseModelEntry(value: unknown, where: string, seen: Set<string>): ModelEntry {\n if (!isPlainObject(value)) {\n throw new ModelStoreError(`${where} must be an object.`);\n }\n\n if (typeof value.id !== 'string' || value.id.trim() === '') {\n throw new ModelStoreError(`${where}: \"id\" must be a non-empty string.`);\n }\n\n const id = value.id.trim();\n const name = value.name ?? id;\n if (typeof name !== 'string' || name.trim() === '') {\n throw new ModelStoreError(`${where}: \"name\" must be a non-empty string.`);\n }\n\n if (value.supportsImageToolResults !== undefined && typeof value.supportsImageToolResults !== 'boolean') {\n throw new ModelStoreError(`${where}: \"supportsImageToolResults\" must be a boolean.`);\n }\n const entry: ModelEntry = {\n id, name: name.trim(),\n ...(value.supportsImageToolResults === undefined ? {} : { supportsImageToolResults: value.supportsImageToolResults })\n };\n if (seen.has(entry.name)) {\n throw new ModelStoreError(`${where}: duplicate model name \"${entry.name}\".`);\n }\n seen.add(entry.name);\n\n return entry;\n}\n\n/**\n * Validates one provider entry.\n */\nfunction parseProvider(value: unknown, index: number, modelsPath: string): ProviderConfig {\n const where = `${modelsPath}: providers[${index}]`;\n\n if (!isPlainObject(value)) {\n throw new ModelStoreError(`${where} must be an object.`);\n }\n\n if (typeof value.provider !== 'string' || value.provider.trim() === '') {\n throw new ModelStoreError(`${where}: \"provider\" must be a non-empty string.`);\n }\n\n const baseUrl = value.baseUrl;\n if (typeof baseUrl !== 'string' || baseUrl.trim() === '') {\n throw new ModelStoreError(`${where}: \"baseUrl\" must be a non-empty string.`);\n }\n\n if (!Array.isArray(value.models)) {\n throw new ModelStoreError(`${where}: \"models\" must be an array.`);\n }\n\n let timeoutMs: number;\n try {\n timeoutMs = resolveModelTimeoutMs(value.timeoutMs);\n } catch (error) {\n throw new ModelStoreError(`${where}: \"timeoutMs\": ${(error as Error).message}`);\n }\n\n const seen = new Set<string>();\n return {\n provider: value.provider.trim(),\n baseUrl: baseUrl.trim(),\n timeoutMs,\n models: value.models.map((model, modelIndex) =>\n parseModelEntry(model, `${where}.models[${modelIndex}]`, seen)\n )\n };\n}\n\n/**\n * Reads `models.json`, returning an empty list when the file does not exist.\n */\nexport async function loadModels(configDir: string): Promise<ModelsFile> {\n const modelsPath = getModelsPath(configDir);\n\n let contents: string;\n try {\n contents = await fsp.readFile(modelsPath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { version: 1, providers: [] };\n }\n throw new ModelStoreError(`Unable to read ${modelsPath}: ${(error as Error).message}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch (error) {\n throw new ModelStoreError(`Invalid JSON in ${modelsPath}: ${(error as Error).message}`);\n }\n\n if (!isPlainObject(parsed) || !Array.isArray(parsed.providers)) {\n throw new ModelStoreError(`${modelsPath} must contain an object with a \"providers\" array.`);\n }\n\n if (parsed.$schema !== undefined && typeof parsed.$schema !== 'string') {\n throw new ModelStoreError(`${modelsPath}: \"$schema\" must be a string.`);\n }\n\n const seen = new Set<string>();\n const providers = parsed.providers.map((provider, index) => {\n const config = parseProvider(provider, index, modelsPath);\n if (seen.has(config.provider)) {\n throw new ModelStoreError(\n `${modelsPath}: duplicate provider name \"${config.provider}\".`\n );\n }\n seen.add(config.provider);\n return config;\n });\n\n return { ...(parsed.$schema === undefined ? {} : { $schema: parsed.$schema }), version: 1, providers };\n}\n\n/**\n * Writes `models.json`, creating the config folder when needed.\n *\n * Returns the file path that was written.\n */\nexport async function saveModels(configDir: string, file: ModelsFile): Promise<string> {\n const modelsPath = getModelsPath(configDir);\n const payload: ModelsFile = {\n ...(file.$schema === undefined ? {} : { $schema: file.$schema }),\n version: 1,\n providers: file.providers\n };\n\n try {\n await fsp.mkdir(configDir, { recursive: true });\n await fsp.writeFile(modelsPath, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8');\n } catch (error) {\n throw new ModelStoreError(`Unable to write ${modelsPath}: ${(error as Error).message}`);\n }\n\n return modelsPath;\n}\n\n/**\n * Finds a provider by name.\n */\nexport function findProvider(file: ModelsFile, provider: string): ProviderConfig | undefined {\n return file.providers.find((entry) => entry.provider === provider);\n}\n\n/**\n * Returns the provider, creating it when missing.\n */\nexport function ensureProvider(\n file: ModelsFile,\n provider: string,\n baseUrl: string\n): ProviderConfig {\n const existing = findProvider(file, provider);\n if (existing !== undefined) {\n return existing;\n }\n\n if (!baseUrl.trim()) {\n throw new ModelStoreError('A non-empty baseUrl is required to create a provider.');\n }\n const created: ProviderConfig = { provider, baseUrl: baseUrl.trim(), timeoutMs: DEFAULT_MODEL_TIMEOUT_MS, models: [] };\n file.providers.push(created);\n return created;\n}\n\n/**\n * Removes a provider by name. Returns true when an entry was removed.\n */\nexport function removeProvider(file: ModelsFile, provider: string): boolean {\n const index = file.providers.findIndex((entry) => entry.provider === provider);\n if (index === -1) {\n return false;\n }\n file.providers.splice(index, 1);\n return true;\n}\n\n/**\n * Finds a model within a provider.\n */\nexport function findModel(provider: ProviderConfig, name: string): ModelEntry | undefined {\n return provider.models.find((model) => model.name === name);\n}\n\n/**\n * Adds a model or replaces the entry with the same name.\n */\nexport function upsertModel(provider: ProviderConfig, model: ModelEntry): void {\n const index = provider.models.findIndex((candidate) => candidate.name === model.name);\n if (index === -1) {\n provider.models.push(model);\n return;\n }\n provider.models[index] = model;\n}\n\n/**\n * Removes a model by name. Returns true when an entry was removed.\n */\nexport function removeModel(provider: ProviderConfig, name: string): boolean {\n const index = provider.models.findIndex((candidate) => candidate.name === name);\n if (index === -1) {\n return false;\n }\n provider.models.splice(index, 1);\n return true;\n}\n","import { createCredentialStore } from './credentials';\nimport { hasFlag, optionalValue, requireValue, resolveConfigDir } from './cli-support';\nimport { parseCommandOptions, requireModel, requireProvider } from './command-support';\nimport { removeModel, removeProvider, saveModels } from './model-store';\n\n/**\n * Help text for `chatserver-models remove`.\n */\nexport const REMOVE_HELP = `Usage: chatserver-models remove --provider <name> --name <name> [options]\n\nRemoves a model. When it was the provider's last model, the provider entry is removed\ntoo and its API key is deleted from the credential manager.\n\nOptions:\n --provider <name> Provider name (required)\n --name <name> Model name to remove (required)\n --config_dir <dir> Config folder\n -h, --help Show this help\n`;\n\n/**\n * Removes a model, and its provider once the provider has no models left.\n */\nexport async function runRemove(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: { '--provider': 'provider', '--name': 'name' },\n booleanFlags: {}\n });\n\n if (hasFlag(cli, 'help')) {\n console.log(REMOVE_HELP);\n return;\n }\n\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n const providerName = requireValue(cli, 'provider', '--provider');\n const name = requireValue(cli, 'name', '--name');\n const { file, provider } = await requireProvider(configDir, providerName);\n\n requireModel(provider, name);\n removeModel(provider, name);\n\n const providerRemoved = provider.models.length === 0;\n if (providerRemoved) {\n removeProvider(file, providerName);\n }\n\n const modelsPath = await saveModels(configDir, file);\n console.log(`Removed model \"${name}\" from provider \"${providerName}\" in ${modelsPath}.`);\n\n if (providerRemoved) {\n console.log(`Provider \"${providerName}\" had no models left and was removed.`);\n const credentials = createCredentialStore();\n await credentials.delete(providerName);\n console.log(`Removed API key from the ${credentials.name} (account: \"${providerName}\").`);\n }\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS, MAX_TIMER_MS } from '../limit';\nimport { ApiToolDefinition, ToolDefinition } from '../tools/interface';\n\n/** Validates durations against Node's timer range, including programmatic callers. */\nexport function resolveModelTimeoutMs(value: unknown = DEFAULT_MODEL_TIMEOUT_MS): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1 || value > MAX_TIMER_MS) {\n throw new Error(`Model timeout must be an integer from 1 to ${MAX_TIMER_MS} milliseconds.`);\n }\n return value;\n}\n\n/** A Responses API input/output item, preserved across tool round trips. */\nexport type ResponseItem = Record<string, unknown>;\n\n/** A provider citation retained for delivery alongside the generated answer. */\nexport interface ResponseCitation {\n url: string;\n}\n\n/**\n * Options for a single OpenAI Responses API call.\n */\nexport interface ResponseRequest {\n /** Base URL of the API, for example `https://api.openai.com/v1`. */\n baseUrl: string;\n /** Model identifier, for example `gpt-4.1-mini`. */\n model: string;\n /** Bearer token used for authorization. */\n apiKey: string;\n /** Prompt or conversation input sent as `input`. */\n input: string | readonly ResponseItem[];\n /** Local function declarations and provider-hosted tools available during generation. */\n tools?: readonly (ToolDefinition | ApiToolDefinition)[];\n /** Disable further tool calls when the per-reply budget has been consumed. */\n toolChoice?: 'auto' | 'none';\n /** Provider-side cap on built-in calls within this response. */\n maxToolCalls?: number;\n /** Optional system instructions. */\n instructions?: string;\n /** Explicit reasoning effort; omitted preserves provider/model defaults. */\n reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds. Defaults to 3 minutes. */\n timeoutMs?: number;\n /** Optional caller cancellation, in addition to the request timeout. */\n signal?: AbortSignal;\n}\n\n/**\n * Result of a Responses API call.\n */\nexport interface ResponseResult {\n /** Response identifier, when the server returned one. */\n id?: string;\n /** Concatenated text from the response's output items. */\n outputText: string;\n /** HTTP(S) sources cited in output text annotations. */\n citations: readonly ResponseCitation[];\n /** Complete decoded response body. */\n raw: unknown;\n}\n\n/**\n * Raised when a Responses API call fails.\n */\nexport class ResponsesApiError extends Error {\n public readonly status?: number;\n public readonly body?: string;\n\n public constructor(message: string, status?: number, body?: string) {\n super(message);\n this.name = 'ResponsesApiError';\n this.status = status;\n this.body = body;\n }\n}\n\n/**\n * Returns true for plain JSON objects (not null, arrays, or primitives).\n */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Builds the endpoint used for Responses API calls.\n */\nexport function responsesEndpoint(baseUrl: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/responses`;\n}\n\n/**\n * Extracts assistant text from a Responses API payload.\n *\n * Handles the documented `output` array with `output_text` content parts, and falls\n * back to a top-level `output_text` string for compatible servers that use it.\n */\nexport function extractOutputText(payload: unknown): string {\n if (!isRecord(payload)) {\n return '';\n }\n\n if (typeof payload.output_text === 'string') {\n return payload.output_text.trim();\n }\n\n if (!Array.isArray(payload.output)) {\n return '';\n }\n\n const parts: string[] = [];\n for (const item of payload.output) {\n if (!isRecord(item) || !Array.isArray(item.content)) {\n continue;\n }\n for (const content of item.content) {\n if (isRecord(content) && content.type === 'output_text' && typeof content.text === 'string') {\n parts.push(content.text);\n }\n }\n }\n\n return parts.join('\\n').trim();\n}\n\n/** Retains URL citations even when generated text uses provider-specific markers. */\nexport function extractCitations(payload: unknown): ResponseCitation[] {\n if (!isRecord(payload) || !Array.isArray(payload.output)) {\n return [];\n }\n const urls = new Set<string>();\n for (const item of payload.output) {\n if (!isRecord(item) || item.type !== 'message' || !Array.isArray(item.content)) {\n continue;\n }\n for (const content of item.content) {\n if (!isRecord(content) || content.type !== 'output_text' || !Array.isArray(content.annotations)) {\n continue;\n }\n for (const annotation of content.annotations) {\n if (!isRecord(annotation) || annotation.type !== 'url_citation' || typeof annotation.url !== 'string') {\n continue;\n }\n try {\n const url = new URL(annotation.url);\n if ((url.protocol === 'http:' || url.protocol === 'https:') && !url.username && !url.password) {\n urls.add(url.href);\n }\n } catch {\n // Ignore malformed citation URLs rather than rendering them as links.\n }\n }\n }\n }\n return [...urls].map((url) => ({ url }));\n}\n\n/**\n * Sends one prompt through the Responses API and returns the text it produced.\n */\nexport async function createResponse(request: ResponseRequest): Promise<ResponseResult> {\n const url = responsesEndpoint(request.baseUrl);\n const timeoutMs = resolveModelTimeoutMs(request.timeoutMs);\n const controller = new AbortController();\n const cancel = () => controller.abort();\n request.signal?.addEventListener('abort', cancel, { once: true });\n if (request.signal?.aborted) {\n controller.abort();\n }\n const timer = setTimeout(() => {\n controller.abort();\n }, timeoutMs);\n\n const body: Record<string, unknown> = {\n model: request.model,\n input: request.input\n };\n if (request.tools !== undefined && request.tools.length > 0) {\n body.tools = request.tools;\n body.tool_choice = request.toolChoice ?? 'auto';\n // Replay the complete output locally, including any encrypted reasoning.\n body.store = false;\n body.include = ['reasoning.encrypted_content'];\n if (request.maxToolCalls !== undefined) {\n body.max_tool_calls = request.maxToolCalls;\n }\n }\n if (request.reasoningEffort !== undefined) {\n body.reasoning = { effort: request.reasoningEffort };\n }\n if (request.instructions !== undefined) {\n body.instructions = request.instructions;\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.apiKey}`,\n ...request.headers\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal\n });\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new ResponsesApiError(\n `Request to ${url} failed with HTTP ${response.status} ${response.statusText}.`,\n response.status,\n text\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (error) {\n throw new ResponsesApiError(\n `Response from ${url} was not valid JSON: ${(error as Error).message}`,\n response.status,\n text\n );\n }\n\n if (isRecord(parsed) && ((parsed.error !== undefined && parsed.error !== null) || parsed.status === 'failed' || parsed.status === 'incomplete')) {\n throw new ResponsesApiError(`Response from ${url} did not complete successfully.`, response.status);\n }\n const result: ResponseResult = { outputText: extractOutputText(parsed), citations: extractCitations(parsed), raw: parsed };\n if (isRecord(parsed) && typeof parsed.id === 'string') {\n result.id = parsed.id;\n }\n return result;\n } catch (error) {\n if (error instanceof ResponsesApiError) {\n throw error;\n }\n if (request.signal?.aborted) {\n throw new ResponsesApiError(`Request to ${url} was cancelled.`);\n }\n if ((error as Error).name === 'AbortError') {\n throw new ResponsesApiError(`Request to ${url} timed out after ${timeoutMs} ms.`);\n }\n throw new ResponsesApiError(`Request to ${url} failed: ${(error as Error).message}`);\n } finally {\n clearTimeout(timer);\n request.signal?.removeEventListener('abort', cancel);\n }\n}\n","import { MAX_MODEL_RETRIES, MODEL_RETRY_DELAY_MS } from '../limit';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport { ResponsesApiError } from './responses-client';\n\n/** One initial generation and at most three retries, with ten seconds between attempts. */\nexport async function withModelRetries<T>(generate: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n for (let retries = 0; ; retries += 1) {\n signal?.throwIfAborted();\n try {\n return await generate();\n } catch (error) {\n const transient = error instanceof ResponsesApiError &&\n (error.status === undefined || error.status === 408 || error.status === 429 || error.status >= 500);\n if (signal?.aborted || retries >= MAX_MODEL_RETRIES || !transient) {\n throw error;\n }\n console.warn(`[model] generation failed; retry ${retries + 1}/${MAX_MODEL_RETRIES} in ${MODEL_RETRY_DELAY_MS / 1000} seconds.`);\n await delay(MODEL_RETRY_DELAY_MS, undefined, { signal });\n }\n }\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS, MAX_SETUP_CHOICES, MODEL_DISCOVERY_TIMEOUT_MS } from '../limit';\nimport { CliError, CommandLine, hasFlag, optionalValue, promptLine } from './cli-support';\nimport { ModelsFile, ProviderConfig } from './model-store';\n\n/** Reads an optional nonempty, trimmed command-line value. */\nexport function setupValue(cli: CommandLine, key: string, flag: string): string | undefined {\n const value = optionalValue(cli, key)?.trim();\n if (value === '') {\n throw new CliError(`${flag} must not be empty.`);\n }\n return value;\n}\n\n/** Validates a provider endpoint before prompting for or saving credentials. */\nexport function setupBaseUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new CliError('Base URL must be an absolute http:// or https:// URL.');\n }\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) {\n throw new CliError('Base URL must use HTTP(S), without credentials, a query, or a fragment.');\n }\n if (/\\/responses\\/?$/.test(url.pathname)) {\n throw new CliError('Use the API base URL, without the trailing /responses.');\n }\n return value.trim().replace(/\\/+$/, '');\n}\n\n/** Requires a terminal for guided setup, keeping scripts from hanging on prompts. */\nexport function requireSetupTerminal(): void {\n if (!process.stdin.isTTY) {\n throw new CliError('Guided setup requires a terminal. Supply the command options instead.');\n }\n}\n\n/** Prompts with an optional current value and retries invalid input. */\nexport async function setupPrompt(\n label: string,\n fallback?: string,\n validate: (value: string) => string = (value) => {\n if (!value) {\n throw new CliError('A value is required.');\n }\n return value;\n }\n): Promise<string> {\n requireSetupTerminal();\n for (;;) {\n const value = (await promptLine(`${label}${fallback === undefined ? '' : ` [${fallback}]`}: `)).trim() || fallback || '';\n try {\n return validate(value);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n }\n }\n}\n\n/** Selects a numbered item or, when allowed, accepts a new name/ID directly. */\nexport async function setupChoice(\n label: string,\n choices: readonly { value: string; label: string; name?: string }[],\n allowCustom = false\n): Promise<string> {\n requireSetupTerminal();\n const shown = allowCustom ? choices.slice(0, MAX_SETUP_CHOICES) : choices;\n shown.forEach((choice, index) => console.log(` ${index + 1}. ${choice.label}`));\n if (choices.length > shown.length) {\n console.log(`Showing ${shown.length} of ${choices.length}; enter an exact name/ID for another choice.`);\n }\n return setupPrompt(`${label}${allowCustom ? ' (number or name/ID)' : ' (number or name)'}`, allowCustom ? undefined : '1', (value) => {\n // Exact names win over numbered shortcuts (including numeric model IDs).\n const exact = choices.find((choice) => choice.value === value || choice.name === value);\n if (exact !== undefined) {\n return exact.value;\n }\n const index = /^[1-9]\\d*$/.test(value) ? Number(value) - 1 : -1;\n if (shown[index] !== undefined) {\n return shown[index].value;\n }\n if (allowCustom && value) {\n return value;\n }\n throw new CliError('Choose a listed number or name.');\n });\n}\n\n/** Resolves a supplied provider or offers configured providers and a new-name entry. */\nexport async function setupProvider(file: ModelsFile, cli: CommandLine, allowNew: boolean): Promise<string> {\n const supplied = setupValue(cli, 'provider', '--provider');\n if (supplied !== undefined) {\n return supplied;\n }\n if (!process.stdin.isTTY) {\n throw new CliError('--provider is required without a terminal.');\n }\n if (!allowNew && file.providers.length === 0) {\n throw new CliError('No providers configured. Run chatserver-models add first.');\n }\n return setupChoice(allowNew ? 'Choose a provider or enter a new provider name' : 'Provider',\n file.providers.map((provider) => ({ value: provider.provider, label: `${provider.provider} (${provider.baseUrl})` })), allowNew);\n}\n\n/** Enables the editor explicitly or when a terminal command has no edits yet. */\nexport function setupInteractive(cli: CommandLine, missing: boolean): boolean {\n if (hasFlag(cli, 'interactive')) {\n requireSetupTerminal();\n return true;\n }\n return Boolean(process.stdin.isTTY) && missing;\n}\n\n/** Offers the provider's advertised models, falling back to a manually entered ID. */\nexport async function setupModelId(provider: ProviderConfig, apiKey: string): Promise<string> {\n requireSetupTerminal();\n console.log(`Looking up models at ${provider.baseUrl}...`);\n let ids: string[];\n try {\n const response = await fetch(`${provider.baseUrl.replace(/\\/+$/, '')}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(Math.min(provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS, MODEL_DISCOVERY_TIMEOUT_MS)),\n redirect: 'error'\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n const body: unknown = await response.json();\n if (typeof body !== 'object' || body === null || !('data' in body) || !Array.isArray(body.data)) {\n throw new Error('Unsupported model list');\n }\n ids = [...new Set(body.data.flatMap((model: unknown) =>\n typeof model === 'object' && model !== null && 'id' in model && typeof model.id === 'string' && model.id.trim()\n ? [model.id.trim()] : []))].sort();\n } catch {\n console.log('Could not list models from this provider. Enter the model ID manually.');\n return setupPrompt('Model ID');\n }\n if (ids.length === 0) {\n return setupPrompt('Model ID');\n }\n return setupChoice('Model', ids.map((id) => ({ value: id, label: id })), true);\n}\n","import { MAX_AUDIO_BYTES, MAX_TTS_INPUT_CHARS } from '../limit';\nimport { AudioFile } from '../messagers/interface';\nimport { ResponsesApiError, resolveModelTimeoutMs } from './responses-client';\n\n/** Provider speech synthesis; options are JSON fields such as voice, speed, or instructions. */\nexport interface SpeechModel {\n synthesize(text: string, options?: Readonly<Record<string, unknown>>, signal?: AbortSignal): Promise<AudioFile>;\n}\n\ninterface SpeechRequest {\n baseUrl: string;\n model: string;\n apiKey: string;\n text: string;\n options?: Readonly<Record<string, unknown>>;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\n/** Requests bounded WAV audio from an OpenAI-compatible audio/speech endpoint. */\nexport async function createSpeech(request: SpeechRequest): Promise<AudioFile> {\n request.signal?.throwIfAborted();\n if (!request.text.trim() || request.text.length > MAX_TTS_INPUT_CHARS) {\n throw new Error(`Speech input must contain 1–${MAX_TTS_INPUT_CHARS} characters.`);\n }\n const url = `${request.baseUrl.replace(/\\/+$/, '')}/audio/speech`;\n const timeoutMs = resolveModelTimeoutMs(request.timeoutMs);\n const controller = new AbortController();\n const cancel = () => controller.abort();\n request.signal?.addEventListener('abort', cancel, { once: true });\n const timer = setTimeout(cancel, timeoutMs);\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { Authorization: `Bearer ${request.apiKey}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({ ...request.options, model: request.model, input: request.text,\n response_format: 'wav', stream_format: 'audio' }),\n signal: controller.signal,\n redirect: 'error'\n });\n if (!response.ok) {\n await response.body?.cancel();\n throw new ResponsesApiError(`Speech request to ${url} failed with HTTP ${response.status}.`, response.status);\n }\n if (Number(response.headers.get('content-length')) > MAX_AUDIO_BYTES || response.body === null) {\n await response.body?.cancel();\n throw new ResponsesApiError('Speech response is missing or exceeds the audio size limit.', response.status);\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n while (true) {\n const chunk = await reader.read();\n if (chunk.done) {\n break;\n }\n size += chunk.value.byteLength;\n if (size > MAX_AUDIO_BYTES) {\n await reader.cancel();\n throw new ResponsesApiError('Speech response exceeds the audio size limit.', response.status);\n }\n chunks.push(chunk.value);\n }\n } finally {\n reader.releaseLock();\n }\n if (!size) {\n throw new ResponsesApiError('Speech model returned empty audio.', response.status);\n }\n return { data: Buffer.concat(chunks), filename: 'reply.wav', mimeType: 'audio/wav' };\n } catch (error) {\n request.signal?.throwIfAborted();\n if (error instanceof ResponsesApiError) {\n throw error;\n }\n if (controller.signal.aborted) {\n throw new ResponsesApiError(`Speech request to ${url} timed out after ${timeoutMs} ms.`);\n }\n throw new ResponsesApiError(`Speech request to ${url} failed: ${error instanceof Error ? error.message : String(error)}`);\n } finally {\n clearTimeout(timer);\n request.signal?.removeEventListener('abort', cancel);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { MAX_AUDIO_BYTES, DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { audioFile } from '../messagers/audio';\nimport { AudioFile } from '../messagers/interface';\nimport { CliError, hasFlag, optionalValue, requireValue } from './cli-support';\nimport { loadTestModel, parseCommandOptions } from './command-support';\nimport { convertAudio } from './audio-conversion';\nimport { createTranscription } from './transcriptions-client';\nimport { withModelRetries } from './retry';\n\nexport const TEST_STT_HELP = `Usage: chatserver-models test-stt --provider <name> --name <name> --file <audio> [options]\n\nTranscribes a local audio file through the configured provider's audio/transcriptions endpoint.\n\nOptions:\n --provider <name> Provider name from models.json (required)\n --name <name> Model CLI alias from models.json (required)\n --file <path> Audio input; --audio is an alias (required)\n --audio-conversion-cmd <cmd> Optional WAV conversion command using {input} and {output}\n --timeout <ms> Request timeout (default: provider setting or ${DEFAULT_MODEL_TIMEOUT_MS})\n --json Print { \"text\": \"...\" } instead of plain transcript text\n --config_dir <dir> Config folder\n -h, --help Show this help\n\nSupported input: mp3, mpeg, mpga, wav, ogg, flac, m4a, mp4, webm; maximum ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.\nUse --audio-conversion-cmd for WAV-only engines such as speech.cpp.\nPaths resolve from the current directory. Original audio is never modified.\nThe API key is read from CHATSERVER_MODEL_API_KEY or the OS credential manager.\n`;\n\n/** Reads a bounded regular file before attempting credentials or model requests. */\nasync function readAudio(file: string): Promise<AudioFile> {\n const input = await fs.open(file, 'r');\n try {\n const stat = await input.stat();\n if (!stat.isFile() || stat.size === 0 || stat.size > MAX_AUDIO_BYTES) {\n throw new CliError(`Audio input must be a nonempty regular file no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const data = await input.readFile();\n const audio = audioFile(data.toString('base64'), path.extname(file).slice(1), 0);\n return { ...audio, filename: path.basename(file) };\n } finally {\n await input.close();\n }\n}\n\n/** Exercises the same transcription and optional conversion used by incoming voice messages. */\nexport async function runTestStt(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: { '--provider': 'provider', '--name': 'name', '--file': 'file', '--audio': 'file',\n '--timeout': 'timeout', '--audio-conversion-cmd': 'conversion' },\n booleanFlags: { '--json': 'json' }\n });\n if (hasFlag(cli, 'help')) {\n console.log(TEST_STT_HELP);\n return;\n }\n if (cli.positionals.length) {\n throw new CliError('Unexpected arguments. Pass the audio path with --file.');\n }\n const file = path.resolve(requireValue(cli, 'file', '--file'));\n const conversion = optionalValue(cli, 'conversion');\n if (conversion !== undefined && (!conversion.trim() || !conversion.includes('{input}') || !conversion.includes('{output}'))) {\n throw new CliError('--audio-conversion-cmd must contain {input} and {output}.');\n }\n let audio = await readAudio(file);\n const { provider, model, apiKey, timeoutMs } = await loadTestModel(cli);\n if (conversion !== undefined) {\n audio = await convertAudio(audio, conversion);\n }\n console.error(`Testing STT ${model.name} (${model.id}) via ${provider.provider}...`);\n const text = await withModelRetries(() => createTranscription({\n baseUrl: provider.baseUrl, model: model.id, apiKey, timeoutMs, audio\n }));\n console.log(hasFlag(cli, 'json') ? JSON.stringify({ text }) : text || '(no speech recognized)');\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { DEFAULT_MODEL_TIMEOUT_MS, MAX_TTS_INPUT_CHARS } from '../limit';\nimport { CliError, hasFlag, optionalValue } from './cli-support';\nimport { loadTestModel, parseCommandOptions } from './command-support';\nimport { createSpeech } from './speech-client';\nimport { padVoiceAudio } from './voice-synthesizer';\nimport { withModelRetries } from './retry';\n\nconst DEFAULT_SPEECH_TEST_TEXT = 'Hello! This is a speech synthesis test.';\n\nexport const TEST_TTS_HELP = `Usage: chatserver-models test-tts --provider <name> --name <name> [options]\n\nSynthesizes local test audio through audio/speech and saves WAV with WeChat's random padding.\nThis command does not send a WeChat message.\n\nOptions:\n --provider <name> Provider name from models.json (required)\n --name <name> Model CLI alias from models.json (required)\n --text <text> Literal text to speak; --prompt is an alias (default: \"${DEFAULT_SPEECH_TEST_TEXT}\")\n --voice <name> Provider voice name; overrides voice in --options\n --options <json> Provider speech options as a JSON object, such as {\"speed\":1}\n --output <path> WAV output file (default: tts-test.wav)\n --force Overwrite an existing output file\n --timeout <ms> Request timeout (default: provider setting or ${DEFAULT_MODEL_TIMEOUT_MS})\n --config_dir <dir> Config folder\n -h, --help Show this help\n\nOptions use the same format as tts.options in config.json. ChatServer controls\nmodel, input, response_format=wav, and stream_format=audio. The provider must return\nPCM/float WAV. Independent 0.5–2 second silences are added before and after speech.\nPaths resolve from the current directory; the output directory must already exist.\nThe API key is read from CHATSERVER_MODEL_API_KEY or the OS credential manager.\n`;\n\n/** Validates operator-supplied provider options before making a model request. */\nfunction speechOptions(encoded?: string): Record<string, unknown> {\n let value: unknown = {};\n if (encoded !== undefined) {\n try {\n value = JSON.parse(encoded);\n } catch {\n throw new CliError('--options must contain a valid JSON object.');\n }\n }\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new CliError('--options must contain a JSON object.');\n }\n for (const key of ['model', 'input', 'response_format', 'stream_format']) {\n if (Object.hasOwn(value, key)) {\n throw new CliError(`--options.${key} is controlled by ChatServer.`);\n }\n }\n return value as Record<string, unknown>;\n}\n\n/** Catches invalid destinations before synthesis; exclusive writes also guard creation races. */\nasync function checkOutput(output: string, force: boolean): Promise<void> {\n if (!(await fs.stat(path.dirname(output))).isDirectory()) {\n throw new CliError('The output directory must already exist.');\n }\n try {\n const stat = await fs.lstat(output);\n if (!stat.isFile()) {\n throw new CliError('The output path must be a regular file.');\n }\n if (!force) {\n throw new CliError(`Output file already exists: ${output}. Use --force to overwrite it.`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n}\n\n/** Exercises real speech synthesis and the same padding used for WeChat voice replies. */\nexport async function runTestTts(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: { '--provider': 'provider', '--name': 'name', '--text': 'text', '--prompt': 'text', '--voice': 'voice',\n '--options': 'options', '--output': 'output', '--timeout': 'timeout' },\n booleanFlags: { '--force': 'force' }\n });\n if (hasFlag(cli, 'help')) {\n console.log(TEST_TTS_HELP);\n return;\n }\n if (cli.positionals.length) {\n throw new CliError('Unexpected arguments. Pass literal speech text with --text.');\n }\n const text = optionalValue(cli, 'text') ?? DEFAULT_SPEECH_TEST_TEXT;\n if (!text.trim() || text.length > MAX_TTS_INPUT_CHARS) {\n throw new CliError(`--text must contain 1–${MAX_TTS_INPUT_CHARS} characters.`);\n }\n const options = speechOptions(optionalValue(cli, 'options'));\n const voice = optionalValue(cli, 'voice');\n if (voice !== undefined) {\n if (!voice.trim()) {\n throw new CliError('--voice must be nonempty.');\n }\n options.voice = voice.trim();\n }\n const outputOption = optionalValue(cli, 'output') ?? 'tts-test.wav';\n if (!outputOption.trim() || path.extname(outputOption).toLowerCase() !== '.wav') {\n throw new CliError('--output must be a WAV file path ending in .wav.');\n }\n const output = path.resolve(outputOption);\n const force = hasFlag(cli, 'force');\n await checkOutput(output, force);\n const { provider, model, apiKey, timeoutMs } = await loadTestModel(cli);\n console.error(`Testing TTS ${model.name} (${model.id}) via ${provider.provider}...`);\n const audio = padVoiceAudio(await withModelRetries(() => createSpeech({\n baseUrl: provider.baseUrl, model: model.id, apiKey, timeoutMs, text, options\n })));\n await fs.writeFile(output, audio.data, { flag: force ? 'w' : 'wx', mode: 0o600 });\n console.log(`Saved speech to ${output} (${audio.data.byteLength} bytes, including random padding).`);\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { hasFlag, optionalValue } from './cli-support';\nimport {\n DEFAULT_PROMPT,\n parseCommandOptions,\n loadTestModel\n} from './command-support';\nimport { createResponse } from './responses-client';\nimport { withModelRetries } from './retry';\n\n/**\n * Help text for `chatserver-models test`.\n */\nexport const TEST_HELP = `Usage: chatserver-models test --provider <name> --name <name> [options]\n\nSends one prompt to a configured model and prints the reply.\n\nOptions:\n --provider <name> Provider name from models.json (required)\n --name <name> Model name from models.json (required)\n --prompt <text> Prompt to send (default: \"${DEFAULT_PROMPT}\")\n --timeout <ms> Override provider timeout for this request (default: provider setting or ${DEFAULT_MODEL_TIMEOUT_MS})\n --json Print the raw API response instead of just the text\n --config_dir <dir> Config folder\n -h, --help Show this help\n\nThe API key is read from CHATSERVER_MODEL_API_KEY or the OS credential manager\n(account: the provider name).\n`;\n\n/**\n * Sends one prompt to a configured model.\n */\nexport async function runTest(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: {\n '--provider': 'provider',\n '--name': 'name',\n '--prompt': 'prompt',\n '--timeout': 'timeout'\n },\n booleanFlags: { '--json': 'json' }\n });\n\n if (hasFlag(cli, 'help')) {\n console.log(TEST_HELP);\n return;\n }\n\n const { provider, model, apiKey, timeoutMs } = await loadTestModel(cli);\n const prompt = optionalValue(cli, 'prompt') ?? DEFAULT_PROMPT;\n\n console.log(`Testing ${model.name} (${model.id}) via ${provider.provider} at ${provider.baseUrl}...`);\n\n const result = await withModelRetries(() => createResponse({\n baseUrl: provider.baseUrl,\n model: model.id,\n apiKey,\n input: prompt,\n timeoutMs\n }));\n\n if (hasFlag(cli, 'json')) {\n console.log(JSON.stringify(result.raw, null, 2));\n return;\n }\n\n console.log('');\n console.log(result.outputText === '' ? '(no output text in response)' : result.outputText);\n if (result.id !== undefined) {\n console.log('');\n console.log(`Response id: ${result.id}`);\n }\n}\n","import { MAX_AUDIO_BYTES, MAX_TRANSCRIPT_CHARS } from '../limit';\nimport { AudioFile } from '../messagers/interface';\nimport { ResponsesApiError, resolveModelTimeoutMs } from './responses-client';\n\n/** A provider-bound speech-to-text model, independent of text-generation capabilities. */\nexport interface TranscriptionModel {\n transcribe(audio: AudioFile, signal?: AbortSignal): Promise<string>;\n}\n\ninterface TranscriptionRequest {\n baseUrl: string;\n model: string;\n apiKey: string;\n audio: AudioFile;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\n/** Calls an OpenAI-compatible audio/transcriptions endpoint using native multipart upload. */\nexport async function createTranscription(request: TranscriptionRequest): Promise<string> {\n request.signal?.throwIfAborted();\n if (request.audio.data.byteLength === 0 || request.audio.data.byteLength > MAX_AUDIO_BYTES) {\n throw new Error(`Transcription audio must be nonempty and no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const url = `${request.baseUrl.replace(/\\/+$/, '')}/audio/transcriptions`;\n const timeoutMs = resolveModelTimeoutMs(request.timeoutMs);\n const controller = new AbortController();\n const cancel = () => controller.abort();\n request.signal?.addEventListener('abort', cancel, { once: true });\n const timer = setTimeout(cancel, timeoutMs);\n try {\n const form = new FormData();\n form.set('model', request.model);\n form.set('response_format', 'json');\n form.set('file', new Blob([new Uint8Array(request.audio.data)], { type: request.audio.mimeType }), request.audio.filename);\n const response = await fetch(url, {\n method: 'POST',\n headers: { Authorization: `Bearer ${request.apiKey}` },\n body: form,\n signal: controller.signal,\n redirect: 'error'\n });\n if (!response.ok) {\n throw new ResponsesApiError(`Transcription request to ${url} failed with HTTP ${response.status}.`, response.status);\n }\n let result: unknown;\n try {\n result = await response.json();\n } catch (error) {\n if (controller.signal.aborted) {\n throw error;\n }\n throw new ResponsesApiError('Transcription model returned invalid JSON.', response.status);\n }\n if (typeof result !== 'object' || result === null || Array.isArray(result) ||\n !('text' in result) || typeof result.text !== 'string' || result.text.length > MAX_TRANSCRIPT_CHARS) {\n throw new ResponsesApiError(`Transcription model must return a text string of at most ${MAX_TRANSCRIPT_CHARS} characters.`, response.status);\n }\n return result.text.trim();\n } catch (error) {\n request.signal?.throwIfAborted();\n if (controller.signal.aborted) {\n throw new ResponsesApiError(`Transcription request to ${url} timed out after ${timeoutMs} ms.`);\n }\n if (error instanceof ResponsesApiError) {\n throw error;\n }\n throw new ResponsesApiError(`Transcription request to ${url} failed: ${error instanceof Error ? error.message : String(error)}`);\n } finally {\n clearTimeout(timer);\n request.signal?.removeEventListener('abort', cancel);\n }\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { createCredentialStore } from './credentials';\nimport { CliError, hasFlag, optionalValue, promptHidden, resolveConfigDir } from './cli-support';\nimport { modelTimeoutOption, parseCommandOptions, requireModel, requireProvider } from './command-support';\nimport { findModel, loadModels, saveModels } from './model-store';\nimport { setupBaseUrl, setupChoice, setupInteractive, setupPrompt, setupProvider, setupValue } from './setup';\n\n/**\n * Help text for `chatserver-models update`.\n */\nexport const UPDATE_HELP = `Usage: chatserver-models update [options]\n\nUpdates a provider or one of its models. Only the options you pass are changed.\nRun without edits for a guided editor. Press Enter to keep current values.\n\nOptions:\n --provider <name> Provider name (prompted in a terminal if omitted)\n --base-url <url> New OpenAI-compatible base URL for the provider\n --timeout <ms> New model timeout for all models from the provider\n --api-key <key> Replace the provider's stored API key\n --name <name> Model name to update\n --model <id> New model identifier for --name\n --new-name <name> Rename the model given by --name\n --config_dir <dir> Config folder\n -i, --interactive Open the guided editor even when edits are supplied\n -h, --help Show this help\n`;\n\n/**\n * Updates provider or model details, and optionally the provider's API key.\n */\nexport async function runUpdate(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: {\n '--provider': 'provider',\n '--base-url': 'baseUrl',\n '--timeout': 'timeout',\n '--api-key': 'apiKey',\n '--name': 'name',\n '--model': 'model',\n '--new-name': 'newName'\n },\n booleanFlags: { '--interactive': 'interactive', '-i': 'interactive' }\n });\n\n if (hasFlag(cli, 'help')) {\n console.log(UPDATE_HELP);\n return;\n }\n\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n let newBaseUrl = setupValue(cli, 'baseUrl', '--base-url');\n if (newBaseUrl !== undefined) {\n newBaseUrl = setupBaseUrl(newBaseUrl);\n }\n const timeoutValue = optionalValue(cli, 'timeout');\n let timeoutMs = timeoutValue === undefined ? undefined : modelTimeoutOption(timeoutValue);\n let apiKey = setupValue(cli, 'apiKey', '--api-key');\n let modelName = setupValue(cli, 'name', '--name');\n let newModelId = setupValue(cli, 'model', '--model');\n let newName = setupValue(cli, 'newName', '--new-name');\n const hasEdits = newBaseUrl !== undefined || timeoutMs !== undefined || apiKey !== undefined ||\n newModelId !== undefined || newName !== undefined;\n const guided = setupInteractive(cli, !hasEdits);\n const providerName = await setupProvider(await loadModels(configDir), cli, false);\n const { file, provider } = await requireProvider(configDir, providerName);\n\n if (!guided && !hasEdits) {\n throw new CliError(\n 'Nothing to update. Pass --base-url, --timeout, --api-key, or --name with --model/--new-name.'\n );\n }\n\n let editProvider = false;\n if (guided && modelName === undefined && newModelId === undefined && newName === undefined) {\n const target = await setupChoice('Update', [\n { value: 'provider', label: 'Provider settings (URL, timeout, API key)' },\n ...provider.models.map((model) => ({ value: `model:${model.name}`, name: model.name, label: `${model.name} (${model.id})` }))\n ]);\n editProvider = target === 'provider';\n if (!editProvider) {\n modelName = target.slice('model:'.length);\n }\n }\n if (modelName === undefined && (newModelId !== undefined || newName !== undefined)) {\n if (!process.stdin.isTTY) {\n throw new CliError('--name is required to update or rename a model.');\n }\n if (provider.models.length === 0) {\n throw new CliError('This provider has no models. Run chatserver-models add first.');\n }\n modelName = await setupChoice('Model', provider.models.map((model) => ({ value: model.name, label: `${model.name} (${model.id})` })));\n }\n\n const model = modelName === undefined ? undefined : requireModel(provider, modelName);\n if (guided && model !== undefined) {\n newModelId ??= await setupPrompt('Model ID', model.id);\n newName ??= await setupPrompt('Model name', model.name);\n }\n if (editProvider) {\n newBaseUrl ??= await setupPrompt('API base URL', provider.baseUrl, setupBaseUrl);\n const currentTimeout = provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS;\n timeoutMs ??= Number(await setupPrompt('Timeout (ms)', String(currentTimeout), (value) => String(modelTimeoutOption(value))));\n if (apiKey === undefined) {\n apiKey = (await promptHidden('New API key (Enter to keep current): ')).trim() || undefined;\n }\n }\n\n // Validate every edit before changing either the credential manager or models.json.\n if (newName !== undefined && newName !== model?.name && findModel(provider, newName) !== undefined) {\n throw new CliError(`Model \"${newName}\" already exists for provider \"${provider.provider}\".`);\n }\n const changed = newBaseUrl !== undefined && newBaseUrl !== provider.baseUrl ||\n timeoutMs !== undefined && timeoutMs !== provider.timeoutMs || apiKey !== undefined ||\n model !== undefined && (newModelId !== undefined && newModelId !== model.id || newName !== undefined && newName !== model.name);\n if (!changed) {\n console.log('No changes.');\n return;\n }\n\n if (newBaseUrl !== undefined) {\n provider.baseUrl = newBaseUrl;\n }\n if (timeoutMs !== undefined) {\n provider.timeoutMs = timeoutMs;\n }\n\n if (apiKey !== undefined) {\n const credentials = createCredentialStore();\n await credentials.set(provider.provider, apiKey);\n console.log(`API key updated in the ${credentials.name} (account: \"${provider.provider}\").`);\n }\n\n const previousId = model?.id;\n if (model !== undefined) {\n if (newModelId !== undefined) {\n model.id = newModelId;\n }\n\n if (newName !== undefined) {\n model.name = newName;\n }\n }\n\n const modelsPath = await saveModels(configDir, file);\n console.log(`Updated provider \"${providerName}\" in ${modelsPath}.`);\n if (model !== undefined) {\n console.log(`Config reference: ${providerName}/${model.id}`);\n if (previousId !== model.id) {\n console.log(`Update config.json references from ${providerName}/${previousId} to ${providerName}/${model.id}.`);\n }\n }\n}\n","import { randomInt } from 'node:crypto';\nimport { MAX_AUDIO_BYTES, MAX_VOICE_PADDING_MS, MIN_VOICE_PADDING_MS } from '../limit';\nimport { AudioFile } from '../messagers/interface';\nimport { SpeechModel } from './speech-client';\n\n/** Adds actual silence to PCM/float WAV samples, independently at either end. */\nexport function padVoiceAudio(audio: AudioFile): AudioFile {\n const wav = Buffer.from(audio.data);\n const invalid = () => new Error('TTS must return a valid, uncompressed PCM or float WAV file for voice padding.');\n if (wav.length < 44 || wav.length > MAX_AUDIO_BYTES || wav.toString('ascii', 0, 4) !== 'RIFF' ||\n wav.toString('ascii', 8, 12) !== 'WAVE') {\n throw invalid();\n }\n let format: Buffer | undefined;\n let samples: Buffer | undefined;\n for (let offset = 12; offset + 8 <= wav.length;) {\n const id = wav.toString('ascii', offset, offset + 4);\n const declared = wav.readUInt32LE(offset + 4);\n const start = offset + 8;\n // Streaming WAV encoders can leave RIFF/data sizes as large placeholders.\n const size = id === 'data' && declared >= 0x7fff0000 ? wav.length - start : declared;\n if (start + size > wav.length) {\n throw invalid();\n }\n if (id === 'fmt ') {\n if (format !== undefined) {\n throw invalid();\n }\n format = wav.subarray(start, start + size);\n } else if (id === 'data') {\n if (samples !== undefined) {\n throw invalid();\n }\n samples = wav.subarray(start, start + size);\n }\n offset = start + size + size % 2;\n }\n if (format === undefined || format.length < 16 || samples === undefined || !samples.length) {\n throw invalid();\n }\n let encoding = format.readUInt16LE(0);\n if (encoding === 0xfffe && format.length >= 40 &&\n format.subarray(28, 40).equals(Buffer.from('00001000800000aa00389b71', 'hex'))) {\n encoding = format.readUInt32LE(24);\n }\n const channels = format.readUInt16LE(2);\n const sampleRate = format.readUInt32LE(4);\n const frameBytes = format.readUInt16LE(12);\n const bits = format.readUInt16LE(14);\n if (!channels || !sampleRate || !frameBytes || frameBytes !== channels * bits / 8 || samples.length % frameBytes !== 0 ||\n !(encoding === 1 && [8, 16, 24, 32].includes(bits) || encoding === 3 && [32, 64].includes(bits))) {\n throw invalid();\n }\n const leadingMs = randomInt(MIN_VOICE_PADDING_MS, MAX_VOICE_PADDING_MS + 1);\n const trailingMs = randomInt(MIN_VOICE_PADDING_MS, MAX_VOICE_PADDING_MS + 1);\n const leadingBytes = Math.round(sampleRate * leadingMs / 1000) * frameBytes;\n const trailingBytes = Math.round(sampleRate * trailingMs / 1000) * frameBytes;\n const dataSize = leadingBytes + samples.length + trailingBytes;\n const formatSize = format.length + format.length % 2;\n const totalSize = 12 + 8 + formatSize + 8 + dataSize + dataSize % 2;\n if (totalSize > MAX_AUDIO_BYTES) {\n throw new Error('Padded speech exceeds the audio size limit.');\n }\n const output = Buffer.alloc(totalSize);\n output.write('RIFF', 0);\n output.writeUInt32LE(totalSize - 8, 4);\n output.write('WAVEfmt ', 8);\n output.writeUInt32LE(format.length, 16);\n format.copy(output, 20);\n const dataOffset = 20 + formatSize;\n output.write('data', dataOffset);\n output.writeUInt32LE(dataSize, dataOffset + 4);\n // Unsigned 8-bit PCM uses midpoint 128 for silence; other supported samples use zero.\n output.fill(encoding === 1 && bits === 8 ? 128 : 0, dataOffset + 8, dataOffset + 8 + dataSize);\n samples.copy(output, dataOffset + 8 + leadingBytes);\n return { data: output, filename: 'reply.wav', mimeType: 'audio/wav' };\n}\n\n/** Synthesizes the bounded public reply text and pads it before any send attempt. */\nexport class VoiceSynthesizer {\n public constructor(private readonly model: SpeechModel, private readonly options: Readonly<Record<string, unknown>> = {}) {}\n\n public async synthesize(text: string, signal?: AbortSignal): Promise<AudioFile> {\n const audio = await this.model.synthesize(text, this.options, signal);\n signal?.throwIfAborted();\n return padVoiceAudio(audio);\n }\n}\n","module.exports = require(\"node:child_process\");","module.exports = require(\"node:crypto\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:os\");","module.exports = require(\"node:path\");","module.exports = require(\"node:readline/promises\");","module.exports = require(\"node:timers/promises\");","// The module cache\nconst __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tconst cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tconst module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import { CliError, reportError } from './cli-support';\nimport { runAdd } from './add';\nimport { runList } from './list';\nimport { runRemove } from './remove';\nimport { runTest } from './test';\nimport { runTestStt } from './test-stt';\nimport { runTestTts } from './test-tts';\nimport { runUpdate } from './update';\n\nconst COMMANDS = ['add', 'test', 'test-stt', 'test-tts', 'list', 'update', 'remove'];\n\n/**\n * General help text.\n */\nconst HELP_TEXT = `Usage: chatserver-models <command> [options]\n\nManage OpenAI-compatible chat, speech-to-text, and text-to-speech models. Provider details live in\n<config_dir>/models.json; each provider's API key lives in the OS credential manager\nunder the provider name.\n\nCommands:\n add Add a model (guided setup when options are omitted)\n test Send a prompt to a configured model\n test-stt Transcribe a local audio file with a configured model\n test-tts Synthesize test speech and save a padded WAV file\n list List configured providers and models\n update Edit provider/model settings (guided editor without edits)\n remove Remove a model (and its provider once empty)\n\nCommon options:\n --config_dir <dir> Config folder (default: CHATSERVER_CONFIG_DIR or the per-user folder)\n -h, --help Show help for a command\n\nRun \"chatserver-models <command> --help\" for command-specific options.\nRun \"chatserver-models add\" or \"chatserver-models update\" for guided terminal setup.\n`;\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const command = argv[0];\n\n if (command === undefined || command === '-h' || command === '--help' || command === 'help') {\n console.log(HELP_TEXT);\n return;\n }\n\n const rest = argv.slice(1);\n\n switch (command) {\n case 'add':\n await runAdd(rest);\n return;\n case 'test':\n await runTest(rest);\n return;\n case 'test-stt':\n await runTestStt(rest);\n return;\n case 'test-tts':\n await runTestTts(rest);\n return;\n case 'list':\n await runList(rest);\n return;\n case 'update':\n await runUpdate(rest);\n return;\n case 'remove':\n await runRemove(rest);\n return;\n default:\n throw new CliError(\n `Unknown command: ${command}. Expected one of: ${COMMANDS.join(', ')}.`\n );\n }\n}\n\nmain().catch((error) => {\n reportError(error);\n});\n"],"names":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"models/chatserver-models.js","mappings":"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","sources":["webpack:///./src/config-dir.ts","webpack:///./src/limit.ts","webpack:///./src/messagers/audio.ts","webpack:///./src/messagers/media.ts","webpack:///./src/models/add.ts","webpack:///./src/models/audio-conversion.ts","webpack:///./src/models/cli-support.ts","webpack:///./src/models/command-support.ts","webpack:///./src/models/credentials.ts","webpack:///./src/models/list.ts","webpack:///./src/models/model-store.ts","webpack:///./src/models/remove.ts","webpack:///./src/models/responses-client.ts","webpack:///./src/models/retry.ts","webpack:///./src/models/setup.ts","webpack:///./src/models/speech-client.ts","webpack:///./src/models/test-stt.ts","webpack:///./src/models/test-tts.ts","webpack:///./src/models/test.ts","webpack:///./src/models/transcriptions-client.ts","webpack:///./src/models/update.ts","webpack:///./src/models/voice-synthesizer.ts","webpack:///./src/type-guards.ts","webpack:///external node-commonjs \"node:child_process\"","webpack:///external node-commonjs \"node:crypto\"","webpack:///external node-commonjs \"node:fs\"","webpack:///external node-commonjs \"node:os\"","webpack:///external node-commonjs \"node:path\"","webpack:///external node-commonjs \"node:readline/promises\"","webpack:///external node-commonjs \"node:timers/promises\"","webpack:///webpack/bootstrap","webpack:///./src/models/chatserver-models.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\n/**\n * Returns the platform-appropriate per-user config folder.\n */\nexport function getDefaultConfigDir(platform: NodeJS.Platform = process.platform): string {\n const home = os.homedir();\n\n switch (platform) {\n case 'win32': {\n const appData = process.env.APPDATA ?? path.join(home, 'AppData', 'Roaming');\n return path.join(appData, 'chatserver');\n }\n case 'darwin':\n return path.join(home, 'Library', 'Application Support', 'chatserver');\n default: {\n const configHome = process.env.XDG_CONFIG_HOME ?? path.join(home, '.config');\n return path.join(configHome, 'chatserver');\n }\n }\n}\n","// Keep matching config schema defaults and bounds in sync when changing them here.\n\n// Model input and conversation snapshots.\n/**\n * Budget calculations with the current values:\n * - Recent-message JSON: CONVERSATION_TEXT_TOKENS - CONVERSATION_METADATA_TOKENS\n * = 8,000 - 1,500 = 6,500 tokens; the snapshot including metadata gets 8,000.\n * - Combined text allowance: CONVERSATION_TEXT_TOKENS + MESSAGER_CONTEXT_TOKENS\n * + MAX_MEMORY_TOKEN_LIMIT = 8,000 + 2,000 + 16,000 = 26,000 tokens.\n * With the default memory limit: 8,000 + 2,000 + 1,000 = 11,000 tokens.\n * Metadata is already included in CONVERSATION_TEXT_TOKENS; do not add it again.\n * Actual memory uses messager.memoryTokenLimit; context and memory may be absent.\n * These sums exclude instructions, tool definitions/results, image estimates, and\n * wrapping serialization overhead. The complete input must fit MODEL_INPUT_TOKENS\n * (64,000 tokens), checked separately for each model request.\n */\n/** Text budget for the recent-message snapshot and its metadata. */\nexport const CONVERSATION_TEXT_TOKENS = 8_000;\n/** Snapshot tokens reserved for metadata rather than message text. */\nexport const CONVERSATION_METADATA_TOKENS = 1_500;\n/** Maximum recent source messages retained per conversation. */\nexport const MAX_MESSAGES_PER_SNAPSHOT = 30;\n/** Maximum text tokens retained from one source message. */\nexport const MESSAGE_TEXT_TOKENS = 2_000;\n/** Fallback text budget when the last snapshot message is still too large. */\nexport const MIN_MESSAGE_TEXT_TOKENS = 500;\n/** Maximum tokens for a sender or channel identifier in model input. */\nexport const CONVERSATION_ID_TOKENS = 100;\n/** Maximum tokens for one sender display name in conversational context. */\nexport const SENDER_NAME_TOKENS = 100;\n/** Separate token budget for the optional messager context file. */\nexport const MESSAGER_CONTEXT_TOKENS = 2_000;\n/** Total application input budget, including instructions, tools, and images. */\nexport const MODEL_INPUT_TOKENS = 64_000;\n/** Maximum retained tokens from one tool result. */\nexport const TOOL_RESULT_TOKENS = 8_000;\n/** Estimated input tokens reserved per image, independent of provider billing. */\nexport const IMAGE_TOKEN_RESERVE = 2_048;\n/** Tokens reserved for the truncation marker when bounding text. */\nexport const TRUNCATION_MARKER_TOKENS = 8;\n\n// Public replies and persistent conversation memory.\n/** Prompt target for a complete, concise public reply. */\nexport const SOFT_REPLY_TOKEN_LIMIT = 150;\n/** Hard token cap applied to outgoing reply text. */\nexport const HARD_REPLY_TOKEN_LIMIT = 200;\n/** Default per-conversation budget for memory notes and confirmed replies. */\nexport const DEFAULT_MEMORY_TOKEN_LIMIT = 1_000;\n/** Smallest configurable memory budget, allowing room for entry metadata. */\nexport const MIN_MEMORY_TOKEN_LIMIT = 100;\n/** Largest configurable memory budget and memory input allowance. */\nexport const MAX_MEMORY_TOKEN_LIMIT = 16_000;\n/** Memory lifetime measured from the earliest original source. */\nexport const MEMORY_RETENTION_MS = 3 * 24 * 60 * 60 * 1_000;\n/** Interval between cleanup passes over inactive memory files. */\nexport const MEMORY_CLEANUP_INTERVAL_MS = 60 * 60 * 1_000;\n/** Maximum memory file size accepted from disk. */\nexport const MAX_MEMORY_FILE_BYTES = 256 * 1_024;\n/** Maximum retained text tokens in a single memory note. */\nexport const MEMORY_NOTE_TOKENS = 300;\n/** Maximum characters accepted in a model-proposed memory note. */\nexport const MAX_MEMORY_NOTE_CHARS = 4_000;\n/** Maximum new or replacement memory notes proposed per turn. */\nexport const MAX_MEMORY_NOTES_PER_UPDATE = 20;\n/** Maximum existing note IDs the model may forget per turn. */\nexport const MAX_MEMORY_FORGET_IDS = 50;\n/** Maximum supporting source IDs per proposed memory note. */\nexport const MAX_MEMORY_SOURCE_IDS = 64;\n/** Maximum characters in memory, source, and cached image IDs; accommodates encoded WeChat IDs. */\nexport const MAX_MEMORY_ID_CHARS = 1_024;\n\n// Images, voice input, and local audio conversion.\n/** Default maximum generated image width in pixels. */\nexport const DEFAULT_IMAGE_WIDTH_LIMIT = 1024;\n/** Default maximum generated image height in pixels. */\nexport const DEFAULT_IMAGE_HEIGHT_LIMIT = 1024;\n/** Daily image generation allowance shared by a messager's conversations. */\nexport const DEFAULT_DAILY_IMAGE_GEN_LIMIT = 10;\n/** Maximum decoded bytes in one received image. */\nexport const MAX_IMAGE_BYTES = 5 * 1_024 * 1_024;\n/** Maximum base64 characters encoding an allowed image. */\nexport const MAX_ENCODED_IMAGE_BYTES = 4 * Math.ceil(MAX_IMAGE_BYTES / 3);\n/** Maximum decoded bytes in one voice recording or converted audio file. */\nexport const MAX_AUDIO_BYTES = 20 * 1_024 * 1_024;\n/** Maximum base64 characters encoding an allowed voice recording. */\nexport const MAX_ENCODED_AUDIO_BYTES = 4 * Math.ceil(MAX_AUDIO_BYTES / 3);\n/** Maximum images attached to a single model snapshot. */\nexport const MAX_IMAGES_PER_SNAPSHOT = 4;\n/** Maximum persisted images per conversation; oldest images are evicted first. */\nexport const MAX_CACHED_IMAGES_PER_CONVERSATION = 30;\n/** Maximum bytes in a conversation's image map, separate from its text memory. */\nexport const MAX_IMAGE_CACHE_FILE_BYTES = 64 * 1_024 * 1_024;\n/** Prompt allowance for references to older cached images, excluding image bytes. */\nexport const CACHED_IMAGE_REFERENCE_TOKENS = 1_000;\n/** Maximum download attempts per image or voice source. */\nexport const MAX_MEDIA_ATTEMPTS = 3;\n/** Extra JSON response bytes allowed around base64 media. */\nexport const MEDIA_RESPONSE_OVERHEAD_BYTES = 64 * 1_024;\n/** Maximum characters accepted from a speech-to-text model. */\nexport const MAX_TRANSCRIPT_CHARS = 32_000;\n/** Default deadline for a local audio conversion command. */\nexport const AUDIO_CONVERSION_TIMEOUT_MS = 30_000;\n/** Maximum stderr characters retained from an audio converter. */\nexport const AUDIO_CONVERSION_STDERR_CHARS = 8_192;\n/** Maximum retries when deleting audio conversion temporary files. */\nexport const AUDIO_CLEANUP_RETRIES = 3;\n/** Delay between retries deleting conversion temporary files. */\nexport const AUDIO_CLEANUP_RETRY_DELAY_MS = 100;\n/** Minimum independently sampled silence before and after a synthesized reply. */\nexport const MIN_VOICE_PADDING_MS = 500;\n/** Inclusive maximum independently sampled silence at each end of a voice reply. */\nexport const MAX_VOICE_PADDING_MS = 2_000;\n/** Maximum characters submitted to a speech synthesis endpoint. */\nexport const MAX_TTS_INPUT_CHARS = 4_096;\n/** Maximum wait for one WeChat text send or media job to confirm delivery. */\nexport const WECHAT_SEND_TIMEOUT_MS = 180_000;\n/** Deadline for a best-effort send or job cancellation after failure or shutdown. */\nexport const WECHAT_SEND_CANCEL_TIMEOUT_MS = 5_000;\n\n// Model requests, pacing, and transport defaults.\n/** Maximum configured timeout or timer delay: one hour. */\nexport const MAX_TIMER_MS = 60 * 60 * 1_000;\n/** Default provider deadline for generation and transcription requests. */\nexport const DEFAULT_MODEL_TIMEOUT_MS = 300_000;\n/** Retries after the initial attempt of a complete model generation. */\nexport const MAX_MODEL_RETRIES = 3;\n/** Delay between complete model-generation retries. */\nexport const MODEL_RETRY_DELAY_MS = 10_000;\n/** Maximum calls per tool category and local tool-producing rounds per generation attempt. */\nexport const MAX_MODEL_TOOL_CALLS = 8;\n/** Maximum wait for model discovery in guided setup. */\nexport const MODEL_DISCOVERY_TIMEOUT_MS = 10_000;\n/** Maximum choices printed when guided setup also accepts a custom value. */\nexport const MAX_SETUP_CHOICES = 30;\n/** Minimum random delay before a reply slot becomes available. */\nexport const MIN_REPLY_DELAY_MS = 60_000;\n/** Inclusive maximum random delay before a reply slot becomes available. */\nexport const MAX_REPLY_DELAY_MS = 180_000;\n/** Maximum deferred conversation retries for pending media. */\nexport const MAX_PENDING_MEDIA_RETRIES = 2;\n/** Initial delay for pending-media retries; doubles on each retry. */\nexport const PENDING_MEDIA_RETRY_DELAY_MS = 30_000;\n/** Default base delay before reconnecting an interrupted WeChat event stream. */\nexport const WECHAT_RECONNECT_INTERVAL_MS = 1_000;\n/** Default deadline for each WeChat REST request and SSE connect/idle wait. */\nexport const WECHAT_REQUEST_TIMEOUT_MS = 30_000;\n/** Maximum wait for a WeChat stream reader to acknowledge cancellation. */\nexport const WECHAT_READER_CANCEL_TIMEOUT_MS = 100;\n/** Maximum exponent used by WeChat event-stream reconnect backoff. */\nexport const WECHAT_MAX_BACKOFF_EXPONENT = 6;\n/** Maximum cached WeChat contact and group-member display names. */\nexport const WECHAT_NAME_CACHE_SIZE = 1_000;\n/** Lifetime of a successfully resolved WeChat display name. */\nexport const WECHAT_NAME_TTL_MS = 10 * 60_000;\n/** Lifetime of a failed or empty WeChat display-name lookup. */\nexport const WECHAT_NAME_MISS_TTL_MS = 60_000;\n/** Largest signed 64-bit event cursor accepted from the WeChat daemon. */\nexport const WECHAT_MAX_EVENT_CURSOR = 9_223_372_036_854_775_807n;\n/** Maximum characters buffered for one unterminated SSE line. */\nexport const MAX_SSE_LINE_CHARS = 1_048_576;\n/** Maximum characters accepted in one SSE data payload. */\nexport const MAX_SSE_FRAME_CHARS = 1_048_576;\n/** Maximum bytes read from a rejected SSE response body. */\nexport const MAX_SSE_ERROR_BYTES = 16_384;\n/** Recent live message IDs retained for replay deduplication; cursors are the primary guard. */\nexport const WECHAT_RECENT_MESSAGE_LIMIT = 2_000;\n/** Default interval between ignore-file reload checks; zero disables caching. */\nexport const IGNORE_FILE_RELOAD_INTERVAL_MS = 1_000;\n\n// Tool execution and web content.\n/** Maximum characters in one serialized tool argument object. */\nexport const MAX_TOOL_ARGUMENT_CHARS = 16_384;\n/** Maximum characters in one serialized tool execution result. */\nexport const MAX_TOOL_OUTPUT_CHARS = 32_768;\n/** Maximum transferred bytes in a downloaded web page. */\nexport const MAX_WEB_DOWNLOAD_BYTES = 1_048_576;\n/** Maximum decoded bytes in a web page after decompression. */\nexport const MAX_WEB_DECODED_BYTES = 1_048_576;\n/** Shared deadline for a web download and all its redirects. */\nexport const WEB_REQUEST_TIMEOUT_MS = 15_000;\n/** Maximum redirects followed while reading a public web page. */\nexport const MAX_WEB_REDIRECTS = 5;\n/** Maximum characters in a URL accepted by read_url. */\nexport const MAX_READ_URL_CHARS = 2_048;\n/** Maximum readable characters extracted from one web page. */\nexport const MAX_WEB_TEXT_CHARS = 20_000;\n/** Text-length threshold for marking a page as possibly truncated. */\nexport const WEB_TRUNCATION_THRESHOLD_CHARS = MAX_WEB_TEXT_CHARS - 100;\n/** Maximum HTML nodes visited during traversal or text extraction. */\nexport const MAX_HTML_NODES = 100_000;\n/** Maximum characters retained in a web page title. */\nexport const MAX_WEB_TITLE_CHARS = 500;\n/** Maximum results returned by the built-in web search provider. */\nexport const MAX_SEARCH_RESULTS = 5;\n/** Maximum characters accepted in a web search query. */\nexport const MAX_SEARCH_QUERY_CHARS = 500;\n/** Maximum characters retained in one search-result snippet. */\nexport const MAX_SEARCH_SNIPPET_CHARS = 1_000;\n/** Maximum characters retained in one search-result title. */\nexport const MAX_SEARCH_TITLE_CHARS = 300;\n/** Maximum characters accepted in a calculator expression. */\nexport const MAX_CALCULATE_EXPRESSION_CHARS = 1_000;\n/** Maximum arithmetic grammar tokens accepted by the calculator. */\nexport const MAX_CALCULATE_TOKENS = 256;\n/** Maximum arguments accepted by the calculator's min/max functions. */\nexport const MAX_CALCULATE_ARGUMENTS = 16;\n/** Maximum characters accepted in a current_time timezone name. */\nexport const MAX_TIMEZONE_CHARS = 100;\n","import { MAX_AUDIO_BYTES, MAX_ENCODED_AUDIO_BYTES } from '../limit';\nimport { AudioFile } from './interface';\nimport { MediaUnavailableError } from './media';\n\nconst formats: Record<string, string> = {\n mp3: 'audio/mpeg', mpeg: 'audio/mpeg', mpga: 'audio/mpeg',\n wav: 'audio/wav', ogg: 'audio/ogg', flac: 'audio/flac',\n m4a: 'audio/mp4', mp4: 'audio/mp4', webm: 'audio/webm'\n};\n\n/** Maps an upstream audio MIME type to the extension used for STT uploads. */\nexport function audioExtension(mimeType: string): string {\n const type = mimeType.split(';')[0].trim().toLowerCase();\n const extension = Object.keys(formats).find((key) => formats[key] === type);\n if (extension === undefined) {\n throw new MediaUnavailableError(`Unsupported voice MIME type \"${mimeType}\"; agent-wechat must provide decoded WAV or another supported audio format.`);\n }\n return extension;\n}\n\n/** Decodes supported upstream audio without writing files or attempting local conversion. */\nexport function audioFile(data: string, format: string, id: string | number): AudioFile {\n const extension = format.toLowerCase();\n const mimeType = formats[extension];\n if (!Object.hasOwn(formats, extension)) {\n throw new MediaUnavailableError(`Unsupported voice format \"${format}\"; agent-wechat must provide decoded WAV or another supported audio format.`);\n }\n if (!data || data.length > MAX_ENCODED_AUDIO_BYTES || data.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/.test(data)) {\n throw new MediaUnavailableError(`Voice data must be valid base64 no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const bytes = Buffer.from(data, 'base64');\n if (bytes.length > MAX_AUDIO_BYTES || bytes.toString('base64') !== data ||\n bytes.subarray(0, 16).toString('ascii').includes('#!SILK')) {\n throw new MediaUnavailableError('Voice data is invalid, oversized, or unconverted SILK.');\n }\n return { data: bytes, filename: `voice_${id}.${extension}`, mimeType };\n}\n","/** A terminal media failure; retrying the same bytes will not help. */\nexport class MediaUnavailableError extends Error {}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { createCredentialStore } from './credentials';\nimport { CliError, hasFlag, optionalValue, promptLine, resolveConfigDir } from './cli-support';\nimport { modelTimeoutOption, newApiKey, parseCommandOptions } from './command-support';\nimport { setupBaseUrl, setupInteractive, setupModelId, setupPrompt, setupProvider, setupValue } from './setup';\nimport {\n ensureProvider,\n findModel,\n findProvider,\n loadModels,\n saveModels,\n upsertModel\n} from './model-store';\n\n/**\n * Help text for `chatserver-models add`.\n */\nexport const ADD_HELP = `Usage: chatserver-models add [options]\n\nAdds a model to a provider in models.json and stores the provider's API key in the OS\ncredential manager. The provider is created when it does not exist yet.\nRun without options for guided setup. Missing provider/model details are prompted\nin a terminal; available model IDs are fetched from the provider when possible.\n\nOptions:\n --provider <name> Provider name, also the credential account\n --model <id> Model identifier sent to the API\n --name <name> Name used to refer to the model (default: the model id)\n --base-url <url> OpenAI-compatible base URL (required for new providers)\n --api-key <key> API key to store for the provider\n --timeout <ms> Provider model timeout (default: ${DEFAULT_MODEL_TIMEOUT_MS} for new providers)\n --config_dir <dir> Config folder\n --force Overwrite an existing model without asking\n -i, --interactive Prompt for the optional model name too\n -h, --help Show this help\n\nWhen the provider has no stored key, the API key is read from --api-key,\nOPENAI_API_KEY, or an interactive prompt, in that order. It is never written to\nmodels.json.\nWithout a terminal, pass --provider and --model, plus --base-url for new providers.\n`;\n\n/**\n * Adds a model to a provider, creating the provider when needed.\n */\nexport async function runAdd(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: {\n '--provider': 'provider',\n '--name': 'name',\n '--model': 'model',\n '--base-url': 'baseUrl',\n '--api-key': 'apiKey',\n '--timeout': 'timeout'\n },\n booleanFlags: { '--force': 'force', '--interactive': 'interactive', '-i': 'interactive' }\n });\n\n if (hasFlag(cli, 'help')) {\n console.log(ADD_HELP);\n return;\n }\n\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n const guided = setupInteractive(cli, optionalValue(cli, 'provider') === undefined || optionalValue(cli, 'model') === undefined);\n const suppliedId = setupValue(cli, 'model', '--model');\n const suppliedName = setupValue(cli, 'name', '--name');\n const suppliedKey = setupValue(cli, 'apiKey', '--api-key');\n const urlValue = setupValue(cli, 'baseUrl', '--base-url');\n let baseUrl = urlValue === undefined ? undefined : setupBaseUrl(urlValue);\n const timeoutValue = optionalValue(cli, 'timeout');\n const timeoutMs = timeoutValue === undefined ? undefined : modelTimeoutOption(timeoutValue);\n const file = await loadModels(configDir);\n const providerName = await setupProvider(file, cli, true);\n if (providerName.includes('/')) {\n throw new CliError('Provider names cannot contain / because config references use provider/model-id.');\n }\n if (suppliedId === undefined && !process.stdin.isTTY) {\n throw new CliError('--model is required without a terminal.');\n }\n\n const existingProvider = findProvider(file, providerName);\n if (existingProvider === undefined && baseUrl === undefined) {\n if (!process.stdin.isTTY) {\n throw new CliError('--base-url is required when creating a provider.');\n }\n baseUrl = await setupPrompt('API base URL (for example http://host.local:1234/v1)', undefined, setupBaseUrl);\n }\n const provider = existingProvider ?? ensureProvider(file, providerName, baseUrl ?? '');\n\n if (existingProvider !== undefined && baseUrl !== undefined) {\n provider.baseUrl = baseUrl;\n }\n if (timeoutMs !== undefined) {\n provider.timeoutMs = timeoutMs;\n }\n\n // Reuse the provider's saved key. An unrelated OPENAI_API_KEY must not rotate it.\n const credentials = createCredentialStore();\n const storedKey = suppliedKey === undefined ? await credentials.get(providerName) : undefined;\n const needsKey = suppliedKey !== undefined || !storedKey;\n const apiKey = suppliedKey ?? (storedKey || await newApiKey(cli, providerName));\n const modelId = suppliedId ?? await setupModelId(provider, apiKey);\n const name = suppliedName ?? (guided ? await setupPrompt('Model name', modelId) : modelId);\n\n if (findModel(provider, name) !== undefined && !hasFlag(cli, 'force')) {\n if (!process.stdin.isTTY) {\n throw new CliError(`Model \"${name}\" already exists. Re-run with --force to overwrite it.`);\n }\n const answer = await promptLine(`Model \"${name}\" already exists. Overwrite? [y/N] `);\n if (!/^y(es)?$/i.test(answer)) {\n console.log('Cancelled.');\n return;\n }\n }\n\n if (needsKey) {\n await credentials.set(providerName, apiKey);\n console.log(`API key stored in the ${credentials.name} (account: \"${providerName}\").`);\n }\n\n upsertModel(provider, { id: modelId, name });\n const modelsPath = await saveModels(configDir, file);\n\n console.log(`Saved model \"${name}\" (${modelId}) to ${modelsPath}.`);\n console.log(`Config reference: ${providerName}/${modelId}`);\n console.log(`Test it with: chatserver-models test --provider \"${providerName}\" --name \"${name}\" --config_dir \"${configDir}\"`);\n}\n","import {\n AUDIO_CLEANUP_RETRIES,\n AUDIO_CLEANUP_RETRY_DELAY_MS,\n AUDIO_CONVERSION_STDERR_CHARS,\n AUDIO_CONVERSION_TIMEOUT_MS,\n MAX_AUDIO_BYTES,\n MAX_TIMER_MS\n} from '../limit';\nimport { spawn } from 'node:child_process';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { AudioFile } from '../messagers/interface';\n\n/** Runs a configured command with bounded diagnostics, cancellation, and a process-tree deadline. */\nasync function runConversion(command: string, directory: string, timeoutMs: number, signal?: AbortSignal): Promise<void> {\n signal?.throwIfAborted();\n return new Promise((resolve, reject) => {\n const child = spawn(command, {\n cwd: directory, shell: true, windowsHide: true,\n detached: process.platform !== 'win32', stdio: ['ignore', 'ignore', 'pipe']\n });\n let stderr = '';\n let settled = false;\n const finish = (error?: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n if (error === undefined) {\n resolve();\n } else {\n reject(error);\n }\n };\n const stop = (error: Error): void => {\n if (settled) {\n return;\n }\n if (child.pid !== undefined) {\n if (process.platform === 'win32') {\n const killer = spawn('taskkill', ['/PID', String(child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' });\n killer.on('error', () => child.kill('SIGKILL'));\n killer.unref();\n } else {\n try {\n process.kill(-child.pid, 'SIGKILL');\n } catch {\n child.kill('SIGKILL');\n }\n }\n }\n child.stderr?.destroy();\n child.unref();\n finish(error);\n };\n const abort = (): void => stop(signal?.reason instanceof Error ? signal.reason : new Error('Audio conversion cancelled.'));\n const timer = setTimeout(() => stop(new Error(`Audio conversion timed out after ${timeoutMs} ms.`)), timeoutMs);\n child.stderr?.setEncoding('utf8');\n child.stderr?.on('data', (chunk: string) => {\n stderr = (stderr + chunk).slice(0, AUDIO_CONVERSION_STDERR_CHARS);\n });\n child.on('error', () => finish(new Error('Unable to start audioConversionCmd. Check the command and installed converter.')));\n child.on('close', (code) => finish(code === 0 ? undefined :\n new Error(`Audio conversion failed (exit ${code ?? 'unknown'})${stderr.trim() ? `: ${stderr.trim()}` : '.'}`)));\n signal?.addEventListener('abort', abort, { once: true });\n if (signal?.aborted) {\n abort();\n }\n });\n}\n\n/** Converts input to a real WAV file in an isolated temporary directory, then removes both files. */\nexport async function convertAudio(\n audio: AudioFile,\n command: string,\n signal?: AbortSignal,\n timeoutMs = AUDIO_CONVERSION_TIMEOUT_MS\n): Promise<AudioFile> {\n signal?.throwIfAborted();\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > MAX_TIMER_MS) {\n throw new Error(`Audio conversion timeout must be a positive integer up to ${MAX_TIMER_MS}.`);\n }\n if (!command.includes('{input}') || !command.includes('{output}')) {\n throw new Error('audioConversionCmd must contain {input} and {output} placeholders.');\n }\n if (!audio.data.byteLength || audio.data.byteLength > MAX_AUDIO_BYTES) {\n throw new Error(`Audio conversion input must be nonempty and no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const directory = await fs.mkdtemp(path.join(os.tmpdir(), 'chatserver-audio-'));\n const extension = path.extname(audio.filename);\n const inputName = `input${/^\\.[a-z0-9]+$/i.test(extension) ? extension : '.bin'}`;\n const outputName = 'output.wav';\n try {\n await fs.writeFile(path.join(directory, inputName), audio.data, { mode: 0o600 });\n // Only generated ASCII filenames enter the command; message content and paths never do.\n const expanded = command.replaceAll('{input}', inputName).replaceAll('{output}', outputName);\n await runConversion(expanded, directory, timeoutMs, signal);\n signal?.throwIfAborted();\n const outputPath = path.join(directory, outputName);\n let stat;\n try {\n stat = await fs.lstat(outputPath);\n } catch {\n throw new Error('audioConversionCmd did not create its {output} WAV file.');\n }\n if (!stat.isFile() || stat.size < 44 || stat.size > MAX_AUDIO_BYTES) {\n throw new Error(`Converted audio must be a nonempty WAV file no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const data = await fs.readFile(outputPath);\n if (data.subarray(0, 4).toString('ascii') !== 'RIFF' || data.subarray(8, 12).toString('ascii') !== 'WAVE') {\n throw new Error('audioConversionCmd must produce WAV data, not just rename the input.');\n }\n return { data, mimeType: 'audio/wav', filename: `${path.basename(audio.filename, extension) || 'voice'}.wav` };\n } finally {\n await fs.rm(directory, { recursive: true, force: true, maxRetries: AUDIO_CLEANUP_RETRIES, retryDelay: AUDIO_CLEANUP_RETRY_DELAY_MS });\n }\n}\n","import path from 'node:path';\nimport * as readline from 'node:readline/promises';\nimport { getDefaultConfigDir } from '../config-dir';\n\n/**\n * Raised for invalid command-line usage.\n */\nexport class CliError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = 'CliError';\n }\n}\n\n/**\n * Describes which command-line options carry a value and which are booleans.\n */\nexport interface CommandLineSpec {\n /** Map of flag spelling (including dashes) to a stable value key. */\n valueFlags: Record<string, string>;\n /** Map of flag spelling (including dashes) to a stable boolean key. */\n booleanFlags: Record<string, string>;\n}\n\n/**\n * Parsed command line.\n */\nexport interface CommandLine {\n /** Values keyed by the names from {@link CommandLineSpec.valueFlags}. */\n values: Map<string, string>;\n /** Boolean flags keyed by the names from {@link CommandLineSpec.booleanFlags}. */\n flags: Set<string>;\n /** Arguments that were not options. */\n positionals: string[];\n}\n\n/**\n * Splits `--flag=value` into its name and inline value.\n */\nfunction splitFlag(arg: string): [string, string | undefined] {\n const index = arg.indexOf('=');\n if (index === -1) {\n return [arg, undefined];\n }\n return [arg.slice(0, index), arg.slice(index + 1)];\n}\n\n/**\n * Parses `--flag value`, `--flag=value`, and boolean flags.\n */\nexport function parseCommandLine(argv: string[], spec: CommandLineSpec): CommandLine {\n const values = new Map<string, string>();\n const flags = new Set<string>();\n const positionals: string[] = [];\n\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i];\n\n if (!arg.startsWith('-')) {\n positionals.push(arg);\n continue;\n }\n\n const [name, inlineValue] = splitFlag(arg);\n const valueKey = spec.valueFlags[name];\n\n if (valueKey !== undefined) {\n const value = inlineValue ?? argv[i + 1];\n if (value === undefined || (inlineValue === undefined && value.startsWith('-'))) {\n throw new CliError(`${name} requires a value.`);\n }\n values.set(valueKey, value);\n if (inlineValue === undefined) {\n i += 1;\n }\n continue;\n }\n\n const flagKey = spec.booleanFlags[name];\n if (flagKey !== undefined) {\n if (inlineValue !== undefined) {\n throw new CliError(`${name} does not take a value.`);\n }\n flags.add(flagKey);\n continue;\n }\n\n throw new CliError(`Unknown option: ${name}. Run with --help for usage.`);\n }\n\n return { values, flags, positionals };\n}\n\n/**\n * Reads an option's value.\n */\nexport function optionalValue(cli: CommandLine, key: string): string | undefined {\n return cli.values.get(key);\n}\n\n/**\n * Reads an option's value, failing when it is missing.\n */\nexport function requireValue(cli: CommandLine, key: string, label: string): string {\n const value = cli.values.get(key);\n if (value === undefined || value === '') {\n throw new CliError(`${label} is required.`);\n }\n return value;\n}\n\n/**\n * Returns true when a boolean flag was supplied.\n */\nexport function hasFlag(cli: CommandLine, key: string): boolean {\n return cli.flags.has(key);\n}\n\n/**\n * Resolves the config folder from an option, the environment, or the per-user default.\n */\nexport function resolveConfigDir(option?: string): string {\n return path.resolve(option ?? process.env.CHATSERVER_CONFIG_DIR ?? getDefaultConfigDir());\n}\n\n/**\n * Prompts for a line of text.\n */\nexport async function promptLine(question: string): Promise<string> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n return (await rl.question(question)).trim();\n } finally {\n rl.close();\n }\n}\n\n/**\n * Prompts for a secret without echoing keystrokes when stdin is a terminal.\n */\nexport function promptHidden(question: string): Promise<string> {\n const stdin = process.stdin;\n\n if (!stdin.isTTY) {\n throw new CliError('Cannot prompt for a secret without a terminal. Pass --api-key instead.');\n }\n\n return new Promise((resolve, reject) => {\n process.stdout.write(question);\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n let value = '';\n\n const onData = (chunk: string): void => {\n for (const char of chunk) {\n if (char === '\\r' || char === '\\n') {\n finish(value);\n return;\n }\n if (char === '\\u0003') {\n finish(undefined, new CliError('Cancelled.'));\n return;\n }\n if (char === '\\u007f' || char === '\\b') {\n value = value.slice(0, -1);\n continue;\n }\n value += char;\n }\n };\n\n const finish = (result: string | undefined, error?: Error): void => {\n stdin.setRawMode(false);\n stdin.pause();\n stdin.removeListener('data', onData);\n process.stdout.write('\\n');\n if (error !== undefined) {\n reject(error);\n return;\n }\n resolve(result ?? '');\n };\n\n stdin.on('data', onData);\n });\n}\n\n/**\n * Prints an error and marks the process as failed.\n */\nexport function reportError(error: unknown): void {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`[models] ${message}`);\n process.exitCode = 1;\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { getModelApiKey } from './credentials';\nimport {\n CliError,\n CommandLine,\n CommandLineSpec,\n optionalValue,\n parseCommandLine,\n promptHidden,\n requireValue,\n resolveConfigDir\n} from './cli-support';\nimport { findModel, findProvider, getModelsPath, loadModels, ModelEntry, ModelsFile, ProviderConfig } from './model-store';\nimport { resolveModelTimeoutMs } from './responses-client';\n\n/**\n * Default prompt used by `test` when --prompt is not supplied.\n */\nexport const DEFAULT_PROMPT = 'Say hello in one short sentence.';\n\nconst COMMON_VALUE_FLAGS: Record<string, string> = {\n '--config_dir': 'configDir',\n '--config-dir': 'configDir',\n '-c': 'configDir'\n};\n\nconst COMMON_BOOLEAN_FLAGS: Record<string, string> = {\n '-h': 'help',\n '--help': 'help'\n};\n\n/**\n * Parses options for one command, merging in the shared flags.\n */\nexport function parseCommandOptions(argv: string[], spec: CommandLineSpec): CommandLine {\n return parseCommandLine(argv, {\n valueFlags: { ...COMMON_VALUE_FLAGS, ...spec.valueFlags },\n booleanFlags: { ...COMMON_BOOLEAN_FLAGS, ...spec.booleanFlags }\n });\n}\n\n/**\n * Looks up a provider or fails with the available names.\n */\nexport async function requireProvider(\n configDir: string,\n name: string\n): Promise<{ file: ModelsFile; provider: ProviderConfig }> {\n const file = await loadModels(configDir);\n const provider = findProvider(file, name);\n if (provider === undefined) {\n const available = file.providers.map((entry) => entry.provider).join(', ') || '(none)';\n throw new CliError(\n `Provider \"${name}\" not found in ${getModelsPath(configDir)}. Available: ${available}.`\n );\n }\n return { file, provider };\n}\n\n/**\n * Looks up a model within a provider or fails with the available names.\n */\nexport function requireModel(provider: ProviderConfig, name: string): ModelEntry {\n const model = findModel(provider, name);\n if (model === undefined) {\n const available = provider.models.map((entry) => entry.name).join(', ') || '(none)';\n throw new CliError(\n `Model \"${name}\" not found for provider \"${provider.provider}\". Available: ${available}.`\n );\n }\n return model;\n}\n\n/**\n * Reads the CLI timeout using the same validation as models.json and HTTP calls.\n */\nexport function modelTimeoutOption(\n value: string | undefined,\n fallback: number = DEFAULT_MODEL_TIMEOUT_MS\n): number {\n try {\n return resolveModelTimeoutMs(value === undefined ? fallback : Number(value));\n } catch (error) {\n throw new CliError(`--timeout: ${(error as Error).message}`);\n }\n}\n\n/**\n * Reads a new API key from the command line, the environment, or a prompt.\n */\nexport async function newApiKey(cli: CommandLine, provider: string): Promise<string> {\n const fromOption = optionalValue(cli, 'apiKey');\n if (fromOption !== undefined && fromOption !== '') {\n return fromOption;\n }\n\n const fromEnvironment = process.env.OPENAI_API_KEY;\n if (fromEnvironment !== undefined && fromEnvironment !== '') {\n return fromEnvironment;\n }\n\n const value = await promptHidden(`API key for provider \"${provider}\": `);\n if (value === '') {\n throw new CliError('An API key is required.');\n }\n return value;\n}\n\n/**\n * Finds the API key used to call a provider's models.\n */\nexport async function existingApiKey(provider: ProviderConfig): Promise<string> {\n return getModelApiKey(provider.provider);\n}\n\n/** Resolves the same model alias, provider key, and timeout for every model-test command. */\nexport async function loadTestModel(cli: CommandLine): Promise<{\n provider: ProviderConfig; model: ModelEntry; apiKey: string; timeoutMs: number;\n}> {\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n const providerName = requireValue(cli, 'provider', '--provider');\n const name = requireValue(cli, 'name', '--name');\n const { provider } = await requireProvider(configDir, providerName);\n const model = requireModel(provider, name);\n const timeoutMs = modelTimeoutOption(optionalValue(cli, 'timeout'), provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS);\n const apiKey = await existingApiKey(provider);\n return { provider, model, apiKey, timeoutMs };\n}\n","import { execFile, spawn } from 'node:child_process';\n\n/**\n * Service name used for every credential this project stores, keeping ChatServer keys\n * separate from anything else in the OS credential manager.\n */\nexport const CREDENTIAL_SERVICE = 'chatserver-models';\n\n/**\n * Raised when credentials cannot be read from or written to the OS credential manager.\n */\nexport class CredentialError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = 'CredentialError';\n }\n}\n\n/**\n * Stores and retrieves secrets in the operating system's credential manager.\n */\nexport interface CredentialStore {\n /** Human-readable backend name, used in logs and errors. */\n readonly name: string;\n /** Returns the secret for `account`, or undefined when nothing is stored. */\n get(account: string): Promise<string | undefined>;\n /** Creates or replaces the secret for `account`. */\n set(account: string, secret: string): Promise<void>;\n /** Removes the secret for `account`, ignoring entries that do not exist. */\n delete(account: string): Promise<void>;\n}\n\n/**\n * Runs a command and resolves with its standard output.\n */\nfunction run(\n command: string,\n args: string[],\n environment?: NodeJS.ProcessEnv\n): Promise<string> {\n const env = environment === undefined ? process.env : { ...process.env, ...environment };\n\n return new Promise((resolve, reject) => {\n execFile(command, args, { encoding: 'utf8', env }, (error, stdout) => {\n if (error !== null) {\n reject(error);\n return;\n }\n resolve(stdout);\n });\n });\n}\n\n/**\n * Runs a command, writing `input` to its standard input.\n */\nfunction runWithInput(command: string, args: string[], input: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: ['pipe', 'ignore', 'pipe'] });\n let stderr = '';\n\n child.stderr.setEncoding('utf8');\n child.stderr.on('data', (chunk: string) => {\n stderr += chunk;\n });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(stderr.trim() || `${command} exited with code ${code ?? 'unknown'}`));\n });\n\n child.stdin.end(input);\n });\n}\n\n/**\n * Removes a single trailing newline without touching other whitespace in a secret.\n */\nfunction stripTrailingNewline(value: string): string {\n return value.replace(/\\r?\\n$/, '');\n}\n\n/**\n * Escapes a value for use inside a single-quoted PowerShell string.\n */\nfunction powerShellQuote(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\n/**\n * macOS backend built on the `security` command (Keychain).\n */\nclass MacOsKeychainStore implements CredentialStore {\n public readonly name = 'macOS Keychain';\n\n public async get(account: string): Promise<string | undefined> {\n try {\n const stdout = await run('security', [\n 'find-generic-password',\n '-s',\n CREDENTIAL_SERVICE,\n '-a',\n account,\n '-w'\n ]);\n return stripTrailingNewline(stdout) || undefined;\n } catch {\n // The item does not exist, or the user denied access.\n return undefined;\n }\n }\n\n public async set(account: string, secret: string): Promise<void> {\n try {\n await run('security', [\n 'add-generic-password',\n '-s',\n CREDENTIAL_SERVICE,\n '-a',\n account,\n '-w',\n secret,\n '-U'\n ]);\n } catch {\n // execFile errors include the full command, including the password argument.\n throw new CredentialError(\n `Unable to store the API key in the ${this.name}. Check Keychain access permissions.`\n );\n }\n }\n\n public async delete(account: string): Promise<void> {\n try {\n await run('security', [\n 'delete-generic-password',\n '-s',\n CREDENTIAL_SERVICE,\n '-a',\n account\n ]);\n } catch {\n // Nothing stored: nothing to remove.\n }\n }\n}\n\n/**\n * Linux backend built on `secret-tool` from libsecret (GNOME Keyring, KWallet, ...).\n */\nclass SecretServiceStore implements CredentialStore {\n public readonly name = 'Secret Service (secret-tool)';\n\n public async get(account: string): Promise<string | undefined> {\n try {\n const stdout = await run('secret-tool', [\n 'lookup',\n 'service',\n CREDENTIAL_SERVICE,\n 'account',\n account\n ]);\n return stripTrailingNewline(stdout) || undefined;\n } catch {\n return undefined;\n }\n }\n\n public async set(account: string, secret: string): Promise<void> {\n try {\n await runWithInput(\n 'secret-tool',\n [\n 'store',\n '--label',\n `ChatServer model ${account}`,\n 'service',\n CREDENTIAL_SERVICE,\n 'account',\n account\n ],\n secret\n );\n } catch {\n throw new CredentialError(\n `Unable to store the API key in the ${this.name}. ` +\n 'Install libsecret and make sure a keyring is running.'\n );\n }\n }\n\n public async delete(account: string): Promise<void> {\n try {\n await run('secret-tool', [\n 'clear',\n 'service',\n CREDENTIAL_SERVICE,\n 'account',\n account\n ]);\n } catch {\n // Nothing stored: nothing to remove.\n }\n }\n}\n\n/**\n * Windows backend using the CredentialManager PowerShell module.\n *\n * The module is not part of Windows, so the error explains how to install it.\n */\nclass WindowsCredentialStore implements CredentialStore {\n public readonly name = 'Windows Credential Manager';\n\n public async get(account: string): Promise<string | undefined> {\n const script = [\n '$ErrorActionPreference = \"Stop\"',\n 'Import-Module CredentialManager -ErrorAction Stop',\n `$cred = Get-StoredCredential -Target ${powerShellQuote(this.target(account))}`,\n 'if ($null -eq $cred) { exit 3 }',\n '[Console]::Out.Write($cred.GetNetworkCredential().Password)'\n ].join('; ');\n\n try {\n const stdout = await run('powershell', ['-NoProfile', '-NonInteractive', '-Command', script]);\n return stdout || undefined;\n } catch (error) {\n if ((error as { code?: number }).code === 3) {\n return undefined;\n }\n throw new CredentialError(this.installHint());\n }\n }\n\n public async set(account: string, secret: string): Promise<void> {\n const script = [\n '$ErrorActionPreference = \"Stop\"',\n 'Import-Module CredentialManager -ErrorAction Stop',\n `New-StoredCredential -Target ${powerShellQuote(this.target(account))} ` +\n `-UserName ${powerShellQuote(account)} -Password $env:CHATSERVER_SECRET ` +\n '-Persist LocalMachine | Out-Null'\n ].join('; ');\n\n try {\n await run('powershell', ['-NoProfile', '-NonInteractive', '-Command', script], {\n CHATSERVER_SECRET: secret\n });\n } catch {\n throw new CredentialError(this.installHint());\n }\n }\n\n public async delete(account: string): Promise<void> {\n const script = [\n '$ErrorActionPreference = \"Stop\"',\n 'Import-Module CredentialManager -ErrorAction Stop',\n `Remove-StoredCredential -Target ${powerShellQuote(this.target(account))} | Out-Null`\n ].join('; ');\n\n try {\n await run('powershell', ['-NoProfile', '-NonInteractive', '-Command', script]);\n } catch {\n // Nothing stored: nothing to remove.\n }\n }\n\n private target(account: string): string {\n return `${CREDENTIAL_SERVICE}:${account}`;\n }\n\n private installHint(): string {\n return (\n `Unable to use the ${this.name}. Install the CredentialManager PowerShell module ` +\n '(Install-Module CredentialManager -Scope CurrentUser). Check credential manager access permissions.'\n );\n }\n}\n\n/**\n * Returns the credential manager integration for the current platform.\n */\nexport function createCredentialStore(platform: NodeJS.Platform = process.platform): CredentialStore {\n switch (platform) {\n case 'darwin':\n return new MacOsKeychainStore();\n case 'linux':\n return new SecretServiceStore();\n case 'win32':\n return new WindowsCredentialStore();\n default:\n throw new CredentialError(\n `No credential manager integration for platform \"${platform}\". ` +\n 'Set CHATSERVER_MODEL_API_KEY or OPENAI_API_KEY instead.'\n );\n }\n}\n\n/** Reads a provider API key, allowing the same override as the model CLI. */\nexport async function getModelApiKey(provider: string): Promise<string> {\n const override = process.env.CHATSERVER_MODEL_API_KEY;\n if (override !== undefined && override !== '') {\n return override;\n }\n const credentials = createCredentialStore();\n const stored = await credentials.get(provider);\n if (stored === undefined || stored === '') {\n throw new CredentialError(\n `No API key found in the ${credentials.name} for provider \"${provider}\". ` +\n 'Run \"chatserver-models add\" or \"chatserver-models update --api-key\" to store one, ' +\n 'or set CHATSERVER_MODEL_API_KEY.'\n );\n }\n return stored;\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { hasFlag, optionalValue, resolveConfigDir } from './cli-support';\nimport { parseCommandOptions } from './command-support';\nimport { getModelsPath, loadModels } from './model-store';\n\n/**\n * Column widths used by `list` output.\n */\nconst PROVIDER_COLUMN_WIDTH = 16;\nconst NAME_COLUMN_WIDTH = 20;\nconst MODEL_ID_COLUMN_WIDTH = 24;\nconst TIMEOUT_COLUMN_WIDTH = 14;\n\n/**\n * Help text for `chatserver-models list`.\n */\nexport const LIST_HELP = `Usage: chatserver-models list [options]\n\nLists the providers and models in models.json. API keys are not printed.\n\nOptions:\n --json Print the configuration as JSON\n --config_dir <dir> Config folder\n -h, --help Show this help\n`;\n\n/**\n * Prints the configured providers and models.\n */\nexport async function runList(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, { valueFlags: {}, booleanFlags: { '--json': 'json' } });\n\n if (hasFlag(cli, 'help')) {\n console.log(LIST_HELP);\n return;\n }\n\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n const file = await loadModels(configDir);\n\n if (hasFlag(cli, 'json')) {\n console.log(JSON.stringify(file, null, 2));\n return;\n }\n\n if (file.providers.length === 0) {\n console.log(`No providers configured in ${getModelsPath(configDir)}.`);\n return;\n }\n\n console.log(`Providers in ${getModelsPath(configDir)}:`);\n console.log('');\n console.log(\n `${'PROVIDER'.padEnd(PROVIDER_COLUMN_WIDTH)}${'MODEL'.padEnd(NAME_COLUMN_WIDTH)}` +\n `${'MODEL ID'.padEnd(MODEL_ID_COLUMN_WIDTH)}${'TIMEOUT (MS)'.padEnd(TIMEOUT_COLUMN_WIDTH)}BASE URL`\n );\n\n let modelCount = 0;\n for (const provider of file.providers) {\n if (provider.models.length === 0) {\n console.log(\n `${provider.provider.padEnd(PROVIDER_COLUMN_WIDTH)}${'(no models)'.padEnd(NAME_COLUMN_WIDTH)}` +\n `${''.padEnd(MODEL_ID_COLUMN_WIDTH)}` +\n `${String(provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS).padEnd(TIMEOUT_COLUMN_WIDTH)}${provider.baseUrl}`\n );\n continue;\n }\n\n for (const model of provider.models) {\n modelCount += 1;\n console.log(\n `${provider.provider.padEnd(PROVIDER_COLUMN_WIDTH)}` +\n `${model.name.padEnd(NAME_COLUMN_WIDTH)}` +\n `${model.id.padEnd(MODEL_ID_COLUMN_WIDTH)}` +\n `${String(provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS).padEnd(TIMEOUT_COLUMN_WIDTH)}${provider.baseUrl}`\n );\n }\n }\n\n if (modelCount === 0) {\n console.log('');\n console.log('No models configured yet.');\n }\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { promises as fsp } from 'node:fs';\nimport path from 'node:path';\nimport { resolveModelTimeoutMs } from './responses-client';\nimport { isBoolean, isRecord, isString } from '../type-guards';\n\n/**\n * Name of the file that holds model configurations inside the config folder.\n */\nexport const MODELS_FILE_NAME = 'models.json';\n\n/**\n * One model served by a provider.\n *\n * API keys are never stored here. Each provider's key lives in the OS credential\n * manager under the provider name.\n */\nexport interface ModelEntry {\n /** Model identifier sent to the API, for example `gpt-4.1-mini`. */\n id: string;\n /** Name used to refer to this model on the command line. */\n name: string;\n /** Accepts native image content in function_call_output; omitted means false. */\n supportsImageToolResults?: boolean;\n}\n\n/**\n * A provider and the models it serves.\n */\nexport interface ProviderConfig {\n /** Provider name, also the credential manager account for its API key. */\n provider: string;\n /** Required API base URL for Responses (chat) or audio/transcriptions (STT). */\n baseUrl: string;\n /** Timeout for this provider's model requests and tool cycles; defaults to 300000 ms. */\n timeoutMs?: number;\n /** Models available from this provider. */\n models: ModelEntry[];\n}\n\n/**\n * Contents of `models.json`.\n */\nexport interface ModelsFile {\n /** Optional editor schema reference, preserved when the CLI saves this file. */\n $schema?: string;\n version: 1;\n providers: ProviderConfig[];\n}\n\n/**\n * Raised when `models.json` is malformed.\n */\nexport class ModelStoreError extends Error {\n public constructor(message: string) {\n super(message);\n this.name = 'ModelStoreError';\n }\n}\n\n/**\n * Returns the path of `models.json` inside a config folder.\n */\nexport function getModelsPath(configDir: string): string {\n return path.join(configDir, MODELS_FILE_NAME);\n}\n\n/**\n * Validates one model entry.\n */\nfunction parseModelEntry(value: unknown, where: string, seen: Set<string>): ModelEntry {\n if (!isRecord(value)) {\n throw new ModelStoreError(`${where} must be an object.`);\n }\n\n if (!isString(value.id) || value.id.trim() === '') {\n throw new ModelStoreError(`${where}: \"id\" must be a non-empty string.`);\n }\n\n const id = value.id.trim();\n const name = value.name ?? id;\n if (!isString(name) || name.trim() === '') {\n throw new ModelStoreError(`${where}: \"name\" must be a non-empty string.`);\n }\n\n if (value.supportsImageToolResults !== undefined && !isBoolean(value.supportsImageToolResults)) {\n throw new ModelStoreError(`${where}: \"supportsImageToolResults\" must be a boolean.`);\n }\n const entry: ModelEntry = {\n id, name: name.trim(),\n ...(value.supportsImageToolResults === undefined ? {} : { supportsImageToolResults: value.supportsImageToolResults })\n };\n if (seen.has(entry.name)) {\n throw new ModelStoreError(`${where}: duplicate model name \"${entry.name}\".`);\n }\n seen.add(entry.name);\n\n return entry;\n}\n\n/**\n * Validates one provider entry.\n */\nfunction parseProvider(value: unknown, index: number, modelsPath: string): ProviderConfig {\n const where = `${modelsPath}: providers[${index}]`;\n\n if (!isRecord(value)) {\n throw new ModelStoreError(`${where} must be an object.`);\n }\n\n if (!isString(value.provider) || value.provider.trim() === '') {\n throw new ModelStoreError(`${where}: \"provider\" must be a non-empty string.`);\n }\n\n const baseUrl = value.baseUrl;\n if (!isString(baseUrl) || baseUrl.trim() === '') {\n throw new ModelStoreError(`${where}: \"baseUrl\" must be a non-empty string.`);\n }\n\n if (!Array.isArray(value.models)) {\n throw new ModelStoreError(`${where}: \"models\" must be an array.`);\n }\n\n let timeoutMs: number;\n try {\n timeoutMs = resolveModelTimeoutMs(value.timeoutMs);\n } catch (error) {\n throw new ModelStoreError(`${where}: \"timeoutMs\": ${(error as Error).message}`);\n }\n\n const seen = new Set<string>();\n return {\n provider: value.provider.trim(),\n baseUrl: baseUrl.trim(),\n timeoutMs,\n models: value.models.map((model, modelIndex) =>\n parseModelEntry(model, `${where}.models[${modelIndex}]`, seen)\n )\n };\n}\n\n/**\n * Reads `models.json`, returning an empty list when the file does not exist.\n */\nexport async function loadModels(configDir: string): Promise<ModelsFile> {\n const modelsPath = getModelsPath(configDir);\n\n let contents: string;\n try {\n contents = await fsp.readFile(modelsPath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return { version: 1, providers: [] };\n }\n throw new ModelStoreError(`Unable to read ${modelsPath}: ${(error as Error).message}`);\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(contents);\n } catch (error) {\n throw new ModelStoreError(`Invalid JSON in ${modelsPath}: ${(error as Error).message}`);\n }\n\n if (!isRecord(parsed) || !Array.isArray(parsed.providers)) {\n throw new ModelStoreError(`${modelsPath} must contain an object with a \"providers\" array.`);\n }\n\n if (parsed.$schema !== undefined && !isString(parsed.$schema)) {\n throw new ModelStoreError(`${modelsPath}: \"$schema\" must be a string.`);\n }\n\n const seen = new Set<string>();\n const providers = parsed.providers.map((provider, index) => {\n const config = parseProvider(provider, index, modelsPath);\n if (seen.has(config.provider)) {\n throw new ModelStoreError(\n `${modelsPath}: duplicate provider name \"${config.provider}\".`\n );\n }\n seen.add(config.provider);\n return config;\n });\n\n return { ...(parsed.$schema === undefined ? {} : { $schema: parsed.$schema }), version: 1, providers };\n}\n\n/**\n * Writes `models.json`, creating the config folder when needed.\n *\n * Returns the file path that was written.\n */\nexport async function saveModels(configDir: string, file: ModelsFile): Promise<string> {\n const modelsPath = getModelsPath(configDir);\n const payload: ModelsFile = {\n ...(file.$schema === undefined ? {} : { $schema: file.$schema }),\n version: 1,\n providers: file.providers\n };\n\n try {\n await fsp.mkdir(configDir, { recursive: true });\n await fsp.writeFile(modelsPath, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8');\n } catch (error) {\n throw new ModelStoreError(`Unable to write ${modelsPath}: ${(error as Error).message}`);\n }\n\n return modelsPath;\n}\n\n/**\n * Finds a provider by name.\n */\nexport function findProvider(file: ModelsFile, provider: string): ProviderConfig | undefined {\n return file.providers.find((entry) => entry.provider === provider);\n}\n\n/**\n * Returns the provider, creating it when missing.\n */\nexport function ensureProvider(\n file: ModelsFile,\n provider: string,\n baseUrl: string\n): ProviderConfig {\n const existing = findProvider(file, provider);\n if (existing !== undefined) {\n return existing;\n }\n\n if (!baseUrl.trim()) {\n throw new ModelStoreError('A non-empty baseUrl is required to create a provider.');\n }\n const created: ProviderConfig = { provider, baseUrl: baseUrl.trim(), timeoutMs: DEFAULT_MODEL_TIMEOUT_MS, models: [] };\n file.providers.push(created);\n return created;\n}\n\n/**\n * Removes a provider by name. Returns true when an entry was removed.\n */\nexport function removeProvider(file: ModelsFile, provider: string): boolean {\n const index = file.providers.findIndex((entry) => entry.provider === provider);\n if (index === -1) {\n return false;\n }\n file.providers.splice(index, 1);\n return true;\n}\n\n/**\n * Finds a model within a provider.\n */\nexport function findModel(provider: ProviderConfig, name: string): ModelEntry | undefined {\n return provider.models.find((model) => model.name === name);\n}\n\n/**\n * Adds a model or replaces the entry with the same name.\n */\nexport function upsertModel(provider: ProviderConfig, model: ModelEntry): void {\n const index = provider.models.findIndex((candidate) => candidate.name === model.name);\n if (index === -1) {\n provider.models.push(model);\n return;\n }\n provider.models[index] = model;\n}\n\n/**\n * Removes a model by name. Returns true when an entry was removed.\n */\nexport function removeModel(provider: ProviderConfig, name: string): boolean {\n const index = provider.models.findIndex((candidate) => candidate.name === name);\n if (index === -1) {\n return false;\n }\n provider.models.splice(index, 1);\n return true;\n}\n","import { createCredentialStore } from './credentials';\nimport { hasFlag, optionalValue, requireValue, resolveConfigDir } from './cli-support';\nimport { parseCommandOptions, requireModel, requireProvider } from './command-support';\nimport { removeModel, removeProvider, saveModels } from './model-store';\n\n/**\n * Help text for `chatserver-models remove`.\n */\nexport const REMOVE_HELP = `Usage: chatserver-models remove --provider <name> --name <name> [options]\n\nRemoves a model. When it was the provider's last model, the provider entry is removed\ntoo and its API key is deleted from the credential manager.\n\nOptions:\n --provider <name> Provider name (required)\n --name <name> Model name to remove (required)\n --config_dir <dir> Config folder\n -h, --help Show this help\n`;\n\n/**\n * Removes a model, and its provider once the provider has no models left.\n */\nexport async function runRemove(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: { '--provider': 'provider', '--name': 'name' },\n booleanFlags: {}\n });\n\n if (hasFlag(cli, 'help')) {\n console.log(REMOVE_HELP);\n return;\n }\n\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n const providerName = requireValue(cli, 'provider', '--provider');\n const name = requireValue(cli, 'name', '--name');\n const { file, provider } = await requireProvider(configDir, providerName);\n\n requireModel(provider, name);\n removeModel(provider, name);\n\n const providerRemoved = provider.models.length === 0;\n if (providerRemoved) {\n removeProvider(file, providerName);\n }\n\n const modelsPath = await saveModels(configDir, file);\n console.log(`Removed model \"${name}\" from provider \"${providerName}\" in ${modelsPath}.`);\n\n if (providerRemoved) {\n console.log(`Provider \"${providerName}\" had no models left and was removed.`);\n const credentials = createCredentialStore();\n await credentials.delete(providerName);\n console.log(`Removed API key from the ${credentials.name} (account: \"${providerName}\").`);\n }\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS, MAX_TIMER_MS } from '../limit';\nimport { ApiToolDefinition, ToolDefinition } from '../tools/interface';\nimport { isNumber, isRecord, isString } from '../type-guards';\n\n/** Validates durations against Node's timer range, including programmatic callers. */\nexport function resolveModelTimeoutMs(value: unknown = DEFAULT_MODEL_TIMEOUT_MS): number {\n if (!isNumber(value) || !Number.isSafeInteger(value) || value < 1 || value > MAX_TIMER_MS) {\n throw new Error(`Model timeout must be an integer from 1 to ${MAX_TIMER_MS} milliseconds.`);\n }\n return value;\n}\n\n/** A Responses API input/output item, preserved across tool round trips. */\nexport type ResponseItem = Record<string, unknown>;\n\n/** A provider citation retained for delivery alongside the generated answer. */\nexport interface ResponseCitation {\n url: string;\n}\n\n/**\n * Options for a single OpenAI Responses API call.\n */\nexport interface ResponseRequest {\n /** Base URL of the API, for example `https://api.openai.com/v1`. */\n baseUrl: string;\n /** Model identifier, for example `gpt-4.1-mini`. */\n model: string;\n /** Bearer token used for authorization. */\n apiKey: string;\n /** Prompt or conversation input sent as `input`. */\n input: string | readonly ResponseItem[];\n /** Local function declarations and provider-hosted tools available during generation. */\n tools?: readonly (ToolDefinition | ApiToolDefinition)[];\n /** Disable further tool calls when the per-reply budget has been consumed. */\n toolChoice?: 'auto' | 'none';\n /** Provider-side cap on built-in calls within this response. */\n maxToolCalls?: number;\n /** Optional system instructions. */\n instructions?: string;\n /** Explicit reasoning effort; omitted preserves provider/model defaults. */\n reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds. Defaults to 5 minutes. */\n timeoutMs?: number;\n /** Optional caller cancellation, in addition to the request timeout. */\n signal?: AbortSignal;\n}\n\n/**\n * Result of a Responses API call.\n */\nexport interface ResponseResult {\n /** Response identifier, when the server returned one. */\n id?: string;\n /** Concatenated text from the response's output items. */\n outputText: string;\n /** HTTP(S) sources cited in output text annotations. */\n citations: readonly ResponseCitation[];\n /** Complete decoded response body. */\n raw: unknown;\n}\n\n/**\n * Raised when a Responses API call fails.\n */\nexport class ResponsesApiError extends Error {\n public readonly status?: number;\n public readonly body?: string;\n\n public constructor(message: string, status?: number, body?: string) {\n super(message);\n this.name = 'ResponsesApiError';\n this.status = status;\n this.body = body;\n }\n}\n\n/**\n * Builds the endpoint used for Responses API calls.\n */\nexport function responsesEndpoint(baseUrl: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/responses`;\n}\n\n/**\n * Extracts assistant text from a Responses API payload.\n *\n * Handles the documented `output` array with `output_text` content parts, and falls\n * back to a top-level `output_text` string for compatible servers that use it.\n */\nexport function extractOutputText(payload: unknown): string {\n if (!isRecord(payload)) {\n return '';\n }\n\n if (isString(payload.output_text)) {\n return payload.output_text.trim();\n }\n\n if (!Array.isArray(payload.output)) {\n return '';\n }\n\n const parts: string[] = [];\n for (const item of payload.output) {\n if (!isRecord(item) || !Array.isArray(item.content)) {\n continue;\n }\n for (const content of item.content) {\n if (isRecord(content) && content.type === 'output_text' && isString(content.text)) {\n parts.push(content.text);\n }\n }\n }\n\n return parts.join('\\n').trim();\n}\n\n/** Retains URL citations even when generated text uses provider-specific markers. */\nexport function extractCitations(payload: unknown): ResponseCitation[] {\n if (!isRecord(payload) || !Array.isArray(payload.output)) {\n return [];\n }\n const urls = new Set<string>();\n for (const item of payload.output) {\n if (!isRecord(item) || item.type !== 'message' || !Array.isArray(item.content)) {\n continue;\n }\n for (const content of item.content) {\n if (!isRecord(content) || content.type !== 'output_text' || !Array.isArray(content.annotations)) {\n continue;\n }\n for (const annotation of content.annotations) {\n if (!isRecord(annotation) || annotation.type !== 'url_citation' || !isString(annotation.url)) {\n continue;\n }\n try {\n const url = new URL(annotation.url);\n if ((url.protocol === 'http:' || url.protocol === 'https:') && !url.username && !url.password) {\n urls.add(url.href);\n }\n } catch {\n // Ignore malformed citation URLs rather than rendering them as links.\n }\n }\n }\n }\n return [...urls].map((url) => ({ url }));\n}\n\n/**\n * Sends one prompt through the Responses API and returns the text it produced.\n */\nexport async function createResponse(request: ResponseRequest): Promise<ResponseResult> {\n const url = responsesEndpoint(request.baseUrl);\n const timeoutMs = resolveModelTimeoutMs(request.timeoutMs);\n const controller = new AbortController();\n const cancel = () => controller.abort();\n request.signal?.addEventListener('abort', cancel, { once: true });\n if (request.signal?.aborted) {\n controller.abort();\n }\n const timer = setTimeout(() => {\n controller.abort();\n }, timeoutMs);\n\n const body: Record<string, unknown> = {\n model: request.model,\n input: request.input\n };\n if (request.tools !== undefined && request.tools.length > 0) {\n body.tools = request.tools;\n body.tool_choice = request.toolChoice ?? 'auto';\n // Replay the complete output locally, including any encrypted reasoning.\n body.store = false;\n body.include = ['reasoning.encrypted_content'];\n if (request.maxToolCalls !== undefined) {\n body.max_tool_calls = request.maxToolCalls;\n }\n }\n if (request.reasoningEffort !== undefined) {\n body.reasoning = { effort: request.reasoningEffort };\n }\n if (request.instructions !== undefined) {\n body.instructions = request.instructions;\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${request.apiKey}`,\n ...request.headers\n };\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal\n });\n\n const text = await response.text();\n\n if (!response.ok) {\n throw new ResponsesApiError(\n `Request to ${url} failed with HTTP ${response.status} ${response.statusText}.`,\n response.status,\n text\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch (error) {\n throw new ResponsesApiError(\n `Response from ${url} was not valid JSON: ${(error as Error).message}`,\n response.status,\n text\n );\n }\n\n if (isRecord(parsed) && ((parsed.error !== undefined && parsed.error !== null) || parsed.status === 'failed' || parsed.status === 'incomplete')) {\n throw new ResponsesApiError(`Response from ${url} did not complete successfully.`, response.status);\n }\n const result: ResponseResult = { outputText: extractOutputText(parsed), citations: extractCitations(parsed), raw: parsed };\n if (isRecord(parsed) && isString(parsed.id)) {\n result.id = parsed.id;\n }\n return result;\n } catch (error) {\n if (error instanceof ResponsesApiError) {\n throw error;\n }\n if (request.signal?.aborted) {\n throw new ResponsesApiError(`Request to ${url} was cancelled.`);\n }\n if ((error as Error).name === 'AbortError') {\n throw new ResponsesApiError(`Request to ${url} timed out after ${timeoutMs} ms.`);\n }\n throw new ResponsesApiError(`Request to ${url} failed: ${(error as Error).message}`);\n } finally {\n clearTimeout(timer);\n request.signal?.removeEventListener('abort', cancel);\n }\n}\n","import { MAX_MODEL_RETRIES, MODEL_RETRY_DELAY_MS } from '../limit';\nimport { setTimeout as delay } from 'node:timers/promises';\nimport { ResponsesApiError } from './responses-client';\n\n/** One initial generation and at most three retries, with ten seconds between attempts. */\nexport async function withModelRetries<T>(generate: () => Promise<T>, signal?: AbortSignal): Promise<T> {\n for (let retries = 0; ; retries += 1) {\n signal?.throwIfAborted();\n try {\n return await generate();\n } catch (error) {\n const transient = error instanceof ResponsesApiError &&\n (error.status === undefined || error.status === 408 || error.status === 429 || error.status >= 500);\n if (signal?.aborted || retries >= MAX_MODEL_RETRIES || !transient) {\n throw error;\n }\n console.warn(`[model] generation failed; retry ${retries + 1}/${MAX_MODEL_RETRIES} in ${MODEL_RETRY_DELAY_MS / 1000} seconds.`);\n await delay(MODEL_RETRY_DELAY_MS, undefined, { signal });\n }\n }\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS, MAX_SETUP_CHOICES, MODEL_DISCOVERY_TIMEOUT_MS } from '../limit';\nimport { CliError, CommandLine, hasFlag, optionalValue, promptLine } from './cli-support';\nimport { ModelsFile, ProviderConfig } from './model-store';\nimport { isObject, isString } from '../type-guards';\n\n/** Reads an optional nonempty, trimmed command-line value. */\nexport function setupValue(cli: CommandLine, key: string, flag: string): string | undefined {\n const value = optionalValue(cli, key)?.trim();\n if (value === '') {\n throw new CliError(`${flag} must not be empty.`);\n }\n return value;\n}\n\n/** Validates a provider endpoint before prompting for or saving credentials. */\nexport function setupBaseUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new CliError('Base URL must be an absolute http:// or https:// URL.');\n }\n if (!['http:', 'https:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) {\n throw new CliError('Base URL must use HTTP(S), without credentials, a query, or a fragment.');\n }\n if (/\\/responses\\/?$/.test(url.pathname)) {\n throw new CliError('Use the API base URL, without the trailing /responses.');\n }\n return value.trim().replace(/\\/+$/, '');\n}\n\n/** Requires a terminal for guided setup, keeping scripts from hanging on prompts. */\nexport function requireSetupTerminal(): void {\n if (!process.stdin.isTTY) {\n throw new CliError('Guided setup requires a terminal. Supply the command options instead.');\n }\n}\n\n/** Prompts with an optional current value and retries invalid input. */\nexport async function setupPrompt(\n label: string,\n fallback?: string,\n validate: (value: string) => string = (value) => {\n if (!value) {\n throw new CliError('A value is required.');\n }\n return value;\n }\n): Promise<string> {\n requireSetupTerminal();\n for (;;) {\n const value = (await promptLine(`${label}${fallback === undefined ? '' : ` [${fallback}]`}: `)).trim() || fallback || '';\n try {\n return validate(value);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n }\n }\n}\n\n/** Selects a numbered item or, when allowed, accepts a new name/ID directly. */\nexport async function setupChoice(\n label: string,\n choices: readonly { value: string; label: string; name?: string }[],\n allowCustom = false\n): Promise<string> {\n requireSetupTerminal();\n const shown = allowCustom ? choices.slice(0, MAX_SETUP_CHOICES) : choices;\n shown.forEach((choice, index) => console.log(` ${index + 1}. ${choice.label}`));\n if (choices.length > shown.length) {\n console.log(`Showing ${shown.length} of ${choices.length}; enter an exact name/ID for another choice.`);\n }\n return setupPrompt(`${label}${allowCustom ? ' (number or name/ID)' : ' (number or name)'}`, allowCustom ? undefined : '1', (value) => {\n // Exact names win over numbered shortcuts (including numeric model IDs).\n const exact = choices.find((choice) => choice.value === value || choice.name === value);\n if (exact !== undefined) {\n return exact.value;\n }\n const index = /^[1-9]\\d*$/.test(value) ? Number(value) - 1 : -1;\n if (shown[index] !== undefined) {\n return shown[index].value;\n }\n if (allowCustom && value) {\n return value;\n }\n throw new CliError('Choose a listed number or name.');\n });\n}\n\n/** Resolves a supplied provider or offers configured providers and a new-name entry. */\nexport async function setupProvider(file: ModelsFile, cli: CommandLine, allowNew: boolean): Promise<string> {\n const supplied = setupValue(cli, 'provider', '--provider');\n if (supplied !== undefined) {\n return supplied;\n }\n if (!process.stdin.isTTY) {\n throw new CliError('--provider is required without a terminal.');\n }\n if (!allowNew && file.providers.length === 0) {\n throw new CliError('No providers configured. Run chatserver-models add first.');\n }\n return setupChoice(allowNew ? 'Choose a provider or enter a new provider name' : 'Provider',\n file.providers.map((provider) => ({ value: provider.provider, label: `${provider.provider} (${provider.baseUrl})` })), allowNew);\n}\n\n/** Enables the editor explicitly or when a terminal command has no edits yet. */\nexport function setupInteractive(cli: CommandLine, missing: boolean): boolean {\n if (hasFlag(cli, 'interactive')) {\n requireSetupTerminal();\n return true;\n }\n return Boolean(process.stdin.isTTY) && missing;\n}\n\n/** Offers the provider's advertised models, falling back to a manually entered ID. */\nexport async function setupModelId(provider: ProviderConfig, apiKey: string): Promise<string> {\n requireSetupTerminal();\n console.log(`Looking up models at ${provider.baseUrl}...`);\n let ids: string[];\n try {\n const response = await fetch(`${provider.baseUrl.replace(/\\/+$/, '')}/models`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: AbortSignal.timeout(Math.min(provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS, MODEL_DISCOVERY_TIMEOUT_MS)),\n redirect: 'error'\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n const body: unknown = await response.json();\n if (!isObject(body) || !('data' in body) || !Array.isArray(body.data)) {\n throw new Error('Unsupported model list');\n }\n ids = [...new Set(body.data.flatMap((model: unknown) =>\n isObject(model) && 'id' in model && isString(model.id) && model.id.trim()\n ? [model.id.trim()] : []))].sort();\n } catch {\n console.log('Could not list models from this provider. Enter the model ID manually.');\n return setupPrompt('Model ID');\n }\n if (ids.length === 0) {\n return setupPrompt('Model ID');\n }\n return setupChoice('Model', ids.map((id) => ({ value: id, label: id })), true);\n}\n","import { MAX_AUDIO_BYTES, MAX_TTS_INPUT_CHARS } from '../limit';\nimport { AudioFile } from '../messagers/interface';\nimport { ResponsesApiError, resolveModelTimeoutMs } from './responses-client';\n\n/** Provider speech synthesis; options are JSON fields such as voice, speed, or instructions. */\nexport interface SpeechModel {\n synthesize(text: string, options?: Readonly<Record<string, unknown>>, signal?: AbortSignal): Promise<AudioFile>;\n}\n\ninterface SpeechRequest {\n baseUrl: string;\n model: string;\n apiKey: string;\n text: string;\n options?: Readonly<Record<string, unknown>>;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\n/** Requests bounded WAV audio from an OpenAI-compatible audio/speech endpoint. */\nexport async function createSpeech(request: SpeechRequest): Promise<AudioFile> {\n request.signal?.throwIfAborted();\n if (!request.text.trim() || request.text.length > MAX_TTS_INPUT_CHARS) {\n throw new Error(`Speech input must contain 1–${MAX_TTS_INPUT_CHARS} characters.`);\n }\n const url = `${request.baseUrl.replace(/\\/+$/, '')}/audio/speech`;\n const timeoutMs = resolveModelTimeoutMs(request.timeoutMs);\n const controller = new AbortController();\n const cancel = () => controller.abort();\n request.signal?.addEventListener('abort', cancel, { once: true });\n const timer = setTimeout(cancel, timeoutMs);\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { Authorization: `Bearer ${request.apiKey}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({ ...request.options, model: request.model, input: request.text,\n response_format: 'wav', stream_format: 'audio' }),\n signal: controller.signal,\n redirect: 'error'\n });\n if (!response.ok) {\n await response.body?.cancel();\n throw new ResponsesApiError(`Speech request to ${url} failed with HTTP ${response.status}.`, response.status);\n }\n if (Number(response.headers.get('content-length')) > MAX_AUDIO_BYTES || response.body === null) {\n await response.body?.cancel();\n throw new ResponsesApiError('Speech response is missing or exceeds the audio size limit.', response.status);\n }\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n while (true) {\n const chunk = await reader.read();\n if (chunk.done) {\n break;\n }\n size += chunk.value.byteLength;\n if (size > MAX_AUDIO_BYTES) {\n await reader.cancel();\n throw new ResponsesApiError('Speech response exceeds the audio size limit.', response.status);\n }\n chunks.push(chunk.value);\n }\n } finally {\n reader.releaseLock();\n }\n if (!size) {\n throw new ResponsesApiError('Speech model returned empty audio.', response.status);\n }\n return { data: Buffer.concat(chunks), filename: 'reply.wav', mimeType: 'audio/wav' };\n } catch (error) {\n request.signal?.throwIfAborted();\n if (error instanceof ResponsesApiError) {\n throw error;\n }\n if (controller.signal.aborted) {\n throw new ResponsesApiError(`Speech request to ${url} timed out after ${timeoutMs} ms.`);\n }\n throw new ResponsesApiError(`Speech request to ${url} failed: ${error instanceof Error ? error.message : String(error)}`);\n } finally {\n clearTimeout(timer);\n request.signal?.removeEventListener('abort', cancel);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { MAX_AUDIO_BYTES, DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { audioFile } from '../messagers/audio';\nimport { AudioFile } from '../messagers/interface';\nimport { CliError, hasFlag, optionalValue, requireValue } from './cli-support';\nimport { loadTestModel, parseCommandOptions } from './command-support';\nimport { convertAudio } from './audio-conversion';\nimport { createTranscription } from './transcriptions-client';\nimport { withModelRetries } from './retry';\n\nexport const TEST_STT_HELP = `Usage: chatserver-models test-stt --provider <name> --name <name> --file <audio> [options]\n\nTranscribes a local audio file through the configured provider's audio/transcriptions endpoint.\n\nOptions:\n --provider <name> Provider name from models.json (required)\n --name <name> Model CLI alias from models.json (required)\n --file <path> Audio input; --audio is an alias (required)\n --audio-conversion-cmd <cmd> Optional WAV conversion command using {input} and {output}\n --timeout <ms> Request timeout (default: provider setting or ${DEFAULT_MODEL_TIMEOUT_MS})\n --json Print { \"text\": \"...\" } instead of plain transcript text\n --config_dir <dir> Config folder\n -h, --help Show this help\n\nSupported input: mp3, mpeg, mpga, wav, ogg, flac, m4a, mp4, webm; maximum ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.\nUse --audio-conversion-cmd for WAV-only engines such as speech.cpp.\nPaths resolve from the current directory. Original audio is never modified.\nThe API key is read from CHATSERVER_MODEL_API_KEY or the OS credential manager.\n`;\n\n/** Reads a bounded regular file before attempting credentials or model requests. */\nasync function readAudio(file: string): Promise<AudioFile> {\n const input = await fs.open(file, 'r');\n try {\n const stat = await input.stat();\n if (!stat.isFile() || stat.size === 0 || stat.size > MAX_AUDIO_BYTES) {\n throw new CliError(`Audio input must be a nonempty regular file no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const data = await input.readFile();\n const audio = audioFile(data.toString('base64'), path.extname(file).slice(1), 0);\n return { ...audio, filename: path.basename(file) };\n } finally {\n await input.close();\n }\n}\n\n/** Exercises the same transcription and optional conversion used by incoming voice messages. */\nexport async function runTestStt(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: { '--provider': 'provider', '--name': 'name', '--file': 'file', '--audio': 'file',\n '--timeout': 'timeout', '--audio-conversion-cmd': 'conversion' },\n booleanFlags: { '--json': 'json' }\n });\n if (hasFlag(cli, 'help')) {\n console.log(TEST_STT_HELP);\n return;\n }\n if (cli.positionals.length) {\n throw new CliError('Unexpected arguments. Pass the audio path with --file.');\n }\n const file = path.resolve(requireValue(cli, 'file', '--file'));\n const conversion = optionalValue(cli, 'conversion');\n if (conversion !== undefined && (!conversion.trim() || !conversion.includes('{input}') || !conversion.includes('{output}'))) {\n throw new CliError('--audio-conversion-cmd must contain {input} and {output}.');\n }\n let audio = await readAudio(file);\n const { provider, model, apiKey, timeoutMs } = await loadTestModel(cli);\n if (conversion !== undefined) {\n audio = await convertAudio(audio, conversion);\n }\n console.error(`Testing STT ${model.name} (${model.id}) via ${provider.provider}...`);\n const text = await withModelRetries(() => createTranscription({\n baseUrl: provider.baseUrl, model: model.id, apiKey, timeoutMs, audio\n }));\n console.log(hasFlag(cli, 'json') ? JSON.stringify({ text }) : text || '(no speech recognized)');\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { DEFAULT_MODEL_TIMEOUT_MS, MAX_TTS_INPUT_CHARS } from '../limit';\nimport { CliError, hasFlag, optionalValue } from './cli-support';\nimport { loadTestModel, parseCommandOptions } from './command-support';\nimport { createSpeech } from './speech-client';\nimport { padVoiceAudio } from './voice-synthesizer';\nimport { withModelRetries } from './retry';\nimport { isRecord } from '../type-guards';\n\nconst DEFAULT_SPEECH_TEST_TEXT = 'Hello! This is a speech synthesis test.';\n\nexport const TEST_TTS_HELP = `Usage: chatserver-models test-tts --provider <name> --name <name> [options]\n\nSynthesizes local test audio through audio/speech and saves WAV with WeChat's random padding.\nThis command does not send a WeChat message.\n\nOptions:\n --provider <name> Provider name from models.json (required)\n --name <name> Model CLI alias from models.json (required)\n --text <text> Literal text to speak; --prompt is an alias (default: \"${DEFAULT_SPEECH_TEST_TEXT}\")\n --voice <name> Provider voice name; overrides voice in --options\n --options <json> Provider speech options as a JSON object, such as {\"speed\":1}\n --output <path> WAV output file (default: tts-test.wav)\n --force Overwrite an existing output file\n --timeout <ms> Request timeout (default: provider setting or ${DEFAULT_MODEL_TIMEOUT_MS})\n --config_dir <dir> Config folder\n -h, --help Show this help\n\nOptions use the same format as tts.options in config.json. ChatServer controls\nmodel, input, response_format=wav, and stream_format=audio. The provider must return\nPCM/float WAV. Independent 0.5–2 second silences are added before and after speech.\nPaths resolve from the current directory; the output directory must already exist.\nThe API key is read from CHATSERVER_MODEL_API_KEY or the OS credential manager.\n`;\n\n/** Validates operator-supplied provider options before making a model request. */\nfunction speechOptions(encoded?: string): Record<string, unknown> {\n let value: unknown = {};\n if (encoded !== undefined) {\n try {\n value = JSON.parse(encoded);\n } catch {\n throw new CliError('--options must contain a valid JSON object.');\n }\n }\n if (!isRecord(value)) {\n throw new CliError('--options must contain a JSON object.');\n }\n for (const key of ['model', 'input', 'response_format', 'stream_format']) {\n if (Object.hasOwn(value, key)) {\n throw new CliError(`--options.${key} is controlled by ChatServer.`);\n }\n }\n return value as Record<string, unknown>;\n}\n\n/** Catches invalid destinations before synthesis; exclusive writes also guard creation races. */\nasync function checkOutput(output: string, force: boolean): Promise<void> {\n if (!(await fs.stat(path.dirname(output))).isDirectory()) {\n throw new CliError('The output directory must already exist.');\n }\n try {\n const stat = await fs.lstat(output);\n if (!stat.isFile()) {\n throw new CliError('The output path must be a regular file.');\n }\n if (!force) {\n throw new CliError(`Output file already exists: ${output}. Use --force to overwrite it.`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n}\n\n/** Exercises real speech synthesis and the same padding used for WeChat voice replies. */\nexport async function runTestTts(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: { '--provider': 'provider', '--name': 'name', '--text': 'text', '--prompt': 'text', '--voice': 'voice',\n '--options': 'options', '--output': 'output', '--timeout': 'timeout' },\n booleanFlags: { '--force': 'force' }\n });\n if (hasFlag(cli, 'help')) {\n console.log(TEST_TTS_HELP);\n return;\n }\n if (cli.positionals.length) {\n throw new CliError('Unexpected arguments. Pass literal speech text with --text.');\n }\n const text = optionalValue(cli, 'text') ?? DEFAULT_SPEECH_TEST_TEXT;\n if (!text.trim() || text.length > MAX_TTS_INPUT_CHARS) {\n throw new CliError(`--text must contain 1–${MAX_TTS_INPUT_CHARS} characters.`);\n }\n const options = speechOptions(optionalValue(cli, 'options'));\n const voice = optionalValue(cli, 'voice');\n if (voice !== undefined) {\n if (!voice.trim()) {\n throw new CliError('--voice must be nonempty.');\n }\n options.voice = voice.trim();\n }\n const outputOption = optionalValue(cli, 'output') ?? 'tts-test.wav';\n if (!outputOption.trim() || path.extname(outputOption).toLowerCase() !== '.wav') {\n throw new CliError('--output must be a WAV file path ending in .wav.');\n }\n const output = path.resolve(outputOption);\n const force = hasFlag(cli, 'force');\n await checkOutput(output, force);\n const { provider, model, apiKey, timeoutMs } = await loadTestModel(cli);\n console.error(`Testing TTS ${model.name} (${model.id}) via ${provider.provider}...`);\n const audio = padVoiceAudio(await withModelRetries(() => createSpeech({\n baseUrl: provider.baseUrl, model: model.id, apiKey, timeoutMs, text, options\n })));\n await fs.writeFile(output, audio.data, { flag: force ? 'w' : 'wx', mode: 0o600 });\n console.log(`Saved speech to ${output} (${audio.data.byteLength} bytes, including random padding).`);\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { hasFlag, optionalValue } from './cli-support';\nimport {\n DEFAULT_PROMPT,\n parseCommandOptions,\n loadTestModel\n} from './command-support';\nimport { createResponse } from './responses-client';\nimport { withModelRetries } from './retry';\n\n/**\n * Help text for `chatserver-models test`.\n */\nexport const TEST_HELP = `Usage: chatserver-models test --provider <name> --name <name> [options]\n\nSends one prompt to a configured model and prints the reply.\n\nOptions:\n --provider <name> Provider name from models.json (required)\n --name <name> Model name from models.json (required)\n --prompt <text> Prompt to send (default: \"${DEFAULT_PROMPT}\")\n --timeout <ms> Override provider timeout for this request (default: provider setting or ${DEFAULT_MODEL_TIMEOUT_MS})\n --json Print the raw API response instead of just the text\n --config_dir <dir> Config folder\n -h, --help Show this help\n\nThe API key is read from CHATSERVER_MODEL_API_KEY or the OS credential manager\n(account: the provider name).\n`;\n\n/**\n * Sends one prompt to a configured model.\n */\nexport async function runTest(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: {\n '--provider': 'provider',\n '--name': 'name',\n '--prompt': 'prompt',\n '--timeout': 'timeout'\n },\n booleanFlags: { '--json': 'json' }\n });\n\n if (hasFlag(cli, 'help')) {\n console.log(TEST_HELP);\n return;\n }\n\n const { provider, model, apiKey, timeoutMs } = await loadTestModel(cli);\n const prompt = optionalValue(cli, 'prompt') ?? DEFAULT_PROMPT;\n\n console.log(`Testing ${model.name} (${model.id}) via ${provider.provider} at ${provider.baseUrl}...`);\n\n const result = await withModelRetries(() => createResponse({\n baseUrl: provider.baseUrl,\n model: model.id,\n apiKey,\n input: prompt,\n timeoutMs\n }));\n\n if (hasFlag(cli, 'json')) {\n console.log(JSON.stringify(result.raw, null, 2));\n return;\n }\n\n console.log('');\n console.log(result.outputText === '' ? '(no output text in response)' : result.outputText);\n if (result.id !== undefined) {\n console.log('');\n console.log(`Response id: ${result.id}`);\n }\n}\n","import { MAX_AUDIO_BYTES, MAX_TRANSCRIPT_CHARS } from '../limit';\nimport { AudioFile } from '../messagers/interface';\nimport { ResponsesApiError, resolveModelTimeoutMs } from './responses-client';\nimport { isRecord, isString } from '../type-guards';\n\n/** A provider-bound speech-to-text model, independent of text-generation capabilities. */\nexport interface TranscriptionModel {\n transcribe(audio: AudioFile, signal?: AbortSignal): Promise<string>;\n}\n\ninterface TranscriptionRequest {\n baseUrl: string;\n model: string;\n apiKey: string;\n audio: AudioFile;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\n/** Calls an OpenAI-compatible audio/transcriptions endpoint using native multipart upload. */\nexport async function createTranscription(request: TranscriptionRequest): Promise<string> {\n request.signal?.throwIfAborted();\n if (request.audio.data.byteLength === 0 || request.audio.data.byteLength > MAX_AUDIO_BYTES) {\n throw new Error(`Transcription audio must be nonempty and no larger than ${MAX_AUDIO_BYTES / (1024 * 1024)} MiB.`);\n }\n const url = `${request.baseUrl.replace(/\\/+$/, '')}/audio/transcriptions`;\n const timeoutMs = resolveModelTimeoutMs(request.timeoutMs);\n const controller = new AbortController();\n const cancel = () => controller.abort();\n request.signal?.addEventListener('abort', cancel, { once: true });\n const timer = setTimeout(cancel, timeoutMs);\n try {\n const form = new FormData();\n form.set('model', request.model);\n form.set('response_format', 'json');\n form.set('file', new Blob([new Uint8Array(request.audio.data)], { type: request.audio.mimeType }), request.audio.filename);\n const response = await fetch(url, {\n method: 'POST',\n headers: { Authorization: `Bearer ${request.apiKey}` },\n body: form,\n signal: controller.signal,\n redirect: 'error'\n });\n if (!response.ok) {\n throw new ResponsesApiError(`Transcription request to ${url} failed with HTTP ${response.status}.`, response.status);\n }\n let result: unknown;\n try {\n result = await response.json();\n } catch (error) {\n if (controller.signal.aborted) {\n throw error;\n }\n throw new ResponsesApiError('Transcription model returned invalid JSON.', response.status);\n }\n if (!isRecord(result) ||\n !('text' in result) || !isString(result.text) || result.text.length > MAX_TRANSCRIPT_CHARS) {\n throw new ResponsesApiError(`Transcription model must return a text string of at most ${MAX_TRANSCRIPT_CHARS} characters.`, response.status);\n }\n return result.text.trim();\n } catch (error) {\n request.signal?.throwIfAborted();\n if (controller.signal.aborted) {\n throw new ResponsesApiError(`Transcription request to ${url} timed out after ${timeoutMs} ms.`);\n }\n if (error instanceof ResponsesApiError) {\n throw error;\n }\n throw new ResponsesApiError(`Transcription request to ${url} failed: ${error instanceof Error ? error.message : String(error)}`);\n } finally {\n clearTimeout(timer);\n request.signal?.removeEventListener('abort', cancel);\n }\n}\n","import { DEFAULT_MODEL_TIMEOUT_MS } from '../limit';\nimport { createCredentialStore } from './credentials';\nimport { CliError, hasFlag, optionalValue, promptHidden, resolveConfigDir } from './cli-support';\nimport { modelTimeoutOption, parseCommandOptions, requireModel, requireProvider } from './command-support';\nimport { findModel, loadModels, saveModels } from './model-store';\nimport { setupBaseUrl, setupChoice, setupInteractive, setupPrompt, setupProvider, setupValue } from './setup';\n\n/**\n * Help text for `chatserver-models update`.\n */\nexport const UPDATE_HELP = `Usage: chatserver-models update [options]\n\nUpdates a provider or one of its models. Only the options you pass are changed.\nRun without edits for a guided editor. Press Enter to keep current values.\n\nOptions:\n --provider <name> Provider name (prompted in a terminal if omitted)\n --base-url <url> New OpenAI-compatible base URL for the provider\n --timeout <ms> New model timeout for all models from the provider\n --api-key <key> Replace the provider's stored API key\n --name <name> Model name to update\n --model <id> New model identifier for --name\n --new-name <name> Rename the model given by --name\n --config_dir <dir> Config folder\n -i, --interactive Open the guided editor even when edits are supplied\n -h, --help Show this help\n`;\n\n/**\n * Updates provider or model details, and optionally the provider's API key.\n */\nexport async function runUpdate(argv: string[]): Promise<void> {\n const cli = parseCommandOptions(argv, {\n valueFlags: {\n '--provider': 'provider',\n '--base-url': 'baseUrl',\n '--timeout': 'timeout',\n '--api-key': 'apiKey',\n '--name': 'name',\n '--model': 'model',\n '--new-name': 'newName'\n },\n booleanFlags: { '--interactive': 'interactive', '-i': 'interactive' }\n });\n\n if (hasFlag(cli, 'help')) {\n console.log(UPDATE_HELP);\n return;\n }\n\n const configDir = resolveConfigDir(optionalValue(cli, 'configDir'));\n let newBaseUrl = setupValue(cli, 'baseUrl', '--base-url');\n if (newBaseUrl !== undefined) {\n newBaseUrl = setupBaseUrl(newBaseUrl);\n }\n const timeoutValue = optionalValue(cli, 'timeout');\n let timeoutMs = timeoutValue === undefined ? undefined : modelTimeoutOption(timeoutValue);\n let apiKey = setupValue(cli, 'apiKey', '--api-key');\n let modelName = setupValue(cli, 'name', '--name');\n let newModelId = setupValue(cli, 'model', '--model');\n let newName = setupValue(cli, 'newName', '--new-name');\n const hasEdits = newBaseUrl !== undefined || timeoutMs !== undefined || apiKey !== undefined ||\n newModelId !== undefined || newName !== undefined;\n const guided = setupInteractive(cli, !hasEdits);\n const providerName = await setupProvider(await loadModels(configDir), cli, false);\n const { file, provider } = await requireProvider(configDir, providerName);\n\n if (!guided && !hasEdits) {\n throw new CliError(\n 'Nothing to update. Pass --base-url, --timeout, --api-key, or --name with --model/--new-name.'\n );\n }\n\n let editProvider = false;\n if (guided && modelName === undefined && newModelId === undefined && newName === undefined) {\n const target = await setupChoice('Update', [\n { value: 'provider', label: 'Provider settings (URL, timeout, API key)' },\n ...provider.models.map((model) => ({ value: `model:${model.name}`, name: model.name, label: `${model.name} (${model.id})` }))\n ]);\n editProvider = target === 'provider';\n if (!editProvider) {\n modelName = target.slice('model:'.length);\n }\n }\n if (modelName === undefined && (newModelId !== undefined || newName !== undefined)) {\n if (!process.stdin.isTTY) {\n throw new CliError('--name is required to update or rename a model.');\n }\n if (provider.models.length === 0) {\n throw new CliError('This provider has no models. Run chatserver-models add first.');\n }\n modelName = await setupChoice('Model', provider.models.map((model) => ({ value: model.name, label: `${model.name} (${model.id})` })));\n }\n\n const model = modelName === undefined ? undefined : requireModel(provider, modelName);\n if (guided && model !== undefined) {\n newModelId ??= await setupPrompt('Model ID', model.id);\n newName ??= await setupPrompt('Model name', model.name);\n }\n if (editProvider) {\n newBaseUrl ??= await setupPrompt('API base URL', provider.baseUrl, setupBaseUrl);\n const currentTimeout = provider.timeoutMs ?? DEFAULT_MODEL_TIMEOUT_MS;\n timeoutMs ??= Number(await setupPrompt('Timeout (ms)', String(currentTimeout), (value) => String(modelTimeoutOption(value))));\n if (apiKey === undefined) {\n apiKey = (await promptHidden('New API key (Enter to keep current): ')).trim() || undefined;\n }\n }\n\n // Validate every edit before changing either the credential manager or models.json.\n if (newName !== undefined && newName !== model?.name && findModel(provider, newName) !== undefined) {\n throw new CliError(`Model \"${newName}\" already exists for provider \"${provider.provider}\".`);\n }\n const changed = newBaseUrl !== undefined && newBaseUrl !== provider.baseUrl ||\n timeoutMs !== undefined && timeoutMs !== provider.timeoutMs || apiKey !== undefined ||\n model !== undefined && (newModelId !== undefined && newModelId !== model.id || newName !== undefined && newName !== model.name);\n if (!changed) {\n console.log('No changes.');\n return;\n }\n\n if (newBaseUrl !== undefined) {\n provider.baseUrl = newBaseUrl;\n }\n if (timeoutMs !== undefined) {\n provider.timeoutMs = timeoutMs;\n }\n\n if (apiKey !== undefined) {\n const credentials = createCredentialStore();\n await credentials.set(provider.provider, apiKey);\n console.log(`API key updated in the ${credentials.name} (account: \"${provider.provider}\").`);\n }\n\n const previousId = model?.id;\n if (model !== undefined) {\n if (newModelId !== undefined) {\n model.id = newModelId;\n }\n\n if (newName !== undefined) {\n model.name = newName;\n }\n }\n\n const modelsPath = await saveModels(configDir, file);\n console.log(`Updated provider \"${providerName}\" in ${modelsPath}.`);\n if (model !== undefined) {\n console.log(`Config reference: ${providerName}/${model.id}`);\n if (previousId !== model.id) {\n console.log(`Update config.json references from ${providerName}/${previousId} to ${providerName}/${model.id}.`);\n }\n }\n}\n","import { randomInt } from 'node:crypto';\nimport { MAX_AUDIO_BYTES, MAX_VOICE_PADDING_MS, MIN_VOICE_PADDING_MS } from '../limit';\nimport { AudioFile } from '../messagers/interface';\nimport { SpeechModel } from './speech-client';\n\n/** Adds actual silence to PCM/float WAV samples, independently at either end. */\nexport function padVoiceAudio(audio: AudioFile): AudioFile {\n const wav = Buffer.from(audio.data);\n const invalid = () => new Error('TTS must return a valid, uncompressed PCM or float WAV file for voice padding.');\n if (wav.length < 44 || wav.length > MAX_AUDIO_BYTES || wav.toString('ascii', 0, 4) !== 'RIFF' ||\n wav.toString('ascii', 8, 12) !== 'WAVE') {\n throw invalid();\n }\n let format: Buffer | undefined;\n let samples: Buffer | undefined;\n for (let offset = 12; offset + 8 <= wav.length;) {\n const id = wav.toString('ascii', offset, offset + 4);\n const declared = wav.readUInt32LE(offset + 4);\n const start = offset + 8;\n // Streaming WAV encoders can leave RIFF/data sizes as large placeholders.\n const size = id === 'data' && declared >= 0x7fff0000 ? wav.length - start : declared;\n if (start + size > wav.length) {\n throw invalid();\n }\n if (id === 'fmt ') {\n if (format !== undefined) {\n throw invalid();\n }\n format = wav.subarray(start, start + size);\n } else if (id === 'data') {\n if (samples !== undefined) {\n throw invalid();\n }\n samples = wav.subarray(start, start + size);\n }\n offset = start + size + size % 2;\n }\n if (format === undefined || format.length < 16 || samples === undefined || !samples.length) {\n throw invalid();\n }\n let encoding = format.readUInt16LE(0);\n if (encoding === 0xfffe && format.length >= 40 &&\n format.subarray(28, 40).equals(Buffer.from('00001000800000aa00389b71', 'hex'))) {\n encoding = format.readUInt32LE(24);\n }\n const channels = format.readUInt16LE(2);\n const sampleRate = format.readUInt32LE(4);\n const frameBytes = format.readUInt16LE(12);\n const bits = format.readUInt16LE(14);\n if (!channels || !sampleRate || !frameBytes || frameBytes !== channels * bits / 8 || samples.length % frameBytes !== 0 ||\n !(encoding === 1 && [8, 16, 24, 32].includes(bits) || encoding === 3 && [32, 64].includes(bits))) {\n throw invalid();\n }\n const leadingMs = randomInt(MIN_VOICE_PADDING_MS, MAX_VOICE_PADDING_MS + 1);\n const trailingMs = randomInt(MIN_VOICE_PADDING_MS, MAX_VOICE_PADDING_MS + 1);\n const leadingBytes = Math.round(sampleRate * leadingMs / 1000) * frameBytes;\n const trailingBytes = Math.round(sampleRate * trailingMs / 1000) * frameBytes;\n const dataSize = leadingBytes + samples.length + trailingBytes;\n const formatSize = format.length + format.length % 2;\n const totalSize = 12 + 8 + formatSize + 8 + dataSize + dataSize % 2;\n if (totalSize > MAX_AUDIO_BYTES) {\n throw new Error('Padded speech exceeds the audio size limit.');\n }\n const output = Buffer.alloc(totalSize);\n output.write('RIFF', 0);\n output.writeUInt32LE(totalSize - 8, 4);\n output.write('WAVEfmt ', 8);\n output.writeUInt32LE(format.length, 16);\n format.copy(output, 20);\n const dataOffset = 20 + formatSize;\n output.write('data', dataOffset);\n output.writeUInt32LE(dataSize, dataOffset + 4);\n // Unsigned 8-bit PCM uses midpoint 128 for silence; other supported samples use zero.\n output.fill(encoding === 1 && bits === 8 ? 128 : 0, dataOffset + 8, dataOffset + 8 + dataSize);\n samples.copy(output, dataOffset + 8 + leadingBytes);\n return { data: output, filename: 'reply.wav', mimeType: 'audio/wav' };\n}\n\n/** Synthesizes the bounded public reply text and pads it before any send attempt. */\nexport class VoiceSynthesizer {\n public constructor(private readonly model: SpeechModel, private readonly options: Readonly<Record<string, unknown>> = {}) {}\n\n public async synthesize(text: string, signal?: AbortSignal): Promise<AudioFile> {\n const audio = await this.model.synthesize(text, this.options, signal);\n signal?.throwIfAborted();\n return padVoiceAudio(audio);\n }\n}\n","/**\n * Shared runtime type guards for values that arrive as untrusted data, such as\n * parsed JSON, provider responses, and configuration files.\n */\n\n/** Returns true when `value` is a string. */\nexport function isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\n/** Returns true when `value` is a number, including `NaN` and infinities. */\nexport function isNumber(value: unknown): value is number {\n return typeof value === 'number';\n}\n\n/** Returns true when `value` is a boolean. */\nexport function isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\n/** Returns true for any non-null object, including arrays, dates, and maps. */\nexport function isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null;\n}\n\n/** Returns true for non-null objects that are not arrays; functions are rejected. */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return isObject(value) && !Array.isArray(value);\n}\n\n/** Returns true for functions, typed as callable so callers need no assertions. */\nexport function isFunction(value: unknown): value is (...args: never[]) => unknown {\n return typeof value === 'function';\n}\n","module.exports = require(\"node:child_process\");","module.exports = require(\"node:crypto\");","module.exports = require(\"node:fs\");","module.exports = require(\"node:os\");","module.exports = require(\"node:path\");","module.exports = require(\"node:readline/promises\");","module.exports = require(\"node:timers/promises\");","// The module cache\nconst __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tconst cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tconst module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","import { CliError, reportError } from './cli-support';\nimport { runAdd } from './add';\nimport { runList } from './list';\nimport { runRemove } from './remove';\nimport { runTest } from './test';\nimport { runTestStt } from './test-stt';\nimport { runTestTts } from './test-tts';\nimport { runUpdate } from './update';\n\nconst COMMANDS = ['add', 'test', 'test-stt', 'test-tts', 'list', 'update', 'remove'];\n\n/**\n * General help text.\n */\nconst HELP_TEXT = `Usage: chatserver-models <command> [options]\n\nManage OpenAI-compatible chat, speech-to-text, and text-to-speech models. Provider details live in\n<config_dir>/models.json; each provider's API key lives in the OS credential manager\nunder the provider name.\n\nCommands:\n add Add a model (guided setup when options are omitted)\n test Send a prompt to a configured model\n test-stt Transcribe a local audio file with a configured model\n test-tts Synthesize test speech and save a padded WAV file\n list List configured providers and models\n update Edit provider/model settings (guided editor without edits)\n remove Remove a model (and its provider once empty)\n\nCommon options:\n --config_dir <dir> Config folder (default: CHATSERVER_CONFIG_DIR or the per-user folder)\n -h, --help Show help for a command\n\nRun \"chatserver-models <command> --help\" for command-specific options.\nRun \"chatserver-models add\" or \"chatserver-models update\" for guided terminal setup.\n`;\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const command = argv[0];\n\n if (command === undefined || command === '-h' || command === '--help' || command === 'help') {\n console.log(HELP_TEXT);\n return;\n }\n\n const rest = argv.slice(1);\n\n switch (command) {\n case 'add':\n await runAdd(rest);\n return;\n case 'test':\n await runTest(rest);\n return;\n case 'test-stt':\n await runTestStt(rest);\n return;\n case 'test-tts':\n await runTestTts(rest);\n return;\n case 'list':\n await runList(rest);\n return;\n case 'update':\n await runUpdate(rest);\n return;\n case 'remove':\n await runRemove(rest);\n return;\n default:\n throw new CliError(\n `Unknown command: ${command}. Expected one of: ${COMMANDS.join(', ')}.`\n );\n }\n}\n\nmain().catch((error) => {\n reportError(error);\n});\n"],"names":[],"sourceRoot":""}
|