pi-plus 0.1.26 → 0.1.27

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/pipi.js +5 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-plus",
3
- "version": "0.1.26",
3
+ "version": "0.1.27",
4
4
  "description": "pi coding agent with the pi-plus override layer (pipi CLI)",
5
5
  "type": "module",
6
6
  "piConfig": {
package/pipi.js CHANGED
@@ -570,7 +570,7 @@ new Anthropic({ apiKey, dangerouslyAllowBrowser: true });
570
570
  `)||"",contentText3=item.content?.map(c2=>c2.text).join(`
571
571
 
572
572
  `)||"";slot.block.thinking=summaryText2||contentText3||slot.block.thinking,slot.block.thinkingSignature=JSON.stringify(item),reasoningBlocksById.set(item.id,slot.block),stream12.push({type:"thinking_end",contentIndex:slot.contentIndex,content:slot.block.thinking,partial:output}),outputSlots.delete(event.output_index)}else item.type==="message"&&slot?.type==="text"?(slot.block.text=item.content?.map(c2=>c2.type==="output_text"?c2.text:c2.refusal).join("")||"",slot.block.textSignature=encodeTextSignatureV1(item.id,item.phase??void 0),stream12.push({type:"text_end",contentIndex:slot.contentIndex,content:slot.block.text,partial:output}),outputSlots.delete(event.output_index)):item.type==="function_call"&&slot?.type==="toolCall"&&slot.block.partialJson!==void 0?(slot.block.arguments=parseStreamingJson(item.arguments||slot.block.partialJson||"{}"),item.namespace!==void 0&&(slot.block.namespace=item.namespace),delete slot.block.partialJson,stream12.push({type:"toolcall_end",contentIndex:slot.contentIndex,toolCall:slot.block,partial:output}),outputSlots.delete(event.output_index)):item.type==="custom_tool_call"&&slot?.type==="toolCall"&&slot.block.customInput&&(pushToolCallDelta(slot,appendCustomToolCallInput(slot.block,item.input??getCustomToolCallInput(slot.block),!0)),item.namespace!==void 0&&(slot.block.namespace=item.namespace),delete slot.block.customInput,stream12.push({type:"toolcall_end",contentIndex:slot.contentIndex,toolCall:slot.block,partial:output}),outputSlots.delete(event.output_index))}else if(event.type==="response.completed"||event.type==="response.incomplete")finalizeResponse2(event.response);else{if(event.type==="error")throw new Error(`Error Code ${event.code}: ${event.message}`||"Unknown error");if(event.type==="response.failed"){sawTerminalResponseEvent=!0,output.rawStopReason=event.response?.status;let error=event.response?.error,details=event.response?.incomplete_details,msg=error?`${error.code||"unknown"}: ${error.message||"no message"}`:details?.reason?`incomplete: ${details.reason}`:"Unknown error (no error details in response)";throw new Error(msg)}}if(!sawTerminalResponseEvent)throw new Error("OpenAI Responses stream ended before a terminal response event");if(output.stopReason==="toolUse")for(let block of output.content){if(block.type!=="toolCall")continue;let toolCall=block;if(toolCall.partialJson!==void 0||toolCall.customInput!==void 0)throw new Error(`OpenAI Responses stream completed with an unfinished tool call: ${toolCall.name} (${toolCall.id})`)}}function mapStopReason3(status,incompleteReason){if(!status)return{stopReason:"stop"};switch(status){case"completed":return{stopReason:"stop"};case"incomplete":return incompleteReason==="max_output_tokens"?{stopReason:"length"}:{stopReason:"error",errorMessage:incompleteReason?`Response incomplete: ${incompleteReason}`:"Response incomplete without a provider reason"};case"failed":case"cancelled":return{stopReason:"error"};case"in_progress":case"queued":return{stopReason:"stop"};default:{let _exhaustive=status;throw new Error(`Unhandled stop reason: ${_exhaustive}`)}}}var init_openai_responses_shared=__esm({"packages/ai/dist/api/openai-responses-shared.js"(){init_models();init_hash4();init_json_parse();init_sanitize_unicode();init_text2();init_transcript();init_constrained_sampling();init_transform_messages()}});var azure_openai_responses_exports={};__export(azure_openai_responses_exports,{stream:()=>stream4,streamSimple:()=>streamSimple3});function parseDeploymentNameMap(value){let map=new Map;if(!value)return map;for(let entry of value.split(",")){let trimmed=entry.trim();if(!trimmed)continue;let[modelId,deploymentName]=trimmed.split("=",2);!modelId||!deploymentName||map.set(modelId.trim(),deploymentName.trim())}return map}function resolveDeploymentName(model,options){return options?.azureDeploymentName?options.azureDeploymentName:parseDeploymentNameMap(getProviderEnvValue("AZURE_OPENAI_DEPLOYMENT_NAME_MAP",options?.env)).get(model.id)||model.id}function formatAzureOpenAIError(error){return formatProviderError(normalizeProviderError(error),"Azure OpenAI API error")}function normalizeAzureBaseUrl(baseUrl){let trimmed=baseUrl.trim().replace(/\/+$/,""),url;try{url=new URL(trimmed)}catch{throw new Error(`Invalid Azure OpenAI base URL: ${baseUrl}`)}let isAzureHost=url.hostname.endsWith(".openai.azure.com")||url.hostname.endsWith(".cognitiveservices.azure.com")||url.hostname.endsWith(".ai.azure.com"),normalizedPath=url.pathname.replace(/\/+$/,"");return isAzureHost&&(normalizedPath===""||normalizedPath==="/"||normalizedPath==="/openai"||normalizedPath==="/openai/v1/responses")&&(url.pathname="/openai/v1",url.search=""),url.toString().replace(/\/+$/,"")}function buildDefaultBaseUrl(resourceName2){return`https://${resourceName2}.openai.azure.com/openai/v1`}function resolveAzureConfig(model,options){let apiVersion=options?.azureApiVersion||getProviderEnvValue("AZURE_OPENAI_API_VERSION",options?.env)||DEFAULT_AZURE_API_VERSION,baseUrl=options?.azureBaseUrl?.trim()||getProviderEnvValue("AZURE_OPENAI_BASE_URL",options?.env)?.trim()||void 0,resourceName2=options?.azureResourceName||getProviderEnvValue("AZURE_OPENAI_RESOURCE_NAME",options?.env),resolvedBaseUrl=baseUrl;if(!resolvedBaseUrl&&resourceName2&&(resolvedBaseUrl=buildDefaultBaseUrl(resourceName2)),!resolvedBaseUrl&&model.baseUrl&&(resolvedBaseUrl=model.baseUrl),!resolvedBaseUrl)throw new Error("Azure OpenAI base URL is required. Set AZURE_OPENAI_BASE_URL or AZURE_OPENAI_RESOURCE_NAME, or pass azureBaseUrl, azureResourceName, or model.baseUrl.");return{baseUrl:normalizeAzureBaseUrl(resolvedBaseUrl),apiVersion}}function createClient3(model,apiKey,options){let headers={"User-Agent":getPiUserAgent(),...model.headers};options?.headers&&Object.assign(headers,options.headers);let{baseUrl,apiVersion}=resolveAzureConfig(model,options);return new AzureOpenAI({apiKey,apiVersion,dangerouslyAllowBrowser:!0,fetch:options?.fetch,defaultHeaders:headers,baseURL:baseUrl})}function buildParams3(model,context,options,deploymentName,grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(context.messages),model.compat?.supportsOpenAIGrammarTools??!1)){let supportsAdditionalTools=model.compat?.supportsAdditionalTools??!1,supportsToolSearch=model.compat?.supportsToolSearch??!1,transcriptTools=resolveTranscriptTools(context.messages,supportsAdditionalTools||supportsToolSearch),messages=convertResponsesMessages(model,context,AZURE_TOOL_CALL_PROVIDERS,{grammarToolInputProperties,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,supportsAdditionalTools,supportsToolSearch,toolOptions:{supportsStrictMode:model.compat?.supportsStrictMode??!0,supportsOpenAIGrammarTools:model.compat?.supportsOpenAIGrammarTools??!1}}),params={model:deploymentName,input:messages,stream:!0,prompt_cache_key:clampOpenAIPromptCacheKey(options?.sessionId),store:!1};options?.maxTokens&&(params.max_output_tokens=Math.max(options.maxTokens,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS)),options?.temperature!==void 0&&(params.temperature=options?.temperature),transcriptTools.requestTools.length>0&&(params.tools=convertResponsesTools(transcriptTools.requestTools,{supportsStrictMode:model.compat?.supportsStrictMode??!0,supportsOpenAIGrammarTools:model.compat?.supportsOpenAIGrammarTools??!1})),options?.toolChoice!==void 0&&(params.tool_choice=options.toolChoice);let reasoningEffort=options?.reasoningEffort??(options?.reasoningSummary?"medium":void 0);if(model.reasoning)if(reasoningEffort){let effort=options?.reasoningEffort?model.thinkingLevelMap?.[options.reasoningEffort]??options.reasoningEffort:reasoningEffort;params.reasoning={effort,summary:options?.reasoningSummary||"auto"},params.include=["reasoning.encrypted_content"]}else model.thinkingLevelMap?.off!==null&&(params.reasoning={effort:model.thinkingLevelMap?.off??"none"});let samplingParams=resolveSamplingParams(model,reasoningEffort??"off",options?.samplingParams);return samplingParams&&Object.assign(params,samplingParams),params}var DEFAULT_AZURE_API_VERSION,AZURE_TOOL_CALL_PROVIDERS,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS,stream4,streamSimple3,init_azure_openai_responses2=__esm({"packages/ai/dist/api/azure-openai-responses.js"(){init_openai2();init_models();init_error_body();init_event_stream();init_headers2();init_pi_user_agent();init_provider_env();init_provider_retry();init_transcript();init_constrained_sampling();init_openai_prompt_cache();init_openai_responses_shared();init_simple_options();DEFAULT_AZURE_API_VERSION="v1",AZURE_TOOL_CALL_PROVIDERS=new Set(["openai","openai-codex","opencode","azure-openai-responses"]),OPENAI_RESPONSES_MIN_OUTPUT_TOKENS=16;stream4=(model,context,options)=>{let stream12=new AssistantMessageEventStream,normalizedContext=resolveTranscript(context,model.compat?.supportsMidConvoSystemMessages);return(async()=>{let deploymentName=resolveDeploymentName(model,options),output={role:"assistant",content:[],api:"azure-openai-responses",provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let client=createClient3(model,apiKey,options),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),model.compat?.supportsOpenAIGrammarTools??!1),params=buildParams3(model,normalizedContext,options,deploymentName,grammarToolInputProperties),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams);let requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},{data:openaiStream,response}=await retryProviderRequest(()=>client.responses.create(params,requestOptions).withResponse(),{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),stream12.push({type:"start",partial:output}),await processResponsesStream(openaiStream,output,stream12,model,{onProviderStreamEvent:options?.onProviderStreamEvent,grammarToolInputProperties}),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="pending")throw new Error("Azure OpenAI Responses stream ended without a stop reason");if(output.stopReason==="aborted"||output.stopReason==="error")throw new Error(output.errorMessage||"An unknown error occurred");stream12.push({type:"done",reason:output.stopReason,message:output}),stream12.end()}catch(error){for(let block of output.content)delete block.index,delete block.partialJson,delete block.customInput;output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatAzureOpenAIError(error),stream12.push({type:"error",reason:output.stopReason,error:output}),stream12.end()}})(),stream12},streamSimple3=(model,context,options)=>{let apiKey=options?.apiKey;if(!apiKey)throw new Error(`No API key for provider: ${model.provider}`);let base={...buildBaseOptions(model,context,options,apiKey),toolChoice:options?.toolChoice},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0;return stream4(model,context,{...base,reasoningEffort:clampedReasoning==="off"?void 0:clampedReasoning})}}});var azureOpenAIResponsesApi,init_azure_openai_responses_lazy=__esm({"packages/ai/dist/api/azure-openai-responses.lazy.js"(){init_lazy();azureOpenAIResponsesApi=()=>lazyApi(()=>Promise.resolve().then(()=>(init_azure_openai_responses2(),azure_openai_responses_exports)))}});function azureOpenAIResponsesProvider(){return createProvider({id:"azure-openai-responses",name:"Azure OpenAI",auth:{apiKey:envApiKeyAuth("Azure OpenAI API key",["AZURE_OPENAI_API_KEY"])},models:Object.values(AZURE_OPENAI_RESPONSES_MODELS),api:azureOpenAIResponsesApi()})}var init_azure_openai_responses3=__esm({"packages/ai/dist/providers/azure-openai-responses.js"(){init_azure_openai_responses_lazy();init_helpers2();init_models();init_azure_openai_responses_models()}});function basetenProvider(){return createProvider({id:"baseten",name:"Baseten",baseUrl:"https://inference.baseten.co/v1",auth:{apiKey:envApiKeyAuth("Baseten API key",["BASETEN_API_KEY"])},models:Object.values(BASETEN_MODELS),api:openAICompletionsApi()})}var init_baseten2=__esm({"packages/ai/dist/providers/baseten.js"(){init_openai_completions_lazy();init_helpers2();init_models();init_baseten_models()}});function cerebrasProvider(){return createProvider({id:"cerebras",name:"Cerebras",baseUrl:"https://api.cerebras.ai/v1",auth:{apiKey:envApiKeyAuth("Cerebras API key",["CEREBRAS_API_KEY"])},models:Object.values(CEREBRAS_MODELS),api:openAICompletionsApi()})}var init_cerebras2=__esm({"packages/ai/dist/providers/cerebras.js"(){init_openai_completions_lazy();init_helpers2();init_models();init_cerebras_models()}});var openai_responses_exports={};__export(openai_responses_exports,{stream:()=>stream5,streamSimple:()=>streamSimple4});function isChatGPTSignIn(model,apiKey){return model.provider==="openai"&&model.baseUrl==="https://api.openai.com/v1"&&apiKey!==void 0&&!apiKey.startsWith("sk-")}function hasHeader3(headers,name){if(!headers)return!1;let expected=name.toLowerCase();for(let[key,value]of Object.entries(headers))if(key.toLowerCase()===expected&&value!==null&&value.trim().length>0)return!0;return!1}function getClientApiKey2(provider,apiKey,headers){if(apiKey)return apiKey;if(hasHeader3(headers,"authorization")||hasHeader3(headers,"cf-aig-authorization"))return"unused";throw new Error(`No API key for provider: ${provider}`)}function detectSessionAffinityFormat(model){return model.provider==="openrouter"||model.baseUrl.includes("openrouter.ai")?"openrouter":"openai"}function resolveCacheRetention3(cacheRetention,env3){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env3)==="long"?"long":"short")}function getCompat2(model){return{supportsDeveloperRole:model.compat?.supportsDeveloperRole??!0,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,sessionAffinityFormat:model.compat?.sessionAffinityFormat??detectSessionAffinityFormat(model),supportsLongCacheRetention:model.compat?.supportsLongCacheRetention??!0,supportsStrictMode:model.compat?.supportsStrictMode??!1,supportsOpenAIGrammarTools:model.compat?.supportsOpenAIGrammarTools??!1,supportsAdditionalTools:model.compat?.supportsAdditionalTools??!1,supportsToolSearch:model.compat?.supportsToolSearch??!1,supportsExplicitPromptCacheMode:model.compat?.supportsExplicitPromptCacheMode??!1,supportsMaxOutputTokens:model.compat?.supportsMaxOutputTokens??!0}}function getPromptCacheRetention(compat,cacheRetention){return cacheRetention==="long"&&compat.supportsLongCacheRetention&&!compat.supportsExplicitPromptCacheMode?"24h":void 0}function getPromptCacheOptions(compat,cacheRetention){if(compat.supportsExplicitPromptCacheMode){if(cacheRetention==="none")return{mode:"explicit"};if(cacheRetention==="long"&&compat.supportsLongCacheRetention)return{ttl:"30m"}}}function createClient4(model,context,apiKey,optionsHeaders,fetch3,sessionId){let compat=getCompat2(model),headers={"User-Agent":getPiUserAgent(),...model.headers};if(model.provider==="github-copilot"){let hasImages=hasCopilotVisionInput(context.messages),copilotHeaders=buildCopilotDynamicHeaders({messages:context.messages,hasImages});Object.assign(headers,copilotHeaders)}return sessionId&&(compat.sessionAffinityFormat==="openrouter"?headers["x-session-id"]=sessionId:(compat.sessionAffinityFormat==="openai"&&(headers.session_id=sessionId),headers["x-client-request-id"]=sessionId)),optionsHeaders&&Object.assign(headers,optionsHeaders),new OpenAI({apiKey,baseURL:model.baseUrl,dangerouslyAllowBrowser:!0,fetch:fetch3,defaultHeaders:headers})}function buildParams4(model,context,options,compat=getCompat2(model),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(context.messages),compat.supportsOpenAIGrammarTools)){let transcriptTools=resolveTranscriptTools(context.messages,compat.supportsAdditionalTools||compat.supportsToolSearch),messages=convertResponsesMessages(model,context,OPENAI_TOOL_CALL_PROVIDERS,{grammarToolInputProperties,supportsMidConvoSystemMessages:compat.supportsMidConvoSystemMessages,supportsAdditionalTools:compat.supportsAdditionalTools,supportsToolSearch:compat.supportsToolSearch,toolOptions:{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools}}),cacheRetention=resolveCacheRetention3(options?.cacheRetention,options?.env),omitUnsupportedFields=isChatGPTSignIn(model,options?.apiKey),params={model:model.id,input:messages,stream:!0,prompt_cache_key:cacheRetention==="none"?void 0:clampOpenAIPromptCacheKey(options?.sessionId),prompt_cache_retention:omitUnsupportedFields?void 0:getPromptCacheRetention(compat,cacheRetention),prompt_cache_options:omitUnsupportedFields?void 0:getPromptCacheOptions(compat,cacheRetention),store:!1};options?.maxTokens&&compat.supportsMaxOutputTokens&&!omitUnsupportedFields&&(params.max_output_tokens=Math.max(options.maxTokens,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS2)),options?.temperature!==void 0&&!omitUnsupportedFields&&(params.temperature=options?.temperature),options?.serviceTier!==void 0&&(params.service_tier=options.serviceTier),transcriptTools.requestTools.length>0&&(params.tools=convertResponsesTools(transcriptTools.requestTools,{supportsStrictMode:compat.supportsStrictMode,supportsOpenAIGrammarTools:compat.supportsOpenAIGrammarTools})),options?.toolChoice!==void 0&&(params.tool_choice=options.toolChoice);let reasoningEffort=options?.reasoningEffort??(options?.reasoningSummary?"medium":void 0);if(model.reasoning){if(reasoningEffort){let effort=options?.reasoningEffort?model.thinkingLevelMap?.[options.reasoningEffort]??options.reasoningEffort:reasoningEffort;params.reasoning={effort,summary:options?.reasoningSummary||"auto"},params.include=["reasoning.encrypted_content"]}else model.provider!=="github-copilot"&&model.thinkingLevelMap?.off!==null&&(params.reasoning={effort:model.thinkingLevelMap?.off??"none"});model.provider==="xai"&&(params.include=["reasoning.encrypted_content"])}let samplingParams=resolveSamplingParams(model,reasoningEffort??"off",options?.samplingParams);return samplingParams&&Object.assign(params,samplingParams),params}function getServiceTierCostMultiplier(model,serviceTier){switch(serviceTier){case"flex":return .5;case"priority":case"fast":return model.id==="gpt-5.5"?2.5:2;default:return 1}}function applyServiceTierPricing(usage,serviceTier,model){let multiplier=getServiceTierCostMultiplier(model,serviceTier);multiplier!==1&&(usage.cost.input*=multiplier,usage.cost.output*=multiplier,usage.cost.cacheRead*=multiplier,usage.cost.cacheWrite*=multiplier,usage.cost.total=usage.cost.input+usage.cost.output+usage.cost.cacheRead+usage.cost.cacheWrite)}var OPENAI_TOOL_CALL_PROVIDERS,OPENAI_RESPONSES_MIN_OUTPUT_TOKENS2,CHATGPT_USAGE_URL,stream5,streamSimple4,init_openai_responses=__esm({"packages/ai/dist/api/openai-responses.js"(){init_openai2();init_models();init_error_body();init_event_stream();init_headers2();init_pi_user_agent();init_provider_env();init_provider_retry();init_transcript();init_constrained_sampling();init_github_copilot_headers();init_openai_prompt_cache();init_openai_responses_shared();init_simple_options();OPENAI_TOOL_CALL_PROVIDERS=new Set(["openai","openai-codex","opencode"]),OPENAI_RESPONSES_MIN_OUTPUT_TOKENS2=16,CHATGPT_USAGE_URL="https://chatgpt.com/settings/usage";stream5=(model,context,options)=>{let stream12=new AssistantMessageEventStream,normalizedContext=resolveTranscript(context,getCompat2(model).supportsMidConvoSystemMessages);return(async()=>{let output={role:"assistant",content:[],api:model.api,provider:model.provider,model:model.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:"pending",timestamp:Date.now()};try{let apiKey=getClientApiKey2(model.provider,options?.apiKey,options?.headers),cacheSessionId=resolveCacheRetention3(options?.cacheRetention,options?.env)==="none"?void 0:options?.sessionId,compat=getCompat2(model),grammarToolInputProperties=createGrammarToolInputProperties(getDeclaredTools(normalizedContext.messages),compat.supportsOpenAIGrammarTools),client=createClient4(model,normalizedContext,apiKey,options?.headers,options?.fetch,cacheSessionId),params=buildParams4(model,normalizedContext,options,compat,grammarToolInputProperties),nextParams=await options?.onPayload?.(params,model);nextParams!==void 0&&(params=nextParams);let requestOptions={...options?.signal?{signal:options.signal}:{},...options?.timeoutMs!==void 0?{timeout:options.timeoutMs}:{},maxRetries:0},{data:openaiStream,response}=await retryProviderRequest(()=>client.responses.create(params,requestOptions).withResponse(),{maxRetries:options?.maxRetries,maxRetryDelayMs:options?.maxRetryDelayMs,signal:options?.signal});if(await options?.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model),stream12.push({type:"start",partial:output}),await processResponsesStream(openaiStream,output,stream12,model,{onProviderStreamEvent:options?.onProviderStreamEvent,serviceTier:options?.serviceTier,grammarToolInputProperties,applyServiceTierPricing:(usage,serviceTier)=>applyServiceTierPricing(usage,serviceTier,model)}),options?.signal?.aborted)throw new Error("Request was aborted");if(output.stopReason==="pending")throw new Error("OpenAI Responses stream ended without a stop reason");if(output.stopReason==="aborted"||output.stopReason==="error")throw new Error(output.errorMessage||"An unknown error occurred");stream12.push({type:"done",reason:output.stopReason,message:output}),stream12.end()}catch(error){for(let block of output.content)delete block.index,delete block.partialJson,delete block.customInput;output.stopReason=options?.signal?.aborted?"aborted":"error";let errorMessage9=formatProviderError(normalizeProviderError(error),`${model.provider==="openai"?"OpenAI":model.provider} API error`);output.errorMessage=errorMessage9.includes("subscription_sharing_usage_limit_exceeded")?`${errorMessage9}
573
- Check your ChatGPT usage: ${CHATGPT_USAGE_URL}`:errorMessage9,stream12.push({type:"error",reason:output.stopReason,error:output}),stream12.end()}})(),stream12},streamSimple4=(model,context,options)=>{getClientApiKey2(model.provider,options?.apiKey,options?.headers);let base={...buildBaseOptions(model,context,options,options?.apiKey),toolChoice:options?.toolChoice},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0;return stream5(model,context,{...base,reasoningEffort:clampedReasoning==="off"?void 0:clampedReasoning})}}});var openAIResponsesApi,init_openai_responses_lazy=__esm({"packages/ai/dist/api/openai-responses.lazy.js"(){init_lazy();openAIResponsesApi=()=>lazyApi(()=>Promise.resolve().then(()=>(init_openai_responses(),openai_responses_exports)))}});async function resolveValue(name,ctx,credential,signal){let fromCredential=credential?name===CLOUDFLARE_API_KEY?credential.key:credential.env?.[name]:void 0;if(fromCredential!==void 0)return fromCredential;signal.throwIfAborted();let value=await ctx.env(name);return signal.throwIfAborted(),value}async function resolveCloudflareEnv(kind,ctx,credential,signal){let apiKey=await resolveValue(CLOUDFLARE_API_KEY,ctx,credential,signal),accountId=await resolveValue(CLOUDFLARE_ACCOUNT_ID,ctx,credential,signal),gatewayId=kind==="ai-gateway"?await resolveValue(CLOUDFLARE_GATEWAY_ID,ctx,credential,signal):void 0;if(!(!apiKey||!accountId||kind==="ai-gateway"&&!gatewayId))return{apiKey,env:{CLOUDFLARE_ACCOUNT_ID:accountId,...gatewayId?{CLOUDFLARE_GATEWAY_ID:gatewayId}:{}},source:credential?"stored credential":CLOUDFLARE_API_KEY}}function cloudflareWorkersAIAuth(){return{name:"Cloudflare API key",login:async interaction=>{let key=await interaction.prompt({type:"secret",message:"Enter Cloudflare API key"}),accountId=await interaction.prompt({type:"text",message:"Enter Cloudflare account ID"});return{type:"api_key",key,env:{CLOUDFLARE_ACCOUNT_ID:accountId}}},resolve:async({ctx,credential,signal})=>{let resolved=await resolveCloudflareEnv("workers-ai",ctx,credential,signal);if(resolved)return{auth:{apiKey:resolved.apiKey},env:resolved.env,source:resolved.source}}}}function cloudflareAIGatewayAuth(){return{name:"Cloudflare API key",login:async interaction=>{let key=await interaction.prompt({type:"secret",message:"Enter Cloudflare API key"}),accountId=await interaction.prompt({type:"text",message:"Enter Cloudflare account ID"}),gatewayId=await interaction.prompt({type:"text",message:"Enter Cloudflare AI Gateway ID"});return{type:"api_key",key,env:{CLOUDFLARE_ACCOUNT_ID:accountId,CLOUDFLARE_GATEWAY_ID:gatewayId}}},resolve:async({ctx,credential,signal})=>{let resolved=await resolveCloudflareEnv("ai-gateway",ctx,credential,signal);if(resolved)return{auth:{headers:{"cf-aig-authorization":`Bearer ${resolved.apiKey}`,Authorization:null,"x-api-key":null}},env:resolved.env,source:resolved.source}}}}var CLOUDFLARE_API_KEY,CLOUDFLARE_ACCOUNT_ID,CLOUDFLARE_GATEWAY_ID,init_cloudflare_auth=__esm({"packages/ai/dist/providers/cloudflare-auth.js"(){CLOUDFLARE_API_KEY="CLOUDFLARE_API_KEY",CLOUDFLARE_ACCOUNT_ID="CLOUDFLARE_ACCOUNT_ID",CLOUDFLARE_GATEWAY_ID="CLOUDFLARE_GATEWAY_ID"}});function resolveCloudflareModel(model,env3){if(!env3)return model;let baseUrl=model.baseUrl.replaceAll(`{${CLOUDFLARE_ACCOUNT_ID2}}`,env3[CLOUDFLARE_ACCOUNT_ID2]??`{${CLOUDFLARE_ACCOUNT_ID2}}`).replaceAll(`{${CLOUDFLARE_GATEWAY_ID2}}`,env3[CLOUDFLARE_GATEWAY_ID2]??`{${CLOUDFLARE_GATEWAY_ID2}}`);return baseUrl===model.baseUrl?model:{...model,baseUrl}}function cloudflareStreams(streams){return{stream:(model,context,options)=>streams.stream(resolveCloudflareModel(model,options?.env),context,options),streamSimple:(model,context,options)=>streams.streamSimple(resolveCloudflareModel(model,options?.env),context,options)}}function cloudflareClassifier(classifier){return{classify:(model,context,options)=>classifier.classify(resolveCloudflareModel(model,options?.env),context,options)}}var CLOUDFLARE_ACCOUNT_ID2,CLOUDFLARE_GATEWAY_ID2,init_cloudflare_stream=__esm({"packages/ai/dist/providers/cloudflare-stream.js"(){CLOUDFLARE_ACCOUNT_ID2="CLOUDFLARE_ACCOUNT_ID",CLOUDFLARE_GATEWAY_ID2="CLOUDFLARE_GATEWAY_ID"}});function cloudflareAIGatewayProvider(){return createProvider({id:"cloudflare-ai-gateway",name:"Cloudflare AI Gateway",auth:{apiKey:cloudflareAIGatewayAuth()},models:Object.values(CLOUDFLARE_AI_GATEWAY_MODELS),api:{"anthropic-messages":cloudflareStreams(anthropicMessagesApi()),"openai-completions":cloudflareStreams(openAICompletionsApi()),"openai-responses":cloudflareStreams(openAIResponsesApi())}})}var init_cloudflare_ai_gateway2=__esm({"packages/ai/dist/providers/cloudflare-ai-gateway.js"(){init_anthropic_messages_lazy();init_openai_completions_lazy();init_openai_responses_lazy();init_models();init_cloudflare_ai_gateway_models();init_cloudflare_auth();init_cloudflare_stream()}});function httpError(label,response,body){let error=new Error(`${label} returned ${response.status}`);return error.status=response.status,error.headers=response.headers,error.body=body,error}function timeoutError(timeoutMs){let error=new Error(`Request timed out after ${timeoutMs}ms`);return error.name="TimeoutError",error.status=void 0,error.headers=void 0,error.body="",error}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function requiredNumber(label,value,field2){if(typeof value!="number"||!Number.isFinite(value))throw new Error(`${label} returned an invalid ${field2}`);return value}function probabilities(label,value,id){if(!isRecord(value))throw new Error(`${label} returned invalid probabilities for ${id}`);return Object.fromEntries(Object.entries(value).map(([key,probability])=>[key,requiredNumber(label,probability,`probability for ${id}.${key}`)]))}function parseAnswers(label,value,context){if(!isRecord(value))throw new Error(`${label} returned an unexpected response`);let answers=[];for(let[id,question]of Object.entries(context.questions)){let answer2=value[id];if(!isRecord(answer2))throw new Error(`${label} did not return an answer for ${id}`);if(question.type==="choice"){if(answer2.type!=="choice"||typeof answer2.choice!="string")throw new Error(`${label} did not return a choice answer for ${id}`);answers.push([id,{type:"choice",choice:answer2.choice,probabilities:probabilities(label,answer2.probabilities,id),confidence:requiredNumber(label,answer2.confidence,`confidence for ${id}`)}])}else if(question.type==="score"){if(answer2.type!=="score")throw new Error(`${label} did not return a score answer for ${id}`);answers.push([id,{type:"score",score:requiredNumber(label,answer2.score,`score for ${id}`),confidence:requiredNumber(label,answer2.confidence,`confidence for ${id}`)}])}else{if(answer2.type!=="noul")throw new Error(`${label} did not return a bool answer for ${id}`);answers.push([id,{type:"bool",probability:requiredNumber(label,answer2.noul,`probability for ${id}`)}])}}return Object.fromEntries(answers)}function tokenCount(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?value:0}function parseUsage(value,model){if(!isRecord(value)||value.input_tokens===void 0&&value.output_tokens===void 0)return;let input2=tokenCount(value.input_tokens),output=tokenCount(value.output_tokens),usage={input:input2,output,cacheRead:0,cacheWrite:0,totalTokens:input2+output,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return calculateCost(model,usage),usage}function wireRequest(context){return{state:context.state,questions:Object.fromEntries(Object.entries(context.questions).map(([id,question])=>[id,question.type==="bool"?{...question,type:"noul"}:question]))}}function requestHeaders(model,apiKey,optionsHeaders){return providerHeadersToRecord({authorization:`Bearer ${apiKey}`,"content-type":"application/json"},model.headers,optionsHeaders)??{}}async function classifySystemOne(transport3,model,context,options){let output={api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:"stop",timestamp:Date.now()};try{if(model.api!==transport3.api)throw new Error(`Unsupported classifier API: ${model.api}`);if(!options?.apiKey)throw new Error(`No API key for provider: ${model.provider}`);let apiKey=options.apiKey,payload=transport3.payload(model,wireRequest(context)),transformed=await options.onPayload?.(payload,model);transformed!==void 0&&(payload=transformed);let requestFetch=options.fetch??globalThis.fetch,{response,body}=await retryProviderRequest(async()=>{let timeoutSignal=options.timeoutMs!==void 0?AbortSignal.timeout(options.timeoutMs):void 0,signal=options.signal&&timeoutSignal?AbortSignal.any([options.signal,timeoutSignal]):options.signal??timeoutSignal;try{let next=await requestFetch(transport3.url(model),{method:"POST",headers:requestHeaders(model,apiKey,options.headers),body:JSON.stringify(payload),signal});if(!next.ok)throw httpError(transport3.label,next,await next.text());return{response:next,body:await next.json()}}catch(error){throw timeoutSignal?.aborted&&!options.signal?.aborted?timeoutError(options.timeoutMs):error}},{maxRetries:options.maxRetries??2,maxRetryDelayMs:options.maxRetryDelayMs,signal:options.signal});await options.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model);let result=transport3.output(body),usage=parseUsage(result.usage,model);return usage&&(output.usage=usage),output.answers=parseAnswers(transport3.label,result.answers,context),output}catch(error){return output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error),`${transport3.label} error`),output}}var init_system_one_shared=__esm({"packages/ai/dist/api/system-one-shared.js"(){init_models();init_error_body();init_headers2();init_provider_retry()}});var cloudflare_workers_ai_system_one_exports={};__export(cloudflare_workers_ai_system_one_exports,{classify:()=>classify});function cloudflareErrorMessage(errors){if(Array.isArray(errors)){let messages=errors.map(error=>isRecord(error)&&typeof error.message=="string"?error.message:void 0).filter(message2=>message2!==void 0);if(messages.length>0)return`${LABEL} error: ${messages.join("; ")}`}return`${LABEL} request failed`}var LABEL,transport,classify,init_cloudflare_workers_ai_system_one=__esm({"packages/ai/dist/api/cloudflare-workers-ai-system-one.js"(){init_system_one_shared();LABEL="Cloudflare Workers AI";transport={api:"cloudflare-workers-ai-system-one",label:LABEL,url:model=>new URL("run",`${model.baseUrl.replace(/\/+$/u,"")}/`),payload:(model,request)=>({model:model.id,input:request}),output:body=>{if(!isRecord(body))throw new Error(`${LABEL} returned an unexpected response`);if(body.success===!1)throw new Error(cloudflareErrorMessage(body.errors));let result=body.result;if(!isRecord(result))throw new Error(`${LABEL} returned an unexpected response`);if("answers"in result)return result;if(result.state!=="Completed")throw new Error(`${LABEL} run did not complete (state: ${String(result.state)})`);if(!isRecord(result.result))throw new Error(`${LABEL} returned an unexpected response`);return result.result}},classify=(model,context,options)=>classifySystemOne(transport,model,context,options)}});var cloudflareWorkersAISystemOneApi,init_cloudflare_workers_ai_system_one_lazy=__esm({"packages/ai/dist/api/cloudflare-workers-ai-system-one.lazy.js"(){cloudflareWorkersAISystemOneApi=()=>({classify:async(model,context,options)=>(await Promise.resolve().then(()=>(init_cloudflare_workers_ai_system_one(),cloudflare_workers_ai_system_one_exports))).classify(model,context,options)})}});function cloudflareWorkersAIProvider(){return createProvider({id:"cloudflare-workers-ai",name:"Cloudflare Workers AI",auth:{apiKey:cloudflareWorkersAIAuth()},models:[...Object.values(CLOUDFLARE_WORKERS_AI_MODELS),...Object.values(CLOUDFLARE_WORKERS_AI_CLASSIFIER_MODELS)],api:cloudflareStreams(openAICompletionsApi()),classifiers:{"cloudflare-workers-ai-system-one":cloudflareClassifier(cloudflareWorkersAISystemOneApi())}})}var init_cloudflare_workers_ai2=__esm({"packages/ai/dist/providers/cloudflare-workers-ai.js"(){init_cloudflare_workers_ai_system_one_lazy();init_openai_completions_lazy();init_models();init_cloudflare_auth();init_cloudflare_stream();init_cloudflare_workers_ai_models()}});var manifest_default,init_manifest=__esm({"packages/ai/dist/providers/data/.manifest.json"(){manifest_default={schemaVersion:6,generatedAt:"2026-10-04T13:34:40.515Z",structureHash:"c36423c1e750caaf9b45181ba43b7cdaafb7148cd795700a0362e6706d4b0716",files:{"amazon-bedrock.json":"a0256dd49b0b7f4fee8a2853aeaecc65e74f643e96348c5be55d2d912b82c6ce","ant-ling.json":"628feab3ef6c7d80ce96f75999804e1d9f05fec3851e5302e30fff3b69db90f6","anthropic.json":"3ff00b68990382e42626ebd1b65dcc28ae3cad9e6faa8920331ba92f067f1b3a","azure-openai-responses.json":"adeb2cf9d944d84f81b0d633c2e4e6bfa548a806c431902bd037c5f36500be21","baseten.json":"b04d1423d6958bec857ffccc36726f091ec1a8f3a09cf0836b64cc94b0ee697d","cerebras.json":"3eccb58c5de3d0dc7ba49dc6e477ba29f00cb3150ce0a35cc90d59e6b5ab368e","cloudflare-ai-gateway.json":"9030456decc3f3edacc3388165ab87cb3db0360f6b191f4a12e063f5c9464332","cloudflare-workers-ai.json":"d04336a61cacfd0cadbc2f3d30cd3b552e3d153e5a320658a31ba1bab8f01c83","deepseek.json":"10a296fb3e898f7715c80890c8af0af4f5fd58f22dbcd6612fdc5d762157ccdc","fireworks.json":"8db3c11f65a5d76260d5040a5dc5a9ef0f35b92de8505a30907c2355c2837b36","github-copilot.json":"573f05c2dfc0c8158e252dd286d6b174cd323f965284d7ae157439d8e3dea92c","google-vertex.json":"40090c680538bc867f2624d986a449f361be4dfa6ba96d7a27402050f036e009","google.json":"c0f5a633e5e5a5044432db3e537f4bc674d4de18df09325c6349547fcc13cabe","groq.json":"910952ad9dad07856983459d63fce0148dba1203edd7b10d801a77c5824f3405","huggingface.json":"1b8604bd31a5e05fe43a40ec1ec6dfc1a51a28b0b020151ef057fab43f57c923","kimi-coding.json":"582250b920454d98940da3e7e99d30b807edbea28f2eb8ac15f658d2ef41e8fc","meta.json":"0c7e9a370a7005c5a89dc94f0f93bc67b8935c3f802de324f11af6ff56fff429","minimax-cn.json":"f962c20ee6a6a342820f778e9dc363a18a524bf11998f6e2c57f2989915d62e5","minimax.json":"17a432f80d0ea6dd26eade80a4314250d3a855678601728a5f70dd8fa0d21dd2","mistral.json":"10f33bff9adf1248f7e6848e5890c265399f1f94e5b42cfdc28c109d547af98d","moonshotai-cn.json":"79c9585dc84ee525ebaebbc78b3c55f3d369ec884d4f943488f1e0b14e3587f5","moonshotai.json":"1da2c4e34f22aef17a07c974d85bdee8e1b68b6dc712e3769c935b3f1e7dadca","nvidia.json":"a75e963dc81779e3eec01c051b12277c15ec37c5b94ab51ece9e9ccb3b16407c","openai-codex.json":"3cc35a7e122e5c77ee8ec30a9a3bd8bd59629997e85ba2cb3f9e0ed62e9a09c0","openai.json":"87faafcdd168c9b6fdaef521137834a207437daf0d71641fd0a2f3dddf4d1ecb","opencode-go.json":"542a62ae86ec34d55b2927927a3fe007a54aab2729026e578d7ede1bab51e532","opencode.json":"7cf6c2e34b4defd50135572da48030402d33101bcb8c43c7612841e5b3afcd43","openrouter.json":"012139cfb2bb87cae1ddc076182d76b4baf995a5cbb17ad948f5593f16b6ca59","qwen-token-plan-cn.json":"2469a4091c474ec3db0a49a9962d8d2726c074ad9065b96bc4e0c87861c4c6c5","qwen-token-plan-individual.json":"0fb7cf64faf39d1a3b0a884210a86c87084b805eda15644f5f39293287b959dd","qwen-token-plan.json":"eff10620cb577142de4ec02698d5961a71fda2fe4f6ae7ea9432bad9d6844176","radius.json":"88a3f060a851882df89015bcd346e03238b4b0725bd72c8ad501fcffff782768","together.json":"52293df62191c8e799ae3632f8ab1b3f52ee626aee0280677086627b32864bf7","typesafe.json":"a4429a2f696d5cc5273969af61a7310bda07d6bdcd27bf9ac9c76c534cc43716","vercel-ai-gateway.json":"436f085bd5d972959f0b2b66e82f2af55843c8a40a70417328911cb1a5f32997","xai.json":"879c49b78b663a52a220ac4ee013e726b10c4f50aaa03bc58ee53a4b54c76928","xiaomi-token-plan-ams.json":"ca65178f4525d9705bc8d085ed136cecbe149c4080e857ea6a64ae643d2ac00a","xiaomi-token-plan-cn.json":"b065326926681c2262084e59c1c19ebdaf146c07107b5242c76b456becf74db0","xiaomi-token-plan-sgp.json":"92c3d6d707f81fd9cd2b6d1fb57dc431d90ba51e10fe49d97bc8806035c23492","xiaomi.json":"b81d01a374f7b558728c78d81f4168efa9c8996e6e2b5618409a8094b083c759","zai-coding-cn.json":"ee5ee705fb6e413a6088db5e3616c27fce802a8ece6c355f1db35490d787f610","zai.json":"58e6642fdfb736f0b9a4a277c760c536a3cea66a030abbfb2615f7b2851d5c6f"}}}});function deepseekProvider(){return createProvider({id:"deepseek",name:"DeepSeek",baseUrl:"https://api.deepseek.com",auth:{apiKey:envApiKeyAuth("DeepSeek API key",["DEEPSEEK_API_KEY"])},models:Object.values(DEEPSEEK_MODELS),api:openAICompletionsApi()})}var init_deepseek2=__esm({"packages/ai/dist/providers/deepseek.js"(){init_openai_completions_lazy();init_helpers2();init_models();init_deepseek_models()}});function fireworksProvider(){return createProvider({id:"fireworks",name:"Fireworks",baseUrl:"https://api.fireworks.ai/inference",auth:{apiKey:envApiKeyAuth("Fireworks API key",["FIREWORKS_API_KEY"])},models:Object.values(FIREWORKS_MODELS),api:{"anthropic-messages":anthropicMessagesApi(),"openai-completions":openAICompletionsApi()}})}var init_fireworks2=__esm({"packages/ai/dist/providers/fireworks.js"(){init_anthropic_messages_lazy();init_openai_completions_lazy();init_helpers2();init_models();init_fireworks_models()}});function githubCopilotProvider(){return createProvider({id:"github-copilot",name:"GitHub Copilot",baseUrl:"https://api.individual.githubcopilot.com",auth:{apiKey:envApiKeyAuth("GitHub Copilot token",["COPILOT_GITHUB_TOKEN"]),oauth:lazyOAuth({name:"GitHub Copilot",isSubscription:!0,load:loadGitHubCopilotOAuth})},models:Object.values(GITHUB_COPILOT_MODELS),filterModels:(models,credential)=>{if(credential?.type!=="oauth")return models;let availableModelIds=credential.availableModelIds;if(!Array.isArray(availableModelIds)||!availableModelIds.every(id=>typeof id=="string"))return models;let available=new Set(availableModelIds);return models.filter(model=>available.has(model.id))},api:{"anthropic-messages":anthropicMessagesApi(),"openai-completions":openAICompletionsApi(),"openai-responses":openAIResponsesApi()}})}var init_github_copilot2=__esm({"packages/ai/dist/providers/github-copilot.js"(){init_anthropic_messages_lazy();init_openai_completions_lazy();init_openai_responses_lazy();init_helpers2();init_load();init_models();init_github_copilot_models()}});var require_retry_operation2=__commonJS({"node_modules/retry/lib/retry_operation.js"(exports,module){function RetryOperation(timeouts,options){typeof options=="boolean"&&(options={forever:options}),this._originalTimeouts=JSON.parse(JSON.stringify(timeouts)),this._timeouts=timeouts,this._options=options||{},this._maxRetryTime=options&&options.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._timer=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}module.exports=RetryOperation;RetryOperation.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts.slice(0)};RetryOperation.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timer&&clearTimeout(this._timer),this._timeouts=[],this._cachedTimeouts=null};RetryOperation.prototype.retry=function(err2){if(this._timeout&&clearTimeout(this._timeout),!err2)return!1;var currentTime=new Date().getTime();if(err2&&currentTime-this._operationStart>=this._maxRetryTime)return this._errors.push(err2),this._errors.unshift(new Error("RetryOperation timeout occurred")),!1;this._errors.push(err2);var timeout=this._timeouts.shift();if(timeout===void 0)if(this._cachedTimeouts)this._errors.splice(0,this._errors.length-1),timeout=this._cachedTimeouts.slice(-1);else return!1;var self2=this;return this._timer=setTimeout(function(){self2._attempts++,self2._operationTimeoutCb&&(self2._timeout=setTimeout(function(){self2._operationTimeoutCb(self2._attempts)},self2._operationTimeout),self2._options.unref&&self2._timeout.unref()),self2._fn(self2._attempts)},timeout),this._options.unref&&this._timer.unref(),!0};RetryOperation.prototype.attempt=function(fn,timeoutOps){this._fn=fn,timeoutOps&&(timeoutOps.timeout&&(this._operationTimeout=timeoutOps.timeout),timeoutOps.cb&&(this._operationTimeoutCb=timeoutOps.cb));var self2=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){self2._operationTimeoutCb()},self2._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)};RetryOperation.prototype.try=function(fn){console.log("Using RetryOperation.try() is deprecated"),this.attempt(fn)};RetryOperation.prototype.start=function(fn){console.log("Using RetryOperation.start() is deprecated"),this.attempt(fn)};RetryOperation.prototype.start=RetryOperation.prototype.try;RetryOperation.prototype.errors=function(){return this._errors};RetryOperation.prototype.attempts=function(){return this._attempts};RetryOperation.prototype.mainError=function(){if(this._errors.length===0)return null;for(var counts={},mainError=null,mainErrorCount=0,i2=0;i2<this._errors.length;i2++){var error=this._errors[i2],message2=error.message,count=(counts[message2]||0)+1;counts[message2]=count,count>=mainErrorCount&&(mainError=error,mainErrorCount=count)}return mainError}}});var require_retry4=__commonJS({"node_modules/retry/lib/retry.js"(exports){var RetryOperation=require_retry_operation2();exports.operation=function(options){var timeouts=exports.timeouts(options);return new RetryOperation(timeouts,{forever:options&&(options.forever||options.retries===1/0),unref:options&&options.unref,maxRetryTime:options&&options.maxRetryTime})};exports.timeouts=function(options){if(options instanceof Array)return[].concat(options);var opts={retries:10,factor:2,minTimeout:1*1e3,maxTimeout:1/0,randomize:!1};for(var key in options)opts[key]=options[key];if(opts.minTimeout>opts.maxTimeout)throw new Error("minTimeout is greater than maxTimeout");for(var timeouts=[],i2=0;i2<opts.retries;i2++)timeouts.push(this.createTimeout(i2,opts));return options&&options.forever&&!timeouts.length&&timeouts.push(this.createTimeout(i2,opts)),timeouts.sort(function(a,b2){return a-b2}),timeouts};exports.createTimeout=function(attempt2,opts){var random=opts.randomize?Math.random()+1:1,timeout=Math.round(random*Math.max(opts.minTimeout,1)*Math.pow(opts.factor,attempt2));return timeout=Math.min(timeout,opts.maxTimeout),timeout};exports.wrap=function(obj,options,methods){if(options instanceof Array&&(methods=options,options=null),!methods){methods=[];for(var key in obj)typeof obj[key]=="function"&&methods.push(key)}for(var i2=0;i2<methods.length;i2++){var method=methods[i2],original=obj[method];obj[method]=function(original2){var op=exports.operation(options),args2=Array.prototype.slice.call(arguments,1),callback=args2.pop();args2.push(function(err2){op.retry(err2)||(err2&&(arguments[0]=op.mainError()),callback.apply(this,arguments))}),op.attempt(function(){original2.apply(obj,args2)})}.bind(obj,original),obj[method].options=options}}}});var require_retry5=__commonJS({"node_modules/retry/index.js"(exports,module){module.exports=require_retry4()}});var require_p_retry=__commonJS({"node_modules/p-retry/index.js"(exports,module){"use strict";var retry2=require_retry5(),networkErrorMsgs=["Failed to fetch","NetworkError when attempting to fetch resource.","The Internet connection appears to be offline.","Network request failed"],AbortError2=class extends Error{constructor(message2){super(),message2 instanceof Error?(this.originalError=message2,{message:message2}=message2):(this.originalError=new Error(message2),this.originalError.stack=this.stack),this.name="AbortError",this.message=message2}},decorateErrorWithCounts=(error,attemptNumber,options)=>{let retriesLeft=options.retries-(attemptNumber-1);return error.attemptNumber=attemptNumber,error.retriesLeft=retriesLeft,error},isNetworkError=errorMessage9=>networkErrorMsgs.includes(errorMessage9),pRetry2=(input2,options)=>new Promise((resolve26,reject)=>{options={onFailedAttempt:()=>{},retries:10,...options};let operation=retry2.operation(options);operation.attempt(async attemptNumber=>{try{resolve26(await input2(attemptNumber))}catch(error){if(!(error instanceof Error)){reject(new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`));return}if(error instanceof AbortError2)operation.stop(),reject(error.originalError);else if(error instanceof TypeError&&!isNetworkError(error.message))operation.stop(),reject(error);else{decorateErrorWithCounts(error,attemptNumber,options);try{await options.onFailedAttempt(error)}catch(error2){reject(error2);return}operation.retry(error)||reject(operation.mainError())}}})});module.exports=pRetry2;module.exports.default=pRetry2;module.exports.AbortError=AbortError2}});var require_extend=__commonJS({"node_modules/extend/index.js"(exports,module){"use strict";var hasOwn4=Object.prototype.hasOwnProperty,toStr=Object.prototype.toString,defineProperty=Object.defineProperty,gOPD=Object.getOwnPropertyDescriptor,isArray3=function(arr){return typeof Array.isArray=="function"?Array.isArray(arr):toStr.call(arr)==="[object Array]"},isPlainObject4=function(obj){if(!obj||toStr.call(obj)!=="[object Object]")return!1;var hasOwnConstructor=hasOwn4.call(obj,"constructor"),hasIsPrototypeOf=obj.constructor&&obj.constructor.prototype&&hasOwn4.call(obj.constructor.prototype,"isPrototypeOf");if(obj.constructor&&!hasOwnConstructor&&!hasIsPrototypeOf)return!1;var key;for(key in obj);return typeof key>"u"||hasOwn4.call(obj,key)},setProperty=function(target,options){defineProperty&&options.name==="__proto__"?defineProperty(target,options.name,{enumerable:!0,configurable:!0,value:options.newValue,writable:!0}):target[options.name]=options.newValue},getProperty=function(obj,name){if(name==="__proto__")if(hasOwn4.call(obj,name)){if(gOPD)return gOPD(obj,name).value}else return;return obj[name]};module.exports=function extend(){var options,name,src,copy,copyIsArray,clone2,target=arguments[0],i2=1,length=arguments.length,deep=!1;for(typeof target=="boolean"&&(deep=target,target=arguments[1]||{},i2=2),(target==null||typeof target!="object"&&typeof target!="function")&&(target={});i2<length;++i2)if(options=arguments[i2],options!=null)for(name in options)src=getProperty(target,name),copy=getProperty(options,name),target!==copy&&(deep&&copy&&(isPlainObject4(copy)||(copyIsArray=isArray3(copy)))?(copyIsArray?(copyIsArray=!1,clone2=src&&isArray3(src)?src:[]):clone2=src&&isPlainObject4(src)?src:{},setProperty(target,{name,newValue:extend(deep,clone2,copy)})):typeof copy<"u"&&setProperty(target,{name,newValue:copy}));return target}}});var require_package=__commonJS({"node_modules/gaxios/package.json"(exports,module){module.exports={name:"gaxios",version:"7.1.4",description:"A simple common HTTP client specifically for Google APIs and services.",main:"build/cjs/src/index.js",types:"build/cjs/src/index.d.ts",files:["build/"],exports:{".":{import:{types:"./build/esm/src/index.d.ts",default:"./build/esm/src/index.js"},require:{types:"./build/cjs/src/index.d.ts",default:"./build/cjs/src/index.js"}}},scripts:{lint:"gts check --no-inline-config",test:"c8 mocha build/esm/test","presystem-test":"npm run compile","system-test":"mocha build/esm/system-test --timeout 80000",compile:"tsc -b ./tsconfig.json ./tsconfig.cjs.json && node utils/enable-esm.mjs",fix:"gts fix",prepare:"npm run compile",pretest:"npm run compile",webpack:"webpack","prebrowser-test":"npm run compile","browser-test":"node build/browser-test/browser-test-runner.js",docs:"jsdoc -c .jsdoc.js","docs-test":"linkinator docs","predocs-test":"npm run docs","samples-test":"cd samples/ && npm link ../ && npm test && cd ../",prelint:"cd samples; npm link ../; npm install",clean:"gts clean"},repository:{type:"git",directory:"packages/gaxios",url:"https://github.com/googleapis/google-cloud-node-core.git"},keywords:["google"],engines:{node:">=18"},author:"Google, LLC",license:"Apache-2.0",devDependencies:{"@babel/plugin-proposal-private-methods":"^7.18.6","@types/cors":"^2.8.6","@types/express":"^5.0.0","@types/extend":"^3.0.1","@types/mocha":"^10.0.10","@types/multiparty":"4.2.1","@types/mv":"^2.1.0","@types/ncp":"^2.0.8","@types/node":"^22.13.1","@types/sinon":"^17.0.3","@types/tmp":"^0.2.6",assert:"^2.0.0",browserify:"^17.0.0",c8:"^10.1.3",cors:"^2.8.5",express:"^5.0.0",gts:"^6.0.2","is-docker":"^3.0.0",jsdoc:"^4.0.4","jsdoc-fresh":"^5.0.0","jsdoc-region-tag":"^4.0.0",karma:"^6.0.0","karma-chrome-launcher":"^3.0.0","karma-coverage":"^2.0.0","karma-firefox-launcher":"^2.0.0","karma-mocha":"^2.0.0","karma-remap-coverage":"^0.1.5","karma-sourcemap-loader":"^0.4.0","karma-webpack":"^5.0.1",linkinator:"^6.1.2",mocha:"^11.1.0",multiparty:"^4.2.1",mv:"^2.1.1",ncp:"^2.0.0",nock:"^14.0.5","null-loader":"^4.0.1","pack-n-play":"^4.0.0",puppeteer:"^24.0.0",sinon:"^21.0.0","stream-browserify":"^3.0.0",tmp:"0.2.5","ts-loader":"^9.5.2",typescript:"5.8.3",webpack:"^5.97.1","webpack-cli":"^6.0.1"},dependencies:{extend:"^3.0.2","https-proxy-agent":"^7.0.1","node-fetch":"^3.3.2"},homepage:"https://github.com/googleapis/google-cloud-node-core/tree/main/packages/gaxios"}}});var require_util7=__commonJS({"node_modules/gaxios/build/cjs/src/util.cjs"(exports,module){"use strict";var pkg2=require_package();module.exports={pkg:pkg2}}});var require_common=__commonJS({"node_modules/gaxios/build/cjs/src/common.js"(exports){"use strict";var __importDefault=exports&&exports.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0});exports.GaxiosError=exports.GAXIOS_ERROR_SYMBOL=void 0;exports.defaultErrorRedactor=defaultErrorRedactor;var extend_1=__importDefault(require_extend()),util_cjs_1=__importDefault(require_util7()),pkg2=util_cjs_1.default.pkg;exports.GAXIOS_ERROR_SYMBOL=Symbol.for(`${pkg2.name}-gaxios-error`);var GaxiosError=class _GaxiosError extends Error{config;response;code;status;error;[exports.GAXIOS_ERROR_SYMBOL]=pkg2.version;static[Symbol.hasInstance](instance){return instance&&typeof instance=="object"&&exports.GAXIOS_ERROR_SYMBOL in instance&&instance[exports.GAXIOS_ERROR_SYMBOL]===pkg2.version?!0:Function.prototype[Symbol.hasInstance].call(_GaxiosError,instance)}constructor(message2,config,response,cause){if(super(message2,{cause}),this.config=config,this.response=response,this.error=cause instanceof Error?cause:void 0,this.config=(0,extend_1.default)(!0,{},config),this.response&&(this.response.config=(0,extend_1.default)(!0,{},this.response.config)),this.response){try{this.response.data=translateData(this.config.responseType,this.response?.bodyUsed?this.response?.data:void 0)}catch{}this.status=this.response.status}cause instanceof DOMException?this.code=cause.name:cause&&typeof cause=="object"&&"code"in cause&&(typeof cause.code=="string"||typeof cause.code=="number")&&(this.code=cause.code)}static extractAPIErrorFromResponse(res,defaultErrorMessage="The request failed"){let message2=defaultErrorMessage;if(typeof res.data=="string"&&(message2=res.data),res.data&&typeof res.data=="object"&&"error"in res.data&&res.data.error&&!res.ok){if(typeof res.data.error=="string")return{message:res.data.error,code:res.status,status:res.statusText};if(typeof res.data.error=="object"){message2="message"in res.data.error&&typeof res.data.error.message=="string"?res.data.error.message:message2;let status="status"in res.data.error&&typeof res.data.error.status=="string"?res.data.error.status:res.statusText,code="code"in res.data.error&&typeof res.data.error.code=="number"?res.data.error.code:res.status;if("errors"in res.data.error&&Array.isArray(res.data.error.errors)){let errorMessages=[];for(let e2 of res.data.error.errors)typeof e2=="object"&&"message"in e2&&typeof e2.message=="string"&&errorMessages.push(e2.message);return Object.assign({message:errorMessages.join(`
573
+ Check your ChatGPT usage: ${CHATGPT_USAGE_URL}`:errorMessage9,stream12.push({type:"error",reason:output.stopReason,error:output}),stream12.end()}})(),stream12},streamSimple4=(model,context,options)=>{getClientApiKey2(model.provider,options?.apiKey,options?.headers);let base={...buildBaseOptions(model,context,options,options?.apiKey),toolChoice:options?.toolChoice},clampedReasoning=options?.reasoning?clampThinkingLevel(model,options.reasoning):void 0;return stream5(model,context,{...base,reasoningEffort:clampedReasoning==="off"?void 0:clampedReasoning})}}});var openAIResponsesApi,init_openai_responses_lazy=__esm({"packages/ai/dist/api/openai-responses.lazy.js"(){init_lazy();openAIResponsesApi=()=>lazyApi(()=>Promise.resolve().then(()=>(init_openai_responses(),openai_responses_exports)))}});async function resolveValue(name,ctx,credential,signal){let fromCredential=credential?name===CLOUDFLARE_API_KEY?credential.key:credential.env?.[name]:void 0;if(fromCredential!==void 0)return fromCredential;signal.throwIfAborted();let value=await ctx.env(name);return signal.throwIfAborted(),value}async function resolveCloudflareEnv(kind,ctx,credential,signal){let apiKey=await resolveValue(CLOUDFLARE_API_KEY,ctx,credential,signal),accountId=await resolveValue(CLOUDFLARE_ACCOUNT_ID,ctx,credential,signal),gatewayId=kind==="ai-gateway"?await resolveValue(CLOUDFLARE_GATEWAY_ID,ctx,credential,signal):void 0;if(!(!apiKey||!accountId||kind==="ai-gateway"&&!gatewayId))return{apiKey,env:{CLOUDFLARE_ACCOUNT_ID:accountId,...gatewayId?{CLOUDFLARE_GATEWAY_ID:gatewayId}:{}},source:credential?"stored credential":CLOUDFLARE_API_KEY}}function cloudflareWorkersAIAuth(){return{name:"Cloudflare API key",login:async interaction=>{let key=await interaction.prompt({type:"secret",message:"Enter Cloudflare API key"}),accountId=await interaction.prompt({type:"text",message:"Enter Cloudflare account ID"});return{type:"api_key",key,env:{CLOUDFLARE_ACCOUNT_ID:accountId}}},resolve:async({ctx,credential,signal})=>{let resolved=await resolveCloudflareEnv("workers-ai",ctx,credential,signal);if(resolved)return{auth:{apiKey:resolved.apiKey},env:resolved.env,source:resolved.source}}}}function cloudflareAIGatewayAuth(){return{name:"Cloudflare API key",login:async interaction=>{let key=await interaction.prompt({type:"secret",message:"Enter Cloudflare API key"}),accountId=await interaction.prompt({type:"text",message:"Enter Cloudflare account ID"}),gatewayId=await interaction.prompt({type:"text",message:"Enter Cloudflare AI Gateway ID"});return{type:"api_key",key,env:{CLOUDFLARE_ACCOUNT_ID:accountId,CLOUDFLARE_GATEWAY_ID:gatewayId}}},resolve:async({ctx,credential,signal})=>{let resolved=await resolveCloudflareEnv("ai-gateway",ctx,credential,signal);if(resolved)return{auth:{headers:{"cf-aig-authorization":`Bearer ${resolved.apiKey}`,Authorization:null,"x-api-key":null}},env:resolved.env,source:resolved.source}}}}var CLOUDFLARE_API_KEY,CLOUDFLARE_ACCOUNT_ID,CLOUDFLARE_GATEWAY_ID,init_cloudflare_auth=__esm({"packages/ai/dist/providers/cloudflare-auth.js"(){CLOUDFLARE_API_KEY="CLOUDFLARE_API_KEY",CLOUDFLARE_ACCOUNT_ID="CLOUDFLARE_ACCOUNT_ID",CLOUDFLARE_GATEWAY_ID="CLOUDFLARE_GATEWAY_ID"}});function resolveCloudflareModel(model,env3){if(!env3)return model;let baseUrl=model.baseUrl.replaceAll(`{${CLOUDFLARE_ACCOUNT_ID2}}`,env3[CLOUDFLARE_ACCOUNT_ID2]??`{${CLOUDFLARE_ACCOUNT_ID2}}`).replaceAll(`{${CLOUDFLARE_GATEWAY_ID2}}`,env3[CLOUDFLARE_GATEWAY_ID2]??`{${CLOUDFLARE_GATEWAY_ID2}}`);return baseUrl===model.baseUrl?model:{...model,baseUrl}}function cloudflareStreams(streams){return{stream:(model,context,options)=>streams.stream(resolveCloudflareModel(model,options?.env),context,options),streamSimple:(model,context,options)=>streams.streamSimple(resolveCloudflareModel(model,options?.env),context,options)}}function cloudflareClassifier(classifier){return{classify:(model,context,options)=>classifier.classify(resolveCloudflareModel(model,options?.env),context,options)}}var CLOUDFLARE_ACCOUNT_ID2,CLOUDFLARE_GATEWAY_ID2,init_cloudflare_stream=__esm({"packages/ai/dist/providers/cloudflare-stream.js"(){CLOUDFLARE_ACCOUNT_ID2="CLOUDFLARE_ACCOUNT_ID",CLOUDFLARE_GATEWAY_ID2="CLOUDFLARE_GATEWAY_ID"}});function cloudflareAIGatewayProvider(){return createProvider({id:"cloudflare-ai-gateway",name:"Cloudflare AI Gateway",auth:{apiKey:cloudflareAIGatewayAuth()},models:Object.values(CLOUDFLARE_AI_GATEWAY_MODELS),api:{"anthropic-messages":cloudflareStreams(anthropicMessagesApi()),"openai-completions":cloudflareStreams(openAICompletionsApi()),"openai-responses":cloudflareStreams(openAIResponsesApi())}})}var init_cloudflare_ai_gateway2=__esm({"packages/ai/dist/providers/cloudflare-ai-gateway.js"(){init_anthropic_messages_lazy();init_openai_completions_lazy();init_openai_responses_lazy();init_models();init_cloudflare_ai_gateway_models();init_cloudflare_auth();init_cloudflare_stream()}});function httpError(label,response,body){let error=new Error(`${label} returned ${response.status}`);return error.status=response.status,error.headers=response.headers,error.body=body,error}function timeoutError(timeoutMs){let error=new Error(`Request timed out after ${timeoutMs}ms`);return error.name="TimeoutError",error.status=void 0,error.headers=void 0,error.body="",error}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function requiredNumber(label,value,field2){if(typeof value!="number"||!Number.isFinite(value))throw new Error(`${label} returned an invalid ${field2}`);return value}function probabilities(label,value,id){if(!isRecord(value))throw new Error(`${label} returned invalid probabilities for ${id}`);return Object.fromEntries(Object.entries(value).map(([key,probability])=>[key,requiredNumber(label,probability,`probability for ${id}.${key}`)]))}function parseAnswers(label,value,context){if(!isRecord(value))throw new Error(`${label} returned an unexpected response`);let answers=[];for(let[id,question]of Object.entries(context.questions)){let answer2=value[id];if(!isRecord(answer2))throw new Error(`${label} did not return an answer for ${id}`);if(question.type==="choice"){if(answer2.type!=="choice"||typeof answer2.choice!="string")throw new Error(`${label} did not return a choice answer for ${id}`);answers.push([id,{type:"choice",choice:answer2.choice,probabilities:probabilities(label,answer2.probabilities,id),confidence:requiredNumber(label,answer2.confidence,`confidence for ${id}`)}])}else if(question.type==="score"){if(answer2.type!=="score")throw new Error(`${label} did not return a score answer for ${id}`);answers.push([id,{type:"score",score:requiredNumber(label,answer2.score,`score for ${id}`),confidence:requiredNumber(label,answer2.confidence,`confidence for ${id}`)}])}else{if(answer2.type!=="noul")throw new Error(`${label} did not return a bool answer for ${id}`);answers.push([id,{type:"bool",probability:requiredNumber(label,answer2.noul,`probability for ${id}`)}])}}return Object.fromEntries(answers)}function tokenCount(value){return typeof value=="number"&&Number.isFinite(value)&&value>0?value:0}function parseUsage(value,model){if(!isRecord(value)||value.input_tokens===void 0&&value.output_tokens===void 0)return;let input2=tokenCount(value.input_tokens),output=tokenCount(value.output_tokens),usage={input:input2,output,cacheRead:0,cacheWrite:0,totalTokens:input2+output,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}};return calculateCost(model,usage),usage}function wireRequest(context){return{state:context.state,questions:Object.fromEntries(Object.entries(context.questions).map(([id,question])=>[id,question.type==="bool"?{...question,type:"noul"}:question]))}}function requestHeaders(model,apiKey,optionsHeaders){return providerHeadersToRecord({authorization:`Bearer ${apiKey}`,"content-type":"application/json"},model.headers,optionsHeaders)??{}}async function classifySystemOne(transport3,model,context,options){let output={api:model.api,provider:model.provider,model:model.id,answers:{},stopReason:"stop",timestamp:Date.now()};try{if(model.api!==transport3.api)throw new Error(`Unsupported classifier API: ${model.api}`);if(!options?.apiKey)throw new Error(`No API key for provider: ${model.provider}`);let apiKey=options.apiKey,payload=transport3.payload(model,wireRequest(context)),transformed=await options.onPayload?.(payload,model);transformed!==void 0&&(payload=transformed);let requestFetch=options.fetch??globalThis.fetch,{response,body}=await retryProviderRequest(async()=>{let timeoutSignal=options.timeoutMs!==void 0?AbortSignal.timeout(options.timeoutMs):void 0,signal=options.signal&&timeoutSignal?AbortSignal.any([options.signal,timeoutSignal]):options.signal??timeoutSignal;try{let next=await requestFetch(transport3.url(model),{method:"POST",headers:requestHeaders(model,apiKey,options.headers),body:JSON.stringify(payload),signal});if(!next.ok)throw httpError(transport3.label,next,await next.text());return{response:next,body:await next.json()}}catch(error){throw timeoutSignal?.aborted&&!options.signal?.aborted?timeoutError(options.timeoutMs):error}},{maxRetries:options.maxRetries??2,maxRetryDelayMs:options.maxRetryDelayMs,signal:options.signal});await options.onResponse?.({status:response.status,headers:headersToRecord(response.headers)},model);let result=transport3.output(body),usage=parseUsage(result.usage,model);return usage&&(output.usage=usage),output.answers=parseAnswers(transport3.label,result.answers,context),output}catch(error){return output.stopReason=options?.signal?.aborted?"aborted":"error",output.errorMessage=formatProviderError(normalizeProviderError(error),`${transport3.label} error`),output}}var init_system_one_shared=__esm({"packages/ai/dist/api/system-one-shared.js"(){init_models();init_error_body();init_headers2();init_provider_retry()}});var cloudflare_workers_ai_system_one_exports={};__export(cloudflare_workers_ai_system_one_exports,{classify:()=>classify});function cloudflareErrorMessage(errors){if(Array.isArray(errors)){let messages=errors.map(error=>isRecord(error)&&typeof error.message=="string"?error.message:void 0).filter(message2=>message2!==void 0);if(messages.length>0)return`${LABEL} error: ${messages.join("; ")}`}return`${LABEL} request failed`}var LABEL,transport,classify,init_cloudflare_workers_ai_system_one=__esm({"packages/ai/dist/api/cloudflare-workers-ai-system-one.js"(){init_system_one_shared();LABEL="Cloudflare Workers AI";transport={api:"cloudflare-workers-ai-system-one",label:LABEL,url:model=>new URL("run",`${model.baseUrl.replace(/\/+$/u,"")}/`),payload:(model,request)=>({model:model.id,input:request}),output:body=>{if(!isRecord(body))throw new Error(`${LABEL} returned an unexpected response`);if(body.success===!1)throw new Error(cloudflareErrorMessage(body.errors));let result=body.result;if(!isRecord(result))throw new Error(`${LABEL} returned an unexpected response`);if("answers"in result)return result;if(result.state!=="Completed")throw new Error(`${LABEL} run did not complete (state: ${String(result.state)})`);if(!isRecord(result.result))throw new Error(`${LABEL} returned an unexpected response`);return result.result}},classify=(model,context,options)=>classifySystemOne(transport,model,context,options)}});var cloudflareWorkersAISystemOneApi,init_cloudflare_workers_ai_system_one_lazy=__esm({"packages/ai/dist/api/cloudflare-workers-ai-system-one.lazy.js"(){cloudflareWorkersAISystemOneApi=()=>({classify:async(model,context,options)=>(await Promise.resolve().then(()=>(init_cloudflare_workers_ai_system_one(),cloudflare_workers_ai_system_one_exports))).classify(model,context,options)})}});function cloudflareWorkersAIProvider(){return createProvider({id:"cloudflare-workers-ai",name:"Cloudflare Workers AI",auth:{apiKey:cloudflareWorkersAIAuth()},models:[...Object.values(CLOUDFLARE_WORKERS_AI_MODELS),...Object.values(CLOUDFLARE_WORKERS_AI_CLASSIFIER_MODELS)],api:cloudflareStreams(openAICompletionsApi()),classifiers:{"cloudflare-workers-ai-system-one":cloudflareClassifier(cloudflareWorkersAISystemOneApi())}})}var init_cloudflare_workers_ai2=__esm({"packages/ai/dist/providers/cloudflare-workers-ai.js"(){init_cloudflare_workers_ai_system_one_lazy();init_openai_completions_lazy();init_models();init_cloudflare_auth();init_cloudflare_stream();init_cloudflare_workers_ai_models()}});var manifest_default,init_manifest=__esm({"packages/ai/dist/providers/data/.manifest.json"(){manifest_default={schemaVersion:6,generatedAt:"2026-10-04T13:46:41.019Z",structureHash:"c36423c1e750caaf9b45181ba43b7cdaafb7148cd795700a0362e6706d4b0716",files:{"amazon-bedrock.json":"a0256dd49b0b7f4fee8a2853aeaecc65e74f643e96348c5be55d2d912b82c6ce","ant-ling.json":"628feab3ef6c7d80ce96f75999804e1d9f05fec3851e5302e30fff3b69db90f6","anthropic.json":"3ff00b68990382e42626ebd1b65dcc28ae3cad9e6faa8920331ba92f067f1b3a","azure-openai-responses.json":"adeb2cf9d944d84f81b0d633c2e4e6bfa548a806c431902bd037c5f36500be21","baseten.json":"b04d1423d6958bec857ffccc36726f091ec1a8f3a09cf0836b64cc94b0ee697d","cerebras.json":"3eccb58c5de3d0dc7ba49dc6e477ba29f00cb3150ce0a35cc90d59e6b5ab368e","cloudflare-ai-gateway.json":"9030456decc3f3edacc3388165ab87cb3db0360f6b191f4a12e063f5c9464332","cloudflare-workers-ai.json":"d04336a61cacfd0cadbc2f3d30cd3b552e3d153e5a320658a31ba1bab8f01c83","deepseek.json":"10a296fb3e898f7715c80890c8af0af4f5fd58f22dbcd6612fdc5d762157ccdc","fireworks.json":"8db3c11f65a5d76260d5040a5dc5a9ef0f35b92de8505a30907c2355c2837b36","github-copilot.json":"573f05c2dfc0c8158e252dd286d6b174cd323f965284d7ae157439d8e3dea92c","google-vertex.json":"40090c680538bc867f2624d986a449f361be4dfa6ba96d7a27402050f036e009","google.json":"c0f5a633e5e5a5044432db3e537f4bc674d4de18df09325c6349547fcc13cabe","groq.json":"910952ad9dad07856983459d63fce0148dba1203edd7b10d801a77c5824f3405","huggingface.json":"1b8604bd31a5e05fe43a40ec1ec6dfc1a51a28b0b020151ef057fab43f57c923","kimi-coding.json":"582250b920454d98940da3e7e99d30b807edbea28f2eb8ac15f658d2ef41e8fc","meta.json":"0c7e9a370a7005c5a89dc94f0f93bc67b8935c3f802de324f11af6ff56fff429","minimax-cn.json":"f962c20ee6a6a342820f778e9dc363a18a524bf11998f6e2c57f2989915d62e5","minimax.json":"17a432f80d0ea6dd26eade80a4314250d3a855678601728a5f70dd8fa0d21dd2","mistral.json":"10f33bff9adf1248f7e6848e5890c265399f1f94e5b42cfdc28c109d547af98d","moonshotai-cn.json":"79c9585dc84ee525ebaebbc78b3c55f3d369ec884d4f943488f1e0b14e3587f5","moonshotai.json":"1da2c4e34f22aef17a07c974d85bdee8e1b68b6dc712e3769c935b3f1e7dadca","nvidia.json":"a75e963dc81779e3eec01c051b12277c15ec37c5b94ab51ece9e9ccb3b16407c","openai-codex.json":"3cc35a7e122e5c77ee8ec30a9a3bd8bd59629997e85ba2cb3f9e0ed62e9a09c0","openai.json":"87faafcdd168c9b6fdaef521137834a207437daf0d71641fd0a2f3dddf4d1ecb","opencode-go.json":"542a62ae86ec34d55b2927927a3fe007a54aab2729026e578d7ede1bab51e532","opencode.json":"7cf6c2e34b4defd50135572da48030402d33101bcb8c43c7612841e5b3afcd43","openrouter.json":"012139cfb2bb87cae1ddc076182d76b4baf995a5cbb17ad948f5593f16b6ca59","qwen-token-plan-cn.json":"2469a4091c474ec3db0a49a9962d8d2726c074ad9065b96bc4e0c87861c4c6c5","qwen-token-plan-individual.json":"0fb7cf64faf39d1a3b0a884210a86c87084b805eda15644f5f39293287b959dd","qwen-token-plan.json":"eff10620cb577142de4ec02698d5961a71fda2fe4f6ae7ea9432bad9d6844176","radius.json":"88a3f060a851882df89015bcd346e03238b4b0725bd72c8ad501fcffff782768","together.json":"52293df62191c8e799ae3632f8ab1b3f52ee626aee0280677086627b32864bf7","typesafe.json":"a4429a2f696d5cc5273969af61a7310bda07d6bdcd27bf9ac9c76c534cc43716","vercel-ai-gateway.json":"436f085bd5d972959f0b2b66e82f2af55843c8a40a70417328911cb1a5f32997","xai.json":"879c49b78b663a52a220ac4ee013e726b10c4f50aaa03bc58ee53a4b54c76928","xiaomi-token-plan-ams.json":"ca65178f4525d9705bc8d085ed136cecbe149c4080e857ea6a64ae643d2ac00a","xiaomi-token-plan-cn.json":"b065326926681c2262084e59c1c19ebdaf146c07107b5242c76b456becf74db0","xiaomi-token-plan-sgp.json":"92c3d6d707f81fd9cd2b6d1fb57dc431d90ba51e10fe49d97bc8806035c23492","xiaomi.json":"b81d01a374f7b558728c78d81f4168efa9c8996e6e2b5618409a8094b083c759","zai-coding-cn.json":"ee5ee705fb6e413a6088db5e3616c27fce802a8ece6c355f1db35490d787f610","zai.json":"58e6642fdfb736f0b9a4a277c760c536a3cea66a030abbfb2615f7b2851d5c6f"}}}});function deepseekProvider(){return createProvider({id:"deepseek",name:"DeepSeek",baseUrl:"https://api.deepseek.com",auth:{apiKey:envApiKeyAuth("DeepSeek API key",["DEEPSEEK_API_KEY"])},models:Object.values(DEEPSEEK_MODELS),api:openAICompletionsApi()})}var init_deepseek2=__esm({"packages/ai/dist/providers/deepseek.js"(){init_openai_completions_lazy();init_helpers2();init_models();init_deepseek_models()}});function fireworksProvider(){return createProvider({id:"fireworks",name:"Fireworks",baseUrl:"https://api.fireworks.ai/inference",auth:{apiKey:envApiKeyAuth("Fireworks API key",["FIREWORKS_API_KEY"])},models:Object.values(FIREWORKS_MODELS),api:{"anthropic-messages":anthropicMessagesApi(),"openai-completions":openAICompletionsApi()}})}var init_fireworks2=__esm({"packages/ai/dist/providers/fireworks.js"(){init_anthropic_messages_lazy();init_openai_completions_lazy();init_helpers2();init_models();init_fireworks_models()}});function githubCopilotProvider(){return createProvider({id:"github-copilot",name:"GitHub Copilot",baseUrl:"https://api.individual.githubcopilot.com",auth:{apiKey:envApiKeyAuth("GitHub Copilot token",["COPILOT_GITHUB_TOKEN"]),oauth:lazyOAuth({name:"GitHub Copilot",isSubscription:!0,load:loadGitHubCopilotOAuth})},models:Object.values(GITHUB_COPILOT_MODELS),filterModels:(models,credential)=>{if(credential?.type!=="oauth")return models;let availableModelIds=credential.availableModelIds;if(!Array.isArray(availableModelIds)||!availableModelIds.every(id=>typeof id=="string"))return models;let available=new Set(availableModelIds);return models.filter(model=>available.has(model.id))},api:{"anthropic-messages":anthropicMessagesApi(),"openai-completions":openAICompletionsApi(),"openai-responses":openAIResponsesApi()}})}var init_github_copilot2=__esm({"packages/ai/dist/providers/github-copilot.js"(){init_anthropic_messages_lazy();init_openai_completions_lazy();init_openai_responses_lazy();init_helpers2();init_load();init_models();init_github_copilot_models()}});var require_retry_operation2=__commonJS({"node_modules/retry/lib/retry_operation.js"(exports,module){function RetryOperation(timeouts,options){typeof options=="boolean"&&(options={forever:options}),this._originalTimeouts=JSON.parse(JSON.stringify(timeouts)),this._timeouts=timeouts,this._options=options||{},this._maxRetryTime=options&&options.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._timer=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}module.exports=RetryOperation;RetryOperation.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts.slice(0)};RetryOperation.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timer&&clearTimeout(this._timer),this._timeouts=[],this._cachedTimeouts=null};RetryOperation.prototype.retry=function(err2){if(this._timeout&&clearTimeout(this._timeout),!err2)return!1;var currentTime=new Date().getTime();if(err2&&currentTime-this._operationStart>=this._maxRetryTime)return this._errors.push(err2),this._errors.unshift(new Error("RetryOperation timeout occurred")),!1;this._errors.push(err2);var timeout=this._timeouts.shift();if(timeout===void 0)if(this._cachedTimeouts)this._errors.splice(0,this._errors.length-1),timeout=this._cachedTimeouts.slice(-1);else return!1;var self2=this;return this._timer=setTimeout(function(){self2._attempts++,self2._operationTimeoutCb&&(self2._timeout=setTimeout(function(){self2._operationTimeoutCb(self2._attempts)},self2._operationTimeout),self2._options.unref&&self2._timeout.unref()),self2._fn(self2._attempts)},timeout),this._options.unref&&this._timer.unref(),!0};RetryOperation.prototype.attempt=function(fn,timeoutOps){this._fn=fn,timeoutOps&&(timeoutOps.timeout&&(this._operationTimeout=timeoutOps.timeout),timeoutOps.cb&&(this._operationTimeoutCb=timeoutOps.cb));var self2=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){self2._operationTimeoutCb()},self2._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)};RetryOperation.prototype.try=function(fn){console.log("Using RetryOperation.try() is deprecated"),this.attempt(fn)};RetryOperation.prototype.start=function(fn){console.log("Using RetryOperation.start() is deprecated"),this.attempt(fn)};RetryOperation.prototype.start=RetryOperation.prototype.try;RetryOperation.prototype.errors=function(){return this._errors};RetryOperation.prototype.attempts=function(){return this._attempts};RetryOperation.prototype.mainError=function(){if(this._errors.length===0)return null;for(var counts={},mainError=null,mainErrorCount=0,i2=0;i2<this._errors.length;i2++){var error=this._errors[i2],message2=error.message,count=(counts[message2]||0)+1;counts[message2]=count,count>=mainErrorCount&&(mainError=error,mainErrorCount=count)}return mainError}}});var require_retry4=__commonJS({"node_modules/retry/lib/retry.js"(exports){var RetryOperation=require_retry_operation2();exports.operation=function(options){var timeouts=exports.timeouts(options);return new RetryOperation(timeouts,{forever:options&&(options.forever||options.retries===1/0),unref:options&&options.unref,maxRetryTime:options&&options.maxRetryTime})};exports.timeouts=function(options){if(options instanceof Array)return[].concat(options);var opts={retries:10,factor:2,minTimeout:1*1e3,maxTimeout:1/0,randomize:!1};for(var key in options)opts[key]=options[key];if(opts.minTimeout>opts.maxTimeout)throw new Error("minTimeout is greater than maxTimeout");for(var timeouts=[],i2=0;i2<opts.retries;i2++)timeouts.push(this.createTimeout(i2,opts));return options&&options.forever&&!timeouts.length&&timeouts.push(this.createTimeout(i2,opts)),timeouts.sort(function(a,b2){return a-b2}),timeouts};exports.createTimeout=function(attempt2,opts){var random=opts.randomize?Math.random()+1:1,timeout=Math.round(random*Math.max(opts.minTimeout,1)*Math.pow(opts.factor,attempt2));return timeout=Math.min(timeout,opts.maxTimeout),timeout};exports.wrap=function(obj,options,methods){if(options instanceof Array&&(methods=options,options=null),!methods){methods=[];for(var key in obj)typeof obj[key]=="function"&&methods.push(key)}for(var i2=0;i2<methods.length;i2++){var method=methods[i2],original=obj[method];obj[method]=function(original2){var op=exports.operation(options),args2=Array.prototype.slice.call(arguments,1),callback=args2.pop();args2.push(function(err2){op.retry(err2)||(err2&&(arguments[0]=op.mainError()),callback.apply(this,arguments))}),op.attempt(function(){original2.apply(obj,args2)})}.bind(obj,original),obj[method].options=options}}}});var require_retry5=__commonJS({"node_modules/retry/index.js"(exports,module){module.exports=require_retry4()}});var require_p_retry=__commonJS({"node_modules/p-retry/index.js"(exports,module){"use strict";var retry2=require_retry5(),networkErrorMsgs=["Failed to fetch","NetworkError when attempting to fetch resource.","The Internet connection appears to be offline.","Network request failed"],AbortError2=class extends Error{constructor(message2){super(),message2 instanceof Error?(this.originalError=message2,{message:message2}=message2):(this.originalError=new Error(message2),this.originalError.stack=this.stack),this.name="AbortError",this.message=message2}},decorateErrorWithCounts=(error,attemptNumber,options)=>{let retriesLeft=options.retries-(attemptNumber-1);return error.attemptNumber=attemptNumber,error.retriesLeft=retriesLeft,error},isNetworkError=errorMessage9=>networkErrorMsgs.includes(errorMessage9),pRetry2=(input2,options)=>new Promise((resolve26,reject)=>{options={onFailedAttempt:()=>{},retries:10,...options};let operation=retry2.operation(options);operation.attempt(async attemptNumber=>{try{resolve26(await input2(attemptNumber))}catch(error){if(!(error instanceof Error)){reject(new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`));return}if(error instanceof AbortError2)operation.stop(),reject(error.originalError);else if(error instanceof TypeError&&!isNetworkError(error.message))operation.stop(),reject(error);else{decorateErrorWithCounts(error,attemptNumber,options);try{await options.onFailedAttempt(error)}catch(error2){reject(error2);return}operation.retry(error)||reject(operation.mainError())}}})});module.exports=pRetry2;module.exports.default=pRetry2;module.exports.AbortError=AbortError2}});var require_extend=__commonJS({"node_modules/extend/index.js"(exports,module){"use strict";var hasOwn4=Object.prototype.hasOwnProperty,toStr=Object.prototype.toString,defineProperty=Object.defineProperty,gOPD=Object.getOwnPropertyDescriptor,isArray3=function(arr){return typeof Array.isArray=="function"?Array.isArray(arr):toStr.call(arr)==="[object Array]"},isPlainObject4=function(obj){if(!obj||toStr.call(obj)!=="[object Object]")return!1;var hasOwnConstructor=hasOwn4.call(obj,"constructor"),hasIsPrototypeOf=obj.constructor&&obj.constructor.prototype&&hasOwn4.call(obj.constructor.prototype,"isPrototypeOf");if(obj.constructor&&!hasOwnConstructor&&!hasIsPrototypeOf)return!1;var key;for(key in obj);return typeof key>"u"||hasOwn4.call(obj,key)},setProperty=function(target,options){defineProperty&&options.name==="__proto__"?defineProperty(target,options.name,{enumerable:!0,configurable:!0,value:options.newValue,writable:!0}):target[options.name]=options.newValue},getProperty=function(obj,name){if(name==="__proto__")if(hasOwn4.call(obj,name)){if(gOPD)return gOPD(obj,name).value}else return;return obj[name]};module.exports=function extend(){var options,name,src,copy,copyIsArray,clone2,target=arguments[0],i2=1,length=arguments.length,deep=!1;for(typeof target=="boolean"&&(deep=target,target=arguments[1]||{},i2=2),(target==null||typeof target!="object"&&typeof target!="function")&&(target={});i2<length;++i2)if(options=arguments[i2],options!=null)for(name in options)src=getProperty(target,name),copy=getProperty(options,name),target!==copy&&(deep&&copy&&(isPlainObject4(copy)||(copyIsArray=isArray3(copy)))?(copyIsArray?(copyIsArray=!1,clone2=src&&isArray3(src)?src:[]):clone2=src&&isPlainObject4(src)?src:{},setProperty(target,{name,newValue:extend(deep,clone2,copy)})):typeof copy<"u"&&setProperty(target,{name,newValue:copy}));return target}}});var require_package=__commonJS({"node_modules/gaxios/package.json"(exports,module){module.exports={name:"gaxios",version:"7.1.4",description:"A simple common HTTP client specifically for Google APIs and services.",main:"build/cjs/src/index.js",types:"build/cjs/src/index.d.ts",files:["build/"],exports:{".":{import:{types:"./build/esm/src/index.d.ts",default:"./build/esm/src/index.js"},require:{types:"./build/cjs/src/index.d.ts",default:"./build/cjs/src/index.js"}}},scripts:{lint:"gts check --no-inline-config",test:"c8 mocha build/esm/test","presystem-test":"npm run compile","system-test":"mocha build/esm/system-test --timeout 80000",compile:"tsc -b ./tsconfig.json ./tsconfig.cjs.json && node utils/enable-esm.mjs",fix:"gts fix",prepare:"npm run compile",pretest:"npm run compile",webpack:"webpack","prebrowser-test":"npm run compile","browser-test":"node build/browser-test/browser-test-runner.js",docs:"jsdoc -c .jsdoc.js","docs-test":"linkinator docs","predocs-test":"npm run docs","samples-test":"cd samples/ && npm link ../ && npm test && cd ../",prelint:"cd samples; npm link ../; npm install",clean:"gts clean"},repository:{type:"git",directory:"packages/gaxios",url:"https://github.com/googleapis/google-cloud-node-core.git"},keywords:["google"],engines:{node:">=18"},author:"Google, LLC",license:"Apache-2.0",devDependencies:{"@babel/plugin-proposal-private-methods":"^7.18.6","@types/cors":"^2.8.6","@types/express":"^5.0.0","@types/extend":"^3.0.1","@types/mocha":"^10.0.10","@types/multiparty":"4.2.1","@types/mv":"^2.1.0","@types/ncp":"^2.0.8","@types/node":"^22.13.1","@types/sinon":"^17.0.3","@types/tmp":"^0.2.6",assert:"^2.0.0",browserify:"^17.0.0",c8:"^10.1.3",cors:"^2.8.5",express:"^5.0.0",gts:"^6.0.2","is-docker":"^3.0.0",jsdoc:"^4.0.4","jsdoc-fresh":"^5.0.0","jsdoc-region-tag":"^4.0.0",karma:"^6.0.0","karma-chrome-launcher":"^3.0.0","karma-coverage":"^2.0.0","karma-firefox-launcher":"^2.0.0","karma-mocha":"^2.0.0","karma-remap-coverage":"^0.1.5","karma-sourcemap-loader":"^0.4.0","karma-webpack":"^5.0.1",linkinator:"^6.1.2",mocha:"^11.1.0",multiparty:"^4.2.1",mv:"^2.1.1",ncp:"^2.0.0",nock:"^14.0.5","null-loader":"^4.0.1","pack-n-play":"^4.0.0",puppeteer:"^24.0.0",sinon:"^21.0.0","stream-browserify":"^3.0.0",tmp:"0.2.5","ts-loader":"^9.5.2",typescript:"5.8.3",webpack:"^5.97.1","webpack-cli":"^6.0.1"},dependencies:{extend:"^3.0.2","https-proxy-agent":"^7.0.1","node-fetch":"^3.3.2"},homepage:"https://github.com/googleapis/google-cloud-node-core/tree/main/packages/gaxios"}}});var require_util7=__commonJS({"node_modules/gaxios/build/cjs/src/util.cjs"(exports,module){"use strict";var pkg2=require_package();module.exports={pkg:pkg2}}});var require_common=__commonJS({"node_modules/gaxios/build/cjs/src/common.js"(exports){"use strict";var __importDefault=exports&&exports.__importDefault||function(mod){return mod&&mod.__esModule?mod:{default:mod}};Object.defineProperty(exports,"__esModule",{value:!0});exports.GaxiosError=exports.GAXIOS_ERROR_SYMBOL=void 0;exports.defaultErrorRedactor=defaultErrorRedactor;var extend_1=__importDefault(require_extend()),util_cjs_1=__importDefault(require_util7()),pkg2=util_cjs_1.default.pkg;exports.GAXIOS_ERROR_SYMBOL=Symbol.for(`${pkg2.name}-gaxios-error`);var GaxiosError=class _GaxiosError extends Error{config;response;code;status;error;[exports.GAXIOS_ERROR_SYMBOL]=pkg2.version;static[Symbol.hasInstance](instance){return instance&&typeof instance=="object"&&exports.GAXIOS_ERROR_SYMBOL in instance&&instance[exports.GAXIOS_ERROR_SYMBOL]===pkg2.version?!0:Function.prototype[Symbol.hasInstance].call(_GaxiosError,instance)}constructor(message2,config,response,cause){if(super(message2,{cause}),this.config=config,this.response=response,this.error=cause instanceof Error?cause:void 0,this.config=(0,extend_1.default)(!0,{},config),this.response&&(this.response.config=(0,extend_1.default)(!0,{},this.response.config)),this.response){try{this.response.data=translateData(this.config.responseType,this.response?.bodyUsed?this.response?.data:void 0)}catch{}this.status=this.response.status}cause instanceof DOMException?this.code=cause.name:cause&&typeof cause=="object"&&"code"in cause&&(typeof cause.code=="string"||typeof cause.code=="number")&&(this.code=cause.code)}static extractAPIErrorFromResponse(res,defaultErrorMessage="The request failed"){let message2=defaultErrorMessage;if(typeof res.data=="string"&&(message2=res.data),res.data&&typeof res.data=="object"&&"error"in res.data&&res.data.error&&!res.ok){if(typeof res.data.error=="string")return{message:res.data.error,code:res.status,status:res.statusText};if(typeof res.data.error=="object"){message2="message"in res.data.error&&typeof res.data.error.message=="string"?res.data.error.message:message2;let status="status"in res.data.error&&typeof res.data.error.status=="string"?res.data.error.status:res.statusText,code="code"in res.data.error&&typeof res.data.error.code=="number"?res.data.error.code:res.status;if("errors"in res.data.error&&Array.isArray(res.data.error.errors)){let errorMessages=[];for(let e2 of res.data.error.errors)typeof e2=="object"&&"message"in e2&&typeof e2.message=="string"&&errorMessages.push(e2.message);return Object.assign({message:errorMessages.join(`
574
574
  `)||message2,code,status},res.data.error)}return Object.assign({message:message2,code,status},res.data.error)}}return{message:message2,code:res.status,status:res.statusText}}};exports.GaxiosError=GaxiosError;function translateData(responseType,data){switch(responseType){case"stream":return data;case"json":return JSON.parse(JSON.stringify(data));case"arraybuffer":return JSON.parse(Buffer.from(data).toString("utf8"));case"blob":return JSON.parse(data.text());default:return data}}function defaultErrorRedactor(data){let REDACT="<<REDACTED> - See `errorRedactor` option in `gaxios` for configuration>.";function redactHeaders(headers){headers&&headers.forEach((_2,key)=>{(/^authentication$/i.test(key)||/^authorization$/i.test(key)||/secret/i.test(key))&&headers.set(key,REDACT)})}function redactString(obj,key){if(typeof obj=="object"&&obj!==null&&typeof obj[key]=="string"){let text=obj[key];(/grant_type=/i.test(text)||/assertion=/i.test(text)||/secret/i.test(text))&&(obj[key]=REDACT)}}function redactObject(obj){!obj||typeof obj!="object"||(obj instanceof FormData||obj instanceof URLSearchParams||"forEach"in obj&&"set"in obj?obj.forEach((_2,key)=>{(["grant_type","assertion"].includes(key)||/secret/.test(key))&&obj.set(key,REDACT)}):("grant_type"in obj&&(obj.grant_type=REDACT),"assertion"in obj&&(obj.assertion=REDACT),"client_secret"in obj&&(obj.client_secret=REDACT)))}return data.config&&(redactHeaders(data.config.headers),redactString(data.config,"data"),redactObject(data.config.data),redactString(data.config,"body"),redactObject(data.config.body),data.config.url.searchParams.has("token")&&data.config.url.searchParams.set("token",REDACT),data.config.url.searchParams.has("client_secret")&&data.config.url.searchParams.set("client_secret",REDACT)),data.response&&(defaultErrorRedactor({config:data.response.config}),redactHeaders(data.response.headers),data.response.bodyUsed&&(redactString(data.response,"data"),redactObject(data.response.data))),data}}});var require_retry6=__commonJS({"node_modules/gaxios/build/cjs/src/retry.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.getRetryConfig=getRetryConfig;async function getRetryConfig(err2){let config=getConfig(err2);if(!err2||!err2.config||!config&&!err2.config.retry)return{shouldRetry:!1};config=config||{},config.currentRetryAttempt=config.currentRetryAttempt||0,config.retry=config.retry===void 0||config.retry===null?3:config.retry,config.httpMethodsToRetry=config.httpMethodsToRetry||["GET","HEAD","PUT","OPTIONS","DELETE"],config.noResponseRetries=config.noResponseRetries===void 0||config.noResponseRetries===null?2:config.noResponseRetries,config.retryDelayMultiplier=config.retryDelayMultiplier?config.retryDelayMultiplier:2,config.timeOfFirstRequest=config.timeOfFirstRequest?config.timeOfFirstRequest:Date.now(),config.totalTimeout=config.totalTimeout?config.totalTimeout:Number.MAX_SAFE_INTEGER,config.maxRetryDelay=config.maxRetryDelay?config.maxRetryDelay:Number.MAX_SAFE_INTEGER;let retryRanges=[[100,199],[408,408],[429,429],[500,599]];if(config.statusCodesToRetry=config.statusCodesToRetry||retryRanges,err2.config.retryConfig=config,!await(config.shouldRetry||shouldRetryRequest)(err2))return{shouldRetry:!1,config:err2.config};let delay4=getNextRetryDelay(config);err2.config.retryConfig.currentRetryAttempt+=1;let backoff3=config.retryBackoff?config.retryBackoff(err2,delay4):new Promise(resolve26=>{setTimeout(resolve26,delay4)});return config.onRetryAttempt&&await config.onRetryAttempt(err2),await backoff3,{shouldRetry:!0,config:err2.config}}function shouldRetryRequest(err2){let config=getConfig(err2);if(err2.config.signal?.aborted&&err2.code!=="TimeoutError"||err2.code==="AbortError"||!config||config.retry===0||!err2.response&&(config.currentRetryAttempt||0)>=config.noResponseRetries||!config.httpMethodsToRetry||!config.httpMethodsToRetry.includes(err2.config.method?.toUpperCase()||"GET"))return!1;if(err2.response&&err2.response.status){let isInRange2=!1;for(let[min,max]of config.statusCodesToRetry){let status=err2.response.status;if(status>=min&&status<=max){isInRange2=!0;break}}if(!isInRange2)return!1}return config.currentRetryAttempt=config.currentRetryAttempt||0,!(config.currentRetryAttempt>=config.retry)}function getConfig(err2){if(err2&&err2.config&&err2.config.retryConfig)return err2.config.retryConfig}function getNextRetryDelay(config){let calculatedDelay=(config.currentRetryAttempt?0:config.retryDelay??100)+(Math.pow(config.retryDelayMultiplier,config.currentRetryAttempt)-1)/2*1e3,maxAllowableDelay=config.totalTimeout-(Date.now()-config.timeOfFirstRequest);return Math.min(calculatedDelay,maxAllowableDelay,config.maxRetryDelay)}}});var require_interceptor=__commonJS({"node_modules/gaxios/build/cjs/src/interceptor.js"(exports){"use strict";Object.defineProperty(exports,"__esModule",{value:!0});exports.GaxiosInterceptorManager=void 0;var GaxiosInterceptorManager=class extends Set{};exports.GaxiosInterceptorManager=GaxiosInterceptorManager}});var require_ms=__commonJS({"node_modules/ms/index.js"(exports,module){var s2=1e3,m3=s2*60,h2=m3*60,d=h2*24,w=d*7,y2=d*365.25;module.exports=function(val,options){options=options||{};var type=typeof val;if(type==="string"&&val.length>0)return parse3(val);if(type==="number"&&isFinite(val))return options.long?fmtLong(val):fmtShort(val);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(val))};function parse3(str2){if(str2=String(str2),!(str2.length>100)){var match3=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str2);if(match3){var n=parseFloat(match3[1]),type=(match3[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n*y2;case"weeks":case"week":case"w":return n*w;case"days":case"day":case"d":return n*d;case"hours":case"hour":case"hrs":case"hr":case"h":return n*h2;case"minutes":case"minute":case"mins":case"min":case"m":return n*m3;case"seconds":case"second":case"secs":case"sec":case"s":return n*s2;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function fmtShort(ms){var msAbs=Math.abs(ms);return msAbs>=d?Math.round(ms/d)+"d":msAbs>=h2?Math.round(ms/h2)+"h":msAbs>=m3?Math.round(ms/m3)+"m":msAbs>=s2?Math.round(ms/s2)+"s":ms+"ms"}function fmtLong(ms){var msAbs=Math.abs(ms);return msAbs>=d?plural(ms,msAbs,d,"day"):msAbs>=h2?plural(ms,msAbs,h2,"hour"):msAbs>=m3?plural(ms,msAbs,m3,"minute"):msAbs>=s2?plural(ms,msAbs,s2,"second"):ms+" ms"}function plural(ms,msAbs,n,name){var isPlural=msAbs>=n*1.5;return Math.round(ms/n)+" "+name+(isPlural?"s":"")}}});var require_common2=__commonJS({"node_modules/debug/src/common.js"(exports,module){function setup(env3){createDebug.debug=createDebug,createDebug.default=createDebug,createDebug.coerce=coerce,createDebug.disable=disable,createDebug.enable=enable,createDebug.enabled=enabled,createDebug.humanize=require_ms(),createDebug.destroy=destroy,Object.keys(env3).forEach(key=>{createDebug[key]=env3[key]}),createDebug.names=[],createDebug.skips=[],createDebug.formatters={};function selectColor(namespace){let hash2=0;for(let i2=0;i2<namespace.length;i2++)hash2=(hash2<<5)-hash2+namespace.charCodeAt(i2),hash2|=0;return createDebug.colors[Math.abs(hash2)%createDebug.colors.length]}createDebug.selectColor=selectColor;function createDebug(namespace){let prevTime,enableOverride=null,namespacesCache,enabledCache;function debug2(...args2){if(!debug2.enabled)return;let self2=debug2,curr=Number(new Date),ms=curr-(prevTime||curr);self2.diff=ms,self2.prev=prevTime,self2.curr=curr,prevTime=curr,args2[0]=createDebug.coerce(args2[0]),typeof args2[0]!="string"&&args2.unshift("%O");let index3=0;args2[0]=args2[0].replace(/%([a-zA-Z%])/g,(match3,format)=>{if(match3==="%%")return"%";index3++;let formatter=createDebug.formatters[format];if(typeof formatter=="function"){let val=args2[index3];match3=formatter.call(self2,val),args2.splice(index3,1),index3--}return match3}),createDebug.formatArgs.call(self2,args2),(self2.log||createDebug.log).apply(self2,args2)}return debug2.namespace=namespace,debug2.useColors=createDebug.useColors(),debug2.color=createDebug.selectColor(namespace),debug2.extend=extend,debug2.destroy=createDebug.destroy,Object.defineProperty(debug2,"enabled",{enumerable:!0,configurable:!1,get:()=>enableOverride!==null?enableOverride:(namespacesCache!==createDebug.namespaces&&(namespacesCache=createDebug.namespaces,enabledCache=createDebug.enabled(namespace)),enabledCache),set:v2=>{enableOverride=v2}}),typeof createDebug.init=="function"&&createDebug.init(debug2),debug2}function extend(namespace,delimiter3){let newDebug=createDebug(this.namespace+(typeof delimiter3>"u"?":":delimiter3)+namespace);return newDebug.log=this.log,newDebug}function enable(namespaces){createDebug.save(namespaces),createDebug.namespaces=namespaces,createDebug.names=[],createDebug.skips=[];let split=(typeof namespaces=="string"?namespaces:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let ns of split)ns[0]==="-"?createDebug.skips.push(ns.slice(1)):createDebug.names.push(ns)}function matchesTemplate(search,template){let searchIndex=0,templateIndex=0,starIndex=-1,matchIndex=0;for(;searchIndex<search.length;)if(templateIndex<template.length&&(template[templateIndex]===search[searchIndex]||template[templateIndex]==="*"))template[templateIndex]==="*"?(starIndex=templateIndex,matchIndex=searchIndex,templateIndex++):(searchIndex++,templateIndex++);else if(starIndex!==-1)templateIndex=starIndex+1,matchIndex++,searchIndex=matchIndex;else return!1;for(;templateIndex<template.length&&template[templateIndex]==="*";)templateIndex++;return templateIndex===template.length}function disable(){let namespaces=[...createDebug.names,...createDebug.skips.map(namespace=>"-"+namespace)].join(",");return createDebug.enable(""),namespaces}function enabled(name){for(let skip of createDebug.skips)if(matchesTemplate(name,skip))return!1;for(let ns of createDebug.names)if(matchesTemplate(name,ns))return!0;return!1}function coerce(val){return val instanceof Error?val.stack||val.message:val}function destroy(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return createDebug.enable(createDebug.load()),createDebug}module.exports=setup}});var require_browser=__commonJS({"node_modules/debug/src/browser.js"(exports,module){exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.storage=localstorage();exports.destroy=(()=>{let warned=!1;return()=>{warned||(warned=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();exports.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function useColors(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let m3;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(m3=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(m3[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function formatArgs(args2){if(args2[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+args2[0]+(this.useColors?"%c ":" ")+"+"+module.exports.humanize(this.diff),!this.useColors)return;let c2="color: "+this.color;args2.splice(1,0,c2,"color: inherit");let index3=0,lastC=0;args2[0].replace(/%[a-zA-Z%]/g,match3=>{match3!=="%%"&&(index3++,match3==="%c"&&(lastC=index3))}),args2.splice(lastC,0,c2)}exports.log=console.debug||console.log||(()=>{});function save(namespaces){try{namespaces?exports.storage.setItem("debug",namespaces):exports.storage.removeItem("debug")}catch{}}function load(){let r2;try{r2=exports.storage.getItem("debug")||exports.storage.getItem("DEBUG")}catch{}return!r2&&typeof process<"u"&&"env"in process&&(r2=process.env.DEBUG),r2}function localstorage(){try{return localStorage}catch{}}module.exports=require_common2()(exports);var{formatters:formatters3}=module.exports;formatters3.j=function(v2){try{return JSON.stringify(v2)}catch(error){return"[UnexpectedJSONParseError]: "+error.message}}}});var require_node=__commonJS({"node_modules/debug/src/node.js"(exports,module){var tty2=__require("tty"),util2=__require("util");exports.init=init;exports.log=log;exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.destroy=util2.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");exports.colors=[6,2,3,4,5,1];try{let supportsColor2=__require("supports-color");supportsColor2&&(supportsColor2.stderr||supportsColor2).level>=2&&(exports.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}exports.inspectOpts=Object.keys(process.env).filter(key=>/^debug_/i.test(key)).reduce((obj,key)=>{let prop=key.substring(6).toLowerCase().replace(/_([a-z])/g,(_2,k2)=>k2.toUpperCase()),val=process.env[key];return/^(yes|on|true|enabled)$/i.test(val)?val=!0:/^(no|off|false|disabled)$/i.test(val)?val=!1:val==="null"?val=null:val=Number(val),obj[prop]=val,obj},{});function useColors(){return"colors"in exports.inspectOpts?!!exports.inspectOpts.colors:tty2.isatty(process.stderr.fd)}function formatArgs(args2){let{namespace:name,useColors:useColors2}=this;if(useColors2){let c2=this.color,colorCode="\x1B[3"+(c2<8?c2:"8;5;"+c2),prefix=` ${colorCode};1m${name} \x1B[0m`;args2[0]=prefix+args2[0].split(`
575
575
  `).join(`
576
576
  `+prefix),args2.push(colorCode+"m+"+module.exports.humanize(this.diff)+"\x1B[0m")}else args2[0]=getDate()+name+" "+args2[0]}function getDate(){return exports.inspectOpts.hideDate?"":new Date().toISOString()+" "}function log(...args2){return process.stderr.write(util2.formatWithOptions(exports.inspectOpts,...args2)+`
@@ -2316,9 +2316,9 @@ Options:
2316
2316
  `));if(command.kind!=="check"){let signal=AbortSignal.timeout(15e3),modelRuntime=await ModelRuntime.create({allowModelNetwork:!1,signal}),credential2=await resolveCredentialForPrint(parsed,modelRuntime,command.kind,command.minExpiryMs,signal);return process.stdout.write(`${credential2}
2317
2317
  `),!0}let requestedAuth=validateAuthCommandArgs(parsed,command.kind),result,credential;try{let credentials=command.noRefresh?new ReadOnlyAuthStorage:AuthStorage.create(),modelRuntime=await createAuthCheckModelRuntime(credentials);result=await checkProviderAuth(parsed,modelRuntime,{refresh:!command.noRefresh}),command.credentials&&result.status==="ready"&&(credential=await getProviderCredential(result.provider,modelRuntime,credentials,{refresh:!command.noRefresh}),credential||(result={status:"not_ready",provider:result.provider,reason:"credential_not_available"}))}catch{result={status:"invalid",provider:requestedAuth.provider??requestedAuth.model,reason:"invalid_state"}}let output=command.json?JSON.stringify({...result,...credential?{credentials:credential}:{}}):credential??result.status;process.stdout.write(`${output}
2318
2318
  `),process.exitCode=result.status==="ready"?0:result.status==="not_ready"?1:2}catch(error){let message2=error instanceof AuthCommandError?error.message:"Failed to resolve credential";console.error(source_default.red(`Error: ${message2}`)),process.exitCode=command.kind==="check"?2:1}return!0}async function prepareInitialMessage(parsed,stdinContent){if(parsed.fileArgs.length===0)return buildInitialMessage({parsed,stdinContent});let{text,images}=await processFileArguments(parsed.fileArgs,{autoResizeImages:!1});return buildInitialMessage({parsed,fileText:text,fileImages:images,stdinContent})}function findLocalSessionByExactId(sessionId,cwd,sessionDir){let path28=SessionManager.findById(cwd,sessionId,sessionDir);return path28?{type:"local",path:path28}:void 0}async function resolveSessionPath(sessionArg,cwd,sessionDir){if(sessionArg.includes("/")||sessionArg.includes("\\")||sessionArg.endsWith(".jsonl"))return{type:"path",path:resolvePath(sessionArg,cwd)};let exactLocalMatch=findLocalSessionByExactId(sessionArg,cwd,sessionDir);if(exactLocalMatch)return exactLocalMatch;let localMatch=(await SessionManager.list(cwd,sessionDir)).find(s2=>s2.id.startsWith(sessionArg));if(localMatch)return{type:"local",path:localMatch.path};let allSessions=await SessionManager.listAll(sessionDir),globalMatch=allSessions.find(s2=>s2.id===sessionArg)??allSessions.find(s2=>s2.id.startsWith(sessionArg));return globalMatch?{type:"global",path:globalMatch.path,cwd:globalMatch.cwd}:{type:"not_found",arg:sessionArg}}async function promptConfirm(message2){return new Promise(resolve26=>{let rl=createInterface6({input:process.stdin,output:process.stdout});rl.question(`${message2} [y/N] `,answer2=>{rl.close(),resolve26(answer2.toLowerCase()==="y"||answer2.toLowerCase()==="yes")})})}function validateForkFlags(parsed){if(!parsed.fork)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0,parsed.noSession?"--no-session":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1))}function validateSessionIdFlags(parsed){if(parsed.sessionId===void 0)return;let conflictingFlags=[parsed.session?"--session":void 0,parsed.continue?"--continue":void 0,parsed.resume?"--resume":void 0].filter(flag=>flag!==void 0);conflictingFlags.length>0&&(console.error(source_default.red(`Error: --session-id cannot be combined with ${conflictingFlags.join(", ")}`)),process.exit(1));try{assertValidSessionId(parsed.sessionId)}catch(error){let message2=error instanceof Error?error.message:String(error);console.error(source_default.red(`Error: ${message2}`)),process.exit(1)}}function openSessionOrExit(path28,sessionDir){try{return SessionManager.open(path28,sessionDir)}catch(error){let message2=error instanceof Error?error.message:String(error);console.error(source_default.red(`Error: ${message2}`)),process.exit(1)}}function forkSessionOrExit(sourcePath,cwd,sessionDir,sessionId){try{return SessionManager.forkFrom(sourcePath,cwd,sessionDir,{id:sessionId})}catch(error){let message2=error instanceof Error?error.message:String(error);console.error(source_default.red(`Error: ${message2}`)),process.exit(1)}}async function createSessionManager(parsed,cwd,sessionDir,settingsManager){if(parsed.noSession||parsed.help||parsed.listModels!==void 0)return SessionManager.inMemory(cwd,parsed.sessionId!==void 0?{id:parsed.sessionId}:void 0);if(parsed.fork){parsed.sessionId&&findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir)&&(console.error(source_default.red(`Session already exists with id '${parsed.sessionId}'`)),process.exit(1));let resolved=await resolveSessionPath(parsed.fork,cwd,sessionDir);switch(resolved.type){case"path":case"local":case"global":return forkSessionOrExit(resolved.path,cwd,sessionDir,parsed.sessionId);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.session){let resolved=await resolveSessionPath(parsed.session,cwd,sessionDir);switch(resolved.type){case"path":case"local":return openSessionOrExit(resolved.path,sessionDir);case"global":return console.log(source_default.yellow(`Session found in different project: ${resolved.cwd}`)),await promptConfirm("Fork this session into current directory?")||(console.log(source_default.dim("Aborted.")),process.exit(0)),forkSessionOrExit(resolved.path,cwd,sessionDir);case"not_found":console.error(source_default.red(`No session found matching '${resolved.arg}'`)),process.exit(1)}}if(parsed.resume)try{let selectedPath=await selectSession((onProgress,signal)=>SessionManager.list(cwd,sessionDir,onProgress,signal),(onProgress,signal)=>SessionManager.listAll(sessionDir,onProgress,signal),settingsManager);return selectedPath||(console.log(source_default.dim("No session selected")),process.exit(0)),SessionManager.open(selectedPath,sessionDir)}finally{stopThemeWatcher()}if(parsed.continue)return SessionManager.continueRecent(cwd,sessionDir);if(parsed.sessionId){let existingSession=findLocalSessionByExactId(parsed.sessionId,cwd,sessionDir);if(existingSession)return SessionManager.open(existingSession.path,sessionDir);console.error(source_default.yellow(`Warning: No project session found with id '${parsed.sessionId}'; creating a new session with that id.`))}return SessionManager.create(cwd,sessionDir,{id:parsed.sessionId})}function buildSessionOptions(parsed,scopedModels,hasExistingSession,modelRuntime,settingsManager){let options={},diagnostics=[],cliThinkingFromModel=!1;if(parsed.provider&&!parsed.model&&diagnostics.push({type:"error",message:`--provider requires --model (for example: --provider ${parsed.provider} --model <pattern>)`}),parsed.model){let resolved=resolveCliModel2({cliProvider:parsed.provider,cliModel:parsed.model,cliThinking:parsed.thinking,modelRuntime});resolved.warning&&diagnostics.push({type:"warning",message:resolved.warning}),resolved.error&&diagnostics.push({type:"error",message:resolved.error}),resolved.model&&(options.model=resolved.model,!parsed.thinking&&resolved.thinkingLevel&&(options.thinkingLevel=resolved.thinkingLevel,cliThinkingFromModel=!0))}if(!options.model&&scopedModels.length>0&&!hasExistingSession){let savedProvider=settingsManager.getDefaultProvider(),savedModelId=settingsManager.getDefaultModel(),savedModel=savedProvider&&savedModelId?modelRuntime.getModel(savedProvider,savedModelId):void 0,savedInScope=savedModel?scopedModels.find(sm=>modelsAreEqual(sm.model,savedModel)):void 0;savedInScope?(options.model=savedInScope.model,!parsed.thinking&&savedInScope.thinkingLevel&&(options.thinkingLevel=savedInScope.thinkingLevel)):(options.model=scopedModels[0].model,!parsed.thinking&&scopedModels[0].thinkingLevel&&(options.thinkingLevel=scopedModels[0].thinkingLevel))}return parsed.thinking&&(options.thinkingLevel=parsed.thinking),scopedModels.length>0&&(options.scopedModels=scopedModels.map(sm=>({model:sm.model,thinkingLevel:sm.thinkingLevel}))),parsed.noTools?options.noTools="all":parsed.noBuiltinTools&&(options.noTools="builtin"),parsed.tools&&(options.tools=[...parsed.tools]),parsed.excludeTools&&(options.excludeTools=[...parsed.excludeTools]),{options,cliThinkingFromModel,diagnostics}}function resolveCliPaths(cwd,paths){return paths?.map(value=>isLocalPath(value)?resolvePath(value,cwd):value)}async function promptForMissingSessionCwd(issue,settingsManager){return showStartupSelector(settingsManager,formatMissingSessionCwdPrompt(issue),[{label:"Continue",value:issue.fallbackCwd},{label:"Cancel",value:void 0}])}async function main2(args2,options){resetTimings();let extensionFactories=[...builtInExtensions,...options?.extensionFactories??[]],offlineMode=args2.includes("--offline")||isTruthyEnvFlag2(process.env.PI_OFFLINE);if(offlineMode&&(process.env.PI_OFFLINE="1",process.env.PI_SKIP_VERSION_CHECK="1"),await runAuthCommand(args2))return;process.platform==="win32"&&cleanupWindowsSelfUpdateQuarantine(getPackageDir()),cleanupManagedInstall();let cwd=process.cwd(),agentDir=getAgentDir(),bootstrapSettingsManager=SettingsManager.create(cwd,agentDir,{projectTrusted:!1});if(applyHttpProxySettings(bootstrapSettingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(),await handlePackageCommand(args2,{extensionFactories})){let exitCode=process.exitCode??0;if(process.platform==="win32"&&exitCode===0&&args2[0]==="update")return;process.exit(exitCode);return}if(await handleConfigCommand(args2,{extensionFactories}))return;if(args2[0]==="mcp"){let{runMcpCommand:runMcpCommand2}=await loadMcpCommand();process.exitCode=await runMcpCommand2(args2.slice(1),{cwd,agentDir});return}let parsed=parseArgs(args2);if(parsed.diagnostics.length>0){for(let d of parsed.diagnostics){let color=d.type==="error"?source_default.red:source_default.yellow;console.error(color(`${d.type==="error"?"Error":"Warning"}: ${d.message}`))}parsed.diagnostics.some(d=>d.type==="error")&&process.exit(1)}if(time("parseArgs"),parsed.version&&(console.log(VERSION),process.exit(0)),parsed.export){let result;try{let outputPath=parsed.messages.length>0?parsed.messages[0]:void 0;result=await exportFromFile(parsed.export,outputPath)}catch(error){let message2=error instanceof Error?error.message:"Failed to export session";console.error(source_default.red(`Error: ${message2}`)),process.exit(1)}console.log(`Exported to: ${result}`),process.exit(0)}let appMode=resolveAppMode(parsed,process.stdin.isTTY,process.stdout.isTTY);appMode!=="interactive"&&!isPlainRuntimeMetadataCommand(parsed)&&takeOverStdout(),parsed.mode==="rpc"&&parsed.fileArgs.length>0&&(console.error(source_default.red("Error: @file arguments are not supported in RPC mode")),process.exit(1)),validateForkFlags(parsed),validateSessionIdFlags(parsed);let{migratedAuthProviders:migratedProviders,deprecationWarnings}=runMigrations(cwd);time("runMigrations");let startupSettingsManager=SettingsManager.create(cwd,agentDir),startupSettingsDiagnostics=collectSettingsDiagnostics(startupSettingsManager);appMode==="interactive"&&!parsed.help&&parsed.listModels===void 0&&shouldRunFirstTimeSetup()&&(await showFirstTimeSetup(startupSettingsManager),time("firstTimeSetup")),appMode==="interactive"&&parsed.useTheme!==void 0&&startupSettingsManager.applyOverrides({theme:parsed.useTheme});let envSessionDir=process.env[ENV_SESSION_DIR],sessionDir=(parsed.sessionDir?normalizePath(parsed.sessionDir):void 0)??(envSessionDir?expandTildePath(envSessionDir):void 0)??startupSettingsManager.getSessionDir(),sessionManager=await createSessionManager(parsed,cwd,sessionDir,startupSettingsManager),missingSessionCwdIssue=getMissingSessionCwdIssue(sessionManager,cwd);if(missingSessionCwdIssue)if(appMode==="interactive"){let selectedCwd=await promptForMissingSessionCwd(missingSessionCwdIssue,startupSettingsManager);selectedCwd||process.exit(0),sessionManager=SessionManager.open(missingSessionCwdIssue.sessionFile,sessionDir,selectedCwd)}else console.error(source_default.red(new MissingSessionCwdError(missingSessionCwdIssue).message)),process.exit(1);if(parsed.name!==void 0){let name=normalizeSessionName(parsed.name);name===void 0&&(console.error(source_default.red("Error: --name requires a non-empty value")),process.exit(1)),sessionManager.appendSessionInfo(name)}time("createSessionManager");let trustStore=new ProjectTrustStore(agentDir),sessionCwd=sessionManager.getCwd(),autoTrustOnReloadCwd=parsed.projectTrustOverride===void 0&&!hasTrustRequiringProjectResources(sessionCwd)?sessionCwd:void 0,trustPromptMode=parsed.help||parsed.listModels!==void 0?"print":appMode,projectTrustByCwd=new Map,resolvedExtensionPaths=resolveCliPaths(cwd,parsed.extensions),resolvedSkillPaths=resolveCliPaths(cwd,parsed.skills),resolvedPromptTemplatePaths=resolveCliPaths(cwd,parsed.promptTemplates),resolvedThemePaths=resolveCliPaths(cwd,parsed.themes),createRuntime=async({cwd:cwd2,agentDir:agentDir2,sessionManager:sessionManager2,sessionStartEvent,projectTrustContext})=>{let isInitialRuntime=sessionStartEvent===void 0,projectTrustDiagnostics=[],cachedProjectTrust=projectTrustByCwd.get(cwd2),hasTrustRequiringResources=hasTrustRequiringProjectResources(cwd2),shouldResolveProjectTrust=parsed.projectTrustOverride===void 0&&cachedProjectTrust===void 0&&hasTrustRequiringResources,projectTrusted=shouldResolveProjectTrust?!1:cachedProjectTrust??parsed.projectTrustOverride??(!hasTrustRequiringResources||trustStore.get(cwd2)===!0),runtimeSettingsManager=SettingsManager.create(cwd2,agentDir2,{projectTrusted}),services2=await createAgentSessionServices({cwd:cwd2,agentDir:agentDir2,settingsManager:runtimeSettingsManager,modelRuntimeSignal:AbortSignal.timeout(15e3),extensionFlagValues:parsed.unknownFlags,resourceLoaderReloadOptions:shouldResolveProjectTrust?{resolveProjectTrust:async({extensionsResult})=>{let trusted=await resolveProjectTrusted({cwd:cwd2,trustStore,trustOverride:parsed.projectTrustOverride,defaultProjectTrust:startupSettingsManager.getDefaultProjectTrust(),extensionsResult,projectTrustContext:projectTrustContext??createProjectTrustContext({cwd:cwd2,mode:isInitialRuntime?trustPromptMode:appMode,settingsManager:startupSettingsManager,hasUI:isInitialRuntime&&trustPromptMode==="interactive"}),onExtensionError:message2=>projectTrustDiagnostics.push({type:"warning",message:message2})});return projectTrustByCwd.set(cwd2,trusted),trusted}}:void 0,resourceLoaderOptions:{additionalExtensionPaths:resolvedExtensionPaths,additionalSkillPaths:resolvedSkillPaths,additionalPromptTemplatePaths:resolvedPromptTemplatePaths,additionalThemePaths:resolvedThemePaths,noExtensions:parsed.noExtensions,noSkills:parsed.noSkills,noPromptTemplates:parsed.noPromptTemplates,noThemes:parsed.noThemes,noContextFiles:parsed.noContextFiles,systemPrompt:parsed.systemPrompt,appendSystemPrompt:parsed.appendSystemPrompt,extensionFactories}}),{settingsManager:settingsManager2,modelRuntime:modelRuntime2,resourceLoader:resourceLoader2}=services2,diagnostics=[...projectTrustDiagnostics,...services2.diagnostics,...collectSettingsDiagnostics(settingsManager2),...resourceLoader2.getExtensions().errors.map(({path:path28,error})=>({type:"error",message:`Failed to load extension "${path28}": ${error}`})),...(resourceLoader2.getExtensions().warnings??[]).map(({path:path28,warning})=>({type:"warning",message:`Extension package "${path28}": ${warning}`}))],modelPatterns=parsed.models??settingsManager2.getEnabledModels(),scopedModels=modelPatterns&&modelPatterns.length>0?await resolveModelScope(modelPatterns,modelRuntime2,{signal:AbortSignal.timeout(15e3)}):[],{options:sessionOptions,cliThinkingFromModel,diagnostics:sessionOptionDiagnostics}=buildSessionOptions(parsed,scopedModels,sessionManager2.buildSessionContext().messages.length>0,modelRuntime2,settingsManager2);diagnostics.push(...sessionOptionDiagnostics),parsed.apiKey&&(sessionOptions.model?await modelRuntime2.setRuntimeApiKey(sessionOptions.model.provider,parsed.apiKey):diagnostics.push({type:"error",message:"--api-key requires a model to be specified via --model, --provider/--model, or --models"}));let created=await createAgentSessionFromServices({services:services2,sessionManager:sessionManager2,sessionStartEvent,model:sessionOptions.model,thinkingLevel:sessionOptions.thinkingLevel,scopedModels:sessionOptions.scopedModels,tools:sessionOptions.tools,excludeTools:sessionOptions.excludeTools,noTools:sessionOptions.noTools,customTools:sessionOptions.customTools}),cliThinkingOverride=parsed.thinking!==void 0||cliThinkingFromModel;return created.session.model&&cliThinkingOverride&&created.session.setThinkingLevel(created.session.thinkingLevel),{...created,services:services2,diagnostics}};time("createRuntime");let runtime=await createAgentSessionRuntime(createRuntime,{cwd:sessionManager.getCwd(),agentDir,sessionManager});time("createAgentSessionRuntime");let{services,session,modelFallbackMessage}=runtime,{settingsManager,modelRuntime,resourceLoader}=services;if(setCapabilityOverrides(settingsManager.getTerminalCapabilityOverrides()),applyHttpProxySettings(settingsManager.getGlobalSettings().httpProxy),configureHttpDispatcher(settingsManager.getHttpIdleTimeoutMs()),parsed.help){reportDiagnostics(startupSettingsDiagnostics);let extensionFlags=resourceLoader.getExtensions().extensions.flatMap(extension2=>Array.from(extension2.flags.values()));printHelp2(extensionFlags),process.exit(0)}if(parsed.listModels!==void 0){reportDiagnostics(startupSettingsDiagnostics);let searchPattern=typeof parsed.listModels=="string"?parsed.listModels:void 0;await listModels(modelRuntime,searchPattern,AbortSignal.timeout(15e3)),process.exit(0)}let stdinContent;appMode!=="rpc"&&(stdinContent=await readPipedStdin(),stdinContent!==void 0&&appMode==="interactive"&&(appMode="print")),time("readPipedStdin");let{initialMessage,initialImages}=await prepareInitialMessage(parsed,stdinContent);time("prepareInitialMessage"),setThemeJsonValidator(validateThemeJson),initTheme(settingsManager.getTheme(),appMode==="interactive"),time("initTheme"),appMode==="interactive"&&deprecationWarnings.length>0&&await showDeprecationWarnings(deprecationWarnings),time("resolveModelScope");let startupDiagnostics=deduplicateDiagnostics([...startupSettingsDiagnostics,...runtime.diagnostics]),hasRuntimeErrors=runtime.diagnostics.some(diagnostic=>diagnostic.type==="error");(appMode!=="interactive"||hasRuntimeErrors)&&reportDiagnostics(startupDiagnostics),hasRuntimeErrors&&(runtime.diagnostics.some(diagnostic=>diagnostic.message.includes("Failed to load extension"))&&console.error(source_default.yellow(EXTENSION_LOAD_FAILURE_HINT)),process.exit(1)),time("createAgentSession"),appMode!=="interactive"&&!session.model&&(console.error(source_default.red(formatNoModelsAvailableMessage())),process.exit(1));let startupBenchmark=isTruthyEnvFlag2(process.env.PI_STARTUP_BENCHMARK);if(startupBenchmark&&appMode!=="interactive"&&(console.error(source_default.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode")),process.exit(1)),!offlineMode&&appMode==="rpc"){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),15e3);modelRuntime.refresh({signal:controller.signal}).catch(()=>{}).finally(()=>clearTimeout(timeout))}if(appMode==="rpc")printTimings(),await runRpcMode(runtime);else if(appMode==="interactive"){let interactiveMode=new InteractiveMode(runtime,{migratedProviders,startupDiagnostics,modelFallbackMessage,autoTrustOnReloadCwd,initialMessage,initialImages,initialMessages:parsed.messages,verbose:parsed.verbose,tuiMode:parsed.tuiMode,initialThemeSetting:parsed.useTheme});if(startupBenchmark){await interactiveMode.init(),time("interactiveMode.init"),await new Promise(resolve26=>setTimeout(resolve26,150)),interactiveMode.stop(),stopThemeWatcher(),printTimings(),process.stdout.writableLength>0&&await new Promise(resolve26=>process.stdout.once("drain",resolve26)),process.stderr.writableLength>0&&await new Promise(resolve26=>process.stderr.once("drain",resolve26));return}printTimings(),await interactiveMode.run()}else{printTimings();let exitCode=await runPrintMode(runtime,{mode:toPrintOutputMode(appMode),messages:parsed.messages,initialMessage,initialImages});stopThemeWatcher(),restoreStdout(),exitCode!==0&&(process.exitCode=exitCode);return}}var EXTENSION_LOAD_FAILURE_HINT,init_main=__esm({"packages/coding-agent/dist/main.js"(){init_dist();init_dist2();init_source();init_args2();init_auth_check();init_auth_command();init_credential_print();init_file_processor();init_initial_message();init_list_models();init_project_trust();init_session_picker();init_startup_ui();init_config2();init_agent_session_runtime();init_agent_session_services();init_auth_guidance2();init_auth_storage();init_export_html();init_http_dispatcher();init_model_resolver2();init_model_runtime();init_output_guard();init_project_trust2();init_session_cwd();init_session_manager();init_settings_diagnostics();init_settings_manager2();init_timings();init_trust_manager();init_extensions2();init_cli_lazy();init_migrations();init_modes();init_theme();init_theme_json();init_package_manager_cli();init_paths();init_windows_self_update();EXTENSION_LOAD_FAILURE_HINT=`Hint: Start without extensions using "${APP_NAME2} -ne".`}});import fs16 from"node:fs";import os9 from"node:os";import path20 from"node:path";function shouldLog(level){return LEVEL_PRIORITY[level]>=LEVEL_PRIORITY[currentLevel]}function ensureLogDir(){fs16.existsSync(LOG_DIR)||fs16.mkdirSync(LOG_DIR,{recursive:!0})}function logFilePath(){let date=new Date().toISOString().slice(0,10);return path20.join(LOG_DIR,`pi-hub-${date}.log`)}function formatLine(level,message2){return`[${new Date().toISOString()}] [${level}] ${message2}
2319
- `}function write(level,message2,err2){if(!shouldLog(level))return;ensureLogDir();let line=formatLine(level,message2);err2 instanceof Error?line+=formatLine(level,err2.stack||err2.message):err2!==void 0&&(line+=formatLine(level,String(err2)));try{fs16.appendFileSync(logFilePath(),line,"utf-8")}catch{}}function warn(message2,err2){write("WARN",message2,err2)}function info(message2){write("INFO",message2)}function debug(message2){write("DEBUG",message2)}var LOG_DIR,LEVEL_PRIORITY,currentLevel,init_logger=__esm({"packages/hub/dist/logger.js"(){LOG_DIR=path20.join(process.env.PI_HUB_DIR||path20.join(os9.homedir(),".pi","pi-hub"),"logs"),LEVEL_PRIORITY={DEBUG:0,INFO:1,WARN:2,ERROR:3},currentLevel="INFO"}});import fs17 from"node:fs";import os10 from"node:os";import path21 from"node:path";function ensureFile(filePath,defaultContent){fs17.existsSync(filePath)||(debug(`ensureFile: creating ${filePath}`),fs17.mkdirSync(path21.dirname(filePath),{recursive:!0}),fs17.writeFileSync(filePath,defaultContent,"utf-8"))}function readJson(filePath){debug(`readJson: ${filePath}`);let lastErr;for(let attempt2=1;attempt2<=4;attempt2++)try{return JSON.parse(fs17.readFileSync(filePath,"utf-8"))}catch(err2){lastErr=err2,attempt2<4&&sleepSync(25)}throw lastErr}function writeJson(filePath,data,mode){debug(`writeJson: ${filePath}`),fs17.mkdirSync(path21.dirname(filePath),{recursive:!0});let tmpPath=`${filePath}.tmp-${process.pid}`;try{fs17.writeFileSync(tmpPath,JSON.stringify(data,null,2)+`
2319
+ `}function write(level,message2,err2){if(!shouldLog(level))return;ensureLogDir();let line=formatLine(level,message2);err2 instanceof Error?line+=formatLine(level,err2.stack||err2.message):err2!==void 0&&(line+=formatLine(level,String(err2)));try{fs16.appendFileSync(logFilePath(),line,"utf-8")}catch{}}function warn(message2,err2){write("WARN",message2,err2)}function info(message2){write("INFO",message2)}function debug(message2){write("DEBUG",message2)}var LOG_DIR,LEVEL_PRIORITY,currentLevel,init_logger=__esm({"packages/hub/dist/logger.js"(){LOG_DIR=path20.join(process.env.PI_HUB_DIR||path20.join(os9.homedir(),".pi","pi-hub"),"logs"),LEVEL_PRIORITY={DEBUG:0,INFO:1,WARN:2,ERROR:3},currentLevel="INFO"}});import fs17 from"node:fs";import os10 from"node:os";import path21 from"node:path";function ensureFile(filePath,defaultContent){fs17.existsSync(filePath)||(debug(`ensureFile: creating ${filePath}`),fs17.mkdirSync(path21.dirname(filePath),{recursive:!0}),fs17.writeFileSync(filePath,defaultContent,"utf-8"))}function readJson(filePath){debug(`readJson: ${filePath}`);let lastErr;for(let attempt2=1;attempt2<=4;attempt2++)try{return JSON.parse(fs17.readFileSync(filePath,"utf-8"))}catch(err2){lastErr=err2,attempt2<4&&sleepSync(25)}throw lastErr}function writeJson(filePath,data,mode){debug(`writeJson: ${filePath}`),fs17.mkdirSync(path21.dirname(filePath),{recursive:!0});let tmpPath=`${filePath}.tmp-${process.pid}`;try{fs17.writeFileSync(tmpPath,`${JSON.stringify(data,null,2)}
2320
2320
  `,{mode}),fs17.renameSync(tmpPath,filePath)}catch(err2){throw fs17.rmSync(tmpPath,{force:!0}),err2}mode!==void 0&&fs17.chmodSync(filePath,mode)}function sleepSync(ms){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,ms)}function ensureProfilesFile(){ensureFile(PROFILES_FILE,`{"profiles":{}}
2321
- `)}var PI_DIR,PROFILES_FILE,AGENT_DIR,PI_HUB_DIR,PROFILE_DIRS_DIR,AGENT_SETTINGS_FILE,AGENT_AUTH_FILE,PI_SETTINGS_FILE,init_config5=__esm({"packages/hub/dist/config.js"(){init_logger();PI_DIR=process.env.PI_HUB_PI_DIR||path21.join(os10.homedir(),".pi"),PROFILES_FILE=process.env.PI_HUB_PROFILES_FILE||path21.join(PI_DIR,"profiles.json"),AGENT_DIR=process.env.PI_CODING_AGENT_DIR||path21.join(PI_DIR,"agent"),PI_HUB_DIR=process.env.PI_HUB_DIR||path21.join(PI_DIR,"pi-hub"),PROFILE_DIRS_DIR=path21.join(PI_HUB_DIR,"profiles"),AGENT_SETTINGS_FILE=path21.join(AGENT_DIR,"settings.json"),AGENT_AUTH_FILE=path21.join(AGENT_DIR,"auth.json"),PI_SETTINGS_FILE=path21.join(PI_DIR,"settings.json")}});var PROFILE_SETTINGS_KEYS2,PI_PROVIDERS,THINKING_LEVELS3,init_types10=__esm({"packages/hub/dist/types.js"(){PROFILE_SETTINGS_KEYS2=["defaultProvider","defaultModel","defaultThinkingLevel"],PI_PROVIDERS=["anthropic","ant-ling","azure-openai-responses","openai","deepseek","nvidia","google","amazon-bedrock","mistral","groq","cerebras","cloudflare-ai-gateway","cloudflare-workers-ai","xai","openrouter","vercel-ai-gateway","zai","zai-coding-cn","opencode","opencode-go","radius","huggingface","fireworks","together","baseten","kimi-coding","minimax","minimax-cn","qwen-token-plan","qwen-token-plan-intl","qwen-token-plan-individual","qwen-token-plan-cn","xiaomi","xiaomi-cn","xiaomi-token-plan-cn","xiaomi-token-plan-ams","xiaomi-token-plan-sgp","moonshotai","moonshotai-cn"],THINKING_LEVELS3=["off","minimal","low","medium","high","xhigh","max"]}});import fs18 from"node:fs";import path22 from"node:path";function profileDirFor(name){return path22.join(PROFILE_DIRS_DIR,name)}function readSourceSettings(){return fs18.existsSync(AGENT_SETTINGS_FILE)?readJson(AGENT_SETTINGS_FILE):{}}function resolveEffectiveProvider(profile,settings2){if(profile.provider)return profile.provider;let first=(profile.models||(profile.model?[profile.model]:[]))[0];return first?.includes("/")?first.split("/")[0]:settings2.defaultProvider}function writeAuthFile(dir,profile){let file=path22.join(dir,"auth.json");if(!profile.token)return;let provider=resolveEffectiveProvider(profile,readSourceSettings());if(!provider){console.error("Warning: profile has a token but no provider could be determined (no -p flag, no provider/model id, no defaultProvider in agent settings). auth.json was not written; pi will not find this token.");return}let auth=fs18.existsSync(file)?readJson(file):{};auth[provider]={type:"api_key",key:profile.token},writeJson(file,auth,384),debug(`writeAuthFile: wrote ${file}`)}function writeSettingsFile(dir,profile){let profileSettingsFile=path22.join(dir,"settings.json");if(fs18.existsSync(profileSettingsFile)&&path22.resolve(AGENT_DIR)===path22.resolve(dir)){let existingNested;try{existingNested=readJson(profileSettingsFile)}catch(err2){warn(`writeSettingsFile: could not read existing ${profileSettingsFile}, regenerating`,err2),existingNested={}}applyProfileOverrides(existingNested,profile),writeJson(profileSettingsFile,existingNested),debug(`writeSettingsFile: rewrote nested profile copy ${profileSettingsFile}`);return}let source=readSourceSettings(),existing={};if(fs18.existsSync(profileSettingsFile))try{existing=readJson(profileSettingsFile)}catch(err2){warn(`writeSettingsFile: could not read existing ${profileSettingsFile}, regenerating`,err2)}let sourceDirty=!1;for(let[key,value]of Object.entries(existing))PROFILE_SETTINGS_KEYS2.includes(key)||value===void 0||profile.settings&&key in profile.settings||source[key]===void 0&&(source[key]=value,sourceDirty=!0,debug(`writeSettingsFile: migrated general key "${key}" into ${AGENT_SETTINGS_FILE}`));sourceDirty&&(writeJson(AGENT_SETTINGS_FILE,source),debug(`writeSettingsFile: pruned general keys from the profile copy, migrated into ${AGENT_SETTINGS_FILE}`));let settings2={};for(let key of PROFILE_SETTINGS_KEYS2)existing[key]!==void 0&&(settings2[key]=existing[key]);if(source.skills===void 0&&settings2.skills===void 0&&fs18.existsSync(PI_SETTINGS_FILE)){let outer=readJson(PI_SETTINGS_FILE);outer.skills!==void 0&&(settings2.skills=outer.skills)}applyProfileOverrides(settings2,profile),writeJson(profileSettingsFile,settings2),debug(`writeSettingsFile: wrote ${profileSettingsFile}`)}function applyProfileOverrides(settings2,profile){if(profile.settings)for(let[key,value]of Object.entries(profile.settings))value===null?delete settings2[key]:settings2[key]=value;let models=profile.models||(profile.model?[profile.model]:[]),defaultModel=profile.model&&models.includes(profile.model)?profile.model:models[0];profile.provider&&(settings2.defaultProvider=profile.provider),defaultModel&&(settings2.defaultModel=defaultModel),profile.thinking&&(settings2.defaultThinkingLevel=profile.thinking),profile.settings?.enabledModels===void 0&&(models.length>1?settings2.enabledModels=[...models]:delete settings2.enabledModels)}function writeModelsFile(dir,profile){let file=path22.join(dir,"models.json");if(!profile.url){fs18.rmSync(file,{force:!0});return}let provider=resolveEffectiveProvider(profile,readSourceSettings());if(!provider){console.error("Warning: profile has a url but no provider could be determined (no -p flag, no provider/model id, no defaultProvider in agent settings). models.json baseUrl override was not written.");return}let data={providers:{[provider]:{baseUrl:profile.url}}};writeJson(file,data),debug(`writeModelsFile: wrote ${file}`)}function removeStaleLink(linkPath2){try{let stat6=fs18.lstatSync(linkPath2);stat6.isSymbolicLink()||stat6.isFile()?fs18.rmSync(linkPath2,{force:!0}):stat6.isDirectory()&&(info(`refreshSharedLinks: replacing copied dir with link: ${linkPath2}`),fs18.rmSync(linkPath2,{recursive:!0,force:!0}))}catch{}}function linkOrCopy(target,linkPath2,isDir){if(removeStaleLink(linkPath2),!!fs18.existsSync(target))try{fs18.symlinkSync(target,linkPath2,isDir?"junction":"file")}catch(err2){warn(`Symlink failed for ${target}, falling back to copy`,err2),isDir?fs18.cpSync(target,linkPath2,{recursive:!0}):fs18.copyFileSync(target,linkPath2)}}function refreshSharedLinks(dir){if(path22.resolve(AGENT_DIR)!==path22.resolve(dir)){for(let name of SHARED_DIR_LINKS)linkOrCopy(path22.join(AGENT_DIR,name),path22.join(dir,name),!0);for(let name of SHARED_FILE_LINKS)linkOrCopy(path22.join(AGENT_DIR,name),path22.join(dir,name),!1)}}function packagesOf(settings2){return settings2?.packages??null}function syncProfilePackagesToSource(profileDir){let profileSettingsPath=path22.join(profileDir,"settings.json");if(!fs18.existsSync(profileSettingsPath)||!fs18.existsSync(AGENT_SETTINGS_FILE))return!1;let profileSettings,sourceSettings;try{profileSettings=readJson(profileSettingsPath),sourceSettings=readJson(AGENT_SETTINGS_FILE)}catch(err2){return warn("syncProfilePackagesToSource: could not read settings, skipping sync",err2),!1}return JSON.stringify(packagesOf(profileSettings))===JSON.stringify(packagesOf(sourceSettings))?!1:(profileSettings.packages===void 0?delete sourceSettings.packages:sourceSettings.packages=profileSettings.packages,writeJson(AGENT_SETTINGS_FILE,sourceSettings),debug(`syncProfilePackagesToSource: synced packages from ${profileSettingsPath} to ${AGENT_SETTINGS_FILE}`),!0)}function adoptDivergedPackages(dir){let profileSettingsPath=path22.join(dir,"settings.json"),snapshotPath=path22.join(dir,PACKAGES_SNAPSHOT_FILE);if(!fs18.existsSync(profileSettingsPath)||!fs18.existsSync(snapshotPath))return;let profileSettings,snapshot;try{profileSettings=readJson(profileSettingsPath),snapshot=readJson(snapshotPath)}catch(err2){warn("adoptDivergedPackages: could not read settings/snapshot, skipping adoption",err2);return}JSON.stringify(packagesOf(profileSettings))!==JSON.stringify(snapshot.packages??null)&&(info("adoptDivergedPackages: profile packages diverged from snapshot, adopting into source"),syncProfilePackagesToSource(dir))}function writePackagesSnapshot(dir){let profileSettingsPath=path22.join(dir,"settings.json"),packages=null;try{fs18.existsSync(profileSettingsPath)&&(packages=packagesOf(readJson(profileSettingsPath)))}catch(err2){warn(`writePackagesSnapshot: could not read ${profileSettingsPath}, snapshot not updated`,err2);return}writeJson(path22.join(dir,PACKAGES_SNAPSHOT_FILE),{packages})}function materializeProfile(name,profile){let dir=profileDirFor(name);return fs18.mkdirSync(dir,{recursive:!0}),adoptDivergedPackages(dir),writeAuthFile(dir,profile),writeSettingsFile(dir,profile),writeModelsFile(dir,profile),refreshSharedLinks(dir),writePackagesSnapshot(dir),dir}function removeProfileDir(name){let dir=profileDirFor(name);fs18.existsSync(dir)&&(fs18.rmSync(dir,{recursive:!0,force:!0}),debug(`removeProfileDir: removed ${dir}`))}var SHARED_DIR_LINKS,SHARED_FILE_LINKS,PACKAGES_SNAPSHOT_FILE,init_materializer=__esm({"packages/hub/dist/materializer.js"(){init_config5();init_logger();init_types10();SHARED_DIR_LINKS=["extensions","skills","npm","sessions"],SHARED_FILE_LINKS=["AGENTS.md","models-store.json"],PACKAGES_SNAPSHOT_FILE="packages.snapshot.json"}});import fs19 from"node:fs";function maskToken(token){return token?token.length<=12?token:token.slice(0,8)+"..."+token.slice(-4):"(unset)"}function formatModels(p){let models=p.models||(p.model?[p.model]:[]);if(models.length===0)return"(unset)";let joined=models.join(", ");return joined.length>28?models[0]+", +"+(models.length-1)+" more":joined}function validateThinking(thinking){if(thinking&&!THINKING_LEVELS3.includes(thinking))throw new Error(`Invalid thinking level '${thinking}'. Valid levels: ${THINKING_LEVELS3.join(", ")}.`)}function parseSetValue(raw){try{return JSON.parse(raw)}catch{return raw}}function applySetOption(p,kv){let idx=kv.indexOf("=");if(idx===-1)throw new Error(`Error: --set expects key=value, got '${kv}'.`);let key=kv.slice(0,idx).trim();if(!key)throw new Error(`Error: --set expects a non-empty key, got '${kv}'.`);p.settings=p.settings||{},p.settings[key]=parseSetValue(kv.slice(idx+1))}function applyUnsetOption(p,key){p.settings&&(delete p.settings[key],Object.keys(p.settings).length===0&&delete p.settings)}function loadProfiles(){return ensureProfilesFile(),readJson(PROFILES_FILE)}function saveProfiles(data){writeJson(PROFILES_FILE,data,384),fs19.chmodSync(PROFILES_FILE,384)}function findProfile(name){return loadProfiles().profiles[name]}function getDefaultProfileName(){let def=loadProfiles().default;if(!(!def||def===LEGACY_BUILT_IN_DEFAULT))return def}function setDefaultProfile(name){let data=loadProfiles();if(!data.profiles[name])throw new Error(`Profile '${name}' not found.`);data.default=name,saveProfiles(data),debug(`setDefaultProfile: wrote ${PROFILES_FILE}`)}function clearDefaultProfile(){let data=loadProfiles();delete data.default,saveProfiles(data),debug(`clearDefaultProfile: wrote ${PROFILES_FILE}`)}function addProfile(name,profile){let data=loadProfiles();data.profiles[name]=profile,saveProfiles(data),debug(`addProfile: wrote ${PROFILES_FILE}`)}function updateProfile(name,profile){let data=loadProfiles();if(!data.profiles[name])throw new Error(`Profile '${name}' not found. Use 'profile add' to create it.`);data.profiles[name]=profile,saveProfiles(data),debug(`updateProfile: wrote ${PROFILES_FILE}`)}function removeProfile(name){let data=loadProfiles();if(!data.profiles[name])throw new Error(`Profile '${name}' not found.`);delete data.profiles[name],data.default===name&&delete data.default,saveProfiles(data),debug(`removeProfile: wrote ${PROFILES_FILE}`)}function renameProfile(oldName,newName){let data=loadProfiles();if(!data.profiles[oldName])throw new Error(`Profile '${oldName}' not found.`);if(data.profiles[newName])throw new Error(`Profile '${newName}' already exists. Choose a different name.`);data.profiles[newName]=data.profiles[oldName],delete data.profiles[oldName],data.default===oldName&&(data.default=newName),saveProfiles(data)}function mergeModelsUpdate(current,provided){let messages=[];if(provided.length===1){let modelToSet=provided[0],existingIndex=current.indexOf(modelToSet);return existingIndex!==-1?(current.splice(existingIndex,1),current.unshift(modelToSet),messages.push(`Selected existing model '${modelToSet}' (position ${existingIndex+1} -> 1).`)):(current.unshift(modelToSet),messages.push(`Added and selected new model '${modelToSet}'.`)),{models:current,messages}}return{models:provided,messages}}var LEGACY_BUILT_IN_DEFAULT,init_profiles=__esm({"packages/hub/dist/profiles.js"(){init_config5();init_logger();init_types10();LEGACY_BUILT_IN_DEFAULT="__builtin__"}});import fs20 from"node:fs";function parseSubcommandArgv(argv){let values=new Map,flags=new Set,positionals=[],i2=0;for(;i2<argv.length;){let arg=argv[i2];if(arg==="--"){positionals.push(...argv.slice(i2+1));break}let eq=arg.indexOf("="),name=eq!==-1?arg.slice(0,eq):arg,inlineValue=eq!==-1?arg.slice(eq+1):void 0,valueName=VALUE_OPTIONS.get(name);if(valueName){let value=inlineValue;if(value===void 0&&(value=argv[i2+1],i2++),value===void 0)throw new Error(`Error: ${name} expects a value.`);let list2=values.get(valueName)||[];list2.push(value),values.set(valueName,list2)}else if(FLAG_OPTIONS.has(name))flags.add(FLAG_OPTIONS.get(name));else{if(name.startsWith("-")&&name!=="-")throw new Error(`Error: unknown option '${name}'.`);positionals.push(arg)}i2++}return{values,flags,positionals}}function getValues(parsed,name){let list2=parsed.values.get(name);return list2&&list2.length>0?list2:void 0}function warnUnknownProvider(provider){provider&&!PI_PROVIDERS.includes(provider)&&console.error(`Warning: '${provider}' is not a known pi provider id. Continuing anyway.`)}function warnMissingProvider(p){(p.token||p.url)&&!p.provider&&console.error("Warning: no provider set (-p). At run time the token/url will be keyed under your default pi provider (or the provider/model id prefix), which may not be what you intend.")}function applyProfileOptions(p,parsed){let token=getValues(parsed,"token")?.[0],url=getValues(parsed,"url")?.[0],provider=getValues(parsed,"provider")?.[0],thinking=getValues(parsed,"thinking")?.[0];token&&(p.token=token),url&&(p.url=url),provider&&(warnUnknownProvider(provider),p.provider=provider),thinking&&(validateThinking(thinking),p.thinking=thinking);for(let kv of getValues(parsed,"set")||[])applySetOption(p,kv);for(let key of getValues(parsed,"unset")||[])applyUnsetOption(p,key)}function resolveSignIn(parsed,profile,options){if(!parsed.flags.has("signIn"))return;let provider=profile.provider;if(!provider)throw new Error("Error: --sign-in requires a provider (-p).");let login2=options.login;if(!login2)throw new Error("Error: --sign-in is not available: this host did not wire a provider login.");return{provider,login:login2}}function cmdProfileAdd(parsed,options){let name=parsed.positionals[0];if(!name)throw new Error("Error: profile name is required. Usage: pipi profile add <name> [options]");let models=getValues(parsed,"model");if(models&&models.length>3)throw new Error("Error: A profile can have at most 3 models.");validateThinking(getValues(parsed,"thinking")?.[0]),warnUnknownProvider(getValues(parsed,"provider")?.[0]);let profile={};models&&(profile.models=models,profile.model=models[0]),applyProfileOptions(profile,parsed),warnMissingProvider(profile);let signIn=resolveSignIn(parsed,profile,options),profileDir;try{profileDir=materializeProfile(name,profile)}catch(err2){debug(`profile add: initial materialize failed: ${err2}`)}addProfile(name,profile),console.log(`Profile '${name}' saved.`);let provider=profile.provider,providerOnly=provider!==void 0&&Object.keys(profile).length===1;if(signIn)return console.log(`Signing in to '${signIn.provider}' for profile '${name}'...`),runProviderLogin(name,signIn.provider,profile,profileDir??profileDirFor(name),signIn.login);if(providerOnly&&options.login&&profileDir)return console.log(`No token given \u2014 invoking the '${provider}' login for profile '${name}'...`),runProviderLogin(name,provider,profile,profileDir,options.login)}function runProviderLogin(name,provider,profile,profileDir,login2){return login2({profileDir,provider}).then(result=>{let previousToken=profile.token;result.token?profile.token=result.token:delete profile.token,profile.token!==previousToken&&updateProfile(name,profile),console.log(`Logged in to '${provider}'.`)},err2=>{let message2=err2 instanceof Error?err2.message:String(err2);console.error(`Login did not complete: ${message2}`),console.error(`Profile '${name}' keeps its stored credentials \u2014 'pipi profile update ${name} --sign-in' to retry the login, or 'pipi profile update ${name} -t <key>' to store a token.`)})}function cmdProfileUpdate(parsed,options){let name=parsed.positionals[0];if(!name)throw new Error("Error: profile name is required. Usage: pipi profile update <name> [options]");let p=loadProfiles().profiles[name];if(!p)throw new Error(`Profile '${name}' not found. Use 'profile add' to create it.`);let providedModels=getValues(parsed,"model"),modelsToDelete=getValues(parsed,"deleteModel");if(modelsToDelete){let toRemove=new Set(modelsToDelete),currentModels=p.models||(p.model?[p.model]:[]),newModels=currentModels.filter(m3=>!toRemove.has(m3)),removedCount=currentModels.length-newModels.length;removedCount===0?console.log(`No matching models to remove from profile '${name}'.`):newModels.length===0?(delete p.models,delete p.model,console.log(`Removed all models from profile '${name}'.`)):(p.models=newModels,p.model=newModels[0],console.log(`Removed ${removedCount} model(s) from profile '${name}'.`))}if(providedModels){let currentModels=p.models||(p.model?[p.model]:[]),merged=mergeModelsUpdate(currentModels,providedModels);p.models=merged.models,p.model=merged.models[0];for(let message2 of merged.messages)console.log(message2)}if((p.models||(p.model?[p.model]:[])).length>3)throw new Error("Error: A profile can have at most 3 models.");applyProfileOptions(p,parsed),warnMissingProvider(p);let signIn=resolveSignIn(parsed,p,options);if(updateProfile(name,p),console.log(`Profile '${name}' updated.`),signIn){let profileDir;try{profileDir=materializeProfile(name,p)}catch(err2){debug(`profile update: materialize failed: ${err2}`)}return console.log(`Signing in to '${signIn.provider}' for profile '${name}'...`),runProviderLogin(name,signIn.provider,p,profileDir??profileDirFor(name),signIn.login)}}function cmdProfileList(){let data=loadProfiles(),profiles=data.profiles,names3=Object.keys(profiles);if(names3.length===0){console.log("No profiles defined. Use 'profile add' to create one.");return}let def=data.default||"",fmt=(marker,name,model,provider,thinking,token,url)=>`${marker.padEnd(2)} ${name.padEnd(20)} ${model.padEnd(30)} ${provider.padEnd(22)} ${thinking.padEnd(10)} ${token.padEnd(20)} ${url}`;console.log(fmt("","NAME","MODEL(S)","PROVIDER","THINKING","TOKEN","URL")),console.log(fmt("","----","--------","--------","---------","-----","---"));for(let name of names3){let p=profiles[name];console.log(fmt(name===def?"* ":" ",name,formatModels(p),p.provider||"(default)",p.thinking||"(default)",maskToken(p.token||""),p.url||"(default)"))}}function cmdProfileView(parsed){let name=parsed.positionals[0];if(!name)throw new Error("Error: profile name is required. Usage: pipi profile view <name> [-j]");let p=loadProfiles().profiles[name];if(!p)throw new Error(`Profile '${name}' not found.`);if(parsed.flags.has("json")){console.log(JSON.stringify({name,...p},null,2));return}if(console.log(`Name: ${name}`),console.log(`Provider: ${p.provider||"(default)"}`),console.log(`Model: ${p.model||"(unset)"}`),p.models&&p.models.length>0){console.log("Models:");for(let m3 of p.models)console.log(` - ${m3}`)}if(console.log(`Thinking: ${p.thinking||"(default)"}`),console.log(`Token: ${p.token||"(unset)"}`),console.log(`URL: ${p.url||"(default)"}`),p.settings&&Object.keys(p.settings).length>0){console.log("Settings overrides:");for(let[key,value]of Object.entries(p.settings))console.log(` ${key} = ${JSON.stringify(value)}`)}}function cmdProfileRemove(parsed){let name=parsed.positionals[0];if(!name)throw new Error("Error: profile name is required. Usage: pipi profile remove <name>");removeProfile(name),removeProfileDir(name),console.log(`Profile '${name}' removed.`)}function cmdProfileRename(parsed){let oldName=parsed.positionals[0],newName=parsed.positionals[1];if(!oldName||!newName)throw new Error("Error: both names are required. Usage: pipi profile rename <old> <new>");renameProfile(oldName,newName);let oldDir=profileDirFor(oldName);fs20.existsSync(oldDir)&&(removeProfileDir(newName),fs20.renameSync(oldDir,profileDirFor(newName))),console.log(`Profile '${oldName}' renamed to '${newName}'.`)}function cmdProfileDefault(parsed){let name=parsed.positionals[0];if(!name)throw new Error("Profile name is required. Use 'pipi unuse' to run pi with your existing config.");setDefaultProfile(name),console.log(`Default profile set to '${name}'.`)}function dispatchProfile(argv,options){let sub=argv[0],parsed=parseSubcommandArgv(argv.slice(1));switch(sub){case"add":return cmdProfileAdd(parsed,options);case"update":return cmdProfileUpdate(parsed,options);case"list":cmdProfileList();return;case"view":cmdProfileView(parsed);return;case"remove":cmdProfileRemove(parsed);return;case"rename":cmdProfileRename(parsed);return;case"default":cmdProfileDefault(parsed);return;case void 0:throw new Error("Error: 'profile' requires a subcommand (add|update|list|view|remove|rename|default).");default:throw new Error(`Error: unknown profile subcommand '${sub}'. Use: add|update|list|view|remove|rename|default`)}}function dispatchUse(argv){let name=parseSubcommandArgv(argv).positionals[0];if(!name){let current=getDefaultProfileName();console.log(current?`Default profile: '${current}'.`:"No default profile set (running as plain pi).");return}setDefaultProfile(name),console.log(`Default profile set to '${name}'.`)}function dispatchUnuse(){clearDefaultProfile(),console.log("Default profile unset (running as plain pi).")}function dispatchHubCommand(args2,options={}){info(`Executing: ${args2.join(" ")}`);let command=args2[0],argv=args2.slice(1);switch(command){case"profile":return dispatchProfile(argv,options);case"use":dispatchUse(argv);return;case"unuse":dispatchUnuse();return;default:throw new Error(`Error: unknown hub command '${command}'.`)}}var HUB_SUBCOMMANDS,VALUE_OPTIONS,FLAG_OPTIONS,init_commands=__esm({"packages/hub/dist/commands.js"(){init_logger();init_materializer();init_profiles();init_types10();HUB_SUBCOMMANDS=new Set(["profile","use","unuse"]),VALUE_OPTIONS=new Map([["-m","model"],["--model","model"],["-t","token"],["--token","token"],["-u","url"],["--url","url"],["-p","provider"],["--provider","provider"],["--thinking","thinking"],["--set","set"],["--unset","unset"],["-d","deleteModel"],["--delete-model","deleteModel"]]),FLAG_OPTIONS=new Map([["-j","json"],["--json","json"],["--sign-in","signIn"]])}});function unknownProfile(name){return new Error(`Profile '${name}' not found. Use 'pipi profile list' to see available profiles.`)}function resolveLaunch(args2){let name,remaining=[];for(let i2=0;i2<args2.length;i2++){let arg=args2[i2];if(arg===PROFILE_FLAG){let value=args2[i2+1];if(!value)throw new Error("Error: --as expects a profile name. Use 'pipi profile list' to see available profiles.");name=value,i2++}else if(arg.startsWith(PROFILE_FLAG+"=")){if(name=arg.slice(PROFILE_FLAG.length+1),!name)throw new Error("Error: --as expects a profile name. Use 'pipi profile list' to see available profiles.")}else remaining.push(arg)}if(name===void 0&&(name=getDefaultProfileName()),name!==void 0){if(!loadProfiles().profiles[name])throw unknownProfile(name);return{kind:"profile",name,remainingArgs:remaining}}return{kind:"plain",remainingArgs:remaining}}var PROFILE_FLAG,init_launch=__esm({"packages/hub/dist/launch.js"(){init_profiles();PROFILE_FLAG="--as"}});var init_dist9=__esm({"packages/hub/dist/index.js"(){init_commands();init_config5();init_launch();init_logger();init_materializer();init_profiles();init_types10()}});import{join as join57}from"node:path";import{createInterface as createInterface7}from"node:readline";async function loginProvider(providerId,options={}){let agentDir=options.agentDir??getAgentDir(),runtime=await ModelRuntime.create({authPath:join57(agentDir,"auth.json"),modelsPath:null,signal:options.signal}),provider=runtime.getProvider(providerId);if(!provider)throw new Error(`Unknown provider '${providerId}'.`);let method=options.method??(provider.auth.oauth?"oauth":provider.auth.apiKey?.login?"api_key":void 0);if(!method)throw new Error(`Provider '${providerId}' has no interactive login (environment API key only). Store a token with 'pipi profile update <name> -t <key>'.`);let interaction=options.interaction??createTerminalAuthInteraction(),signal=options.signal&&interaction.signal?AbortSignal.any([options.signal,interaction.signal]):options.signal??interaction.signal;return runtime.login(providerId,method,{...interaction,signal})}function createTerminalAuthInteraction(){return{prompt:prompt=>answerPrompt(prompt),notify:event=>showAuthEvent(event)}}function askLine(question){let rl=createInterface7({input:process.stdin,output:process.stdout});return new Promise((resolve26,reject)=>{let settled=!1;rl.question(question,answer2=>{settled=!0,rl.close(),resolve26(answer2.trim())}),rl.once("close",()=>{settled||reject(new Error("Login cancelled (no terminal input)"))})})}function withAbort(promise,signal){return signal?signal.aborted?Promise.reject(new Error("Login cancelled")):new Promise((resolve26,reject)=>{let onAbort=()=>reject(new Error("Login cancelled"));signal.addEventListener("abort",onAbort,{once:!0}),promise.then(resolve26,reject).finally(()=>signal.removeEventListener("abort",onAbort))}):promise}async function answerPrompt(prompt){if(prompt.type==="select"){let lines2=[`
2321
+ `)}var PI_DIR,PROFILES_FILE,AGENT_DIR,PI_HUB_DIR,PROFILE_DIRS_DIR,AGENT_SETTINGS_FILE,AGENT_AUTH_FILE,PI_SETTINGS_FILE,init_config5=__esm({"packages/hub/dist/config.js"(){init_logger();PI_DIR=process.env.PI_HUB_PI_DIR||path21.join(os10.homedir(),".pi"),PROFILES_FILE=process.env.PI_HUB_PROFILES_FILE||path21.join(PI_DIR,"profiles.json"),AGENT_DIR=process.env.PI_CODING_AGENT_DIR||path21.join(PI_DIR,"agent"),PI_HUB_DIR=process.env.PI_HUB_DIR||path21.join(PI_DIR,"pi-hub"),PROFILE_DIRS_DIR=path21.join(PI_HUB_DIR,"profiles"),AGENT_SETTINGS_FILE=path21.join(AGENT_DIR,"settings.json"),AGENT_AUTH_FILE=path21.join(AGENT_DIR,"auth.json"),PI_SETTINGS_FILE=path21.join(PI_DIR,"settings.json")}});var PROFILE_SETTINGS_KEYS2,PI_PROVIDERS,THINKING_LEVELS3,init_types10=__esm({"packages/hub/dist/types.js"(){PROFILE_SETTINGS_KEYS2=["defaultProvider","defaultModel","defaultThinkingLevel"],PI_PROVIDERS=["anthropic","ant-ling","azure-openai-responses","openai","deepseek","nvidia","google","amazon-bedrock","mistral","groq","cerebras","cloudflare-ai-gateway","cloudflare-workers-ai","xai","openrouter","vercel-ai-gateway","zai","zai-coding-cn","opencode","opencode-go","radius","huggingface","fireworks","together","baseten","kimi-coding","minimax","minimax-cn","qwen-token-plan","qwen-token-plan-intl","qwen-token-plan-individual","qwen-token-plan-cn","xiaomi","xiaomi-cn","xiaomi-token-plan-cn","xiaomi-token-plan-ams","xiaomi-token-plan-sgp","moonshotai","moonshotai-cn"],THINKING_LEVELS3=["off","minimal","low","medium","high","xhigh","max"]}});import fs18 from"node:fs";import path22 from"node:path";function profileDirFor(name){return path22.join(PROFILE_DIRS_DIR,name)}function readSourceSettings(){return fs18.existsSync(AGENT_SETTINGS_FILE)?readJson(AGENT_SETTINGS_FILE):{}}function resolveEffectiveProvider(profile,settings2){if(profile.provider)return profile.provider;let first=(profile.models||(profile.model?[profile.model]:[]))[0];return first?.includes("/")?first.split("/")[0]:settings2.defaultProvider}function writeAuthFile(dir,profile){let file=path22.join(dir,"auth.json");if(!profile.token)return;let provider=resolveEffectiveProvider(profile,readSourceSettings());if(!provider){console.error("Warning: profile has a token but no provider could be determined (no -p flag, no provider/model id, no defaultProvider in agent settings). auth.json was not written; pi will not find this token.");return}let auth=fs18.existsSync(file)?readJson(file):{};auth[provider]={type:"api_key",key:profile.token},writeJson(file,auth,384),debug(`writeAuthFile: wrote ${file}`)}function writeSettingsFile(dir,profile){let profileSettingsFile=path22.join(dir,"settings.json");if(fs18.existsSync(profileSettingsFile)&&path22.resolve(AGENT_DIR)===path22.resolve(dir)){let existingNested;try{existingNested=readJson(profileSettingsFile)}catch(err2){warn(`writeSettingsFile: could not read existing ${profileSettingsFile}, regenerating`,err2),existingNested={}}applyProfileOverrides(existingNested,profile),writeJson(profileSettingsFile,existingNested),debug(`writeSettingsFile: rewrote nested profile copy ${profileSettingsFile}`);return}let source=readSourceSettings(),existing={};if(fs18.existsSync(profileSettingsFile))try{existing=readJson(profileSettingsFile)}catch(err2){warn(`writeSettingsFile: could not read existing ${profileSettingsFile}, regenerating`,err2)}let sourceDirty=!1;for(let[key,value]of Object.entries(existing))PROFILE_SETTINGS_KEYS2.includes(key)||value===void 0||profile.settings&&key in profile.settings||source[key]===void 0&&(source[key]=value,sourceDirty=!0,debug(`writeSettingsFile: migrated general key "${key}" into ${AGENT_SETTINGS_FILE}`));sourceDirty&&(writeJson(AGENT_SETTINGS_FILE,source),debug(`writeSettingsFile: pruned general keys from the profile copy, migrated into ${AGENT_SETTINGS_FILE}`));let settings2={};for(let key of PROFILE_SETTINGS_KEYS2)existing[key]!==void 0&&(settings2[key]=existing[key]);if(source.skills===void 0&&settings2.skills===void 0&&fs18.existsSync(PI_SETTINGS_FILE)){let outer=readJson(PI_SETTINGS_FILE);outer.skills!==void 0&&(settings2.skills=outer.skills)}applyProfileOverrides(settings2,profile),writeJson(profileSettingsFile,settings2),debug(`writeSettingsFile: wrote ${profileSettingsFile}`)}function applyProfileOverrides(settings2,profile){if(profile.settings)for(let[key,value]of Object.entries(profile.settings))value===null?delete settings2[key]:settings2[key]=value;let models=profile.models||(profile.model?[profile.model]:[]),defaultModel=profile.model&&models.includes(profile.model)?profile.model:models[0];profile.provider&&(settings2.defaultProvider=profile.provider),defaultModel&&(settings2.defaultModel=defaultModel),profile.thinking&&(settings2.defaultThinkingLevel=profile.thinking),profile.settings?.enabledModels===void 0&&(models.length>1?settings2.enabledModels=[...models]:delete settings2.enabledModels)}function writeModelsFile(dir,profile){let file=path22.join(dir,"models.json");if(!profile.url){fs18.rmSync(file,{force:!0});return}let provider=resolveEffectiveProvider(profile,readSourceSettings());if(!provider){console.error("Warning: profile has a url but no provider could be determined (no -p flag, no provider/model id, no defaultProvider in agent settings). models.json baseUrl override was not written.");return}let data={providers:{[provider]:{baseUrl:profile.url}}};writeJson(file,data),debug(`writeModelsFile: wrote ${file}`)}function removeStaleLink(linkPath2){try{let stat6=fs18.lstatSync(linkPath2);stat6.isSymbolicLink()||stat6.isFile()?fs18.rmSync(linkPath2,{force:!0}):stat6.isDirectory()&&(info(`refreshSharedLinks: replacing copied dir with link: ${linkPath2}`),fs18.rmSync(linkPath2,{recursive:!0,force:!0}))}catch{}}function linkOrCopy(target,linkPath2,isDir){if(removeStaleLink(linkPath2),!!fs18.existsSync(target))try{fs18.symlinkSync(target,linkPath2,isDir?"junction":"file")}catch(err2){warn(`Symlink failed for ${target}, falling back to copy`,err2),isDir?fs18.cpSync(target,linkPath2,{recursive:!0}):fs18.copyFileSync(target,linkPath2)}}function refreshSharedLinks(dir){if(path22.resolve(AGENT_DIR)!==path22.resolve(dir)){for(let name of SHARED_DIR_LINKS)linkOrCopy(path22.join(AGENT_DIR,name),path22.join(dir,name),!0);for(let name of SHARED_FILE_LINKS)linkOrCopy(path22.join(AGENT_DIR,name),path22.join(dir,name),!1)}}function packagesOf(settings2){return settings2?.packages??null}function syncProfilePackagesToSource(profileDir){let profileSettingsPath=path22.join(profileDir,"settings.json");if(!fs18.existsSync(profileSettingsPath)||!fs18.existsSync(AGENT_SETTINGS_FILE))return!1;let profileSettings,sourceSettings;try{profileSettings=readJson(profileSettingsPath),sourceSettings=readJson(AGENT_SETTINGS_FILE)}catch(err2){return warn("syncProfilePackagesToSource: could not read settings, skipping sync",err2),!1}return JSON.stringify(packagesOf(profileSettings))===JSON.stringify(packagesOf(sourceSettings))?!1:(profileSettings.packages===void 0?delete sourceSettings.packages:sourceSettings.packages=profileSettings.packages,writeJson(AGENT_SETTINGS_FILE,sourceSettings),debug(`syncProfilePackagesToSource: synced packages from ${profileSettingsPath} to ${AGENT_SETTINGS_FILE}`),!0)}function adoptDivergedPackages(dir){let profileSettingsPath=path22.join(dir,"settings.json"),snapshotPath=path22.join(dir,PACKAGES_SNAPSHOT_FILE);if(!fs18.existsSync(profileSettingsPath)||!fs18.existsSync(snapshotPath))return;let profileSettings,snapshot;try{profileSettings=readJson(profileSettingsPath),snapshot=readJson(snapshotPath)}catch(err2){warn("adoptDivergedPackages: could not read settings/snapshot, skipping adoption",err2);return}JSON.stringify(packagesOf(profileSettings))!==JSON.stringify(snapshot.packages??null)&&(info("adoptDivergedPackages: profile packages diverged from snapshot, adopting into source"),syncProfilePackagesToSource(dir))}function writePackagesSnapshot(dir){let profileSettingsPath=path22.join(dir,"settings.json"),packages=null;try{fs18.existsSync(profileSettingsPath)&&(packages=packagesOf(readJson(profileSettingsPath)))}catch(err2){warn(`writePackagesSnapshot: could not read ${profileSettingsPath}, snapshot not updated`,err2);return}writeJson(path22.join(dir,PACKAGES_SNAPSHOT_FILE),{packages})}function materializeProfile(name,profile){let dir=profileDirFor(name);return fs18.mkdirSync(dir,{recursive:!0}),adoptDivergedPackages(dir),writeAuthFile(dir,profile),writeSettingsFile(dir,profile),writeModelsFile(dir,profile),refreshSharedLinks(dir),writePackagesSnapshot(dir),dir}function removeProfileDir(name){let dir=profileDirFor(name);fs18.existsSync(dir)&&(fs18.rmSync(dir,{recursive:!0,force:!0}),debug(`removeProfileDir: removed ${dir}`))}var SHARED_DIR_LINKS,SHARED_FILE_LINKS,PACKAGES_SNAPSHOT_FILE,init_materializer=__esm({"packages/hub/dist/materializer.js"(){init_config5();init_logger();init_types10();SHARED_DIR_LINKS=["extensions","skills","npm","sessions"],SHARED_FILE_LINKS=["AGENTS.md","models-store.json"],PACKAGES_SNAPSHOT_FILE="packages.snapshot.json"}});import fs19 from"node:fs";function maskToken(token){return token?token.length<=12?token:`${token.slice(0,8)}...${token.slice(-4)}`:"(unset)"}function formatModels(p){let models=p.models||(p.model?[p.model]:[]);if(models.length===0)return"(unset)";let joined=models.join(", ");return joined.length>28?`${models[0]}, +${models.length-1} more`:joined}function validateThinking(thinking){if(thinking&&!THINKING_LEVELS3.includes(thinking))throw new Error(`Invalid thinking level '${thinking}'. Valid levels: ${THINKING_LEVELS3.join(", ")}.`)}function parseSetValue(raw){try{return JSON.parse(raw)}catch{return raw}}function applySetOption(p,kv){let idx=kv.indexOf("=");if(idx===-1)throw new Error(`Error: --set expects key=value, got '${kv}'.`);let key=kv.slice(0,idx).trim();if(!key)throw new Error(`Error: --set expects a non-empty key, got '${kv}'.`);p.settings=p.settings||{},p.settings[key]=parseSetValue(kv.slice(idx+1))}function applyUnsetOption(p,key){p.settings&&(delete p.settings[key],Object.keys(p.settings).length===0&&delete p.settings)}function loadProfiles(){return ensureProfilesFile(),readJson(PROFILES_FILE)}function saveProfiles(data){writeJson(PROFILES_FILE,data,384),fs19.chmodSync(PROFILES_FILE,384)}function findProfile(name){return loadProfiles().profiles[name]}function getDefaultProfileName(){let def=loadProfiles().default;if(!(!def||def===LEGACY_BUILT_IN_DEFAULT))return def}function setDefaultProfile(name){let data=loadProfiles();if(!data.profiles[name])throw new Error(`Profile '${name}' not found.`);data.default=name,saveProfiles(data),debug(`setDefaultProfile: wrote ${PROFILES_FILE}`)}function clearDefaultProfile(){let data=loadProfiles();delete data.default,saveProfiles(data),debug(`clearDefaultProfile: wrote ${PROFILES_FILE}`)}function addProfile(name,profile){let data=loadProfiles();data.profiles[name]=profile,saveProfiles(data),debug(`addProfile: wrote ${PROFILES_FILE}`)}function updateProfile(name,profile){let data=loadProfiles();if(!data.profiles[name])throw new Error(`Profile '${name}' not found. Use 'profile add' to create it.`);data.profiles[name]=profile,saveProfiles(data),debug(`updateProfile: wrote ${PROFILES_FILE}`)}function removeProfile(name){let data=loadProfiles();if(!data.profiles[name])throw new Error(`Profile '${name}' not found.`);delete data.profiles[name],data.default===name&&delete data.default,saveProfiles(data),debug(`removeProfile: wrote ${PROFILES_FILE}`)}function renameProfile(oldName,newName){let data=loadProfiles();if(!data.profiles[oldName])throw new Error(`Profile '${oldName}' not found.`);if(data.profiles[newName])throw new Error(`Profile '${newName}' already exists. Choose a different name.`);data.profiles[newName]=data.profiles[oldName],delete data.profiles[oldName],data.default===oldName&&(data.default=newName),saveProfiles(data)}function mergeModelsUpdate(current,provided){let messages=[];if(provided.length===1){let modelToSet=provided[0],existingIndex=current.indexOf(modelToSet);return existingIndex!==-1?(current.splice(existingIndex,1),current.unshift(modelToSet),messages.push(`Selected existing model '${modelToSet}' (position ${existingIndex+1} -> 1).`)):(current.unshift(modelToSet),messages.push(`Added and selected new model '${modelToSet}'.`)),{models:current,messages}}return{models:provided,messages}}var LEGACY_BUILT_IN_DEFAULT,init_profiles=__esm({"packages/hub/dist/profiles.js"(){init_config5();init_logger();init_types10();LEGACY_BUILT_IN_DEFAULT="__builtin__"}});import fs20 from"node:fs";function parseSubcommandArgv(argv){let values=new Map,flags=new Set,positionals=[],i2=0;for(;i2<argv.length;){let arg=argv[i2];if(arg==="--"){positionals.push(...argv.slice(i2+1));break}let eq=arg.indexOf("="),name=eq!==-1?arg.slice(0,eq):arg,inlineValue=eq!==-1?arg.slice(eq+1):void 0,valueName=VALUE_OPTIONS.get(name);if(valueName){let value=inlineValue;if(value===void 0&&(value=argv[i2+1],i2++),value===void 0)throw new Error(`Error: ${name} expects a value.`);let list2=values.get(valueName)||[];list2.push(value),values.set(valueName,list2)}else if(FLAG_OPTIONS.has(name))flags.add(FLAG_OPTIONS.get(name));else{if(name.startsWith("-")&&name!=="-")throw new Error(`Error: unknown option '${name}'.`);positionals.push(arg)}i2++}return{values,flags,positionals}}function getValues(parsed,name){let list2=parsed.values.get(name);return list2&&list2.length>0?list2:void 0}function warnUnknownProvider(provider){provider&&!PI_PROVIDERS.includes(provider)&&console.error(`Warning: '${provider}' is not a known pi provider id. Continuing anyway.`)}function warnMissingProvider(p){(p.token||p.url)&&!p.provider&&console.error("Warning: no provider set (-p). At run time the token/url will be keyed under your default pi provider (or the provider/model id prefix), which may not be what you intend.")}function applyProfileOptions(p,parsed){let token=getValues(parsed,"token")?.[0],url=getValues(parsed,"url")?.[0],provider=getValues(parsed,"provider")?.[0],thinking=getValues(parsed,"thinking")?.[0];token&&(p.token=token),url&&(p.url=url),provider&&(warnUnknownProvider(provider),p.provider=provider),thinking&&(validateThinking(thinking),p.thinking=thinking);for(let kv of getValues(parsed,"set")||[])applySetOption(p,kv);for(let key of getValues(parsed,"unset")||[])applyUnsetOption(p,key)}function resolveSignIn(parsed,profile,options){if(!parsed.flags.has("signIn"))return;let provider=profile.provider;if(!provider)throw new Error("Error: --sign-in requires a provider (-p).");let login2=options.login;if(!login2)throw new Error("Error: --sign-in is not available: this host did not wire a provider login.");return{provider,login:login2}}function cmdProfileAdd(parsed,options){let name=parsed.positionals[0];if(!name)throw new Error("Error: profile name is required. Usage: pipi profile add <name> [options]");let models=getValues(parsed,"model");if(models&&models.length>3)throw new Error("Error: A profile can have at most 3 models.");validateThinking(getValues(parsed,"thinking")?.[0]),warnUnknownProvider(getValues(parsed,"provider")?.[0]);let profile={};models&&(profile.models=models,profile.model=models[0]),applyProfileOptions(profile,parsed),warnMissingProvider(profile);let signIn=resolveSignIn(parsed,profile,options),profileDir;try{profileDir=materializeProfile(name,profile)}catch(err2){debug(`profile add: initial materialize failed: ${err2}`)}addProfile(name,profile),console.log(`Profile '${name}' saved.`);let provider=profile.provider,providerOnly=provider!==void 0&&Object.keys(profile).length===1;if(signIn)return console.log(`Signing in to '${signIn.provider}' for profile '${name}'...`),runProviderLogin(name,signIn.provider,profile,profileDir??profileDirFor(name),signIn.login);if(providerOnly&&options.login&&profileDir)return console.log(`No token given \u2014 invoking the '${provider}' login for profile '${name}'...`),runProviderLogin(name,provider,profile,profileDir,options.login)}function runProviderLogin(name,provider,profile,profileDir,login2){return login2({profileDir,provider}).then(result=>{let previousToken=profile.token;result.token?profile.token=result.token:delete profile.token,profile.token!==previousToken&&updateProfile(name,profile),console.log(`Logged in to '${provider}'.`)},err2=>{let message2=err2 instanceof Error?err2.message:String(err2);console.error(`Login did not complete: ${message2}`),console.error(`Profile '${name}' keeps its stored credentials \u2014 'pipi profile update ${name} --sign-in' to retry the login, or 'pipi profile update ${name} -t <key>' to store a token.`)})}function cmdProfileUpdate(parsed,options){let name=parsed.positionals[0];if(!name)throw new Error("Error: profile name is required. Usage: pipi profile update <name> [options]");let p=loadProfiles().profiles[name];if(!p)throw new Error(`Profile '${name}' not found. Use 'profile add' to create it.`);let providedModels=getValues(parsed,"model"),modelsToDelete=getValues(parsed,"deleteModel");if(modelsToDelete){let toRemove=new Set(modelsToDelete),currentModels=p.models||(p.model?[p.model]:[]),newModels=currentModels.filter(m3=>!toRemove.has(m3)),removedCount=currentModels.length-newModels.length;removedCount===0?console.log(`No matching models to remove from profile '${name}'.`):newModels.length===0?(delete p.models,delete p.model,console.log(`Removed all models from profile '${name}'.`)):(p.models=newModels,p.model=newModels[0],console.log(`Removed ${removedCount} model(s) from profile '${name}'.`))}if(providedModels){let currentModels=p.models||(p.model?[p.model]:[]),merged=mergeModelsUpdate(currentModels,providedModels);p.models=merged.models,p.model=merged.models[0];for(let message2 of merged.messages)console.log(message2)}if((p.models||(p.model?[p.model]:[])).length>3)throw new Error("Error: A profile can have at most 3 models.");applyProfileOptions(p,parsed),warnMissingProvider(p);let signIn=resolveSignIn(parsed,p,options);if(updateProfile(name,p),console.log(`Profile '${name}' updated.`),signIn){let profileDir;try{profileDir=materializeProfile(name,p)}catch(err2){debug(`profile update: materialize failed: ${err2}`)}return console.log(`Signing in to '${signIn.provider}' for profile '${name}'...`),runProviderLogin(name,signIn.provider,p,profileDir??profileDirFor(name),signIn.login)}}function cmdProfileList(){let data=loadProfiles(),profiles=data.profiles,names3=Object.keys(profiles);if(names3.length===0){console.log("No profiles defined. Use 'profile add' to create one.");return}let def=data.default||"",fmt=(marker,name,model,provider,thinking,token,url)=>`${marker.padEnd(2)} ${name.padEnd(20)} ${model.padEnd(30)} ${provider.padEnd(22)} ${thinking.padEnd(10)} ${token.padEnd(20)} ${url}`;console.log(fmt("","NAME","MODEL(S)","PROVIDER","THINKING","TOKEN","URL")),console.log(fmt("","----","--------","--------","---------","-----","---"));for(let name of names3){let p=profiles[name];console.log(fmt(name===def?"* ":" ",name,formatModels(p),p.provider||"(default)",p.thinking||"(default)",maskToken(p.token||""),p.url||"(default)"))}}function cmdProfileView(parsed){let name=parsed.positionals[0];if(!name)throw new Error("Error: profile name is required. Usage: pipi profile view <name> [-j]");let p=loadProfiles().profiles[name];if(!p)throw new Error(`Profile '${name}' not found.`);if(parsed.flags.has("json")){console.log(JSON.stringify({name,...p},null,2));return}if(console.log(`Name: ${name}`),console.log(`Provider: ${p.provider||"(default)"}`),console.log(`Model: ${p.model||"(unset)"}`),p.models&&p.models.length>0){console.log("Models:");for(let m3 of p.models)console.log(` - ${m3}`)}if(console.log(`Thinking: ${p.thinking||"(default)"}`),console.log(`Token: ${p.token||"(unset)"}`),console.log(`URL: ${p.url||"(default)"}`),p.settings&&Object.keys(p.settings).length>0){console.log("Settings overrides:");for(let[key,value]of Object.entries(p.settings))console.log(` ${key} = ${JSON.stringify(value)}`)}}function cmdProfileRemove(parsed){let name=parsed.positionals[0];if(!name)throw new Error("Error: profile name is required. Usage: pipi profile remove <name>");removeProfile(name),removeProfileDir(name),console.log(`Profile '${name}' removed.`)}function cmdProfileRename(parsed){let oldName=parsed.positionals[0],newName=parsed.positionals[1];if(!oldName||!newName)throw new Error("Error: both names are required. Usage: pipi profile rename <old> <new>");renameProfile(oldName,newName);let oldDir=profileDirFor(oldName);fs20.existsSync(oldDir)&&(removeProfileDir(newName),fs20.renameSync(oldDir,profileDirFor(newName))),console.log(`Profile '${oldName}' renamed to '${newName}'.`)}function cmdProfileDefault(parsed){let name=parsed.positionals[0];if(!name)throw new Error("Profile name is required. Use 'pipi unuse' to run pi with your existing config.");setDefaultProfile(name),console.log(`Default profile set to '${name}'.`)}function dispatchProfile(argv,options){let sub=argv[0],parsed=parseSubcommandArgv(argv.slice(1));switch(sub){case"add":return cmdProfileAdd(parsed,options);case"update":return cmdProfileUpdate(parsed,options);case"list":cmdProfileList();return;case"view":cmdProfileView(parsed);return;case"remove":cmdProfileRemove(parsed);return;case"rename":cmdProfileRename(parsed);return;case"default":cmdProfileDefault(parsed);return;case void 0:throw new Error("Error: 'profile' requires a subcommand (add|update|list|view|remove|rename|default).");default:throw new Error(`Error: unknown profile subcommand '${sub}'. Use: add|update|list|view|remove|rename|default`)}}function dispatchUse(argv){let name=parseSubcommandArgv(argv).positionals[0];if(!name){let current=getDefaultProfileName();console.log(current?`Default profile: '${current}'.`:"No default profile set (running as plain pi).");return}setDefaultProfile(name),console.log(`Default profile set to '${name}'.`)}function dispatchUnuse(){clearDefaultProfile(),console.log("Default profile unset (running as plain pi).")}function dispatchHubCommand(args2,options={}){info(`Executing: ${args2.join(" ")}`);let command=args2[0],argv=args2.slice(1);switch(command){case"profile":return dispatchProfile(argv,options);case"use":dispatchUse(argv);return;case"unuse":dispatchUnuse();return;default:throw new Error(`Error: unknown hub command '${command}'.`)}}var HUB_SUBCOMMANDS,VALUE_OPTIONS,FLAG_OPTIONS,init_commands=__esm({"packages/hub/dist/commands.js"(){init_logger();init_materializer();init_profiles();init_types10();HUB_SUBCOMMANDS=new Set(["profile","use","unuse"]),VALUE_OPTIONS=new Map([["-m","model"],["--model","model"],["-t","token"],["--token","token"],["-u","url"],["--url","url"],["-p","provider"],["--provider","provider"],["--thinking","thinking"],["--set","set"],["--unset","unset"],["-d","deleteModel"],["--delete-model","deleteModel"]]),FLAG_OPTIONS=new Map([["-j","json"],["--json","json"],["--sign-in","signIn"]])}});function unknownProfile(name){return new Error(`Profile '${name}' not found. Use 'pipi profile list' to see available profiles.`)}function resolveLaunch(args2){let name,remaining=[];for(let i2=0;i2<args2.length;i2++){let arg=args2[i2];if(arg===PROFILE_FLAG){let value=args2[i2+1];if(!value)throw new Error("Error: --as expects a profile name. Use 'pipi profile list' to see available profiles.");name=value,i2++}else if(arg.startsWith(`${PROFILE_FLAG}=`)){if(name=arg.slice(PROFILE_FLAG.length+1),!name)throw new Error("Error: --as expects a profile name. Use 'pipi profile list' to see available profiles.")}else remaining.push(arg)}if(name===void 0&&(name=getDefaultProfileName()),name!==void 0){if(!loadProfiles().profiles[name])throw unknownProfile(name);return{kind:"profile",name,remainingArgs:remaining}}return{kind:"plain",remainingArgs:remaining}}var PROFILE_FLAG,init_launch=__esm({"packages/hub/dist/launch.js"(){init_profiles();PROFILE_FLAG="--as"}});var init_dist9=__esm({"packages/hub/dist/index.js"(){init_commands();init_config5();init_launch();init_logger();init_materializer();init_profiles();init_types10()}});import{join as join57}from"node:path";import{createInterface as createInterface7}from"node:readline";async function loginProvider(providerId,options={}){let agentDir=options.agentDir??getAgentDir(),runtime=await ModelRuntime.create({authPath:join57(agentDir,"auth.json"),modelsPath:null,signal:options.signal}),provider=runtime.getProvider(providerId);if(!provider)throw new Error(`Unknown provider '${providerId}'.`);let method=options.method??(provider.auth.oauth?"oauth":provider.auth.apiKey?.login?"api_key":void 0);if(!method)throw new Error(`Provider '${providerId}' has no interactive login (environment API key only). Store a token with 'pipi profile update <name> -t <key>'.`);let interaction=options.interaction??createTerminalAuthInteraction(),signal=options.signal&&interaction.signal?AbortSignal.any([options.signal,interaction.signal]):options.signal??interaction.signal;return runtime.login(providerId,method,{...interaction,signal})}function createTerminalAuthInteraction(){return{prompt:prompt=>answerPrompt(prompt),notify:event=>showAuthEvent(event)}}function askLine(question){let rl=createInterface7({input:process.stdin,output:process.stdout});return new Promise((resolve26,reject)=>{let settled=!1;rl.question(question,answer2=>{settled=!0,rl.close(),resolve26(answer2.trim())}),rl.once("close",()=>{settled||reject(new Error("Login cancelled (no terminal input)"))})})}function withAbort(promise,signal){return signal?signal.aborted?Promise.reject(new Error("Login cancelled")):new Promise((resolve26,reject)=>{let onAbort=()=>reject(new Error("Login cancelled"));signal.addEventListener("abort",onAbort,{once:!0}),promise.then(resolve26,reject).finally(()=>signal.removeEventListener("abort",onAbort))}):promise}async function answerPrompt(prompt){if(prompt.type==="select"){let lines2=[`
2322
2322
  ${prompt.message}`];prompt.options.forEach((option,index3)=>{let description=option.description?` \u2014 ${option.description}`:"";lines2.push(` ${index3+1}. ${option.label}${description}`)}),console.log(lines2.join(`
2323
2323
  `));let answer2=await withAbort(askLine(`Enter number (1-${prompt.options.length}): `),prompt.signal),selected=prompt.options[Number.parseInt(answer2,10)-1];if(!selected)throw new Error(`Invalid selection '${answer2}'.`);return selected.id}let placeholder=prompt.placeholder?` (${prompt.placeholder})`:"";return withAbort(askLine(`${prompt.message}${placeholder}: `),prompt.signal)}function showAuthEvent(event){switch(event.type){case"auth_url":console.log(`
2324
2324
  ${event.instructions??"Complete the sign-in in your browser."}`),console.log(` ${event.url}`),openBrowser(event.url);break;case"device_code":console.log(`
@@ -2395,7 +2395,7 @@ ${m3.body}`).join(`
2395
2395
  `)}],details:{memories:memories.map(m3=>({name:m3.name,type:m3.type,fileName:m3.fileName}))}}},renderCall(args2,theme2,_context){let text=theme2.fg("toolTitle",theme2.bold("memory_recall "))+theme2.fg("accent",args2.query?`"${args2.query}"`:"(all)");return new Text(text,0,0)},renderResult(result,{expanded},theme2,_context){let details=result.details,text=result.content[0];if(!details||details.memories.length===0)return new Text(theme2.fg("dim",text?.type==="text"?text.text:"No memories"),0,0);let display=expanded?details.memories:details.memories.slice(0,5),listText=theme2.fg("muted",`${details.memories.length} memory(ies):`);for(let m3 of display)listText+=`
2396
2396
  ${theme2.fg("accent","\u2022")} ${theme2.fg("muted",m3.name)}`;return!expanded&&details.memories.length>5&&(listText+=`
2397
2397
  ${theme2.fg("dim",`... ${details.memories.length-5} more`)}`),new Text(listText,0,0)}})}var MemorySaveParams,MemoryRecallParams,MEMORY_SAVE_SNIPPET,MEMORY_RECALL_SNIPPET,init_tools3=__esm({"packages/plus/src/extensions/memory/tools.ts"(){init_dist();init_dist2();init_build();init_store();MemorySaveParams=typebox_exports.Object({name:typebox_exports.String({description:'Short descriptive name for the memory, e.g. "prefers-pnpm" or "auth-flow-decision"'}),description:typebox_exports.String({description:"One-line description of what this memory captures; used to judge relevance in future sessions"}),type:StringEnum(MEMORY_TYPES,{description:"user: who the user is (role, preferences, goals) | feedback: guidance from corrections or confirmed approaches | project: ongoing work context not derivable from the code | reference: pointers to external resources (docs, dashboards, tickets)"}),body:typebox_exports.String({description:'Markdown content of the memory. For feedback and project memories, structure the body as the fact or rule, then "**Why:**" and "**How to apply:**" paragraphs.'})}),MemoryRecallParams=typebox_exports.Object({query:typebox_exports.Optional(typebox_exports.String({description:"Keywords to search memory names, descriptions, and contents for (all terms must match)"})),limit:typebox_exports.Optional(typebox_exports.Number({description:"Maximum number of memories to return (default 5)"}))}),MEMORY_SAVE_SNIPPET="memory_save: persist a durable fact to long-term memory \u2014 user preferences and profile, corrections or confirmed approaches (feedback), project conventions and decisions not derivable from the code, or stable reference pointers. Skip session-scoped state, secrets, and anything the repo already records.",MEMORY_RECALL_SNIPPET="memory_recall: search long-term memory by keyword; call when a task touches user preferences, prior decisions, or project conventions that may have been remembered in earlier sessions"}});function registerMemory(pi,overrides={}){let state3=createExtractState(),deps={storeFor:overrides.storeFor??(ctx=>MemoryStore.forCwd(ctx.cwd)),runAgent:overrides.runAgent};registerMemoryTools(pi,deps),registerMemoryCommand(pi,deps),pi.on("tool_call",async event=>{event.toolName==="memory_save"&&(state3.mainAgentSavedThisRun=!0)}),pi.on("agent_start",async()=>{state3.mainAgentSavedThisRun=!1}),pi.on("before_agent_start",async(event,ctx)=>{if(!readMemorySettings(ctx.cwd).enabled)return;let index3=(await deps.storeFor(ctx).readIndex()).trim();index3!==""&&(event.systemPromptOptions.sections[MEMORY_SECTION_NAME]=`Long-term memory index for this project (use the memory_recall tool to load full contents):
2398
- `+index3)}),pi.on("agent_settled",async(_event,ctx)=>{maybeExtract(ctx,state3,deps)})}var MEMORY_SECTION_NAME,init_memory3=__esm({"packages/plus/src/extensions/memory/index.ts"(){init_command();init_extract3();init_settings3();init_store();init_tools3();MEMORY_SECTION_NAME="memory"}});function isSafeCommand(command){let isDestructive=DESTRUCTIVE_PATTERNS.some(p=>p.test(command)),isSafe=SAFE_PATTERNS.some(p=>p.test(command));return!isDestructive&&isSafe}function blocked(reason){return{block:!0,reason}}function readOnlyReason(planFilePath,what){let plan=planFilePath?` The plan file is at ${planFilePath}.`:"";return`Plan mode is active: ${what} is read-only.${plan} Update the plan file instead, and call ExitPlanMode when the plan is ready for approval.`}function gateToolCall(event,state3,cwd){if(state3.enabled&&!(isToolCallEventType("read",event)||isToolCallEventType("grep",event)||isToolCallEventType("find",event)||isToolCallEventType("ls",event))){if(isToolCallEventType("edit",event)){let rawPath=event.input.path??event.input.file_path;return state3.planFilePath&&isPlanFileTarget(cwd,rawPath,state3.planFilePath)?void 0:blocked(readOnlyReason(state3.planFilePath,`editing ${String(rawPath)}`))}if(isToolCallEventType("write",event))return state3.planFilePath&&isPlanFileTarget(cwd,event.input.path,state3.planFilePath)?void 0:blocked(readOnlyReason(state3.planFilePath,`writing ${event.input.path}`));if(isToolCallEventType("bash",event))return isSafeCommand(event.input.command)?void 0:blocked(readOnlyReason(state3.planFilePath,`running \`${event.input.command}\``));if(isToolCallEventType("powershell",event))return blocked(readOnlyReason(state3.planFilePath,"powershell"));if(event.toolName==="subagent"){let agent=event.input.agent;return agent==="explore"?void 0:blocked(readOnlyReason(state3.planFilePath,`the "${String(agent??"worker")}" sub-agent has a full toolset and would bypass plan mode`))}if(!ALLOWED_CUSTOM_TOOLS.has(event.toolName))return blocked(readOnlyReason(state3.planFilePath,`custom tool "${event.toolName}"`))}}var DESTRUCTIVE_PATTERNS,SAFE_PATTERNS,ALLOWED_CUSTOM_TOOLS,init_gate=__esm({"packages/plus/src/extensions/plan/gate.ts"(){init_types7();init_plan_file();DESTRUCTIVE_PATTERNS=[/\brm\b/i,/\brmdir\b/i,/\bmv\b/i,/\bcp\b/i,/\bmkdir\b/i,/\btouch\b/i,/\bchmod\b/i,/\bchown\b/i,/\bchgrp\b/i,/\bln\b/i,/\btee\b/i,/\btruncate\b/i,/\bdd\b/i,/\bshred\b/i,/(^|[^<])>(?!>)/,/>>/,/\bnpm\s+(install|uninstall|update|ci|link|publish)/i,/\byarn\s+(add|remove|install|publish)/i,/\bpnpm\s+(add|remove|install|publish)/i,/\bpip\s+(install|uninstall)/i,/\bapt(-get)?\s+(install|remove|purge|update|upgrade)/i,/\bbrew\s+(install|uninstall|upgrade)/i,/\bgit\s+(add|commit|push|pull|merge|rebase|reset|checkout|branch\s+-[dD]|stash|cherry-pick|revert|tag|init|clone)/i,/\bsudo\b/i,/\bsu\b/i,/\bkill\b/i,/\bpkill\b/i,/\bkillall\b/i,/\breboot\b/i,/\bshutdown\b/i,/\bsystemctl\s+(start|stop|restart|enable|disable)/i,/\bservice\s+\S+\s+(start|stop|restart)/i,/\b(vim?|nano|emacs|code|subl)\b/i],SAFE_PATTERNS=[/^\s*cat\b/,/^\s*head\b/,/^\s*tail\b/,/^\s*less\b/,/^\s*more\b/,/^\s*grep\b/,/^\s*find\b/,/^\s*ls\b/,/^\s*pwd\b/,/^\s*echo\b/,/^\s*printf\b/,/^\s*wc\b/,/^\s*sort\b/,/^\s*uniq\b/,/^\s*diff\b/,/^\s*file\b/,/^\s*stat\b/,/^\s*du\b/,/^\s*df\b/,/^\s*tree\b/,/^\s*which\b/,/^\s*whereis\b/,/^\s*type\b/,/^\s*env\b/,/^\s*printenv\b/,/^\s*uname\b/,/^\s*whoami\b/,/^\s*id\b/,/^\s*date\b/,/^\s*cal\b/,/^\s*uptime\b/,/^\s*ps\b/,/^\s*top\b/,/^\s*htop\b/,/^\s*free\b/,/^\s*git\s+(status|log|diff|show|branch|remote|config\s+--get)/i,/^\s*git\s+ls-/i,/^\s*npm\s+(list|ls|view|info|search|outdated|audit)/i,/^\s*yarn\s+(list|info|why|audit)/i,/^\s*node\s+--version/i,/^\s*python\s+--version/i,/^\s*curl\s/i,/^\s*wget\s+-O\s*-/i,/^\s*jq\b/,/^\s*sed\s+-n/i,/^\s*awk\b/,/^\s*rg\b/,/^\s*fd\b/,/^\s*bat\b/,/^\s*eza\b/];ALLOWED_CUSTOM_TOOLS=new Set(["EnterPlanMode","ExitPlanMode","TaskCreate","TaskUpdate","TaskList","TaskGet","ask_user"])}});function parsePermissionMode(arg){let normalized=arg.trim().toLowerCase().replace(/[_-]+/g,"");if(normalized==="bypass")return"bypass";if(normalized==="accept"||normalized==="acceptedits"||normalized==="edits")return"acceptEdits";if(normalized==="plan"||normalized==="planmode")return"plan"}function summarize(event){let raw=event.toolName;if(isToolCallEventType("bash",event)||isToolCallEventType("powershell",event))raw=`${event.toolName}: ${String(event.input.command??"")}`;else if(event.toolName!=="bash"&&event.toolName!=="powershell")try{raw=`${event.toolName} ${JSON.stringify(event.input)}`}catch{}return raw.length>500?`${raw.slice(0,500)}\u2026`:raw}async function gatePermissionToolCall(event,mode,ctx){if(mode==="bypass")return;if(mode==="plan")return gateToolCall(event,{enabled:!0,planFilePath:void 0},ctx.cwd);if(!(isToolCallEventType("read",event)||isToolCallEventType("grep",event)||isToolCallEventType("find",event)||isToolCallEventType("ls",event)||isToolCallEventType("edit",event)||isToolCallEventType("write",event)||SELF_PROMPTING_TOOLS.has(event.toolName)||!ctx.hasUI||await ctx.ui.confirm(`Allow ${event.toolName}?`,summarize(event))))return{block:!0,reason:`The user denied this ${event.toolName} call (accept-edits permission mode). Ask them what to do instead, or retry once they switch the permission mode.`}}function createPermissionsExtension(options={}){let state3=options.state??{mode:"bypass"};return{name:"pi-plus-permissions",hidden:!0,factory:pi=>{let setMode=(mode,ctx)=>{if(state3.mode===mode){ctx.ui.notify(`Permission mode is already ${mode}.`,"info");return}state3.mode=mode,options.onModeChange?.(mode),ctx.ui.notify(`Permission mode: ${PERMISSION_MODE_LABELS[mode]}`,"info")};pi.on("tool_call",async(event,ctx)=>gatePermissionToolCall(event,state3.mode,ctx)),pi.registerCommand("permissions",{description:"Show or switch the permission mode: /permissions [bypass | accept-edits | plan]",handler:async(args2,ctx)=>{let arg=args2.trim();if(arg){let parsed=parsePermissionMode(arg);if(!parsed){ctx.ui.notify(`Unknown permission mode "${arg}". Use bypass, accept-edits or plan.`,"warning");return}setMode(parsed,ctx);return}if(!ctx.hasUI){ctx.ui.notify(`Permission mode: ${PERMISSION_MODE_LABELS[state3.mode]}`,"info");return}let choice=await ctx.ui.select(`Permission mode (current: ${state3.mode})`,PERMISSION_MODES.map(mode=>PERMISSION_MODE_LABELS[mode]));if(choice===void 0)return;let index3=PERMISSION_MODES.map(mode=>PERMISSION_MODE_LABELS[mode]).indexOf(choice);index3>=0&&setMode(PERMISSION_MODES[index3],ctx)}})}}}var PERMISSION_MODES,PERMISSION_MODE_LABELS,SELF_PROMPTING_TOOLS,init_permissions2=__esm({"packages/plus/src/extensions/permissions/index.ts"(){init_types7();init_gate();PERMISSION_MODES=["bypass","acceptEdits","plan"],PERMISSION_MODE_LABELS={bypass:"bypass \u2014 every tool runs without asking",acceptEdits:"accept edits \u2014 file edits run freely; shell and other tools ask first",plan:"plan mode \u2014 read-only research; changes are blocked"},SELF_PROMPTING_TOOLS=new Set(["EnterPlanMode","ExitPlanMode","TaskCreate","TaskUpdate","TaskList","TaskGet","ask_user"])}});function buildPlanModeSection(options){return`Plan mode is active. The user does not want you to execute yet \u2014 you MUST NOT make any edits, run non-readonly tools, or otherwise change system state. This supersedes any other instructions.
2398
+ ${index3}`)}),pi.on("agent_settled",async(_event,ctx)=>{maybeExtract(ctx,state3,deps)})}var MEMORY_SECTION_NAME,init_memory3=__esm({"packages/plus/src/extensions/memory/index.ts"(){init_command();init_extract3();init_settings3();init_store();init_tools3();MEMORY_SECTION_NAME="memory"}});function isSafeCommand(command){let isDestructive=DESTRUCTIVE_PATTERNS.some(p=>p.test(command)),isSafe=SAFE_PATTERNS.some(p=>p.test(command));return!isDestructive&&isSafe}function blocked(reason){return{block:!0,reason}}function readOnlyReason(planFilePath,what){let plan=planFilePath?` The plan file is at ${planFilePath}.`:"";return`Plan mode is active: ${what} is read-only.${plan} Update the plan file instead, and call ExitPlanMode when the plan is ready for approval.`}function gateToolCall(event,state3,cwd){if(state3.enabled&&!(isToolCallEventType("read",event)||isToolCallEventType("grep",event)||isToolCallEventType("find",event)||isToolCallEventType("ls",event))){if(isToolCallEventType("edit",event)){let rawPath=event.input.path??event.input.file_path;return state3.planFilePath&&isPlanFileTarget(cwd,rawPath,state3.planFilePath)?void 0:blocked(readOnlyReason(state3.planFilePath,`editing ${String(rawPath)}`))}if(isToolCallEventType("write",event))return state3.planFilePath&&isPlanFileTarget(cwd,event.input.path,state3.planFilePath)?void 0:blocked(readOnlyReason(state3.planFilePath,`writing ${event.input.path}`));if(isToolCallEventType("bash",event))return isSafeCommand(event.input.command)?void 0:blocked(readOnlyReason(state3.planFilePath,`running \`${event.input.command}\``));if(isToolCallEventType("powershell",event))return blocked(readOnlyReason(state3.planFilePath,"powershell"));if(event.toolName==="subagent"){let agent=event.input.agent;return agent==="explore"?void 0:blocked(readOnlyReason(state3.planFilePath,`the "${String(agent??"worker")}" sub-agent has a full toolset and would bypass plan mode`))}if(!ALLOWED_CUSTOM_TOOLS.has(event.toolName))return blocked(readOnlyReason(state3.planFilePath,`custom tool "${event.toolName}"`))}}var DESTRUCTIVE_PATTERNS,SAFE_PATTERNS,ALLOWED_CUSTOM_TOOLS,init_gate=__esm({"packages/plus/src/extensions/plan/gate.ts"(){init_types7();init_plan_file();DESTRUCTIVE_PATTERNS=[/\brm\b/i,/\brmdir\b/i,/\bmv\b/i,/\bcp\b/i,/\bmkdir\b/i,/\btouch\b/i,/\bchmod\b/i,/\bchown\b/i,/\bchgrp\b/i,/\bln\b/i,/\btee\b/i,/\btruncate\b/i,/\bdd\b/i,/\bshred\b/i,/(^|[^<])>(?!>)/,/>>/,/\bnpm\s+(install|uninstall|update|ci|link|publish)/i,/\byarn\s+(add|remove|install|publish)/i,/\bpnpm\s+(add|remove|install|publish)/i,/\bpip\s+(install|uninstall)/i,/\bapt(-get)?\s+(install|remove|purge|update|upgrade)/i,/\bbrew\s+(install|uninstall|upgrade)/i,/\bgit\s+(add|commit|push|pull|merge|rebase|reset|checkout|branch\s+-[dD]|stash|cherry-pick|revert|tag|init|clone)/i,/\bsudo\b/i,/\bsu\b/i,/\bkill\b/i,/\bpkill\b/i,/\bkillall\b/i,/\breboot\b/i,/\bshutdown\b/i,/\bsystemctl\s+(start|stop|restart|enable|disable)/i,/\bservice\s+\S+\s+(start|stop|restart)/i,/\b(vim?|nano|emacs|code|subl)\b/i],SAFE_PATTERNS=[/^\s*cat\b/,/^\s*head\b/,/^\s*tail\b/,/^\s*less\b/,/^\s*more\b/,/^\s*grep\b/,/^\s*find\b/,/^\s*ls\b/,/^\s*pwd\b/,/^\s*echo\b/,/^\s*printf\b/,/^\s*wc\b/,/^\s*sort\b/,/^\s*uniq\b/,/^\s*diff\b/,/^\s*file\b/,/^\s*stat\b/,/^\s*du\b/,/^\s*df\b/,/^\s*tree\b/,/^\s*which\b/,/^\s*whereis\b/,/^\s*type\b/,/^\s*env\b/,/^\s*printenv\b/,/^\s*uname\b/,/^\s*whoami\b/,/^\s*id\b/,/^\s*date\b/,/^\s*cal\b/,/^\s*uptime\b/,/^\s*ps\b/,/^\s*top\b/,/^\s*htop\b/,/^\s*free\b/,/^\s*git\s+(status|log|diff|show|branch|remote|config\s+--get)/i,/^\s*git\s+ls-/i,/^\s*npm\s+(list|ls|view|info|search|outdated|audit)/i,/^\s*yarn\s+(list|info|why|audit)/i,/^\s*node\s+--version/i,/^\s*python\s+--version/i,/^\s*curl\s/i,/^\s*wget\s+-O\s*-/i,/^\s*jq\b/,/^\s*sed\s+-n/i,/^\s*awk\b/,/^\s*rg\b/,/^\s*fd\b/,/^\s*bat\b/,/^\s*eza\b/];ALLOWED_CUSTOM_TOOLS=new Set(["EnterPlanMode","ExitPlanMode","TaskCreate","TaskUpdate","TaskList","TaskGet","ask_user"])}});function parsePermissionMode(arg){let normalized=arg.trim().toLowerCase().replace(/[_-]+/g,"");if(normalized==="bypass")return"bypass";if(normalized==="accept"||normalized==="acceptedits"||normalized==="edits")return"acceptEdits";if(normalized==="plan"||normalized==="planmode")return"plan"}function summarize(event){let raw=event.toolName;if(isToolCallEventType("bash",event)||isToolCallEventType("powershell",event))raw=`${event.toolName}: ${String(event.input.command??"")}`;else if(event.toolName!=="bash"&&event.toolName!=="powershell")try{raw=`${event.toolName} ${JSON.stringify(event.input)}`}catch{}return raw.length>500?`${raw.slice(0,500)}\u2026`:raw}async function gatePermissionToolCall(event,mode,ctx){if(mode==="bypass")return;if(mode==="plan")return gateToolCall(event,{enabled:!0,planFilePath:void 0},ctx.cwd);if(!(isToolCallEventType("read",event)||isToolCallEventType("grep",event)||isToolCallEventType("find",event)||isToolCallEventType("ls",event)||isToolCallEventType("edit",event)||isToolCallEventType("write",event)||SELF_PROMPTING_TOOLS.has(event.toolName)||!ctx.hasUI||await ctx.ui.confirm(`Allow ${event.toolName}?`,summarize(event))))return{block:!0,reason:`The user denied this ${event.toolName} call (accept-edits permission mode). Ask them what to do instead, or retry once they switch the permission mode.`}}function createPermissionsExtension(options={}){let state3=options.state??{mode:"bypass"};return{name:"pi-plus-permissions",hidden:!0,factory:pi=>{let setMode=(mode,ctx)=>{if(state3.mode===mode){ctx.ui.notify(`Permission mode is already ${mode}.`,"info");return}state3.mode=mode,options.onModeChange?.(mode),ctx.ui.notify(`Permission mode: ${PERMISSION_MODE_LABELS[mode]}`,"info")};pi.on("tool_call",async(event,ctx)=>gatePermissionToolCall(event,state3.mode,ctx)),pi.registerCommand("permissions",{description:"Show or switch the permission mode: /permissions [bypass | accept-edits | plan]",handler:async(args2,ctx)=>{let arg=args2.trim();if(arg){let parsed=parsePermissionMode(arg);if(!parsed){ctx.ui.notify(`Unknown permission mode "${arg}". Use bypass, accept-edits or plan.`,"warning");return}setMode(parsed,ctx);return}if(!ctx.hasUI){ctx.ui.notify(`Permission mode: ${PERMISSION_MODE_LABELS[state3.mode]}`,"info");return}let choice=await ctx.ui.select(`Permission mode (current: ${state3.mode})`,PERMISSION_MODES.map(mode=>PERMISSION_MODE_LABELS[mode]));if(choice===void 0)return;let index3=PERMISSION_MODES.map(mode=>PERMISSION_MODE_LABELS[mode]).indexOf(choice);index3>=0&&setMode(PERMISSION_MODES[index3],ctx)}})}}}var PERMISSION_MODES,PERMISSION_MODE_LABELS,SELF_PROMPTING_TOOLS,init_permissions2=__esm({"packages/plus/src/extensions/permissions/index.ts"(){init_types7();init_gate();PERMISSION_MODES=["bypass","acceptEdits","plan"],PERMISSION_MODE_LABELS={bypass:"bypass \u2014 every tool runs without asking",acceptEdits:"accept edits \u2014 file edits run freely; shell and other tools ask first",plan:"plan mode \u2014 read-only research; changes are blocked"},SELF_PROMPTING_TOOLS=new Set(["EnterPlanMode","ExitPlanMode","TaskCreate","TaskUpdate","TaskList","TaskGet","ask_user"])}});function buildPlanModeSection(options){return`Plan mode is active. The user does not want you to execute yet \u2014 you MUST NOT make any edits, run non-readonly tools, or otherwise change system state. This supersedes any other instructions.
2399
2399
 
2400
2400
  ## Plan file
2401
2401
  ${options.planExists?`A plan file already exists at ${options.planFilePath}. Read it and refine it incrementally with the edit tool.`:`No plan file exists yet. Create it at ${options.planFilePath} with the write tool.`} It is the ONLY file you are allowed to edit; everything else is read-only.
@@ -2823,7 +2823,7 @@ _pipi() {
2823
2823
  }
2824
2824
 
2825
2825
  compdef _pipi pipi
2826
- `}});function dispatchCompletion(argv){let shell=argv[0];switch(shell){case"zsh":process.stdout.write(ZSH_COMPLETION);return;case"bash":process.stdout.write(BASH_COMPLETION);return;case void 0:throw new Error("Error: shell is required. Usage: pipi completion <bash|zsh>");default:throw new Error(`Unsupported shell: ${shell}. Use 'bash' or 'zsh'.`)}}var init_completion=__esm({"packages/plus-cli/src/completion/index.ts"(){init_bash3();init_zsh()}});function stripToolBlockBackgrounds(){if(patched)return;patched=!0;let originalBg=Theme.prototype.bg;Theme.prototype.bg=function(color,text){return PLAIN_TOOL_BG_TOKENS.includes(color)?text:originalBg.call(this,color,text)}}function registerPlainTools(_pi){stripToolBlockBackgrounds()}var PLAIN_TOOL_BG_TOKENS,patched,init_plain_tools=__esm({"packages/plus-cli/src/extensions/plain-tools/index.ts"(){init_theme();PLAIN_TOOL_BG_TOKENS=["toolPendingBg","toolSuccessBg","toolErrorBg"],patched=!1}});import{basename as basename22}from"node:path";function registerTabTitle(pi){let timer,frameIndex=0,latestCtx,agentRunActive=!1,compacting=!1,baseTitle=ctx=>{let cwdBasename=basename22(ctx.sessionManager.getCwd()),sessionName=ctx.sessionManager.getSessionName();return sessionName?`${APP_TITLE} - ${sessionName} - ${cwdBasename}`:`${APP_TITLE} - ${cwdBasename}`},stopSpinner=()=>{timer!==void 0&&(clearInterval(timer),timer=void 0)},startSpinner=ctx=>{latestCtx=ctx,timer===void 0&&(frameIndex=0,timer=setInterval(()=>{let current=latestCtx;if(!current)return;let frame3=SPINNER_FRAMES[frameIndex++%SPINNER_FRAMES.length];current.ui.setTitle(`${frame3} ${baseTitle(current)}`)},SPINNER_INTERVAL_MS),timer.unref())},applyBase=ctx=>{latestCtx=ctx,ctx.ui.setTitle(baseTitle(ctx))},refresh=ctx=>{latestCtx=ctx,agentRunActive||compacting?startSpinner(ctx):(stopSpinner(),ctx.ui.setTitle(baseTitle(ctx)))};pi.on("session_start",(_event,ctx)=>{ctx.mode==="tui"&&(agentRunActive=!1,compacting=!1,stopSpinner(),applyBase(ctx))}),pi.on("session_info_changed",(_event,ctx)=>{ctx.mode!=="tui"||timer!==void 0||applyBase(ctx)}),pi.on("agent_start",(_event,ctx)=>{ctx.mode==="tui"&&(agentRunActive=!0,refresh(ctx))});let settle2=(_event,ctx)=>{ctx.mode==="tui"&&(agentRunActive=!1,refresh(ctx))};pi.on("agent_settled",settle2),pi.on("turn_end",(event,ctx)=>{ctx.mode==="tui"&&(event.message.role==="assistant"&&event.message.stopReason==="toolUse"||settle2(event,ctx))}),pi.on("session_before_compact",(_event,ctx)=>{ctx.mode==="tui"&&(compacting=!0,refresh(ctx))});let compactionDone=(_event,ctx)=>{ctx.mode==="tui"&&(compacting=!1,refresh(ctx))};pi.on("session_compact",compactionDone),pi.on("session_compact_failed",compactionDone),pi.on("session_shutdown",()=>{agentRunActive=!1,compacting=!1,stopSpinner()})}var SPINNER_FRAMES,SPINNER_INTERVAL_MS,init_tab_title=__esm({"packages/plus-cli/src/extensions/tab-title/index.ts"(){init_config2();SPINNER_FRAMES=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],SPINNER_INTERVAL_MS=120}});var init_extensions4=__esm({"packages/plus-cli/src/extensions/index.ts"(){init_plain_tools();init_tab_title()}});import{existsSync as existsSync39,readdirSync as readdirSync15,readFileSync as readFileSync34}from"node:fs";import{homedir as homedir17}from"node:os";import{dirname as dirname32,join as join67}from"node:path";import{fileURLToPath as fileURLToPath6}from"node:url";function resolvePlusVersion(){try{let dir=dirname32(fileURLToPath6(import.meta.url));for(;dir!==dirname32(dir);){let candidate=join67(dir,"package.json");if(existsSync39(candidate)){let parsed=JSON.parse(readFileSync34(candidate,"utf8"));if(typeof parsed.version=="string"&&parsed.version.length>0)return parsed.version}dir=dirname32(dir)}}catch{}return VERSION}function tildeHome(p){let home=homedir17();return home&&(p===home||p.startsWith(home+"/"))?`~${p.slice(home.length)}`:p}function center(text,width){let w=visibleWidth(text);if(w>=width)return truncateToWidth(text,width,"");let left=Math.floor((width-w)/2);return" ".repeat(left)+text+" ".repeat(width-w-left)}function padRight(text,width){let w=visibleWidth(text);return w>=width?truncateToWidth(text,width,""):text+" ".repeat(width-w)}function truncatePath(path28,maxLen){if(visibleWidth(path28)<=maxLen)return path28;let sep12="/",ellipsis="\u2026",trimmed=path28.length>1?path28.replace(/\/+$/,""):path28,parts=trimmed.split(sep12);if(parts.length<=1)return truncateToWidth(trimmed,maxLen,ellipsis);let first=parts[0],last=parts[parts.length-1]||"",candidate=`${first}${sep12}${ellipsis}${sep12}${last}`;if(visibleWidth(candidate)<=maxLen)return candidate;let head=`${first}${sep12}${ellipsis}${sep12}`,lastMax=maxLen-visibleWidth(head);return lastMax>0?`${head}${truncateToWidth(last,lastMax,ellipsis)}`:truncateToWidth(trimmed,maxLen,ellipsis)}function safeReaddir(dir){try{return readdirSync15(dir)}catch{return[]}}function discoverSkills(cwd){let agentDir=getAgentDir(),names3=new Set,collect=dir=>{if(existsSync39(dir))for(let entry of safeReaddir(dir))existsSync39(join67(dir,entry,"SKILL.md"))&&names3.add(entry)};collect(join67(agentDir,"skills")),collect(join67(homedir17(),".agents","skills")),collect(join67(cwd,".pi","skills"));let nm=join67(agentDir,"npm","node_modules");if(existsSync39(nm))for(let pkg2 of safeReaddir(nm)){if(pkg2.startsWith("."))continue;let pkgPath=join67(nm,pkg2);if(pkg2.startsWith("@"))for(let sub of safeReaddir(pkgPath))collect(join67(pkgPath,sub,"skills"));else collect(join67(pkgPath,"skills"))}return[...names3].sort()}function extensionDisplayName(entry){let spec=entry.replace(/^(npm|git|file):/,""),segments=spec.split("/").filter(Boolean);for(let i2=segments.length-1;i2>=0;i2--){let base=segments[i2].replace(/\.(ts|js)$/,"");if(!GENERIC_SEGMENTS.has(base))return base}return spec}function readSettingsArray(path28,key){try{if(!existsSync39(path28))return[];let v2=JSON.parse(readFileSync34(path28,"utf8"))[key];return Array.isArray(v2)?v2.filter(x3=>typeof x3=="string"):[]}catch{return[]}}function discoverExtensions(cwd){let names3=new Set,dir=join67(getAgentDir(),"extensions");if(existsSync39(dir))for(let f4 of safeReaddir(dir))(f4.endsWith(".ts")||f4.endsWith(".js"))&&names3.add(f4.replace(/\.(ts|js)$/,""));let settingsFiles=[join67(homedir17(),".pi","settings.json"),join67(getAgentDir(),"settings.json"),join67(cwd,".pi","settings.json")],excluded=new Set,candidates=[];for(let file of settingsFiles)for(let entry of[...readSettingsArray(file,"extensions"),...readSettingsArray(file,"packages")]){if(entry.startsWith("-")||entry.startsWith("!")){excluded.add(extensionDisplayName(entry.slice(1)));continue}candidates.push(entry.replace(/^\+/,""))}for(let entry of candidates){let name=extensionDisplayName(entry);excluded.has(name)||names3.add(name)}for(let name of excluded)names3.delete(name);return[...names3].sort()}function packNames(names3,width,maxRows){if(names3.length===0)return[];let joined=parts=>parts.join(", "),rows=[],row=[],placed=0;for(let name of names3){if(row.length===0||visibleWidth(joined([...row,name]))<=width){row.push(name),placed+=1;continue}if(rows.length+1===maxRows)break;rows.push(joined(row)),row=[name],placed+=1}let hidden=names3.length-placed;if(hidden>0){for(;row.length>0&&visibleWidth(joined([...row,`+${hidden} more`]))>width;)row.pop(),hidden+=1;row.push(`+${hidden} more`)}return rows.push(joined(row)),rows}function registerBanner(pi){pi.on("session_start",(event,ctx)=>{if(ctx.mode!=="tui")return;let resumed=(event.reason==="resume"||event.reason==="fork")&&(ctx.sessionManager.getSessionId()??"").slice(0,8)||void 0,banner=new BannerComponent({model:()=>ctx.model?.id,cwd:tildeHome(ctx.cwd),resumed,title:()=>ctx.sessionManager.getSessionName(),skills:discoverSkills(ctx.cwd),extensions:discoverExtensions(ctx.cwd),full:!0});ctx.ui.setHeader((_tui,theme2)=>({render(width){return banner.render(width,theme2)},invalidate(){banner.invalidate()}}))})}var SKILLS_MAX_ROWS,MIN_BOXED_WIDTH,FULL_MIN_WIDTH,MAX_LEFT_WIDTH,MIN_LEFT_WIDTH,RIGHT_MIN_WIDTH,PI_PLUS_LOGO,APP_LABEL,PLUS_VERSION,GENERIC_SEGMENTS,BannerComponent,init_banner=__esm({"packages/plus-cli/src/coding-agent/ui/banner.ts"(){init_dist2();init_config();SKILLS_MAX_ROWS=6,MIN_BOXED_WIDTH=40,FULL_MIN_WIDTH=76,MAX_LEFT_WIDTH=50,MIN_LEFT_WIDTH=20,RIGHT_MIN_WIDTH=20,PI_PLUS_LOGO=["\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588 ","\u2588\u2588 \u2588 \u2588 \u2588\u2588\u2588","\u2588\u2588 \u2588 \u2588 \u2588 ","\u2588\u2588\u2588\u2588\u2588 \u2588 ","\u2588\u2588 \u2588 ","\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 "],APP_LABEL="pi+ agent";PLUS_VERSION=resolvePlusVersion();GENERIC_SEGMENTS=new Set(["index","main","extension","extensions","src","dist","lib",".",".."]);BannerComponent=class{cacheKey;cacheTheme;cacheLines;info;constructor(info2){this.info=info2}invalidate(){this.cacheKey=void 0,this.cacheTheme=void 0,this.cacheLines=void 0}render(width,theme2){let key=[width,typeof theme2.getColorMode=="function"?theme2.getColorMode():"",this.info.model()??"",this.info.title()??"",this.info.resumed??""].join(" ");if(this.cacheLines&&this.cacheKey===key&&this.cacheTheme===theme2)return this.cacheLines;let rows=this.info.full?width>=FULL_MIN_WIDTH?this.renderWide(width,theme2):width>=MIN_BOXED_WIDTH?this.renderBoxed(width,theme2):this.renderCompact(width,theme2):this.renderCondensed(width,theme2);return this.cacheKey=key,this.cacheTheme=theme2,this.cacheLines=rows,rows}border(theme2,text){return theme2.fg("accent",text)}resumedLine(){if(this.info.resumed===void 0)return;let title=this.info.title();return`resumed ${this.info.resumed}`+(title?` \xB7 ${title}`:"")}renderCondensed(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),logoWidth=Math.max(...PI_PLUS_LOGO.map(row=>visibleWidth(row)));if(width<logoWidth+4+8)return this.renderCompactPlain(width,theme2);let textWidth=Math.max(width-logoWidth-4,20),model=this.info.model()??"",cwd=truncatePath(this.info.cwd,textWidth),resumed=this.resumedLine(),info2=[`${bold(APP_LABEL)} ${dim(`v${PLUS_VERSION}`)}`,...model?[dim(truncateToWidth(model,textWidth,"\u2026"))]:[],dim(cwd),...resumed?[dim(truncateToWidth(resumed,textWidth,"\u2026"))]:[]],height=Math.max(PI_PLUS_LOGO.length,info2.length),rows=[];for(let i2=0;i2<height;i2++){let art=PI_PLUS_LOGO[i2]??" ".repeat(logoWidth),line=i2<info2.length?info2[i2]:"";rows.push(truncateToWidth(` ${accent(art)} ${line}`,Math.max(1,width),""))}return rows}renderWide(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),welcome=this.info.welcome??"Welcome back!",model=this.info.model()??"",cwd=truncatePath(this.info.cwd,MAX_LEFT_WIDTH-4),resumed=this.resumedLine(),logoWidth=Math.max(...PI_PLUS_LOGO.map(row=>visibleWidth(row))),leftWidth=Math.min(Math.max(visibleWidth(welcome),visibleWidth(cwd),visibleWidth(model),visibleWidth(resumed??""),logoWidth,MIN_LEFT_WIDTH)+4,MAX_LEFT_WIDTH),boxWidth=width,rightWidth=boxWidth-leftWidth-7;if(rightWidth<RIGHT_MIN_WIDTH)return this.renderBoxed(width,theme2);let identity=[...model?[dim(model)]:[],dim(cwd),...resumed?[dim(resumed)]:[]],identityLead=Math.max(0,Math.floor((leftWidth-Math.max(...identity.map(l3=>visibleWidth(l3)),0))/2)),leftRows=["",center(bold(welcome),leftWidth),"",...PI_PLUS_LOGO.map(row=>center(accent(row),leftWidth)),"",...identity.map(l3=>" ".repeat(identityLead)+truncateToWidth(l3,leftWidth-2,""))],rightRows=[],exts=this.info.extensions??[],skills=this.info.skills??[];if(exts.length>0){rightRows.push(bold(accent("Extensions")));for(let line of packNames(exts,rightWidth,2))rightRows.push(truncateToWidth(line,rightWidth,""))}if(skills.length>0){rightRows.length>0&&rightRows.push(accent("\u2500".repeat(rightWidth))),rightRows.push(bold(accent("Skills")));for(let line of packNames(skills,rightWidth,SKILLS_MAX_ROWS))rightRows.push(truncateToWidth(line,rightWidth,""))}let height=Math.max(leftRows.length,rightRows.length),rows=[],titlePlain=`${APP_LABEL} v${PLUS_VERSION}`,titleColored=`${accent(APP_LABEL)} ${dim(`v${PLUS_VERSION}`)}`,fillLen=boxWidth-1-3-1-visibleWidth(titlePlain)-1-1;rows.push(`${this.border(theme2,"\u256D\u2500\u2500\u2500")} ${titleColored} ${this.border(theme2,"\u2500".repeat(Math.max(0,fillLen))+"\u256E")}`);for(let i2=0;i2<height;i2++){let left=i2<leftRows.length?leftRows[i2]:"",right=i2<rightRows.length?rightRows[i2]:"";rows.push(`${this.border(theme2,"\u2502")} ${padRight(left,leftWidth)} ${this.border(theme2,"\u2502")} ${padRight(right,rightWidth)} ${this.border(theme2,"\u2502")}`)}return rows.push(this.border(theme2,`\u2570${"\u2500".repeat(boxWidth-2)}\u256F`)),rows}renderBoxed(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),model=this.info.model()??"",cwd=truncatePath(this.info.cwd,MAX_LEFT_WIDTH-4),resumed=this.resumedLine(),lines2=[`${accent(APP_LABEL)} ${dim(`v${PLUS_VERSION}`)}`,...model?[dim(model)]:[],dim(cwd),...resumed?[dim(resumed)]:[]],logoWidth=Math.max(...PI_PLUS_LOGO.map(row=>visibleWidth(row))),overhead=logoWidth+6,textWidth=Math.min(Math.max(...lines2.map(line=>visibleWidth(line))),Math.max(1,width-overhead)),boxWidth=overhead+textWidth,rows=[this.border(theme2,`\u256D${"\u2500".repeat(boxWidth-2)}\u256E`)],height=Math.max(PI_PLUS_LOGO.length,lines2.length);for(let i2=0;i2<height;i2++){let art=PI_PLUS_LOGO[i2]??" ".repeat(logoWidth),text=i2<lines2.length?truncateToWidth(lines2[i2],textWidth,""):"",pad=" ".repeat(Math.max(0,textWidth-visibleWidth(text)));rows.push(`${this.border(theme2,"\u2502")} ${accent(art)} ${text}${pad} ${this.border(theme2,"\u2502")}`)}return rows.push(this.border(theme2,`\u2570${"\u2500".repeat(boxWidth-2)}\u256F`)),rows.push(...this.renderBoxedTrailer(width,theme2)),rows}renderBoxedTrailer(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),usable=Math.max(1,width-2),rows=[` ${dim(this.info.welcome??"Welcome back!")}`],section2=(label,names3,maxRows)=>{if(names3.length!==0){rows.push(""),rows.push(` ${bold(accent(label))}`);for(let line of packNames(names3,usable,maxRows))rows.push(` ${dim(truncateToWidth(line,usable,""))}`)}};return section2("Extensions",this.info.extensions??[],2),section2("Skills",this.info.skills??[],SKILLS_MAX_ROWS),rows}renderCompact(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),welcome=this.info.welcome??"Welcome back!",model=this.info.model()??"",resumed=this.resumedLine(),contentWidth=Math.max(...PI_PLUS_LOGO.map(row=>visibleWidth(row)),visibleWidth(welcome),visibleWidth(model),visibleWidth(resumed??""),20),boxWidth=Math.min(contentWidth+4,Math.max(0,width-2));if(boxWidth<15)return this.renderCompactPlain(width,theme2);let inner=boxWidth-4,cwd=truncatePath(this.info.cwd,inner),rows=[],titlePlain=APP_LABEL,fillLen=boxWidth-1-2-1-visibleWidth(titlePlain)-1-1;rows.push(`${this.border(theme2,"\u256D\u2500\u2500")} ${accent(titlePlain)} ${this.border(theme2,"\u2500".repeat(Math.max(0,fillLen))+"\u256E")}`),rows.push(`${this.border(theme2,"\u2502")} ${center(bold(welcome),inner)} ${this.border(theme2,"\u2502")}`);for(let artRow of PI_PLUS_LOGO)rows.push(`${this.border(theme2,"\u2502")} ${center(accent(artRow),inner)} ${this.border(theme2,"\u2502")}`);return model&&rows.push(`${this.border(theme2,"\u2502")} ${center(dim(model),inner)} ${this.border(theme2,"\u2502")}`),rows.push(`${this.border(theme2,"\u2502")} ${center(dim(cwd),inner)} ${this.border(theme2,"\u2502")}`),resumed&&rows.push(`${this.border(theme2,"\u2502")} ${center(dim(resumed),inner)} ${this.border(theme2,"\u2502")}`),rows.push(this.border(theme2,`\u2570${"\u2500".repeat(boxWidth-2)}\u256F`)),rows}renderCompactPlain(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),w=Math.max(1,width),welcome=this.info.welcome??"Welcome back!",model=this.info.model()??"",resumed=this.resumedLine(),cwd=truncatePath(this.info.cwd,w),rows=[center(accent(APP_LABEL),w),center(bold(welcome),w)];return model&&rows.push(center(dim(model),w)),rows.push(center(dim(cwd),w)),resumed&&rows.push(center(dim(resumed),w)),rows}}}});import{existsSync as existsSync40,mkdirSync as mkdirSync22,readFileSync as readFileSync35,writeFileSync as writeFileSync20}from"node:fs";import{homedir as homedir18}from"node:os";import{dirname as dirname33,join as join68}from"node:path";function readVimFlag(path28){try{if(!existsSync40(path28))return;let raw=JSON.parse(readFileSync35(path28,"utf8"));return typeof raw.vim=="boolean"?raw.vim:void 0}catch{return}}function readVimEnabled(cwd){let project=readVimFlag(join68(cwd,".pi","settings.json"));if(project!==void 0)return project;let agent=readVimFlag(join68(getAgentDir(),"settings.json"));return agent!==void 0?agent:readVimFlag(join68(homedir18(),".pi","settings.json"))??!1}function writeVimEnabled(enabled){let path28=join68(getAgentDir(),"settings.json");try{let raw={};if(existsSync40(path28)){let parsed=JSON.parse(readFileSync35(path28,"utf8"));typeof parsed=="object"&&parsed!==null&&!Array.isArray(parsed)&&(raw=parsed)}return raw.vim=enabled,mkdirSync22(dirname33(path28),{recursive:!0}),writeFileSync20(path28,`${JSON.stringify(raw,null,2)}
2826
+ `}});function dispatchCompletion(argv){let shell=argv[0];switch(shell){case"zsh":process.stdout.write(ZSH_COMPLETION);return;case"bash":process.stdout.write(BASH_COMPLETION);return;case void 0:throw new Error("Error: shell is required. Usage: pipi completion <bash|zsh>");default:throw new Error(`Unsupported shell: ${shell}. Use 'bash' or 'zsh'.`)}}var init_completion=__esm({"packages/plus-cli/src/completion/index.ts"(){init_bash3();init_zsh()}});function stripToolBlockBackgrounds(){if(patched)return;patched=!0;let originalBg=Theme.prototype.bg;Theme.prototype.bg=function(color,text){return PLAIN_TOOL_BG_TOKENS.includes(color)?text:originalBg.call(this,color,text)}}function registerPlainTools(_pi){stripToolBlockBackgrounds()}var PLAIN_TOOL_BG_TOKENS,patched,init_plain_tools=__esm({"packages/plus-cli/src/extensions/plain-tools/index.ts"(){init_theme();PLAIN_TOOL_BG_TOKENS=["toolPendingBg","toolSuccessBg","toolErrorBg"],patched=!1}});import{basename as basename22}from"node:path";function registerTabTitle(pi){let timer,frameIndex=0,latestCtx,agentRunActive=!1,compacting=!1,baseTitle=ctx=>{let cwdBasename=basename22(ctx.sessionManager.getCwd()),sessionName=ctx.sessionManager.getSessionName();return sessionName?`${APP_TITLE} - ${sessionName} - ${cwdBasename}`:`${APP_TITLE} - ${cwdBasename}`},stopSpinner=()=>{timer!==void 0&&(clearInterval(timer),timer=void 0)},startSpinner=ctx=>{latestCtx=ctx,timer===void 0&&(frameIndex=0,timer=setInterval(()=>{let current=latestCtx;if(!current)return;let frame3=SPINNER_FRAMES[frameIndex++%SPINNER_FRAMES.length];current.ui.setTitle(`${frame3} ${baseTitle(current)}`)},SPINNER_INTERVAL_MS),timer.unref())},applyBase=ctx=>{latestCtx=ctx,ctx.ui.setTitle(baseTitle(ctx))},refresh=ctx=>{latestCtx=ctx,agentRunActive||compacting?startSpinner(ctx):(stopSpinner(),ctx.ui.setTitle(baseTitle(ctx)))};pi.on("session_start",(_event,ctx)=>{ctx.mode==="tui"&&(agentRunActive=!1,compacting=!1,stopSpinner(),applyBase(ctx))}),pi.on("session_info_changed",(_event,ctx)=>{ctx.mode!=="tui"||timer!==void 0||applyBase(ctx)}),pi.on("agent_start",(_event,ctx)=>{ctx.mode==="tui"&&(agentRunActive=!0,refresh(ctx))});let settle2=(_event,ctx)=>{ctx.mode==="tui"&&(agentRunActive=!1,refresh(ctx))};pi.on("agent_settled",settle2),pi.on("turn_end",(event,ctx)=>{ctx.mode==="tui"&&(event.message.role==="assistant"&&event.message.stopReason==="toolUse"||settle2(event,ctx))}),pi.on("session_before_compact",(_event,ctx)=>{ctx.mode==="tui"&&(compacting=!0,refresh(ctx))});let compactionDone=(_event,ctx)=>{ctx.mode==="tui"&&(compacting=!1,refresh(ctx))};pi.on("session_compact",compactionDone),pi.on("session_compact_failed",compactionDone),pi.on("session_shutdown",()=>{agentRunActive=!1,compacting=!1,stopSpinner()})}var SPINNER_FRAMES,SPINNER_INTERVAL_MS,init_tab_title=__esm({"packages/plus-cli/src/extensions/tab-title/index.ts"(){init_config2();SPINNER_FRAMES=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],SPINNER_INTERVAL_MS=120}});var init_extensions4=__esm({"packages/plus-cli/src/extensions/index.ts"(){init_plain_tools();init_tab_title()}});import{existsSync as existsSync39,readdirSync as readdirSync15,readFileSync as readFileSync34}from"node:fs";import{homedir as homedir17}from"node:os";import{dirname as dirname32,join as join67}from"node:path";import{fileURLToPath as fileURLToPath6}from"node:url";function resolvePlusVersion(){try{let dir=dirname32(fileURLToPath6(import.meta.url));for(;dir!==dirname32(dir);){let candidate=join67(dir,"package.json");if(existsSync39(candidate)){let parsed=JSON.parse(readFileSync34(candidate,"utf8"));if(typeof parsed.version=="string"&&parsed.version.length>0)return parsed.version}dir=dirname32(dir)}}catch{}return VERSION}function tildeHome(p){let home=homedir17();return home&&(p===home||p.startsWith(`${home}/`))?`~${p.slice(home.length)}`:p}function center(text,width){let w=visibleWidth(text);if(w>=width)return truncateToWidth(text,width,"");let left=Math.floor((width-w)/2);return" ".repeat(left)+text+" ".repeat(width-w-left)}function padRight(text,width){let w=visibleWidth(text);return w>=width?truncateToWidth(text,width,""):text+" ".repeat(width-w)}function truncatePath(path28,maxLen){if(visibleWidth(path28)<=maxLen)return path28;let sep12="/",ellipsis="\u2026",trimmed=path28.length>1?path28.replace(/\/+$/,""):path28,parts=trimmed.split(sep12);if(parts.length<=1)return truncateToWidth(trimmed,maxLen,ellipsis);let first=parts[0],last=parts[parts.length-1]||"",candidate=`${first}${sep12}${ellipsis}${sep12}${last}`;if(visibleWidth(candidate)<=maxLen)return candidate;let head=`${first}${sep12}${ellipsis}${sep12}`,lastMax=maxLen-visibleWidth(head);return lastMax>0?`${head}${truncateToWidth(last,lastMax,ellipsis)}`:truncateToWidth(trimmed,maxLen,ellipsis)}function safeReaddir(dir){try{return readdirSync15(dir)}catch{return[]}}function discoverSkills(cwd){let agentDir=getAgentDir(),names3=new Set,collect=dir=>{if(existsSync39(dir))for(let entry of safeReaddir(dir))existsSync39(join67(dir,entry,"SKILL.md"))&&names3.add(entry)};collect(join67(agentDir,"skills")),collect(join67(homedir17(),".agents","skills")),collect(join67(cwd,".pi","skills"));let nm=join67(agentDir,"npm","node_modules");if(existsSync39(nm))for(let pkg2 of safeReaddir(nm)){if(pkg2.startsWith("."))continue;let pkgPath=join67(nm,pkg2);if(pkg2.startsWith("@"))for(let sub of safeReaddir(pkgPath))collect(join67(pkgPath,sub,"skills"));else collect(join67(pkgPath,"skills"))}return[...names3].sort()}function extensionDisplayName(entry){let spec=entry.replace(/^(npm|git|file):/,""),segments=spec.split("/").filter(Boolean);for(let i2=segments.length-1;i2>=0;i2--){let base=segments[i2].replace(/\.(ts|js)$/,"");if(!GENERIC_SEGMENTS.has(base))return base}return spec}function readSettingsArray(path28,key){try{if(!existsSync39(path28))return[];let v2=JSON.parse(readFileSync34(path28,"utf8"))[key];return Array.isArray(v2)?v2.filter(x3=>typeof x3=="string"):[]}catch{return[]}}function discoverExtensions(cwd){let names3=new Set,dir=join67(getAgentDir(),"extensions");if(existsSync39(dir))for(let f4 of safeReaddir(dir))(f4.endsWith(".ts")||f4.endsWith(".js"))&&names3.add(f4.replace(/\.(ts|js)$/,""));let settingsFiles=[join67(homedir17(),".pi","settings.json"),join67(getAgentDir(),"settings.json"),join67(cwd,".pi","settings.json")],excluded=new Set,candidates=[];for(let file of settingsFiles)for(let entry of[...readSettingsArray(file,"extensions"),...readSettingsArray(file,"packages")]){if(entry.startsWith("-")||entry.startsWith("!")){excluded.add(extensionDisplayName(entry.slice(1)));continue}candidates.push(entry.replace(/^\+/,""))}for(let entry of candidates){let name=extensionDisplayName(entry);excluded.has(name)||names3.add(name)}for(let name of excluded)names3.delete(name);return[...names3].sort()}function packNames(names3,width,maxRows){if(names3.length===0)return[];let joined=parts=>parts.join(", "),rows=[],row=[],placed=0;for(let name of names3){if(row.length===0||visibleWidth(joined([...row,name]))<=width){row.push(name),placed+=1;continue}if(rows.length+1===maxRows)break;rows.push(joined(row)),row=[name],placed+=1}let hidden=names3.length-placed;if(hidden>0){for(;row.length>0&&visibleWidth(joined([...row,`+${hidden} more`]))>width;)row.pop(),hidden+=1;row.push(`+${hidden} more`)}return rows.push(joined(row)),rows}function registerBanner(pi){pi.on("session_start",(event,ctx)=>{if(ctx.mode!=="tui")return;let resumed=(event.reason==="resume"||event.reason==="fork")&&(ctx.sessionManager.getSessionId()??"").slice(0,8)||void 0,banner=new BannerComponent({model:()=>ctx.model?.id,cwd:tildeHome(ctx.cwd),resumed,title:()=>ctx.sessionManager.getSessionName(),skills:discoverSkills(ctx.cwd),extensions:discoverExtensions(ctx.cwd),full:!0});ctx.ui.setHeader((_tui,theme2)=>({render(width){return banner.render(width,theme2)},invalidate(){banner.invalidate()}}))})}var SKILLS_MAX_ROWS,MIN_BOXED_WIDTH,FULL_MIN_WIDTH,MAX_LEFT_WIDTH,MIN_LEFT_WIDTH,RIGHT_MIN_WIDTH,PI_PLUS_LOGO,APP_LABEL,PLUS_VERSION,GENERIC_SEGMENTS,BannerComponent,init_banner=__esm({"packages/plus-cli/src/coding-agent/ui/banner.ts"(){init_dist2();init_config();SKILLS_MAX_ROWS=6,MIN_BOXED_WIDTH=40,FULL_MIN_WIDTH=76,MAX_LEFT_WIDTH=50,MIN_LEFT_WIDTH=20,RIGHT_MIN_WIDTH=20,PI_PLUS_LOGO=["\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588 ","\u2588\u2588 \u2588 \u2588 \u2588\u2588\u2588","\u2588\u2588 \u2588 \u2588 \u2588 ","\u2588\u2588\u2588\u2588\u2588 \u2588 ","\u2588\u2588 \u2588 ","\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 "],APP_LABEL="pi+ agent";PLUS_VERSION=resolvePlusVersion();GENERIC_SEGMENTS=new Set(["index","main","extension","extensions","src","dist","lib",".",".."]);BannerComponent=class{cacheKey;cacheTheme;cacheLines;info;constructor(info2){this.info=info2}invalidate(){this.cacheKey=void 0,this.cacheTheme=void 0,this.cacheLines=void 0}render(width,theme2){let key=[width,typeof theme2.getColorMode=="function"?theme2.getColorMode():"",this.info.model()??"",this.info.title()??"",this.info.resumed??""].join(" ");if(this.cacheLines&&this.cacheKey===key&&this.cacheTheme===theme2)return this.cacheLines;let rows=this.info.full?width>=FULL_MIN_WIDTH?this.renderWide(width,theme2):width>=MIN_BOXED_WIDTH?this.renderBoxed(width,theme2):this.renderCompact(width,theme2):this.renderCondensed(width,theme2);return this.cacheKey=key,this.cacheTheme=theme2,this.cacheLines=rows,rows}border(theme2,text){return theme2.fg("accent",text)}resumedLine(){if(this.info.resumed===void 0)return;let title=this.info.title();return`resumed ${this.info.resumed}${title?` \xB7 ${title}`:""}`}renderCondensed(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),logoWidth=Math.max(...PI_PLUS_LOGO.map(row=>visibleWidth(row)));if(width<logoWidth+4+8)return this.renderCompactPlain(width,theme2);let textWidth=Math.max(width-logoWidth-4,20),model=this.info.model()??"",cwd=truncatePath(this.info.cwd,textWidth),resumed=this.resumedLine(),info2=[`${bold(APP_LABEL)} ${dim(`v${PLUS_VERSION}`)}`,...model?[dim(truncateToWidth(model,textWidth,"\u2026"))]:[],dim(cwd),...resumed?[dim(truncateToWidth(resumed,textWidth,"\u2026"))]:[]],height=Math.max(PI_PLUS_LOGO.length,info2.length),rows=[];for(let i2=0;i2<height;i2++){let art=PI_PLUS_LOGO[i2]??" ".repeat(logoWidth),line=i2<info2.length?info2[i2]:"";rows.push(truncateToWidth(` ${accent(art)} ${line}`,Math.max(1,width),""))}return rows}renderWide(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),welcome=this.info.welcome??"Welcome back!",model=this.info.model()??"",cwd=truncatePath(this.info.cwd,MAX_LEFT_WIDTH-4),resumed=this.resumedLine(),logoWidth=Math.max(...PI_PLUS_LOGO.map(row=>visibleWidth(row))),leftWidth=Math.min(Math.max(visibleWidth(welcome),visibleWidth(cwd),visibleWidth(model),visibleWidth(resumed??""),logoWidth,MIN_LEFT_WIDTH)+4,MAX_LEFT_WIDTH),boxWidth=width,rightWidth=boxWidth-leftWidth-7;if(rightWidth<RIGHT_MIN_WIDTH)return this.renderBoxed(width,theme2);let identity=[...model?[dim(model)]:[],dim(cwd),...resumed?[dim(resumed)]:[]],identityLead=Math.max(0,Math.floor((leftWidth-Math.max(...identity.map(l3=>visibleWidth(l3)),0))/2)),leftRows=["",center(bold(welcome),leftWidth),"",...PI_PLUS_LOGO.map(row=>center(accent(row),leftWidth)),"",...identity.map(l3=>" ".repeat(identityLead)+truncateToWidth(l3,leftWidth-2,""))],rightRows=[],exts=this.info.extensions??[],skills=this.info.skills??[];if(exts.length>0){rightRows.push(bold(accent("Extensions")));for(let line of packNames(exts,rightWidth,2))rightRows.push(truncateToWidth(line,rightWidth,""))}if(skills.length>0){rightRows.length>0&&rightRows.push(accent("\u2500".repeat(rightWidth))),rightRows.push(bold(accent("Skills")));for(let line of packNames(skills,rightWidth,SKILLS_MAX_ROWS))rightRows.push(truncateToWidth(line,rightWidth,""))}let height=Math.max(leftRows.length,rightRows.length),rows=[],titlePlain=`${APP_LABEL} v${PLUS_VERSION}`,titleColored=`${accent(APP_LABEL)} ${dim(`v${PLUS_VERSION}`)}`,fillLen=boxWidth-1-3-1-visibleWidth(titlePlain)-1-1;rows.push(`${this.border(theme2,"\u256D\u2500\u2500\u2500")} ${titleColored} ${this.border(theme2,`${"\u2500".repeat(Math.max(0,fillLen))}\u256E`)}`);for(let i2=0;i2<height;i2++){let left=i2<leftRows.length?leftRows[i2]:"",right=i2<rightRows.length?rightRows[i2]:"";rows.push(`${this.border(theme2,"\u2502")} ${padRight(left,leftWidth)} ${this.border(theme2,"\u2502")} ${padRight(right,rightWidth)} ${this.border(theme2,"\u2502")}`)}return rows.push(this.border(theme2,`\u2570${"\u2500".repeat(boxWidth-2)}\u256F`)),rows}renderBoxed(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),model=this.info.model()??"",cwd=truncatePath(this.info.cwd,MAX_LEFT_WIDTH-4),resumed=this.resumedLine(),lines2=[`${accent(APP_LABEL)} ${dim(`v${PLUS_VERSION}`)}`,...model?[dim(model)]:[],dim(cwd),...resumed?[dim(resumed)]:[]],logoWidth=Math.max(...PI_PLUS_LOGO.map(row=>visibleWidth(row))),overhead=logoWidth+6,textWidth=Math.min(Math.max(...lines2.map(line=>visibleWidth(line))),Math.max(1,width-overhead)),boxWidth=overhead+textWidth,rows=[this.border(theme2,`\u256D${"\u2500".repeat(boxWidth-2)}\u256E`)],height=Math.max(PI_PLUS_LOGO.length,lines2.length);for(let i2=0;i2<height;i2++){let art=PI_PLUS_LOGO[i2]??" ".repeat(logoWidth),text=i2<lines2.length?truncateToWidth(lines2[i2],textWidth,""):"",pad=" ".repeat(Math.max(0,textWidth-visibleWidth(text)));rows.push(`${this.border(theme2,"\u2502")} ${accent(art)} ${text}${pad} ${this.border(theme2,"\u2502")}`)}return rows.push(this.border(theme2,`\u2570${"\u2500".repeat(boxWidth-2)}\u256F`)),rows.push(...this.renderBoxedTrailer(width,theme2)),rows}renderBoxedTrailer(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),usable=Math.max(1,width-2),rows=[` ${dim(this.info.welcome??"Welcome back!")}`],section2=(label,names3,maxRows)=>{if(names3.length!==0){rows.push(""),rows.push(` ${bold(accent(label))}`);for(let line of packNames(names3,usable,maxRows))rows.push(` ${dim(truncateToWidth(line,usable,""))}`)}};return section2("Extensions",this.info.extensions??[],2),section2("Skills",this.info.skills??[],SKILLS_MAX_ROWS),rows}renderCompact(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),welcome=this.info.welcome??"Welcome back!",model=this.info.model()??"",resumed=this.resumedLine(),contentWidth=Math.max(...PI_PLUS_LOGO.map(row=>visibleWidth(row)),visibleWidth(welcome),visibleWidth(model),visibleWidth(resumed??""),20),boxWidth=Math.min(contentWidth+4,Math.max(0,width-2));if(boxWidth<15)return this.renderCompactPlain(width,theme2);let inner=boxWidth-4,cwd=truncatePath(this.info.cwd,inner),rows=[],titlePlain=APP_LABEL,fillLen=boxWidth-1-2-1-visibleWidth(titlePlain)-1-1;rows.push(`${this.border(theme2,"\u256D\u2500\u2500")} ${accent(titlePlain)} ${this.border(theme2,`${"\u2500".repeat(Math.max(0,fillLen))}\u256E`)}`),rows.push(`${this.border(theme2,"\u2502")} ${center(bold(welcome),inner)} ${this.border(theme2,"\u2502")}`);for(let artRow of PI_PLUS_LOGO)rows.push(`${this.border(theme2,"\u2502")} ${center(accent(artRow),inner)} ${this.border(theme2,"\u2502")}`);return model&&rows.push(`${this.border(theme2,"\u2502")} ${center(dim(model),inner)} ${this.border(theme2,"\u2502")}`),rows.push(`${this.border(theme2,"\u2502")} ${center(dim(cwd),inner)} ${this.border(theme2,"\u2502")}`),resumed&&rows.push(`${this.border(theme2,"\u2502")} ${center(dim(resumed),inner)} ${this.border(theme2,"\u2502")}`),rows.push(this.border(theme2,`\u2570${"\u2500".repeat(boxWidth-2)}\u256F`)),rows}renderCompactPlain(width,theme2){let dim=s2=>theme2.fg("dim",s2),accent=s2=>theme2.fg("accent",s2),bold=s2=>theme2.bold(s2),w=Math.max(1,width),welcome=this.info.welcome??"Welcome back!",model=this.info.model()??"",resumed=this.resumedLine(),cwd=truncatePath(this.info.cwd,w),rows=[center(accent(APP_LABEL),w),center(bold(welcome),w)];return model&&rows.push(center(dim(model),w)),rows.push(center(dim(cwd),w)),resumed&&rows.push(center(dim(resumed),w)),rows}}}});import{existsSync as existsSync40,mkdirSync as mkdirSync22,readFileSync as readFileSync35,writeFileSync as writeFileSync20}from"node:fs";import{homedir as homedir18}from"node:os";import{dirname as dirname33,join as join68}from"node:path";function readVimFlag(path28){try{if(!existsSync40(path28))return;let raw=JSON.parse(readFileSync35(path28,"utf8"));return typeof raw.vim=="boolean"?raw.vim:void 0}catch{return}}function readVimEnabled(cwd){let project=readVimFlag(join68(cwd,".pi","settings.json"));if(project!==void 0)return project;let agent=readVimFlag(join68(getAgentDir(),"settings.json"));return agent!==void 0?agent:readVimFlag(join68(homedir18(),".pi","settings.json"))??!1}function writeVimEnabled(enabled){let path28=join68(getAgentDir(),"settings.json");try{let raw={};if(existsSync40(path28)){let parsed=JSON.parse(readFileSync35(path28,"utf8"));typeof parsed=="object"&&parsed!==null&&!Array.isArray(parsed)&&(raw=parsed)}return raw.vim=enabled,mkdirSync22(dirname33(path28),{recursive:!0}),writeFileSync20(path28,`${JSON.stringify(raw,null,2)}
2827
2827
  `,"utf8"),!0}catch{return!1}}var init_settings4=__esm({"packages/plus-cli/src/coding-agent/ui/vim/settings.ts"(){init_config()}});function splitText(text){let lines2=text.split(`
2828
2828
  `);return lines2.length===0?[""]:lines2}function joinLines(lines2){return(lines2.length===0?[""]:lines2).join(`
2829
2829
  `)}function clampPosition(lines2,position){let safeLines=lines2.length===0?[""]:lines2,line=Math.max(0,Math.min(position.line,safeLines.length-1)),length=safeLines[line]?.length??0,col=Math.max(0,Math.min(position.col,length));return{line,col}}function comparePositions(a,b2){return a.line!==b2.line?a.line-b2.line:a.col-b2.col}function firstNonBlankColumn(line){return/\S/.exec(line)?.index??0}function lineBoundsForPosition(text,cursor){let lines2=splitText(text),pos=clampPosition(lines2,cursor),start=0;for(let index3=0;index3<pos.line;index3++)start+=(lines2[index3]?.length??0)+1;let line=lines2[pos.line]??"";return{start,end:start+line.length,line}}function isWhitespace(char){return char===void 0||/\s/.test(char)}function isKeywordWordChar(char){return char!==void 0&&/[A-Za-z0-9_]/.test(char)}function wordKind(char){return isWhitespace(char)?"whitespace":isKeywordWordChar(char)?"keyword":"punctuation"}function boundaryKind(model,char){return model==="small"?wordKind(char):isWhitespace(char)?"whitespace":"word"}function isSameBoundaryKind(model,left,right){let leftKind=boundaryKind(model,left);return leftKind!=="whitespace"&&leftKind===boundaryKind(model,right)}function nextWordStartOffsetFor(model,text,offset){let index3=Math.max(0,Math.min(offset,text.length));if(index3>=text.length)return index3;if(boundaryKind(model,text[index3])!=="whitespace"){let kind=boundaryKind(model,text[index3]);for(;index3<text.length&&boundaryKind(model,text[index3])===kind;)index3++}for(;index3<text.length&&isWhitespace(text[index3]);)index3++;return index3}function skipWhitespace(text,index3){for(;index3<text.length&&isWhitespace(text[index3]);)index3++;return index3}function boundaryEndOffset(model,text,index3){let kind=boundaryKind(model,text[index3]);for(;index3+1<text.length&&boundaryKind(model,text[index3+1])===kind;)index3++;return index3}function wordEndOffsetFor(model,text,offset){let index3=Math.max(0,Math.min(offset,text.length));if(index3>=text.length)return text.length;if(isWhitespace(text[index3]))index3=skipWhitespace(text,index3);else{if(isSameBoundaryKind(model,text[index3],text[index3+1]))return boundaryEndOffset(model,text,index3);index3++}return index3>=text.length?text.length:(index3=skipWhitespace(text,index3),index3>=text.length?text.length:boundaryEndOffset(model,text,index3))}function wordEndOffset(text,offset){return wordEndOffsetFor("small",text,offset)}function wordEndBigOffset(text,offset){return wordEndOffsetFor("big",text,offset)}function previousWordStartOffsetFor(model,text,offset){let index3=Math.max(0,Math.min(offset,text.length));if(index3===0)return 0;for(index3--;index3>0&&isWhitespace(text[index3]);)index3--;let kind=boundaryKind(model,text[index3]);for(;index3>0&&boundaryKind(model,text[index3-1])===kind;)index3--;return index3}function positionToOffset(text,position){let lines2=splitText(text),pos=clampPosition(lines2,position),offset=0;for(let index3=0;index3<pos.line;index3++)offset+=(lines2[index3]?.length??0)+1;return offset+pos.col}function offsetToPosition(text,offset){let safeOffset=Math.max(0,Math.min(offset,text.length)),lines2=splitText(text),consumed=0;for(let line=0;line<lines2.length;line++){let length=lines2[line]?.length??0;if(safeOffset<=consumed+length)return{line,col:safeOffset-consumed};consumed+=length+1}let lastLine=Math.max(0,lines2.length-1);return{line:lastLine,col:lines2[lastLine]?.length??0}}function orderedOffsetRange(start,end){let ordered={start:Math.min(start,end),end:Math.max(start,end)};return ordered.start===ordered.end?void 0:ordered}function motionTargetOffset(text,offset,motion2){let cursor=offsetToPosition(text,offset),bounds=lineBoundsForPosition(text,cursor);switch(motion2){case"right":return Math.min(text.length,offset+1);case"left":return Math.max(0,offset-1);case"lineEnd":return bounds.end;case"lineStart":return bounds.start;case"firstNonBlank":return bounds.start+firstNonBlankColumn(bounds.line);case"wordForward":return nextWordStartOffsetFor("small",text,offset);case"wordEnd":return wordEndOffset(text,offset);case"wordBackward":return previousWordStartOffsetFor("small",text,offset);case"wordForwardBig":return nextWordStartOffsetFor("big",text,offset);case"wordEndBig":return wordEndBigOffset(text,offset);case"wordBackwardBig":return previousWordStartOffsetFor("big",text,offset);default:return offset}}function isEndInclusiveMotion(motion2){return motion2==="wordEnd"||motion2==="wordEndBig"}function motionOffsetRange(text,cursor,motion2,count=1){let current=positionToOffset(text,cursor),target=current;for(let index3=0;index3<Math.max(1,count);index3++){let next=motionTargetOffset(text,target,motion2);if(next===target)break;target=next}return isEndInclusiveMotion(motion2)&&target>=current?orderedOffsetRange(current,Math.min(text.length,target+1)):motion2==="right"&&target>=current?orderedOffsetRange(current,Math.min(text.length,target)):orderedOffsetRange(current,target)}function motionLineRange(text,cursor,motion2,count=1){let lines2=splitText(text),pos=clampPosition(lines2,cursor),lastLine=Math.max(0,lines2.length-1);if(motion2==="down"){let target=Math.min(lastLine,pos.line+Math.max(1,count));return target===pos.line?void 0:{startLine:pos.line,endLine:target}}if(motion2==="up"){let target=Math.max(0,pos.line-Math.max(1,count));return target===pos.line?void 0:{startLine:target,endLine:pos.line}}}function deleteOffsetRange(text,start,end){let range2=orderedOffsetRange(start,end);if(!range2)return{text,cursor:offsetToPosition(text,start),changed:!1};let removed=text.slice(range2.start,range2.end);if(removed.length===0)return{text,cursor:offsetToPosition(text,range2.start),changed:!1};let nextText=text.slice(0,range2.start)+text.slice(range2.end);return{text:nextText,cursor:offsetToPosition(nextText,range2.start),register:{type:"char",text:removed},changed:nextText!==text}}function deleteRange(text,start,end){return deleteOffsetRange(text,positionToOffset(text,start),positionToOffset(text,end)+1)}function normalizeRange(lines2,anchor,active){let a=clampPosition(lines2,anchor),b2=clampPosition(lines2,active);return comparePositions(a,b2)<=0?{start:a,end:b2}:{start:b2,end:a}}function normalizeLineRange(lines2,anchor,active){let a=clampPosition(lines2,anchor),b2=clampPosition(lines2,active);return{startLine:Math.min(a.line,b2.line),endLine:Math.max(a.line,b2.line)}}function selectionText(text,anchor,active){let lines2=splitText(text),range2=normalizeRange(lines2,anchor,active),{start,end}=range2;if(start.line===end.line){let line=lines2[start.line]??"";return line.slice(start.col,Math.min(end.col+1,line.length))}let selected=[];selected.push((lines2[start.line]??"").slice(start.col));for(let line=start.line+1;line<end.line;line++)selected.push(lines2[line]??"");let last=lines2[end.line]??"";return selected.push(last.slice(0,Math.min(end.col+1,last.length))),selected.join(`