{"code":"var __defProp=Object.defineProperty;var __name=(target,value)=>__defProp(target,\"name\",{value,configurable:true});import{createHash}from\"node:crypto\";import os from\"node:os\";import{asString,ensurePathInEnv,runChildProcess}from\"@paperclipai/adapter-utils/server-utils\";const MODELS_CACHE_TTL_MS=6e4;const MODELS_DISCOVERY_TIMEOUT_MS=2e4;function resolveOpenCodeCommand(input){const envOverride=typeof process.env.PAPERCLIP_OPENCODE_COMMAND===\"string\"&&process.env.PAPERCLIP_OPENCODE_COMMAND.trim().length>0?process.env.PAPERCLIP_OPENCODE_COMMAND.trim():\"opencode\";return asString(input,envOverride)}__name(resolveOpenCodeCommand,\"resolveOpenCodeCommand\");const discoveryCache=new Map;const VOLATILE_ENV_KEY_PREFIXES=[\"PAPERCLIP_\",\"npm_\",\"NPM_\"];const VOLATILE_ENV_KEY_EXACT=new Set([\"PWD\",\"OLDPWD\",\"SHLVL\",\"_\",\"TERM_SESSION_ID\",\"HOME\"]);function dedupeModels(models){const seen=new Set;const deduped=[];for(const model of models){const id=model.id.trim();if(!id||seen.has(id))continue;seen.add(id);deduped.push({id,label:model.label.trim()||id})}return deduped}__name(dedupeModels,\"dedupeModels\");function sortModels(models){return[...models].sort((a,b)=>a.id.localeCompare(b.id,\"en\",{numeric:true,sensitivity:\"base\"}))}__name(sortModels,\"sortModels\");function firstNonEmptyLine(text){return text.split(/\\r?\\n/).map(line=>line.trim()).find(Boolean)??\"\"}__name(firstNonEmptyLine,\"firstNonEmptyLine\");function parseModelsOutput(stdout){const parsed=[];for(const raw of stdout.split(/\\r?\\n/)){const line=raw.trim();if(!line)continue;const firstToken=line.split(/\\s+/)[0]?.trim()??\"\";if(!firstToken.includes(\"/\"))continue;const provider=firstToken.slice(0,firstToken.indexOf(\"/\")).trim();const model=firstToken.slice(firstToken.indexOf(\"/\")+1).trim();if(!provider||!model)continue;parsed.push({id:`${provider}/${model}`,label:`${provider}/${model}`})}return dedupeModels(parsed)}__name(parseModelsOutput,\"parseModelsOutput\");function normalizeEnv(input){const envInput=typeof input===\"object\"&&input!==null&&!Array.isArray(input)?input:{};const env={};for(const[key,value]of Object.entries(envInput)){if(typeof value===\"string\")env[key]=value}return env}__name(normalizeEnv,\"normalizeEnv\");function isVolatileEnvKey(key){if(VOLATILE_ENV_KEY_EXACT.has(key))return true;return VOLATILE_ENV_KEY_PREFIXES.some(prefix=>key.startsWith(prefix))}__name(isVolatileEnvKey,\"isVolatileEnvKey\");function hashValue(value){return createHash(\"sha256\").update(value).digest(\"hex\")}__name(hashValue,\"hashValue\");function discoveryCacheKey(command,cwd,env){const envKey=Object.entries(env).filter(([key])=>!isVolatileEnvKey(key)).sort(([a],[b])=>a.localeCompare(b)).map(([key,value])=>`${key}=${hashValue(value)}`).join(\"\\n\");return`${command}\n${cwd}\n${envKey}`}__name(discoveryCacheKey,\"discoveryCacheKey\");function pruneExpiredDiscoveryCache(now){for(const[key,value]of discoveryCache.entries()){if(value.expiresAt<=now)discoveryCache.delete(key)}}__name(pruneExpiredDiscoveryCache,\"pruneExpiredDiscoveryCache\");async function discoverOpenCodeModels(input={}){const command=resolveOpenCodeCommand(input.command);const cwd=asString(input.cwd,process.cwd());const env=normalizeEnv(input.env);let resolvedHome;try{resolvedHome=os.userInfo().homedir||void 0}catch{}const runtimeEnv=normalizeEnv(ensurePathInEnv({...process.env,...env,...resolvedHome?{HOME:resolvedHome}:{}}));const result=await runChildProcess(`opencode-models-${Date.now()}-${Math.random().toString(16).slice(2)}`,command,[\"models\"],{cwd,env:runtimeEnv,timeoutSec:MODELS_DISCOVERY_TIMEOUT_MS/1e3,graceSec:3,onLog:__name(async()=>{},\"onLog\")});if(result.timedOut){throw new Error(`\\`opencode models\\` timed out after ${MODELS_DISCOVERY_TIMEOUT_MS/1e3}s.`)}if((result.exitCode??1)!==0){const detail=firstNonEmptyLine(result.stderr)||firstNonEmptyLine(result.stdout);throw new Error(detail?`\\`opencode models\\` failed: ${detail}`:\"`opencode models` failed.\")}return sortModels(parseModelsOutput(result.stdout))}__name(discoverOpenCodeModels,\"discoverOpenCodeModels\");async function discoverOpenCodeModelsCached(input={}){const command=resolveOpenCodeCommand(input.command);const cwd=asString(input.cwd,process.cwd());const env=normalizeEnv(input.env);const key=discoveryCacheKey(command,cwd,env);const now=Date.now();pruneExpiredDiscoveryCache(now);const cached=discoveryCache.get(key);if(cached&&cached.expiresAt>now)return cached.models;const models=await discoverOpenCodeModels({command,cwd,env});discoveryCache.set(key,{expiresAt:now+MODELS_CACHE_TTL_MS,models});return models}__name(discoverOpenCodeModelsCached,\"discoverOpenCodeModelsCached\");async function ensureOpenCodeModelConfiguredAndAvailable(input){const model=asString(input.model,\"\").trim();if(!model){throw new Error(\"OpenCode requires `adapterConfig.model` in provider/model format.\")}const models=await discoverOpenCodeModelsCached({command:input.command,cwd:input.cwd,env:input.env});if(models.length===0){throw new Error(\"OpenCode returned no models. Run `opencode models` and verify provider auth.\")}if(!models.some(entry=>entry.id===model)){const sample=models.slice(0,12).map(entry=>entry.id).join(\", \");throw new Error(`Configured OpenCode model is unavailable: ${model}. Available models: ${sample}${models.length>12?\", ...\":\"\"}`)}return models}__name(ensureOpenCodeModelConfiguredAndAvailable,\"ensureOpenCodeModelConfiguredAndAvailable\");async function listOpenCodeModels(){try{return await discoverOpenCodeModelsCached()}catch{return[]}}__name(listOpenCodeModels,\"listOpenCodeModels\");function resetOpenCodeModelsCacheForTests(){discoveryCache.clear()}__name(resetOpenCodeModelsCacheForTests,\"resetOpenCodeModelsCacheForTests\");export{discoverOpenCodeModels,discoverOpenCodeModelsCached,ensureOpenCodeModelConfiguredAndAvailable,listOpenCodeModels,resetOpenCodeModelsCacheForTests};\n","warnings":[],"map":{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["/var/www/paperclip.westilt.com/packages/adapters/opencode-local/src/server/models.ts"],"sourcesContent":[null]}}