@astralyn/pi 0.87.2 → 0.87.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/bundle/chunks/{chunk-NBIUJDV6.js → chunk-MJ45I4SM.js} +1 -1
- package/dist/bundle/chunks/{chunk-RFLBIA5Z.js → chunk-TYOQD6VQ.js} +33 -20
- package/dist/bundle/chunks/{virtual-modules-GOHLE5JL.js → virtual-modules-NDGCHNG7.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +114 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/extensions/background/actions.d.ts.map +1 -1
- package/dist/extensions/background/actions.js +107 -55
- package/dist/extensions/background/actions.js.map +1 -1
- package/dist/extensions/background/index.js +3 -3
- package/dist/extensions/background/index.js.map +1 -1
- package/dist/extensions/question/index.d.ts.map +1 -1
- package/dist/extensions/question/index.js +3 -1
- package/dist/extensions/question/index.js.map +1 -1
- package/dist/extensions/question/schema.d.ts +18 -0
- package/dist/extensions/question/schema.d.ts.map +1 -1
- package/dist/extensions/question/schema.js +52 -0
- package/dist/extensions/question/schema.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +3 -1
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/resolve.d.ts +14 -1
- package/dist/extensions/subagent/resolve.d.ts.map +1 -1
- package/dist/extensions/subagent/resolve.js +32 -18
- package/dist/extensions/subagent/resolve.js.map +1 -1
- package/dist/extensions/subagent/runner.d.ts.map +1 -1
- package/dist/extensions/subagent/runner.js +4 -1
- package/dist/extensions/subagent/runner.js.map +1 -1
- package/dist/extensions/subagent/schema.d.ts +9 -0
- package/dist/extensions/subagent/schema.d.ts.map +1 -1
- package/dist/extensions/subagent/schema.js +30 -1
- package/dist/extensions/subagent/schema.js.map +1 -1
- package/dist/extensions/subagent/types.d.ts +2 -0
- package/dist/extensions/subagent/types.d.ts.map +1 -1
- package/dist/extensions/subagent/types.js.map +1 -1
- package/dist/extensions/todo/constants.d.ts +1 -1
- package/dist/extensions/todo/constants.d.ts.map +1 -1
- package/dist/extensions/todo/constants.js +8 -8
- package/dist/extensions/todo/constants.js.map +1 -1
- package/dist/extensions/todo/index.d.ts.map +1 -1
- package/dist/extensions/todo/index.js +1 -0
- package/dist/extensions/todo/index.js.map +1 -1
- package/dist/extensions/todo/schema.d.ts +30 -25
- package/dist/extensions/todo/schema.d.ts.map +1 -1
- package/dist/extensions/todo/schema.js +26 -20
- package/dist/extensions/todo/schema.js.map +1 -1
- package/dist/extensions/todo/state.d.ts +12 -8
- package/dist/extensions/todo/state.d.ts.map +1 -1
- package/dist/extensions/todo/state.js +255 -171
- package/dist/extensions/todo/state.js.map +1 -1
- package/dist/extensions/todo/view.d.ts +6 -2
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js +234 -144
- package/dist/extensions/todo/view.js.map +1 -1
- package/docs/bundled/extensions/background.md +1 -1
- package/docs/bundled/extensions/question.md +1 -0
- package/docs/bundled/extensions/subagent.md +3 -1
- package/docs/bundled/extensions/todo.md +35 -23
- package/docs/extensions.md +2 -0
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -42,7 +42,7 @@ ${len.toString(16)}\r
|
|
|
42
42
|
|
|
43
43
|
${pendingInterceptorsFormatter.format(pending)}`.trim():`${pending.length} interceptors are pending:
|
|
44
44
|
|
|
45
|
-
${pendingInterceptorsFormatter.format(pending)}`.trim())}};module.exports=MockAgent}});var require_snapshot_utils=__commonJS({"node_modules/undici/lib/mock/snapshot-utils.js"(exports,module){"use strict";var{InvalidArgumentError}=require_errors(),{runtimeFeatures}=require_runtime_features();function createHeaderFilters(matchOptions={}){let{ignoreHeaders=[],excludeHeaders=[],matchHeaders=[],caseSensitive=!1}=matchOptions;return{ignore:new Set(ignoreHeaders.map(header=>caseSensitive?header:header.toLowerCase())),exclude:new Set(excludeHeaders.map(header=>caseSensitive?header:header.toLowerCase())),match:new Set(matchHeaders.map(header=>caseSensitive?header:header.toLowerCase()))}}var crypto4=runtimeFeatures.has("crypto")?__require("node:crypto"):null,hashId=crypto4?.hash?value2=>crypto4.hash("sha256",value2,"base64url"):value2=>Buffer.from(value2).toString("base64url");function isUndiciHeaders(headers){return Array.isArray(headers)&&(headers.length&1)===0}function isUrlExcludedFactory(excludePatterns=[]){return excludePatterns.length===0?()=>!1:function(url){let urlLowerCased;for(let pattern of excludePatterns)if(typeof pattern=="string"){if(urlLowerCased||(urlLowerCased=url.toLowerCase()),urlLowerCased.includes(pattern.toLowerCase()))return!0}else if(pattern instanceof RegExp&&pattern.test(url))return!0;return!1}}function normalizeHeaders(headers){let normalizedHeaders={};if(!headers)return normalizedHeaders;if(isUndiciHeaders(headers)){for(let i=0;i<headers.length;i+=2){let key=headers[i],value2=headers[i+1];if(key&&value2!==void 0){let keyStr=Buffer.isBuffer(key)?key.toString():key,valueStr=Buffer.isBuffer(value2)?value2.toString():value2;normalizedHeaders[keyStr.toLowerCase()]=valueStr}}return normalizedHeaders}if(headers&&typeof headers=="object")for(let[key,value2]of Object.entries(headers))key&&typeof key=="string"&&(normalizedHeaders[key.toLowerCase()]=Array.isArray(value2)?value2.join(", "):String(value2));return normalizedHeaders}var validSnapshotModes=["record","playback","update"];function validateSnapshotMode(mode){if(!validSnapshotModes.includes(mode))throw new InvalidArgumentError(`Invalid snapshot mode: ${mode}. Must be one of: ${validSnapshotModes.join(", ")}`)}module.exports={createHeaderFilters,hashId,isUndiciHeaders,normalizeHeaders,isUrlExcludedFactory,validateSnapshotMode}}});var require_snapshot_recorder=__commonJS({"node_modules/undici/lib/mock/snapshot-recorder.js"(exports,module){"use strict";var{writeFile:writeFile4,readFile:readFile7,mkdir:mkdir3}=__require("node:fs/promises"),{dirname:dirname28,resolve:resolve17}=__require("node:path"),{setTimeout:setTimeout2,clearTimeout:clearTimeout2}=__require("node:timers"),{InvalidArgumentError,UndiciError}=require_errors(),{hashId,isUrlExcludedFactory,normalizeHeaders,createHeaderFilters}=require_snapshot_utils();function normalizeUrlForMatching(url,matchQuery,normalizeQuery2){if(matchQuery===!1)return`${url.origin}${url.pathname}`;if(normalizeQuery2){let normalized=String(normalizeQuery2(url.searchParams)??"");return normalized?`${url.origin}${url.pathname}?${normalized}`:`${url.origin}${url.pathname}`}return url.toString()}function normalizeBodyForMatching(body,matchBody,normalizeBody){return matchBody===!1?"":normalizeBody?String(normalizeBody(body)??""):body?String(body):""}function formatRequestKey(opts,headerFilters,matchOptions={}){let url=new URL(opts.path,opts.origin),normalized=opts._normalizedHeaders||normalizeHeaders(opts.headers);return opts._normalizedHeaders||(opts._normalizedHeaders=normalized),{method:opts.method||"GET",url:normalizeUrlForMatching(url,matchOptions.matchQuery,matchOptions.normalizeQuery),headers:filterHeadersForMatching(normalized,headerFilters,matchOptions),body:normalizeBodyForMatching(opts.body,matchOptions.matchBody,matchOptions.normalizeBody)}}function filterHeadersForMatching(headers,headerFilters,matchOptions={}){if(!headers||typeof headers!="object")return{};let{caseSensitive=!1}=matchOptions,filtered={},{ignore:ignore4,exclude,match:match2}=headerFilters;for(let[key,value2]of Object.entries(headers)){let headerKey=caseSensitive?key:key.toLowerCase();exclude.has(headerKey)||ignore4.has(headerKey)||match2.size!==0&&!match2.has(headerKey)||(filtered[headerKey]=value2)}return filtered}function filterHeadersForStorage(headers,headerFilters,matchOptions={}){if(!headers||typeof headers!="object")return{};let{caseSensitive=!1}=matchOptions,filtered={},{exclude:excludeSet}=headerFilters;for(let[key,value2]of Object.entries(headers)){let headerKey=caseSensitive?key:key.toLowerCase();excludeSet.has(headerKey)||(filtered[headerKey]=value2)}return filtered}function createRequestHash(formattedRequest){let parts=[formattedRequest.method,formattedRequest.url];if(formattedRequest.headers&&typeof formattedRequest.headers=="object"){let headerKeys=Object.keys(formattedRequest.headers).sort();for(let key of headerKeys){let values=Array.isArray(formattedRequest.headers[key])?formattedRequest.headers[key]:[formattedRequest.headers[key]];parts.push(key);for(let value2 of values.sort())parts.push(String(value2))}}parts.push(formattedRequest.body);let content=parts.join("|");return hashId(content)}var SnapshotRecorder=class{#flushTimeout;#isUrlExcluded;#snapshots=new Map;#snapshotPath;#maxSnapshots=1/0;#autoFlush=!1;#headerFilters;constructor(options={}){this.#snapshotPath=options.snapshotPath,this.#maxSnapshots=options.maxSnapshots||1/0,this.#autoFlush=options.autoFlush||!1,this.flushInterval=options.flushInterval||3e4,this._flushTimer=null,this.matchOptions={matchHeaders:options.matchHeaders||[],ignoreHeaders:options.ignoreHeaders||[],excludeHeaders:options.excludeHeaders||[],matchBody:options.matchBody!==!1,normalizeBody:options.normalizeBody||void 0,matchQuery:options.matchQuery!==!1,normalizeQuery:options.normalizeQuery||void 0,caseSensitive:options.caseSensitive||!1},this.#headerFilters=createHeaderFilters(this.matchOptions),this.shouldRecord=options.shouldRecord||(()=>!0),this.shouldPlayback=options.shouldPlayback||(()=>!0),this.#isUrlExcluded=isUrlExcludedFactory(options.excludeUrls),this.#autoFlush&&this.#snapshotPath&&this.#startAutoFlush()}async record(requestOpts,response){if(!this.shouldRecord(requestOpts)||this.isUrlExcluded(requestOpts))return;let request=formatRequestKey(requestOpts,this.#headerFilters,this.matchOptions),hash=createRequestHash(request),normalizedHeaders=normalizeHeaders(response.headers),responseData={statusCode:response.statusCode,headers:filterHeadersForStorage(normalizedHeaders,this.#headerFilters,this.matchOptions),body:Buffer.isBuffer(response.body)?response.body.toString("base64"):Buffer.from(String(response.body||"")).toString("base64"),trailers:response.trailers};if(this.#snapshots.size>=this.#maxSnapshots&&!this.#snapshots.has(hash)){let oldestKey=this.#snapshots.keys().next().value;this.#snapshots.delete(oldestKey)}let existingSnapshot=this.#snapshots.get(hash);existingSnapshot&&existingSnapshot.responses?(existingSnapshot.responses.push(responseData),existingSnapshot.timestamp=new Date().toISOString()):this.#snapshots.set(hash,{request,responses:[responseData],callCount:0,timestamp:new Date().toISOString()}),this.#autoFlush&&this.#snapshotPath&&this.#scheduleFlush()}isUrlExcluded(requestOpts){let url=new URL(requestOpts.path,requestOpts.origin).toString();return this.#isUrlExcluded(url)}findSnapshot(requestOpts){if(!this.shouldPlayback(requestOpts)||this.isUrlExcluded(requestOpts))return;let request=formatRequestKey(requestOpts,this.#headerFilters,this.matchOptions),hash=createRequestHash(request),snapshot=this.#snapshots.get(hash);if(!snapshot)return;let currentCallCount=snapshot.callCount||0,responseIndex=Math.min(currentCallCount,snapshot.responses.length-1);return snapshot.callCount=currentCallCount+1,{...snapshot,response:snapshot.responses[responseIndex]}}async loadSnapshots(filePath){let path14=filePath||this.#snapshotPath;if(!path14)throw new InvalidArgumentError("Snapshot path is required");try{let data=await readFile7(resolve17(path14),"utf8"),parsed=JSON.parse(data);if(Array.isArray(parsed)){this.#snapshots.clear();for(let{hash,snapshot}of parsed)this.#snapshots.set(hash,snapshot)}else this.#snapshots=new Map(Object.entries(parsed))}catch(error){if(error.code==="ENOENT")this.#snapshots.clear();else throw new UndiciError(`Failed to load snapshots from ${path14}`,{cause:error})}}async saveSnapshots(filePath){let path14=filePath||this.#snapshotPath;if(!path14)throw new InvalidArgumentError("Snapshot path is required");let resolvedPath=resolve17(path14);await mkdir3(dirname28(resolvedPath),{recursive:!0});let data=Array.from(this.#snapshots.entries()).map(([hash,snapshot])=>({hash,snapshot}));await writeFile4(resolvedPath,JSON.stringify(data,null,2),{flush:!0})}clear(){this.#snapshots.clear()}getSnapshots(){return Array.from(this.#snapshots.values())}size(){return this.#snapshots.size}resetCallCounts(){for(let snapshot of this.#snapshots.values())snapshot.callCount=0}deleteSnapshot(requestOpts){let request=formatRequestKey(requestOpts,this.#headerFilters,this.matchOptions),hash=createRequestHash(request);return this.#snapshots.delete(hash)}getSnapshotInfo(requestOpts){let request=formatRequestKey(requestOpts,this.#headerFilters,this.matchOptions),hash=createRequestHash(request),snapshot=this.#snapshots.get(hash);return snapshot?{hash,request:snapshot.request,responseCount:snapshot.responses?snapshot.responses.length:snapshot.response?1:0,callCount:snapshot.callCount||0,timestamp:snapshot.timestamp}:null}replaceSnapshots(snapshotData){if(this.#snapshots.clear(),Array.isArray(snapshotData))for(let{hash,snapshot}of snapshotData)this.#snapshots.set(hash,snapshot);else snapshotData&&typeof snapshotData=="object"&&(this.#snapshots=new Map(Object.entries(snapshotData)))}#startAutoFlush(){return this.#scheduleFlush()}#stopAutoFlush(){this.#flushTimeout&&(clearTimeout2(this.#flushTimeout),this.saveSnapshots().catch(()=>{}),this.#flushTimeout=null)}#scheduleFlush(){this.#flushTimeout=setTimeout2(()=>{this.saveSnapshots().catch(()=>{}),this.#autoFlush?this.#flushTimeout?.refresh():this.#flushTimeout=null},1e3)}destroy(){this.#stopAutoFlush(),this.#flushTimeout&&(clearTimeout2(this.#flushTimeout),this.#flushTimeout=null)}async close(){this.#snapshotPath&&this.#snapshots.size!==0&&await this.saveSnapshots(),this.destroy()}};module.exports={SnapshotRecorder,formatRequestKey,createRequestHash,filterHeadersForMatching,filterHeadersForStorage,createHeaderFilters}}});var require_snapshot_agent=__commonJS({"node_modules/undici/lib/mock/snapshot-agent.js"(exports,module){"use strict";var Agent2=require_agent(),MockAgent=require_mock_agent(),{SnapshotRecorder}=require_snapshot_recorder(),{InvalidArgumentError,UndiciError}=require_errors(),util=require_util(),{validateSnapshotMode}=require_snapshot_utils(),kSnapshotRecorder=Symbol("kSnapshotRecorder"),kSnapshotMode=Symbol("kSnapshotMode"),kSnapshotPath=Symbol("kSnapshotPath"),kSnapshotLoaded=Symbol("kSnapshotLoaded"),kRealAgent=Symbol("kRealAgent"),warningEmitted=!1,SnapshotAgent=class extends MockAgent{constructor(opts={}){warningEmitted||(process.emitWarning("SnapshotAgent is experimental and subject to change","ExperimentalWarning"),warningEmitted=!0);let{mode="record",snapshotPath=null,...mockAgentOpts}=opts;if(super(mockAgentOpts),validateSnapshotMode(mode),(mode==="playback"||mode==="update")&&!snapshotPath)throw new InvalidArgumentError(`snapshotPath is required when mode is '${mode}'`);this[kSnapshotMode]=mode,this[kSnapshotPath]=snapshotPath,this[kSnapshotRecorder]=new SnapshotRecorder({snapshotPath:this[kSnapshotPath],mode:this[kSnapshotMode],maxSnapshots:opts.maxSnapshots,autoFlush:opts.autoFlush,flushInterval:opts.flushInterval,matchHeaders:opts.matchHeaders,ignoreHeaders:opts.ignoreHeaders,excludeHeaders:opts.excludeHeaders,matchBody:opts.matchBody,normalizeBody:opts.normalizeBody,matchQuery:opts.matchQuery,normalizeQuery:opts.normalizeQuery,caseSensitive:opts.caseSensitive,shouldRecord:opts.shouldRecord,shouldPlayback:opts.shouldPlayback,excludeUrls:opts.excludeUrls}),this[kSnapshotLoaded]=!1,(this[kSnapshotMode]==="record"||this[kSnapshotMode]==="update"||this[kSnapshotMode]==="playback"&&opts.excludeUrls&&opts.excludeUrls.length>0)&&(this[kRealAgent]=new Agent2(opts)),(this[kSnapshotMode]==="playback"||this[kSnapshotMode]==="update")&&this[kSnapshotPath]&&this.loadSnapshots().catch(()=>{})}dispatch(opts,handler){let mode=this[kSnapshotMode];if(this[kSnapshotRecorder].isUrlExcluded(opts))return this[kRealAgent].dispatch(opts,handler);if(mode==="playback"||mode==="update"){if(!this[kSnapshotLoaded])return this.#asyncDispatch(opts,handler);let snapshot=this[kSnapshotRecorder].findSnapshot(opts);if(snapshot)return this.#replaySnapshot(snapshot,handler);if(mode==="update")return this.#recordAndReplay(opts,handler);{let error=new UndiciError(`No snapshot found for ${opts.method||"GET"} ${opts.path}`);if(handler.onResponseError){handler.onResponseError(null,error);return}throw error}}else if(mode==="record")return this.#recordAndReplay(opts,handler)}async#asyncDispatch(opts,handler){return await this.loadSnapshots(),this.dispatch(opts,handler)}#recordAndReplay(opts,handler){let responseData={statusCode:null,headers:{},trailers:{},body:[]},self=this,recordingHandler={onRequestStart(controller,context){return handler.onRequestStart(controller,{...context,history:this.history})},onRequestUpgrade(controller,statusCode,headers,socket){return handler.onRequestUpgrade(controller,statusCode,headers,socket)},onResponseStart(controller,statusCode,headers,statusMessage){return responseData.statusCode=statusCode,responseData.headers=headers,handler.onResponseStart(controller,statusCode,headers,statusMessage)},onResponseData(controller,chunk){return responseData.body.push(chunk),handler.onResponseData(controller,chunk)},onResponseEnd(controller,trailers){responseData.trailers=trailers;let responseBody=Buffer.concat(responseData.body);self[kSnapshotRecorder].record(opts,{statusCode:responseData.statusCode,headers:responseData.headers,body:responseBody,trailers:responseData.trailers}).then(()=>handler.onResponseEnd(controller,trailers)).catch(error=>handler.onResponseError(controller,error))},onResponseError(controller,error){return handler.onResponseError(controller,error)}};return this[kRealAgent].dispatch(opts,recordingHandler)}#replaySnapshot(snapshot,handler){try{let{response}=snapshot,rawHeaders=response.headers?util.toRawHeaders(response.headers):[],rawTrailers=response.trailers?util.toRawHeaders(response.trailers):[],controller={rawHeaders,rawTrailers,pause(){},resume(){},abort(reason){this.aborted=!0,this.reason=reason},aborted:!1,paused:!1};handler.onRequestStart(controller),handler.onResponseStart(controller,response.statusCode,response.headers,response.statusMessage);let body=Buffer.from(response.body,"base64");handler.onResponseData(controller,body),handler.onResponseEnd(controller,response.trailers)}catch(error){handler.onResponseError?.(null,error)}}async loadSnapshots(filePath){await this[kSnapshotRecorder].loadSnapshots(filePath||this[kSnapshotPath]),this[kSnapshotLoaded]=!0,this[kSnapshotMode]==="playback"&&this.#setupMockInterceptors()}async saveSnapshots(filePath){return this[kSnapshotRecorder].saveSnapshots(filePath||this[kSnapshotPath])}#setupMockInterceptors(){for(let snapshot of this[kSnapshotRecorder].getSnapshots()){let{request,responses,response}=snapshot,url=new URL(request.url),mockPool=this.get(url.origin),responseData=responses?responses[0]:response;responseData&&mockPool.intercept({path:url.pathname+url.search,method:request.method,headers:request.headers,body:request.body}).reply(responseData.statusCode,responseData.body,{headers:responseData.headers,trailers:responseData.trailers}).persist()}}getRecorder(){return this[kSnapshotRecorder]}getMode(){return this[kSnapshotMode]}clearSnapshots(){this[kSnapshotRecorder].clear()}resetCallCounts(){this[kSnapshotRecorder].resetCallCounts()}deleteSnapshot(requestOpts){return this[kSnapshotRecorder].deleteSnapshot(requestOpts)}getSnapshotInfo(requestOpts){return this[kSnapshotRecorder].getSnapshotInfo(requestOpts)}replaceSnapshots(snapshotData){this[kSnapshotRecorder].replaceSnapshots(snapshotData)}async close(){this[kSnapshotMode]==="playback"?this[kSnapshotRecorder].destroy():await this[kSnapshotRecorder].close(),await this[kRealAgent]?.close(),await super.close()}};module.exports=SnapshotAgent}});var require_global2=__commonJS({"node_modules/undici/lib/global.js"(exports,module){"use strict";var globalDispatcher=Symbol.for("undici.globalDispatcher.2"),legacyGlobalDispatcher=Symbol.for("undici.globalDispatcher.1"),{InvalidArgumentError}=require_errors(),Agent2=require_agent(),Dispatcher1Wrapper=require_dispatcher1_wrapper(),fallbackDispatcher;getGlobalDispatcher()===void 0&&setGlobalDispatcher2(new Agent2);function setGlobalDispatcher2(agent){if(!agent||typeof agent.dispatch!="function")throw new InvalidArgumentError("Argument agent must implement Agent");try{Object.defineProperty(globalThis,globalDispatcher,{value:agent,writable:!0,enumerable:!1,configurable:!1})}catch(err2){if(err2 instanceof TypeError){fallbackDispatcher=agent;return}throw err2}try{let legacyAgent=agent instanceof Dispatcher1Wrapper?agent:new Dispatcher1Wrapper(agent);Object.defineProperty(globalThis,legacyGlobalDispatcher,{value:legacyAgent,writable:!0,enumerable:!1,configurable:!1})}catch(err2){if(!(err2 instanceof TypeError))throw err2}}function getGlobalDispatcher(){return globalThis[globalDispatcher]??fallbackDispatcher}var installedExports=["fetch","Headers","Response","Request","FormData","WebSocket","CloseEvent","ErrorEvent","MessageEvent","EventSource"];module.exports={setGlobalDispatcher:setGlobalDispatcher2,getGlobalDispatcher,installedExports}}});var require_decorator_handler=__commonJS({"node_modules/undici/lib/handler/decorator-handler.js"(exports,module){"use strict";var assert=__require("node:assert");module.exports=class{#handler;#onCompleteCalled=!1;#onErrorCalled=!1;#onResponseStartCalled=!1;constructor(handler){if(typeof handler!="object"||handler===null)throw new TypeError("handler must be an object");this.#handler=handler}onRequestStart(...args){this.#handler.onRequestStart?.(...args)}onRequestUpgrade(...args){return assert(!this.#onCompleteCalled),assert(!this.#onErrorCalled),this.#handler.onRequestUpgrade?.(...args)}onResponseStart(...args){return assert(!this.#onCompleteCalled),assert(!this.#onErrorCalled),assert(!this.#onResponseStartCalled),this.#onResponseStartCalled=!0,this.#handler.onResponseStart?.(...args)}onResponseData(...args){return assert(!this.#onCompleteCalled),assert(!this.#onErrorCalled),this.#handler.onResponseData?.(...args)}onResponseEnd(...args){return assert(!this.#onCompleteCalled),assert(!this.#onErrorCalled),this.#onCompleteCalled=!0,this.#handler.onResponseEnd?.(...args)}onResponseError(...args){return this.#onErrorCalled=!0,this.#handler.onResponseError?.(...args)}onBodySent(...args){return this.#handler.onBodySent?.(...args)}onRequestSent(...args){return this.#handler.onRequestSent?.(...args)}}}});var require_redirect_handler=__commonJS({"node_modules/undici/lib/handler/redirect-handler.js"(exports,module){"use strict";var util=require_util(),assert=__require("node:assert"),{InvalidArgumentError}=require_errors(),{kRequestOrigin}=require_symbols(),redirectableStatusCodes=[300,301,302,303,307,308],noop=()=>{},RedirectHandler=class _RedirectHandler{static buildDispatch(dispatcher,maxRedirections){if(maxRedirections!=null&&(!Number.isInteger(maxRedirections)||maxRedirections<0))throw new InvalidArgumentError("maxRedirections must be a positive number");let dispatch=dispatcher.dispatch.bind(dispatcher);return(opts,originalHandler)=>dispatch(opts,new _RedirectHandler(dispatch,maxRedirections,opts,originalHandler))}constructor(dispatch,maxRedirections,opts,handler){if(maxRedirections!=null&&(!Number.isInteger(maxRedirections)||maxRedirections<0))throw new InvalidArgumentError("maxRedirections must be a positive number");if(opts.throwOnMaxRedirect!=null&&typeof opts.throwOnMaxRedirect!="boolean")throw new InvalidArgumentError("throwOnMaxRedirect must be a boolean");this.dispatch=dispatch,this.location=null;let{maxRedirections:_2,stripHeadersOnRedirect,stripHeadersOnCrossOriginRedirect,...cleanOpts}=opts;this.opts=cleanOpts,this.opts.body=util.wrapRequestBody(this.opts.body),this.stripHeadersOnRedirect=normalizeStripHeaders(stripHeadersOnRedirect,"stripHeadersOnRedirect"),this.stripHeadersOnCrossOriginRedirect=normalizeStripHeaders(stripHeadersOnCrossOriginRedirect,"stripHeadersOnCrossOriginRedirect"),this.maxRedirections=maxRedirections,this.handler=handler,this.history=[]}onRequestStart(controller,context){this.handler.onRequestStart?.(controller,{...context,history:this.history})}onBodySent(chunk){this.handler.onBodySent?.(chunk)}onRequestSent(){this.handler.onRequestSent?.()}onRequestUpgrade(controller,statusCode,headers,socket){this.handler.onRequestUpgrade?.(controller,statusCode,headers,socket)}onResponseStart(controller,statusCode,headers,statusMessage){if(this.opts.throwOnMaxRedirect&&this.history.length>=this.maxRedirections)throw new Error("max redirects");let removeContentHeaders=statusCode===303;(statusCode===301||statusCode===302)&&this.opts.method==="POST"&&(this.opts.method="GET",util.isStream(this.opts.body)&&util.destroy(this.opts.body.on("error",noop)),this.opts.body=null,removeContentHeaders=!0),statusCode===303&&this.opts.method!=="HEAD"&&(this.opts.method="GET",util.isStream(this.opts.body)&&util.destroy(this.opts.body.on("error",noop)),this.opts.body=null),this.location=this.history.length>=this.maxRedirections||util.isDisturbed(this.opts.body)||redirectableStatusCodes.indexOf(statusCode)===-1?null:headers.location;let requestOrigin=this.opts[kRequestOrigin]===void 0?this.opts.origin:this.opts[kRequestOrigin];if(requestOrigin&&this.history.push(new URL(this.opts.path,requestOrigin)),!this.location){this.handler.onResponseStart?.(controller,statusCode,headers,statusMessage);return}let baseUrl=requestOrigin?new URL(this.opts.path,requestOrigin):void 0,{origin,pathname,search}=util.parseURL(new URL(this.location,baseUrl)),path14=search?`${pathname}${search}`:pathname,redirectUrlString=`${origin}${path14}`;for(let historyUrl of this.history)if(historyUrl.toString()===redirectUrlString)throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`);this.opts.headers=cleanRequestHeaders(this.opts.headers,removeContentHeaders,requestOrigin!==origin,this.stripHeadersOnRedirect,this.stripHeadersOnCrossOriginRedirect),this.opts.path=path14,this.opts.origin=origin,this.opts[kRequestOrigin]=origin,this.opts.query=null}onResponseData(controller,chunk){this.location||this.handler.onResponseData?.(controller,chunk)}onResponseEnd(controller,trailers){this.location?this.dispatch(this.opts,this):this.handler.onResponseEnd(controller,trailers)}onResponseError(controller,error){this.handler.onResponseError?.(controller,error)}};function shouldRemoveHeader(header,removeContent,unknownOrigin,stripHeaders,stripHeadersOnCrossOrigin){let name=util.headerNameToString(header);return name==="host"||stripHeaders?.has(name)||unknownOrigin&&stripHeadersOnCrossOrigin?.has(name)||removeContent&&name.startsWith("content-")?!0:unknownOrigin?name==="authorization"||name==="cookie"||name==="proxy-authorization":!1}function normalizeStripHeaders(headers,optionName){if(headers==null)return null;if(!Array.isArray(headers))throw new InvalidArgumentError(`${optionName} must be an array`);let normalized=new Set;for(let header of headers){if(typeof header!="string")throw new InvalidArgumentError(`${optionName} must contain header names`);normalized.add(util.headerNameToString(header))}return normalized}function cleanRequestHeaders(headers,removeContent,unknownOrigin,stripHeaders,stripHeadersOnCrossOrigin){let ret=[];if(Array.isArray(headers))for(let i=0;i<headers.length;i+=2)shouldRemoveHeader(headers[i],removeContent,unknownOrigin,stripHeaders,stripHeadersOnCrossOrigin)||ret.push(headers[i],headers[i+1]);else if(headers&&typeof headers=="object"){let entries=util.hasSafeIterator(headers)?headers:Object.entries(headers);for(let[key,value2]of entries)shouldRemoveHeader(key,removeContent,unknownOrigin,stripHeaders,stripHeadersOnCrossOrigin)||ret.push(key,value2)}else assert(headers==null,"headers must be an object or an array");return ret}module.exports=RedirectHandler}});var require_redirect=__commonJS({"node_modules/undici/lib/interceptor/redirect.js"(exports,module){"use strict";var RedirectHandler=require_redirect_handler();function createRedirectInterceptor({maxRedirections:defaultMaxRedirections,throwOnMaxRedirect:defaultThrowOnMaxRedirect,stripHeadersOnRedirect:defaultStripHeadersOnRedirect,stripHeadersOnCrossOriginRedirect:defaultStripHeadersOnCrossOriginRedirect}={}){return dispatch=>function(opts,handler){let{maxRedirections=defaultMaxRedirections,throwOnMaxRedirect=defaultThrowOnMaxRedirect,stripHeadersOnRedirect=defaultStripHeadersOnRedirect,stripHeadersOnCrossOriginRedirect=defaultStripHeadersOnCrossOriginRedirect,...rest}=opts;if(maxRedirections==null||maxRedirections===0)return dispatch(opts,handler);let dispatchOpts={...rest,throwOnMaxRedirect,stripHeadersOnRedirect,stripHeadersOnCrossOriginRedirect},redirectHandler=new RedirectHandler(dispatch,maxRedirections,dispatchOpts,handler);return dispatch(dispatchOpts,redirectHandler)}}module.exports=createRedirectInterceptor}});var require_response_error=__commonJS({"node_modules/undici/lib/interceptor/response-error.js"(exports,module){"use strict";var DecoratorHandler=require_decorator_handler(),{ResponseError}=require_errors(),ResponseErrorHandler=class extends DecoratorHandler{#statusCode;#contentType;#decoder;#headers;#body;constructor(_opts,{handler}){super(handler)}#checkContentType(contentType){return(this.#contentType??"").indexOf(contentType)===0}onRequestStart(controller,context){return this.#statusCode=0,this.#contentType=null,this.#decoder=null,this.#headers=null,this.#body="",super.onRequestStart(controller,context)}onResponseStart(controller,statusCode,headers,statusMessage){if(this.#statusCode=statusCode,this.#headers=headers,this.#contentType=headers["content-type"],this.#statusCode<400)return super.onResponseStart(controller,statusCode,headers,statusMessage);(this.#checkContentType("application/json")||this.#checkContentType("text/plain"))&&(this.#decoder=new TextDecoder("utf-8"))}onResponseData(controller,chunk){if(this.#statusCode<400)return super.onResponseData(controller,chunk);this.#body+=this.#decoder?.decode(chunk,{stream:!0})??""}onResponseEnd(controller,trailers){if(this.#statusCode>=400){if(this.#body+=this.#decoder?.decode(void 0,{stream:!1})??"",this.#checkContentType("application/json"))try{this.#body=JSON.parse(this.#body)}catch{}let err2,stackTraceLimit=Error.stackTraceLimit;Error.stackTraceLimit=0;try{err2=new ResponseError("Response Error",this.#statusCode,{body:this.#body,headers:this.#headers})}finally{Error.stackTraceLimit=stackTraceLimit}super.onResponseError(controller,err2)}else super.onResponseEnd(controller,trailers)}onResponseError(controller,err2){super.onResponseError(controller,err2)}};module.exports=()=>dispatch=>function(opts,handler){return dispatch(opts,new ResponseErrorHandler(opts,{handler}))}}});var require_retry=__commonJS({"node_modules/undici/lib/interceptor/retry.js"(exports,module){"use strict";var RetryHandler=require_retry_handler();module.exports=globalOpts=>dispatch=>function(opts,handler){return dispatch(opts,new RetryHandler({...opts,retryOptions:{...globalOpts,...opts.retryOptions}},{handler,dispatch}))}}});var require_dump=__commonJS({"node_modules/undici/lib/interceptor/dump.js"(exports,module){"use strict";var{InvalidArgumentError,RequestAbortedError}=require_errors(),DecoratorHandler=require_decorator_handler(),DumpHandler=class extends DecoratorHandler{#maxSize=1024*1024;#dumped=!1;#size=0;aborted=!1;reason=!1;constructor({maxSize,signal},handler){if(maxSize!=null&&(!Number.isFinite(maxSize)||maxSize<1))throw new InvalidArgumentError("maxSize must be a number greater than 0");super(handler),this.#maxSize=maxSize??this.#maxSize}#abort(reason){this.aborted=!0,this.reason=reason}onRequestStart(controller,context){return controller.abort=this.#abort.bind(this),super.onRequestStart(controller,context)}onResponseStart(controller,statusCode,headers,statusMessage){let contentLength=headers["content-length"];if(contentLength!=null&&contentLength>this.#maxSize)throw new RequestAbortedError(`Response size (${contentLength}) larger than maxSize (${this.#maxSize})`);return this.aborted===!0?!0:super.onResponseStart(controller,statusCode,headers,statusMessage)}onResponseError(controller,err2){super.onResponseError(controller,this.aborted===!0?this.reason:err2)}onResponseData(controller,chunk){if(this.#size=this.#size+chunk.length,this.#size>this.#maxSize)throw new RequestAbortedError(`Response size (${this.#size}) larger than maxSize (${this.#maxSize})`);return this.#size===this.#maxSize&&(this.#dumped=!0),!0}onResponseEnd(controller,trailers){if(this.aborted===!0){super.onResponseError(controller,this.reason);return}super.onResponseEnd(controller,this.#dumped?{}:trailers)}};function createDumpInterceptor({maxSize:defaultMaxSize}={maxSize:1024*1024}){return dispatch=>function(opts,handler){let{dumpMaxSize=defaultMaxSize}=opts,dumpHandler=new DumpHandler({maxSize:dumpMaxSize,signal:opts.signal},handler);return dispatch(opts,dumpHandler)}}module.exports=createDumpInterceptor}});var require_dns=__commonJS({"node_modules/undici/lib/interceptor/dns.js"(exports,module){"use strict";var{isIP}=__require("node:net"),{lookup}=__require("node:dns"),DecoratorHandler=require_decorator_handler(),{InvalidArgumentError,InformationalError}=require_errors(),{kRequestOrigin}=require_symbols(),maxInt=Math.pow(2,31)-1;function hasSafeIterator(headers){let prototype=Object.getPrototypeOf(headers);return Object.hasOwn(headers,Symbol.iterator)||prototype!=null&&prototype!==Object.prototype&&typeof headers[Symbol.iterator]=="function"}function isHostHeader(key){return typeof key=="string"&&key.toLowerCase()==="host"}function normalizeHeaders(headers){if(headers==null)return null;if(Array.isArray(headers)){if(headers.length===0||!Array.isArray(headers[0]))return headers;let normalized=[];for(let header of headers)Array.isArray(header)&&header.length===2?normalized.push(header[0],header[1]):normalized.push(header);return normalized}if(typeof headers=="object"&&hasSafeIterator(headers)){let normalized=[];for(let header of headers)Array.isArray(header)&&header.length===2?normalized.push(header[0],header[1]):normalized.push(header);return normalized}return headers}function hasHostHeader(headers){if(headers==null)return!1;if(Array.isArray(headers)){if(headers.length===0)return!1;for(let i=0;i<headers.length;i+=2)if(isHostHeader(headers[i]))return!0;return!1}if(typeof headers=="object"){for(let key in headers)if(isHostHeader(key))return!0}return!1}function withHostHeader(host,headers){let normalizedHeaders=normalizeHeaders(headers);return hasHostHeader(normalizedHeaders)?normalizedHeaders:Array.isArray(normalizedHeaders)?["host",host,...normalizedHeaders]:normalizedHeaders&&typeof normalizedHeaders=="object"?{host,...normalizedHeaders}:{host}}var DNSStorage=class{#maxItems=0;#records=new Map;constructor(opts){this.#maxItems=opts.maxItems}get size(){return this.#records.size}get(hostname){return this.#records.get(hostname)??null}set(hostname,records){this.#records.set(hostname,records)}delete(hostname){this.#records.delete(hostname)}full(){return this.size>=this.#maxItems}},DNSInstance=class{#maxTTL=0;#maxItems=0;dualStack=!0;affinity=null;lookup=null;pick=null;storage=null;constructor(opts){this.#maxTTL=opts.maxTTL,this.#maxItems=opts.maxItems,this.dualStack=opts.dualStack,this.affinity=opts.affinity,this.lookup=opts.lookup??this.#defaultLookup,this.pick=opts.pick??this.#defaultPick,this.storage=opts.storage??new DNSStorage(opts)}runLookup(origin,opts,cb){let ips=this.storage.get(origin.hostname);if(ips==null&&this.storage.full()){cb(null,origin);return}let newOpts={affinity:this.affinity,dualStack:this.dualStack,lookup:this.lookup,pick:this.pick,...opts.dns,maxTTL:this.#maxTTL,maxItems:this.#maxItems};if(ips==null)this.lookup(origin,newOpts,(err2,addresses)=>{if(err2||addresses==null||addresses.length===0){cb(err2??new InformationalError("No DNS entries found"));return}this.setRecords(origin,addresses);let records=this.storage.get(origin.hostname),ip=this.pick(origin,records,newOpts.affinity),port;typeof ip.port=="number"?port=`:${ip.port}`:origin.port!==""?port=`:${origin.port}`:port="",cb(null,new URL(`${origin.protocol}//${ip.family===6?`[${ip.address}]`:ip.address}${port}`))});else{let ip=this.pick(origin,ips,newOpts.affinity);if(ip==null){this.storage.delete(origin.hostname),this.runLookup(origin,opts,cb);return}let port;typeof ip.port=="number"?port=`:${ip.port}`:origin.port!==""?port=`:${origin.port}`:port="",cb(null,new URL(`${origin.protocol}//${ip.family===6?`[${ip.address}]`:ip.address}${port}`))}}#defaultLookup(origin,opts,cb){lookup(origin.hostname,{all:!0,family:this.dualStack===!1?this.affinity:0,order:"ipv4first"},(err2,addresses)=>{if(err2)return cb(err2);let results=new Map;for(let addr of addresses)results.set(`${addr.address}:${addr.family}`,addr);cb(null,results.values())})}#defaultPick(origin,hostnameRecords,affinity){let ip=null,{records,offset}=hostnameRecords,family;if(this.dualStack?(affinity==null&&(offset==null||offset===maxInt?(hostnameRecords.offset=0,affinity=4):(hostnameRecords.offset++,affinity=(hostnameRecords.offset&1)===1?6:4)),records[affinity]!=null&&records[affinity].ips.length>0?family=records[affinity]:family=records[affinity===4?6:4]):family=records[affinity],family==null||family.ips.length===0)return ip;family.offset==null||family.offset===maxInt?family.offset=0:family.offset++;let position=family.offset%family.ips.length;return ip=family.ips[position]??null,ip==null?ip:Date.now()-ip.timestamp>ip.ttl?(family.ips.splice(position,1),this.pick(origin,hostnameRecords,affinity)):ip}pickFamily(origin,ipFamily){let records=this.storage.get(origin.hostname)?.records;if(!records)return null;let family=records[ipFamily];if(!family)return null;family.offset==null||family.offset===maxInt?family.offset=0:family.offset++;let position=family.offset%family.ips.length,ip=family.ips[position]??null;return ip==null||Date.now()-ip.timestamp>ip.ttl&&family.ips.splice(position,1),ip}setRecords(origin,addresses){let timestamp=Date.now(),records={records:{4:null,6:null}},minTTL=this.#maxTTL;for(let record of addresses){record.timestamp=timestamp,typeof record.ttl=="number"?(record.ttl=Math.min(record.ttl,this.#maxTTL),minTTL=Math.min(minTTL,record.ttl)):record.ttl=this.#maxTTL;let familyRecords=records.records[record.family]??{ips:[]};familyRecords.ips.push(record),records.records[record.family]=familyRecords}this.storage.set(origin.hostname,records,{ttl:minTTL})}deleteRecords(origin){this.storage.delete(origin.hostname)}getHandler(meta,opts){return new DNSDispatchHandler(this,meta,opts)}},DNSDispatchHandler=class extends DecoratorHandler{#state=null;#opts=null;#dispatch=null;#origin=null;#controller=null;#newOrigin=null;#firstTry=!0;constructor(state2,{origin,handler,dispatch,newOrigin},opts){super(handler),this.#origin=origin,this.#newOrigin=newOrigin,this.#opts={...opts},this.#state=state2,this.#dispatch=dispatch}onResponseError(controller,err2){switch(err2.code){case"ETIMEDOUT":case"ECONNREFUSED":{if(this.#state.dualStack){if(!this.#firstTry){super.onResponseError(controller,err2);return}this.#firstTry=!1;let otherFamily=this.#newOrigin.hostname[0]==="["?4:6,ip=this.#state.pickFamily(this.#origin,otherFamily);if(ip==null){super.onResponseError(controller,err2);return}let port;typeof ip.port=="number"?port=`:${ip.port}`:this.#origin.port!==""?port=`:${this.#origin.port}`:port="";let dispatchOpts={...this.#opts,origin:`${this.#origin.protocol}//${ip.family===6?`[${ip.address}]`:ip.address}${port}`,[kRequestOrigin]:this.#opts[kRequestOrigin]===void 0?this.#origin:this.#opts[kRequestOrigin],headers:withHostHeader(this.#origin.host,this.#opts.headers)};this.#dispatch(dispatchOpts,this);return}super.onResponseError(controller,err2);break}case"ENOTFOUND":this.#state.deleteRecords(this.#origin),super.onResponseError(controller,err2);break;default:super.onResponseError(controller,err2);break}}};module.exports=interceptorOpts=>{if(interceptorOpts?.maxTTL!=null&&(typeof interceptorOpts?.maxTTL!="number"||interceptorOpts?.maxTTL<0))throw new InvalidArgumentError("Invalid maxTTL. Must be a positive number");if(interceptorOpts?.maxItems!=null&&(typeof interceptorOpts?.maxItems!="number"||interceptorOpts?.maxItems<1))throw new InvalidArgumentError("Invalid maxItems. Must be a positive number and greater than zero");if(interceptorOpts?.affinity!=null&&interceptorOpts?.affinity!==4&&interceptorOpts?.affinity!==6)throw new InvalidArgumentError("Invalid affinity. Must be either 4 or 6");if(interceptorOpts?.dualStack!=null&&typeof interceptorOpts?.dualStack!="boolean")throw new InvalidArgumentError("Invalid dualStack. Must be a boolean");if(interceptorOpts?.lookup!=null&&typeof interceptorOpts?.lookup!="function")throw new InvalidArgumentError("Invalid lookup. Must be a function");if(interceptorOpts?.pick!=null&&typeof interceptorOpts?.pick!="function")throw new InvalidArgumentError("Invalid pick. Must be a function");if(interceptorOpts?.storage!=null&&(typeof interceptorOpts?.storage?.get!="function"||typeof interceptorOpts?.storage?.set!="function"||typeof interceptorOpts?.storage?.full!="function"||typeof interceptorOpts?.storage?.delete!="function"))throw new InvalidArgumentError("Invalid storage. Must be a object with methods: { get, set, full, delete }");let dualStack=interceptorOpts?.dualStack??!0,affinity;dualStack?affinity=interceptorOpts?.affinity??null:affinity=interceptorOpts?.affinity??4;let opts={maxTTL:interceptorOpts?.maxTTL??1e4,lookup:interceptorOpts?.lookup??null,pick:interceptorOpts?.pick??null,dualStack,affinity,maxItems:interceptorOpts?.maxItems??1/0,storage:interceptorOpts?.storage},instance=new DNSInstance(opts);return dispatch=>function(origDispatchOpts,handler){if(origDispatchOpts.origin==null)return dispatch(origDispatchOpts,handler);let origin=origDispatchOpts.origin.constructor===URL?origDispatchOpts.origin:new URL(origDispatchOpts.origin);return isIP(origin.hostname)!==0?dispatch(origDispatchOpts,handler):(instance.runLookup(origin,origDispatchOpts,(err2,newOrigin)=>{if(err2)return handler.onResponseError(null,err2);let dispatchOpts={...origDispatchOpts,servername:origin.hostname,origin:newOrigin.origin,[kRequestOrigin]:origDispatchOpts[kRequestOrigin]===void 0?origin:origDispatchOpts[kRequestOrigin],headers:withHostHeader(origin.host,origDispatchOpts.headers)};dispatch(dispatchOpts,instance.getHandler({origin,dispatch,handler,newOrigin},origDispatchOpts))}),!0)}}}});var require_cache=__commonJS({"node_modules/undici/lib/util/cache.js"(exports,module){"use strict";var{safeHTTPMethods,pathHasQueryOrFragment,hasSafeIterator,isValidHTTPToken}=require_util(),{serializePathWithQuery}=require_util(),{kRequestOrigin}=require_symbols(),MAX_DELTA_SECONDS=2147483647,RESTRICTIVE_DIRECTIVE_NAMES=["no-store","private","no-cache"],kInvalidCacheControlDirectives=Symbol("invalid cache-control directives");function trimOWS(value2){return value2.replace(/^[\t ]+|[\t ]+$/g,"")}function arrayIncludes(array,value2){for(let i=0;i<array.length;i++)if(array[i]===value2)return!0;return!1}function trimOWSStart(value2){return value2.replace(/^[\t ]+/,"")}function trimOWSEnd(value2){return value2.replace(/[\t ]+$/,"")}function findUnescapedQuote(value2,start){let escaped=!1;for(let i=start;i<value2.length;i++)if(escaped)escaped=!1;else if(value2[i]==="\\")escaped=!0;else if(value2[i]==='"')return i;return-1}function splitCacheControlHeaderValue(value2){let directives=[],start=0,quoteStart=-1,inQuote=!1,escaped=!1;for(let i=0;i<value2.length;i++)inQuote?escaped?escaped=!1:value2[i]==="\\"?escaped=!0:value2[i]==='"'&&(inQuote=!1,quoteStart=-1):value2[i]==='"'?(inQuote=!0,quoteStart=i):value2[i]===","&&(directives.push({value:value2.substring(start,i),fromMalformedQuote:!1}),start=i+1);if(!inQuote)return directives.push({value:value2.substring(start),fromMalformedQuote:!1}),directives;let tail=value2.substring(start),quoteOffset=quoteStart-start,tailStart=0;for(let i=0;i<tail.length;i++)tail[i]===","&&(directives.push({value:tail.substring(tailStart,i),fromMalformedQuote:tailStart>quoteOffset}),tailStart=i+1);return directives.push({value:tail.substring(tailStart),fromMalformedQuote:tailStart>quoteOffset}),directives}function markInvalidCacheControlDirective(directives,key){let invalidDirectives=directives[kInvalidCacheControlDirectives];invalidDirectives===void 0&&(invalidDirectives=new Set,Object.defineProperty(directives,kInvalidCacheControlDirectives,{value:invalidDirectives})),invalidDirectives.add(key)}function hasInvalidCacheControlDirective(directives,key){return directives[kInvalidCacheControlDirectives]?.has(key)===!0}function getMalformedRestrictiveDirectiveName(key){for(let directiveName of RESTRICTIVE_DIRECTIVE_NAMES)if(key.startsWith(directiveName)&&key.length>directiveName.length&&!isValidHTTPToken(key[directiveName.length]))return directiveName;let tokenOnlyKey="",hasInvalidTokenChar=!1;for(let i=0;i<key.length;i++)isValidHTTPToken(key[i])?tokenOnlyKey+=key[i]:hasInvalidTokenChar=!0;if(hasInvalidTokenChar&&arrayIncludes(RESTRICTIVE_DIRECTIVE_NAMES,tokenOnlyKey))return tokenOnlyKey}function getRequestOrigin(opts){let origin=opts[kRequestOrigin]===void 0?opts.origin:opts[kRequestOrigin];return typeof origin=="string"||origin instanceof URL?origin:null}function getInterceptorOrigin(opts,interceptorOrigin){let requestOrigin=getRequestOrigin(opts);if(interceptorOrigin===void 0)return requestOrigin;if(interceptorOrigin===null)return null;if(requestOrigin)try{if(new URL(requestOrigin).origin!==interceptorOrigin)return null}catch{return interceptorOrigin}return interceptorOrigin}function makeCacheKey(opts,origin=getRequestOrigin(opts)){if(!origin)throw new Error("opts.origin is undefined");let fullPath=opts.path||"/";return opts.query&&!pathHasQueryOrFragment(fullPath)&&(fullPath=serializePathWithQuery(fullPath,opts.query)),{origin:origin.toString(),method:opts.method,path:fullPath,headers:opts.headers}}function appendHeader(headers,key,val){let headerName=key.toLowerCase(),current=headers[headerName],values=Array.isArray(val)?val:[val];current===void 0?headers[headerName]=Array.isArray(val)?val.slice():val:Array.isArray(current)?current.push(...values):headers[headerName]=[current,...values]}function normalizeHeaders(opts){let headers;if(opts.headers==null)headers={};else if(typeof opts.headers=="object")if(headers={},hasSafeIterator(opts.headers))if(Array.isArray(opts.headers)){let first=opts.headers[0];if(Array.isArray(first))for(let x2 of opts.headers){if(!Array.isArray(x2))throw new Error("opts.headers is not a valid header map");let[key,val]=x2;if(typeof key!="string"||typeof val!="string")throw new Error("opts.headers is not a valid header map");appendHeader(headers,key,val)}else{let len=opts.headers.length;if(len%2!==0)throw new Error("opts.headers is not a valid header map");for(let i=0;i<len;i+=2){let key=opts.headers[i],val=opts.headers[i+1];if(typeof key!="string"||typeof val!="string"&&!Array.isArray(val))throw new Error("opts.headers is not a valid header map");if(typeof val=="string")appendHeader(headers,key,val);else{let mapped=[];for(let j2=0;j2<val.length;j2++){let v2=val[j2];mapped.push(typeof v2=="string"?v2:v2.toString("latin1"))}appendHeader(headers,key,mapped)}}}}else for(let x2 of opts.headers){if(!Array.isArray(x2))throw new Error("opts.headers is not a valid header map");let[key,val]=x2;if(typeof key!="string"||typeof val!="string")throw new Error("opts.headers is not a valid header map");appendHeader(headers,key,val)}else for(let key of Object.keys(opts.headers))appendHeader(headers,key,opts.headers[key]);else throw new Error("opts.headers is not an object");return headers}function assertCacheKey(key){if(typeof key!="object")throw new TypeError(`expected key to be object, got ${typeof key}`);for(let property of["origin","method","path"])if(typeof key[property]!="string")throw new TypeError(`expected key.${property} to be string, got ${typeof key[property]}`);if(key.headers!==void 0&&typeof key.headers!="object")throw new TypeError(`expected headers to be object, got ${typeof key}`)}function assertCacheValue(value2){if(typeof value2!="object")throw new TypeError(`expected value to be object, got ${typeof value2}`);for(let property of["statusCode","cachedAt","staleAt","deleteAt"])if(typeof value2[property]!="number")throw new TypeError(`expected value.${property} to be number, got ${typeof value2[property]}`);if(typeof value2.statusMessage!="string")throw new TypeError(`expected value.statusMessage to be string, got ${typeof value2.statusMessage}`);if(value2.headers!=null&&typeof value2.headers!="object")throw new TypeError(`expected value.rawHeaders to be object, got ${typeof value2.headers}`);if(value2.vary!==void 0&&typeof value2.vary!="object")throw new TypeError(`expected value.vary to be object, got ${typeof value2.vary}`);if(value2.etag!==void 0&&typeof value2.etag!="string")throw new TypeError(`expected value.etag to be string, got ${typeof value2.etag}`)}function parseCacheControlHeader(header){let output={},invalidNumericDirectives=new Set,invalidNoArgumentDirectives=new Set,directives=splitCacheControlHeaderValue(Array.isArray(header)?header.join(","):header);for(let i=0;i<directives.length;i++){let directiveRecord=directives[i],directive=directiveRecord.value.toLowerCase(),fromMalformedQuote=directiveRecord.fromMalformedQuote,keyValueDelimiter=directive.indexOf("="),key,value2,keyHasTrailingWhitespace=!1,valueHasLeadingWhitespace=!1;if(keyValueDelimiter!==-1){let rawKey=directive.substring(0,keyValueDelimiter),rawValue=directive.substring(keyValueDelimiter+1);keyHasTrailingWhitespace=trimOWSEnd(rawKey)!==rawKey,valueHasLeadingWhitespace=trimOWSStart(rawValue)!==rawValue,key=trimOWS(rawKey),value2=trimOWSStart(rawValue)}else key=trimOWS(directive);let malformedRestrictiveDirectiveName=getMalformedRestrictiveDirectiveName(key);if(malformedRestrictiveDirectiveName!==void 0){output[malformedRestrictiveDirectiveName]=!0;continue}switch(key){case"min-fresh":case"max-stale":case"max-age":case"s-maxage":case"stale-while-revalidate":case"stale-if-error":{if(fromMalformedQuote||invalidNumericDirectives.has(key))continue;if(value2===void 0||keyHasTrailingWhitespace||valueHasLeadingWhitespace){delete output[key],invalidNumericDirectives.add(key),markInvalidCacheControlDirective(output,key);continue}if(value2.length>=2&&value2[0]==='"'&&value2[value2.length-1]==='"'&&(value2=value2.substring(1,value2.length-1)),!/^[0-9]+$/.test(value2)){delete output[key],invalidNumericDirectives.add(key),markInvalidCacheControlDirective(output,key);continue}let parsedValue=Math.min(parseInt(value2,10),MAX_DELTA_SECONDS);key==="min-fresh"?(!(key in output)||output[key]<parsedValue)&&(output[key]=parsedValue):(!(key in output)||output[key]>parsedValue)&&(output[key]=parsedValue);break}case"private":case"no-cache":{if(fromMalformedQuote){output[key]=!0;break}if(value2!==void 0&&value2.length===0){output[key]=!0;break}if(value2){if(value2[0]==='"'){value2=trimOWSEnd(value2);let fieldList="",lastQuotedPart=i,foundEndingQuote=!1,closingQuote=findUnescapedQuote(value2,1);if(closingQuote!==-1)fieldList=value2.substring(1,closingQuote),foundEndingQuote=!0;else{let fieldListParts=[value2.substring(1)];for(let j2=i+1;j2<directives.length;j2++){let nextPart=trimOWS(directives[j2].value),closingQuote2=findUnescapedQuote(nextPart,0);if(lastQuotedPart=j2,closingQuote2!==-1){fieldListParts.push(nextPart.substring(0,closingQuote2)),foundEndingQuote=!0;break}fieldListParts.push(nextPart)}fieldList=fieldListParts.join(",")}if(!foundEndingQuote){output[key]=!0;break}i=lastQuotedPart;let headers=fieldList.split(","),validFieldNames=!0;for(let j2=0;j2<headers.length;j2++)headers[j2]=trimOWS(headers[j2]),isValidHTTPToken(headers[j2])||(validFieldNames=!1);validFieldNames?output[key]!==!0&&(key in output?output[key]=output[key].concat(headers):output[key]=headers):output[key]=!0}else{let fieldName=trimOWS(value2);isValidHTTPToken(fieldName)?output[key]!==!0&&(key in output?output[key]=output[key].concat(fieldName):output[key]=[fieldName]):output[key]=!0}break}}case"public":case"must-revalidate":case"proxy-revalidate":case"immutable":case"no-transform":case"must-understand":case"only-if-cached":if(fromMalformedQuote||invalidNoArgumentDirectives.has(key))continue;if(value2!==void 0){delete output[key],invalidNoArgumentDirectives.add(key);continue}output[key]=!0;break;case"no-store":output[key]=!0;break;default:continue}}return output}function splitVaryHeader(varyHeader){let values=Array.isArray(varyHeader)?varyHeader:[varyHeader],output=[];for(let i=0;i<values.length;i++){let parts=values[i].split(",");for(let j2=0;j2<parts.length;j2++)output.push(parts[j2])}return output}function hasVaryStar(varyHeader){let values=splitVaryHeader(varyHeader);for(let i=0;i<values.length;i++)if(trimOWS(values[i]).indexOf("*")!==-1)return!0;return!1}function parseVaryHeader(varyHeader,headers){if(hasVaryStar(varyHeader))return headers;let output={},varyingHeaders=splitVaryHeader(varyHeader);for(let header of varyingHeaders){let trimmedHeader=trimOWS(header).toLowerCase();if(trimmedHeader.length===0)continue;if(!isValidHTTPToken(trimmedHeader))return;let headerValue=headers[trimmedHeader];output[trimmedHeader]=Array.isArray(headerValue)?headerValue.slice():headerValue??null}return output}function isInvalidOrWildcardVaryHeader(varyHeader){return hasVaryStar(varyHeader)||parseVaryHeader(varyHeader,{})===void 0}function isEtagUsable(etag){return etag.length<=2?!1:etag[0]==='"'&&etag[etag.length-1]==='"'?!(etag[1]==='"'||etag.startsWith('"W/')):etag.startsWith('W/"')&&etag[etag.length-1]==='"'?etag.length!==4:!1}function assertCacheStore(store,name="CacheStore"){if(typeof store!="object"||store===null)throw new TypeError(`expected type of ${name} to be a CacheStore, got ${store===null?"null":typeof store}`);for(let fn of["get","createWriteStream","delete"])if(typeof store[fn]!="function")throw new TypeError(`${name} needs to have a \`${fn}()\` function`)}function assertCacheMethods(methods,name="CacheMethods"){if(!Array.isArray(methods))throw new TypeError(`expected type of ${name} needs to be an array, got ${methods===null?"null":typeof methods}`);if(methods.length===0)throw new TypeError(`${name} needs to have at least one method`);for(let method of methods)if(!arrayIncludes(safeHTTPMethods,method))throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(", ")}, got ${method}`)}function makeDeduplicationKey(cacheKey2,excludeHeaders){let headers={};if(cacheKey2.headers){let sortedHeaders=Object.keys(cacheKey2.headers).sort();for(let header of sortedHeaders)excludeHeaders?.has(header.toLowerCase())||(headers[header]=cacheKey2.headers[header])}return JSON.stringify([cacheKey2.origin,cacheKey2.method,cacheKey2.path,headers])}module.exports={getInterceptorOrigin,getRequestOrigin,makeCacheKey,normalizeHeaders,assertCacheKey,assertCacheValue,parseCacheControlHeader,hasInvalidCacheControlDirective,parseVaryHeader,hasVaryStar,isInvalidOrWildcardVaryHeader,isEtagUsable,assertCacheMethods,assertCacheStore,makeDeduplicationKey}}});var require_date=__commonJS({"node_modules/undici/lib/util/date.js"(exports,module){"use strict";function parseHttpDate(date){switch(date[3]){case",":return parseImfDate(date);case" ":return parseAscTimeDate(date);default:return parseRfc850Date(date)}}function makeDate(year,monthIdx,day,hour,minute,second,weekday){let result2=new Date(Date.UTC(year,monthIdx,day,hour,minute,second));return year>=0&&year<=99&&result2.setUTCFullYear(year),result2.getUTCFullYear()===year&&result2.getUTCMonth()===monthIdx&&result2.getUTCDate()===day&&result2.getUTCHours()===hour&&result2.getUTCMinutes()===minute&&result2.getUTCSeconds()===second&&result2.getUTCDay()===weekday?result2:void 0}function parseImfDate(date){if(date.length!==29||date[4]!==" "||date[7]!==" "||date[11]!==" "||date[16]!==" "||date[19]!==":"||date[22]!==":"||date[25]!==" "||date[26]!=="G"||date[27]!=="M"||date[28]!=="T")return;let weekday=-1;if(date[0]==="S"&&date[1]==="u"&&date[2]==="n")weekday=0;else if(date[0]==="M"&&date[1]==="o"&&date[2]==="n")weekday=1;else if(date[0]==="T"&&date[1]==="u"&&date[2]==="e")weekday=2;else if(date[0]==="W"&&date[1]==="e"&&date[2]==="d")weekday=3;else if(date[0]==="T"&&date[1]==="h"&&date[2]==="u")weekday=4;else if(date[0]==="F"&&date[1]==="r"&&date[2]==="i")weekday=5;else if(date[0]==="S"&&date[1]==="a"&&date[2]==="t")weekday=6;else return;let day=0;if(date[5]==="0"){let code=date.charCodeAt(6);if(code<49||code>57)return;day=code-48}else{let code1=date.charCodeAt(5);if(code1<49||code1>51)return;let code2=date.charCodeAt(6);if(code2<48||code2>57)return;day=(code1-48)*10+(code2-48)}let monthIdx=-1;if(date[8]==="J"&&date[9]==="a"&&date[10]==="n")monthIdx=0;else if(date[8]==="F"&&date[9]==="e"&&date[10]==="b")monthIdx=1;else if(date[8]==="M"&&date[9]==="a")if(date[10]==="r")monthIdx=2;else if(date[10]==="y")monthIdx=4;else return;else if(date[8]==="J")if(date[9]==="a"&&date[10]==="n")monthIdx=0;else if(date[9]==="u")if(date[10]==="n")monthIdx=5;else if(date[10]==="l")monthIdx=6;else return;else return;else if(date[8]==="A")if(date[9]==="p"&&date[10]==="r")monthIdx=3;else if(date[9]==="u"&&date[10]==="g")monthIdx=7;else return;else if(date[8]==="S"&&date[9]==="e"&&date[10]==="p")monthIdx=8;else if(date[8]==="O"&&date[9]==="c"&&date[10]==="t")monthIdx=9;else if(date[8]==="N"&&date[9]==="o"&&date[10]==="v")monthIdx=10;else if(date[8]==="D"&&date[9]==="e"&&date[10]==="c")monthIdx=11;else return;let yearDigit1=date.charCodeAt(12);if(yearDigit1<48||yearDigit1>57)return;let yearDigit2=date.charCodeAt(13);if(yearDigit2<48||yearDigit2>57)return;let yearDigit3=date.charCodeAt(14);if(yearDigit3<48||yearDigit3>57)return;let yearDigit4=date.charCodeAt(15);if(yearDigit4<48||yearDigit4>57)return;let year=(yearDigit1-48)*1e3+(yearDigit2-48)*100+(yearDigit3-48)*10+(yearDigit4-48),hour=0;if(date[17]==="0"){let code=date.charCodeAt(18);if(code<48||code>57)return;hour=code-48}else{let code1=date.charCodeAt(17);if(code1<48||code1>50)return;let code2=date.charCodeAt(18);if(code2<48||code2>57||code1===50&&code2>51)return;hour=(code1-48)*10+(code2-48)}let minute=0;if(date[20]==="0"){let code=date.charCodeAt(21);if(code<48||code>57)return;minute=code-48}else{let code1=date.charCodeAt(20);if(code1<48||code1>53)return;let code2=date.charCodeAt(21);if(code2<48||code2>57)return;minute=(code1-48)*10+(code2-48)}let second=0;if(date[23]==="0"){let code=date.charCodeAt(24);if(code<48||code>57)return;second=code-48}else{let code1=date.charCodeAt(23);if(code1<48||code1>53)return;let code2=date.charCodeAt(24);if(code2<48||code2>57)return;second=(code1-48)*10+(code2-48)}return makeDate(year,monthIdx,day,hour,minute,second,weekday)}function parseAscTimeDate(date){if(date.length!==24||date[7]!==" "||date[10]!==" "||date[19]!==" ")return;let weekday=-1;if(date[0]==="S"&&date[1]==="u"&&date[2]==="n")weekday=0;else if(date[0]==="M"&&date[1]==="o"&&date[2]==="n")weekday=1;else if(date[0]==="T"&&date[1]==="u"&&date[2]==="e")weekday=2;else if(date[0]==="W"&&date[1]==="e"&&date[2]==="d")weekday=3;else if(date[0]==="T"&&date[1]==="h"&&date[2]==="u")weekday=4;else if(date[0]==="F"&&date[1]==="r"&&date[2]==="i")weekday=5;else if(date[0]==="S"&&date[1]==="a"&&date[2]==="t")weekday=6;else return;let monthIdx=-1;if(date[4]==="J"&&date[5]==="a"&&date[6]==="n")monthIdx=0;else if(date[4]==="F"&&date[5]==="e"&&date[6]==="b")monthIdx=1;else if(date[4]==="M"&&date[5]==="a")if(date[6]==="r")monthIdx=2;else if(date[6]==="y")monthIdx=4;else return;else if(date[4]==="J")if(date[5]==="a"&&date[6]==="n")monthIdx=0;else if(date[5]==="u")if(date[6]==="n")monthIdx=5;else if(date[6]==="l")monthIdx=6;else return;else return;else if(date[4]==="A")if(date[5]==="p"&&date[6]==="r")monthIdx=3;else if(date[5]==="u"&&date[6]==="g")monthIdx=7;else return;else if(date[4]==="S"&&date[5]==="e"&&date[6]==="p")monthIdx=8;else if(date[4]==="O"&&date[5]==="c"&&date[6]==="t")monthIdx=9;else if(date[4]==="N"&&date[5]==="o"&&date[6]==="v")monthIdx=10;else if(date[4]==="D"&&date[5]==="e"&&date[6]==="c")monthIdx=11;else return;let day=0;if(date[8]===" "){let code=date.charCodeAt(9);if(code<49||code>57)return;day=code-48}else{let code1=date.charCodeAt(8);if(code1<49||code1>51)return;let code2=date.charCodeAt(9);if(code2<48||code2>57)return;day=(code1-48)*10+(code2-48)}let hour=0;if(date[11]==="0"){let code=date.charCodeAt(12);if(code<48||code>57)return;hour=code-48}else{let code1=date.charCodeAt(11);if(code1<48||code1>50)return;let code2=date.charCodeAt(12);if(code2<48||code2>57||code1===50&&code2>51)return;hour=(code1-48)*10+(code2-48)}let minute=0;if(date[14]==="0"){let code=date.charCodeAt(15);if(code<48||code>57)return;minute=code-48}else{let code1=date.charCodeAt(14);if(code1<48||code1>53)return;let code2=date.charCodeAt(15);if(code2<48||code2>57)return;minute=(code1-48)*10+(code2-48)}let second=0;if(date[17]==="0"){let code=date.charCodeAt(18);if(code<48||code>57)return;second=code-48}else{let code1=date.charCodeAt(17);if(code1<48||code1>53)return;let code2=date.charCodeAt(18);if(code2<48||code2>57)return;second=(code1-48)*10+(code2-48)}let yearDigit1=date.charCodeAt(20);if(yearDigit1<48||yearDigit1>57)return;let yearDigit2=date.charCodeAt(21);if(yearDigit2<48||yearDigit2>57)return;let yearDigit3=date.charCodeAt(22);if(yearDigit3<48||yearDigit3>57)return;let yearDigit4=date.charCodeAt(23);if(yearDigit4<48||yearDigit4>57)return;let year=(yearDigit1-48)*1e3+(yearDigit2-48)*100+(yearDigit3-48)*10+(yearDigit4-48);return makeDate(year,monthIdx,day,hour,minute,second,weekday)}function parseRfc850Date(date){let commaIndex=-1,weekday=-1;if(date[0]==="S")date[1]==="u"&&date[2]==="n"&&date[3]==="d"&&date[4]==="a"&&date[5]==="y"?(weekday=0,commaIndex=6):date[1]==="a"&&date[2]==="t"&&date[3]==="u"&&date[4]==="r"&&date[5]==="d"&&date[6]==="a"&&date[7]==="y"&&(weekday=6,commaIndex=8);else if(date[0]==="M"&&date[1]==="o"&&date[2]==="n"&&date[3]==="d"&&date[4]==="a"&&date[5]==="y")weekday=1,commaIndex=6;else if(date[0]==="T")date[1]==="u"&&date[2]==="e"&&date[3]==="s"&&date[4]==="d"&&date[5]==="a"&&date[6]==="y"?(weekday=2,commaIndex=7):date[1]==="h"&&date[2]==="u"&&date[3]==="r"&&date[4]==="s"&&date[5]==="d"&&date[6]==="a"&&date[7]==="y"&&(weekday=4,commaIndex=8);else if(date[0]==="W"&&date[1]==="e"&&date[2]==="d"&&date[3]==="n"&&date[4]==="e"&&date[5]==="s"&&date[6]==="d"&&date[7]==="a"&&date[8]==="y")weekday=3,commaIndex=9;else if(date[0]==="F"&&date[1]==="r"&&date[2]==="i"&&date[3]==="d"&&date[4]==="a"&&date[5]==="y")weekday=5,commaIndex=6;else return;if(date[commaIndex]!==","||date.length-commaIndex-1!==23||date[commaIndex+1]!==" "||date[commaIndex+4]!=="-"||date[commaIndex+8]!=="-"||date[commaIndex+11]!==" "||date[commaIndex+14]!==":"||date[commaIndex+17]!==":"||date[commaIndex+20]!==" "||date[commaIndex+21]!=="G"||date[commaIndex+22]!=="M"||date[commaIndex+23]!=="T")return;let day=0;if(date[commaIndex+2]==="0"){let code=date.charCodeAt(commaIndex+3);if(code<49||code>57)return;day=code-48}else{let code1=date.charCodeAt(commaIndex+2);if(code1<49||code1>51)return;let code2=date.charCodeAt(commaIndex+3);if(code2<48||code2>57)return;day=(code1-48)*10+(code2-48)}let monthIdx=-1;if(date[commaIndex+5]==="J"&&date[commaIndex+6]==="a"&&date[commaIndex+7]==="n")monthIdx=0;else if(date[commaIndex+5]==="F"&&date[commaIndex+6]==="e"&&date[commaIndex+7]==="b")monthIdx=1;else if(date[commaIndex+5]==="M"&&date[commaIndex+6]==="a"&&date[commaIndex+7]==="r")monthIdx=2;else if(date[commaIndex+5]==="A"&&date[commaIndex+6]==="p"&&date[commaIndex+7]==="r")monthIdx=3;else if(date[commaIndex+5]==="M"&&date[commaIndex+6]==="a"&&date[commaIndex+7]==="y")monthIdx=4;else if(date[commaIndex+5]==="J"&&date[commaIndex+6]==="u"&&date[commaIndex+7]==="n")monthIdx=5;else if(date[commaIndex+5]==="J"&&date[commaIndex+6]==="u"&&date[commaIndex+7]==="l")monthIdx=6;else if(date[commaIndex+5]==="A"&&date[commaIndex+6]==="u"&&date[commaIndex+7]==="g")monthIdx=7;else if(date[commaIndex+5]==="S"&&date[commaIndex+6]==="e"&&date[commaIndex+7]==="p")monthIdx=8;else if(date[commaIndex+5]==="O"&&date[commaIndex+6]==="c"&&date[commaIndex+7]==="t")monthIdx=9;else if(date[commaIndex+5]==="N"&&date[commaIndex+6]==="o"&&date[commaIndex+7]==="v")monthIdx=10;else if(date[commaIndex+5]==="D"&&date[commaIndex+6]==="e"&&date[commaIndex+7]==="c")monthIdx=11;else return;let yearDigit1=date.charCodeAt(commaIndex+9);if(yearDigit1<48||yearDigit1>57)return;let yearDigit2=date.charCodeAt(commaIndex+10);if(yearDigit2<48||yearDigit2>57)return;let year=(yearDigit1-48)*10+(yearDigit2-48);year+=year<70?2e3:1900;let hour=0;if(date[commaIndex+12]==="0"){let code=date.charCodeAt(commaIndex+13);if(code<48||code>57)return;hour=code-48}else{let code1=date.charCodeAt(commaIndex+12);if(code1<48||code1>50)return;let code2=date.charCodeAt(commaIndex+13);if(code2<48||code2>57||code1===50&&code2>51)return;hour=(code1-48)*10+(code2-48)}let minute=0;if(date[commaIndex+15]==="0"){let code=date.charCodeAt(commaIndex+16);if(code<48||code>57)return;minute=code-48}else{let code1=date.charCodeAt(commaIndex+15);if(code1<48||code1>53)return;let code2=date.charCodeAt(commaIndex+16);if(code2<48||code2>57)return;minute=(code1-48)*10+(code2-48)}let second=0;if(date[commaIndex+18]==="0"){let code=date.charCodeAt(commaIndex+19);if(code<48||code>57)return;second=code-48}else{let code1=date.charCodeAt(commaIndex+18);if(code1<48||code1>53)return;let code2=date.charCodeAt(commaIndex+19);if(code2<48||code2>57)return;second=(code1-48)*10+(code2-48)}return makeDate(year,monthIdx,day,hour,minute,second,weekday)}module.exports={parseHttpDate}}});var require_cache_handler=__commonJS({"node_modules/undici/lib/handler/cache-handler.js"(exports,module){"use strict";var util=require_util(),{parseCacheControlHeader,hasInvalidCacheControlDirective,parseVaryHeader,hasVaryStar,isInvalidOrWildcardVaryHeader,isEtagUsable}=require_cache(),{parseHttpDate}=require_date();function noop(){}var HEURISTICALLY_CACHEABLE_STATUS_CODES=[200,203,204,206,300,301,308,404,405,410,414,501],NOT_UNDERSTOOD_STATUS_CODES=[206],MAX_RESPONSE_AGE=2147483647e3,REVALIDATION_ONLY_RETENTION=864e5;function trimOWS(value2){return value2.replace(/^[\t ]+|[\t ]+$/g,"")}function arrayIncludes(array,value2){for(let i=0;i<array.length;i++)if(array[i]===value2)return!0;return!1}function appendConnectionHeaderTokens(headersToRemove,connectionHeader){let values=Array.isArray(connectionHeader)?connectionHeader:[connectionHeader];for(let i=0;i<values.length;i++){let tokens2=values[i].split(",");for(let j2=0;j2<tokens2.length;j2++)headersToRemove.push(trimOWS(tokens2[j2]).toLowerCase())}}function getSameOriginPath(cacheKey2,location){if(typeof location!="string")return;let originUrl,requestUrl,locationUrl;try{originUrl=new URL(cacheKey2.origin),requestUrl=new URL(cacheKey2.path,originUrl),locationUrl=new URL(location,requestUrl)}catch{return}if(locationUrl.origin===originUrl.origin)return locationUrl.pathname+locationUrl.search}function deleteCachedUri(store,cacheKey2,path14){deleteCachedValue(store,{...cacheKey2,path:path14});for(let i=0;i<util.safeHTTPMethods.length;i++){let method=util.safeHTTPMethods[i];method!==cacheKey2.method&&deleteCachedValue(store,{...cacheKey2,method,path:path14})}}function deleteLocationTargets(store,cacheKey2,headerValue){if(headerValue===void 0)return;let values=Array.isArray(headerValue)?headerValue:[headerValue];for(let i=0;i<values.length;i++){let path14=getSameOriginPath(cacheKey2,values[i]);path14!==void 0&&deleteCachedUri(store,cacheKey2,path14)}}function invalidateUnsafeRequest(store,cacheKey2,resHeaders){deleteCachedUri(store,cacheKey2,cacheKey2.path),deleteLocationTargets(store,cacheKey2,resHeaders.location),deleteLocationTargets(store,cacheKey2,resHeaders["content-location"])}var CacheHandler=class{#cacheKey;#cacheType;#cacheByDefault;#store;#handler;#writeStream;constructor({store,type,cacheByDefault},cacheKey2,handler){this.#store=store,this.#cacheType=type,this.#cacheByDefault=cacheByDefault,this.#cacheKey=cacheKey2,this.#handler=handler}onRequestStart(controller,context){this.#writeStream?.destroy(),this.#writeStream=void 0,this.#handler.onRequestStart?.(controller,context)}onBodySent(chunk){this.#handler.onBodySent?.(chunk)}onRequestSent(){this.#handler.onRequestSent?.()}onRequestUpgrade(controller,statusCode,headers,socket){this.#handler.onRequestUpgrade?.(controller,statusCode,headers,socket)}onResponseStart(controller,statusCode,resHeaders,statusMessage){let downstreamOnHeaders=()=>this.#handler.onResponseStart?.(controller,statusCode,resHeaders,statusMessage),handler=this;if(!arrayIncludes(util.safeHTTPMethods,this.#cacheKey.method)&&statusCode>=200&&statusCode<=399)return invalidateUnsafeRequest(this.#store,this.#cacheKey,resHeaders),downstreamOnHeaders();let cacheControlHeader=resHeaders["cache-control"],cacheControlDirectives=cacheControlHeader?parseCacheControlHeader(cacheControlHeader):{};if(revalidationResponseDisallowsCachedReuse(this.#cacheType,resHeaders,cacheControlDirectives))return deleteCachedValue(this.#store,this.#cacheKey),downstreamOnHeaders();let heuristicallyCacheable=resHeaders["last-modified"]&&arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES,statusCode);if(!cacheControlHeader&&!resHeaders.expires&&!heuristicallyCacheable&&!this.#cacheByDefault)return statusCode===304&&resHeaders.vary&&isInvalidOrWildcardVaryHeader(resHeaders.vary)&&deleteCachedValue(this.#store,this.#cacheKey),downstreamOnHeaders();if(!canCacheResponse(this.#cacheType,this.#cacheKey.method,statusCode,resHeaders,cacheControlDirectives,this.#cacheKey.headers))return statusCode===304&&(cacheControlHeader||revalidationResponseDisallowsCachedReuse(this.#cacheType,resHeaders,cacheControlDirectives))&&deleteCachedValue(this.#store,this.#cacheKey),downstreamOnHeaders();let now=Date.now(),resAge=Object.hasOwn(resHeaders,"age")?getAge(resHeaders.age):void 0;if(resAge!==void 0&&resAge>=MAX_RESPONSE_AGE)return deleteCachedValueIfNotModified(statusCode,this.#store,this.#cacheKey),downstreamOnHeaders();let resDate=Object.hasOwn(resHeaders,"date")?getDate(resHeaders.date):void 0;if(resDate===null)return deleteCachedValueIfNotModified(statusCode,this.#store,this.#cacheKey),downstreamOnHeaders();let apparentAge=resDate?Math.max(0,now-resDate.getTime()):0,currentAge=Math.max(apparentAge,resAge??0),hasValidator=typeof resHeaders.etag=="string"&&isEtagUsable(resHeaders.etag)||typeof resHeaders["last-modified"]=="string",staleAt=determineStaleAt(this.#cacheType,now,resAge,resHeaders,resDate,cacheControlDirectives,hasValidator)??this.#cacheByDefault,revalidationOnly=staleAt===0&&hasValidator;if(staleAt===void 0||currentAge>=staleAt&&!revalidationOnly)return(cacheControlHeader||staleAt!==void 0)&&deleteCachedValueIfNotModified(statusCode,this.#store,this.#cacheKey),downstreamOnHeaders();let baseTime=now-currentAge,absoluteStaleAt=staleAt+baseTime;if(now>=absoluteStaleAt&&!revalidationOnly)return deleteCachedValueIfNotModified(statusCode,this.#store,this.#cacheKey),downstreamOnHeaders();let varyDirectives;if(this.#cacheKey.headers&&resHeaders.vary&&(varyDirectives=parseVaryHeader(resHeaders.vary,this.#cacheKey.headers),!varyDirectives))return downstreamOnHeaders();let cachedAt=baseTime,deleteAt=determineDeleteAt(baseTime,now,cacheControlDirectives,absoluteStaleAt),strippedHeaders=stripNecessaryHeaders(resHeaders,cacheControlDirectives),value2={statusCode,statusMessage,headers:strippedHeaders,vary:varyDirectives,cacheControlDirectives,cachedAt,staleAt:absoluteStaleAt,deleteAt};if(statusCode===304){let handle304=cachedValue=>{if(!cachedValue)return downstreamOnHeaders();if(value2.statusCode=cachedValue.statusCode,value2.statusMessage=cachedValue.statusMessage,value2.etag=cachedValue.etag,value2.vary=varyDirectives??cachedValue.vary,value2.headers={...cachedValue.headers,...strippedHeaders},downstreamOnHeaders(),this.#writeStream=this.#store.createWriteStream(this.#cacheKey,value2),!(!this.#writeStream||!cachedValue?.body))if(typeof cachedValue.body.values=="function"){let bodyIterator=cachedValue.body.values(),streamCachedBody=()=>{for(let chunk of bodyIterator){let full=this.#writeStream.write(chunk)===!1;if(this.#handler.onResponseData?.(controller,chunk),full)break}};this.#writeStream.on("error",function(){handler.#writeStream=void 0,handler.#store.delete(handler.#cacheKey)}).on("drain",()=>{streamCachedBody()}).on("close",function(){handler.#writeStream===this&&(handler.#writeStream=void 0)}),streamCachedBody()}else typeof cachedValue.body.on=="function"&&(cachedValue.body.on("data",chunk=>{this.#writeStream.write(chunk),this.#handler.onResponseData?.(controller,chunk)}).on("end",()=>{this.#writeStream.end()}).on("error",()=>{this.#writeStream=void 0,this.#store.delete(this.#cacheKey)}),this.#writeStream.on("error",function(){handler.#writeStream=void 0,handler.#store.delete(handler.#cacheKey)}).on("close",function(){handler.#writeStream===this&&(handler.#writeStream=void 0)}))},result2=this.#store.get(this.#cacheKey);result2&&typeof result2.then=="function"?result2.then(handle304):handle304(result2)}else{if(typeof resHeaders.etag=="string"&&isEtagUsable(resHeaders.etag)&&(value2.etag=resHeaders.etag),this.#writeStream=this.#store.createWriteStream(this.#cacheKey,value2),!this.#writeStream)return downstreamOnHeaders();this.#writeStream.on("drain",()=>controller.resume()).on("error",function(){handler.#writeStream=void 0,handler.#store.delete(handler.#cacheKey)}).on("close",function(){handler.#writeStream===this&&(handler.#writeStream=void 0),controller.resume()}),downstreamOnHeaders()}}onResponseData(controller,chunk){this.#writeStream?.write(chunk)===!1&&controller.pause(),this.#handler.onResponseData?.(controller,chunk)}onResponseEnd(controller,trailers){this.#writeStream?.end(),this.#handler.onResponseEnd?.(controller,trailers)}onResponseError(controller,err2){this.#writeStream?.destroy(err2),this.#writeStream=void 0,this.#handler.onResponseError?.(controller,err2)}};function deleteCachedValue(store,cacheKey2){try{store.delete(cacheKey2)?.catch?.(noop)}catch{}}function deleteCachedValueIfNotModified(statusCode,store,cacheKey2){statusCode===304&&deleteCachedValue(store,cacheKey2)}function revalidationResponseDisallowsCachedReuse(cacheType,resHeaders,cacheControlDirectives){return cacheControlDirectives["no-store"]===!0||cacheType==="shared"&&(cacheControlDirectives.private===!0||Object.hasOwn(resHeaders,"set-cookie"))||(resHeaders.vary?isInvalidOrWildcardVaryHeader(resHeaders.vary):!1)}function canCacheResponse(cacheType,method,statusCode,resHeaders,cacheControlDirectives,reqHeaders){return!(!arrayIncludes(util.safeHTTPMethods,method)||statusCode<200||arrayIncludes(NOT_UNDERSTOOD_STATUS_CODES,statusCode)||!arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES,statusCode)&&!resHeaders.expires&&!cacheControlDirectives.public&&cacheControlDirectives["max-age"]===void 0&&!(cacheControlDirectives.private&&cacheType==="private")&&!(cacheControlDirectives["s-maxage"]!==void 0&&cacheType==="shared")||cacheControlDirectives["no-store"]||cacheType==="shared"&&(cacheControlDirectives.private===!0||Object.hasOwn(resHeaders,"set-cookie"))||resHeaders.vary&&hasVaryStar(resHeaders.vary)||reqHeaders!=null&&Object.hasOwn(reqHeaders,"authorization")&&(!cacheControlDirectives.public&&!cacheControlDirectives["s-maxage"]&&!cacheControlDirectives["must-revalidate"]||typeof reqHeaders.authorization!="string"||Array.isArray(cacheControlDirectives["no-cache"])&&arrayIncludes(cacheControlDirectives["no-cache"],"authorization")||Array.isArray(cacheControlDirectives.private)&&arrayIncludes(cacheControlDirectives.private,"authorization")))}function getDate(dateHeader){let dateValue=dateHeader;if(Array.isArray(dateValue)){if(dateValue.length!==1)return null;dateValue=dateValue[0]}return typeof dateValue!="string"?null:parseHttpDate(dateValue)}function getAge(ageHeader){let ageValue=ageHeader;if(Array.isArray(ageValue)){if(ageValue.length!==1)return MAX_RESPONSE_AGE;ageValue=ageValue[0]}if(typeof ageValue!="string"||!/^[\t ]*[0-9]+[\t ]*$/.test(ageValue))return MAX_RESPONSE_AGE;let age=BigInt(ageValue.replace(/^[\t ]+|[\t ]+$/g,""));return age>=BigInt(MAX_RESPONSE_AGE/1e3)?MAX_RESPONSE_AGE:Number(age)*1e3}function determineStaleAt(cacheType,now,age,resHeaders,responseDate,cacheControlDirectives,hasValidator){if(cacheType==="shared"){if(hasInvalidCacheControlDirective(cacheControlDirectives,"s-maxage"))return 0;let sMaxAge=cacheControlDirectives["s-maxage"];if(sMaxAge!==void 0)return sMaxAge>0?sMaxAge*1e3:0}if(hasInvalidCacheControlDirective(cacheControlDirectives,"max-age"))return 0;let maxAge=cacheControlDirectives["max-age"];if(maxAge!==void 0)return maxAge>0?maxAge*1e3:0;if(Object.hasOwn(resHeaders,"expires")){if(typeof resHeaders.expires!="string")return 0;let expiresDate=parseHttpDate(resHeaders.expires);if(!expiresDate||now>=expiresDate.getTime())return 0;if(responseDate){if(responseDate>=expiresDate)return 0;let freshnessLifetime=expiresDate.getTime()-responseDate.getTime();return age!==void 0&&age>=freshnessLifetime?0:freshnessLifetime}return expiresDate.getTime()-now}if(typeof resHeaders["last-modified"]=="string"){let lastModified=parseHttpDate(resHeaders["last-modified"]);if(lastModified)return lastModified.getTime()>=now?void 0:(now-lastModified.getTime())*.1}if(cacheControlDirectives.immutable)return 31536e6;if(cacheControlDirectives["no-cache"]===!0&&hasValidator)return 0}function determineDeleteAt(baseTime,cachedAt,cacheControlDirectives,staleAt){let staleWhileRevalidate=-1/0,staleIfError=-1/0,immutable=-1/0;if(cacheControlDirectives["stale-while-revalidate"]&&(staleWhileRevalidate=staleAt+cacheControlDirectives["stale-while-revalidate"]*1e3),cacheControlDirectives["stale-if-error"]&&(staleIfError=staleAt+cacheControlDirectives["stale-if-error"]*1e3),cacheControlDirectives.immutable&&staleWhileRevalidate===-1/0&&staleIfError===-1/0&&(immutable=cachedAt+31536e6),staleWhileRevalidate===-1/0&&staleIfError===-1/0&&immutable===-1/0){let freshnessLifetime=staleAt-baseTime;if(freshnessLifetime<=0)return cachedAt+REVALIDATION_ONLY_RETENTION;let datePrecisionPadding=Math.min(Math.max(cachedAt-baseTime,0),1e3);return staleAt+freshnessLifetime+datePrecisionPadding}return Math.max(staleAt,staleWhileRevalidate,staleIfError,immutable)}function stripNecessaryHeaders(resHeaders,cacheControlDirectives){let headersToRemove=["connection","proxy-authenticate","proxy-authentication-info","proxy-authorization","proxy-connection","te","transfer-encoding","upgrade","age"];resHeaders.connection&&appendConnectionHeaderTokens(headersToRemove,resHeaders.connection),Array.isArray(cacheControlDirectives["no-cache"])&&headersToRemove.push(...cacheControlDirectives["no-cache"]),Array.isArray(cacheControlDirectives.private)&&headersToRemove.push(...cacheControlDirectives.private);let strippedHeaders;for(let headerName of headersToRemove)Object.hasOwn(resHeaders,headerName)&&(strippedHeaders??={...resHeaders},delete strippedHeaders[headerName]);return strippedHeaders??resHeaders}module.exports=CacheHandler}});var require_memory_cache_store=__commonJS({"node_modules/undici/lib/cache/memory-cache-store.js"(exports,module){"use strict";var{Writable}=__require("node:stream"),{EventEmitter:EventEmitter4}=__require("node:events"),{assertCacheKey,assertCacheValue}=require_cache(),MemoryCacheStore=class extends EventEmitter4{#maxCount=1024;#maxSize=104857600;#maxEntrySize=5242880;#size=0;#count=0;#entries=new Map;#hasEmittedMaxSizeEvent=!1;constructor(opts){if(super(),opts){if(typeof opts!="object")throw new TypeError("MemoryCacheStore options must be an object");if(opts.maxCount!==void 0){if(typeof opts.maxCount!="number"||!Number.isInteger(opts.maxCount)||opts.maxCount<0)throw new TypeError("MemoryCacheStore options.maxCount must be a non-negative integer");this.#maxCount=opts.maxCount}if(opts.maxSize!==void 0){if(typeof opts.maxSize!="number"||!Number.isInteger(opts.maxSize)||opts.maxSize<0)throw new TypeError("MemoryCacheStore options.maxSize must be a non-negative integer");this.#maxSize=opts.maxSize}if(opts.maxEntrySize!==void 0){if(typeof opts.maxEntrySize!="number"||!Number.isInteger(opts.maxEntrySize)||opts.maxEntrySize<0)throw new TypeError("MemoryCacheStore options.maxEntrySize must be a non-negative integer");this.#maxEntrySize=opts.maxEntrySize}}}get size(){return this.#size}isFull(){return this.#size>=this.#maxSize||this.#count>=this.#maxCount}get(key){assertCacheKey(key);let topLevelKey=`${key.origin}:${key.path}`,now=Date.now(),entries=this.#entries.get(topLevelKey),entry=entries?findEntry(key,entries,now):null;return entry==null?void 0:{statusMessage:entry.statusMessage,statusCode:entry.statusCode,headers:entry.headers,body:entry.body,vary:entry.vary?entry.vary:void 0,etag:entry.etag,cacheControlDirectives:entry.cacheControlDirectives,cachedAt:entry.cachedAt,staleAt:entry.staleAt,deleteAt:entry.deleteAt}}createWriteStream(key,val){assertCacheKey(key),assertCacheValue(val);let topLevelKey=`${key.origin}:${key.path}`,store=this,entry={...key,...val,body:[],size:0};return new Writable({write(chunk,encoding,callback){typeof chunk=="string"&&(chunk=Buffer.from(chunk,encoding)),entry.size+=chunk.byteLength,entry.size>store.#maxEntrySize?this.destroy():entry.body.push(chunk),callback(null)},final(callback){let entries=store.#entries.get(topLevelKey);entries||(entries=[],store.#entries.set(topLevelKey,entries));let previousEntry=findEntry(key,entries,Date.now());if(previousEntry){let index3=entries.indexOf(previousEntry);entries.splice(index3,1,entry),store.#size-=previousEntry.size}else entries.push(entry),store.#count+=1;if(store.#size+=entry.size,store.#size>store.#maxSize||store.#count>store.#maxCount){store.#hasEmittedMaxSizeEvent||(store.emit("maxSizeExceeded",{size:store.#size,maxSize:store.#maxSize,count:store.#count,maxCount:store.#maxCount}),store.#hasEmittedMaxSizeEvent=!0);for(let[key2,entries2]of store.#entries){for(let entry2 of entries2.splice(0,Math.ceil(entries2.length/2)))store.#size-=entry2.size,store.#count-=1;entries2.length===0&&store.#entries.delete(key2)}store.#size<store.#maxSize&&store.#count<store.#maxCount&&(store.#hasEmittedMaxSizeEvent=!1)}callback(null)}})}delete(key){if(typeof key!="object")throw new TypeError(`expected key to be object, got ${typeof key}`);let topLevelKey=`${key.origin}:${key.path}`;for(let entry of this.#entries.get(topLevelKey)??[])this.#size-=entry.size,this.#count-=1;this.#entries.delete(topLevelKey)}};function findEntry(key,entries,now){for(let i=0;i<entries.length;i++){let entry=entries[i];if(entry.deleteAt>now&&entry.method===key.method&&varyMatches(key,entry))return entry}}function varyMatches(key,entry){if(entry.vary==null)return!0;for(let headerName in entry.vary)if(Object.hasOwn(entry.vary,headerName)&&!headerValueEquals(key.headers?.[headerName],entry.vary[headerName]))return!1;return!0}function headerValueEquals(lhs,rhs){if(lhs==null&&rhs==null)return!0;if(lhs==null&&rhs!=null||lhs!=null&&rhs==null)return!1;if(Array.isArray(lhs)&&Array.isArray(rhs)){if(lhs.length!==rhs.length)return!1;for(let i=0;i<lhs.length;i++)if(lhs[i]!==rhs[i])return!1;return!0}return lhs===rhs}module.exports=MemoryCacheStore}});var require_cache_revalidation_handler=__commonJS({"node_modules/undici/lib/handler/cache-revalidation-handler.js"(exports,module){"use strict";var assert=__require("node:assert"),CacheRevalidationHandler=class{#successful=!1;#callback;#handler;#context;#allowErrorStatusCodes;constructor(callback,handler,allowErrorStatusCodes){if(typeof callback!="function")throw new TypeError("callback must be a function");this.#callback=callback,this.#handler=handler,this.#allowErrorStatusCodes=allowErrorStatusCodes}onRequestStart(_2,context){this.#successful=!1,this.#context=context}onRequestUpgrade(controller,statusCode,headers,socket){this.#handler.onRequestUpgrade?.(controller,statusCode,headers,socket)}onResponseStart(controller,statusCode,headers,statusMessage){if(assert(this.#callback!=null),this.#successful=statusCode===304||this.#allowErrorStatusCodes&&statusCode>=500&&statusCode<=504,this.#callback(this.#successful,this.#context,statusCode,headers),this.#callback=null,this.#successful)return!0;this.#handler.onRequestStart?.(controller,this.#context),this.#handler.onResponseStart?.(controller,statusCode,headers,statusMessage)}onResponseData(controller,chunk){if(!this.#successful)return this.#handler.onResponseData?.(controller,chunk)}onResponseEnd(controller,trailers){this.#successful||this.#handler.onResponseEnd?.(controller,trailers)}onResponseError(controller,err2){if(!this.#successful){if(this.#callback){if(this.#allowErrorStatusCodes){this.#successful=!0,this.#callback(!0,this.#context),this.#callback=null;return}this.#callback(!1),this.#callback=null}if(typeof this.#handler.onResponseError=="function")this.#handler.onResponseError(controller,err2);else throw err2}}};module.exports=CacheRevalidationHandler}});var require_cache2=__commonJS({"node_modules/undici/lib/interceptor/cache.js"(exports,module){"use strict";var assert=__require("node:assert"),{Readable:Readable2}=__require("node:stream"),util=require_util(),CacheHandler=require_cache_handler(),MemoryCacheStore=require_memory_cache_store(),CacheRevalidationHandler=require_cache_revalidation_handler(),{assertCacheStore,assertCacheMethods,getInterceptorOrigin,makeCacheKey,normalizeHeaders,parseCacheControlHeader,isInvalidOrWildcardVaryHeader,parseVaryHeader}=require_cache(),{AbortError}=require_errors(),{parseHttpDate}=require_date();function assertCacheOrigins(origins,name){if(origins!==void 0){if(!Array.isArray(origins))throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`);for(let i=0;i<origins.length;i++){let origin=origins[i];if(typeof origin!="string"&&!(origin instanceof RegExp))throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`)}}}var nop=()=>{};function trimOWS(value2){return value2.replace(/^[\t ]+|[\t ]+$/g,"")}function arrayIncludes(array,value2){for(let i=0;i<array.length;i++)if(array[i]===value2)return!0;return!1}function hasPragmaNoCache(headers){let pragma=headers?.pragma;if(!pragma)return!1;let values=Array.isArray(pragma)?pragma:[pragma];for(let i=0;i<values.length;i++){let value2=values[i];if(typeof value2!="string")continue;let directives=value2.split(",");for(let j2=0;j2<directives.length;j2++)if(trimOWS(directives[j2]).toLowerCase()==="no-cache")return!0}return!1}function needsRevalidation(result2,cacheControlDirectives,{headers={}}){return!!(cacheControlDirectives?.["no-cache"]||result2.cacheControlDirectives?.["no-cache"]&&!Array.isArray(result2.cacheControlDirectives["no-cache"])||headers["if-modified-since"]||headers["if-none-match"])}function staleResponseRequiresRevalidation(result2,cacheType){return result2.cacheControlDirectives?.["must-revalidate"]===!0||cacheType==="shared"&&(result2.cacheControlDirectives?.["proxy-revalidate"]===!0||result2.cacheControlDirectives?.["s-maxage"]!==void 0)}function revalidationResponseDisallowsCachedReuse(cacheType,headers){if(headers.vary&&isInvalidOrWildcardVaryHeader(headers.vary)||cacheType==="shared"&&Object.hasOwn(headers,"set-cookie"))return!0;let cacheControl=headers["cache-control"];if(!cacheControl)return!1;let cacheControlDirectives=parseCacheControlHeader(cacheControl);return cacheControlDirectives["no-store"]===!0||cacheType==="shared"&&cacheControlDirectives.private===!0}function revalidationResponseUpdatesCacheControl(headers){return headers["cache-control"]!==void 0}function revalidationResponseAddsVary(result2,varyDirectives){if(!varyDirectives)return!1;for(let key in varyDirectives)if(result2.vary==null||!Object.hasOwn(result2.vary,key))return!0;return!1}function deleteCachedValue(store,cacheKey2){try{store.delete(cacheKey2)?.catch?.(nop)}catch{}}function getUsableLastModified(headers){let lastModified=headers?.["last-modified"];if(typeof lastModified=="string"&&parseHttpDate(lastModified))return lastModified}function makeRevalidationHeaders(opts,result2){let headers={...opts.headers,"if-modified-since":getUsableLastModified(result2.headers)??new Date(result2.cachedAt).toUTCString()};if(result2.etag&&(headers["if-none-match"]=result2.etag),result2.vary)for(let key in result2.vary)result2.vary[key]!=null&&(headers[key]=result2.vary[key]);return headers}function isStale(result2,cacheControlDirectives,cacheType){let now=Date.now();if(now>result2.staleAt){if(!staleResponseRequiresRevalidation(result2,cacheType)&&cacheControlDirectives?.["max-stale"]){let gracePeriod=result2.staleAt+cacheControlDirectives["max-stale"]*1e3;return now>gracePeriod}return!0}if(cacheControlDirectives?.["min-fresh"]){let timeLeftTillStale=result2.staleAt-now,threshold=cacheControlDirectives["min-fresh"]*1e3;return timeLeftTillStale<=threshold}return!1}function withinStaleWhileRevalidateWindow(result2,cacheType){let staleWhileRevalidate=result2.cacheControlDirectives?.["stale-while-revalidate"];if(!staleWhileRevalidate||staleResponseRequiresRevalidation(result2,cacheType))return!1;let now=Date.now(),staleWhileRevalidateExpiry=result2.staleAt+staleWhileRevalidate*1e3;return now<=staleWhileRevalidateExpiry}function handleUncachedResponse(dispatch,globalOpts,cacheKey2,handler,opts,reqCacheControl){if(reqCacheControl?.["only-if-cached"]){let aborted=!1,controller={paused:!1,rawHeaders:[],rawTrailers:[],pause(){this.paused=!0},resume(){this.paused=!1},abort:reason=>{aborted=!0,handler.onResponseError?.(controller,reason??new AbortError)}};try{if(handler.onRequestStart?.(controller,null),aborted||(handler.onResponseStart?.(controller,504,{},"Gateway Timeout"),aborted))return;handler.onResponseEnd?.(controller,{})}catch(err2){typeof handler.onResponseError=="function"&&handler.onResponseError(controller,err2)}return!0}return dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler))}function sendCachedValue(handler,opts,result2,age,context,isStale2){let stream2=util.isStream(result2.body)?result2.body:Readable2.from(result2.body??[]);assert(!stream2.destroyed,"stream should not be destroyed"),assert(!stream2.readableDidRead,"stream should not be readableDidRead");let controller={rawHeaders:[],rawTrailers:[],resume(){stream2.resume()},pause(){stream2.pause()},get paused(){return stream2.isPaused()},get aborted(){return stream2.destroyed},get reason(){return stream2.errored},abort(reason){stream2.destroy(reason??new AbortError)}};if(stream2.on("error",function(err2){if(!this.readableEnded)if(typeof handler.onResponseError=="function")handler.onResponseError(controller,err2);else throw err2}).on("close",function(){this.errored||handler.onResponseEnd?.(controller,{})}),handler.onRequestStart?.(controller,context),stream2.destroyed)return;let headers={...result2.headers,age:String(age)};isStale2&&(headers.warning='110 - "response is stale"'),controller.rawHeaders=util.toRawHeaders(headers),handler.onResponseStart?.(controller,result2.statusCode,headers,result2.statusMessage),opts.method==="HEAD"?stream2.destroy():stream2.on("data",function(chunk){handler.onResponseData?.(controller,chunk)})}function handleResult(dispatch,globalOpts,cacheKey2,handler,opts,reqCacheControl,result2){if(!result2)return handleUncachedResponse(dispatch,globalOpts,cacheKey2,handler,opts,reqCacheControl);if(globalOpts.type==="shared"&&Object.hasOwn(result2.headers,"set-cookie"))return util.isStream(result2.body)&&result2.body.on("error",nop).destroy(),deleteCachedValue(globalOpts.store,cacheKey2),handleUncachedResponse(dispatch,globalOpts,cacheKey2,handler,opts,reqCacheControl);let now=Date.now();if(now>result2.deleteAt)return dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler));let age=Math.round((now-result2.cachedAt)/1e3),requestMaxAgeExpired=reqCacheControl?.["max-age"]!==void 0&&age>=reqCacheControl["max-age"],stale=requestMaxAgeExpired||isStale(result2,reqCacheControl,globalOpts.type),revalidate=requestMaxAgeExpired||needsRevalidation(result2,reqCacheControl,opts);if(stale||revalidate){if(util.isStream(opts.body)&&util.bodyLength(opts.body)!==0)return dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler));if(!revalidate&&withinStaleWhileRevalidateWindow(result2,globalOpts.type))return sendCachedValue(handler,opts,result2,age,null,!0),queueMicrotask(()=>{let headers2=makeRevalidationHeaders(opts,result2);dispatch({...opts,headers:headers2},new CacheHandler(globalOpts,cacheKey2,{onRequestStart(){},onRequestUpgrade(){},onResponseStart(){},onResponseData(){},onResponseEnd(){},onResponseError(){}}))}),!0;let withinStaleIfErrorThreshold=!1;if(!staleResponseRequiresRevalidation(result2,globalOpts.type)){let staleIfErrorExpiry=result2.cacheControlDirectives["stale-if-error"]??reqCacheControl?.["stale-if-error"];staleIfErrorExpiry&&(withinStaleIfErrorThreshold=now<result2.staleAt+staleIfErrorExpiry*1e3)}let headers=makeRevalidationHeaders(opts,result2);return dispatch({...opts,headers},new CacheRevalidationHandler((success,context,statusCode,headers2)=>{if(success){if(statusCode===304){if(revalidationResponseDisallowsCachedReuse(globalOpts.type,headers2))return util.isStream(result2.body)&&result2.body.on("error",nop).destroy(),deleteCachedValue(globalOpts.store,cacheKey2),dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler));if(revalidationResponseUpdatesCacheControl(headers2))deleteCachedValue(globalOpts.store,cacheKey2);else if(revalidationResponseAddsVary(result2,headers2.vary?parseVaryHeader(headers2.vary,opts.headers):void 0))return util.isStream(result2.body)&&result2.body.on("error",nop).destroy(),deleteCachedValue(globalOpts.store,cacheKey2),dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler))}sendCachedValue(handler,opts,result2,age,context,stale)}else util.isStream(result2.body)&&result2.body.on("error",nop).destroy()},new CacheHandler(globalOpts,cacheKey2,handler),withinStaleIfErrorThreshold))}util.isStream(opts.body)&&opts.body.on("error",nop).destroy(),sendCachedValue(handler,opts,result2,age,null,!1)}module.exports=(opts={})=>{let{store=new MemoryCacheStore,methods=["GET"],cacheByDefault=void 0,type="shared",origins=void 0}=opts;if(typeof opts!="object"||opts===null)throw new TypeError(`expected type of opts to be an Object, got ${opts===null?"null":typeof opts}`);if(assertCacheStore(store,"opts.store"),assertCacheMethods(methods,"opts.methods"),assertCacheOrigins(origins,"opts.origins"),typeof cacheByDefault<"u"&&typeof cacheByDefault!="number")throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`);if(typeof type<"u"&&type!=="shared"&&type!=="private")throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`);let globalOpts={store,methods,cacheByDefault,type},safeMethodsToNotCache=[];for(let i=0;i<util.safeHTTPMethods.length;i++){let method=util.safeHTTPMethods[i];arrayIncludes(methods,method)||safeMethodsToNotCache.push(method)}return(dispatch,interceptorOrigin)=>(opts2,handler)=>{let requestOrigin=getInterceptorOrigin(opts2,interceptorOrigin);if(!requestOrigin||arrayIncludes(safeMethodsToNotCache,opts2.method))return dispatch(opts2,handler);if(origins!==void 0){let normalizedRequestOrigin=requestOrigin.toString().toLowerCase(),isAllowed=!1;for(let i=0;i<origins.length;i++){let allowed=origins[i];if(typeof allowed=="string"){if(allowed.toLowerCase()===normalizedRequestOrigin){isAllowed=!0;break}}else if(allowed.test(normalizedRequestOrigin)){isAllowed=!0;break}}if(!isAllowed)return dispatch(opts2,handler)}opts2={...opts2,headers:normalizeHeaders(opts2)};let reqCacheControl=opts2.headers?.["cache-control"]?parseCacheControlHeader(opts2.headers["cache-control"]):hasPragmaNoCache(opts2.headers)?{"no-cache":!0}:void 0;if(reqCacheControl?.["no-store"])return dispatch(opts2,handler);let cacheKey2=makeCacheKey(opts2,requestOrigin);if(!arrayIncludes(util.safeHTTPMethods,opts2.method))return dispatch(opts2,new CacheHandler(globalOpts,cacheKey2,handler));let result2=store.get(cacheKey2);return result2&&typeof result2.then=="function"?result2.then(result3=>handleResult(dispatch,globalOpts,cacheKey2,handler,opts2,reqCacheControl,result3)):handleResult(dispatch,globalOpts,cacheKey2,handler,opts2,reqCacheControl,result2)}}}});var require_decompress=__commonJS({"node_modules/undici/lib/interceptor/decompress.js"(exports,module){"use strict";var{createInflate,createGunzip,createBrotliDecompress,createZstdDecompress}=__require("node:zlib"),{pipeline:pipeline2,Transform:TransformStream2}=__require("node:stream"),{InvalidArgumentError,ResponseExceededMaxSizeError}=require_errors(),DecoratorHandler=require_decorator_handler(),supportedEncodings={gzip:createGunzip,"x-gzip":createGunzip,br:createBrotliDecompress,deflate:createInflate,compress:createInflate,"x-compress":createInflate,zstd:createZstdDecompress},defaultSkipStatusCodes=[204,304],defaultMaxSize=64*1024*1024;function createMaxSizeLimiter(maxSize){let size=0;return new TransformStream2({transform(chunk,_encoding,callback){let decompressedSize=size+chunk.length;if(decompressedSize>maxSize){callback(new ResponseExceededMaxSizeError(`Decompressed response size (${decompressedSize}) exceeded maxSize (${maxSize})`));return}size=decompressedSize,callback(null,chunk)}})}var warningEmitted=!1,DecompressHandler=class extends DecoratorHandler{#decompressors=[];#trailers;#skipStatusCodes;#skipErrorResponses;#maxSize;#decompressedSize=0;#terminated=!1;#inputEnded=!1;constructor(handler,{skipStatusCodes=defaultSkipStatusCodes,skipErrorResponses=!0,maxSize=defaultMaxSize}={}){if(!Number.isSafeInteger(maxSize)||maxSize<1)throw new InvalidArgumentError("maxSize must be a positive integer");super(handler),this.#skipStatusCodes=skipStatusCodes,this.#skipErrorResponses=skipErrorResponses,this.#maxSize=maxSize}#shouldSkipDecompression(contentEncoding,statusCode){return!!(!contentEncoding||statusCode<200||this.#skipStatusCodes.includes(statusCode)||this.#skipErrorResponses&&statusCode>=400)}#createDecompressionChain(encodings){let parts=encodings.split(","),maxContentEncodings=5;if(parts.length>maxContentEncodings)throw new Error(`too many content-encodings in response: ${parts.length}, maximum allowed is ${maxContentEncodings}`);let decompressors=[];for(let i=parts.length-1;i>=0;i--){let encoding=parts[i].trim();if(encoding){if(!supportedEncodings[encoding])return decompressors.length=0,decompressors;decompressors.push(supportedEncodings[encoding]())}}if(decompressors.length<2)return decompressors;let streams=[];for(let i=0;i<decompressors.length;i++)streams.push(decompressors[i]),i<decompressors.length-1&&streams.push(createMaxSizeLimiter(this.#maxSize));return streams}#fail(controller,error){this.#terminated||(this.#inputEnded?this.onResponseError(controller,error):controller.abort(error))}#setupDecompressorEvents(decompressor,controller){decompressor.on("readable",()=>{if(this.#terminated)return;let chunk;for(;(chunk=decompressor.read())!==null;){let decompressedSize=this.#decompressedSize+chunk.length;if(decompressedSize>this.#maxSize){this.#fail(controller,new ResponseExceededMaxSizeError(`Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`));return}if(this.#decompressedSize=decompressedSize,super.onResponseData(controller,chunk)===!1)break}}),decompressor.on("error",error=>{this.#fail(controller,error)})}#setupSingleDecompressor(controller){let decompressor=this.#decompressors[0];this.#setupDecompressorEvents(decompressor,controller),decompressor.on("end",()=>{this.#terminated||(this.#terminated=!0,this.#cleanupDecompressors(),super.onResponseEnd(controller,this.#trailers))})}#setupMultipleDecompressors(controller){let lastDecompressor=this.#decompressors[this.#decompressors.length-1];this.#setupDecompressorEvents(lastDecompressor,controller),pipeline2(this.#decompressors,err2=>{if(!this.#terminated){if(err2){this.#fail(controller,err2);return}this.#terminated=!0,this.#cleanupDecompressors(),super.onResponseEnd(controller,this.#trailers)}})}#cleanupDecompressors(){this.#decompressors.length=0}onResponseStart(controller,statusCode,headers,statusMessage){let contentEncoding=headers["content-encoding"];if(this.#shouldSkipDecompression(contentEncoding,statusCode))return super.onResponseStart(controller,statusCode,headers,statusMessage);let decompressors=this.#createDecompressionChain(contentEncoding.toLowerCase());if(decompressors.length===0)return this.#cleanupDecompressors(),super.onResponseStart(controller,statusCode,headers,statusMessage);this.#decompressors=decompressors;let{"content-encoding":_2,"content-length":__,...newHeaders}=headers;if(controller?.rawHeaders){let rawHeaders=controller.rawHeaders;if(Array.isArray(rawHeaders)){let filteredHeaders=[];for(let i=0;i<rawHeaders.length;i+=2){let headerName=rawHeaders[i],lowerName=(Buffer.isBuffer(headerName)?headerName.toString("latin1"):`${headerName}`).toLowerCase();lowerName==="content-encoding"||lowerName==="content-length"||filteredHeaders.push(rawHeaders[i],rawHeaders[i+1])}rawHeaders.splice(0,rawHeaders.length,...filteredHeaders)}else if(typeof rawHeaders=="object")for(let name of Object.keys(rawHeaders)){let lowerName=name.toLowerCase();(lowerName==="content-encoding"||lowerName==="content-length")&&delete rawHeaders[name]}}return this.#decompressors.length===1?this.#setupSingleDecompressor(controller):this.#setupMultipleDecompressors(controller),super.onResponseStart(controller,statusCode,newHeaders,statusMessage)}onResponseData(controller,chunk){if(this.#decompressors.length>0){this.#decompressors[0].write(chunk);return}super.onResponseData(controller,chunk)}onResponseEnd(controller,trailers){if(this.#decompressors.length>0){this.#inputEnded=!0,this.#trailers=trailers,this.#decompressors[0].end();return}super.onResponseEnd(controller,trailers)}onResponseError(controller,err2){if(!this.#terminated){this.#terminated=!0;for(let decompressor of this.#decompressors)decompressor.destroy();this.#cleanupDecompressors(),super.onResponseError(controller,err2)}}};function createDecompressInterceptor(options={}){return warningEmitted||(process.emitWarning("DecompressInterceptor is experimental and subject to change","ExperimentalWarning"),warningEmitted=!0),dispatch=>(opts,handler)=>{if(opts.method==="HEAD")return dispatch(opts,handler);let decompressHandler=new DecompressHandler(handler,options);return dispatch(opts,decompressHandler)}}module.exports=createDecompressInterceptor}});var require_deduplication_handler=__commonJS({"node_modules/undici/lib/handler/deduplication-handler.js"(exports,module){"use strict";var{RequestAbortedError}=require_errors(),DEFAULT_MAX_BUFFER_SIZE=5*1024*1024,DeduplicationHandler=class{#primaryHandler;#waitingHandlers=[];#maxBufferSize=DEFAULT_MAX_BUFFER_SIZE;#statusCode=0;#headers={};#statusMessage="";#aborted=!1;#responseStarted=!1;#responseDataStarted=!1;#completed=!1;#controller=null;#onComplete=null;constructor(primaryHandler,onComplete,maxBufferSize=DEFAULT_MAX_BUFFER_SIZE){this.#primaryHandler=primaryHandler,this.#onComplete=onComplete,this.#maxBufferSize=maxBufferSize}addWaitingHandler(handler){if(this.#completed||this.#responseDataStarted)return!1;let waitingHandler=this.#createWaitingHandler(handler),waitingController=waitingHandler.controller;try{if(handler.onRequestStart?.(waitingController,null),waitingController.aborted)return waitingHandler.done=!0,!0;this.#responseStarted&&handler.onResponseStart?.(waitingController,this.#statusCode,this.#headers,this.#statusMessage)}catch{return waitingHandler.done=!0,!0}return waitingController.aborted||this.#waitingHandlers.push(waitingHandler),!0}onRequestStart(controller,context){this.#controller=controller,this.#primaryHandler.onRequestStart?.(controller,context)}onRequestUpgrade(controller,statusCode,headers,socket){this.#primaryHandler.onRequestUpgrade?.(controller,statusCode,headers,socket)}onResponseStart(controller,statusCode,headers,statusMessage){this.#responseStarted=!0,this.#statusCode=statusCode,this.#headers=headers,this.#statusMessage=statusMessage,this.#primaryHandler.onResponseStart?.(controller,statusCode,headers,statusMessage);for(let waitingHandler of this.#waitingHandlers){let{handler,controller:waitingController}=waitingHandler;if(waitingHandler.done||waitingController.aborted){waitingHandler.done=!0;continue}try{handler.onResponseStart?.(waitingController,statusCode,headers,statusMessage)}catch{}waitingController.aborted&&(waitingHandler.done=!0)}this.#pruneDoneWaitingHandlers()}onResponseData(controller,chunk){if(!(this.#aborted||this.#completed)){this.#responseDataStarted=!0,this.#primaryHandler.onResponseData?.(controller,chunk);for(let waitingHandler of this.#waitingHandlers){let{handler,controller:waitingController}=waitingHandler;if(waitingHandler.done||waitingController.aborted){waitingHandler.done=!0;continue}if(waitingController.paused){this.#bufferWaitingChunk(waitingHandler,chunk);continue}try{handler.onResponseData?.(waitingController,chunk)}catch{}waitingController.aborted&&(waitingHandler.done=!0,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0)}this.#pruneDoneWaitingHandlers()}}onResponseEnd(controller,trailers){if(!(this.#aborted||this.#completed)){this.#completed=!0,this.#primaryHandler.onResponseEnd?.(controller,trailers);for(let waitingHandler of this.#waitingHandlers){if(waitingHandler.done||waitingHandler.controller.aborted){waitingHandler.done=!0;continue}if(this.#flushWaitingHandler(waitingHandler),waitingHandler.done||waitingHandler.controller.aborted){waitingHandler.done=!0;continue}if(waitingHandler.controller.paused&&waitingHandler.bufferedChunks.length>0){waitingHandler.pendingTrailers=trailers;continue}try{waitingHandler.handler.onResponseEnd?.(waitingHandler.controller,trailers)}catch{}waitingHandler.done=!0}this.#pruneDoneWaitingHandlers(),this.#onComplete?.()}}onResponseError(controller,err2){if(!this.#completed){this.#aborted=!0,this.#completed=!0,this.#primaryHandler.onResponseError?.(controller,err2);for(let waitingHandler of this.#waitingHandlers)this.#errorWaitingHandler(waitingHandler,err2);this.#waitingHandlers=[],this.#onComplete?.()}}#createWaitingHandler(handler){let waitingHandler={handler,controller:null,bufferedChunks:[],bufferedBytes:0,pendingTrailers:null,done:!1},state2={aborted:!1,paused:!1,reason:null};return waitingHandler.controller={resume:()=>{if(!state2.aborted){if(state2.paused=!1,this.#flushWaitingHandler(waitingHandler),this.#completed&&waitingHandler.pendingTrailers&&waitingHandler.bufferedChunks.length===0&&!state2.paused&&!state2.aborted){try{waitingHandler.handler.onResponseEnd?.(waitingHandler.controller,waitingHandler.pendingTrailers)}catch{}waitingHandler.pendingTrailers=null,waitingHandler.done=!0}this.#pruneDoneWaitingHandlers()}},pause:()=>{state2.aborted||(state2.paused=!0)},get paused(){return state2.paused},get aborted(){return state2.aborted},get reason(){return state2.reason},abort:reason=>{if(!state2.aborted){state2.aborted=!0,state2.reason=reason??null,waitingHandler.done=!0,waitingHandler.pendingTrailers=null,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0;try{handler.onResponseError?.(waitingHandler.controller,state2.reason??new RequestAbortedError)}catch{}}}},waitingHandler}#bufferWaitingChunk(waitingHandler,chunk){if(waitingHandler.done||waitingHandler.controller.aborted){waitingHandler.done=!0,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0;return}let bufferedChunk=Buffer.from(chunk);if(waitingHandler.bufferedChunks.push(bufferedChunk),waitingHandler.bufferedBytes+=bufferedChunk.length,waitingHandler.bufferedBytes>this.#maxBufferSize){let err2=new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`);this.#errorWaitingHandler(waitingHandler,err2)}}#flushWaitingHandler(waitingHandler){let{handler,controller}=waitingHandler;for(;!waitingHandler.done&&!controller.aborted&&!controller.paused&&waitingHandler.bufferedChunks.length>0;){let bufferedChunk=waitingHandler.bufferedChunks.shift();waitingHandler.bufferedBytes-=bufferedChunk.length;try{handler.onResponseData?.(controller,bufferedChunk)}catch{}if(controller.aborted){waitingHandler.done=!0,waitingHandler.pendingTrailers=null,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0;break}}}#errorWaitingHandler(waitingHandler,err2){waitingHandler.done||(waitingHandler.done=!0,waitingHandler.pendingTrailers=null,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0,waitingHandler.controller.abort(err2))}#pruneDoneWaitingHandlers(){this.#waitingHandlers=this.#waitingHandlers.filter(waitingHandler=>waitingHandler.done===!1)}};module.exports=DeduplicationHandler}});var require_deduplicate=__commonJS({"node_modules/undici/lib/interceptor/deduplicate.js"(exports,module){"use strict";var diagnosticsChannel=__require("node:diagnostics_channel"),util=require_util(),DeduplicationHandler=require_deduplication_handler(),{getInterceptorOrigin,normalizeHeaders,makeCacheKey,makeDeduplicationKey}=require_cache(),pendingRequestsChannel=diagnosticsChannel.channel("undici:request:pending-requests");module.exports=(opts={})=>{let{methods=["GET"],skipHeaderNames=[],excludeHeaderNames=[],maxBufferSize=5*1024*1024}=opts;if(typeof opts!="object"||opts===null)throw new TypeError(`expected type of opts to be an Object, got ${opts===null?"null":typeof opts}`);if(!Array.isArray(methods))throw new TypeError(`expected opts.methods to be an array, got ${typeof methods}`);for(let method of methods)if(!util.safeHTTPMethods.includes(method))throw new TypeError(`expected opts.methods to only contain safe HTTP methods, got ${method}`);if(!Array.isArray(skipHeaderNames))throw new TypeError(`expected opts.skipHeaderNames to be an array, got ${typeof skipHeaderNames}`);if(!Array.isArray(excludeHeaderNames))throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`);if(!Number.isFinite(maxBufferSize)||maxBufferSize<=0)throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`);let skipHeaderNamesSet=new Set(skipHeaderNames.map(name=>name.toLowerCase())),excludeHeaderNamesSet=new Set(excludeHeaderNames.map(name=>name.toLowerCase())),pendingRequests=new Map;return(dispatch,interceptorOrigin)=>(opts2,handler)=>{let requestOrigin=getInterceptorOrigin(opts2,interceptorOrigin);if(!requestOrigin||opts2.upgrade||methods.includes(opts2.method)===!1)return dispatch(opts2,handler);if(opts2={...opts2,headers:normalizeHeaders(opts2)},skipHeaderNamesSet.size>0){for(let headerName of Object.keys(opts2.headers))if(skipHeaderNamesSet.has(headerName.toLowerCase()))return dispatch(opts2,handler)}let cacheKey2=makeCacheKey(opts2,requestOrigin),dedupeKey=makeDeduplicationKey(cacheKey2,excludeHeaderNamesSet),pendingHandler=pendingRequests.get(dedupeKey);if(pendingHandler)return pendingHandler.addWaitingHandler(handler)?!0:dispatch(opts2,handler);let deduplicationHandler=new DeduplicationHandler(handler,()=>{pendingRequests.delete(dedupeKey),pendingRequestsChannel.hasSubscribers&&pendingRequestsChannel.publish({size:pendingRequests.size,key:dedupeKey,type:"removed"})},maxBufferSize);return pendingRequests.set(dedupeKey,deduplicationHandler),pendingRequestsChannel.hasSubscribers&&pendingRequestsChannel.publish({size:pendingRequests.size,key:dedupeKey,type:"added"}),dispatch(opts2,deduplicationHandler)}}}});var require_sqlite_cache_store=__commonJS({"node_modules/undici/lib/cache/sqlite-cache-store.js"(exports,module){"use strict";var{Writable}=__require("node:stream"),{assertCacheKey,assertCacheValue}=require_cache(),DatabaseSync,VERSION2=3,MAX_ENTRY_SIZE=2*1e3*1e3*1e3;module.exports=class{#maxEntrySize=MAX_ENTRY_SIZE;#maxCount=1/0;#db;#getValuesQuery;#updateValueQuery;#insertValueQuery;#deleteExpiredValuesQuery;#deleteByUrlQuery;#countEntriesQuery;#deleteOldValuesQuery;constructor(opts){if(opts){if(typeof opts!="object")throw new TypeError("SqliteCacheStore options must be an object");if(opts.maxEntrySize!==void 0){if(typeof opts.maxEntrySize!="number"||!Number.isInteger(opts.maxEntrySize)||opts.maxEntrySize<0)throw new TypeError("SqliteCacheStore options.maxEntrySize must be a non-negative integer");if(opts.maxEntrySize>MAX_ENTRY_SIZE)throw new TypeError("SqliteCacheStore options.maxEntrySize must be less than 2gb");this.#maxEntrySize=opts.maxEntrySize}if(opts.maxCount!==void 0){if(typeof opts.maxCount!="number"||!Number.isInteger(opts.maxCount)||opts.maxCount<0)throw new TypeError("SqliteCacheStore options.maxCount must be a non-negative integer");this.#maxCount=opts.maxCount}}DatabaseSync||(DatabaseSync=__require("node:sqlite").DatabaseSync),this.#db=new DatabaseSync(opts?.location??":memory:"),this.#db.exec(`
|
|
45
|
+
${pendingInterceptorsFormatter.format(pending)}`.trim())}};module.exports=MockAgent}});var require_snapshot_utils=__commonJS({"node_modules/undici/lib/mock/snapshot-utils.js"(exports,module){"use strict";var{InvalidArgumentError}=require_errors(),{runtimeFeatures}=require_runtime_features();function createHeaderFilters(matchOptions={}){let{ignoreHeaders=[],excludeHeaders=[],matchHeaders=[],caseSensitive=!1}=matchOptions;return{ignore:new Set(ignoreHeaders.map(header=>caseSensitive?header:header.toLowerCase())),exclude:new Set(excludeHeaders.map(header=>caseSensitive?header:header.toLowerCase())),match:new Set(matchHeaders.map(header=>caseSensitive?header:header.toLowerCase()))}}var crypto4=runtimeFeatures.has("crypto")?__require("node:crypto"):null,hashId=crypto4?.hash?value2=>crypto4.hash("sha256",value2,"base64url"):value2=>Buffer.from(value2).toString("base64url");function isUndiciHeaders(headers){return Array.isArray(headers)&&(headers.length&1)===0}function isUrlExcludedFactory(excludePatterns=[]){return excludePatterns.length===0?()=>!1:function(url){let urlLowerCased;for(let pattern of excludePatterns)if(typeof pattern=="string"){if(urlLowerCased||(urlLowerCased=url.toLowerCase()),urlLowerCased.includes(pattern.toLowerCase()))return!0}else if(pattern instanceof RegExp&&pattern.test(url))return!0;return!1}}function normalizeHeaders(headers){let normalizedHeaders={};if(!headers)return normalizedHeaders;if(isUndiciHeaders(headers)){for(let i=0;i<headers.length;i+=2){let key=headers[i],value2=headers[i+1];if(key&&value2!==void 0){let keyStr=Buffer.isBuffer(key)?key.toString():key,valueStr=Buffer.isBuffer(value2)?value2.toString():value2;normalizedHeaders[keyStr.toLowerCase()]=valueStr}}return normalizedHeaders}if(headers&&typeof headers=="object")for(let[key,value2]of Object.entries(headers))key&&typeof key=="string"&&(normalizedHeaders[key.toLowerCase()]=Array.isArray(value2)?value2.join(", "):String(value2));return normalizedHeaders}var validSnapshotModes=["record","playback","update"];function validateSnapshotMode(mode){if(!validSnapshotModes.includes(mode))throw new InvalidArgumentError(`Invalid snapshot mode: ${mode}. Must be one of: ${validSnapshotModes.join(", ")}`)}module.exports={createHeaderFilters,hashId,isUndiciHeaders,normalizeHeaders,isUrlExcludedFactory,validateSnapshotMode}}});var require_snapshot_recorder=__commonJS({"node_modules/undici/lib/mock/snapshot-recorder.js"(exports,module){"use strict";var{writeFile:writeFile4,readFile:readFile7,mkdir:mkdir3}=__require("node:fs/promises"),{dirname:dirname29,resolve:resolve17}=__require("node:path"),{setTimeout:setTimeout2,clearTimeout:clearTimeout2}=__require("node:timers"),{InvalidArgumentError,UndiciError}=require_errors(),{hashId,isUrlExcludedFactory,normalizeHeaders,createHeaderFilters}=require_snapshot_utils();function normalizeUrlForMatching(url,matchQuery,normalizeQuery2){if(matchQuery===!1)return`${url.origin}${url.pathname}`;if(normalizeQuery2){let normalized=String(normalizeQuery2(url.searchParams)??"");return normalized?`${url.origin}${url.pathname}?${normalized}`:`${url.origin}${url.pathname}`}return url.toString()}function normalizeBodyForMatching(body,matchBody,normalizeBody){return matchBody===!1?"":normalizeBody?String(normalizeBody(body)??""):body?String(body):""}function formatRequestKey(opts,headerFilters,matchOptions={}){let url=new URL(opts.path,opts.origin),normalized=opts._normalizedHeaders||normalizeHeaders(opts.headers);return opts._normalizedHeaders||(opts._normalizedHeaders=normalized),{method:opts.method||"GET",url:normalizeUrlForMatching(url,matchOptions.matchQuery,matchOptions.normalizeQuery),headers:filterHeadersForMatching(normalized,headerFilters,matchOptions),body:normalizeBodyForMatching(opts.body,matchOptions.matchBody,matchOptions.normalizeBody)}}function filterHeadersForMatching(headers,headerFilters,matchOptions={}){if(!headers||typeof headers!="object")return{};let{caseSensitive=!1}=matchOptions,filtered={},{ignore:ignore4,exclude,match:match2}=headerFilters;for(let[key,value2]of Object.entries(headers)){let headerKey=caseSensitive?key:key.toLowerCase();exclude.has(headerKey)||ignore4.has(headerKey)||match2.size!==0&&!match2.has(headerKey)||(filtered[headerKey]=value2)}return filtered}function filterHeadersForStorage(headers,headerFilters,matchOptions={}){if(!headers||typeof headers!="object")return{};let{caseSensitive=!1}=matchOptions,filtered={},{exclude:excludeSet}=headerFilters;for(let[key,value2]of Object.entries(headers)){let headerKey=caseSensitive?key:key.toLowerCase();excludeSet.has(headerKey)||(filtered[headerKey]=value2)}return filtered}function createRequestHash(formattedRequest){let parts=[formattedRequest.method,formattedRequest.url];if(formattedRequest.headers&&typeof formattedRequest.headers=="object"){let headerKeys=Object.keys(formattedRequest.headers).sort();for(let key of headerKeys){let values=Array.isArray(formattedRequest.headers[key])?formattedRequest.headers[key]:[formattedRequest.headers[key]];parts.push(key);for(let value2 of values.sort())parts.push(String(value2))}}parts.push(formattedRequest.body);let content=parts.join("|");return hashId(content)}var SnapshotRecorder=class{#flushTimeout;#isUrlExcluded;#snapshots=new Map;#snapshotPath;#maxSnapshots=1/0;#autoFlush=!1;#headerFilters;constructor(options={}){this.#snapshotPath=options.snapshotPath,this.#maxSnapshots=options.maxSnapshots||1/0,this.#autoFlush=options.autoFlush||!1,this.flushInterval=options.flushInterval||3e4,this._flushTimer=null,this.matchOptions={matchHeaders:options.matchHeaders||[],ignoreHeaders:options.ignoreHeaders||[],excludeHeaders:options.excludeHeaders||[],matchBody:options.matchBody!==!1,normalizeBody:options.normalizeBody||void 0,matchQuery:options.matchQuery!==!1,normalizeQuery:options.normalizeQuery||void 0,caseSensitive:options.caseSensitive||!1},this.#headerFilters=createHeaderFilters(this.matchOptions),this.shouldRecord=options.shouldRecord||(()=>!0),this.shouldPlayback=options.shouldPlayback||(()=>!0),this.#isUrlExcluded=isUrlExcludedFactory(options.excludeUrls),this.#autoFlush&&this.#snapshotPath&&this.#startAutoFlush()}async record(requestOpts,response){if(!this.shouldRecord(requestOpts)||this.isUrlExcluded(requestOpts))return;let request=formatRequestKey(requestOpts,this.#headerFilters,this.matchOptions),hash=createRequestHash(request),normalizedHeaders=normalizeHeaders(response.headers),responseData={statusCode:response.statusCode,headers:filterHeadersForStorage(normalizedHeaders,this.#headerFilters,this.matchOptions),body:Buffer.isBuffer(response.body)?response.body.toString("base64"):Buffer.from(String(response.body||"")).toString("base64"),trailers:response.trailers};if(this.#snapshots.size>=this.#maxSnapshots&&!this.#snapshots.has(hash)){let oldestKey=this.#snapshots.keys().next().value;this.#snapshots.delete(oldestKey)}let existingSnapshot=this.#snapshots.get(hash);existingSnapshot&&existingSnapshot.responses?(existingSnapshot.responses.push(responseData),existingSnapshot.timestamp=new Date().toISOString()):this.#snapshots.set(hash,{request,responses:[responseData],callCount:0,timestamp:new Date().toISOString()}),this.#autoFlush&&this.#snapshotPath&&this.#scheduleFlush()}isUrlExcluded(requestOpts){let url=new URL(requestOpts.path,requestOpts.origin).toString();return this.#isUrlExcluded(url)}findSnapshot(requestOpts){if(!this.shouldPlayback(requestOpts)||this.isUrlExcluded(requestOpts))return;let request=formatRequestKey(requestOpts,this.#headerFilters,this.matchOptions),hash=createRequestHash(request),snapshot=this.#snapshots.get(hash);if(!snapshot)return;let currentCallCount=snapshot.callCount||0,responseIndex=Math.min(currentCallCount,snapshot.responses.length-1);return snapshot.callCount=currentCallCount+1,{...snapshot,response:snapshot.responses[responseIndex]}}async loadSnapshots(filePath){let path14=filePath||this.#snapshotPath;if(!path14)throw new InvalidArgumentError("Snapshot path is required");try{let data=await readFile7(resolve17(path14),"utf8"),parsed=JSON.parse(data);if(Array.isArray(parsed)){this.#snapshots.clear();for(let{hash,snapshot}of parsed)this.#snapshots.set(hash,snapshot)}else this.#snapshots=new Map(Object.entries(parsed))}catch(error){if(error.code==="ENOENT")this.#snapshots.clear();else throw new UndiciError(`Failed to load snapshots from ${path14}`,{cause:error})}}async saveSnapshots(filePath){let path14=filePath||this.#snapshotPath;if(!path14)throw new InvalidArgumentError("Snapshot path is required");let resolvedPath=resolve17(path14);await mkdir3(dirname29(resolvedPath),{recursive:!0});let data=Array.from(this.#snapshots.entries()).map(([hash,snapshot])=>({hash,snapshot}));await writeFile4(resolvedPath,JSON.stringify(data,null,2),{flush:!0})}clear(){this.#snapshots.clear()}getSnapshots(){return Array.from(this.#snapshots.values())}size(){return this.#snapshots.size}resetCallCounts(){for(let snapshot of this.#snapshots.values())snapshot.callCount=0}deleteSnapshot(requestOpts){let request=formatRequestKey(requestOpts,this.#headerFilters,this.matchOptions),hash=createRequestHash(request);return this.#snapshots.delete(hash)}getSnapshotInfo(requestOpts){let request=formatRequestKey(requestOpts,this.#headerFilters,this.matchOptions),hash=createRequestHash(request),snapshot=this.#snapshots.get(hash);return snapshot?{hash,request:snapshot.request,responseCount:snapshot.responses?snapshot.responses.length:snapshot.response?1:0,callCount:snapshot.callCount||0,timestamp:snapshot.timestamp}:null}replaceSnapshots(snapshotData){if(this.#snapshots.clear(),Array.isArray(snapshotData))for(let{hash,snapshot}of snapshotData)this.#snapshots.set(hash,snapshot);else snapshotData&&typeof snapshotData=="object"&&(this.#snapshots=new Map(Object.entries(snapshotData)))}#startAutoFlush(){return this.#scheduleFlush()}#stopAutoFlush(){this.#flushTimeout&&(clearTimeout2(this.#flushTimeout),this.saveSnapshots().catch(()=>{}),this.#flushTimeout=null)}#scheduleFlush(){this.#flushTimeout=setTimeout2(()=>{this.saveSnapshots().catch(()=>{}),this.#autoFlush?this.#flushTimeout?.refresh():this.#flushTimeout=null},1e3)}destroy(){this.#stopAutoFlush(),this.#flushTimeout&&(clearTimeout2(this.#flushTimeout),this.#flushTimeout=null)}async close(){this.#snapshotPath&&this.#snapshots.size!==0&&await this.saveSnapshots(),this.destroy()}};module.exports={SnapshotRecorder,formatRequestKey,createRequestHash,filterHeadersForMatching,filterHeadersForStorage,createHeaderFilters}}});var require_snapshot_agent=__commonJS({"node_modules/undici/lib/mock/snapshot-agent.js"(exports,module){"use strict";var Agent2=require_agent(),MockAgent=require_mock_agent(),{SnapshotRecorder}=require_snapshot_recorder(),{InvalidArgumentError,UndiciError}=require_errors(),util=require_util(),{validateSnapshotMode}=require_snapshot_utils(),kSnapshotRecorder=Symbol("kSnapshotRecorder"),kSnapshotMode=Symbol("kSnapshotMode"),kSnapshotPath=Symbol("kSnapshotPath"),kSnapshotLoaded=Symbol("kSnapshotLoaded"),kRealAgent=Symbol("kRealAgent"),warningEmitted=!1,SnapshotAgent=class extends MockAgent{constructor(opts={}){warningEmitted||(process.emitWarning("SnapshotAgent is experimental and subject to change","ExperimentalWarning"),warningEmitted=!0);let{mode="record",snapshotPath=null,...mockAgentOpts}=opts;if(super(mockAgentOpts),validateSnapshotMode(mode),(mode==="playback"||mode==="update")&&!snapshotPath)throw new InvalidArgumentError(`snapshotPath is required when mode is '${mode}'`);this[kSnapshotMode]=mode,this[kSnapshotPath]=snapshotPath,this[kSnapshotRecorder]=new SnapshotRecorder({snapshotPath:this[kSnapshotPath],mode:this[kSnapshotMode],maxSnapshots:opts.maxSnapshots,autoFlush:opts.autoFlush,flushInterval:opts.flushInterval,matchHeaders:opts.matchHeaders,ignoreHeaders:opts.ignoreHeaders,excludeHeaders:opts.excludeHeaders,matchBody:opts.matchBody,normalizeBody:opts.normalizeBody,matchQuery:opts.matchQuery,normalizeQuery:opts.normalizeQuery,caseSensitive:opts.caseSensitive,shouldRecord:opts.shouldRecord,shouldPlayback:opts.shouldPlayback,excludeUrls:opts.excludeUrls}),this[kSnapshotLoaded]=!1,(this[kSnapshotMode]==="record"||this[kSnapshotMode]==="update"||this[kSnapshotMode]==="playback"&&opts.excludeUrls&&opts.excludeUrls.length>0)&&(this[kRealAgent]=new Agent2(opts)),(this[kSnapshotMode]==="playback"||this[kSnapshotMode]==="update")&&this[kSnapshotPath]&&this.loadSnapshots().catch(()=>{})}dispatch(opts,handler){let mode=this[kSnapshotMode];if(this[kSnapshotRecorder].isUrlExcluded(opts))return this[kRealAgent].dispatch(opts,handler);if(mode==="playback"||mode==="update"){if(!this[kSnapshotLoaded])return this.#asyncDispatch(opts,handler);let snapshot=this[kSnapshotRecorder].findSnapshot(opts);if(snapshot)return this.#replaySnapshot(snapshot,handler);if(mode==="update")return this.#recordAndReplay(opts,handler);{let error=new UndiciError(`No snapshot found for ${opts.method||"GET"} ${opts.path}`);if(handler.onResponseError){handler.onResponseError(null,error);return}throw error}}else if(mode==="record")return this.#recordAndReplay(opts,handler)}async#asyncDispatch(opts,handler){return await this.loadSnapshots(),this.dispatch(opts,handler)}#recordAndReplay(opts,handler){let responseData={statusCode:null,headers:{},trailers:{},body:[]},self=this,recordingHandler={onRequestStart(controller,context){return handler.onRequestStart(controller,{...context,history:this.history})},onRequestUpgrade(controller,statusCode,headers,socket){return handler.onRequestUpgrade(controller,statusCode,headers,socket)},onResponseStart(controller,statusCode,headers,statusMessage){return responseData.statusCode=statusCode,responseData.headers=headers,handler.onResponseStart(controller,statusCode,headers,statusMessage)},onResponseData(controller,chunk){return responseData.body.push(chunk),handler.onResponseData(controller,chunk)},onResponseEnd(controller,trailers){responseData.trailers=trailers;let responseBody=Buffer.concat(responseData.body);self[kSnapshotRecorder].record(opts,{statusCode:responseData.statusCode,headers:responseData.headers,body:responseBody,trailers:responseData.trailers}).then(()=>handler.onResponseEnd(controller,trailers)).catch(error=>handler.onResponseError(controller,error))},onResponseError(controller,error){return handler.onResponseError(controller,error)}};return this[kRealAgent].dispatch(opts,recordingHandler)}#replaySnapshot(snapshot,handler){try{let{response}=snapshot,rawHeaders=response.headers?util.toRawHeaders(response.headers):[],rawTrailers=response.trailers?util.toRawHeaders(response.trailers):[],controller={rawHeaders,rawTrailers,pause(){},resume(){},abort(reason){this.aborted=!0,this.reason=reason},aborted:!1,paused:!1};handler.onRequestStart(controller),handler.onResponseStart(controller,response.statusCode,response.headers,response.statusMessage);let body=Buffer.from(response.body,"base64");handler.onResponseData(controller,body),handler.onResponseEnd(controller,response.trailers)}catch(error){handler.onResponseError?.(null,error)}}async loadSnapshots(filePath){await this[kSnapshotRecorder].loadSnapshots(filePath||this[kSnapshotPath]),this[kSnapshotLoaded]=!0,this[kSnapshotMode]==="playback"&&this.#setupMockInterceptors()}async saveSnapshots(filePath){return this[kSnapshotRecorder].saveSnapshots(filePath||this[kSnapshotPath])}#setupMockInterceptors(){for(let snapshot of this[kSnapshotRecorder].getSnapshots()){let{request,responses,response}=snapshot,url=new URL(request.url),mockPool=this.get(url.origin),responseData=responses?responses[0]:response;responseData&&mockPool.intercept({path:url.pathname+url.search,method:request.method,headers:request.headers,body:request.body}).reply(responseData.statusCode,responseData.body,{headers:responseData.headers,trailers:responseData.trailers}).persist()}}getRecorder(){return this[kSnapshotRecorder]}getMode(){return this[kSnapshotMode]}clearSnapshots(){this[kSnapshotRecorder].clear()}resetCallCounts(){this[kSnapshotRecorder].resetCallCounts()}deleteSnapshot(requestOpts){return this[kSnapshotRecorder].deleteSnapshot(requestOpts)}getSnapshotInfo(requestOpts){return this[kSnapshotRecorder].getSnapshotInfo(requestOpts)}replaceSnapshots(snapshotData){this[kSnapshotRecorder].replaceSnapshots(snapshotData)}async close(){this[kSnapshotMode]==="playback"?this[kSnapshotRecorder].destroy():await this[kSnapshotRecorder].close(),await this[kRealAgent]?.close(),await super.close()}};module.exports=SnapshotAgent}});var require_global2=__commonJS({"node_modules/undici/lib/global.js"(exports,module){"use strict";var globalDispatcher=Symbol.for("undici.globalDispatcher.2"),legacyGlobalDispatcher=Symbol.for("undici.globalDispatcher.1"),{InvalidArgumentError}=require_errors(),Agent2=require_agent(),Dispatcher1Wrapper=require_dispatcher1_wrapper(),fallbackDispatcher;getGlobalDispatcher()===void 0&&setGlobalDispatcher2(new Agent2);function setGlobalDispatcher2(agent){if(!agent||typeof agent.dispatch!="function")throw new InvalidArgumentError("Argument agent must implement Agent");try{Object.defineProperty(globalThis,globalDispatcher,{value:agent,writable:!0,enumerable:!1,configurable:!1})}catch(err2){if(err2 instanceof TypeError){fallbackDispatcher=agent;return}throw err2}try{let legacyAgent=agent instanceof Dispatcher1Wrapper?agent:new Dispatcher1Wrapper(agent);Object.defineProperty(globalThis,legacyGlobalDispatcher,{value:legacyAgent,writable:!0,enumerable:!1,configurable:!1})}catch(err2){if(!(err2 instanceof TypeError))throw err2}}function getGlobalDispatcher(){return globalThis[globalDispatcher]??fallbackDispatcher}var installedExports=["fetch","Headers","Response","Request","FormData","WebSocket","CloseEvent","ErrorEvent","MessageEvent","EventSource"];module.exports={setGlobalDispatcher:setGlobalDispatcher2,getGlobalDispatcher,installedExports}}});var require_decorator_handler=__commonJS({"node_modules/undici/lib/handler/decorator-handler.js"(exports,module){"use strict";var assert=__require("node:assert");module.exports=class{#handler;#onCompleteCalled=!1;#onErrorCalled=!1;#onResponseStartCalled=!1;constructor(handler){if(typeof handler!="object"||handler===null)throw new TypeError("handler must be an object");this.#handler=handler}onRequestStart(...args){this.#handler.onRequestStart?.(...args)}onRequestUpgrade(...args){return assert(!this.#onCompleteCalled),assert(!this.#onErrorCalled),this.#handler.onRequestUpgrade?.(...args)}onResponseStart(...args){return assert(!this.#onCompleteCalled),assert(!this.#onErrorCalled),assert(!this.#onResponseStartCalled),this.#onResponseStartCalled=!0,this.#handler.onResponseStart?.(...args)}onResponseData(...args){return assert(!this.#onCompleteCalled),assert(!this.#onErrorCalled),this.#handler.onResponseData?.(...args)}onResponseEnd(...args){return assert(!this.#onCompleteCalled),assert(!this.#onErrorCalled),this.#onCompleteCalled=!0,this.#handler.onResponseEnd?.(...args)}onResponseError(...args){return this.#onErrorCalled=!0,this.#handler.onResponseError?.(...args)}onBodySent(...args){return this.#handler.onBodySent?.(...args)}onRequestSent(...args){return this.#handler.onRequestSent?.(...args)}}}});var require_redirect_handler=__commonJS({"node_modules/undici/lib/handler/redirect-handler.js"(exports,module){"use strict";var util=require_util(),assert=__require("node:assert"),{InvalidArgumentError}=require_errors(),{kRequestOrigin}=require_symbols(),redirectableStatusCodes=[300,301,302,303,307,308],noop=()=>{},RedirectHandler=class _RedirectHandler{static buildDispatch(dispatcher,maxRedirections){if(maxRedirections!=null&&(!Number.isInteger(maxRedirections)||maxRedirections<0))throw new InvalidArgumentError("maxRedirections must be a positive number");let dispatch=dispatcher.dispatch.bind(dispatcher);return(opts,originalHandler)=>dispatch(opts,new _RedirectHandler(dispatch,maxRedirections,opts,originalHandler))}constructor(dispatch,maxRedirections,opts,handler){if(maxRedirections!=null&&(!Number.isInteger(maxRedirections)||maxRedirections<0))throw new InvalidArgumentError("maxRedirections must be a positive number");if(opts.throwOnMaxRedirect!=null&&typeof opts.throwOnMaxRedirect!="boolean")throw new InvalidArgumentError("throwOnMaxRedirect must be a boolean");this.dispatch=dispatch,this.location=null;let{maxRedirections:_2,stripHeadersOnRedirect,stripHeadersOnCrossOriginRedirect,...cleanOpts}=opts;this.opts=cleanOpts,this.opts.body=util.wrapRequestBody(this.opts.body),this.stripHeadersOnRedirect=normalizeStripHeaders(stripHeadersOnRedirect,"stripHeadersOnRedirect"),this.stripHeadersOnCrossOriginRedirect=normalizeStripHeaders(stripHeadersOnCrossOriginRedirect,"stripHeadersOnCrossOriginRedirect"),this.maxRedirections=maxRedirections,this.handler=handler,this.history=[]}onRequestStart(controller,context){this.handler.onRequestStart?.(controller,{...context,history:this.history})}onBodySent(chunk){this.handler.onBodySent?.(chunk)}onRequestSent(){this.handler.onRequestSent?.()}onRequestUpgrade(controller,statusCode,headers,socket){this.handler.onRequestUpgrade?.(controller,statusCode,headers,socket)}onResponseStart(controller,statusCode,headers,statusMessage){if(this.opts.throwOnMaxRedirect&&this.history.length>=this.maxRedirections)throw new Error("max redirects");let removeContentHeaders=statusCode===303;(statusCode===301||statusCode===302)&&this.opts.method==="POST"&&(this.opts.method="GET",util.isStream(this.opts.body)&&util.destroy(this.opts.body.on("error",noop)),this.opts.body=null,removeContentHeaders=!0),statusCode===303&&this.opts.method!=="HEAD"&&(this.opts.method="GET",util.isStream(this.opts.body)&&util.destroy(this.opts.body.on("error",noop)),this.opts.body=null),this.location=this.history.length>=this.maxRedirections||util.isDisturbed(this.opts.body)||redirectableStatusCodes.indexOf(statusCode)===-1?null:headers.location;let requestOrigin=this.opts[kRequestOrigin]===void 0?this.opts.origin:this.opts[kRequestOrigin];if(requestOrigin&&this.history.push(new URL(this.opts.path,requestOrigin)),!this.location){this.handler.onResponseStart?.(controller,statusCode,headers,statusMessage);return}let baseUrl=requestOrigin?new URL(this.opts.path,requestOrigin):void 0,{origin,pathname,search}=util.parseURL(new URL(this.location,baseUrl)),path14=search?`${pathname}${search}`:pathname,redirectUrlString=`${origin}${path14}`;for(let historyUrl of this.history)if(historyUrl.toString()===redirectUrlString)throw new InvalidArgumentError(`Redirect loop detected. Cannot redirect to ${origin}. This typically happens when using a Client or Pool with cross-origin redirects. Use an Agent for cross-origin redirects.`);this.opts.headers=cleanRequestHeaders(this.opts.headers,removeContentHeaders,requestOrigin!==origin,this.stripHeadersOnRedirect,this.stripHeadersOnCrossOriginRedirect),this.opts.path=path14,this.opts.origin=origin,this.opts[kRequestOrigin]=origin,this.opts.query=null}onResponseData(controller,chunk){this.location||this.handler.onResponseData?.(controller,chunk)}onResponseEnd(controller,trailers){this.location?this.dispatch(this.opts,this):this.handler.onResponseEnd(controller,trailers)}onResponseError(controller,error){this.handler.onResponseError?.(controller,error)}};function shouldRemoveHeader(header,removeContent,unknownOrigin,stripHeaders,stripHeadersOnCrossOrigin){let name=util.headerNameToString(header);return name==="host"||stripHeaders?.has(name)||unknownOrigin&&stripHeadersOnCrossOrigin?.has(name)||removeContent&&name.startsWith("content-")?!0:unknownOrigin?name==="authorization"||name==="cookie"||name==="proxy-authorization":!1}function normalizeStripHeaders(headers,optionName){if(headers==null)return null;if(!Array.isArray(headers))throw new InvalidArgumentError(`${optionName} must be an array`);let normalized=new Set;for(let header of headers){if(typeof header!="string")throw new InvalidArgumentError(`${optionName} must contain header names`);normalized.add(util.headerNameToString(header))}return normalized}function cleanRequestHeaders(headers,removeContent,unknownOrigin,stripHeaders,stripHeadersOnCrossOrigin){let ret=[];if(Array.isArray(headers))for(let i=0;i<headers.length;i+=2)shouldRemoveHeader(headers[i],removeContent,unknownOrigin,stripHeaders,stripHeadersOnCrossOrigin)||ret.push(headers[i],headers[i+1]);else if(headers&&typeof headers=="object"){let entries=util.hasSafeIterator(headers)?headers:Object.entries(headers);for(let[key,value2]of entries)shouldRemoveHeader(key,removeContent,unknownOrigin,stripHeaders,stripHeadersOnCrossOrigin)||ret.push(key,value2)}else assert(headers==null,"headers must be an object or an array");return ret}module.exports=RedirectHandler}});var require_redirect=__commonJS({"node_modules/undici/lib/interceptor/redirect.js"(exports,module){"use strict";var RedirectHandler=require_redirect_handler();function createRedirectInterceptor({maxRedirections:defaultMaxRedirections,throwOnMaxRedirect:defaultThrowOnMaxRedirect,stripHeadersOnRedirect:defaultStripHeadersOnRedirect,stripHeadersOnCrossOriginRedirect:defaultStripHeadersOnCrossOriginRedirect}={}){return dispatch=>function(opts,handler){let{maxRedirections=defaultMaxRedirections,throwOnMaxRedirect=defaultThrowOnMaxRedirect,stripHeadersOnRedirect=defaultStripHeadersOnRedirect,stripHeadersOnCrossOriginRedirect=defaultStripHeadersOnCrossOriginRedirect,...rest}=opts;if(maxRedirections==null||maxRedirections===0)return dispatch(opts,handler);let dispatchOpts={...rest,throwOnMaxRedirect,stripHeadersOnRedirect,stripHeadersOnCrossOriginRedirect},redirectHandler=new RedirectHandler(dispatch,maxRedirections,dispatchOpts,handler);return dispatch(dispatchOpts,redirectHandler)}}module.exports=createRedirectInterceptor}});var require_response_error=__commonJS({"node_modules/undici/lib/interceptor/response-error.js"(exports,module){"use strict";var DecoratorHandler=require_decorator_handler(),{ResponseError}=require_errors(),ResponseErrorHandler=class extends DecoratorHandler{#statusCode;#contentType;#decoder;#headers;#body;constructor(_opts,{handler}){super(handler)}#checkContentType(contentType){return(this.#contentType??"").indexOf(contentType)===0}onRequestStart(controller,context){return this.#statusCode=0,this.#contentType=null,this.#decoder=null,this.#headers=null,this.#body="",super.onRequestStart(controller,context)}onResponseStart(controller,statusCode,headers,statusMessage){if(this.#statusCode=statusCode,this.#headers=headers,this.#contentType=headers["content-type"],this.#statusCode<400)return super.onResponseStart(controller,statusCode,headers,statusMessage);(this.#checkContentType("application/json")||this.#checkContentType("text/plain"))&&(this.#decoder=new TextDecoder("utf-8"))}onResponseData(controller,chunk){if(this.#statusCode<400)return super.onResponseData(controller,chunk);this.#body+=this.#decoder?.decode(chunk,{stream:!0})??""}onResponseEnd(controller,trailers){if(this.#statusCode>=400){if(this.#body+=this.#decoder?.decode(void 0,{stream:!1})??"",this.#checkContentType("application/json"))try{this.#body=JSON.parse(this.#body)}catch{}let err2,stackTraceLimit=Error.stackTraceLimit;Error.stackTraceLimit=0;try{err2=new ResponseError("Response Error",this.#statusCode,{body:this.#body,headers:this.#headers})}finally{Error.stackTraceLimit=stackTraceLimit}super.onResponseError(controller,err2)}else super.onResponseEnd(controller,trailers)}onResponseError(controller,err2){super.onResponseError(controller,err2)}};module.exports=()=>dispatch=>function(opts,handler){return dispatch(opts,new ResponseErrorHandler(opts,{handler}))}}});var require_retry=__commonJS({"node_modules/undici/lib/interceptor/retry.js"(exports,module){"use strict";var RetryHandler=require_retry_handler();module.exports=globalOpts=>dispatch=>function(opts,handler){return dispatch(opts,new RetryHandler({...opts,retryOptions:{...globalOpts,...opts.retryOptions}},{handler,dispatch}))}}});var require_dump=__commonJS({"node_modules/undici/lib/interceptor/dump.js"(exports,module){"use strict";var{InvalidArgumentError,RequestAbortedError}=require_errors(),DecoratorHandler=require_decorator_handler(),DumpHandler=class extends DecoratorHandler{#maxSize=1024*1024;#dumped=!1;#size=0;aborted=!1;reason=!1;constructor({maxSize,signal},handler){if(maxSize!=null&&(!Number.isFinite(maxSize)||maxSize<1))throw new InvalidArgumentError("maxSize must be a number greater than 0");super(handler),this.#maxSize=maxSize??this.#maxSize}#abort(reason){this.aborted=!0,this.reason=reason}onRequestStart(controller,context){return controller.abort=this.#abort.bind(this),super.onRequestStart(controller,context)}onResponseStart(controller,statusCode,headers,statusMessage){let contentLength=headers["content-length"];if(contentLength!=null&&contentLength>this.#maxSize)throw new RequestAbortedError(`Response size (${contentLength}) larger than maxSize (${this.#maxSize})`);return this.aborted===!0?!0:super.onResponseStart(controller,statusCode,headers,statusMessage)}onResponseError(controller,err2){super.onResponseError(controller,this.aborted===!0?this.reason:err2)}onResponseData(controller,chunk){if(this.#size=this.#size+chunk.length,this.#size>this.#maxSize)throw new RequestAbortedError(`Response size (${this.#size}) larger than maxSize (${this.#maxSize})`);return this.#size===this.#maxSize&&(this.#dumped=!0),!0}onResponseEnd(controller,trailers){if(this.aborted===!0){super.onResponseError(controller,this.reason);return}super.onResponseEnd(controller,this.#dumped?{}:trailers)}};function createDumpInterceptor({maxSize:defaultMaxSize}={maxSize:1024*1024}){return dispatch=>function(opts,handler){let{dumpMaxSize=defaultMaxSize}=opts,dumpHandler=new DumpHandler({maxSize:dumpMaxSize,signal:opts.signal},handler);return dispatch(opts,dumpHandler)}}module.exports=createDumpInterceptor}});var require_dns=__commonJS({"node_modules/undici/lib/interceptor/dns.js"(exports,module){"use strict";var{isIP}=__require("node:net"),{lookup}=__require("node:dns"),DecoratorHandler=require_decorator_handler(),{InvalidArgumentError,InformationalError}=require_errors(),{kRequestOrigin}=require_symbols(),maxInt=Math.pow(2,31)-1;function hasSafeIterator(headers){let prototype=Object.getPrototypeOf(headers);return Object.hasOwn(headers,Symbol.iterator)||prototype!=null&&prototype!==Object.prototype&&typeof headers[Symbol.iterator]=="function"}function isHostHeader(key){return typeof key=="string"&&key.toLowerCase()==="host"}function normalizeHeaders(headers){if(headers==null)return null;if(Array.isArray(headers)){if(headers.length===0||!Array.isArray(headers[0]))return headers;let normalized=[];for(let header of headers)Array.isArray(header)&&header.length===2?normalized.push(header[0],header[1]):normalized.push(header);return normalized}if(typeof headers=="object"&&hasSafeIterator(headers)){let normalized=[];for(let header of headers)Array.isArray(header)&&header.length===2?normalized.push(header[0],header[1]):normalized.push(header);return normalized}return headers}function hasHostHeader(headers){if(headers==null)return!1;if(Array.isArray(headers)){if(headers.length===0)return!1;for(let i=0;i<headers.length;i+=2)if(isHostHeader(headers[i]))return!0;return!1}if(typeof headers=="object"){for(let key in headers)if(isHostHeader(key))return!0}return!1}function withHostHeader(host,headers){let normalizedHeaders=normalizeHeaders(headers);return hasHostHeader(normalizedHeaders)?normalizedHeaders:Array.isArray(normalizedHeaders)?["host",host,...normalizedHeaders]:normalizedHeaders&&typeof normalizedHeaders=="object"?{host,...normalizedHeaders}:{host}}var DNSStorage=class{#maxItems=0;#records=new Map;constructor(opts){this.#maxItems=opts.maxItems}get size(){return this.#records.size}get(hostname){return this.#records.get(hostname)??null}set(hostname,records){this.#records.set(hostname,records)}delete(hostname){this.#records.delete(hostname)}full(){return this.size>=this.#maxItems}},DNSInstance=class{#maxTTL=0;#maxItems=0;dualStack=!0;affinity=null;lookup=null;pick=null;storage=null;constructor(opts){this.#maxTTL=opts.maxTTL,this.#maxItems=opts.maxItems,this.dualStack=opts.dualStack,this.affinity=opts.affinity,this.lookup=opts.lookup??this.#defaultLookup,this.pick=opts.pick??this.#defaultPick,this.storage=opts.storage??new DNSStorage(opts)}runLookup(origin,opts,cb){let ips=this.storage.get(origin.hostname);if(ips==null&&this.storage.full()){cb(null,origin);return}let newOpts={affinity:this.affinity,dualStack:this.dualStack,lookup:this.lookup,pick:this.pick,...opts.dns,maxTTL:this.#maxTTL,maxItems:this.#maxItems};if(ips==null)this.lookup(origin,newOpts,(err2,addresses)=>{if(err2||addresses==null||addresses.length===0){cb(err2??new InformationalError("No DNS entries found"));return}this.setRecords(origin,addresses);let records=this.storage.get(origin.hostname),ip=this.pick(origin,records,newOpts.affinity),port;typeof ip.port=="number"?port=`:${ip.port}`:origin.port!==""?port=`:${origin.port}`:port="",cb(null,new URL(`${origin.protocol}//${ip.family===6?`[${ip.address}]`:ip.address}${port}`))});else{let ip=this.pick(origin,ips,newOpts.affinity);if(ip==null){this.storage.delete(origin.hostname),this.runLookup(origin,opts,cb);return}let port;typeof ip.port=="number"?port=`:${ip.port}`:origin.port!==""?port=`:${origin.port}`:port="",cb(null,new URL(`${origin.protocol}//${ip.family===6?`[${ip.address}]`:ip.address}${port}`))}}#defaultLookup(origin,opts,cb){lookup(origin.hostname,{all:!0,family:this.dualStack===!1?this.affinity:0,order:"ipv4first"},(err2,addresses)=>{if(err2)return cb(err2);let results=new Map;for(let addr of addresses)results.set(`${addr.address}:${addr.family}`,addr);cb(null,results.values())})}#defaultPick(origin,hostnameRecords,affinity){let ip=null,{records,offset}=hostnameRecords,family;if(this.dualStack?(affinity==null&&(offset==null||offset===maxInt?(hostnameRecords.offset=0,affinity=4):(hostnameRecords.offset++,affinity=(hostnameRecords.offset&1)===1?6:4)),records[affinity]!=null&&records[affinity].ips.length>0?family=records[affinity]:family=records[affinity===4?6:4]):family=records[affinity],family==null||family.ips.length===0)return ip;family.offset==null||family.offset===maxInt?family.offset=0:family.offset++;let position=family.offset%family.ips.length;return ip=family.ips[position]??null,ip==null?ip:Date.now()-ip.timestamp>ip.ttl?(family.ips.splice(position,1),this.pick(origin,hostnameRecords,affinity)):ip}pickFamily(origin,ipFamily){let records=this.storage.get(origin.hostname)?.records;if(!records)return null;let family=records[ipFamily];if(!family)return null;family.offset==null||family.offset===maxInt?family.offset=0:family.offset++;let position=family.offset%family.ips.length,ip=family.ips[position]??null;return ip==null||Date.now()-ip.timestamp>ip.ttl&&family.ips.splice(position,1),ip}setRecords(origin,addresses){let timestamp=Date.now(),records={records:{4:null,6:null}},minTTL=this.#maxTTL;for(let record of addresses){record.timestamp=timestamp,typeof record.ttl=="number"?(record.ttl=Math.min(record.ttl,this.#maxTTL),minTTL=Math.min(minTTL,record.ttl)):record.ttl=this.#maxTTL;let familyRecords=records.records[record.family]??{ips:[]};familyRecords.ips.push(record),records.records[record.family]=familyRecords}this.storage.set(origin.hostname,records,{ttl:minTTL})}deleteRecords(origin){this.storage.delete(origin.hostname)}getHandler(meta,opts){return new DNSDispatchHandler(this,meta,opts)}},DNSDispatchHandler=class extends DecoratorHandler{#state=null;#opts=null;#dispatch=null;#origin=null;#controller=null;#newOrigin=null;#firstTry=!0;constructor(state2,{origin,handler,dispatch,newOrigin},opts){super(handler),this.#origin=origin,this.#newOrigin=newOrigin,this.#opts={...opts},this.#state=state2,this.#dispatch=dispatch}onResponseError(controller,err2){switch(err2.code){case"ETIMEDOUT":case"ECONNREFUSED":{if(this.#state.dualStack){if(!this.#firstTry){super.onResponseError(controller,err2);return}this.#firstTry=!1;let otherFamily=this.#newOrigin.hostname[0]==="["?4:6,ip=this.#state.pickFamily(this.#origin,otherFamily);if(ip==null){super.onResponseError(controller,err2);return}let port;typeof ip.port=="number"?port=`:${ip.port}`:this.#origin.port!==""?port=`:${this.#origin.port}`:port="";let dispatchOpts={...this.#opts,origin:`${this.#origin.protocol}//${ip.family===6?`[${ip.address}]`:ip.address}${port}`,[kRequestOrigin]:this.#opts[kRequestOrigin]===void 0?this.#origin:this.#opts[kRequestOrigin],headers:withHostHeader(this.#origin.host,this.#opts.headers)};this.#dispatch(dispatchOpts,this);return}super.onResponseError(controller,err2);break}case"ENOTFOUND":this.#state.deleteRecords(this.#origin),super.onResponseError(controller,err2);break;default:super.onResponseError(controller,err2);break}}};module.exports=interceptorOpts=>{if(interceptorOpts?.maxTTL!=null&&(typeof interceptorOpts?.maxTTL!="number"||interceptorOpts?.maxTTL<0))throw new InvalidArgumentError("Invalid maxTTL. Must be a positive number");if(interceptorOpts?.maxItems!=null&&(typeof interceptorOpts?.maxItems!="number"||interceptorOpts?.maxItems<1))throw new InvalidArgumentError("Invalid maxItems. Must be a positive number and greater than zero");if(interceptorOpts?.affinity!=null&&interceptorOpts?.affinity!==4&&interceptorOpts?.affinity!==6)throw new InvalidArgumentError("Invalid affinity. Must be either 4 or 6");if(interceptorOpts?.dualStack!=null&&typeof interceptorOpts?.dualStack!="boolean")throw new InvalidArgumentError("Invalid dualStack. Must be a boolean");if(interceptorOpts?.lookup!=null&&typeof interceptorOpts?.lookup!="function")throw new InvalidArgumentError("Invalid lookup. Must be a function");if(interceptorOpts?.pick!=null&&typeof interceptorOpts?.pick!="function")throw new InvalidArgumentError("Invalid pick. Must be a function");if(interceptorOpts?.storage!=null&&(typeof interceptorOpts?.storage?.get!="function"||typeof interceptorOpts?.storage?.set!="function"||typeof interceptorOpts?.storage?.full!="function"||typeof interceptorOpts?.storage?.delete!="function"))throw new InvalidArgumentError("Invalid storage. Must be a object with methods: { get, set, full, delete }");let dualStack=interceptorOpts?.dualStack??!0,affinity;dualStack?affinity=interceptorOpts?.affinity??null:affinity=interceptorOpts?.affinity??4;let opts={maxTTL:interceptorOpts?.maxTTL??1e4,lookup:interceptorOpts?.lookup??null,pick:interceptorOpts?.pick??null,dualStack,affinity,maxItems:interceptorOpts?.maxItems??1/0,storage:interceptorOpts?.storage},instance=new DNSInstance(opts);return dispatch=>function(origDispatchOpts,handler){if(origDispatchOpts.origin==null)return dispatch(origDispatchOpts,handler);let origin=origDispatchOpts.origin.constructor===URL?origDispatchOpts.origin:new URL(origDispatchOpts.origin);return isIP(origin.hostname)!==0?dispatch(origDispatchOpts,handler):(instance.runLookup(origin,origDispatchOpts,(err2,newOrigin)=>{if(err2)return handler.onResponseError(null,err2);let dispatchOpts={...origDispatchOpts,servername:origin.hostname,origin:newOrigin.origin,[kRequestOrigin]:origDispatchOpts[kRequestOrigin]===void 0?origin:origDispatchOpts[kRequestOrigin],headers:withHostHeader(origin.host,origDispatchOpts.headers)};dispatch(dispatchOpts,instance.getHandler({origin,dispatch,handler,newOrigin},origDispatchOpts))}),!0)}}}});var require_cache=__commonJS({"node_modules/undici/lib/util/cache.js"(exports,module){"use strict";var{safeHTTPMethods,pathHasQueryOrFragment,hasSafeIterator,isValidHTTPToken}=require_util(),{serializePathWithQuery}=require_util(),{kRequestOrigin}=require_symbols(),MAX_DELTA_SECONDS=2147483647,RESTRICTIVE_DIRECTIVE_NAMES=["no-store","private","no-cache"],kInvalidCacheControlDirectives=Symbol("invalid cache-control directives");function trimOWS(value2){return value2.replace(/^[\t ]+|[\t ]+$/g,"")}function arrayIncludes(array,value2){for(let i=0;i<array.length;i++)if(array[i]===value2)return!0;return!1}function trimOWSStart(value2){return value2.replace(/^[\t ]+/,"")}function trimOWSEnd(value2){return value2.replace(/[\t ]+$/,"")}function findUnescapedQuote(value2,start){let escaped=!1;for(let i=start;i<value2.length;i++)if(escaped)escaped=!1;else if(value2[i]==="\\")escaped=!0;else if(value2[i]==='"')return i;return-1}function splitCacheControlHeaderValue(value2){let directives=[],start=0,quoteStart=-1,inQuote=!1,escaped=!1;for(let i=0;i<value2.length;i++)inQuote?escaped?escaped=!1:value2[i]==="\\"?escaped=!0:value2[i]==='"'&&(inQuote=!1,quoteStart=-1):value2[i]==='"'?(inQuote=!0,quoteStart=i):value2[i]===","&&(directives.push({value:value2.substring(start,i),fromMalformedQuote:!1}),start=i+1);if(!inQuote)return directives.push({value:value2.substring(start),fromMalformedQuote:!1}),directives;let tail=value2.substring(start),quoteOffset=quoteStart-start,tailStart=0;for(let i=0;i<tail.length;i++)tail[i]===","&&(directives.push({value:tail.substring(tailStart,i),fromMalformedQuote:tailStart>quoteOffset}),tailStart=i+1);return directives.push({value:tail.substring(tailStart),fromMalformedQuote:tailStart>quoteOffset}),directives}function markInvalidCacheControlDirective(directives,key){let invalidDirectives=directives[kInvalidCacheControlDirectives];invalidDirectives===void 0&&(invalidDirectives=new Set,Object.defineProperty(directives,kInvalidCacheControlDirectives,{value:invalidDirectives})),invalidDirectives.add(key)}function hasInvalidCacheControlDirective(directives,key){return directives[kInvalidCacheControlDirectives]?.has(key)===!0}function getMalformedRestrictiveDirectiveName(key){for(let directiveName of RESTRICTIVE_DIRECTIVE_NAMES)if(key.startsWith(directiveName)&&key.length>directiveName.length&&!isValidHTTPToken(key[directiveName.length]))return directiveName;let tokenOnlyKey="",hasInvalidTokenChar=!1;for(let i=0;i<key.length;i++)isValidHTTPToken(key[i])?tokenOnlyKey+=key[i]:hasInvalidTokenChar=!0;if(hasInvalidTokenChar&&arrayIncludes(RESTRICTIVE_DIRECTIVE_NAMES,tokenOnlyKey))return tokenOnlyKey}function getRequestOrigin(opts){let origin=opts[kRequestOrigin]===void 0?opts.origin:opts[kRequestOrigin];return typeof origin=="string"||origin instanceof URL?origin:null}function getInterceptorOrigin(opts,interceptorOrigin){let requestOrigin=getRequestOrigin(opts);if(interceptorOrigin===void 0)return requestOrigin;if(interceptorOrigin===null)return null;if(requestOrigin)try{if(new URL(requestOrigin).origin!==interceptorOrigin)return null}catch{return interceptorOrigin}return interceptorOrigin}function makeCacheKey(opts,origin=getRequestOrigin(opts)){if(!origin)throw new Error("opts.origin is undefined");let fullPath=opts.path||"/";return opts.query&&!pathHasQueryOrFragment(fullPath)&&(fullPath=serializePathWithQuery(fullPath,opts.query)),{origin:origin.toString(),method:opts.method,path:fullPath,headers:opts.headers}}function appendHeader(headers,key,val){let headerName=key.toLowerCase(),current=headers[headerName],values=Array.isArray(val)?val:[val];current===void 0?headers[headerName]=Array.isArray(val)?val.slice():val:Array.isArray(current)?current.push(...values):headers[headerName]=[current,...values]}function normalizeHeaders(opts){let headers;if(opts.headers==null)headers={};else if(typeof opts.headers=="object")if(headers={},hasSafeIterator(opts.headers))if(Array.isArray(opts.headers)){let first=opts.headers[0];if(Array.isArray(first))for(let x2 of opts.headers){if(!Array.isArray(x2))throw new Error("opts.headers is not a valid header map");let[key,val]=x2;if(typeof key!="string"||typeof val!="string")throw new Error("opts.headers is not a valid header map");appendHeader(headers,key,val)}else{let len=opts.headers.length;if(len%2!==0)throw new Error("opts.headers is not a valid header map");for(let i=0;i<len;i+=2){let key=opts.headers[i],val=opts.headers[i+1];if(typeof key!="string"||typeof val!="string"&&!Array.isArray(val))throw new Error("opts.headers is not a valid header map");if(typeof val=="string")appendHeader(headers,key,val);else{let mapped=[];for(let j2=0;j2<val.length;j2++){let v2=val[j2];mapped.push(typeof v2=="string"?v2:v2.toString("latin1"))}appendHeader(headers,key,mapped)}}}}else for(let x2 of opts.headers){if(!Array.isArray(x2))throw new Error("opts.headers is not a valid header map");let[key,val]=x2;if(typeof key!="string"||typeof val!="string")throw new Error("opts.headers is not a valid header map");appendHeader(headers,key,val)}else for(let key of Object.keys(opts.headers))appendHeader(headers,key,opts.headers[key]);else throw new Error("opts.headers is not an object");return headers}function assertCacheKey(key){if(typeof key!="object")throw new TypeError(`expected key to be object, got ${typeof key}`);for(let property of["origin","method","path"])if(typeof key[property]!="string")throw new TypeError(`expected key.${property} to be string, got ${typeof key[property]}`);if(key.headers!==void 0&&typeof key.headers!="object")throw new TypeError(`expected headers to be object, got ${typeof key}`)}function assertCacheValue(value2){if(typeof value2!="object")throw new TypeError(`expected value to be object, got ${typeof value2}`);for(let property of["statusCode","cachedAt","staleAt","deleteAt"])if(typeof value2[property]!="number")throw new TypeError(`expected value.${property} to be number, got ${typeof value2[property]}`);if(typeof value2.statusMessage!="string")throw new TypeError(`expected value.statusMessage to be string, got ${typeof value2.statusMessage}`);if(value2.headers!=null&&typeof value2.headers!="object")throw new TypeError(`expected value.rawHeaders to be object, got ${typeof value2.headers}`);if(value2.vary!==void 0&&typeof value2.vary!="object")throw new TypeError(`expected value.vary to be object, got ${typeof value2.vary}`);if(value2.etag!==void 0&&typeof value2.etag!="string")throw new TypeError(`expected value.etag to be string, got ${typeof value2.etag}`)}function parseCacheControlHeader(header){let output={},invalidNumericDirectives=new Set,invalidNoArgumentDirectives=new Set,directives=splitCacheControlHeaderValue(Array.isArray(header)?header.join(","):header);for(let i=0;i<directives.length;i++){let directiveRecord=directives[i],directive=directiveRecord.value.toLowerCase(),fromMalformedQuote=directiveRecord.fromMalformedQuote,keyValueDelimiter=directive.indexOf("="),key,value2,keyHasTrailingWhitespace=!1,valueHasLeadingWhitespace=!1;if(keyValueDelimiter!==-1){let rawKey=directive.substring(0,keyValueDelimiter),rawValue=directive.substring(keyValueDelimiter+1);keyHasTrailingWhitespace=trimOWSEnd(rawKey)!==rawKey,valueHasLeadingWhitespace=trimOWSStart(rawValue)!==rawValue,key=trimOWS(rawKey),value2=trimOWSStart(rawValue)}else key=trimOWS(directive);let malformedRestrictiveDirectiveName=getMalformedRestrictiveDirectiveName(key);if(malformedRestrictiveDirectiveName!==void 0){output[malformedRestrictiveDirectiveName]=!0;continue}switch(key){case"min-fresh":case"max-stale":case"max-age":case"s-maxage":case"stale-while-revalidate":case"stale-if-error":{if(fromMalformedQuote||invalidNumericDirectives.has(key))continue;if(value2===void 0||keyHasTrailingWhitespace||valueHasLeadingWhitespace){delete output[key],invalidNumericDirectives.add(key),markInvalidCacheControlDirective(output,key);continue}if(value2.length>=2&&value2[0]==='"'&&value2[value2.length-1]==='"'&&(value2=value2.substring(1,value2.length-1)),!/^[0-9]+$/.test(value2)){delete output[key],invalidNumericDirectives.add(key),markInvalidCacheControlDirective(output,key);continue}let parsedValue=Math.min(parseInt(value2,10),MAX_DELTA_SECONDS);key==="min-fresh"?(!(key in output)||output[key]<parsedValue)&&(output[key]=parsedValue):(!(key in output)||output[key]>parsedValue)&&(output[key]=parsedValue);break}case"private":case"no-cache":{if(fromMalformedQuote){output[key]=!0;break}if(value2!==void 0&&value2.length===0){output[key]=!0;break}if(value2){if(value2[0]==='"'){value2=trimOWSEnd(value2);let fieldList="",lastQuotedPart=i,foundEndingQuote=!1,closingQuote=findUnescapedQuote(value2,1);if(closingQuote!==-1)fieldList=value2.substring(1,closingQuote),foundEndingQuote=!0;else{let fieldListParts=[value2.substring(1)];for(let j2=i+1;j2<directives.length;j2++){let nextPart=trimOWS(directives[j2].value),closingQuote2=findUnescapedQuote(nextPart,0);if(lastQuotedPart=j2,closingQuote2!==-1){fieldListParts.push(nextPart.substring(0,closingQuote2)),foundEndingQuote=!0;break}fieldListParts.push(nextPart)}fieldList=fieldListParts.join(",")}if(!foundEndingQuote){output[key]=!0;break}i=lastQuotedPart;let headers=fieldList.split(","),validFieldNames=!0;for(let j2=0;j2<headers.length;j2++)headers[j2]=trimOWS(headers[j2]),isValidHTTPToken(headers[j2])||(validFieldNames=!1);validFieldNames?output[key]!==!0&&(key in output?output[key]=output[key].concat(headers):output[key]=headers):output[key]=!0}else{let fieldName=trimOWS(value2);isValidHTTPToken(fieldName)?output[key]!==!0&&(key in output?output[key]=output[key].concat(fieldName):output[key]=[fieldName]):output[key]=!0}break}}case"public":case"must-revalidate":case"proxy-revalidate":case"immutable":case"no-transform":case"must-understand":case"only-if-cached":if(fromMalformedQuote||invalidNoArgumentDirectives.has(key))continue;if(value2!==void 0){delete output[key],invalidNoArgumentDirectives.add(key);continue}output[key]=!0;break;case"no-store":output[key]=!0;break;default:continue}}return output}function splitVaryHeader(varyHeader){let values=Array.isArray(varyHeader)?varyHeader:[varyHeader],output=[];for(let i=0;i<values.length;i++){let parts=values[i].split(",");for(let j2=0;j2<parts.length;j2++)output.push(parts[j2])}return output}function hasVaryStar(varyHeader){let values=splitVaryHeader(varyHeader);for(let i=0;i<values.length;i++)if(trimOWS(values[i]).indexOf("*")!==-1)return!0;return!1}function parseVaryHeader(varyHeader,headers){if(hasVaryStar(varyHeader))return headers;let output={},varyingHeaders=splitVaryHeader(varyHeader);for(let header of varyingHeaders){let trimmedHeader=trimOWS(header).toLowerCase();if(trimmedHeader.length===0)continue;if(!isValidHTTPToken(trimmedHeader))return;let headerValue=headers[trimmedHeader];output[trimmedHeader]=Array.isArray(headerValue)?headerValue.slice():headerValue??null}return output}function isInvalidOrWildcardVaryHeader(varyHeader){return hasVaryStar(varyHeader)||parseVaryHeader(varyHeader,{})===void 0}function isEtagUsable(etag){return etag.length<=2?!1:etag[0]==='"'&&etag[etag.length-1]==='"'?!(etag[1]==='"'||etag.startsWith('"W/')):etag.startsWith('W/"')&&etag[etag.length-1]==='"'?etag.length!==4:!1}function assertCacheStore(store,name="CacheStore"){if(typeof store!="object"||store===null)throw new TypeError(`expected type of ${name} to be a CacheStore, got ${store===null?"null":typeof store}`);for(let fn of["get","createWriteStream","delete"])if(typeof store[fn]!="function")throw new TypeError(`${name} needs to have a \`${fn}()\` function`)}function assertCacheMethods(methods,name="CacheMethods"){if(!Array.isArray(methods))throw new TypeError(`expected type of ${name} needs to be an array, got ${methods===null?"null":typeof methods}`);if(methods.length===0)throw new TypeError(`${name} needs to have at least one method`);for(let method of methods)if(!arrayIncludes(safeHTTPMethods,method))throw new TypeError(`element of ${name}-array needs to be one of following values: ${safeHTTPMethods.join(", ")}, got ${method}`)}function makeDeduplicationKey(cacheKey2,excludeHeaders){let headers={};if(cacheKey2.headers){let sortedHeaders=Object.keys(cacheKey2.headers).sort();for(let header of sortedHeaders)excludeHeaders?.has(header.toLowerCase())||(headers[header]=cacheKey2.headers[header])}return JSON.stringify([cacheKey2.origin,cacheKey2.method,cacheKey2.path,headers])}module.exports={getInterceptorOrigin,getRequestOrigin,makeCacheKey,normalizeHeaders,assertCacheKey,assertCacheValue,parseCacheControlHeader,hasInvalidCacheControlDirective,parseVaryHeader,hasVaryStar,isInvalidOrWildcardVaryHeader,isEtagUsable,assertCacheMethods,assertCacheStore,makeDeduplicationKey}}});var require_date=__commonJS({"node_modules/undici/lib/util/date.js"(exports,module){"use strict";function parseHttpDate(date){switch(date[3]){case",":return parseImfDate(date);case" ":return parseAscTimeDate(date);default:return parseRfc850Date(date)}}function makeDate(year,monthIdx,day,hour,minute,second,weekday){let result2=new Date(Date.UTC(year,monthIdx,day,hour,minute,second));return year>=0&&year<=99&&result2.setUTCFullYear(year),result2.getUTCFullYear()===year&&result2.getUTCMonth()===monthIdx&&result2.getUTCDate()===day&&result2.getUTCHours()===hour&&result2.getUTCMinutes()===minute&&result2.getUTCSeconds()===second&&result2.getUTCDay()===weekday?result2:void 0}function parseImfDate(date){if(date.length!==29||date[4]!==" "||date[7]!==" "||date[11]!==" "||date[16]!==" "||date[19]!==":"||date[22]!==":"||date[25]!==" "||date[26]!=="G"||date[27]!=="M"||date[28]!=="T")return;let weekday=-1;if(date[0]==="S"&&date[1]==="u"&&date[2]==="n")weekday=0;else if(date[0]==="M"&&date[1]==="o"&&date[2]==="n")weekday=1;else if(date[0]==="T"&&date[1]==="u"&&date[2]==="e")weekday=2;else if(date[0]==="W"&&date[1]==="e"&&date[2]==="d")weekday=3;else if(date[0]==="T"&&date[1]==="h"&&date[2]==="u")weekday=4;else if(date[0]==="F"&&date[1]==="r"&&date[2]==="i")weekday=5;else if(date[0]==="S"&&date[1]==="a"&&date[2]==="t")weekday=6;else return;let day=0;if(date[5]==="0"){let code=date.charCodeAt(6);if(code<49||code>57)return;day=code-48}else{let code1=date.charCodeAt(5);if(code1<49||code1>51)return;let code2=date.charCodeAt(6);if(code2<48||code2>57)return;day=(code1-48)*10+(code2-48)}let monthIdx=-1;if(date[8]==="J"&&date[9]==="a"&&date[10]==="n")monthIdx=0;else if(date[8]==="F"&&date[9]==="e"&&date[10]==="b")monthIdx=1;else if(date[8]==="M"&&date[9]==="a")if(date[10]==="r")monthIdx=2;else if(date[10]==="y")monthIdx=4;else return;else if(date[8]==="J")if(date[9]==="a"&&date[10]==="n")monthIdx=0;else if(date[9]==="u")if(date[10]==="n")monthIdx=5;else if(date[10]==="l")monthIdx=6;else return;else return;else if(date[8]==="A")if(date[9]==="p"&&date[10]==="r")monthIdx=3;else if(date[9]==="u"&&date[10]==="g")monthIdx=7;else return;else if(date[8]==="S"&&date[9]==="e"&&date[10]==="p")monthIdx=8;else if(date[8]==="O"&&date[9]==="c"&&date[10]==="t")monthIdx=9;else if(date[8]==="N"&&date[9]==="o"&&date[10]==="v")monthIdx=10;else if(date[8]==="D"&&date[9]==="e"&&date[10]==="c")monthIdx=11;else return;let yearDigit1=date.charCodeAt(12);if(yearDigit1<48||yearDigit1>57)return;let yearDigit2=date.charCodeAt(13);if(yearDigit2<48||yearDigit2>57)return;let yearDigit3=date.charCodeAt(14);if(yearDigit3<48||yearDigit3>57)return;let yearDigit4=date.charCodeAt(15);if(yearDigit4<48||yearDigit4>57)return;let year=(yearDigit1-48)*1e3+(yearDigit2-48)*100+(yearDigit3-48)*10+(yearDigit4-48),hour=0;if(date[17]==="0"){let code=date.charCodeAt(18);if(code<48||code>57)return;hour=code-48}else{let code1=date.charCodeAt(17);if(code1<48||code1>50)return;let code2=date.charCodeAt(18);if(code2<48||code2>57||code1===50&&code2>51)return;hour=(code1-48)*10+(code2-48)}let minute=0;if(date[20]==="0"){let code=date.charCodeAt(21);if(code<48||code>57)return;minute=code-48}else{let code1=date.charCodeAt(20);if(code1<48||code1>53)return;let code2=date.charCodeAt(21);if(code2<48||code2>57)return;minute=(code1-48)*10+(code2-48)}let second=0;if(date[23]==="0"){let code=date.charCodeAt(24);if(code<48||code>57)return;second=code-48}else{let code1=date.charCodeAt(23);if(code1<48||code1>53)return;let code2=date.charCodeAt(24);if(code2<48||code2>57)return;second=(code1-48)*10+(code2-48)}return makeDate(year,monthIdx,day,hour,minute,second,weekday)}function parseAscTimeDate(date){if(date.length!==24||date[7]!==" "||date[10]!==" "||date[19]!==" ")return;let weekday=-1;if(date[0]==="S"&&date[1]==="u"&&date[2]==="n")weekday=0;else if(date[0]==="M"&&date[1]==="o"&&date[2]==="n")weekday=1;else if(date[0]==="T"&&date[1]==="u"&&date[2]==="e")weekday=2;else if(date[0]==="W"&&date[1]==="e"&&date[2]==="d")weekday=3;else if(date[0]==="T"&&date[1]==="h"&&date[2]==="u")weekday=4;else if(date[0]==="F"&&date[1]==="r"&&date[2]==="i")weekday=5;else if(date[0]==="S"&&date[1]==="a"&&date[2]==="t")weekday=6;else return;let monthIdx=-1;if(date[4]==="J"&&date[5]==="a"&&date[6]==="n")monthIdx=0;else if(date[4]==="F"&&date[5]==="e"&&date[6]==="b")monthIdx=1;else if(date[4]==="M"&&date[5]==="a")if(date[6]==="r")monthIdx=2;else if(date[6]==="y")monthIdx=4;else return;else if(date[4]==="J")if(date[5]==="a"&&date[6]==="n")monthIdx=0;else if(date[5]==="u")if(date[6]==="n")monthIdx=5;else if(date[6]==="l")monthIdx=6;else return;else return;else if(date[4]==="A")if(date[5]==="p"&&date[6]==="r")monthIdx=3;else if(date[5]==="u"&&date[6]==="g")monthIdx=7;else return;else if(date[4]==="S"&&date[5]==="e"&&date[6]==="p")monthIdx=8;else if(date[4]==="O"&&date[5]==="c"&&date[6]==="t")monthIdx=9;else if(date[4]==="N"&&date[5]==="o"&&date[6]==="v")monthIdx=10;else if(date[4]==="D"&&date[5]==="e"&&date[6]==="c")monthIdx=11;else return;let day=0;if(date[8]===" "){let code=date.charCodeAt(9);if(code<49||code>57)return;day=code-48}else{let code1=date.charCodeAt(8);if(code1<49||code1>51)return;let code2=date.charCodeAt(9);if(code2<48||code2>57)return;day=(code1-48)*10+(code2-48)}let hour=0;if(date[11]==="0"){let code=date.charCodeAt(12);if(code<48||code>57)return;hour=code-48}else{let code1=date.charCodeAt(11);if(code1<48||code1>50)return;let code2=date.charCodeAt(12);if(code2<48||code2>57||code1===50&&code2>51)return;hour=(code1-48)*10+(code2-48)}let minute=0;if(date[14]==="0"){let code=date.charCodeAt(15);if(code<48||code>57)return;minute=code-48}else{let code1=date.charCodeAt(14);if(code1<48||code1>53)return;let code2=date.charCodeAt(15);if(code2<48||code2>57)return;minute=(code1-48)*10+(code2-48)}let second=0;if(date[17]==="0"){let code=date.charCodeAt(18);if(code<48||code>57)return;second=code-48}else{let code1=date.charCodeAt(17);if(code1<48||code1>53)return;let code2=date.charCodeAt(18);if(code2<48||code2>57)return;second=(code1-48)*10+(code2-48)}let yearDigit1=date.charCodeAt(20);if(yearDigit1<48||yearDigit1>57)return;let yearDigit2=date.charCodeAt(21);if(yearDigit2<48||yearDigit2>57)return;let yearDigit3=date.charCodeAt(22);if(yearDigit3<48||yearDigit3>57)return;let yearDigit4=date.charCodeAt(23);if(yearDigit4<48||yearDigit4>57)return;let year=(yearDigit1-48)*1e3+(yearDigit2-48)*100+(yearDigit3-48)*10+(yearDigit4-48);return makeDate(year,monthIdx,day,hour,minute,second,weekday)}function parseRfc850Date(date){let commaIndex=-1,weekday=-1;if(date[0]==="S")date[1]==="u"&&date[2]==="n"&&date[3]==="d"&&date[4]==="a"&&date[5]==="y"?(weekday=0,commaIndex=6):date[1]==="a"&&date[2]==="t"&&date[3]==="u"&&date[4]==="r"&&date[5]==="d"&&date[6]==="a"&&date[7]==="y"&&(weekday=6,commaIndex=8);else if(date[0]==="M"&&date[1]==="o"&&date[2]==="n"&&date[3]==="d"&&date[4]==="a"&&date[5]==="y")weekday=1,commaIndex=6;else if(date[0]==="T")date[1]==="u"&&date[2]==="e"&&date[3]==="s"&&date[4]==="d"&&date[5]==="a"&&date[6]==="y"?(weekday=2,commaIndex=7):date[1]==="h"&&date[2]==="u"&&date[3]==="r"&&date[4]==="s"&&date[5]==="d"&&date[6]==="a"&&date[7]==="y"&&(weekday=4,commaIndex=8);else if(date[0]==="W"&&date[1]==="e"&&date[2]==="d"&&date[3]==="n"&&date[4]==="e"&&date[5]==="s"&&date[6]==="d"&&date[7]==="a"&&date[8]==="y")weekday=3,commaIndex=9;else if(date[0]==="F"&&date[1]==="r"&&date[2]==="i"&&date[3]==="d"&&date[4]==="a"&&date[5]==="y")weekday=5,commaIndex=6;else return;if(date[commaIndex]!==","||date.length-commaIndex-1!==23||date[commaIndex+1]!==" "||date[commaIndex+4]!=="-"||date[commaIndex+8]!=="-"||date[commaIndex+11]!==" "||date[commaIndex+14]!==":"||date[commaIndex+17]!==":"||date[commaIndex+20]!==" "||date[commaIndex+21]!=="G"||date[commaIndex+22]!=="M"||date[commaIndex+23]!=="T")return;let day=0;if(date[commaIndex+2]==="0"){let code=date.charCodeAt(commaIndex+3);if(code<49||code>57)return;day=code-48}else{let code1=date.charCodeAt(commaIndex+2);if(code1<49||code1>51)return;let code2=date.charCodeAt(commaIndex+3);if(code2<48||code2>57)return;day=(code1-48)*10+(code2-48)}let monthIdx=-1;if(date[commaIndex+5]==="J"&&date[commaIndex+6]==="a"&&date[commaIndex+7]==="n")monthIdx=0;else if(date[commaIndex+5]==="F"&&date[commaIndex+6]==="e"&&date[commaIndex+7]==="b")monthIdx=1;else if(date[commaIndex+5]==="M"&&date[commaIndex+6]==="a"&&date[commaIndex+7]==="r")monthIdx=2;else if(date[commaIndex+5]==="A"&&date[commaIndex+6]==="p"&&date[commaIndex+7]==="r")monthIdx=3;else if(date[commaIndex+5]==="M"&&date[commaIndex+6]==="a"&&date[commaIndex+7]==="y")monthIdx=4;else if(date[commaIndex+5]==="J"&&date[commaIndex+6]==="u"&&date[commaIndex+7]==="n")monthIdx=5;else if(date[commaIndex+5]==="J"&&date[commaIndex+6]==="u"&&date[commaIndex+7]==="l")monthIdx=6;else if(date[commaIndex+5]==="A"&&date[commaIndex+6]==="u"&&date[commaIndex+7]==="g")monthIdx=7;else if(date[commaIndex+5]==="S"&&date[commaIndex+6]==="e"&&date[commaIndex+7]==="p")monthIdx=8;else if(date[commaIndex+5]==="O"&&date[commaIndex+6]==="c"&&date[commaIndex+7]==="t")monthIdx=9;else if(date[commaIndex+5]==="N"&&date[commaIndex+6]==="o"&&date[commaIndex+7]==="v")monthIdx=10;else if(date[commaIndex+5]==="D"&&date[commaIndex+6]==="e"&&date[commaIndex+7]==="c")monthIdx=11;else return;let yearDigit1=date.charCodeAt(commaIndex+9);if(yearDigit1<48||yearDigit1>57)return;let yearDigit2=date.charCodeAt(commaIndex+10);if(yearDigit2<48||yearDigit2>57)return;let year=(yearDigit1-48)*10+(yearDigit2-48);year+=year<70?2e3:1900;let hour=0;if(date[commaIndex+12]==="0"){let code=date.charCodeAt(commaIndex+13);if(code<48||code>57)return;hour=code-48}else{let code1=date.charCodeAt(commaIndex+12);if(code1<48||code1>50)return;let code2=date.charCodeAt(commaIndex+13);if(code2<48||code2>57||code1===50&&code2>51)return;hour=(code1-48)*10+(code2-48)}let minute=0;if(date[commaIndex+15]==="0"){let code=date.charCodeAt(commaIndex+16);if(code<48||code>57)return;minute=code-48}else{let code1=date.charCodeAt(commaIndex+15);if(code1<48||code1>53)return;let code2=date.charCodeAt(commaIndex+16);if(code2<48||code2>57)return;minute=(code1-48)*10+(code2-48)}let second=0;if(date[commaIndex+18]==="0"){let code=date.charCodeAt(commaIndex+19);if(code<48||code>57)return;second=code-48}else{let code1=date.charCodeAt(commaIndex+18);if(code1<48||code1>53)return;let code2=date.charCodeAt(commaIndex+19);if(code2<48||code2>57)return;second=(code1-48)*10+(code2-48)}return makeDate(year,monthIdx,day,hour,minute,second,weekday)}module.exports={parseHttpDate}}});var require_cache_handler=__commonJS({"node_modules/undici/lib/handler/cache-handler.js"(exports,module){"use strict";var util=require_util(),{parseCacheControlHeader,hasInvalidCacheControlDirective,parseVaryHeader,hasVaryStar,isInvalidOrWildcardVaryHeader,isEtagUsable}=require_cache(),{parseHttpDate}=require_date();function noop(){}var HEURISTICALLY_CACHEABLE_STATUS_CODES=[200,203,204,206,300,301,308,404,405,410,414,501],NOT_UNDERSTOOD_STATUS_CODES=[206],MAX_RESPONSE_AGE=2147483647e3,REVALIDATION_ONLY_RETENTION=864e5;function trimOWS(value2){return value2.replace(/^[\t ]+|[\t ]+$/g,"")}function arrayIncludes(array,value2){for(let i=0;i<array.length;i++)if(array[i]===value2)return!0;return!1}function appendConnectionHeaderTokens(headersToRemove,connectionHeader){let values=Array.isArray(connectionHeader)?connectionHeader:[connectionHeader];for(let i=0;i<values.length;i++){let tokens2=values[i].split(",");for(let j2=0;j2<tokens2.length;j2++)headersToRemove.push(trimOWS(tokens2[j2]).toLowerCase())}}function getSameOriginPath(cacheKey2,location){if(typeof location!="string")return;let originUrl,requestUrl,locationUrl;try{originUrl=new URL(cacheKey2.origin),requestUrl=new URL(cacheKey2.path,originUrl),locationUrl=new URL(location,requestUrl)}catch{return}if(locationUrl.origin===originUrl.origin)return locationUrl.pathname+locationUrl.search}function deleteCachedUri(store,cacheKey2,path14){deleteCachedValue(store,{...cacheKey2,path:path14});for(let i=0;i<util.safeHTTPMethods.length;i++){let method=util.safeHTTPMethods[i];method!==cacheKey2.method&&deleteCachedValue(store,{...cacheKey2,method,path:path14})}}function deleteLocationTargets(store,cacheKey2,headerValue){if(headerValue===void 0)return;let values=Array.isArray(headerValue)?headerValue:[headerValue];for(let i=0;i<values.length;i++){let path14=getSameOriginPath(cacheKey2,values[i]);path14!==void 0&&deleteCachedUri(store,cacheKey2,path14)}}function invalidateUnsafeRequest(store,cacheKey2,resHeaders){deleteCachedUri(store,cacheKey2,cacheKey2.path),deleteLocationTargets(store,cacheKey2,resHeaders.location),deleteLocationTargets(store,cacheKey2,resHeaders["content-location"])}var CacheHandler=class{#cacheKey;#cacheType;#cacheByDefault;#store;#handler;#writeStream;constructor({store,type,cacheByDefault},cacheKey2,handler){this.#store=store,this.#cacheType=type,this.#cacheByDefault=cacheByDefault,this.#cacheKey=cacheKey2,this.#handler=handler}onRequestStart(controller,context){this.#writeStream?.destroy(),this.#writeStream=void 0,this.#handler.onRequestStart?.(controller,context)}onBodySent(chunk){this.#handler.onBodySent?.(chunk)}onRequestSent(){this.#handler.onRequestSent?.()}onRequestUpgrade(controller,statusCode,headers,socket){this.#handler.onRequestUpgrade?.(controller,statusCode,headers,socket)}onResponseStart(controller,statusCode,resHeaders,statusMessage){let downstreamOnHeaders=()=>this.#handler.onResponseStart?.(controller,statusCode,resHeaders,statusMessage),handler=this;if(!arrayIncludes(util.safeHTTPMethods,this.#cacheKey.method)&&statusCode>=200&&statusCode<=399)return invalidateUnsafeRequest(this.#store,this.#cacheKey,resHeaders),downstreamOnHeaders();let cacheControlHeader=resHeaders["cache-control"],cacheControlDirectives=cacheControlHeader?parseCacheControlHeader(cacheControlHeader):{};if(revalidationResponseDisallowsCachedReuse(this.#cacheType,resHeaders,cacheControlDirectives))return deleteCachedValue(this.#store,this.#cacheKey),downstreamOnHeaders();let heuristicallyCacheable=resHeaders["last-modified"]&&arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES,statusCode);if(!cacheControlHeader&&!resHeaders.expires&&!heuristicallyCacheable&&!this.#cacheByDefault)return statusCode===304&&resHeaders.vary&&isInvalidOrWildcardVaryHeader(resHeaders.vary)&&deleteCachedValue(this.#store,this.#cacheKey),downstreamOnHeaders();if(!canCacheResponse(this.#cacheType,this.#cacheKey.method,statusCode,resHeaders,cacheControlDirectives,this.#cacheKey.headers))return statusCode===304&&(cacheControlHeader||revalidationResponseDisallowsCachedReuse(this.#cacheType,resHeaders,cacheControlDirectives))&&deleteCachedValue(this.#store,this.#cacheKey),downstreamOnHeaders();let now=Date.now(),resAge=Object.hasOwn(resHeaders,"age")?getAge(resHeaders.age):void 0;if(resAge!==void 0&&resAge>=MAX_RESPONSE_AGE)return deleteCachedValueIfNotModified(statusCode,this.#store,this.#cacheKey),downstreamOnHeaders();let resDate=Object.hasOwn(resHeaders,"date")?getDate(resHeaders.date):void 0;if(resDate===null)return deleteCachedValueIfNotModified(statusCode,this.#store,this.#cacheKey),downstreamOnHeaders();let apparentAge=resDate?Math.max(0,now-resDate.getTime()):0,currentAge=Math.max(apparentAge,resAge??0),hasValidator=typeof resHeaders.etag=="string"&&isEtagUsable(resHeaders.etag)||typeof resHeaders["last-modified"]=="string",staleAt=determineStaleAt(this.#cacheType,now,resAge,resHeaders,resDate,cacheControlDirectives,hasValidator)??this.#cacheByDefault,revalidationOnly=staleAt===0&&hasValidator;if(staleAt===void 0||currentAge>=staleAt&&!revalidationOnly)return(cacheControlHeader||staleAt!==void 0)&&deleteCachedValueIfNotModified(statusCode,this.#store,this.#cacheKey),downstreamOnHeaders();let baseTime=now-currentAge,absoluteStaleAt=staleAt+baseTime;if(now>=absoluteStaleAt&&!revalidationOnly)return deleteCachedValueIfNotModified(statusCode,this.#store,this.#cacheKey),downstreamOnHeaders();let varyDirectives;if(this.#cacheKey.headers&&resHeaders.vary&&(varyDirectives=parseVaryHeader(resHeaders.vary,this.#cacheKey.headers),!varyDirectives))return downstreamOnHeaders();let cachedAt=baseTime,deleteAt=determineDeleteAt(baseTime,now,cacheControlDirectives,absoluteStaleAt),strippedHeaders=stripNecessaryHeaders(resHeaders,cacheControlDirectives),value2={statusCode,statusMessage,headers:strippedHeaders,vary:varyDirectives,cacheControlDirectives,cachedAt,staleAt:absoluteStaleAt,deleteAt};if(statusCode===304){let handle304=cachedValue=>{if(!cachedValue)return downstreamOnHeaders();if(value2.statusCode=cachedValue.statusCode,value2.statusMessage=cachedValue.statusMessage,value2.etag=cachedValue.etag,value2.vary=varyDirectives??cachedValue.vary,value2.headers={...cachedValue.headers,...strippedHeaders},downstreamOnHeaders(),this.#writeStream=this.#store.createWriteStream(this.#cacheKey,value2),!(!this.#writeStream||!cachedValue?.body))if(typeof cachedValue.body.values=="function"){let bodyIterator=cachedValue.body.values(),streamCachedBody=()=>{for(let chunk of bodyIterator){let full=this.#writeStream.write(chunk)===!1;if(this.#handler.onResponseData?.(controller,chunk),full)break}};this.#writeStream.on("error",function(){handler.#writeStream=void 0,handler.#store.delete(handler.#cacheKey)}).on("drain",()=>{streamCachedBody()}).on("close",function(){handler.#writeStream===this&&(handler.#writeStream=void 0)}),streamCachedBody()}else typeof cachedValue.body.on=="function"&&(cachedValue.body.on("data",chunk=>{this.#writeStream.write(chunk),this.#handler.onResponseData?.(controller,chunk)}).on("end",()=>{this.#writeStream.end()}).on("error",()=>{this.#writeStream=void 0,this.#store.delete(this.#cacheKey)}),this.#writeStream.on("error",function(){handler.#writeStream=void 0,handler.#store.delete(handler.#cacheKey)}).on("close",function(){handler.#writeStream===this&&(handler.#writeStream=void 0)}))},result2=this.#store.get(this.#cacheKey);result2&&typeof result2.then=="function"?result2.then(handle304):handle304(result2)}else{if(typeof resHeaders.etag=="string"&&isEtagUsable(resHeaders.etag)&&(value2.etag=resHeaders.etag),this.#writeStream=this.#store.createWriteStream(this.#cacheKey,value2),!this.#writeStream)return downstreamOnHeaders();this.#writeStream.on("drain",()=>controller.resume()).on("error",function(){handler.#writeStream=void 0,handler.#store.delete(handler.#cacheKey)}).on("close",function(){handler.#writeStream===this&&(handler.#writeStream=void 0),controller.resume()}),downstreamOnHeaders()}}onResponseData(controller,chunk){this.#writeStream?.write(chunk)===!1&&controller.pause(),this.#handler.onResponseData?.(controller,chunk)}onResponseEnd(controller,trailers){this.#writeStream?.end(),this.#handler.onResponseEnd?.(controller,trailers)}onResponseError(controller,err2){this.#writeStream?.destroy(err2),this.#writeStream=void 0,this.#handler.onResponseError?.(controller,err2)}};function deleteCachedValue(store,cacheKey2){try{store.delete(cacheKey2)?.catch?.(noop)}catch{}}function deleteCachedValueIfNotModified(statusCode,store,cacheKey2){statusCode===304&&deleteCachedValue(store,cacheKey2)}function revalidationResponseDisallowsCachedReuse(cacheType,resHeaders,cacheControlDirectives){return cacheControlDirectives["no-store"]===!0||cacheType==="shared"&&(cacheControlDirectives.private===!0||Object.hasOwn(resHeaders,"set-cookie"))||(resHeaders.vary?isInvalidOrWildcardVaryHeader(resHeaders.vary):!1)}function canCacheResponse(cacheType,method,statusCode,resHeaders,cacheControlDirectives,reqHeaders){return!(!arrayIncludes(util.safeHTTPMethods,method)||statusCode<200||arrayIncludes(NOT_UNDERSTOOD_STATUS_CODES,statusCode)||!arrayIncludes(HEURISTICALLY_CACHEABLE_STATUS_CODES,statusCode)&&!resHeaders.expires&&!cacheControlDirectives.public&&cacheControlDirectives["max-age"]===void 0&&!(cacheControlDirectives.private&&cacheType==="private")&&!(cacheControlDirectives["s-maxage"]!==void 0&&cacheType==="shared")||cacheControlDirectives["no-store"]||cacheType==="shared"&&(cacheControlDirectives.private===!0||Object.hasOwn(resHeaders,"set-cookie"))||resHeaders.vary&&hasVaryStar(resHeaders.vary)||reqHeaders!=null&&Object.hasOwn(reqHeaders,"authorization")&&(!cacheControlDirectives.public&&!cacheControlDirectives["s-maxage"]&&!cacheControlDirectives["must-revalidate"]||typeof reqHeaders.authorization!="string"||Array.isArray(cacheControlDirectives["no-cache"])&&arrayIncludes(cacheControlDirectives["no-cache"],"authorization")||Array.isArray(cacheControlDirectives.private)&&arrayIncludes(cacheControlDirectives.private,"authorization")))}function getDate(dateHeader){let dateValue=dateHeader;if(Array.isArray(dateValue)){if(dateValue.length!==1)return null;dateValue=dateValue[0]}return typeof dateValue!="string"?null:parseHttpDate(dateValue)}function getAge(ageHeader){let ageValue=ageHeader;if(Array.isArray(ageValue)){if(ageValue.length!==1)return MAX_RESPONSE_AGE;ageValue=ageValue[0]}if(typeof ageValue!="string"||!/^[\t ]*[0-9]+[\t ]*$/.test(ageValue))return MAX_RESPONSE_AGE;let age=BigInt(ageValue.replace(/^[\t ]+|[\t ]+$/g,""));return age>=BigInt(MAX_RESPONSE_AGE/1e3)?MAX_RESPONSE_AGE:Number(age)*1e3}function determineStaleAt(cacheType,now,age,resHeaders,responseDate,cacheControlDirectives,hasValidator){if(cacheType==="shared"){if(hasInvalidCacheControlDirective(cacheControlDirectives,"s-maxage"))return 0;let sMaxAge=cacheControlDirectives["s-maxage"];if(sMaxAge!==void 0)return sMaxAge>0?sMaxAge*1e3:0}if(hasInvalidCacheControlDirective(cacheControlDirectives,"max-age"))return 0;let maxAge=cacheControlDirectives["max-age"];if(maxAge!==void 0)return maxAge>0?maxAge*1e3:0;if(Object.hasOwn(resHeaders,"expires")){if(typeof resHeaders.expires!="string")return 0;let expiresDate=parseHttpDate(resHeaders.expires);if(!expiresDate||now>=expiresDate.getTime())return 0;if(responseDate){if(responseDate>=expiresDate)return 0;let freshnessLifetime=expiresDate.getTime()-responseDate.getTime();return age!==void 0&&age>=freshnessLifetime?0:freshnessLifetime}return expiresDate.getTime()-now}if(typeof resHeaders["last-modified"]=="string"){let lastModified=parseHttpDate(resHeaders["last-modified"]);if(lastModified)return lastModified.getTime()>=now?void 0:(now-lastModified.getTime())*.1}if(cacheControlDirectives.immutable)return 31536e6;if(cacheControlDirectives["no-cache"]===!0&&hasValidator)return 0}function determineDeleteAt(baseTime,cachedAt,cacheControlDirectives,staleAt){let staleWhileRevalidate=-1/0,staleIfError=-1/0,immutable=-1/0;if(cacheControlDirectives["stale-while-revalidate"]&&(staleWhileRevalidate=staleAt+cacheControlDirectives["stale-while-revalidate"]*1e3),cacheControlDirectives["stale-if-error"]&&(staleIfError=staleAt+cacheControlDirectives["stale-if-error"]*1e3),cacheControlDirectives.immutable&&staleWhileRevalidate===-1/0&&staleIfError===-1/0&&(immutable=cachedAt+31536e6),staleWhileRevalidate===-1/0&&staleIfError===-1/0&&immutable===-1/0){let freshnessLifetime=staleAt-baseTime;if(freshnessLifetime<=0)return cachedAt+REVALIDATION_ONLY_RETENTION;let datePrecisionPadding=Math.min(Math.max(cachedAt-baseTime,0),1e3);return staleAt+freshnessLifetime+datePrecisionPadding}return Math.max(staleAt,staleWhileRevalidate,staleIfError,immutable)}function stripNecessaryHeaders(resHeaders,cacheControlDirectives){let headersToRemove=["connection","proxy-authenticate","proxy-authentication-info","proxy-authorization","proxy-connection","te","transfer-encoding","upgrade","age"];resHeaders.connection&&appendConnectionHeaderTokens(headersToRemove,resHeaders.connection),Array.isArray(cacheControlDirectives["no-cache"])&&headersToRemove.push(...cacheControlDirectives["no-cache"]),Array.isArray(cacheControlDirectives.private)&&headersToRemove.push(...cacheControlDirectives.private);let strippedHeaders;for(let headerName of headersToRemove)Object.hasOwn(resHeaders,headerName)&&(strippedHeaders??={...resHeaders},delete strippedHeaders[headerName]);return strippedHeaders??resHeaders}module.exports=CacheHandler}});var require_memory_cache_store=__commonJS({"node_modules/undici/lib/cache/memory-cache-store.js"(exports,module){"use strict";var{Writable}=__require("node:stream"),{EventEmitter:EventEmitter4}=__require("node:events"),{assertCacheKey,assertCacheValue}=require_cache(),MemoryCacheStore=class extends EventEmitter4{#maxCount=1024;#maxSize=104857600;#maxEntrySize=5242880;#size=0;#count=0;#entries=new Map;#hasEmittedMaxSizeEvent=!1;constructor(opts){if(super(),opts){if(typeof opts!="object")throw new TypeError("MemoryCacheStore options must be an object");if(opts.maxCount!==void 0){if(typeof opts.maxCount!="number"||!Number.isInteger(opts.maxCount)||opts.maxCount<0)throw new TypeError("MemoryCacheStore options.maxCount must be a non-negative integer");this.#maxCount=opts.maxCount}if(opts.maxSize!==void 0){if(typeof opts.maxSize!="number"||!Number.isInteger(opts.maxSize)||opts.maxSize<0)throw new TypeError("MemoryCacheStore options.maxSize must be a non-negative integer");this.#maxSize=opts.maxSize}if(opts.maxEntrySize!==void 0){if(typeof opts.maxEntrySize!="number"||!Number.isInteger(opts.maxEntrySize)||opts.maxEntrySize<0)throw new TypeError("MemoryCacheStore options.maxEntrySize must be a non-negative integer");this.#maxEntrySize=opts.maxEntrySize}}}get size(){return this.#size}isFull(){return this.#size>=this.#maxSize||this.#count>=this.#maxCount}get(key){assertCacheKey(key);let topLevelKey=`${key.origin}:${key.path}`,now=Date.now(),entries=this.#entries.get(topLevelKey),entry=entries?findEntry(key,entries,now):null;return entry==null?void 0:{statusMessage:entry.statusMessage,statusCode:entry.statusCode,headers:entry.headers,body:entry.body,vary:entry.vary?entry.vary:void 0,etag:entry.etag,cacheControlDirectives:entry.cacheControlDirectives,cachedAt:entry.cachedAt,staleAt:entry.staleAt,deleteAt:entry.deleteAt}}createWriteStream(key,val){assertCacheKey(key),assertCacheValue(val);let topLevelKey=`${key.origin}:${key.path}`,store=this,entry={...key,...val,body:[],size:0};return new Writable({write(chunk,encoding,callback){typeof chunk=="string"&&(chunk=Buffer.from(chunk,encoding)),entry.size+=chunk.byteLength,entry.size>store.#maxEntrySize?this.destroy():entry.body.push(chunk),callback(null)},final(callback){let entries=store.#entries.get(topLevelKey);entries||(entries=[],store.#entries.set(topLevelKey,entries));let previousEntry=findEntry(key,entries,Date.now());if(previousEntry){let index3=entries.indexOf(previousEntry);entries.splice(index3,1,entry),store.#size-=previousEntry.size}else entries.push(entry),store.#count+=1;if(store.#size+=entry.size,store.#size>store.#maxSize||store.#count>store.#maxCount){store.#hasEmittedMaxSizeEvent||(store.emit("maxSizeExceeded",{size:store.#size,maxSize:store.#maxSize,count:store.#count,maxCount:store.#maxCount}),store.#hasEmittedMaxSizeEvent=!0);for(let[key2,entries2]of store.#entries){for(let entry2 of entries2.splice(0,Math.ceil(entries2.length/2)))store.#size-=entry2.size,store.#count-=1;entries2.length===0&&store.#entries.delete(key2)}store.#size<store.#maxSize&&store.#count<store.#maxCount&&(store.#hasEmittedMaxSizeEvent=!1)}callback(null)}})}delete(key){if(typeof key!="object")throw new TypeError(`expected key to be object, got ${typeof key}`);let topLevelKey=`${key.origin}:${key.path}`;for(let entry of this.#entries.get(topLevelKey)??[])this.#size-=entry.size,this.#count-=1;this.#entries.delete(topLevelKey)}};function findEntry(key,entries,now){for(let i=0;i<entries.length;i++){let entry=entries[i];if(entry.deleteAt>now&&entry.method===key.method&&varyMatches(key,entry))return entry}}function varyMatches(key,entry){if(entry.vary==null)return!0;for(let headerName in entry.vary)if(Object.hasOwn(entry.vary,headerName)&&!headerValueEquals(key.headers?.[headerName],entry.vary[headerName]))return!1;return!0}function headerValueEquals(lhs,rhs){if(lhs==null&&rhs==null)return!0;if(lhs==null&&rhs!=null||lhs!=null&&rhs==null)return!1;if(Array.isArray(lhs)&&Array.isArray(rhs)){if(lhs.length!==rhs.length)return!1;for(let i=0;i<lhs.length;i++)if(lhs[i]!==rhs[i])return!1;return!0}return lhs===rhs}module.exports=MemoryCacheStore}});var require_cache_revalidation_handler=__commonJS({"node_modules/undici/lib/handler/cache-revalidation-handler.js"(exports,module){"use strict";var assert=__require("node:assert"),CacheRevalidationHandler=class{#successful=!1;#callback;#handler;#context;#allowErrorStatusCodes;constructor(callback,handler,allowErrorStatusCodes){if(typeof callback!="function")throw new TypeError("callback must be a function");this.#callback=callback,this.#handler=handler,this.#allowErrorStatusCodes=allowErrorStatusCodes}onRequestStart(_2,context){this.#successful=!1,this.#context=context}onRequestUpgrade(controller,statusCode,headers,socket){this.#handler.onRequestUpgrade?.(controller,statusCode,headers,socket)}onResponseStart(controller,statusCode,headers,statusMessage){if(assert(this.#callback!=null),this.#successful=statusCode===304||this.#allowErrorStatusCodes&&statusCode>=500&&statusCode<=504,this.#callback(this.#successful,this.#context,statusCode,headers),this.#callback=null,this.#successful)return!0;this.#handler.onRequestStart?.(controller,this.#context),this.#handler.onResponseStart?.(controller,statusCode,headers,statusMessage)}onResponseData(controller,chunk){if(!this.#successful)return this.#handler.onResponseData?.(controller,chunk)}onResponseEnd(controller,trailers){this.#successful||this.#handler.onResponseEnd?.(controller,trailers)}onResponseError(controller,err2){if(!this.#successful){if(this.#callback){if(this.#allowErrorStatusCodes){this.#successful=!0,this.#callback(!0,this.#context),this.#callback=null;return}this.#callback(!1),this.#callback=null}if(typeof this.#handler.onResponseError=="function")this.#handler.onResponseError(controller,err2);else throw err2}}};module.exports=CacheRevalidationHandler}});var require_cache2=__commonJS({"node_modules/undici/lib/interceptor/cache.js"(exports,module){"use strict";var assert=__require("node:assert"),{Readable:Readable2}=__require("node:stream"),util=require_util(),CacheHandler=require_cache_handler(),MemoryCacheStore=require_memory_cache_store(),CacheRevalidationHandler=require_cache_revalidation_handler(),{assertCacheStore,assertCacheMethods,getInterceptorOrigin,makeCacheKey,normalizeHeaders,parseCacheControlHeader,isInvalidOrWildcardVaryHeader,parseVaryHeader}=require_cache(),{AbortError}=require_errors(),{parseHttpDate}=require_date();function assertCacheOrigins(origins,name){if(origins!==void 0){if(!Array.isArray(origins))throw new TypeError(`expected ${name} to be an array or undefined, got ${typeof origins}`);for(let i=0;i<origins.length;i++){let origin=origins[i];if(typeof origin!="string"&&!(origin instanceof RegExp))throw new TypeError(`expected ${name}[${i}] to be a string or RegExp, got ${typeof origin}`)}}}var nop=()=>{};function trimOWS(value2){return value2.replace(/^[\t ]+|[\t ]+$/g,"")}function arrayIncludes(array,value2){for(let i=0;i<array.length;i++)if(array[i]===value2)return!0;return!1}function hasPragmaNoCache(headers){let pragma=headers?.pragma;if(!pragma)return!1;let values=Array.isArray(pragma)?pragma:[pragma];for(let i=0;i<values.length;i++){let value2=values[i];if(typeof value2!="string")continue;let directives=value2.split(",");for(let j2=0;j2<directives.length;j2++)if(trimOWS(directives[j2]).toLowerCase()==="no-cache")return!0}return!1}function needsRevalidation(result2,cacheControlDirectives,{headers={}}){return!!(cacheControlDirectives?.["no-cache"]||result2.cacheControlDirectives?.["no-cache"]&&!Array.isArray(result2.cacheControlDirectives["no-cache"])||headers["if-modified-since"]||headers["if-none-match"])}function staleResponseRequiresRevalidation(result2,cacheType){return result2.cacheControlDirectives?.["must-revalidate"]===!0||cacheType==="shared"&&(result2.cacheControlDirectives?.["proxy-revalidate"]===!0||result2.cacheControlDirectives?.["s-maxage"]!==void 0)}function revalidationResponseDisallowsCachedReuse(cacheType,headers){if(headers.vary&&isInvalidOrWildcardVaryHeader(headers.vary)||cacheType==="shared"&&Object.hasOwn(headers,"set-cookie"))return!0;let cacheControl=headers["cache-control"];if(!cacheControl)return!1;let cacheControlDirectives=parseCacheControlHeader(cacheControl);return cacheControlDirectives["no-store"]===!0||cacheType==="shared"&&cacheControlDirectives.private===!0}function revalidationResponseUpdatesCacheControl(headers){return headers["cache-control"]!==void 0}function revalidationResponseAddsVary(result2,varyDirectives){if(!varyDirectives)return!1;for(let key in varyDirectives)if(result2.vary==null||!Object.hasOwn(result2.vary,key))return!0;return!1}function deleteCachedValue(store,cacheKey2){try{store.delete(cacheKey2)?.catch?.(nop)}catch{}}function getUsableLastModified(headers){let lastModified=headers?.["last-modified"];if(typeof lastModified=="string"&&parseHttpDate(lastModified))return lastModified}function makeRevalidationHeaders(opts,result2){let headers={...opts.headers,"if-modified-since":getUsableLastModified(result2.headers)??new Date(result2.cachedAt).toUTCString()};if(result2.etag&&(headers["if-none-match"]=result2.etag),result2.vary)for(let key in result2.vary)result2.vary[key]!=null&&(headers[key]=result2.vary[key]);return headers}function isStale(result2,cacheControlDirectives,cacheType){let now=Date.now();if(now>result2.staleAt){if(!staleResponseRequiresRevalidation(result2,cacheType)&&cacheControlDirectives?.["max-stale"]){let gracePeriod=result2.staleAt+cacheControlDirectives["max-stale"]*1e3;return now>gracePeriod}return!0}if(cacheControlDirectives?.["min-fresh"]){let timeLeftTillStale=result2.staleAt-now,threshold=cacheControlDirectives["min-fresh"]*1e3;return timeLeftTillStale<=threshold}return!1}function withinStaleWhileRevalidateWindow(result2,cacheType){let staleWhileRevalidate=result2.cacheControlDirectives?.["stale-while-revalidate"];if(!staleWhileRevalidate||staleResponseRequiresRevalidation(result2,cacheType))return!1;let now=Date.now(),staleWhileRevalidateExpiry=result2.staleAt+staleWhileRevalidate*1e3;return now<=staleWhileRevalidateExpiry}function handleUncachedResponse(dispatch,globalOpts,cacheKey2,handler,opts,reqCacheControl){if(reqCacheControl?.["only-if-cached"]){let aborted=!1,controller={paused:!1,rawHeaders:[],rawTrailers:[],pause(){this.paused=!0},resume(){this.paused=!1},abort:reason=>{aborted=!0,handler.onResponseError?.(controller,reason??new AbortError)}};try{if(handler.onRequestStart?.(controller,null),aborted||(handler.onResponseStart?.(controller,504,{},"Gateway Timeout"),aborted))return;handler.onResponseEnd?.(controller,{})}catch(err2){typeof handler.onResponseError=="function"&&handler.onResponseError(controller,err2)}return!0}return dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler))}function sendCachedValue(handler,opts,result2,age,context,isStale2){let stream2=util.isStream(result2.body)?result2.body:Readable2.from(result2.body??[]);assert(!stream2.destroyed,"stream should not be destroyed"),assert(!stream2.readableDidRead,"stream should not be readableDidRead");let controller={rawHeaders:[],rawTrailers:[],resume(){stream2.resume()},pause(){stream2.pause()},get paused(){return stream2.isPaused()},get aborted(){return stream2.destroyed},get reason(){return stream2.errored},abort(reason){stream2.destroy(reason??new AbortError)}};if(stream2.on("error",function(err2){if(!this.readableEnded)if(typeof handler.onResponseError=="function")handler.onResponseError(controller,err2);else throw err2}).on("close",function(){this.errored||handler.onResponseEnd?.(controller,{})}),handler.onRequestStart?.(controller,context),stream2.destroyed)return;let headers={...result2.headers,age:String(age)};isStale2&&(headers.warning='110 - "response is stale"'),controller.rawHeaders=util.toRawHeaders(headers),handler.onResponseStart?.(controller,result2.statusCode,headers,result2.statusMessage),opts.method==="HEAD"?stream2.destroy():stream2.on("data",function(chunk){handler.onResponseData?.(controller,chunk)})}function handleResult(dispatch,globalOpts,cacheKey2,handler,opts,reqCacheControl,result2){if(!result2)return handleUncachedResponse(dispatch,globalOpts,cacheKey2,handler,opts,reqCacheControl);if(globalOpts.type==="shared"&&Object.hasOwn(result2.headers,"set-cookie"))return util.isStream(result2.body)&&result2.body.on("error",nop).destroy(),deleteCachedValue(globalOpts.store,cacheKey2),handleUncachedResponse(dispatch,globalOpts,cacheKey2,handler,opts,reqCacheControl);let now=Date.now();if(now>result2.deleteAt)return dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler));let age=Math.round((now-result2.cachedAt)/1e3),requestMaxAgeExpired=reqCacheControl?.["max-age"]!==void 0&&age>=reqCacheControl["max-age"],stale=requestMaxAgeExpired||isStale(result2,reqCacheControl,globalOpts.type),revalidate=requestMaxAgeExpired||needsRevalidation(result2,reqCacheControl,opts);if(stale||revalidate){if(util.isStream(opts.body)&&util.bodyLength(opts.body)!==0)return dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler));if(!revalidate&&withinStaleWhileRevalidateWindow(result2,globalOpts.type))return sendCachedValue(handler,opts,result2,age,null,!0),queueMicrotask(()=>{let headers2=makeRevalidationHeaders(opts,result2);dispatch({...opts,headers:headers2},new CacheHandler(globalOpts,cacheKey2,{onRequestStart(){},onRequestUpgrade(){},onResponseStart(){},onResponseData(){},onResponseEnd(){},onResponseError(){}}))}),!0;let withinStaleIfErrorThreshold=!1;if(!staleResponseRequiresRevalidation(result2,globalOpts.type)){let staleIfErrorExpiry=result2.cacheControlDirectives["stale-if-error"]??reqCacheControl?.["stale-if-error"];staleIfErrorExpiry&&(withinStaleIfErrorThreshold=now<result2.staleAt+staleIfErrorExpiry*1e3)}let headers=makeRevalidationHeaders(opts,result2);return dispatch({...opts,headers},new CacheRevalidationHandler((success,context,statusCode,headers2)=>{if(success){if(statusCode===304){if(revalidationResponseDisallowsCachedReuse(globalOpts.type,headers2))return util.isStream(result2.body)&&result2.body.on("error",nop).destroy(),deleteCachedValue(globalOpts.store,cacheKey2),dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler));if(revalidationResponseUpdatesCacheControl(headers2))deleteCachedValue(globalOpts.store,cacheKey2);else if(revalidationResponseAddsVary(result2,headers2.vary?parseVaryHeader(headers2.vary,opts.headers):void 0))return util.isStream(result2.body)&&result2.body.on("error",nop).destroy(),deleteCachedValue(globalOpts.store,cacheKey2),dispatch(opts,new CacheHandler(globalOpts,cacheKey2,handler))}sendCachedValue(handler,opts,result2,age,context,stale)}else util.isStream(result2.body)&&result2.body.on("error",nop).destroy()},new CacheHandler(globalOpts,cacheKey2,handler),withinStaleIfErrorThreshold))}util.isStream(opts.body)&&opts.body.on("error",nop).destroy(),sendCachedValue(handler,opts,result2,age,null,!1)}module.exports=(opts={})=>{let{store=new MemoryCacheStore,methods=["GET"],cacheByDefault=void 0,type="shared",origins=void 0}=opts;if(typeof opts!="object"||opts===null)throw new TypeError(`expected type of opts to be an Object, got ${opts===null?"null":typeof opts}`);if(assertCacheStore(store,"opts.store"),assertCacheMethods(methods,"opts.methods"),assertCacheOrigins(origins,"opts.origins"),typeof cacheByDefault<"u"&&typeof cacheByDefault!="number")throw new TypeError(`expected opts.cacheByDefault to be number or undefined, got ${typeof cacheByDefault}`);if(typeof type<"u"&&type!=="shared"&&type!=="private")throw new TypeError(`expected opts.type to be shared, private, or undefined, got ${typeof type}`);let globalOpts={store,methods,cacheByDefault,type},safeMethodsToNotCache=[];for(let i=0;i<util.safeHTTPMethods.length;i++){let method=util.safeHTTPMethods[i];arrayIncludes(methods,method)||safeMethodsToNotCache.push(method)}return(dispatch,interceptorOrigin)=>(opts2,handler)=>{let requestOrigin=getInterceptorOrigin(opts2,interceptorOrigin);if(!requestOrigin||arrayIncludes(safeMethodsToNotCache,opts2.method))return dispatch(opts2,handler);if(origins!==void 0){let normalizedRequestOrigin=requestOrigin.toString().toLowerCase(),isAllowed=!1;for(let i=0;i<origins.length;i++){let allowed=origins[i];if(typeof allowed=="string"){if(allowed.toLowerCase()===normalizedRequestOrigin){isAllowed=!0;break}}else if(allowed.test(normalizedRequestOrigin)){isAllowed=!0;break}}if(!isAllowed)return dispatch(opts2,handler)}opts2={...opts2,headers:normalizeHeaders(opts2)};let reqCacheControl=opts2.headers?.["cache-control"]?parseCacheControlHeader(opts2.headers["cache-control"]):hasPragmaNoCache(opts2.headers)?{"no-cache":!0}:void 0;if(reqCacheControl?.["no-store"])return dispatch(opts2,handler);let cacheKey2=makeCacheKey(opts2,requestOrigin);if(!arrayIncludes(util.safeHTTPMethods,opts2.method))return dispatch(opts2,new CacheHandler(globalOpts,cacheKey2,handler));let result2=store.get(cacheKey2);return result2&&typeof result2.then=="function"?result2.then(result3=>handleResult(dispatch,globalOpts,cacheKey2,handler,opts2,reqCacheControl,result3)):handleResult(dispatch,globalOpts,cacheKey2,handler,opts2,reqCacheControl,result2)}}}});var require_decompress=__commonJS({"node_modules/undici/lib/interceptor/decompress.js"(exports,module){"use strict";var{createInflate,createGunzip,createBrotliDecompress,createZstdDecompress}=__require("node:zlib"),{pipeline:pipeline2,Transform:TransformStream2}=__require("node:stream"),{InvalidArgumentError,ResponseExceededMaxSizeError}=require_errors(),DecoratorHandler=require_decorator_handler(),supportedEncodings={gzip:createGunzip,"x-gzip":createGunzip,br:createBrotliDecompress,deflate:createInflate,compress:createInflate,"x-compress":createInflate,zstd:createZstdDecompress},defaultSkipStatusCodes=[204,304],defaultMaxSize=64*1024*1024;function createMaxSizeLimiter(maxSize){let size=0;return new TransformStream2({transform(chunk,_encoding,callback){let decompressedSize=size+chunk.length;if(decompressedSize>maxSize){callback(new ResponseExceededMaxSizeError(`Decompressed response size (${decompressedSize}) exceeded maxSize (${maxSize})`));return}size=decompressedSize,callback(null,chunk)}})}var warningEmitted=!1,DecompressHandler=class extends DecoratorHandler{#decompressors=[];#trailers;#skipStatusCodes;#skipErrorResponses;#maxSize;#decompressedSize=0;#terminated=!1;#inputEnded=!1;constructor(handler,{skipStatusCodes=defaultSkipStatusCodes,skipErrorResponses=!0,maxSize=defaultMaxSize}={}){if(!Number.isSafeInteger(maxSize)||maxSize<1)throw new InvalidArgumentError("maxSize must be a positive integer");super(handler),this.#skipStatusCodes=skipStatusCodes,this.#skipErrorResponses=skipErrorResponses,this.#maxSize=maxSize}#shouldSkipDecompression(contentEncoding,statusCode){return!!(!contentEncoding||statusCode<200||this.#skipStatusCodes.includes(statusCode)||this.#skipErrorResponses&&statusCode>=400)}#createDecompressionChain(encodings){let parts=encodings.split(","),maxContentEncodings=5;if(parts.length>maxContentEncodings)throw new Error(`too many content-encodings in response: ${parts.length}, maximum allowed is ${maxContentEncodings}`);let decompressors=[];for(let i=parts.length-1;i>=0;i--){let encoding=parts[i].trim();if(encoding){if(!supportedEncodings[encoding])return decompressors.length=0,decompressors;decompressors.push(supportedEncodings[encoding]())}}if(decompressors.length<2)return decompressors;let streams=[];for(let i=0;i<decompressors.length;i++)streams.push(decompressors[i]),i<decompressors.length-1&&streams.push(createMaxSizeLimiter(this.#maxSize));return streams}#fail(controller,error){this.#terminated||(this.#inputEnded?this.onResponseError(controller,error):controller.abort(error))}#setupDecompressorEvents(decompressor,controller){decompressor.on("readable",()=>{if(this.#terminated)return;let chunk;for(;(chunk=decompressor.read())!==null;){let decompressedSize=this.#decompressedSize+chunk.length;if(decompressedSize>this.#maxSize){this.#fail(controller,new ResponseExceededMaxSizeError(`Decompressed response size (${decompressedSize}) exceeded maxSize (${this.#maxSize})`));return}if(this.#decompressedSize=decompressedSize,super.onResponseData(controller,chunk)===!1)break}}),decompressor.on("error",error=>{this.#fail(controller,error)})}#setupSingleDecompressor(controller){let decompressor=this.#decompressors[0];this.#setupDecompressorEvents(decompressor,controller),decompressor.on("end",()=>{this.#terminated||(this.#terminated=!0,this.#cleanupDecompressors(),super.onResponseEnd(controller,this.#trailers))})}#setupMultipleDecompressors(controller){let lastDecompressor=this.#decompressors[this.#decompressors.length-1];this.#setupDecompressorEvents(lastDecompressor,controller),pipeline2(this.#decompressors,err2=>{if(!this.#terminated){if(err2){this.#fail(controller,err2);return}this.#terminated=!0,this.#cleanupDecompressors(),super.onResponseEnd(controller,this.#trailers)}})}#cleanupDecompressors(){this.#decompressors.length=0}onResponseStart(controller,statusCode,headers,statusMessage){let contentEncoding=headers["content-encoding"];if(this.#shouldSkipDecompression(contentEncoding,statusCode))return super.onResponseStart(controller,statusCode,headers,statusMessage);let decompressors=this.#createDecompressionChain(contentEncoding.toLowerCase());if(decompressors.length===0)return this.#cleanupDecompressors(),super.onResponseStart(controller,statusCode,headers,statusMessage);this.#decompressors=decompressors;let{"content-encoding":_2,"content-length":__,...newHeaders}=headers;if(controller?.rawHeaders){let rawHeaders=controller.rawHeaders;if(Array.isArray(rawHeaders)){let filteredHeaders=[];for(let i=0;i<rawHeaders.length;i+=2){let headerName=rawHeaders[i],lowerName=(Buffer.isBuffer(headerName)?headerName.toString("latin1"):`${headerName}`).toLowerCase();lowerName==="content-encoding"||lowerName==="content-length"||filteredHeaders.push(rawHeaders[i],rawHeaders[i+1])}rawHeaders.splice(0,rawHeaders.length,...filteredHeaders)}else if(typeof rawHeaders=="object")for(let name of Object.keys(rawHeaders)){let lowerName=name.toLowerCase();(lowerName==="content-encoding"||lowerName==="content-length")&&delete rawHeaders[name]}}return this.#decompressors.length===1?this.#setupSingleDecompressor(controller):this.#setupMultipleDecompressors(controller),super.onResponseStart(controller,statusCode,newHeaders,statusMessage)}onResponseData(controller,chunk){if(this.#decompressors.length>0){this.#decompressors[0].write(chunk);return}super.onResponseData(controller,chunk)}onResponseEnd(controller,trailers){if(this.#decompressors.length>0){this.#inputEnded=!0,this.#trailers=trailers,this.#decompressors[0].end();return}super.onResponseEnd(controller,trailers)}onResponseError(controller,err2){if(!this.#terminated){this.#terminated=!0;for(let decompressor of this.#decompressors)decompressor.destroy();this.#cleanupDecompressors(),super.onResponseError(controller,err2)}}};function createDecompressInterceptor(options={}){return warningEmitted||(process.emitWarning("DecompressInterceptor is experimental and subject to change","ExperimentalWarning"),warningEmitted=!0),dispatch=>(opts,handler)=>{if(opts.method==="HEAD")return dispatch(opts,handler);let decompressHandler=new DecompressHandler(handler,options);return dispatch(opts,decompressHandler)}}module.exports=createDecompressInterceptor}});var require_deduplication_handler=__commonJS({"node_modules/undici/lib/handler/deduplication-handler.js"(exports,module){"use strict";var{RequestAbortedError}=require_errors(),DEFAULT_MAX_BUFFER_SIZE=5*1024*1024,DeduplicationHandler=class{#primaryHandler;#waitingHandlers=[];#maxBufferSize=DEFAULT_MAX_BUFFER_SIZE;#statusCode=0;#headers={};#statusMessage="";#aborted=!1;#responseStarted=!1;#responseDataStarted=!1;#completed=!1;#controller=null;#onComplete=null;constructor(primaryHandler,onComplete,maxBufferSize=DEFAULT_MAX_BUFFER_SIZE){this.#primaryHandler=primaryHandler,this.#onComplete=onComplete,this.#maxBufferSize=maxBufferSize}addWaitingHandler(handler){if(this.#completed||this.#responseDataStarted)return!1;let waitingHandler=this.#createWaitingHandler(handler),waitingController=waitingHandler.controller;try{if(handler.onRequestStart?.(waitingController,null),waitingController.aborted)return waitingHandler.done=!0,!0;this.#responseStarted&&handler.onResponseStart?.(waitingController,this.#statusCode,this.#headers,this.#statusMessage)}catch{return waitingHandler.done=!0,!0}return waitingController.aborted||this.#waitingHandlers.push(waitingHandler),!0}onRequestStart(controller,context){this.#controller=controller,this.#primaryHandler.onRequestStart?.(controller,context)}onRequestUpgrade(controller,statusCode,headers,socket){this.#primaryHandler.onRequestUpgrade?.(controller,statusCode,headers,socket)}onResponseStart(controller,statusCode,headers,statusMessage){this.#responseStarted=!0,this.#statusCode=statusCode,this.#headers=headers,this.#statusMessage=statusMessage,this.#primaryHandler.onResponseStart?.(controller,statusCode,headers,statusMessage);for(let waitingHandler of this.#waitingHandlers){let{handler,controller:waitingController}=waitingHandler;if(waitingHandler.done||waitingController.aborted){waitingHandler.done=!0;continue}try{handler.onResponseStart?.(waitingController,statusCode,headers,statusMessage)}catch{}waitingController.aborted&&(waitingHandler.done=!0)}this.#pruneDoneWaitingHandlers()}onResponseData(controller,chunk){if(!(this.#aborted||this.#completed)){this.#responseDataStarted=!0,this.#primaryHandler.onResponseData?.(controller,chunk);for(let waitingHandler of this.#waitingHandlers){let{handler,controller:waitingController}=waitingHandler;if(waitingHandler.done||waitingController.aborted){waitingHandler.done=!0;continue}if(waitingController.paused){this.#bufferWaitingChunk(waitingHandler,chunk);continue}try{handler.onResponseData?.(waitingController,chunk)}catch{}waitingController.aborted&&(waitingHandler.done=!0,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0)}this.#pruneDoneWaitingHandlers()}}onResponseEnd(controller,trailers){if(!(this.#aborted||this.#completed)){this.#completed=!0,this.#primaryHandler.onResponseEnd?.(controller,trailers);for(let waitingHandler of this.#waitingHandlers){if(waitingHandler.done||waitingHandler.controller.aborted){waitingHandler.done=!0;continue}if(this.#flushWaitingHandler(waitingHandler),waitingHandler.done||waitingHandler.controller.aborted){waitingHandler.done=!0;continue}if(waitingHandler.controller.paused&&waitingHandler.bufferedChunks.length>0){waitingHandler.pendingTrailers=trailers;continue}try{waitingHandler.handler.onResponseEnd?.(waitingHandler.controller,trailers)}catch{}waitingHandler.done=!0}this.#pruneDoneWaitingHandlers(),this.#onComplete?.()}}onResponseError(controller,err2){if(!this.#completed){this.#aborted=!0,this.#completed=!0,this.#primaryHandler.onResponseError?.(controller,err2);for(let waitingHandler of this.#waitingHandlers)this.#errorWaitingHandler(waitingHandler,err2);this.#waitingHandlers=[],this.#onComplete?.()}}#createWaitingHandler(handler){let waitingHandler={handler,controller:null,bufferedChunks:[],bufferedBytes:0,pendingTrailers:null,done:!1},state2={aborted:!1,paused:!1,reason:null};return waitingHandler.controller={resume:()=>{if(!state2.aborted){if(state2.paused=!1,this.#flushWaitingHandler(waitingHandler),this.#completed&&waitingHandler.pendingTrailers&&waitingHandler.bufferedChunks.length===0&&!state2.paused&&!state2.aborted){try{waitingHandler.handler.onResponseEnd?.(waitingHandler.controller,waitingHandler.pendingTrailers)}catch{}waitingHandler.pendingTrailers=null,waitingHandler.done=!0}this.#pruneDoneWaitingHandlers()}},pause:()=>{state2.aborted||(state2.paused=!0)},get paused(){return state2.paused},get aborted(){return state2.aborted},get reason(){return state2.reason},abort:reason=>{if(!state2.aborted){state2.aborted=!0,state2.reason=reason??null,waitingHandler.done=!0,waitingHandler.pendingTrailers=null,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0;try{handler.onResponseError?.(waitingHandler.controller,state2.reason??new RequestAbortedError)}catch{}}}},waitingHandler}#bufferWaitingChunk(waitingHandler,chunk){if(waitingHandler.done||waitingHandler.controller.aborted){waitingHandler.done=!0,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0;return}let bufferedChunk=Buffer.from(chunk);if(waitingHandler.bufferedChunks.push(bufferedChunk),waitingHandler.bufferedBytes+=bufferedChunk.length,waitingHandler.bufferedBytes>this.#maxBufferSize){let err2=new RequestAbortedError(`Deduplicated waiting handler exceeded maxBufferSize (${this.#maxBufferSize} bytes) while paused`);this.#errorWaitingHandler(waitingHandler,err2)}}#flushWaitingHandler(waitingHandler){let{handler,controller}=waitingHandler;for(;!waitingHandler.done&&!controller.aborted&&!controller.paused&&waitingHandler.bufferedChunks.length>0;){let bufferedChunk=waitingHandler.bufferedChunks.shift();waitingHandler.bufferedBytes-=bufferedChunk.length;try{handler.onResponseData?.(controller,bufferedChunk)}catch{}if(controller.aborted){waitingHandler.done=!0,waitingHandler.pendingTrailers=null,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0;break}}}#errorWaitingHandler(waitingHandler,err2){waitingHandler.done||(waitingHandler.done=!0,waitingHandler.pendingTrailers=null,waitingHandler.bufferedChunks=[],waitingHandler.bufferedBytes=0,waitingHandler.controller.abort(err2))}#pruneDoneWaitingHandlers(){this.#waitingHandlers=this.#waitingHandlers.filter(waitingHandler=>waitingHandler.done===!1)}};module.exports=DeduplicationHandler}});var require_deduplicate=__commonJS({"node_modules/undici/lib/interceptor/deduplicate.js"(exports,module){"use strict";var diagnosticsChannel=__require("node:diagnostics_channel"),util=require_util(),DeduplicationHandler=require_deduplication_handler(),{getInterceptorOrigin,normalizeHeaders,makeCacheKey,makeDeduplicationKey}=require_cache(),pendingRequestsChannel=diagnosticsChannel.channel("undici:request:pending-requests");module.exports=(opts={})=>{let{methods=["GET"],skipHeaderNames=[],excludeHeaderNames=[],maxBufferSize=5*1024*1024}=opts;if(typeof opts!="object"||opts===null)throw new TypeError(`expected type of opts to be an Object, got ${opts===null?"null":typeof opts}`);if(!Array.isArray(methods))throw new TypeError(`expected opts.methods to be an array, got ${typeof methods}`);for(let method of methods)if(!util.safeHTTPMethods.includes(method))throw new TypeError(`expected opts.methods to only contain safe HTTP methods, got ${method}`);if(!Array.isArray(skipHeaderNames))throw new TypeError(`expected opts.skipHeaderNames to be an array, got ${typeof skipHeaderNames}`);if(!Array.isArray(excludeHeaderNames))throw new TypeError(`expected opts.excludeHeaderNames to be an array, got ${typeof excludeHeaderNames}`);if(!Number.isFinite(maxBufferSize)||maxBufferSize<=0)throw new TypeError(`expected opts.maxBufferSize to be a positive finite number, got ${maxBufferSize}`);let skipHeaderNamesSet=new Set(skipHeaderNames.map(name=>name.toLowerCase())),excludeHeaderNamesSet=new Set(excludeHeaderNames.map(name=>name.toLowerCase())),pendingRequests=new Map;return(dispatch,interceptorOrigin)=>(opts2,handler)=>{let requestOrigin=getInterceptorOrigin(opts2,interceptorOrigin);if(!requestOrigin||opts2.upgrade||methods.includes(opts2.method)===!1)return dispatch(opts2,handler);if(opts2={...opts2,headers:normalizeHeaders(opts2)},skipHeaderNamesSet.size>0){for(let headerName of Object.keys(opts2.headers))if(skipHeaderNamesSet.has(headerName.toLowerCase()))return dispatch(opts2,handler)}let cacheKey2=makeCacheKey(opts2,requestOrigin),dedupeKey=makeDeduplicationKey(cacheKey2,excludeHeaderNamesSet),pendingHandler=pendingRequests.get(dedupeKey);if(pendingHandler)return pendingHandler.addWaitingHandler(handler)?!0:dispatch(opts2,handler);let deduplicationHandler=new DeduplicationHandler(handler,()=>{pendingRequests.delete(dedupeKey),pendingRequestsChannel.hasSubscribers&&pendingRequestsChannel.publish({size:pendingRequests.size,key:dedupeKey,type:"removed"})},maxBufferSize);return pendingRequests.set(dedupeKey,deduplicationHandler),pendingRequestsChannel.hasSubscribers&&pendingRequestsChannel.publish({size:pendingRequests.size,key:dedupeKey,type:"added"}),dispatch(opts2,deduplicationHandler)}}}});var require_sqlite_cache_store=__commonJS({"node_modules/undici/lib/cache/sqlite-cache-store.js"(exports,module){"use strict";var{Writable}=__require("node:stream"),{assertCacheKey,assertCacheValue}=require_cache(),DatabaseSync,VERSION2=3,MAX_ENTRY_SIZE=2*1e3*1e3*1e3;module.exports=class{#maxEntrySize=MAX_ENTRY_SIZE;#maxCount=1/0;#db;#getValuesQuery;#updateValueQuery;#insertValueQuery;#deleteExpiredValuesQuery;#deleteByUrlQuery;#countEntriesQuery;#deleteOldValuesQuery;constructor(opts){if(opts){if(typeof opts!="object")throw new TypeError("SqliteCacheStore options must be an object");if(opts.maxEntrySize!==void 0){if(typeof opts.maxEntrySize!="number"||!Number.isInteger(opts.maxEntrySize)||opts.maxEntrySize<0)throw new TypeError("SqliteCacheStore options.maxEntrySize must be a non-negative integer");if(opts.maxEntrySize>MAX_ENTRY_SIZE)throw new TypeError("SqliteCacheStore options.maxEntrySize must be less than 2gb");this.#maxEntrySize=opts.maxEntrySize}if(opts.maxCount!==void 0){if(typeof opts.maxCount!="number"||!Number.isInteger(opts.maxCount)||opts.maxCount<0)throw new TypeError("SqliteCacheStore options.maxCount must be a non-negative integer");this.#maxCount=opts.maxCount}}DatabaseSync||(DatabaseSync=__require("node:sqlite").DatabaseSync),this.#db=new DatabaseSync(opts?.location??":memory:"),this.#db.exec(`
|
|
46
46
|
PRAGMA journal_mode = WAL;
|
|
47
47
|
PRAGMA synchronous = NORMAL;
|
|
48
48
|
PRAGMA temp_store = memory;
|
|
@@ -1118,9 +1118,18 @@ Additional focus: ${customInstructions}`:instructions=BRANCH_SUMMARY_PROMPT2;let
|
|
|
1118
1118
|
${conversationText}
|
|
1119
1119
|
</conversation>
|
|
1120
1120
|
|
|
1121
|
-
${instructions}`}],timestamp:Date.now()}],maxTokens=Math.min(4096,model.maxTokens>0?model.maxTokens:Number.POSITIVE_INFINITY),context=normalizeContext({systemPrompt:SUMMARIZATION_SYSTEM_PROMPT2,messages:summarizationMessages}),response=await completeSummarization(model,context,{apiKey,headers,env:env2,signal,maxTokens},streamFn,retry,callbacks);if(response.stopReason==="aborted")return{aborted:!0};let failure=getSummarizationFailure(response,"Branch summarization");if(failure)return{error:failure};if(response.content.some(block=>block.type==="toolCall"))return{error:"Branch summarization attempted to call a tool"};let summary=contentText(response.content);summary=BRANCH_SUMMARY_PREAMBLE2+summary;let{readFiles,modifiedFiles}=computeFileLists2(fileOps);return summary+=formatFileOperations2(readFiles,modifiedFiles),{summary:summary||"No summary generated",usage:response.usage,readFiles,modifiedFiles}}
|
|
1121
|
+
${instructions}`}],timestamp:Date.now()}],maxTokens=Math.min(4096,model.maxTokens>0?model.maxTokens:Number.POSITIVE_INFINITY),context=normalizeContext({systemPrompt:SUMMARIZATION_SYSTEM_PROMPT2,messages:summarizationMessages}),response=await completeSummarization(model,context,{apiKey,headers,env:env2,signal,maxTokens},streamFn,retry,callbacks);if(response.stopReason==="aborted")return{aborted:!0};let failure=getSummarizationFailure(response,"Branch summarization");if(failure)return{error:failure};if(response.content.some(block=>block.type==="toolCall"))return{error:"Branch summarization attempted to call a tool"};let summary=contentText(response.content);summary=BRANCH_SUMMARY_PREAMBLE2+summary;let{readFiles,modifiedFiles}=computeFileLists2(fileOps);return summary+=formatFileOperations2(readFiles,modifiedFiles),{summary:summary||"No summary generated",usage:response.usage,readFiles,modifiedFiles}}var RECEIVED_ARGUMENTS_MARKER=`
|
|
1122
|
+
|
|
1123
|
+
Received arguments:
|
|
1124
|
+
`,HINT_MARKER=`
|
|
1125
|
+
|
|
1126
|
+
Hint: `,RECEIVED_ARGUMENTS_MAX_BYTES=2*1024,RECEIVED_ARGUMENTS_MAX_LINES=40,FIELD_HINTS_MAX=10;function isRecord3(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function collectFieldHints(schema,args){let hints=[],visit=(node,value2,path14)=>{if(hints.length>=FIELD_HINTS_MAX||!isRecord3(node))return;if(node.type==="array"&&Array.isArray(value2)){for(let index3=0;index3<value2.length;index3++)visit(node.items,value2[index3],`${path14}[${index3}]`);return}if(node.type!=="object"||!isRecord3(value2))return;let properties=isRecord3(node.properties)?node.properties:{},fields=Object.keys(properties),where=path14||"root";if(node.additionalProperties===!1){for(let[key,entry]of Object.entries(value2))if(entry!==null&&!(key in properties)&&hints.length<FIELD_HINTS_MAX){let subject=path14?`${path14}.${key}`:key;hints.push(`${subject} is not a field; fields at ${where}: ${fields.join(", ")}`)}}if(Array.isArray(node.required)){for(let key of node.required)if(typeof key=="string"&&value2[key]===void 0&&hints.length<FIELD_HINTS_MAX){let subject=path14?`${path14}.${key}`:key;hints.push(`${subject} is required; fields at ${where}: ${fields.join(", ")}`)}}for(let key of fields)value2[key]!==void 0&&value2[key]!==null&&visit(properties[key],value2[key],path14?`${path14}.${key}`:key)};return visit(schema,args,""),hints}function enrichValidationError(error,parameters,args){let message=error instanceof Error?error.message:String(error);if(message.includes(HINT_MARKER))return error instanceof Error?error:new Error(message);let hints=collectFieldHints(parameters,args),markerIndex=message.indexOf(RECEIVED_ARGUMENTS_MARKER),head=markerIndex===-1?message:message.slice(0,markerIndex),received=markerIndex===-1?"":message.slice(markerIndex+RECEIVED_ARGUMENTS_MARKER.length),enriched=hints.length>0?`${head}
|
|
1127
|
+
|
|
1128
|
+
Hint: ${hints.join(`
|
|
1129
|
+
Hint: `)}`:head;if(markerIndex!==-1){let bounded=truncateHead(received,{maxBytes:RECEIVED_ARGUMENTS_MAX_BYTES,maxLines:RECEIVED_ARGUMENTS_MAX_LINES});enriched+=`${RECEIVED_ARGUMENTS_MARKER}${bounded.content}`,bounded.truncated&&(enriched+=`
|
|
1130
|
+
\u2026 (arguments truncated)`)}return new Error(enriched)}function wrapPrepareArguments(definition){let tool={name:definition.name,description:definition.description,parameters:definition.parameters};return raw=>{let args=definition.prepareArguments?definition.prepareArguments(raw):raw;try{validateToolArguments(tool,{type:"toolCall",id:"",name:definition.name,arguments:args})}catch(error){throw enrichValidationError(error,definition.parameters,args)}return args}}function wrapToolDefinition(definition,ctxFactory){return{name:definition.name,label:definition.label,description:definition.description,parameters:definition.parameters,constrainedSampling:definition.constrainedSampling,toolGroup:definition.toolGroup,prepareArguments:wrapPrepareArguments(definition),executionMode:definition.executionMode,execute:(toolCallId,params,signal,onUpdate,ctx)=>definition.execute(toolCallId,params,signal,onUpdate,ctx??ctxFactory?.())}}function createToolDefinitionFromAgentTool(tool){return{name:tool.name,label:tool.label,description:tool.description,parameters:tool.parameters,constrainedSampling:tool.constrainedSampling,toolGroup:tool.toolGroup,prepareArguments:tool.prepareArguments,executionMode:tool.executionMode,execute:async(toolCallId,params,signal,onUpdate)=>tool.execute(toolCallId,params,signal,onUpdate)}}function wrapRegisteredTool(registeredTool,runner){return wrapToolDefinition(registeredTool.definition,()=>runner.createContext())}function wrapRegisteredTools(registeredTools,runner){return registeredTools.map(tool=>wrapRegisteredTool(tool,runner))}import*as fs5 from"node:fs";import{createRequire as createRequire4}from"node:module";import*as path7 from"node:path";import{fileURLToPath as fileURLToPath5}from"node:url";import{spawn as spawn3}from"node:child_process";async function execCommand(command,args,cwd,options){return new Promise(resolve17=>{let proc=spawn3(command,args,{cwd,shell:!1,stdio:["ignore","pipe","pipe"]}),stdout="",stderr="",killed=!1,timeoutId,killProcess=()=>{killed||(killed=!0,proc.kill("SIGTERM"),setTimeout(()=>{proc.killed||proc.kill("SIGKILL")},5e3))};options?.signal&&(options.signal.aborted?killProcess():options.signal.addEventListener("abort",killProcess,{once:!0})),options?.timeout&&options.timeout>0&&(timeoutId=setTimeout(()=>{killProcess()},options.timeout)),proc.stdout?.on("data",data=>{stdout+=data.toString()}),proc.stderr?.on("data",data=>{stderr+=data.toString()}),waitForChildProcess(proc).then(code=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve17({stdout,stderr,code:code??0,killed})}).catch(_err=>{timeoutId&&clearTimeout(timeoutId),options?.signal&&options.signal.removeEventListener("abort",killProcess),resolve17({stdout,stderr,code:1,killed})})})}var ENABLED=process.env.PI_TIMING==="1",timingNamespaces=new Map;function resetTimings(namespace="main"){ENABLED&&timingNamespaces.set(namespace,{timings:[],lastTime:Date.now()})}function time(label,namespace="main"){if(!ENABLED)return;let now=Date.now();timingNamespaces.has(namespace)||resetTimings(namespace);let timingNamespace=timingNamespaces.get(namespace);timingNamespace.timings.push({label,ms:now-timingNamespace.lastTime}),timingNamespace.lastTime=now}function printTimingGroup(title,timings){let printableTimings=timings.filter(timing=>timing.ms>=0);if(printableTimings.length!==0){console.error(`
|
|
1122
1131
|
--- ${title} ---`);for(let t of printableTimings)console.error(` ${t.label}: ${t.ms}ms`);console.error(` TOTAL: ${printableTimings.reduce((a,b2)=>a+b2.ms,0)}ms`),console.error(`${"-".repeat(title.length+8)}
|
|
1123
|
-
`)}}function printTimings(){if(ENABLED)for(let[namespace,timingNamespace]of timingNamespaces)printTimingGroup(`Startup Timings: ${namespace}`,timingNamespace.timings)}var require3=createRequire4(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path7.extname(fileURLToPath5(import.meta.url))===".ts",usesEmbeddedModules=isBunBinary||isNodeSeaBinary||isBundledNode,createJitiPromise;function getCreateJiti(){return createJitiPromise??=(usesEmbeddedModules?import("./jiti-static-loader-CLT3YR3B.js"):import("./jiti-loader-BFSSLU7G.js")).then(module=>module.createJiti),createJitiPromise}var virtualModulesPromise;function getVirtualModules(){return virtualModulesPromise??=import("./virtual-modules-GOHLE5JL.js").then(module=>module.VIRTUAL_MODULES),virtualModulesPromise}var _aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname2=path7.dirname(fileURLToPath5(import.meta.url)),packageIndex=path7.resolve(__dirname2,"../..","index.js"),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),resolveImport=specifier=>fileURLToPath5(import.meta.resolve(specifier)),piCodingAgentEntry=packageIndex,piAgentCoreEntry=resolveImport("@earendil-works/pi-agent-core"),piTuiEntry=resolveImport("@earendil-works/pi-tui"),piAiCompatEntry=resolveImport("@earendil-works/pi-ai/compat"),piAiOauthEntry=resolveImport("@earendil-works/pi-ai/oauth"),piAiProvidersEntry=resolveImport("@earendil-works/pi-ai/providers/all");return _aliases={"@earendil-works/pi-coding-agent":piCodingAgentEntry,[DISTRIBUTION_PACKAGE_NAME]:piCodingAgentEntry,"@earendil-works/pi-agent-core":piAgentCoreEntry,"@earendil-works/pi-tui":piTuiEntry,"@earendil-works/pi-ai/providers/all":piAiProvidersEntry,"@earendil-works/pi-ai/compat":piAiCompatEntry,"@earendil-works/pi-ai/oauth":piAiOauthEntry,"@earendil-works/pi-ai":piAiCompatEntry,"@mariozechner/pi-coding-agent":piCodingAgentEntry,"@mariozechner/pi-agent-core":piAgentCoreEntry,"@mariozechner/pi-tui":piTuiEntry,"@mariozechner/pi-ai/providers/all":piAiProvidersEntry,"@mariozechner/pi-ai/compat":piAiCompatEntry,"@mariozechner/pi-ai/oauth":piAiOauthEntry,"@mariozechner/pi-ai":piAiCompatEntry,typebox:typeboxEntry,"typebox/compile":typeboxCompileEntry,"typebox/value":typeboxValueEntry,"@sinclair/typebox":typeboxEntry,"@sinclair/typebox/compile":typeboxCompileEntry,"@sinclair/typebox/value":typeboxValueEntry},_aliases}var extensionCacheCwd,extensionCacheGeneration=0,extensionCache=new Map;function clearExtensionCache(){extensionCache.clear(),extensionCacheCwd=void 0,extensionCacheGeneration++}function useExtensionCacheCwd(cwd){let resolvedCwd=resolvePath(cwd);return extensionCacheCwd!==void 0&&extensionCacheCwd!==resolvedCwd&&clearExtensionCache(),extensionCacheCwd=resolvedCwd,{cwd:resolvedCwd,generation:extensionCacheGeneration}}function createExtensionRuntime(){let notInitialized=()=>{throw new Error("Extension runtime not initialized. Action methods cannot be called during extension loading.")},state2={},eventBusUnsubscribers=new Set,runtime={sendMessage:notInitialized,sendUserMessage:notInitialized,appendEntry:notInitialized,setSessionName:notInitialized,getSessionName:notInitialized,setLabel:notInitialized,getActiveTools:notInitialized,getAllTools:notInitialized,setActiveTools:notInitialized,refreshTools:()=>{},getCommands:notInitialized,setModel:()=>Promise.reject(new Error("Extension runtime not initialized")),getThinkingLevel:notInitialized,setThinkingLevel:notInitialized,flagValues:new Map,pendingProviderRegistrations:[],pendingNativeProviderRegistrations:[],assertActive:()=>{if(state2.staleMessage)throw new Error(state2.staleMessage)},invalidate:message=>{if(!state2.staleMessage){state2.staleMessage=message??STALE_EXTENSION_CONTEXT_MESSAGE;for(let unsubscribe of eventBusUnsubscribers)unsubscribe();eventBusUnsubscribers.clear()}},trackEventBusSubscription:unsubscribe=>{let active=!0,trackedUnsubscribe=()=>{active&&(active=!1,eventBusUnsubscribers.delete(trackedUnsubscribe),unsubscribe())};return eventBusUnsubscribers.add(trackedUnsubscribe),trackedUnsubscribe},registerProvider:(name,config,extensionPath="<unknown>")=>{runtime.pendingProviderRegistrations.push({name,config,extensionPath})},registerNativeProvider:(provider,extensionPath="<unknown>")=>{runtime.pendingNativeProviderRegistrations.push({provider,extensionPath})},unregisterProvider:name=>{runtime.pendingProviderRegistrations=runtime.pendingProviderRegistrations.filter(r=>r.name!==name),runtime.pendingNativeProviderRegistrations=runtime.pendingNativeProviderRegistrations.filter(r=>r.provider.id!==name)}};return runtime}function createExtensionAPI(extension,runtime,cwd,eventBus){let pendingFlagValues=new Map,pendingRuntimeChanges=[],loadingUnsubscribers=[],state2="loading",assertActive=()=>{if(state2==="failed")throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);runtime.assertActive()},applyRuntimeChange=change=>{state2==="loading"?pendingRuntimeChanges.push(change):change()},clearPending=()=>{pendingFlagValues.clear(),pendingRuntimeChanges.length=0,loadingUnsubscribers.length=0};return{api:{on(event,handler){assertActive();let registeredHandler=(...args)=>handler(...args),list2=extension.handlers.get(event)??[];return list2.push(registeredHandler),extension.handlers.set(event,list2),()=>{let handlers=extension.handlers.get(event);if(!handlers)return;let handlerIndex=handlers.indexOf(registeredHandler);handlerIndex!==-1&&(handlers.splice(handlerIndex,1),handlers.length===0&&extension.handlers.delete(event))}},registerTool(tool){if(assertActive(),typeof tool.parameters!="object"||tool.parameters===null||Array.isArray(tool.parameters))throw new Error(`Tool "${tool.name}" registered by extension "${extension.path}" must define an object parameter schema.`);extension.tools.set(tool.name,{definition:tool,sourceInfo:extension.sourceInfo}),runtime.refreshTools()},registerCommand(name,options){assertActive(),extension.commands.set(name,{name,sourceInfo:extension.sourceInfo,...options})},registerShortcut(shortcut,options){assertActive(),extension.shortcuts.set(shortcut,{shortcut,extensionPath:extension.path,...options})},registerFlag(name,options){if(assertActive(),options.default!==void 0&&typeof options.default!==options.type)throw new Error(`Invalid default for flag "${name}": expected ${options.type}, got ${typeof options.default}`);extension.flags.set(name,{name,extensionPath:extension.path,...options}),options.default!==void 0&&!runtime.flagValues.has(name)&&(state2==="loading"?pendingFlagValues.has(name)||pendingFlagValues.set(name,options.default):runtime.flagValues.set(name,options.default))},registerMessageRenderer(customType,renderer){assertActive(),extension.messageRenderers.set(customType,renderer)},registerMarkdownTransformer(transformer){assertActive(),extension.markdownTransformer=transformer},registerEntryRenderer(customType,renderer){assertActive(),extension.entryRenderers??=new Map,extension.entryRenderers.set(customType,renderer)},getFlag(name){if(assertActive(),!!extension.flags.has(name))return runtime.flagValues.has(name)?runtime.flagValues.get(name):pendingFlagValues.get(name)},sendMessage(message,options){assertActive(),runtime.sendMessage(message,options)},sendUserMessage(content,options){assertActive(),runtime.sendUserMessage(content,options)},appendEntry(customType,data){assertActive(),runtime.appendEntry(customType,data)},setSessionName(name){assertActive(),runtime.setSessionName(name)},getSessionName(){return assertActive(),runtime.getSessionName()},setLabel(entryId,label){assertActive(),runtime.setLabel(entryId,label)},exec(command,args,options){return assertActive(),execCommand(command,args,options?.cwd??cwd,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},getAllTools(){return assertActive(),runtime.getAllTools()},setActiveTools(toolNames){assertActive(),runtime.setActiveTools(toolNames)},getCommands(){return assertActive(),runtime.getCommands()},setModel(model){return assertActive(),runtime.setModel(model)},getThinkingLevel(){return assertActive(),runtime.getThinkingLevel()},setThinkingLevel(level){assertActive(),runtime.setThinkingLevel(level)},registerProvider(providerOrName,config){if(assertActive(),typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");applyRuntimeChange(()=>runtime.registerProvider(providerOrName,config,extension.path));return}applyRuntimeChange(()=>runtime.registerNativeProvider(providerOrName,extension.path))},unregisterProvider(name){assertActive(),applyRuntimeChange(()=>runtime.unregisterProvider(name,extension.path))},events:{emit(channel,data){assertActive(),eventBus.emit(channel,data)},on(channel,handler){assertActive();let unsubscribe=runtime.trackEventBusSubscription(eventBus.on(channel,handler));return state2==="loading"&&loadingUnsubscribers.push(unsubscribe),unsubscribe}}},commit:()=>{if(state2==="loading"){runtime.assertActive();for(let[name,value2]of pendingFlagValues)runtime.flagValues.has(name)||runtime.flagValues.set(name,value2);for(let apply of pendingRuntimeChanges)apply();state2="active",clearPending()}},discard:()=>{if(state2==="loading"){state2="failed";for(let unsubscribe of loadingUnsubscribers)unsubscribe();clearPending()}}}}function isCurrentCacheToken(cacheToken){return cacheToken!==void 0&&extensionCacheCwd===cacheToken.cwd&&extensionCacheGeneration===cacheToken.generation}async function loadExtensionModule(extensionPath,cacheToken){if(isCurrentCacheToken(cacheToken)){let cachedFactory=extensionCache.get(extensionPath);if(cachedFactory)return cachedFactory}let createJitiImpl=await getCreateJiti(),resolutionOptions=usesEmbeddedModules?{virtualModules:await getVirtualModules(),tryNative:!1}:isTypeScriptSourceRuntime?{virtualModules:await getVirtualModules(),tsconfigPaths:!0}:{alias:getAliases()},factory=await createJitiImpl(import.meta.url,{moduleCache:!1,...resolutionOptions}).import(extensionPath,{default:!0});if(typeof factory=="function")return isCurrentCacheToken(cacheToken)&&extensionCache.set(extensionPath,factory),factory}function createExtension(extensionPath,resolvedPath){let source=extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1).split(":")[0]||"temporary":"local",baseDir=extensionPath.startsWith("<")?void 0:path7.dirname(resolvedPath);return{path:extensionPath,resolvedPath,sourceInfo:createSyntheticSourceInfo(extensionPath,{source,baseDir}),handlers:new Map,tools:new Map,messageRenderers:new Map,entryRenderers:new Map,commands:new Map,flags:new Map,shortcuts:new Map}}async function initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime){let extension=createExtension(extensionPath,resolvedPath),load=createExtensionAPI(extension,runtime,cwd,eventBus);try{await factory(load.api),load.commit()}catch(error){throw load.discard(),error}return time(`${extensionPath} factory`,"extensions"),extension}async function loadExtension(extensionPath,cwd,eventBus,runtime,cacheToken){let resolvedPath=resolvePath(extensionPath,cwd,{normalizeUnicodeSpaces:!0});try{let factory=await loadExtensionModule(resolvedPath,cacheToken);return time(`${extensionPath} module import`,"extensions"),factory?{extension:await initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime),error:null}:{extension:null,error:`Extension does not export a valid factory function: ${extensionPath}`}}catch(err2){return{extension:null,error:`Failed to load extension: ${err2 instanceof Error?err2.message:String(err2)}`}}}async function loadExtensionFromFactory(factory,cwd,eventBus,runtime,extensionPath="<inline>"){let resolvedCwd=resolvePath(cwd);return initializeExtension(factory,extensionPath,extensionPath,resolvedCwd,eventBus,runtime)}async function loadExtensionsInternal(paths,cwd,eventBus,runtime,useCache=!1){let extensions=[],errors=[],cacheToken=useCache?useExtensionCacheCwd(cwd):void 0,resolvedCwd=cacheToken?.cwd??resolvePath(cwd),resolvedEventBus=eventBus??createEventBus(),resolvedRuntime=runtime??createExtensionRuntime();for(let extPath of paths){let{extension,error}=await loadExtension(extPath,resolvedCwd,resolvedEventBus,resolvedRuntime,cacheToken);if(error){errors.push({path:extPath,error});continue}extension&&extensions.push(extension)}return{extensions,errors,runtime:resolvedRuntime}}async function loadExtensions(paths,cwd,eventBus,runtime){return loadExtensionsInternal(paths,cwd,eventBus,runtime)}async function loadExtensionsCached(paths,cwd,eventBus,runtime){return loadExtensionsInternal(paths,cwd,eventBus,runtime,!0)}function isExtensionFile(name){return name.endsWith(".ts")||name.endsWith(".js")}function resolveExtensionEntries2(dir){let packageJsonPath=path7.join(dir,"package.json");if(fs5.existsSync(packageJsonPath)){let manifest=readPiManifest(packageJsonPath);if(manifest?.extensions?.length){let entries=[];for(let extPath of manifest.extensions){let resolvedExtPath=path7.resolve(dir,extPath);fs5.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path7.join(dir,"index.ts"),indexJs=path7.join(dir,"index.js");return fs5.existsSync(indexTs)?[indexTs]:fs5.existsSync(indexJs)?[indexJs]:null}function discoverExtensionsInDir(dir){if(!fs5.existsSync(dir))return[];let discovered=[];try{let entries=fs5.readdirSync(dir,{withFileTypes:!0});for(let entry of entries){let entryPath=path7.join(dir,entry.name);if((entry.isFile()||entry.isSymbolicLink())&&isExtensionFile(entry.name)){discovered.push(entryPath);continue}if(entry.isDirectory()||entry.isSymbolicLink()){let entries2=resolveExtensionEntries2(entryPath);entries2&&discovered.push(...entries2)}}}catch{return[]}return discovered}async function discoverAndLoadExtensions(configuredPaths,cwd,agentDir=getAgentDir(),eventBus){let resolvedCwd=resolvePath(cwd),resolvedAgentDir=resolvePath(agentDir),allPaths=[],seen=new Set,addPaths=paths=>{for(let p of paths){let resolved=path7.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path7.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path7.join(resolvedAgentDir,"extensions");addPaths(discoverExtensionsInDir(globalExtDir));for(let p of configuredPaths){let resolved=resolvePath(p,resolvedCwd,{normalizeUnicodeSpaces:!0});if(fs5.existsSync(resolved)&&fs5.statSync(resolved).isDirectory()){let entries=resolveExtensionEntries2(resolved);if(entries){addPaths(entries);continue}addPaths(discoverExtensionsInDir(resolved));continue}addPaths([resolved])}return loadExtensions(allPaths,resolvedCwd,eventBus)}var ModelRegistry=class{constructor(runtime){this.runtime=runtime}getRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return[...this.runtime.getAvailableSnapshot()]}find(provider,modelId2){return this.runtime.getModel(provider,modelId2)}hasConfiguredAuth(model){return this.runtime.hasConfiguredAuth(model.provider)}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model);if(!resolution){let compatibility=this.runtime.getCompatibilityRequestConfig(model);return compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:compatibility.headers}}return{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{},env:resolution.env}}catch(error){let cause=error instanceof Error?error.cause:void 0,message=cause instanceof Error?cause.message:error instanceof Error?error.message:String(error);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.runtime.isUsingOAuth(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function truncateToVisualLines(text2,maxVisualLines,width,paddingX=0){if(!text2)return{visualLines:[],skippedCount:0};let allVisualLines=new Text(text2,paddingX,0).render(width);if(allVisualLines.length<=maxVisualLines)return{visualLines:allVisualLines,skippedCount:0};let truncatedLines=allVisualLines.slice(-maxVisualLines),skippedCount=allVisualLines.length-maxVisualLines;return{visualLines:truncatedLines,skippedCount}}import{constants as constants2}from"node:fs";import{access as fsAccess}from"node:fs/promises";import{constants as osConstants}from"node:os";import{spawn as spawn4}from"child_process";import*as os4 from"node:os";import{pathToFileURL as pathToFileURL2}from"node:url";function ansiRegex({onlyFirst=!1}={}){let pattern="(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";return new RegExp(pattern,onlyFirst?void 0:"g")}var regex=ansiRegex();function stripAnsi(value2){if(typeof value2!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof value2}\``);return!value2.includes("\x1B")&&!value2.includes("\x9B")?value2:value2.replace(regex,"")}function shortenPath2(path14){if(typeof path14!="string")return"";let home=os4.homedir();return path14.startsWith(home)?`~${path14.slice(home.length)}`:path14}function linkPath(styledText,rawPath,cwd){if(!getCapabilities().hyperlinks)return styledText;let absolutePath=resolvePath(rawPath,cwd);return hyperlink(styledText,pathToFileURL2(absolutePath).href)}function str(value2){return typeof value2=="string"?value2:value2==null?"":null}function replaceTabs(text2){return text2.replace(/\t/g," ")}function normalizeDisplayText(text2){return text2.replace(/\r/g,"")}function getTextOutput(result2,showImages){if(!result2)return"";let textBlocks=result2.content.filter(c=>c.type==="text"),imageBlocks=result2.content.filter(c=>c.type==="image"),output=textBlocks.map(c=>sanitizeBinaryOutput(stripAnsi(c.text||"")).replace(/\r/g,"")).join(`
|
|
1132
|
+
`)}}function printTimings(){if(ENABLED)for(let[namespace,timingNamespace]of timingNamespaces)printTimingGroup(`Startup Timings: ${namespace}`,timingNamespace.timings)}var require3=createRequire4(import.meta.url),isNodeSeaBinary="sea"in process.features&&process.features.sea===!0||process.getBuiltinModule("node:sea")?.isSea()===!0,isTypeScriptSourceRuntime=!isBunBinary&&path7.extname(fileURLToPath5(import.meta.url))===".ts",usesEmbeddedModules=isBunBinary||isNodeSeaBinary||isBundledNode,createJitiPromise;function getCreateJiti(){return createJitiPromise??=(usesEmbeddedModules?import("./jiti-static-loader-CLT3YR3B.js"):import("./jiti-loader-BFSSLU7G.js")).then(module=>module.createJiti),createJitiPromise}var virtualModulesPromise;function getVirtualModules(){return virtualModulesPromise??=import("./virtual-modules-NDGCHNG7.js").then(module=>module.VIRTUAL_MODULES),virtualModulesPromise}var _aliases=null;function getAliases(){if(_aliases)return _aliases;let __dirname2=path7.dirname(fileURLToPath5(import.meta.url)),packageIndex=path7.resolve(__dirname2,"../..","index.js"),typeboxEntry=require3.resolve("typebox"),typeboxCompileEntry=require3.resolve("typebox/compile"),typeboxValueEntry=require3.resolve("typebox/value"),resolveImport=specifier=>fileURLToPath5(import.meta.resolve(specifier)),piCodingAgentEntry=packageIndex,piAgentCoreEntry=resolveImport("@earendil-works/pi-agent-core"),piTuiEntry=resolveImport("@earendil-works/pi-tui"),piAiCompatEntry=resolveImport("@earendil-works/pi-ai/compat"),piAiOauthEntry=resolveImport("@earendil-works/pi-ai/oauth"),piAiProvidersEntry=resolveImport("@earendil-works/pi-ai/providers/all");return _aliases={"@earendil-works/pi-coding-agent":piCodingAgentEntry,[DISTRIBUTION_PACKAGE_NAME]:piCodingAgentEntry,"@earendil-works/pi-agent-core":piAgentCoreEntry,"@earendil-works/pi-tui":piTuiEntry,"@earendil-works/pi-ai/providers/all":piAiProvidersEntry,"@earendil-works/pi-ai/compat":piAiCompatEntry,"@earendil-works/pi-ai/oauth":piAiOauthEntry,"@earendil-works/pi-ai":piAiCompatEntry,"@mariozechner/pi-coding-agent":piCodingAgentEntry,"@mariozechner/pi-agent-core":piAgentCoreEntry,"@mariozechner/pi-tui":piTuiEntry,"@mariozechner/pi-ai/providers/all":piAiProvidersEntry,"@mariozechner/pi-ai/compat":piAiCompatEntry,"@mariozechner/pi-ai/oauth":piAiOauthEntry,"@mariozechner/pi-ai":piAiCompatEntry,typebox:typeboxEntry,"typebox/compile":typeboxCompileEntry,"typebox/value":typeboxValueEntry,"@sinclair/typebox":typeboxEntry,"@sinclair/typebox/compile":typeboxCompileEntry,"@sinclair/typebox/value":typeboxValueEntry},_aliases}var extensionCacheCwd,extensionCacheGeneration=0,extensionCache=new Map;function clearExtensionCache(){extensionCache.clear(),extensionCacheCwd=void 0,extensionCacheGeneration++}function useExtensionCacheCwd(cwd){let resolvedCwd=resolvePath(cwd);return extensionCacheCwd!==void 0&&extensionCacheCwd!==resolvedCwd&&clearExtensionCache(),extensionCacheCwd=resolvedCwd,{cwd:resolvedCwd,generation:extensionCacheGeneration}}function createExtensionRuntime(){let notInitialized=()=>{throw new Error("Extension runtime not initialized. Action methods cannot be called during extension loading.")},state2={},eventBusUnsubscribers=new Set,runtime={sendMessage:notInitialized,sendUserMessage:notInitialized,appendEntry:notInitialized,setSessionName:notInitialized,getSessionName:notInitialized,setLabel:notInitialized,getActiveTools:notInitialized,getAllTools:notInitialized,setActiveTools:notInitialized,refreshTools:()=>{},getCommands:notInitialized,setModel:()=>Promise.reject(new Error("Extension runtime not initialized")),getThinkingLevel:notInitialized,setThinkingLevel:notInitialized,flagValues:new Map,pendingProviderRegistrations:[],pendingNativeProviderRegistrations:[],assertActive:()=>{if(state2.staleMessage)throw new Error(state2.staleMessage)},invalidate:message=>{if(!state2.staleMessage){state2.staleMessage=message??STALE_EXTENSION_CONTEXT_MESSAGE;for(let unsubscribe of eventBusUnsubscribers)unsubscribe();eventBusUnsubscribers.clear()}},trackEventBusSubscription:unsubscribe=>{let active=!0,trackedUnsubscribe=()=>{active&&(active=!1,eventBusUnsubscribers.delete(trackedUnsubscribe),unsubscribe())};return eventBusUnsubscribers.add(trackedUnsubscribe),trackedUnsubscribe},registerProvider:(name,config,extensionPath="<unknown>")=>{runtime.pendingProviderRegistrations.push({name,config,extensionPath})},registerNativeProvider:(provider,extensionPath="<unknown>")=>{runtime.pendingNativeProviderRegistrations.push({provider,extensionPath})},unregisterProvider:name=>{runtime.pendingProviderRegistrations=runtime.pendingProviderRegistrations.filter(r=>r.name!==name),runtime.pendingNativeProviderRegistrations=runtime.pendingNativeProviderRegistrations.filter(r=>r.provider.id!==name)}};return runtime}function createExtensionAPI(extension,runtime,cwd,eventBus){let pendingFlagValues=new Map,pendingRuntimeChanges=[],loadingUnsubscribers=[],state2="loading",assertActive=()=>{if(state2==="failed")throw new Error(`Extension "${extension.path}" failed to load and its API is no longer active.`);runtime.assertActive()},applyRuntimeChange=change=>{state2==="loading"?pendingRuntimeChanges.push(change):change()},clearPending=()=>{pendingFlagValues.clear(),pendingRuntimeChanges.length=0,loadingUnsubscribers.length=0};return{api:{on(event,handler){assertActive();let registeredHandler=(...args)=>handler(...args),list2=extension.handlers.get(event)??[];return list2.push(registeredHandler),extension.handlers.set(event,list2),()=>{let handlers=extension.handlers.get(event);if(!handlers)return;let handlerIndex=handlers.indexOf(registeredHandler);handlerIndex!==-1&&(handlers.splice(handlerIndex,1),handlers.length===0&&extension.handlers.delete(event))}},registerTool(tool){if(assertActive(),typeof tool.parameters!="object"||tool.parameters===null||Array.isArray(tool.parameters))throw new Error(`Tool "${tool.name}" registered by extension "${extension.path}" must define an object parameter schema.`);extension.tools.set(tool.name,{definition:tool,sourceInfo:extension.sourceInfo}),runtime.refreshTools()},registerCommand(name,options){assertActive(),extension.commands.set(name,{name,sourceInfo:extension.sourceInfo,...options})},registerShortcut(shortcut,options){assertActive(),extension.shortcuts.set(shortcut,{shortcut,extensionPath:extension.path,...options})},registerFlag(name,options){if(assertActive(),options.default!==void 0&&typeof options.default!==options.type)throw new Error(`Invalid default for flag "${name}": expected ${options.type}, got ${typeof options.default}`);extension.flags.set(name,{name,extensionPath:extension.path,...options}),options.default!==void 0&&!runtime.flagValues.has(name)&&(state2==="loading"?pendingFlagValues.has(name)||pendingFlagValues.set(name,options.default):runtime.flagValues.set(name,options.default))},registerMessageRenderer(customType,renderer){assertActive(),extension.messageRenderers.set(customType,renderer)},registerMarkdownTransformer(transformer){assertActive(),extension.markdownTransformer=transformer},registerEntryRenderer(customType,renderer){assertActive(),extension.entryRenderers??=new Map,extension.entryRenderers.set(customType,renderer)},getFlag(name){if(assertActive(),!!extension.flags.has(name))return runtime.flagValues.has(name)?runtime.flagValues.get(name):pendingFlagValues.get(name)},sendMessage(message,options){assertActive(),runtime.sendMessage(message,options)},sendUserMessage(content,options){assertActive(),runtime.sendUserMessage(content,options)},appendEntry(customType,data){assertActive(),runtime.appendEntry(customType,data)},setSessionName(name){assertActive(),runtime.setSessionName(name)},getSessionName(){return assertActive(),runtime.getSessionName()},setLabel(entryId,label){assertActive(),runtime.setLabel(entryId,label)},exec(command,args,options){return assertActive(),execCommand(command,args,options?.cwd??cwd,options)},getActiveTools(){return assertActive(),runtime.getActiveTools()},getAllTools(){return assertActive(),runtime.getAllTools()},setActiveTools(toolNames){assertActive(),runtime.setActiveTools(toolNames)},getCommands(){return assertActive(),runtime.getCommands()},setModel(model){return assertActive(),runtime.setModel(model)},getThinkingLevel(){return assertActive(),runtime.getThinkingLevel()},setThinkingLevel(level){assertActive(),runtime.setThinkingLevel(level)},registerProvider(providerOrName,config){if(assertActive(),typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");applyRuntimeChange(()=>runtime.registerProvider(providerOrName,config,extension.path));return}applyRuntimeChange(()=>runtime.registerNativeProvider(providerOrName,extension.path))},unregisterProvider(name){assertActive(),applyRuntimeChange(()=>runtime.unregisterProvider(name,extension.path))},events:{emit(channel,data){assertActive(),eventBus.emit(channel,data)},on(channel,handler){assertActive();let unsubscribe=runtime.trackEventBusSubscription(eventBus.on(channel,handler));return state2==="loading"&&loadingUnsubscribers.push(unsubscribe),unsubscribe}}},commit:()=>{if(state2==="loading"){runtime.assertActive();for(let[name,value2]of pendingFlagValues)runtime.flagValues.has(name)||runtime.flagValues.set(name,value2);for(let apply of pendingRuntimeChanges)apply();state2="active",clearPending()}},discard:()=>{if(state2==="loading"){state2="failed";for(let unsubscribe of loadingUnsubscribers)unsubscribe();clearPending()}}}}function isCurrentCacheToken(cacheToken){return cacheToken!==void 0&&extensionCacheCwd===cacheToken.cwd&&extensionCacheGeneration===cacheToken.generation}async function loadExtensionModule(extensionPath,cacheToken){if(isCurrentCacheToken(cacheToken)){let cachedFactory=extensionCache.get(extensionPath);if(cachedFactory)return cachedFactory}let createJitiImpl=await getCreateJiti(),resolutionOptions=usesEmbeddedModules?{virtualModules:await getVirtualModules(),tryNative:!1}:isTypeScriptSourceRuntime?{virtualModules:await getVirtualModules(),tsconfigPaths:!0}:{alias:getAliases()},factory=await createJitiImpl(import.meta.url,{moduleCache:!1,...resolutionOptions}).import(extensionPath,{default:!0});if(typeof factory=="function")return isCurrentCacheToken(cacheToken)&&extensionCache.set(extensionPath,factory),factory}function createExtension(extensionPath,resolvedPath){let source=extensionPath.startsWith("<")&&extensionPath.endsWith(">")?extensionPath.slice(1,-1).split(":")[0]||"temporary":"local",baseDir=extensionPath.startsWith("<")?void 0:path7.dirname(resolvedPath);return{path:extensionPath,resolvedPath,sourceInfo:createSyntheticSourceInfo(extensionPath,{source,baseDir}),handlers:new Map,tools:new Map,messageRenderers:new Map,entryRenderers:new Map,commands:new Map,flags:new Map,shortcuts:new Map}}async function initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime){let extension=createExtension(extensionPath,resolvedPath),load=createExtensionAPI(extension,runtime,cwd,eventBus);try{await factory(load.api),load.commit()}catch(error){throw load.discard(),error}return time(`${extensionPath} factory`,"extensions"),extension}async function loadExtension(extensionPath,cwd,eventBus,runtime,cacheToken){let resolvedPath=resolvePath(extensionPath,cwd,{normalizeUnicodeSpaces:!0});try{let factory=await loadExtensionModule(resolvedPath,cacheToken);return time(`${extensionPath} module import`,"extensions"),factory?{extension:await initializeExtension(factory,extensionPath,resolvedPath,cwd,eventBus,runtime),error:null}:{extension:null,error:`Extension does not export a valid factory function: ${extensionPath}`}}catch(err2){return{extension:null,error:`Failed to load extension: ${err2 instanceof Error?err2.message:String(err2)}`}}}async function loadExtensionFromFactory(factory,cwd,eventBus,runtime,extensionPath="<inline>"){let resolvedCwd=resolvePath(cwd);return initializeExtension(factory,extensionPath,extensionPath,resolvedCwd,eventBus,runtime)}async function loadExtensionsInternal(paths,cwd,eventBus,runtime,useCache=!1){let extensions=[],errors=[],cacheToken=useCache?useExtensionCacheCwd(cwd):void 0,resolvedCwd=cacheToken?.cwd??resolvePath(cwd),resolvedEventBus=eventBus??createEventBus(),resolvedRuntime=runtime??createExtensionRuntime();for(let extPath of paths){let{extension,error}=await loadExtension(extPath,resolvedCwd,resolvedEventBus,resolvedRuntime,cacheToken);if(error){errors.push({path:extPath,error});continue}extension&&extensions.push(extension)}return{extensions,errors,runtime:resolvedRuntime}}async function loadExtensions(paths,cwd,eventBus,runtime){return loadExtensionsInternal(paths,cwd,eventBus,runtime)}async function loadExtensionsCached(paths,cwd,eventBus,runtime){return loadExtensionsInternal(paths,cwd,eventBus,runtime,!0)}function isExtensionFile(name){return name.endsWith(".ts")||name.endsWith(".js")}function resolveExtensionEntries2(dir){let packageJsonPath=path7.join(dir,"package.json");if(fs5.existsSync(packageJsonPath)){let manifest=readPiManifest(packageJsonPath);if(manifest?.extensions?.length){let entries=[];for(let extPath of manifest.extensions){let resolvedExtPath=path7.resolve(dir,extPath);fs5.existsSync(resolvedExtPath)&&entries.push(resolvedExtPath)}if(entries.length>0)return entries}}let indexTs=path7.join(dir,"index.ts"),indexJs=path7.join(dir,"index.js");return fs5.existsSync(indexTs)?[indexTs]:fs5.existsSync(indexJs)?[indexJs]:null}function discoverExtensionsInDir(dir){if(!fs5.existsSync(dir))return[];let discovered=[];try{let entries=fs5.readdirSync(dir,{withFileTypes:!0});for(let entry of entries){let entryPath=path7.join(dir,entry.name);if((entry.isFile()||entry.isSymbolicLink())&&isExtensionFile(entry.name)){discovered.push(entryPath);continue}if(entry.isDirectory()||entry.isSymbolicLink()){let entries2=resolveExtensionEntries2(entryPath);entries2&&discovered.push(...entries2)}}}catch{return[]}return discovered}async function discoverAndLoadExtensions(configuredPaths,cwd,agentDir=getAgentDir(),eventBus){let resolvedCwd=resolvePath(cwd),resolvedAgentDir=resolvePath(agentDir),allPaths=[],seen=new Set,addPaths=paths=>{for(let p of paths){let resolved=path7.resolve(p);seen.has(resolved)||(seen.add(resolved),allPaths.push(p))}},localExtDir=path7.join(resolvedCwd,CONFIG_DIR_NAME,"extensions");addPaths(discoverExtensionsInDir(localExtDir));let globalExtDir=path7.join(resolvedAgentDir,"extensions");addPaths(discoverExtensionsInDir(globalExtDir));for(let p of configuredPaths){let resolved=resolvePath(p,resolvedCwd,{normalizeUnicodeSpaces:!0});if(fs5.existsSync(resolved)&&fs5.statSync(resolved).isDirectory()){let entries=resolveExtensionEntries2(resolved);if(entries){addPaths(entries);continue}addPaths(discoverExtensionsInDir(resolved));continue}addPaths([resolved])}return loadExtensions(allPaths,resolvedCwd,eventBus)}var ModelRegistry=class{constructor(runtime){this.runtime=runtime}getRuntime(){return this.runtime}refresh(options){return this.runtime.refresh(options)}getError(){return this.runtime.getError()}getAll(){return[...this.runtime.getModels()]}getAvailable(){return[...this.runtime.getAvailableSnapshot()]}find(provider,modelId2){return this.runtime.getModel(provider,modelId2)}hasConfiguredAuth(model){return this.runtime.hasConfiguredAuth(model.provider)}async getApiKeyAndHeaders(model){try{let resolution=await this.runtime.getAuth(model);if(!resolution){let compatibility=this.runtime.getCompatibilityRequestConfig(model);return compatibility.authHeader?{ok:!1,error:`No API key found for "${model.provider}"`}:{ok:!0,headers:compatibility.headers}}return{ok:!0,apiKey:resolution.auth.apiKey,headers:resolution.auth.headers,...resolution.auth.baseUrl?{baseUrl:resolution.auth.baseUrl}:{},env:resolution.env}}catch(error){let cause=error instanceof Error?error.cause:void 0,message=cause instanceof Error?cause.message:error instanceof Error?error.message:String(error);return{ok:!1,error:message==="authHeader requires a resolved API key"?`No API key found for "${model.provider}"`:message}}}getProviderAuthStatus(provider){return this.runtime.getProviderAuthStatus(provider)}getProvider(provider){return this.runtime.getProvider(provider)}stream(model,context,options){return this.runtime.stream(model,context,options)}streamSimple(model,context,options){return this.runtime.streamSimple(model,context,options)}complete(model,context,options){return this.runtime.complete(model,context,options)}getProviderDisplayName(provider){return this.runtime.getProvider(provider)?.name??provider}getProviderAuth(provider){return this.runtime.getAuth(provider)}async getApiKeyForProvider(provider){try{return(await this.runtime.getAuth(provider))?.auth.apiKey}catch{return}}isUsingOAuth(model){return this.runtime.isUsingOAuth(model.provider)}registerProvider(providerOrName,config){if(typeof providerOrName=="string"){if(!config)throw new Error("Provider config is required when registering by name");this.runtime.registerProvider(providerOrName,config);return}this.runtime.registerNativeProvider(providerOrName)}unregisterProvider(providerName){this.runtime.unregisterProvider(providerName)}getRegisteredProviderConfig(providerName){return this.runtime.getRegisteredProviderConfig(providerName)}getRegisteredNativeProvider(providerName){return this.runtime.getRegisteredNativeProvider(providerName)}getRegisteredProviderIds(){return this.runtime.getRegisteredProviderIds()}};function truncateToVisualLines(text2,maxVisualLines,width,paddingX=0){if(!text2)return{visualLines:[],skippedCount:0};let allVisualLines=new Text(text2,paddingX,0).render(width);if(allVisualLines.length<=maxVisualLines)return{visualLines:allVisualLines,skippedCount:0};let truncatedLines=allVisualLines.slice(-maxVisualLines),skippedCount=allVisualLines.length-maxVisualLines;return{visualLines:truncatedLines,skippedCount}}import{constants as constants2}from"node:fs";import{access as fsAccess}from"node:fs/promises";import{constants as osConstants}from"node:os";import{spawn as spawn4}from"child_process";import*as os4 from"node:os";import{pathToFileURL as pathToFileURL2}from"node:url";function ansiRegex({onlyFirst=!1}={}){let pattern="(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";return new RegExp(pattern,onlyFirst?void 0:"g")}var regex=ansiRegex();function stripAnsi(value2){if(typeof value2!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof value2}\``);return!value2.includes("\x1B")&&!value2.includes("\x9B")?value2:value2.replace(regex,"")}function shortenPath2(path14){if(typeof path14!="string")return"";let home=os4.homedir();return path14.startsWith(home)?`~${path14.slice(home.length)}`:path14}function linkPath(styledText,rawPath,cwd){if(!getCapabilities().hyperlinks)return styledText;let absolutePath=resolvePath(rawPath,cwd);return hyperlink(styledText,pathToFileURL2(absolutePath).href)}function str(value2){return typeof value2=="string"?value2:value2==null?"":null}function replaceTabs(text2){return text2.replace(/\t/g," ")}function normalizeDisplayText(text2){return text2.replace(/\r/g,"")}function getTextOutput(result2,showImages){if(!result2)return"";let textBlocks=result2.content.filter(c=>c.type==="text"),imageBlocks=result2.content.filter(c=>c.type==="image"),output=textBlocks.map(c=>sanitizeBinaryOutput(stripAnsi(c.text||"")).replace(/\r/g,"")).join(`
|
|
1124
1133
|
`),caps=getCapabilities();if(imageBlocks.length>0&&(!caps.images||!showImages)){let imageIndicators=imageBlocks.map(img=>{let mimeType=img.mimeType??"image/unknown",dims=img.data&&img.mimeType?getImageDimensions(img.data,img.mimeType)??void 0:void 0;return imageFallback(mimeType,dims)}).join(`
|
|
1125
1134
|
`);output=output?`${output}
|
|
1126
1135
|
${imageIndicators}`:imageIndicators}return output}function invalidArgText(theme2){return theme2.fg("error","[invalid arg]")}function renderToolPath(rawPath,theme2,cwd,options){if(rawPath===null)return invalidArgText(theme2);let value2=rawPath||options?.emptyFallback;return value2?linkPath(theme2.fg("accent",shortenPath2(value2)),value2,cwd):theme2.fg("toolOutput","...")}function collapsedLinesHint(theme2,hidden,direction,options){let totalSuffix=options?.total!==void 0?`, ${options.total} total`:"",noun=hidden===1?"line":"lines";return theme2.fg("muted",`\u2026 (${hidden} ${direction} ${noun}${totalSuffix},`)+` ${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`}var BASH_PREVIEW_LINES=5,BASH_UPDATE_THROTTLE_MS=100,BashCallRenderComponent=class{constructor(config){this.command="",this.expanded=!1,this.config=config}update(args,expanded){let command=str(args?.command),timeout=args?.timeout;this.command===command&&this.timeout===timeout&&this.expanded===expanded||(this.command=command,this.timeout=timeout,this.expanded=expanded,this.invalidate())}render(width){return(this.cachedLines===void 0||this.cachedWidth!==width)&&(this.cachedLines=this.renderLines(Math.max(1,width)),this.cachedWidth=width),this.cachedLines}invalidate(){this.cachedWidth=void 0,this.cachedLines=void 0}renderLines(width){let fullCall=formatFullShellCall(this.command,this.timeout,this.config),fullLines=new Text(fullCall,0,0).render(width);return this.expanded||fullLines.length<=1?fullLines:[formatTruncatedShellCall(this.command,this.timeout,width,this.config)]}},BashResultRenderComponent=class extends Container{constructor(){super(...arguments),this.state={cachedWidth:void 0,cachedLines:void 0,cachedSkipped:void 0}}};function formatShellPrompt(prompt){return theme.fg("toolTitle",theme.bold(`${prompt} `))}function formatShellTimeout(timeout){return timeout?theme.fg("muted",` (timeout ${timeout}s)`):""}function styleShellCommand(command,config){let language=config.name==="powershell"?"powershell":"bash";return highlightCode(command,language).join(`
|
|
@@ -1243,7 +1252,7 @@ ${getProviderLoginHelp()}
|
|
|
1243
1252
|
|
|
1244
1253
|
Then use /model to select a model.`}function formatNoApiKeyFoundMessage(provider){return`No API key found for ${provider===UNKNOWN_PROVIDER?"the selected model":provider}.
|
|
1245
1254
|
|
|
1246
|
-
${getProviderLoginHelp()}`}import{appendFileSync as appendFileSync4,mkdirSync as mkdirSync7}from"node:fs";import{dirname as dirname14}from"node:path";function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage){totals.input+=usage.input,totals.output+=usage.output,totals.cacheRead+=usage.cacheRead,totals.cacheWrite+=usage.cacheWrite,totals.cost+=usage.cost.total}var BACKGROUND_USAGE_TYPE="background-usage";function
|
|
1255
|
+
${getProviderLoginHelp()}`}import{appendFileSync as appendFileSync4,mkdirSync as mkdirSync7}from"node:fs";import{dirname as dirname14}from"node:path";function createUsageTotals(){return{input:0,output:0,cacheRead:0,cacheWrite:0,cost:0}}function addUsageToTotals(totals,usage){totals.input+=usage.input,totals.output+=usage.output,totals.cacheRead+=usage.cacheRead,totals.cacheWrite+=usage.cacheWrite,totals.cost+=usage.cost.total}var BACKGROUND_USAGE_TYPE="background-usage";function isRecord4(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function isUsageValue(value2){return typeof value2=="number"&&Number.isFinite(value2)&&value2>=0}function getBackgroundUsageRecord(entry){if(entry.type!=="custom"||entry.customType!==BACKGROUND_USAGE_TYPE)return;let data=entry.data;if(!isRecord4(data)||data.version!==1||typeof data.taskId!="string"||!data.taskId.trim())return;let usage=data.usage;if(!isRecord4(usage)||!isRecord4(usage.cost))return;let{input:input2,output,cacheRead,cacheWrite,totalTokens,reasoning,cacheWrite1h}=usage,cost=usage.cost;if(!(!isUsageValue(input2)||!isUsageValue(output)||!isUsageValue(cacheRead)||!isUsageValue(cacheWrite)||!isUsageValue(totalTokens)||!isUsageValue(cost.input)||!isUsageValue(cost.output)||!isUsageValue(cost.cacheRead)||!isUsageValue(cost.cacheWrite)||!isUsageValue(cost.total)||reasoning!==void 0&&!isUsageValue(reasoning)||cacheWrite1h!==void 0&&!isUsageValue(cacheWrite1h)))return{version:1,taskId:data.taskId,usage:{input:input2,output,cacheRead,cacheWrite,totalTokens,...reasoning===void 0?{}:{reasoning},...cacheWrite1h===void 0?{}:{cacheWrite1h},cost:{input:cost.input,output:cost.output,cacheRead:cost.cacheRead,cacheWrite:cost.cacheWrite,total:cost.total}}}}function*accountedUsageEntries(entries){let backgroundTasks=new Set;for(let entry of entries)if(entry.type==="message"&&entry.message.role==="assistant")yield{key:`${entry.message.provider}/${entry.message.responseModel??entry.message.model}`,usage:entry.message.usage};else if(entry.type==="usage")yield{key:`${entry.provider}/${entry.model}`,usage:entry.usage};else if(entry.type==="message"&&entry.message.role==="toolResult"&&entry.message.usage)yield{key:"Tools/summaries",usage:entry.message.usage};else if((entry.type==="branch_summary"||entry.type==="compaction")&&entry.usage)yield{key:"Tools/summaries",usage:entry.usage};else{let record=getBackgroundUsageRecord(entry);if(!record||backgroundTasks.has(record.taskId))continue;backgroundTasks.add(record.taskId),yield{key:"Tools/summaries",usage:record.usage}}}function getAccountedUsages(entries){return Array.from(accountedUsageEntries(entries),({usage})=>usage)}function getUsageCostBreakdown(entries){let totalsByKey=new Map;for(let{key,usage}of accountedUsageEntries(entries)){let totals=totalsByKey.get(key);totals||(totals=createUsageTotals(),totalsByKey.set(key,totals)),addUsageToTotals(totals,usage)}return Array.from(totalsByKey,([key,totals])=>({key,cost:totals.cost,tokens:totals.input+totals.output+totals.cacheRead+totals.cacheWrite})).filter(entry=>entry.cost>0||entry.tokens>0).sort((a,b2)=>b2.cost-a.cost)}var BackgroundSession=class{constructor(options){this.enabled=!1,this.disposed=!1,this.generation=0,this.pauses=0,this.failures=new Set,this.quarantine=[],this.options=options,this._service=this.createService()}get service(){return this._service}get quarantinedSettlements(){return structuredClone(this.quarantine)}setEnabled(enabled){this.enabled=enabled&&this.options.role==="main",this.service.setEnabled(this.enabled)}replaceService(){this.service.close(),this._service=this.createService(),this.failures.clear()}createService(){let{manager,role}=this.options,generation=++this.generation,sessionId=manager.getSessionId(),sessionFile=manager.getSessionFile(),service=new BackgroundService({enabled:this.enabled,role,anchor:()=>manager.getLeafId(),onCleanupError:message=>this.warn("background_cleanup",message),onSettled:(task,usage)=>{let onBranch=manager.getSessionId()===sessionId&&(task.anchorId===null||manager.getBranch().some(entry=>entry.id===task.anchorId));if(this.disposed||this.service!==service||!onBranch){this.quarantineSettlement({sessionId,generation,task,usage},sessionFile);return}this.persistSettlement(task,usage)}});return this.restoreHistory(service),service.subscribe(()=>this.schedule()),service}restoreHistory(service=this.service){service.restoreHistory(this.options.manager.getBranch().flatMap(entry=>entry.type==="custom"&&entry.customType==="background-task-result"?[entry.data]:[]))}quarantineSettlement(record,sessionFile){this.quarantine.push(structuredClone(record)),this.quarantine.length>32&&this.quarantine.shift();let persistence="Not persisted: only the latest 32 snapshots are retained in quarantinedBackgroundSettlements; late usage is not accounted in session totals.";if(sessionFile)try{mkdirSync7(dirname14(sessionFile),{recursive:!0}),appendFileSync4(`${sessionFile}.background-late.jsonl`,`${JSON.stringify({version:1,...record})}
|
|
1247
1256
|
`),persistence=`Saved diagnostic sidecar: ${sessionFile}.background-late.jsonl (not included in normal session totals).`}catch{persistence=`Sidecar write failed. ${persistence}`}this.warn("background_settlement_quarantined",`Late background settlement ${record.task.id} was quarantined. ${persistence}`)}persistSettlement(task,usage){let manager=this.options.manager,appended=[],append=(customType,data)=>{let entry=manager.getEntry(manager.appendCustomEntry(customType,data));entry&&appended.push(entry)};try{usage&&!manager.getEntries().some(entry=>getBackgroundUsageRecord(entry)?.taskId===task.id)&&append(BACKGROUND_USAGE_TYPE,{version:1,taskId:task.id,usage}),append("background-task-result",JSON.parse(JSON.stringify({version:BACKGROUND_HISTORY_VERSION,task})))}finally{for(let entry of appended)try{this.options.onEntry(entry)}catch{}}}warn(event,message){try{this.options.onError(event,truncateHead(message,{maxBytes:4096,maxLines:32}).content)}catch{}}pause(){this.pauses++;let releaseService=this.service.pause(),released=!1;return()=>{released||(released=!0,this.pauses--,releaseService(),this.schedule())}}retry(){this.failures.clear(),this.schedule()}schedule(){this.disposed||this.timer||this.delivery||(this.timer=setTimeout(()=>{this.timer=void 0,this.drain().catch(()=>this.warn("background_delivery","Background notification drain failed; delivery was not confirmed."))},0),this.timer.unref?.())}canDeliver(service){return!this.disposed&&service===this.service&&service.enabled&&this.pauses===0&&this.options.canDeliver()}async drain(){let service=this.service;if(this.delivery||!this.canDeliver(service))return;if(this.failures.size){let retained=new Set(service.list().map(task2=>task2.id));for(let id of this.failures)retained.has(id)||this.failures.delete(id)}let task=service.pendingNotifications().find(task2=>!this.failures.has(task2.id));if(!task||!service.claimNotification(task.id))return;let delivery={id:task.id,service,persisted:!1};this.delivery=delivery;let deliveryError;try{await this.options.deliver(backgroundCompletionMessage(task))}catch(error){deliveryError=error}finally{if(!delivery.persisted){service.releaseNotification(task.id),service===this.service&&this.failures.add(task.id);let reason=deliveryError instanceof Error?`: ${deliveryError.message}`:"";this.warn("background_delivery",`Background completion delivery failed for ${task.id}${reason}; it will retry on the next prompt.`)}this.delivery=void 0;let current=this.service;this.canDeliver(current)&¤t.pendingNotifications().some(task2=>!this.failures.has(task2.id))&&this.schedule()}}messageAcknowledgement(message){if(message.role!=="custom"||message.customType!=="background-completion")return;let details=message.details,delivery=this.delivery;if(!(!delivery||details?.taskId!==delivery.id))return()=>{delivery.persisted||(delivery.persisted=!0,delivery.service.markDelivered(delivery.id))}}acknowledgeWaitResult(details){if(!details||typeof details!="object"||!("backgroundTaskId"in details))return;let id=details.backgroundTaskId;typeof id=="string"&&this.service.list().some(task=>task.id===id&&task.mode==="background"&&isBackgroundTerminal(task.status))&&this.service.markDelivered(id)}dispose(){this.disposed=!0,this.service.close(),this.timer&&clearTimeout(this.timer),this.timer=void 0}};import{randomBytes as randomBytes2}from"node:crypto";import{createWriteStream as createWriteStream3}from"node:fs";import{tmpdir as tmpdir3}from"node:os";import{join as join23}from"node:path";async function executeBashWithOperations(command,cwd,operations,options){let outputChunks=[],outputBytes=0,maxOutputBytes=51200*2,tempFilePath,tempFileStream,totalBytes=0,ensureTempFile=()=>{if(tempFilePath)return;let id=randomBytes2(8).toString("hex");tempFilePath=join23(tmpdir3(),`pi-bash-${id}.log`),tempFileStream=createWriteStream3(tempFilePath);for(let chunk of outputChunks)tempFileStream.write(chunk)},decoder=new TextDecoder,onData=data=>{totalBytes+=data.length;let text2=sanitizeBinaryOutput(stripAnsi(decoder.decode(data,{stream:!0}))).replace(/\r/g,"");for(totalBytes>51200&&ensureTempFile(),tempFileStream&&tempFileStream.write(text2),outputChunks.push(text2),outputBytes+=text2.length;outputBytes>maxOutputBytes&&outputChunks.length>1;){let removed=outputChunks.shift();outputBytes-=removed.length}options?.onChunk&&options.onChunk(text2)};try{let result2=await operations.exec(command,cwd,{onData,signal:options?.signal}),fullOutput=outputChunks.join(""),truncationResult=truncateTail(fullOutput);truncationResult.truncated&&ensureTempFile(),tempFileStream&&tempFileStream.end();let cancelled=options?.signal?.aborted??!1;return{output:truncationResult.truncated?truncationResult.content:fullOutput,exitCode:cancelled?void 0:result2.exitCode??void 0,cancelled,truncated:truncationResult.truncated,fullOutputPath:tempFilePath}}catch(err2){if(options?.signal?.aborted){let fullOutput=outputChunks.join(""),truncationResult=truncateTail(fullOutput);return truncationResult.truncated&&ensureTempFile(),tempFileStream&&tempFileStream.end(),{output:truncationResult.truncated?truncationResult.content:fullOutput,exitCode:void 0,cancelled:!0,truncated:truncationResult.truncated,fullOutputPath:tempFilePath}}throw tempFileStream&&tempFileStream.end(),err2}}import*as os5 from"node:os";import{writeFile}from"node:fs/promises";import{crc32,deflateRawSync}from"node:zlib";function dosDateTime(date){return{time:date.getHours()<<11|date.getMinutes()<<5|date.getSeconds()>>1,day:Math.max(1980,date.getFullYear())-1980<<9|date.getMonth()+1<<5|date.getDate()}}function createZipArchive(entries){let files=[],directory=[],{time:time2,day}=dosDateTime(new Date),offset=0;for(let entry of entries){let name=Buffer.from(entry.name),data=(typeof entry.data=="string",Buffer.from(entry.data)),compressed=deflateRawSync(data),checksum=crc32(data),local=Buffer.alloc(30);local.writeUInt32LE(67324752,0),local.writeUInt16LE(20,4),local.writeUInt16LE(2048,6),local.writeUInt16LE(8,8),local.writeUInt16LE(time2,10),local.writeUInt16LE(day,12),local.writeUInt32LE(checksum,14),local.writeUInt32LE(compressed.length,18),local.writeUInt32LE(data.length,22),local.writeUInt16LE(name.length,26);let central=Buffer.alloc(46);central.writeUInt32LE(33639248,0),central.writeUInt16LE(20,4),central.writeUInt16LE(20,6),central.writeUInt16LE(2048,8),central.writeUInt16LE(8,10),central.writeUInt16LE(time2,12),central.writeUInt16LE(day,14),central.writeUInt32LE(checksum,16),central.writeUInt32LE(compressed.length,20),central.writeUInt32LE(data.length,24),central.writeUInt16LE(name.length,28),central.writeUInt32LE(offset,42),files.push(local,name,compressed),directory.push(central,name),offset+=local.length+name.length+compressed.length}let centralDirectory=Buffer.concat(directory),end=Buffer.alloc(22);return end.writeUInt32LE(101010256,0),end.writeUInt16LE(entries.length,8),end.writeUInt16LE(entries.length,10),end.writeUInt32LE(centralDirectory.length,12),end.writeUInt32LE(offset,16),Buffer.concat([...files,centralDirectory,end])}function writeZipArchive(filePath,entries){return writeFile(filePath,createZipArchive(entries))}var BUG_REPORT_CUSTOM_ENTRY_TYPE="pi.bug-report",BUG_REPORT_SCHEMA_VERSION=1,REDACTED="<redacted>",SENSITIVE_KEY=/(?:^|[-_])(api[-_]?key|secret|token|password|passwd|credential|authorization|cookie)(?:$|[-_])/i;function isSensitiveKey(key){return SENSITIVE_KEY.test(key.replace(/([a-z0-9])([A-Z])/g,"$1_$2"))}function redactUrl(value2){let nested=/^([a-z][a-z0-9+.-]*:)([a-z][a-z0-9+.-]*:\/\/.*)$/i.exec(value2);if(nested)return`${nested[1]}${redactUrl(nested[2])}`;try{let url=new URL(value2),changed=!1;(url.username||url.password)&&(url.username="",url.password="",changed=!0);for(let key of url.searchParams.keys())isSensitiveKey(key)&&(url.searchParams.set(key,REDACTED),changed=!0);return changed?url.toString():value2}catch{return value2}}function redactJsonValue(value2){if(value2!==void 0)return JSON.parse(JSON.stringify(value2,(key,child)=>child!=null&&isSensitiveKey(key)?REDACTED:typeof child=="string"?redactUrl(child):child))}function redactSettings(settings2){let{trackingId:_trackingId,...rest}=settings2;return redactJsonValue(rest)}function collectEnvironment(){let env2=name=>process.env[name]||null;return{version:VERSION,userAgent:getPiUserAgent(VERSION),runtime:process.versions.bun?`bun/${process.versions.bun}`:`node/${process.version}`,platform:process.platform,arch:process.arch,osRelease:os5.release(),osVersion:os5.version(),shell:process.env.SHELL?.split(/[\\/]/).pop()||null,terminal:{term:env2("TERM"),program:env2("TERM_PROGRAM"),programVersion:env2("TERM_PROGRAM_VERSION"),colorterm:env2("COLORTERM"),tmux:!!process.env.TMUX,ssh:!!(process.env.SSH_CONNECTION||process.env.SSH_CLIENT||process.env.SSH_TTY),ci:!!process.env.CI},piEnvironmentVariables:Object.keys(process.env).filter(name=>name.startsWith("PI_")).sort()}}function describeModel(model){return{provider:model.provider,id:model.id,name:model.name,api:model.api,baseUrl:redactUrl(model.baseUrl),reasoning:model.reasoning,input:model.input,contextWindow:model.contextWindow,maxTokens:model.maxTokens,samplingParams:model.samplingParams?redactJsonValue(model.samplingParams):null,compat:model.compat?redactJsonValue(model.compat):null,thinkingLevelMap:model.thinkingLevelMap??null,headerNames:Object.keys(model.headers??{}).sort()}}function describeProvider(modelRuntime,provider){let authTypes=[];return provider.auth.apiKey&&authTypes.push("api_key"),provider.auth.oauth&&authTypes.push("oauth"),{id:provider.id,name:provider.name,baseUrl:provider.baseUrl?redactUrl(provider.baseUrl):null,headerNames:Object.keys(provider.headers??{}).sort(),authTypes,authStatus:modelRuntime.getProviderAuthStatus(provider.id),usingOAuth:modelRuntime.isUsingOAuth(provider.id),registeredByExtension:modelRuntime.getRegisteredProviderIds().includes(provider.id)}}function describeExtension(extension){return{path:extension.path,source:redactUrl(extension.sourceInfo.source),scope:extension.sourceInfo.scope,origin:extension.sourceInfo.origin,hidden:extension.hidden===!0}}function collectBugReportMetadata(options){let hint2=options.hint?.trim()||null,provider=options.model?options.modelRuntime.getProvider(options.model.provider):void 0;return{schemaVersion:BUG_REPORT_SCHEMA_VERSION,id:options.id??uuidv7(),createdAt:new Date().toISOString(),hint:hint2,environment:collectEnvironment(),session:{id:options.sessionId,included:options.includeSession,summaryIncluded:options.includeSummary,messageCount:options.messageCount,...options.includeSession?{cwd:options.cwd}:{}},model:options.model?describeModel(options.model):null,provider:provider?describeProvider(options.modelRuntime,provider):null,thinkingLevel:options.thinkingLevel,extensions:options.extensions.map(describeExtension),extensionErrors:options.extensionErrors.map(({path:path14,error})=>({path:path14,error})),settings:{global:redactSettings(options.globalSettings),project:redactSettings(options.projectSettings)}}}function collectBugReportDiagnostics(sessionManager,crashes=[]){let entries=sessionManager.getEntries(),assistant=[],assistantMessageCount=0;for(let entry of entries){if(entry.type!=="message"||entry.message.role!=="assistant")continue;assistantMessageCount++;let message=entry.message,diagnostics=message.diagnostics??[];diagnostics.length===0&&message.stopReason!=="error"&&message.stopReason!=="aborted"&&!message.errorMessage||assistant.push({entryId:entry.id,timestamp:entry.timestamp,provider:message.provider,model:message.model,api:message.api,stopReason:message.stopReason,...message.rawStopReason===void 0?{}:{rawStopReason:message.rawStopReason},...message.errorMessage===void 0?{}:{errorMessage:message.errorMessage},diagnostics})}return{schemaVersion:BUG_REPORT_SCHEMA_VERSION,sessionId:sessionManager.getSessionId(),entryCount:entries.length,assistantMessageCount,assistant,crashes:crashes.map(({notified:_notified,...record})=>record)}}function bugReportFiles(bundle){let files=[{name:"report.json",contentType:"application/json",data:`${JSON.stringify(bundle.metadata,null,2)}
|
|
1248
1257
|
`},{name:"diagnostics.json",contentType:"application/json",data:`${JSON.stringify(bundle.diagnostics,null,2)}
|
|
1249
1258
|
`}];return bundle.sessionJsonl!==void 0&&files.push({name:"session.jsonl",contentType:"application/x-ndjson",data:bundle.sessionJsonl}),bundle.summary!==void 0&&files.push({name:"summary.md",contentType:"text/markdown",data:bundle.summary.endsWith(`
|
|
@@ -1486,8 +1495,13 @@ changes anytime in settings.json.`),1,0)),this.addChild(new Spacer(1)),this.addO
|
|
|
1486
1495
|
${message}`,[{label:"Yes",value:!0},{label:"No",value:!1}])??!1,input:async(title,placeholder)=>{if(options.hasUI&&options.mode==="interactive")return showStartupInput(options.settingsManager,title,placeholder)},notify:(message,type="info")=>{if(options.mode!=="interactive"){let color2=type==="error"?source_default.red:type==="warning"?source_default.yellow:source_default.cyan;console.error(color2(message))}}}}}async function selectSession(currentSessionsLoader,allSessionsLoader,settingsManager){let ui=await createStartupTui(settingsManager);return new Promise(resolve17=>{let keybindings=KeybindingsManager2.create();setKeybindings(keybindings);let resolved=!1,selector=new SessionSelectorComponent(currentSessionsLoader,allSessionsLoader,path14=>{resolved||(resolved=!0,ui.stop(),resolve17(path14))},()=>{resolved||(resolved=!0,ui.stop(),resolve17(null))},()=>{ui.stop(),process.exit(0)},()=>ui.requestRender(),{showRenameHint:!1,keybindings});ui.addChild(selector),ui.setFocus(selector.getSessionList()),startStartupTui(ui,settingsManager)})}function formatProjectTrustPrompt(cwd){return`Trust project folder?
|
|
1487
1496
|
${cwd}
|
|
1488
1497
|
|
|
1489
|
-
This allows ${APP_NAME} to load ${CONFIG_DIR_NAME} settings and resources, install missing project packages, and execute project extensions.`}async function selectProjectTrustOption(cwd,ctx){let options=getProjectTrustOptions(cwd,{includeSessionOnly:!0}),selected=await ctx.ui.select(formatProjectTrustPrompt(cwd),options.map(option=>option.label));return options.find(option=>option.label===selected)}function saveProjectTrustPromptResult(trustStore,result2){result2.updates.length>0&&trustStore.setMany(result2.updates)}async function resolveProjectTrusted(options){if(options.trustOverride!==void 0)return options.trustOverride;if(!hasTrustRequiringProjectResources(options.cwd))return!0;if(options.extensionsResult){let{result:result2,errors}=await emitProjectTrustEvent(options.extensionsResult,{type:"project_trust",cwd:options.cwd},options.projectTrustContext);for(let error of errors)options.onExtensionError?.(`Extension "${error.extensionPath}" project_trust error: ${error.error}`);if(result2){let trusted=result2.trusted==="yes";return result2.remember===!0&&options.trustStore.set(options.cwd,trusted),trusted}}let decision=options.trustStore.get(options.cwd);if(decision!==null)return decision;switch(options.defaultProjectTrust??"ask"){case"always":return!0;case"never":return!1;case"ask":break}if(!options.projectTrustContext.hasUI)return!1;let selected=await selectProjectTrustOption(options.cwd,options.projectTrustContext);return selected!==void 0?(saveProjectTrustPromptResult(options.trustStore,selected),selected.trusted):!1}function collectSettingsDiagnostics(settingsManager){return settingsManager.drainErrors().map(({scope,path:path14,error})=>({type:"warning",message:path14?`Invalid settings file ${path14}: ${error.message}`:`Invalid ${scope} settings: ${error.message}`}))}function deduplicateDiagnostics(diagnostics){let seen=new Set;return diagnostics.filter(diagnostic=>{let key=`${diagnostic.type}\0${diagnostic.message}`;return seen.has(key)?!1:(seen.add(key),!0)})}registerKeybindings({"app.backgroundTasks.detach":{defaultKeys:"ctrl+b",description:"Move foreground Bash and Subagent executions to the background"},"app.backgroundTasks.focusList":{defaultKeys:"left",description:"Focus the background task list"},"app.backgroundTasks.focusPreview":{defaultKeys:"right",description:"Focus the background task preview"},"app.backgroundTasks.kill":{defaultKeys:"k",description:"Kill selected background task"},"tui.editor.cursorLeft":{...TUI_KEYBINDINGS["tui.editor.cursorLeft"],defaultKeys:"left"}});var BG_NOTIFICATION_TYPE="background-task",BG_COMPLETION_TYPE="background-completion";var bgSchema=typebox_exports.Object({action:StringEnum(["read","wait","kill","list"],{description:"Which background-task operation to perform"}),taskId:typebox_exports.Optional(typebox_exports.String({description:"Bash task or Subagent group id (read/wait/kill)"})),mode:typebox_exports.Optional(StringEnum(["tail","head"],{description:"Read from the end (default) or the start of the output (read)"})),bytes:typebox_exports.Optional(typebox_exports.Number({description:`Max bytes to return (read, default ${formatSize(8192)}, max ${formatSize(51200)})`})),waitMs:typebox_exports.Optional(typebox_exports.Number({description:`Max time to wait in ms, default ${2e4}, max ${6e4} (wait)`})),sinceBytes:typebox_exports.Optional(typebox_exports.Number({description:"Only return output written after this byte offset \u2014 take it from a previous read/wait result (wait)"}))});function requireTaskId(input2){let taskId=input2.taskId;if(!taskId||taskId.trim().length===0)throw new Error(`action '${input2.action}' requires 'taskId' \u2014 use action list to find the execution id.`);return taskId}function clampReadBytes(bytes){let value2=bytes!==void 0&&Number.isFinite(bytes)?bytes:8192;return Math.min(51200,Math.max(256,Math.floor(value2)))}function clampWaitMs(waitMs){let value2=waitMs!==void 0&&Number.isFinite(waitMs)?waitMs:2e4;return Math.min(6e4,Math.max(1e3,Math.floor(value2)))}function clampSinceBytes(sinceBytes){return sinceBytes===void 0||!Number.isFinite(sinceBytes)?void 0:Math.max(0,Math.floor(sinceBytes))}var BG_TOOL_DESCRIPTION="Inspect and control backgrounded work: Bash tasks and Subagent groups started with background: true. Completion is delivered to you automatically as a notification \u2014 never poll. list: bounded activity/history listing; find task IDs here. read: bounded output or report slice (head/tail). wait: block up to waitMs for a task to settle; cancelling the wait ends only the wait, never the task. kill: request cancellation of a task or a whole Subagent group, never an individual worker. bg cannot start work; pass background: true to bash or subagent. Output is capped at 50KB per response.",BG_PROMPT_SNIPPET="Manage Bash tasks and Subagent groups (list, read, wait, kill)",BG_PROMPT_GUIDELINES=["Start background work through bash or subagent with background: true; continue independent work while it runs.","A finished background task delivers its result automatically as a notification; use bg wait only when your next step is blocked on it, and never sleep-poll with repeated reads."];var SPINNER_BLOOM=["\xB7","\u2722","\u273C","\u2736","\u273B","\u273D"],STATUS_SPINNER_FRAMES=[...SPINNER_BLOOM,...[...SPINNER_BLOOM].reverse()],STATUS_SPINNER_INTERVAL_MS=120;function statusSpinnerFrame(now){let frame2=Math.floor(now/STATUS_SPINNER_INTERVAL_MS)%STATUS_SPINNER_FRAMES.length;return STATUS_SPINNER_FRAMES[frame2]??STATUS_SPINNER_FRAMES[0]??"\xB7"}function statusMarker(status,opts){if(opts?.stalled)return{glyph:"!",color:"warning"};switch(status){case"running":return{glyph:opts?.now!==void 0?statusSpinnerFrame(opts.now):"\u203A",color:"accent"};case"completed":return{glyph:"\u2713",color:"success"};case"failed":return{glyph:"\xD7",color:"error"};case"timeout":return{glyph:"\xD7",color:"warning"};case"cancelled":case"killed":case"stopping":case"partial":case"aborted":return{glyph:"\u25CB",color:"warning"};case"queued":return{glyph:"\u25CB",color:"muted"};default:return{glyph:"\u2022",color:"muted"}}}function firstCommandLine(command){return(command.split(/\r?\n/).find(candidate=>candidate.trim().length>0)??command).trim()}function formatDuration(ms){let totalSeconds=Math.max(0,Math.round(ms/1e3));if(totalSeconds<60)return`${totalSeconds}s`;let minutes=Math.floor(totalSeconds/60),seconds=totalSeconds%60;return minutes<60?`${minutes}m${String(seconds).padStart(2,"0")}s`:`${Math.floor(minutes/60)}h${String(minutes%60).padStart(2,"0")}m`}function fileNameOf(path14){return path14.replace(/\\/g,"/").split("/").at(-1)??path14}function formatAge(endedAt,now=Date.now()){let seconds=Math.max(0,Math.round((now-endedAt)/1e3));if(seconds<60)return`${seconds}s ago`;let minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m ago`;let hours=Math.floor(minutes/60);return hours<24?`${hours}h ago`:`${Math.floor(hours/24)}d ago`}function runtimeMs(task,now=Date.now()){return(task.endedAt??now)-task.startedAt}function runtimeLabel(task,now=Date.now()){return formatDuration(runtimeMs(task,now))}function hasExitCode(exitCode){return exitCode!=null}function exitSuffix(exitCode,separator){return hasExitCode(exitCode)?`${separator}exit ${exitCode}`:""}function taskLabel(task){let command=firstCommandLine(task.command);return task.description?`${task.description} \u2014 ${command}`:command}function workerLabel(worker){return worker.description?`${worker.label} \u2014 ${worker.description}`:worker.label}function commandLabel(command,width){return truncateToWidth(firstCommandLine(command),width,"\u2026")}function statusGlyph(status,stalled){return statusMarker(status,{stalled}).glyph}function statusColor(status,stalled){return statusMarker(status,{stalled}).color}function boundedText(text2){return truncateHead(sanitizeBinaryOutput(text2),{maxBytes:50*1024,maxLines:2e3}).content}function result(text2,details){return{content:[{type:"text",text:boundedText(text2)}],details}}function describeTaskLine(task,now=Date.now()){return`${task.id} ${task.kind} ${task.status} (${task.mode}) ${runtimeLabel(task,now)} ${task.title.slice(0,200)}`}function
|
|
1490
|
-
`)
|
|
1498
|
+
This allows ${APP_NAME} to load ${CONFIG_DIR_NAME} settings and resources, install missing project packages, and execute project extensions.`}async function selectProjectTrustOption(cwd,ctx){let options=getProjectTrustOptions(cwd,{includeSessionOnly:!0}),selected=await ctx.ui.select(formatProjectTrustPrompt(cwd),options.map(option=>option.label));return options.find(option=>option.label===selected)}function saveProjectTrustPromptResult(trustStore,result2){result2.updates.length>0&&trustStore.setMany(result2.updates)}async function resolveProjectTrusted(options){if(options.trustOverride!==void 0)return options.trustOverride;if(!hasTrustRequiringProjectResources(options.cwd))return!0;if(options.extensionsResult){let{result:result2,errors}=await emitProjectTrustEvent(options.extensionsResult,{type:"project_trust",cwd:options.cwd},options.projectTrustContext);for(let error of errors)options.onExtensionError?.(`Extension "${error.extensionPath}" project_trust error: ${error.error}`);if(result2){let trusted=result2.trusted==="yes";return result2.remember===!0&&options.trustStore.set(options.cwd,trusted),trusted}}let decision=options.trustStore.get(options.cwd);if(decision!==null)return decision;switch(options.defaultProjectTrust??"ask"){case"always":return!0;case"never":return!1;case"ask":break}if(!options.projectTrustContext.hasUI)return!1;let selected=await selectProjectTrustOption(options.cwd,options.projectTrustContext);return selected!==void 0?(saveProjectTrustPromptResult(options.trustStore,selected),selected.trusted):!1}function collectSettingsDiagnostics(settingsManager){return settingsManager.drainErrors().map(({scope,path:path14,error})=>({type:"warning",message:path14?`Invalid settings file ${path14}: ${error.message}`:`Invalid ${scope} settings: ${error.message}`}))}function deduplicateDiagnostics(diagnostics){let seen=new Set;return diagnostics.filter(diagnostic=>{let key=`${diagnostic.type}\0${diagnostic.message}`;return seen.has(key)?!1:(seen.add(key),!0)})}registerKeybindings({"app.backgroundTasks.detach":{defaultKeys:"ctrl+b",description:"Move foreground Bash and Subagent executions to the background"},"app.backgroundTasks.focusList":{defaultKeys:"left",description:"Focus the background task list"},"app.backgroundTasks.focusPreview":{defaultKeys:"right",description:"Focus the background task preview"},"app.backgroundTasks.kill":{defaultKeys:"k",description:"Kill selected background task"},"tui.editor.cursorLeft":{...TUI_KEYBINDINGS["tui.editor.cursorLeft"],defaultKeys:"left"}});var BG_NOTIFICATION_TYPE="background-task",BG_COMPLETION_TYPE="background-completion";var bgSchema=typebox_exports.Object({action:StringEnum(["read","wait","kill","list"],{description:"Which background-task operation to perform"}),taskId:typebox_exports.Optional(typebox_exports.String({description:"Bash task or Subagent group id (read/wait/kill)"})),mode:typebox_exports.Optional(StringEnum(["tail","head"],{description:"Read from the end (default) or the start of the output (read)"})),bytes:typebox_exports.Optional(typebox_exports.Number({description:`Max bytes to return (read, default ${formatSize(8192)}, max ${formatSize(51200)})`})),waitMs:typebox_exports.Optional(typebox_exports.Number({description:`Max time to wait in ms, default ${2e4}, max ${6e4} (wait)`})),sinceBytes:typebox_exports.Optional(typebox_exports.Number({description:"Only return output written after this byte offset \u2014 take it from a previous read/wait result (wait)"}))});function requireTaskId(input2){let taskId=input2.taskId;if(!taskId||taskId.trim().length===0)throw new Error(`action '${input2.action}' requires 'taskId' \u2014 use action list to find the execution id.`);return taskId}function clampReadBytes(bytes){let value2=bytes!==void 0&&Number.isFinite(bytes)?bytes:8192;return Math.min(51200,Math.max(256,Math.floor(value2)))}function clampWaitMs(waitMs){let value2=waitMs!==void 0&&Number.isFinite(waitMs)?waitMs:2e4;return Math.min(6e4,Math.max(1e3,Math.floor(value2)))}function clampSinceBytes(sinceBytes){return sinceBytes===void 0||!Number.isFinite(sinceBytes)?void 0:Math.max(0,Math.floor(sinceBytes))}var BG_TOOL_DESCRIPTION="Inspect and control backgrounded work: Bash tasks and Subagent groups started with background: true. Completion is delivered to you automatically as a notification \u2014 never poll. list: bounded activity/history listing; find task IDs here. read: bounded output or report slice (head/tail). wait: block up to waitMs for a task to settle; cancelling the wait ends only the wait, never the task. kill: request cancellation of a task or a whole Subagent group, never an individual worker. bg cannot start work; pass background: true to bash or subagent. Output is capped at 50KB per response.",BG_PROMPT_SNIPPET="Manage Bash tasks and Subagent groups (list, read, wait, kill)",BG_PROMPT_GUIDELINES=["Start background work through bash or subagent with background: true; continue independent work while it runs.","A finished background task delivers its result automatically as a notification; use bg wait only when your next step is blocked on it, and never sleep-poll with repeated reads."];var SPINNER_BLOOM=["\xB7","\u2722","\u273C","\u2736","\u273B","\u273D"],STATUS_SPINNER_FRAMES=[...SPINNER_BLOOM,...[...SPINNER_BLOOM].reverse()],STATUS_SPINNER_INTERVAL_MS=120;function statusSpinnerFrame(now){let frame2=Math.floor(now/STATUS_SPINNER_INTERVAL_MS)%STATUS_SPINNER_FRAMES.length;return STATUS_SPINNER_FRAMES[frame2]??STATUS_SPINNER_FRAMES[0]??"\xB7"}function statusMarker(status,opts){if(opts?.stalled)return{glyph:"!",color:"warning"};switch(status){case"running":return{glyph:opts?.now!==void 0?statusSpinnerFrame(opts.now):"\u203A",color:"accent"};case"completed":return{glyph:"\u2713",color:"success"};case"failed":return{glyph:"\xD7",color:"error"};case"timeout":return{glyph:"\xD7",color:"warning"};case"cancelled":case"killed":case"stopping":case"partial":case"aborted":return{glyph:"\u25CB",color:"warning"};case"queued":return{glyph:"\u25CB",color:"muted"};default:return{glyph:"\u2022",color:"muted"}}}function firstCommandLine(command){return(command.split(/\r?\n/).find(candidate=>candidate.trim().length>0)??command).trim()}function formatDuration(ms){let totalSeconds=Math.max(0,Math.round(ms/1e3));if(totalSeconds<60)return`${totalSeconds}s`;let minutes=Math.floor(totalSeconds/60),seconds=totalSeconds%60;return minutes<60?`${minutes}m${String(seconds).padStart(2,"0")}s`:`${Math.floor(minutes/60)}h${String(minutes%60).padStart(2,"0")}m`}function fileNameOf(path14){return path14.replace(/\\/g,"/").split("/").at(-1)??path14}function formatAge(endedAt,now=Date.now()){let seconds=Math.max(0,Math.round((now-endedAt)/1e3));if(seconds<60)return`${seconds}s ago`;let minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m ago`;let hours=Math.floor(minutes/60);return hours<24?`${hours}h ago`:`${Math.floor(hours/24)}d ago`}function runtimeMs(task,now=Date.now()){return(task.endedAt??now)-task.startedAt}function runtimeLabel(task,now=Date.now()){return formatDuration(runtimeMs(task,now))}function hasExitCode(exitCode){return exitCode!=null}function exitSuffix(exitCode,separator){return hasExitCode(exitCode)?`${separator}exit ${exitCode}`:""}function taskLabel(task){let command=firstCommandLine(task.command);return task.description?`${task.description} \u2014 ${command}`:command}function workerLabel(worker){return worker.description?`${worker.label} \u2014 ${worker.description}`:worker.label}function commandLabel(command,width){return truncateToWidth(firstCommandLine(command),width,"\u2026")}function statusGlyph(status,stalled){return statusMarker(status,{stalled}).glyph}function statusColor(status,stalled){return statusMarker(status,{stalled}).color}function boundedText(text2){return truncateHead(sanitizeBinaryOutput(text2),{maxBytes:50*1024,maxLines:2e3}).content}function result(text2,details){return{content:[{type:"text",text:boundedText(text2)}],details}}function describeTaskLine(task,now=Date.now()){return`${task.id} ${task.kind} ${task.status} (${task.mode}) ${runtimeLabel(task,now)} ${task.title.slice(0,200)}`}var UNKNOWN_ID_MESSAGE="Unknown background task ID",AMBIGUOUS_ID_MESSAGE="Ambiguous background task ID",LOOKUP_LIST_LIMIT=10;function matchesLookupPrefix(task,id){return task.id.startsWith(id)||task.id.slice(task.kind.length+1).startsWith(id)}function lookupFailure(background,id,error){let message=error instanceof Error?error.message:String(error),ambiguous=message.includes(AMBIGUOUS_ID_MESSAGE);if(!ambiguous&&!message.includes(UNKNOWN_ID_MESSAGE))return error instanceof Error?error:new Error(message);if(ambiguous){let matches=background.list().filter(task=>matchesLookupPrefix(task,id)),lines2=matches.map(task=>describeTaskLine(task)).join(`
|
|
1499
|
+
`);return new Error(`Ambiguous background task ID "${id}" matches ${matches.length} tasks:
|
|
1500
|
+
${lines2}`)}let tasks=background.list(),active=tasks.filter(task=>!isBackgroundTerminal(task.status)),finished=tasks.filter(task=>isBackgroundTerminal(task.status)),shown=[...active,...finished].slice(0,LOOKUP_LIST_LIMIT);if(shown.length===0)return new Error(`No background task "${id}" in this session. No background tasks in this session.`);let lines=shown.map(task=>describeTaskLine(task)).join(`
|
|
1501
|
+
`);return new Error(`No background task "${id}" in this session. IDs from other sessions are not valid here.
|
|
1502
|
+
Current tasks:
|
|
1503
|
+
${lines}`)}function readText(header,slice){let boundedField=(text2,maxBytes)=>truncateHead(boundText(sanitizeBinaryOutput(text2),maxBytes),{maxBytes,maxLines:100}).content;return[boundedField(header,4096),slice.task.error?`Task error: ${boundedField(slice.task.error,4096)}`:"",slice.readError?`Output read error: ${boundedField(slice.readError,4096)}`:"",boundedField(slice.task.outputPath??"",8192),slice.text||"(no output yet)"].filter(Boolean).join(`
|
|
1504
|
+
`)}async function runRead(background,input2){let id=requireTaskId(input2);try{let mode=input2.mode??"tail",slice=await background.read(id,{mode,bytes:clampReadBytes(input2.bytes)});return result(readText(`[${describeTaskLine(slice.task)} \xB7 ${slice.totalBytes} bytes${slice.truncated?" \xB7 truncated":""}]`,slice),{action:"read",taskId:slice.task.id,mode,sliceBytes:Buffer.byteLength(slice.text),totalBytes:slice.totalBytes,outputPath:slice.task.outputPath??"",kind:slice.task.kind,status:slice.task.status})}catch(error){throw lookupFailure(background,id,error)}}async function runWait(background,input2,signal){let id=requireTaskId(input2);try{let release2=background.pin(id);try{let start=Date.now(),task=await background.wait(id,clampWaitMs(input2.waitMs),signal),timedOut=!isBackgroundTerminal(task.status),windowNote=background.closed?" \xB7 host closed; execution state unconfirmed":timedOut?" \xB7 wait window expired; execution continues":"",slice=await background.read(id,{bytes:32768,sinceBytes:clampSinceBytes(input2.sinceBytes)});return signal?.throwIfAborted(),result(readText(`[${describeTaskLine(task)}${windowNote}]`,slice),{action:"wait",taskId:task.id,...timedOut?{}:{backgroundTaskId:task.id},status:task.status,kind:task.kind,timedOut,exitCode:void 0,waitedMs:Date.now()-start,deltaBytes:Buffer.byteLength(slice.text),totalBytes:slice.totalBytes,deltaTruncated:slice.truncated,outputPath:task.outputPath??""})}finally{release2()}}catch(error){throw lookupFailure(background,id,error)}}function runKill(background,input2){let id=requireTaskId(input2);try{let task=background.get(id),requested=background.kill(task.id);return result(requested?`Cancellation requested for ${task.id}. The task or whole group is stopping; cleanup may still be in progress.`:`No new cancellation requested for ${task.id} (${background.get(task.id).status}).`,{action:"kill",taskId:task.id,command:task.command??task.title,requested,status:background.get(task.id).status})}catch(error){throw lookupFailure(background,id,error)}}function runList(background){let all=background.list(),tasks=all.filter(task=>task.mode==="background"),foregroundOmitted=all.length-tasks.length,active=tasks.filter(task=>!isBackgroundTerminal(task.status)),finished=tasks.filter(task=>isBackgroundTerminal(task.status)),shown=[...active,...finished.slice(0,5)].slice(0,100),hidden=tasks.length-shown.length,foregroundNote=foregroundOmitted>0?`
|
|
1491
1505
|
${foregroundOmitted} foreground ${foregroundOmitted===1?"execution":"executions"} omitted \u2014 foreground work is delivered inline in the transcript.`:"";return result(shown.length?`${shown.map(task=>describeTaskLine(task)).join(`
|
|
1492
1506
|
`)}${hidden>0?`
|
|
1493
1507
|
${hidden} more records not shown.`:""}${foregroundNote}`:`No background tasks. Start work through bash or subagent with background: true.${foregroundNote}`,{action:"list",running:active.length,finished:finished.length,shown:shown.length,hidden,...foregroundOmitted>0?{foregroundOmitted}:{}})}var SOURCE_LIMIT=64*1024,CARD_ROWS=128,OUTPUT_ROWS=20,REPORT_ROWS=24;function clean(text2){return sanitizeBinaryOutput(stripTerminalSequences(text2)).replace(/\r\n?/g,`
|
|
@@ -1503,7 +1517,7 @@ ${hidden} more records not shown.`:""}${foregroundNote}`:`No background tasks. S
|
|
|
1503
1517
|
`).map(line=>theme2.fg("toolOutput",line))}layout(){let wide=this.wide(),listWidth=wide?Math.min(LIST_MAX_WIDTH,Math.max(LIST_MIN_WIDTH,Math.floor((this.width-1)*.36))):this.width,previewWidth=wide?this.width-listWidth-1:this.width,bodyHeight=this.bodyHeight(),items=this.listItems(),selectedIndex=items.findIndex(item=>"row"in item&&item.row.key===this.selected),listVisible=wide?bodyHeight:Math.min(NARROW_LIST_MAX_ROWS,Math.max(1,bodyHeight-4)),listFirst=Math.max(0,selectedIndex-listVisible+1),visibleItems=items.slice(listFirst,listFirst+listVisible),row=this.current(),detail=this.detailLines(row,Math.max(1,previewWidth-DETAIL_LABEL_WIDTH),!wide).slice(0,wide?Math.max(1,Math.min(DETAIL_MAX_ROWS,bodyHeight-2)):2),contentHeight=wide?Math.max(1,bodyHeight-detail.length-1):Math.max(1,bodyHeight-visibleItems.length-detail.length-1),wrapped=this.contentLines(row,previewWidth).flatMap((line,lineIndex)=>{let column=0;return wrapTextWithAnsi(line,Math.max(1,previewWidth)).map(text2=>{let entry={text:text2,line:lineIndex,column};return column+=visibleWidth(text2),entry})}),entries=row?.task.kind==="bash"&&!row.worker?wrapped.slice(-2e3):wrapped.slice(0,2e3),content=entries.map(entry=>entry.text),max=Math.max(0,content.length-contentHeight),position=this.position(),offset=position.scroll;if(position.anchor){let anchor=position.anchor,first=entries.findIndex(entry=>entry.line===anchor.line);if(first>=0)for(offset=first;offset+1<entries.length&&entries[offset+1].line===anchor.line&&entries[offset+1].column<=anchor.column;)offset++}let start=position.follow?max:Math.min(offset,max);return{wide,listWidth,previewWidth,bodyHeight,visibleItems,listVisible,detail,content,contentHeight,start,max,total:content.length,entries}}scrollPreview(delta){let{start,max,entries}=this.layout(),position=this.position(),wasFollowing=position.follow;position.scroll=Math.min(max,Math.max(0,start+delta));let entry=entries[position.scroll];position.anchor=entry?{line:entry.line,column:entry.column}:void 0,position.follow=delta>0&&position.scroll===max&&this.current()?.task.kind==="bash"&&!this.current()?.worker,position.follow&&!wasFollowing&&this.queueTick()}listRowLine(row,width){let{theme:theme2}=this.options,selected=row.key===this.selected,now=Date.now(),marker=statusMarker(row.worker?.status??row.task.status,{now}),glyph=theme2.fg(marker.color,marker.glyph),cursor=selected?theme2.fg(this.focus==="list"?"accent":"muted","\u2192 "):" ",indent=row.worker?" ":"",terminal=isBackgroundTerminal(row.task.status),time2="";if(!row.worker){time2=terminal?formatAge(row.task.endedAt??row.task.startedAt,now):runtimeLabel(row.task,now);let workers2=row.task.projection?.workers;workers2&&workers2.length>0&&(time2=`${workers2.filter(w=>w.status!=="queued"&&w.status!=="running").length}/${workers2.length} \xB7 ${time2}`),row.task.mode==="foreground"&&(time2=`fg \xB7 ${time2}`)}let timeWidth=time2?visibleWidth(time2)+1:0,labelWidth=Math.max(1,width-2-indent.length-visibleWidth(glyph)-1-timeWidth),labelColor=selected&&this.focus==="list"?"accent":"text",label=theme2.fg(labelColor,truncateToWidth(clean2(row.worker?workerLabel(row.worker):taskLabel({command:row.task.command??row.task.title})),labelWidth,"\u2026")),line=`${cursor}${indent}${glyph} ${label}`;return time2&&(line+=" ".repeat(Math.max(1,width-visibleWidth(line)-visibleWidth(time2)))+theme2.fg("dim",time2)),pad(line,width)}emptyLine(width){return this.centered(width,"No background tasks.")}renderTooSmall(width,rows){let{theme:theme2,keybindings}=this.options,rule=()=>new DynamicBorder(text2=>theme2.fg("border",text2)).render(width)[0]??"",message=`Terminal too small for /bg \u2014 resize to at least ${MIN_RENDER_WIDTH}\xD7${MIN_RENDER_HEIGHT}.`,bodyHeight=Math.max(1,rows-4),body=Array.from({length:bodyHeight},()=>pad("",width));body[Math.floor(bodyHeight/2)]=this.centered(width,message);let closeHint=pad(theme2.fg("dim",`${keyLabel("tui.select.cancel",{keybindings})} close`),width);return[rule(),...body,rule(),closeHint,rule()]}centered(width,message){let leftPad=Math.max(0,Math.floor((width-visibleWidth(message))/2));return pad(this.options.theme.fg("muted",`${" ".repeat(leftPad)}${message}`),width)}dividerLine(layout){let{theme:theme2}=this.options,row=this.current(),label=row?row.worker?"Worker":row.task.kind==="bash"?"Output":"Workers":"Output",styledLabel=theme2.fg(this.focus==="preview"?"accent":"muted",label),suffix=row!==void 0&&row.task.kind==="bash"&&!row.worker?theme2.fg("muted",` \xB7 tail \xB7 ${this.position().follow?"following":"browsing"}`):"",range2=theme2.fg("muted",`${layout.total?layout.start+1:0}\u2013${Math.min(layout.start+layout.contentHeight,layout.total)}/${layout.total}`),rule=count=>theme2.fg("borderMuted","\u2500".repeat(Math.max(0,count))),left=`${rule(1)} ${styledLabel}${suffix} `,right=` ${range2} ${rule(1)}`,fill=layout.previewWidth-visibleWidth(left)-visibleWidth(right);return pad(`${left}${rule(fill)}${right}`,layout.previewWidth)}render(width){if(width<1)return[];let terminalRows=this.options.tui.terminal.rows;if(width<MIN_RENDER_WIDTH||terminalRows<MIN_RENDER_HEIGHT)return this.renderTooSmall(width,terminalRows);let wasWide=this.wide();this.width=width,!wasWide&&this.wide()&&this.queueTick();let{theme:theme2,keybindings}=this.options,layout=this.layout(),rule=()=>new DynamicBorder(text2=>theme2.fg("border",text2)).render(width)[0]??"",title=theme2.fg("accent",theme2.bold("Background tasks")),segments=[];this.runningCount>0&&segments.push(theme2.fg("accent",`${this.runningCount} running`)),this.completedCount>0&&segments.push(theme2.fg("muted",`${this.completedCount} completed`)),this.failedCount>0&&segments.push(theme2.fg("error",`${this.failedCount} failed`)),this.hiddenFinished>0&&segments.push(theme2.fg("muted",`${this.hiddenFinished} foreground shell${this.hiddenFinished===1?"":"s"} hidden`));let stats=segments.join(theme2.fg("muted"," \xB7 ")),gap=width-visibleWidth(title)-visibleWidth(stats),titleLine=pad(stats&&gap>=1?`${title}${" ".repeat(gap)}${stats}`:title,width),hint2=id=>keyLabel(id,{keybindings}),pageUp=this.focus==="list"?"tui.select.pageUp":"tui.editor.pageUp",pageDown=this.focus==="list"?"tui.select.pageDown":"tui.editor.pageDown",hints=[`${hint2("tui.select.up")}/${hint2("tui.select.down")} select`,`${hint2("app.backgroundTasks.focusList")} list`,`${hint2("app.backgroundTasks.focusPreview")}/${hint2("tui.select.confirm")} output`,`${hint2(pageUp)}/${hint2(pageDown)} page`,`${hint2("app.backgroundTasks.kill")} stop`,`${hint2("tui.select.cancel")} close`].join(" \xB7 "),hintLine=pad(this.pendingKill?theme2.fg("warning",`Stop ${this.pendingKill} (whole group)? y/N`):theme2.fg(this.feedback?"muted":"dim",this.feedback??hints),width),leftLines=layout.visibleItems.length?layout.visibleItems.map(item=>"header"in item?pad(theme2.fg("dim",item.header),layout.listWidth):this.listRowLine(item.row,layout.listWidth)):[this.emptyLine(layout.listWidth)],contentWindow=layout.content.slice(layout.start,layout.start+layout.contentHeight),divider=this.dividerLine(layout),body=[];if(layout.wide){let right=[...layout.detail,divider,...contentWindow];for(let i=0;i<layout.bodyHeight;i++)body.push(pad(`${pad(leftLines[i]??"",layout.listWidth)}${theme2.fg("borderMuted","\u2502")}${pad(right[i]??"",layout.previewWidth)}`,width))}else for(body.push(...[...leftLines,...layout.detail,divider,...contentWindow].map(line=>pad(line,width)));body.length<layout.bodyHeight;)body.push(pad("",width));return[rule(),titleLine,...body.slice(0,layout.bodyHeight),rule(),hintLine,rule()].map(line=>pad(line,width))}};var COMMAND_PREVIEW_LIMIT=120,LABELLED_COMMAND_LIMIT=40,NOTIFY_TAIL_LIMIT=4e3,RESULT_EXPAND_LIMIT=4e3,WAIT_REFRESH_MS=1e3;function scheduleWaitRefresh(context,pending){let state2=context.state;if(state2!==void 0){if(pending){state2.dispose=()=>scheduleWaitRefresh(context,!1),state2.refreshTimer===void 0&&(state2.refreshTimer=setTimeout(()=>{state2.refreshTimer=void 0,context.invalidate()},WAIT_REFRESH_MS),state2.refreshTimer.unref?.());return}state2.refreshTimer!==void 0&&(clearTimeout(state2.refreshTimer),state2.refreshTimer=void 0),state2.waitStartedAt=void 0}}function bgPrompt(theme2){return theme2.fg("toolTitle",theme2.bold("$ "))}function timeoutSuffix(timeout,theme2){return timeout?theme2.fg("muted",` (timeout ${timeout}s)`):""}function capForTranscript(text2,limit){return text2.length>limit?`\u2026${text2.slice(-limit)}`:text2}function renderBgCall(args,theme2,context){switch(args.action){case"create":{let command=args.command;return typeof command=="string"?renderCreateCall(command,args,theme2,context):new Text(theme2.fg("toolTitle",theme2.bold("bg create")),0,0)}case"read":{let mode=args.mode??"tail",size=args.bytes!==void 0?` ${formatSize(args.bytes)}`:"";return new Text(`${theme2.fg("toolTitle",theme2.bold("bg read "))}${theme2.fg("accent",args.taskId??"")}${theme2.fg("muted",` ${mode}${size}`)}`,0,0)}case"wait":return renderWaitCall(args,theme2,context);case"kill":return new Text(`${theme2.fg("toolTitle",theme2.bold("bg kill "))}${theme2.fg("accent",args.taskId??"")}`,0,0);case"list":return new Text(theme2.fg("toolTitle",theme2.bold("bg list")),0,0);default:{let action=typeof args.action=="string"?` ${theme2.fg("dim",args.action)}`:"";return new Text(`${theme2.fg("toolTitle",theme2.bold("bg"))}${action}`,0,0)}}}function renderWaitCall(args,theme2,context){let taskId=typeof args.taskId=="string"?args.taskId.trim():"",pending=context.executionStarted===!0&&context.isPartial===!0&&context.state!==void 0&&taskId.length>0;if(scheduleWaitRefresh(context,pending),!pending){let ms=args.waitMs!==void 0?` ${formatDuration(clampWaitMs(args.waitMs))}`:"";return new Text(`${theme2.fg("toolTitle",theme2.bold("bg wait "))}${theme2.fg("accent",args.taskId??"")}${theme2.fg("muted",ms)}`,0,0)}let state2=context.state;state2.waitStartedAt===void 0&&(state2.waitStartedAt=Date.now());let elapsed2=`waiting ${formatDuration(Date.now()-state2.waitStartedAt)}/${formatDuration(clampWaitMs(args.waitMs))}`;return new Text(`${theme2.fg("toolTitle",theme2.bold("bg wait "))}${theme2.fg("accent",taskId)} ${theme2.fg("muted",elapsed2)}`,0,0)}function renderCreateCall(command,args,theme2,context){let lines=command.split(/\r?\n/).filter(line=>line.trim().length>0),label=args.description?theme2.fg("muted",` \xB7 ${args.description}`):"",suffix=theme2.fg("muted"," &")+timeoutSuffix(args.timeout,theme2)+label;if(context.expanded&&lines.length>1){let body2=highlightCode(command,"bash").join(`
|
|
1504
1518
|
`);return new Text(`${bgPrompt(theme2)}${body2}${suffix}`,0,0)}let body=highlightCode(firstCommandLine(command),"bash").join(`
|
|
1505
1519
|
`);if(lines.length>1){let hidden=lines.length-1,more=theme2.fg("muted",` (+${hidden} line${hidden===1?"":"s"})`);return new Text(`${bgPrompt(theme2)}${body}${suffix}${more}`,0,0)}return new Text(`${bgPrompt(theme2)}${body}${suffix}`,0,0)}function renderBgResult(result2,options,theme2,context){context.args?.action==="wait"&&!options.isPartial&&scheduleWaitRefresh(context,!1);let details=result2.details;if(context.isError||!details){let text2=result2.content.find(part=>part.type==="text")?.text??"";return new Text(theme2.fg("toolOutput",text2.trimEnd()),0,0)}let container=new Container;if(container.addChild(new TruncatedText(resultSummaryLine(details,theme2,options.expanded),1,0)),options.expanded){let text2=result2.content.find(part=>part.type==="text")?.text??"";container.addChild(new Text("",0,0)),container.addChild(new Text(theme2.fg("toolOutput",capForTranscript(text2,RESULT_EXPAND_LIMIT).trimEnd()),1,0))}return container}function resultSummaryLine(details,theme2,expanded){let shownPath=path14=>expanded?path14:fileNameOf(path14);switch(details.action){case"create":{let label=details.description?` (${details.description})`:"";return`${theme2.fg("muted","\u2192 task ")}${theme2.fg("accent",`${details.taskId}${label}`)}${theme2.fg("muted",` started \xB7 ${shownPath(details.outputPath)}`)}`}case"read":{let size=details.sliceBytes!==details.totalBytes?`${details.mode} ${formatSize(details.sliceBytes)} of ${formatSize(details.totalBytes)}`:formatSize(details.totalBytes);return`${theme2.fg("muted","\u2192 ")}${theme2.fg("accent",details.taskId)}${theme2.fg("muted",` ${size} \xB7 ${shownPath(details.outputPath)}`)}`}case"wait":{if(details.timedOut)return`${theme2.fg(statusColor(details.status),statusGlyph(details.status))} ${theme2.fg("accent",details.taskId)}${theme2.fg("muted",` still running \xB7 waited ${formatDuration(details.waitedMs)} \xB7 ${formatSize(details.totalBytes)}`)}`;let exit=exitSuffix(details.exitCode,", ");return`${theme2.fg(statusColor(details.status),statusGlyph(details.status))} ${theme2.fg("accent",details.taskId)}${theme2.fg("muted",` ${details.status}${exit} \xB7 waited ${formatDuration(details.waitedMs)} \xB7 +${formatSize(details.deltaBytes)}`)}`}case"kill":return`${theme2.fg(statusColor("killed"),statusGlyph("killed"))} ${theme2.fg("accent",details.taskId)}${theme2.fg("muted",details.requested===void 0?" stopped":details.requested?" cancellation requested":` ${details.status??"unchanged"}`)}`;case"list":{let hidden=details.hidden>0?` \xB7 ${details.hidden} more finished`:"",omitted=details.foregroundOmitted?` \xB7 ${details.foregroundOmitted} foreground omitted`:"";return theme2.fg("muted",`${details.running} running \xB7 ${details.finished} finished${hidden}${omitted}`)}}}function taskSummaryLine(details,theme2){let runtime=formatDuration(details.runtimeMs),label=details.description?`${details.description} (${commandLabel(details.command,LABELLED_COMMAND_LIMIT)})`:commandLabel(details.command,COMMAND_PREVIEW_LIMIT);if(details.stalled)return`${theme2.fg("warning",statusGlyph(details.status,!0))} ${theme2.fg("accent",details.taskId)} ${label} ${theme2.fg("muted",`\u2014 waiting for input (${runtime})`)}`;let outcome=theme2.fg(statusColor(details.status),`${details.status}${exitSuffix(details.exitCode,", ")} in ${runtime}`);return`${theme2.fg(statusColor(details.status),statusGlyph(details.status))} ${theme2.fg("accent",details.taskId)} ${label} ${theme2.fg("muted",`\u2014 ${outcome}`)}`}function renderBackgroundNotification(message,options,theme2){let details=message.details;if(!details||typeof details.taskId!="string")return;let container=new Container;container.addChild(new TruncatedText(taskSummaryLine(details,theme2),1,0));let shownPath=options.expanded?details.outputPath:fileNameOf(details.outputPath);if(container.addChild(new Text(theme2.fg("muted",shownPath),1,0)),details.tailError)container.addChild(new Text(theme2.fg("error",`Output unavailable: ${details.tailError}`),1,0));else if(options.expanded&&details.tailText){container.addChild(new Text("",0,0));let tail=capForTranscript(details.tailText,NOTIFY_TAIL_LIMIT),truncatedNote=details.tailTruncated?`
|
|
1506
|
-
[showing tail of ${formatSize(details.totalBytes)} bytes; full output: ${details.outputPath}]`:"";container.addChild(new Text(`${theme2.fg("toolOutput",tail.trimEnd())}${theme2.fg("muted",truncatedNote)}`,1,0))}return details.stalled&&options.expanded&&container.addChild(new Text(theme2.fg("warning","Blocked on interactive input \u2014 kill (bg action kill) and re-run with piped input or a non-interactive flag."),1,0)),container}function createBackgroundExtension(){return pi=>{let unsubscribe,unsubscribeDetachKey,closeMenu;pi.on("session_start",(_event,ctx)=>{unsubscribe?.(),unsubscribeDetachKey?.();let update=()=>{let tasks=ctx.background.list().filter(task=>task.mode==="background"),running=tasks.filter(task=>!isBackgroundTerminal(task.status)).length;ctx.ui.setStatus("background",tasks.length?`bg ${running} active \xB7 ${tasks.length-running} finished`:void 0)};unsubscribe=ctx.background.subscribe(update),unsubscribeDetachKey=ctx.ui.onTerminalInput(data=>{if(!getKeybindings().matches(data,"app.backgroundTasks.detach"))return;let count=ctx.background.detachForeground();if(count!==0)return ctx.ui.notify(`Moved ${count} execution${count===1?"":"s"} to the background. Use /bg to manage tasks.`),{consume:!0}}),update()}),pi.on("session_shutdown",(_event,ctx)=>{unsubscribe?.(),unsubscribe=void 0,unsubscribeDetachKey?.(),unsubscribeDetachKey=void 0,closeMenu?.(),closeMenu=void 0,ctx.ui.setStatus("background",void 0)}),pi.registerTool({name:"bg",label:"bg",description:BG_TOOL_DESCRIPTION,promptSnippet:BG_PROMPT_SNIPPET,promptGuidelines:BG_PROMPT_GUIDELINES,parameters:bgSchema,async execute(_id,params,signal,_onUpdate,ctx){try{switch(params.action){case"read":return await runRead(ctx.background,params);case"wait":return await runWait(ctx.background,params,signal);case"kill":return runKill(ctx.background,params);case"list":return runList(ctx.background)}}catch(error){let message=error instanceof Error?error.message:String(error)
|
|
1520
|
+
[showing tail of ${formatSize(details.totalBytes)} bytes; full output: ${details.outputPath}]`:"";container.addChild(new Text(`${theme2.fg("toolOutput",tail.trimEnd())}${theme2.fg("muted",truncatedNote)}`,1,0))}return details.stalled&&options.expanded&&container.addChild(new Text(theme2.fg("warning","Blocked on interactive input \u2014 kill (bg action kill) and re-run with piped input or a non-interactive flag."),1,0)),container}function createBackgroundExtension(){return pi=>{let unsubscribe,unsubscribeDetachKey,closeMenu;pi.on("session_start",(_event,ctx)=>{unsubscribe?.(),unsubscribeDetachKey?.();let update=()=>{let tasks=ctx.background.list().filter(task=>task.mode==="background"),running=tasks.filter(task=>!isBackgroundTerminal(task.status)).length;ctx.ui.setStatus("background",tasks.length?`bg ${running} active \xB7 ${tasks.length-running} finished`:void 0)};unsubscribe=ctx.background.subscribe(update),unsubscribeDetachKey=ctx.ui.onTerminalInput(data=>{if(!getKeybindings().matches(data,"app.backgroundTasks.detach"))return;let count=ctx.background.detachForeground();if(count!==0)return ctx.ui.notify(`Moved ${count} execution${count===1?"":"s"} to the background. Use /bg to manage tasks.`),{consume:!0}}),update()}),pi.on("session_shutdown",(_event,ctx)=>{unsubscribe?.(),unsubscribe=void 0,unsubscribeDetachKey?.(),unsubscribeDetachKey=void 0,closeMenu?.(),closeMenu=void 0,ctx.ui.setStatus("background",void 0)}),pi.registerTool({name:"bg",label:"bg",description:BG_TOOL_DESCRIPTION,promptSnippet:BG_PROMPT_SNIPPET,promptGuidelines:BG_PROMPT_GUIDELINES,parameters:bgSchema,constrainedSampling:{type:"json_schema",strict:"prefer"},async execute(_id,params,signal,_onUpdate,ctx){try{switch(params.action){case"read":return await runRead(ctx.background,params);case"wait":return await runWait(ctx.background,params,signal);case"kill":return runKill(ctx.background,params);case"list":return runList(ctx.background)}}catch(error){let message=error instanceof Error?error.message:String(error);throw new Error(boundedText(message))}},renderCall:renderBgCall,renderResult:renderBgResult}),pi.registerMessageRenderer(BG_NOTIFICATION_TYPE,renderBackgroundNotification),pi.registerMessageRenderer(BG_COMPLETION_TYPE,renderBackgroundCompletion),pi.registerCommand("bg",{description:"View and manage Bash tasks and Subagent groups",handler:async(_args,ctx)=>{if(ctx.mode!=="tui"){ctx.ui.notify(boundedText(ctx.background.list().filter(task=>task.mode==="background").slice(0,10).map(task=>describeTaskLine(task)).join(`
|
|
1507
1521
|
`))||"No background tasks.","info");return}closeMenu?.(),await ctx.ui.custom((tui,theme2,keybindings,done)=>{let close=()=>{closeMenu===close&&(closeMenu=void 0),done()};return closeMenu=close,new BackgroundTasksMenu({tui,theme:theme2,keybindings,host:ctx.background,onClose:close})},{overlay:!0,overlayOptions:{anchor:"center",width:"100%",maxHeight:"100%"}})}})}}var background_default=createBackgroundExtension();registerKeybindings({"app.btw.close":{defaultKeys:"escape",description:"Close the BTW conversation"},"app.btw.cancel":{defaultKeys:"ctrl+c",description:"Stop the BTW answer, or close when idle"},"app.btw.scrollUp":{defaultKeys:"up",description:"Scroll BTW up when the editor is empty"},"app.btw.scrollDown":{defaultKeys:"down",description:"Scroll BTW down when the editor is empty"}});var TOOL_DENIAL="Tools are unavailable in this BTW conversation. Answer using the inherited context only.",UNKNOWN_TOOL_RESULT="This tool had not returned a result when the BTW context snapshot was captured. Its outcome is unknown here; the original task may still be running.",BTW_REMINDER=`<btw-reminder>
|
|
1508
1522
|
This is a separate side conversation about the preceding context. Answer the user's side questions without continuing or changing the original task. The original task may still be running; later activity is not part of this snapshot.
|
|
1509
1523
|
Tool definitions are retained for prompt-cache reuse, but tools cannot be executed here. Use only the available context, and say when it does not contain the answer.
|
|
@@ -1574,7 +1588,7 @@ ${answer.notes.map(note=>theme2.fg("muted",` Note for ${note.option}: ${note.
|
|
|
1574
1588
|
${answerLines(details.answers,theme2).join(`
|
|
1575
1589
|
`)}`,0,0)}function answerProgress(details,args){let total=questionsFromArgs(args).length;return total>0?`answered ${details.answers.length} of ${total}`:`answered ${details.answers.length}`}function renderQuestionCall(args,theme2,expanded){let questions=questionsFromArgs(args),headers=questions.map(question2=>question2.header).join(", "),count=`${questions.length} decision${questions.length===1?"":"s"}`,summary=questions.length===0?"asking for a decision":headers?`${count}: ${headers}`:count,title=`${theme2.fg("toolTitle",theme2.bold("question"))} ${theme2.fg("muted",summary)}`;if(!expanded||questions.length===0)return new Text(title,0,0);let detailLines=questions.map(question2=>{let multi=question2.multiSelect?" (multi-select)":"",body=question2.question?`: ${question2.question}`:"";return theme2.fg("dim",`${question2.header}${multi}${body}`)});return new Text(`${title}
|
|
1576
1590
|
${detailLines.join(`
|
|
1577
|
-
`)}`,0,0)}function renderQuestionResult(result2,options,theme2,args){let details=normalizeDetails(result2.details);if(!details)return renderFallbackResult(result2,options.expanded,theme2);if(details.outcome==="error")return new Text(theme2.fg("error",`Question error: ${errorMessage3(result2,details)}`),0,0);if(details.outcome==="cancelled"){let title2=theme2.fg("warning",`Cancelled \xB7 ${answerProgress(details,args)}`);return renderOutcome(title2,details,options.expanded,theme2)}if(details.outcome==="needs_clarification"){let title2=theme2.fg("warning",`Wants to discuss \xB7 ${answerProgress(details,args)}`);return renderOutcome(title2,details,options.expanded,theme2)}let title=theme2.fg("success",`\u2713 Answered ${details.answers.length} decision${details.answers.length===1?"":"s"}`);return renderOutcome(title,details,options.expanded,theme2)}var MIN_OPTIONS=2,MAX_OPTIONS=4,MAX_QUESTIONS2=4,RESERVED_LABELS=["Other","Type something","Type something.","Chat about this"],normalizeLabel=text2=>text2.trim().toLowerCase(),RESERVED_NORMALIZED=new Set(RESERVED_LABELS.map(normalizeLabel)),OptionSchema=typebox_exports.Object({label:typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.optionLabelChars,description:"Short user-facing option label (1-5 words), distinct within the question. Reserved labels ('Other', 'Type something', 'Chat about this') are rejected \u2014 the UI adds the custom-answer path itself."}),description:typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.optionDescriptionChars,description:"One concise sentence explaining the option's meaning, consequence, or tradeoff."}),preview:typebox_exports.Optional(typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.previewChars,description:"Optional markdown preview shown only for focused single-select options; use for concrete snippets, layouts, copy, or config comparisons."}))}),QuestionSchema=typebox_exports.Object({question:typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.questionChars,description:"One clear, specific decision or preference question ending in a question mark. Ask only what is needed to proceed."}),header:typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.headerChars,description:"Very short decision label shown as a chip; aim for ~12 chars, max 32. E.g. 'Auth method'."}),options:typebox_exports.Array(OptionSchema,{minItems:MIN_OPTIONS,maxItems:MAX_OPTIONS,description:"Mutually distinct options for this decision; do not include reserved custom-answer labels."}),multiSelect:typebox_exports.Optional(typebox_exports.Boolean({description:"Allow selecting multiple options only when choices can be combined. Defaults to false for mutually exclusive decisions."}))}),QuestionParams=typebox_exports.Object({questions:typebox_exports.Array(QuestionSchema,{minItems:1,maxItems:MAX_QUESTIONS2,description:"Related decisions to ask now (1-4); ask only what is needed to unblock progress."})});function validateQuestions(questions){let requireNonBlank=(value2,path14)=>{if(!(typeof value2=="string"&&value2.trim().length>0))return{ok:!1,error:"blank_text",message:`${path14} must contain visible text`}},seenQuestions=new Set;for(let questionIndex=0;questionIndex<questions.length;questionIndex++){let q2=questions[questionIndex],questionError=requireNonBlank(q2.question,`questions[${questionIndex}].question`);if(questionError)return questionError;let headerError=requireNonBlank(q2.header,`questions[${questionIndex}].header`);if(headerError)return headerError;let questionKey=normalizeLabel(q2.question);if(seenQuestions.has(questionKey))return{ok:!1,error:"duplicate_question",message:"Question text must be unique"};seenQuestions.add(questionKey);let seenLabels=new Set;for(let optionIndex=0;optionIndex<q2.options.length;optionIndex++){let option=q2.options[optionIndex],optionPath=`questions[${questionIndex}].options[${optionIndex}]`,labelError=requireNonBlank(option.label,`${optionPath}.label`);if(labelError)return labelError;let descriptionError=requireNonBlank(option.description,`${optionPath}.description`);if(descriptionError)return descriptionError;if(option.preview!==void 0){let previewError=requireNonBlank(option.preview,`${optionPath}.preview`);if(previewError)return previewError}let labelKey=normalizeLabel(option.label);if(RESERVED_NORMALIZED.has(labelKey))return{ok:!1,error:"reserved_label",message:`Option label is reserved (${RESERVED_LABELS.join(", ")})`};if(seenLabels.has(labelKey))return{ok:!1,error:"duplicate_option_label",message:"Option labels must be unique within a question"};seenLabels.add(labelKey)}if(q2.multiSelect&&q2.options.some(option=>option.preview))return{ok:!1,error:"preview_multiselect",message:"Option previews are not supported on multiSelect questions; drop the previews or make the question single-select"}}return{ok:!0}}function question(pi){pi.registerTool({name:QUESTION_TOOL_NAME,label:QUESTION_LABEL,description:QUESTION_DESCRIPTION,promptSnippet:QUESTION_PROMPT_SNIPPET,promptGuidelines:QUESTION_PROMPT_GUIDELINES,parameters:QuestionParams,executionMode:"sequential",renderCall(args,theme2,context){return renderQuestionCall(args,theme2,context.expanded)},renderResult(result2,options,theme2,context){return renderQuestionResult(result2,options,theme2,context.args)},async execute(_toolCallId,params,signal,_onUpdate,ctx){let questions=params.questions;if(!ctx.hasUI||ctx.mode!=="tui")return errorResult("no_ui","question tool requires an interactive TUI");let validation=validateQuestions(questions);if(!validation.ok)return errorResult(validation.error,validation.message);let result2=await ctx.ui.custom(createQuestionDialog(questions,signal));return result2.outcome==="cancelled"?cancelResult(result2.answers):result2.outcome==="needs_clarification"?clarificationResult(result2.answers):successResult(result2.answers)}}),pi.on("tool_result",async event=>{if(event.toolName!==QUESTION_TOOL_NAME)return;if(event.details?.outcome==="error")return{isError:!0}})}var CONTEXT_WARNING_PERCENT=40,CONTEXT_ERROR_PERCENT=80,MIN_GAP=1;function isTui(ctx){return ctx.mode==="tui"}function formatWorkingDirectory(cwd){let homeDirectory=(process.env.USERPROFILE||process.env.HOME||"").replace(/[\\/]+$/,"");if(!homeDirectory)return cwd;let normalizePath3=filePath=>filePath.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase(),normalizedHomeDirectory=normalizePath3(homeDirectory),normalizedCwd=normalizePath3(cwd);return normalizedCwd===normalizedHomeDirectory?"~":normalizedCwd.startsWith(`${normalizedHomeDirectory}/`)?`~${cwd.slice(homeDirectory.length).replace(/\\/g,"/")}`:cwd}function pathBasename(displayPath2){let normalized=displayPath2.replace(/\\/g,"/").replace(/\/+$/,"");if(!normalized||normalized==="~")return normalized||displayPath2;let slash=normalized.lastIndexOf("/");if(slash<0)return normalized;let base=normalized.slice(slash+1);return normalized.startsWith("~/")?`~/${base}`:base}function formatTokenCount2(tokenCount){return tokenCount<1e3?`${tokenCount}`:tokenCount<1e4?`${(tokenCount/1e3).toFixed(1)}k`:tokenCount<1e6?`${Math.round(tokenCount/1e3)}k`:tokenCount<1e7?`${(tokenCount/1e6).toFixed(1)}M`:`${Math.round(tokenCount/1e6)}M`}function sanitizeStatus(text2){return text2.replace(/[\r\n\t]/g," ").replace(/ +/g," ").trim()}function joinSegments(segments,separator){return segments.filter(segment2=>segment2.length>0).join(separator)}function entryUsage(entry){return entry.type==="message"?entry.message.role==="assistant"||entry.message.role==="toolResult"?entry.message.usage:void 0:entry.type==="branch_summary"||entry.type==="compaction"?entry.usage:getBackgroundUsageRecord(entry)?.usage}function computeBranchStats(branchEntries){let thinkingLevel="off",usageTotals=createUsageTotals(),latestCacheHitPercent;for(let usage of getAccountedUsages(branchEntries))addUsageToTotals(usageTotals,usage);for(let entry of branchEntries){if(entry.type==="thinking_level_change"){thinkingLevel=entry.thinkingLevel;continue}let usage=entryUsage(entry);if(usage&&entry.type==="message"&&entry.message.role==="assistant"){let latestPromptTokens=usage.input+usage.cacheRead+usage.cacheWrite;latestCacheHitPercent=(usage.cacheRead>0||usage.cacheWrite>0)&&latestPromptTokens>0?usage.cacheRead/latestPromptTokens*100:void 0}}return{thinkingLevel,usage:{...usageTotals,latestCacheHitPercent}}}function leafUsageFingerprint(entry){if(!entry)return"";let usage=entryUsage(entry);return usage?[usage.input,usage.output,usage.cacheRead,usage.cacheWrite,usage.cost.total].join(":"):""}function getBranchStats(branchEntries,cache){let lastEntry=branchEntries.length>0?branchEntries[branchEntries.length-1]:void 0,leafUsage=leafUsageFingerprint(lastEntry),cached=cache.current;if(cached&&cached.length===branchEntries.length&&cached.lastEntry===lastEntry&&cached.leafUsage===leafUsage)return cached.stats;let stats=computeBranchStats(branchEntries);return cache.current={length:branchEntries.length,lastEntry,leafUsage,stats},stats}function getBranchEntries(getLeafId,getBranch,cache){let leafId=getLeafId(),cached=cache.current;if(cached&&cached.leafId===leafId)return cached.entries;let entries=getBranch();return cache.current={leafId,entries},entries}function formatContextUsage(ctx,theme2){let contextUsage=ctx.getContextUsage(),contextWindow=contextUsage?.contextWindow??ctx.model?.contextWindow,contextWindowSuffix=contextWindow?`/${formatTokenCount2(contextWindow)}`:"";if(contextUsage?.percent==null)return theme2.fg("accent",`CTX ?%${contextWindowSuffix}`);let label=`CTX ${contextUsage.percent.toFixed(1)}%${contextWindowSuffix}`;return contextUsage.percent>CONTEXT_ERROR_PERCENT?theme2.fg("error",label):contextUsage.percent>CONTEXT_WARNING_PERCENT?theme2.fg("warning",label):theme2.fg("accent",label)}function formatUsageSummary(summary,usesSubscription,theme2,options={includeCacheRead:!0,includeCacheWrite:!0}){let usageParts=[];return summary.input>0&&usageParts.push(`\u2191${formatTokenCount2(summary.input)}`),summary.output>0&&usageParts.push(`\u2193${formatTokenCount2(summary.output)}`),options.includeCacheRead&&summary.cacheRead>0&&usageParts.push(`R${formatTokenCount2(summary.cacheRead)}`),options.includeCacheWrite&&summary.cacheWrite>0&&usageParts.push(`W${formatTokenCount2(summary.cacheWrite)}`),summary.latestCacheHitPercent!==void 0&&usageParts.push(`CH${summary.latestCacheHitPercent.toFixed(1)}%`),summary.cost>0&&usageParts.push(`$${summary.cost.toFixed(3)}${usesSubscription?" (sub)":""}`),usageParts.length===0?"":theme2.fg("dim",usageParts.join(" "))}function hasAnsiColor(text2){return text2.includes("\x1B[")}function formatExtensionStatuses(statuses,theme2){return Array.from(statuses.entries()).sort(([firstKey],[secondKey])=>firstKey.localeCompare(secondKey)).map(([,text2])=>sanitizeStatus(text2)).filter(Boolean).map(text2=>hasAnsiColor(text2)?text2:theme2.fg("muted",text2)).join(" ")}function layoutLeftRight(left,right,width,theme2){let ellipsis=theme2.fg("dim","...");if(width<=0)return"";if(!right)return truncateToWidth(left,width,ellipsis);if(!left){let rightWidth2=visibleWidth(right);return rightWidth2>=width?truncateToWidth(right,width,ellipsis):`${" ".repeat(width-rightWidth2)}${right}`}let leftText=left,rightText=right,leftWidth=visibleWidth(leftText),rightWidth=visibleWidth(rightText);if(leftWidth+rightWidth+MIN_GAP>width){let maxRightWidth=Math.min(rightWidth,Math.max(8,Math.floor(width*.45)));rightWidth>maxRightWidth&&(rightText=truncateToWidth(rightText,maxRightWidth,ellipsis),rightWidth=visibleWidth(rightText));let maxLeftWidth=width-rightWidth-MIN_GAP;if(maxLeftWidth<1)return truncateToWidth(rightText,width,ellipsis);leftText=truncateToWidth(leftText,maxLeftWidth,ellipsis),leftWidth=visibleWidth(leftText)}let gap=Math.max(MIN_GAP,width-leftWidth-rightWidth);return`${leftText}${" ".repeat(gap)}${rightText}`}function layoutSecondaryLine(contextText,statusText2,usageText,width,theme2){let ellipsis=theme2.fg("dim","...");if(!statusText2)return usageText?layoutLeftRight(contextText,usageText,width,theme2):truncateToWidth(contextText,width,ellipsis);let contextWidth=visibleWidth(contextText),usageWidth=visibleWidth(usageText),statusWidth=visibleWidth(statusText2);if(contextWidth+usageWidth+statusWidth+MIN_GAP*2<=width){let centerStart=Math.floor((width-statusWidth)/2),centeredLeftPad=centerStart-contextWidth,centeredRightPad=width-centerStart-statusWidth-usageWidth;if(centeredLeftPad>=MIN_GAP&¢eredRightPad>=MIN_GAP)return`${contextText}${" ".repeat(centeredLeftPad)}${statusText2}${" ".repeat(centeredRightPad)}${usageText}`;let free=width-contextWidth-usageWidth-statusWidth,leftPad=Math.floor(free/2),rightPad=free-leftPad;return`${contextText}${" ".repeat(leftPad)}${statusText2}${" ".repeat(rightPad)}${usageText}`}return layoutLeftRight(contextText,usageText,width,theme2)}function fitsLeftRight(left,right,width){return right?left?visibleWidth(left)+visibleWidth(right)+MIN_GAP<=width:visibleWidth(right)<=width:visibleWidth(left)<=width}function fitPrimaryLine(options){let{modelWithProvider,modelName,effortPart,cwdFull,cwdShort,branchPart,separator,width,theme:theme2}=options,leftRich=joinSegments([modelWithProvider,effortPart],separator),leftPlain=joinSegments([modelName,effortPart],separator),candidates=[{left:leftRich,right:joinSegments([cwdFull,branchPart],separator)},{left:leftRich,right:cwdFull},{left:leftRich,right:joinSegments([cwdShort,branchPart],separator)},{left:leftRich,right:cwdShort},{left:leftPlain,right:joinSegments([cwdShort,branchPart],separator)},{left:leftPlain,right:cwdShort},{left:leftPlain,right:""}];for(let candidate of candidates)if(fitsLeftRight(candidate.left,candidate.right,width))return layoutLeftRight(candidate.left,candidate.right,width,theme2);return layoutLeftRight(leftPlain,cwdShort,width,theme2)}function fitSecondaryLine(options){let{contextText,statusText:statusText2,usageCandidates,width,theme:theme2}=options;if(usageCandidates.length===0)return layoutSecondaryLine(contextText,statusText2,"",width,theme2);for(let usageText of usageCandidates)if(fitsLeftRight(contextText,usageText,width))return layoutSecondaryLine(contextText,statusText2,usageText,width,theme2);let fallbackUsage=usageCandidates[0]??"";return layoutLeftRight(contextText,fallbackUsage,width,theme2)}function statusline(pi){pi.on("session_start",(_event,ctx)=>{if(!isTui(ctx))return;let branchPathCache={current:null},branchStatsCache={current:null};ctx.ui.setFooter((tui,theme2,footerData)=>({dispose:footerData.onBranchChange(()=>tui.requestRender()),invalidate(){branchPathCache.current=null,branchStatsCache.current=null},render(width){let branchEntries=getBranchEntries(()=>ctx.sessionManager.getLeafId(),()=>ctx.sessionManager.getBranch(),branchPathCache),{thinkingLevel,usage:usageSummary}=getBranchStats(branchEntries,branchStatsCache),model=ctx.model,modelName=theme2.fg("toolTitle",theme2.bold(model?.name??model?.id??"no-model")),providerPart=model?.provider?theme2.fg("muted",`(${model.provider})`):"",modelWithProvider=providerPart?`${modelName} ${providerPart}`:modelName,effortPart="";model?.reasoning&&thinkingLevel!=="off"&&(effortPart=theme2.getThinkingBorderColor(thinkingLevel)(thinkingLevel));let separator=theme2.fg("dim"," \xB7 "),cwdDisplay=formatWorkingDirectory(ctx.cwd),cwdFull=theme2.fg("success",cwdDisplay),cwdShort=theme2.fg("success",pathBasename(cwdDisplay)),gitBranch=footerData.getGitBranch(),branchPart=gitBranch?theme2.fg("accent",gitBranch):"",primaryLine=fitPrimaryLine({modelWithProvider,modelName,effortPart,cwdFull,cwdShort,branchPart,separator,width,theme:theme2}),contextText=formatContextUsage(ctx,theme2),usesSubscription=model?ctx.modelRegistry.isUsingOAuth(model):!1,usageCandidates=[formatUsageSummary(usageSummary,usesSubscription,theme2,{includeCacheRead:!0,includeCacheWrite:!0}),formatUsageSummary(usageSummary,usesSubscription,theme2,{includeCacheRead:!0,includeCacheWrite:!1}),formatUsageSummary(usageSummary,usesSubscription,theme2,{includeCacheRead:!1,includeCacheWrite:!1})],uniqueUsageCandidates=[...new Set(usageCandidates.filter(Boolean))],statusText2=formatExtensionStatuses(footerData.getExtensionStatuses(),theme2),secondaryLine=fitSecondaryLine({contextText,statusText:statusText2,usageCandidates:uniqueUsageCandidates,width,theme:theme2});return[primaryLine,secondaryLine]}}))}),pi.on("session_shutdown",(_event,ctx)=>{isTui(ctx)&&ctx.ui.setFooter(void 0)})}var SUBAGENT_TOOL_NAME="subagent",SUBAGENT_TOOL_LABEL="Subagent",SUBAGENT_COMMAND_NAME="agents";var SUBAGENT_CONFIG_FILE="subagent.json";var SUBAGENT_AGENT_NAMES=["explorer","general"],DEFAULT_AGENT_TOOLS=["read","bash","edit","write"],EXPLORER_TOOLS=["read","grep","find","ls","bash"],THINKING_LEVELS2=["off","minimal","low","medium","high","xhigh","max"];var COMPACTION_ACTIVITY_ID="compaction";function plainLine(text2){return text2.replace(/^\s*#{1,6}\s+/u,"").replace(/`([^`]*)`/gu,"$1").replace(/\*\*([^*]+)\*\*/gu,"$1").replace(/\[([^\]]+)\]\([^)]*\)/gu,"$1").replace(/\s+/gu," ").trim()}function firstPlainLine(text2){return text2.split(`
|
|
1591
|
+
`)}`,0,0)}function renderQuestionResult(result2,options,theme2,args){let details=normalizeDetails(result2.details);if(!details)return renderFallbackResult(result2,options.expanded,theme2);if(details.outcome==="error")return new Text(theme2.fg("error",`Question error: ${errorMessage3(result2,details)}`),0,0);if(details.outcome==="cancelled"){let title2=theme2.fg("warning",`Cancelled \xB7 ${answerProgress(details,args)}`);return renderOutcome(title2,details,options.expanded,theme2)}if(details.outcome==="needs_clarification"){let title2=theme2.fg("warning",`Wants to discuss \xB7 ${answerProgress(details,args)}`);return renderOutcome(title2,details,options.expanded,theme2)}let title=theme2.fg("success",`\u2713 Answered ${details.answers.length} decision${details.answers.length===1?"":"s"}`);return renderOutcome(title,details,options.expanded,theme2)}var MIN_OPTIONS=2,MAX_OPTIONS=4,MAX_QUESTIONS2=4,RESERVED_LABELS=["Other","Type something","Type something.","Chat about this"],normalizeLabel=text2=>text2.trim().toLowerCase(),RESERVED_NORMALIZED=new Set(RESERVED_LABELS.map(normalizeLabel)),OptionSchema=typebox_exports.Object({label:typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.optionLabelChars,description:"Short user-facing option label (1-5 words), distinct within the question. Reserved labels ('Other', 'Type something', 'Chat about this') are rejected \u2014 the UI adds the custom-answer path itself."}),description:typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.optionDescriptionChars,description:"One concise sentence explaining the option's meaning, consequence, or tradeoff."}),preview:typebox_exports.Optional(typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.previewChars,description:"Optional markdown preview shown only for focused single-select options; use for concrete snippets, layouts, copy, or config comparisons."}))}),QuestionSchema=typebox_exports.Object({question:typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.questionChars,description:"One clear, specific decision or preference question ending in a question mark. Ask only what is needed to proceed."}),header:typebox_exports.String({minLength:1,maxLength:QUESTION_LIMITS.headerChars,description:"Very short decision label shown as a chip; aim for ~12 chars, max 32. E.g. 'Auth method'."}),options:typebox_exports.Array(OptionSchema,{minItems:MIN_OPTIONS,maxItems:MAX_OPTIONS,description:"Mutually distinct options for this decision; do not include reserved custom-answer labels."}),multiSelect:typebox_exports.Optional(typebox_exports.Boolean({description:"Allow selecting multiple options only when choices can be combined. Defaults to false for mutually exclusive decisions."}))}),QuestionParams=typebox_exports.Object({questions:typebox_exports.Array(QuestionSchema,{minItems:1,maxItems:MAX_QUESTIONS2,description:"Related decisions to ask now (1-4); ask only what is needed to unblock progress."})});function normalizeQuestionArguments(raw){if(raw===null||typeof raw!="object"||Array.isArray(raw))return raw;let args={...raw};if(typeof args.questions=="string")try{let parsed=JSON.parse(args.questions);Array.isArray(parsed)&&(args.questions=parsed)}catch{}let rootQuestion=typeof args.question=="string"?args.question:void 0,onlyQuestion=Array.isArray(args.questions)&&args.questions.length===1?args.questions[0]:void 0;if(rootQuestion!==void 0&&onlyQuestion!==null&&typeof onlyQuestion=="object"&&!Array.isArray(onlyQuestion)&&onlyQuestion.question===void 0)return args.questions=[{...onlyQuestion,question:rootQuestion}],delete args.question,args;if(args.questions===void 0&&rootQuestion!==void 0&&args.options!==void 0){let question2={question:rootQuestion,options:args.options};args.header!==void 0&&(question2.header=args.header),args.multiSelect!==void 0&&(question2.multiSelect=args.multiSelect),delete args.question,delete args.options,delete args.header,delete args.multiSelect,args.questions=[question2]}return args}function validateQuestions(questions){let requireNonBlank=(value2,path14)=>{if(!(typeof value2=="string"&&value2.trim().length>0))return{ok:!1,error:"blank_text",message:`${path14} must contain visible text`}},seenQuestions=new Set;for(let questionIndex=0;questionIndex<questions.length;questionIndex++){let q2=questions[questionIndex],questionError=requireNonBlank(q2.question,`questions[${questionIndex}].question`);if(questionError)return questionError;let headerError=requireNonBlank(q2.header,`questions[${questionIndex}].header`);if(headerError)return headerError;let questionKey=normalizeLabel(q2.question);if(seenQuestions.has(questionKey))return{ok:!1,error:"duplicate_question",message:"Question text must be unique"};seenQuestions.add(questionKey);let seenLabels=new Set;for(let optionIndex=0;optionIndex<q2.options.length;optionIndex++){let option=q2.options[optionIndex],optionPath=`questions[${questionIndex}].options[${optionIndex}]`,labelError=requireNonBlank(option.label,`${optionPath}.label`);if(labelError)return labelError;let descriptionError=requireNonBlank(option.description,`${optionPath}.description`);if(descriptionError)return descriptionError;if(option.preview!==void 0){let previewError=requireNonBlank(option.preview,`${optionPath}.preview`);if(previewError)return previewError}let labelKey=normalizeLabel(option.label);if(RESERVED_NORMALIZED.has(labelKey))return{ok:!1,error:"reserved_label",message:`Option label is reserved (${RESERVED_LABELS.join(", ")})`};if(seenLabels.has(labelKey))return{ok:!1,error:"duplicate_option_label",message:"Option labels must be unique within a question"};seenLabels.add(labelKey)}if(q2.multiSelect&&q2.options.some(option=>option.preview))return{ok:!1,error:"preview_multiselect",message:"Option previews are not supported on multiSelect questions; drop the previews or make the question single-select"}}return{ok:!0}}function question(pi){pi.registerTool({name:QUESTION_TOOL_NAME,label:QUESTION_LABEL,description:QUESTION_DESCRIPTION,promptSnippet:QUESTION_PROMPT_SNIPPET,promptGuidelines:QUESTION_PROMPT_GUIDELINES,parameters:QuestionParams,constrainedSampling:{type:"json_schema",strict:"prefer"},prepareArguments:normalizeQuestionArguments,executionMode:"sequential",renderCall(args,theme2,context){return renderQuestionCall(args,theme2,context.expanded)},renderResult(result2,options,theme2,context){return renderQuestionResult(result2,options,theme2,context.args)},async execute(_toolCallId,params,signal,_onUpdate,ctx){let questions=params.questions;if(!ctx.hasUI||ctx.mode!=="tui")return errorResult("no_ui","question tool requires an interactive TUI");let validation=validateQuestions(questions);if(!validation.ok)return errorResult(validation.error,validation.message);let result2=await ctx.ui.custom(createQuestionDialog(questions,signal));return result2.outcome==="cancelled"?cancelResult(result2.answers):result2.outcome==="needs_clarification"?clarificationResult(result2.answers):successResult(result2.answers)}}),pi.on("tool_result",async event=>{if(event.toolName!==QUESTION_TOOL_NAME)return;if(event.details?.outcome==="error")return{isError:!0}})}var CONTEXT_WARNING_PERCENT=40,CONTEXT_ERROR_PERCENT=80,MIN_GAP=1;function isTui(ctx){return ctx.mode==="tui"}function formatWorkingDirectory(cwd){let homeDirectory=(process.env.USERPROFILE||process.env.HOME||"").replace(/[\\/]+$/,"");if(!homeDirectory)return cwd;let normalizePath3=filePath=>filePath.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase(),normalizedHomeDirectory=normalizePath3(homeDirectory),normalizedCwd=normalizePath3(cwd);return normalizedCwd===normalizedHomeDirectory?"~":normalizedCwd.startsWith(`${normalizedHomeDirectory}/`)?`~${cwd.slice(homeDirectory.length).replace(/\\/g,"/")}`:cwd}function pathBasename(displayPath2){let normalized=displayPath2.replace(/\\/g,"/").replace(/\/+$/,"");if(!normalized||normalized==="~")return normalized||displayPath2;let slash=normalized.lastIndexOf("/");if(slash<0)return normalized;let base=normalized.slice(slash+1);return normalized.startsWith("~/")?`~/${base}`:base}function formatTokenCount2(tokenCount){return tokenCount<1e3?`${tokenCount}`:tokenCount<1e4?`${(tokenCount/1e3).toFixed(1)}k`:tokenCount<1e6?`${Math.round(tokenCount/1e3)}k`:tokenCount<1e7?`${(tokenCount/1e6).toFixed(1)}M`:`${Math.round(tokenCount/1e6)}M`}function sanitizeStatus(text2){return text2.replace(/[\r\n\t]/g," ").replace(/ +/g," ").trim()}function joinSegments(segments,separator){return segments.filter(segment2=>segment2.length>0).join(separator)}function entryUsage(entry){return entry.type==="message"?entry.message.role==="assistant"||entry.message.role==="toolResult"?entry.message.usage:void 0:entry.type==="branch_summary"||entry.type==="compaction"?entry.usage:getBackgroundUsageRecord(entry)?.usage}function computeBranchStats(branchEntries){let thinkingLevel="off",usageTotals=createUsageTotals(),latestCacheHitPercent;for(let usage of getAccountedUsages(branchEntries))addUsageToTotals(usageTotals,usage);for(let entry of branchEntries){if(entry.type==="thinking_level_change"){thinkingLevel=entry.thinkingLevel;continue}let usage=entryUsage(entry);if(usage&&entry.type==="message"&&entry.message.role==="assistant"){let latestPromptTokens=usage.input+usage.cacheRead+usage.cacheWrite;latestCacheHitPercent=(usage.cacheRead>0||usage.cacheWrite>0)&&latestPromptTokens>0?usage.cacheRead/latestPromptTokens*100:void 0}}return{thinkingLevel,usage:{...usageTotals,latestCacheHitPercent}}}function leafUsageFingerprint(entry){if(!entry)return"";let usage=entryUsage(entry);return usage?[usage.input,usage.output,usage.cacheRead,usage.cacheWrite,usage.cost.total].join(":"):""}function getBranchStats(branchEntries,cache){let lastEntry=branchEntries.length>0?branchEntries[branchEntries.length-1]:void 0,leafUsage=leafUsageFingerprint(lastEntry),cached=cache.current;if(cached&&cached.length===branchEntries.length&&cached.lastEntry===lastEntry&&cached.leafUsage===leafUsage)return cached.stats;let stats=computeBranchStats(branchEntries);return cache.current={length:branchEntries.length,lastEntry,leafUsage,stats},stats}function getBranchEntries(getLeafId,getBranch,cache){let leafId=getLeafId(),cached=cache.current;if(cached&&cached.leafId===leafId)return cached.entries;let entries=getBranch();return cache.current={leafId,entries},entries}function formatContextUsage(ctx,theme2){let contextUsage=ctx.getContextUsage(),contextWindow=contextUsage?.contextWindow??ctx.model?.contextWindow,contextWindowSuffix=contextWindow?`/${formatTokenCount2(contextWindow)}`:"";if(contextUsage?.percent==null)return theme2.fg("accent",`CTX ?%${contextWindowSuffix}`);let label=`CTX ${contextUsage.percent.toFixed(1)}%${contextWindowSuffix}`;return contextUsage.percent>CONTEXT_ERROR_PERCENT?theme2.fg("error",label):contextUsage.percent>CONTEXT_WARNING_PERCENT?theme2.fg("warning",label):theme2.fg("accent",label)}function formatUsageSummary(summary,usesSubscription,theme2,options={includeCacheRead:!0,includeCacheWrite:!0}){let usageParts=[];return summary.input>0&&usageParts.push(`\u2191${formatTokenCount2(summary.input)}`),summary.output>0&&usageParts.push(`\u2193${formatTokenCount2(summary.output)}`),options.includeCacheRead&&summary.cacheRead>0&&usageParts.push(`R${formatTokenCount2(summary.cacheRead)}`),options.includeCacheWrite&&summary.cacheWrite>0&&usageParts.push(`W${formatTokenCount2(summary.cacheWrite)}`),summary.latestCacheHitPercent!==void 0&&usageParts.push(`CH${summary.latestCacheHitPercent.toFixed(1)}%`),summary.cost>0&&usageParts.push(`$${summary.cost.toFixed(3)}${usesSubscription?" (sub)":""}`),usageParts.length===0?"":theme2.fg("dim",usageParts.join(" "))}function hasAnsiColor(text2){return text2.includes("\x1B[")}function formatExtensionStatuses(statuses,theme2){return Array.from(statuses.entries()).sort(([firstKey],[secondKey])=>firstKey.localeCompare(secondKey)).map(([,text2])=>sanitizeStatus(text2)).filter(Boolean).map(text2=>hasAnsiColor(text2)?text2:theme2.fg("muted",text2)).join(" ")}function layoutLeftRight(left,right,width,theme2){let ellipsis=theme2.fg("dim","...");if(width<=0)return"";if(!right)return truncateToWidth(left,width,ellipsis);if(!left){let rightWidth2=visibleWidth(right);return rightWidth2>=width?truncateToWidth(right,width,ellipsis):`${" ".repeat(width-rightWidth2)}${right}`}let leftText=left,rightText=right,leftWidth=visibleWidth(leftText),rightWidth=visibleWidth(rightText);if(leftWidth+rightWidth+MIN_GAP>width){let maxRightWidth=Math.min(rightWidth,Math.max(8,Math.floor(width*.45)));rightWidth>maxRightWidth&&(rightText=truncateToWidth(rightText,maxRightWidth,ellipsis),rightWidth=visibleWidth(rightText));let maxLeftWidth=width-rightWidth-MIN_GAP;if(maxLeftWidth<1)return truncateToWidth(rightText,width,ellipsis);leftText=truncateToWidth(leftText,maxLeftWidth,ellipsis),leftWidth=visibleWidth(leftText)}let gap=Math.max(MIN_GAP,width-leftWidth-rightWidth);return`${leftText}${" ".repeat(gap)}${rightText}`}function layoutSecondaryLine(contextText,statusText2,usageText,width,theme2){let ellipsis=theme2.fg("dim","...");if(!statusText2)return usageText?layoutLeftRight(contextText,usageText,width,theme2):truncateToWidth(contextText,width,ellipsis);let contextWidth=visibleWidth(contextText),usageWidth=visibleWidth(usageText),statusWidth=visibleWidth(statusText2);if(contextWidth+usageWidth+statusWidth+MIN_GAP*2<=width){let centerStart=Math.floor((width-statusWidth)/2),centeredLeftPad=centerStart-contextWidth,centeredRightPad=width-centerStart-statusWidth-usageWidth;if(centeredLeftPad>=MIN_GAP&¢eredRightPad>=MIN_GAP)return`${contextText}${" ".repeat(centeredLeftPad)}${statusText2}${" ".repeat(centeredRightPad)}${usageText}`;let free=width-contextWidth-usageWidth-statusWidth,leftPad=Math.floor(free/2),rightPad=free-leftPad;return`${contextText}${" ".repeat(leftPad)}${statusText2}${" ".repeat(rightPad)}${usageText}`}return layoutLeftRight(contextText,usageText,width,theme2)}function fitsLeftRight(left,right,width){return right?left?visibleWidth(left)+visibleWidth(right)+MIN_GAP<=width:visibleWidth(right)<=width:visibleWidth(left)<=width}function fitPrimaryLine(options){let{modelWithProvider,modelName,effortPart,cwdFull,cwdShort,branchPart,separator,width,theme:theme2}=options,leftRich=joinSegments([modelWithProvider,effortPart],separator),leftPlain=joinSegments([modelName,effortPart],separator),candidates=[{left:leftRich,right:joinSegments([cwdFull,branchPart],separator)},{left:leftRich,right:cwdFull},{left:leftRich,right:joinSegments([cwdShort,branchPart],separator)},{left:leftRich,right:cwdShort},{left:leftPlain,right:joinSegments([cwdShort,branchPart],separator)},{left:leftPlain,right:cwdShort},{left:leftPlain,right:""}];for(let candidate of candidates)if(fitsLeftRight(candidate.left,candidate.right,width))return layoutLeftRight(candidate.left,candidate.right,width,theme2);return layoutLeftRight(leftPlain,cwdShort,width,theme2)}function fitSecondaryLine(options){let{contextText,statusText:statusText2,usageCandidates,width,theme:theme2}=options;if(usageCandidates.length===0)return layoutSecondaryLine(contextText,statusText2,"",width,theme2);for(let usageText of usageCandidates)if(fitsLeftRight(contextText,usageText,width))return layoutSecondaryLine(contextText,statusText2,usageText,width,theme2);let fallbackUsage=usageCandidates[0]??"";return layoutLeftRight(contextText,fallbackUsage,width,theme2)}function statusline(pi){pi.on("session_start",(_event,ctx)=>{if(!isTui(ctx))return;let branchPathCache={current:null},branchStatsCache={current:null};ctx.ui.setFooter((tui,theme2,footerData)=>({dispose:footerData.onBranchChange(()=>tui.requestRender()),invalidate(){branchPathCache.current=null,branchStatsCache.current=null},render(width){let branchEntries=getBranchEntries(()=>ctx.sessionManager.getLeafId(),()=>ctx.sessionManager.getBranch(),branchPathCache),{thinkingLevel,usage:usageSummary}=getBranchStats(branchEntries,branchStatsCache),model=ctx.model,modelName=theme2.fg("toolTitle",theme2.bold(model?.name??model?.id??"no-model")),providerPart=model?.provider?theme2.fg("muted",`(${model.provider})`):"",modelWithProvider=providerPart?`${modelName} ${providerPart}`:modelName,effortPart="";model?.reasoning&&thinkingLevel!=="off"&&(effortPart=theme2.getThinkingBorderColor(thinkingLevel)(thinkingLevel));let separator=theme2.fg("dim"," \xB7 "),cwdDisplay=formatWorkingDirectory(ctx.cwd),cwdFull=theme2.fg("success",cwdDisplay),cwdShort=theme2.fg("success",pathBasename(cwdDisplay)),gitBranch=footerData.getGitBranch(),branchPart=gitBranch?theme2.fg("accent",gitBranch):"",primaryLine=fitPrimaryLine({modelWithProvider,modelName,effortPart,cwdFull,cwdShort,branchPart,separator,width,theme:theme2}),contextText=formatContextUsage(ctx,theme2),usesSubscription=model?ctx.modelRegistry.isUsingOAuth(model):!1,usageCandidates=[formatUsageSummary(usageSummary,usesSubscription,theme2,{includeCacheRead:!0,includeCacheWrite:!0}),formatUsageSummary(usageSummary,usesSubscription,theme2,{includeCacheRead:!0,includeCacheWrite:!1}),formatUsageSummary(usageSummary,usesSubscription,theme2,{includeCacheRead:!1,includeCacheWrite:!1})],uniqueUsageCandidates=[...new Set(usageCandidates.filter(Boolean))],statusText2=formatExtensionStatuses(footerData.getExtensionStatuses(),theme2),secondaryLine=fitSecondaryLine({contextText,statusText:statusText2,usageCandidates:uniqueUsageCandidates,width,theme:theme2});return[primaryLine,secondaryLine]}}))}),pi.on("session_shutdown",(_event,ctx)=>{isTui(ctx)&&ctx.ui.setFooter(void 0)})}var SUBAGENT_TOOL_NAME="subagent",SUBAGENT_TOOL_LABEL="Subagent",SUBAGENT_COMMAND_NAME="agents";var SUBAGENT_CONFIG_FILE="subagent.json";var SUBAGENT_AGENT_NAMES=["explorer","general"],DEFAULT_AGENT_TOOLS=["read","bash","edit","write"],EXPLORER_TOOLS=["read","grep","find","ls","bash"],THINKING_LEVELS2=["off","minimal","low","medium","high","xhigh","max"];var COMPACTION_ACTIVITY_ID="compaction";function plainLine(text2){return text2.replace(/^\s*#{1,6}\s+/u,"").replace(/`([^`]*)`/gu,"$1").replace(/\*\*([^*]+)\*\*/gu,"$1").replace(/\[([^\]]+)\]\([^)]*\)/gu,"$1").replace(/\s+/gu," ").trim()}function firstPlainLine(text2){return text2.split(`
|
|
1578
1592
|
`).map(line=>plainLine(line)).find(Boolean)??""}function truncate4(text2,limit){let characters=[...text2];return characters.length<=limit?text2:`${characters.slice(0,Math.max(0,limit-1)).join("")}\u2026`}function utf8Prefix(text2,maxBytes){if(maxBytes<=0)return"";if(Buffer.byteLength(text2,"utf8")<=maxBytes)return text2;let output="",bytes=0;for(let character of text2){let characterBytes=Buffer.byteLength(character,"utf8");if(bytes+characterBytes>maxBytes)break;output+=character,bytes+=characterBytes}return output}function boundText2(text2,maxBytes){if(maxBytes<=0)return"";if(Buffer.byteLength(text2,"utf8")<=maxBytes)return text2;let output=utf8Prefix(text2,maxBytes);for(let attempt2=0;attempt2<8;attempt2++){let notice2=`
|
|
1579
1593
|
|
|
1580
1594
|
[Output truncated: ${Buffer.byteLength(text2,"utf8")-Buffer.byteLength(output,"utf8")} bytes omitted.]`,available=maxBytes-Buffer.byteLength(notice2,"utf8");if(available<=0)return utf8Prefix("[Output truncated.]",maxBytes);let next=utf8Prefix(text2,available);if(next===output)return`${output}${notice2}`;output=next}let notice=`
|
|
@@ -1586,7 +1600,7 @@ ${detailLines.join(`
|
|
|
1586
1600
|
`)}var import_proper_lockfile5=__toESM(require_proper_lockfile(),1);import{mkdir as mkdir2,readFile as readFile6,rename as rename2,unlink as unlink3,writeFile as writeFile3}from"node:fs/promises";import{dirname as dirname24,join as join42}from"node:path";var LOCK_STALE_MS=1e4,LOCK_RETRY_OPTIONS={retries:5,factor:2,minTimeout:20,maxTimeout:200},BACKUP_ATTEMPTS=100;function isThinkingLevel(value2){return typeof value2=="string"&&THINKING_LEVELS2.includes(value2)}function normalizeOverride(value2,profile){if(!value2||typeof value2!="object"||Array.isArray(value2))throw new Error(`Profile override for "${profile}" must be an object.`);let input2=value2,output={};if(input2.model!==void 0){if(typeof input2.model!="string"||input2.model.trim().length===0||input2.model==="inherit")throw new Error(`Profile "${profile}" model override must be a concrete model id.`);output.model=input2.model.trim()}if(input2.thinking!==void 0){if(!isThinkingLevel(input2.thinking))throw new Error(`Profile "${profile}" thinking override is invalid.`);output.thinking=input2.thinking}let unknownKeys=Object.keys(input2).filter(key=>key!=="model"&&key!=="thinking");if(unknownKeys.length>0)throw new Error(`Profile "${profile}" has unsupported setting(s): ${unknownKeys.join(", ")}.`);return output}function getSubagentConfigPath(agentDir=getAgentDir()){return join42(agentDir,SUBAGENT_CONFIG_FILE)}function emptySubagentConfig(){return{version:1,profiles:{}}}function parseSubagentConfig(raw){let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error(`${SUBAGENT_CONFIG_FILE} is not valid JSON.`)}if(!parsed||typeof parsed!="object"||Array.isArray(parsed))throw new Error(`${SUBAGENT_CONFIG_FILE} must be a JSON object.`);let root=parsed;if(root.version!==1)throw new Error(`${SUBAGENT_CONFIG_FILE} has unsupported version ${String(root.version)}.`);if(root.profiles!==void 0&&(!root.profiles||typeof root.profiles!="object"||Array.isArray(root.profiles)))throw new Error(`${SUBAGENT_CONFIG_FILE} profiles must be an object.`);let profiles={};for(let[name,value2]of Object.entries(root.profiles??{})){if(!SUBAGENT_AGENT_NAMES.includes(name))throw new Error(`${SUBAGENT_CONFIG_FILE} contains unknown profile "${name}".`);profiles[name]=normalizeOverride(value2,name)}let unknownKeys=Object.keys(root).filter(key=>key!=="version"&&key!=="profiles");if(unknownKeys.length>0)throw new Error(`${SUBAGENT_CONFIG_FILE} has unsupported field(s): ${unknownKeys.join(", ")}.`);return{version:1,profiles}}function errorMessage4(error){return error instanceof Error?error.message:String(error)}function configWarning(filePath,error){return`Ignoring invalid Subagent settings at ${filePath}; the file was left unchanged. ${errorMessage4(error)}`}async function loadSubagentConfig(agentDir=getAgentDir(),onWarning){let filePath=getSubagentConfigPath(agentDir);try{return parseSubagentConfig(await readFile6(filePath,"utf8"))}catch(error){return error.code==="ENOENT"||onWarning?.(configWarning(filePath,error)),emptySubagentConfig()}}async function writeSubagentConfigFile(filePath,config){let payload=`${JSON.stringify({version:1,profiles:config.profiles},null,2)}
|
|
1587
1601
|
`;await mkdir2(dirname24(filePath),{recursive:!0});let tempPath=`${filePath}.${process.pid}.${Date.now()}.tmp`;try{await writeFile3(tempPath,payload,{encoding:"utf8",mode:384}),await rename2(tempPath,filePath)}catch(error){try{await unlink3(tempPath)}catch{}throw error}}async function backUpInvalidConfig(filePath,raw){for(let attempt2=0;attempt2<BACKUP_ATTEMPTS;attempt2++){let suffix=attempt2===0?"":`-${attempt2}`,backupPath=`${filePath}.invalid-${Date.now()}-${process.pid}${suffix}.bak`;try{return await writeFile3(backupPath,raw,{encoding:"utf8",mode:384,flag:"wx"}),backupPath}catch(error){if(error.code==="EEXIST")continue;throw new Error(`Could not back up invalid ${SUBAGENT_CONFIG_FILE}: ${errorMessage4(error)}`)}}throw new Error(`Could not allocate a backup path for invalid ${SUBAGENT_CONFIG_FILE}.`)}async function withSubagentConfigLock(filePath,fn){await mkdir2(dirname24(filePath),{recursive:!0});let release2;try{release2=await import_proper_lockfile5.default.lock(filePath,{realpath:!1,stale:LOCK_STALE_MS,retries:LOCK_RETRY_OPTIONS})}catch(error){throw error.code==="ELOCKED"?new Error(`Timed out waiting to update ${SUBAGENT_CONFIG_FILE}; another Pi process is saving it.`):error}try{return await fn()}finally{await release2()}}async function readConfigForMutation(filePath){let raw;try{raw=await readFile6(filePath,"utf8")}catch(error){if(error.code==="ENOENT")return{config:emptySubagentConfig()};throw error}try{return{config:parseSubagentConfig(raw)}}catch{return{config:emptySubagentConfig(),invalidRaw:raw}}}async function updateProfileOverride(profile,patch,agentDir=getAgentDir()){let filePath=getSubagentConfigPath(agentDir);return withFileMutationQueue2(filePath,()=>withSubagentConfigLock(filePath,async()=>{let{config,invalidRaw}=await readConfigForMutation(filePath),currentOverride=config.profiles[profile],current=currentOverride??{},next={...current};"model"in patch&&(patch.model===void 0?delete next.model:next.model=patch.model),"thinking"in patch&&(patch.thinking===void 0?delete next.thinking:next.thinking=patch.thinking);let hasNext=Object.keys(next).length>0;return(currentOverride!==void 0!==hasNext||current.model!==next.model||current.thinking!==next.thinking)&&(invalidRaw!==void 0&&await backUpInvalidConfig(filePath,invalidRaw),hasNext?config.profiles[profile]=next:delete config.profiles[profile],await writeSubagentConfigFile(filePath,config)),config}))}function modelId(model){return model?`${model.provider}/${model.id}`:"none"}function parseModelSpec(value2){let separator=value2.indexOf("/");return separator>0?{provider:value2.slice(0,separator),id:value2.slice(separator+1)}:{provider:"",id:value2}}function findModel(models,value2){if(value2)return models.find(model=>modelId(model)===value2)}function findAvailableModel(spec,registry){let normalized=spec.trim(),model;if(normalized.includes("/")){let{provider,id}=parseModelSpec(normalized);model=registry.find(provider,id)}else{let matches=registry.getAvailable().filter(candidate=>candidate.id===normalized);if(matches.length===1&&(model=matches[0]),matches.length>1)throw new Error(`Model id "${normalized}" is ambiguous; use provider/model.`)}if(!model)throw new Error(`Model "${normalized}" is not available.`);if(!registry.hasConfiguredAuth(model))throw new Error(`Model "${normalized}" has no configured authentication.`);return model}function effectiveModel(currentSessionModel,models,override){if(override?.model){let saved=findModel(models,override.model);if(saved)return saved}return currentSessionModel}function inheritedThinking(effective,currentThinking){return effective?clampThinkingLevel(effective,currentThinking):currentThinking}function compareModels(left,right){let provider=left.provider.localeCompare(right.provider);return provider!==0?provider:left.id.localeCompare(right.id)}function buildSettingsRows(options){let effective=effectiveModel(options.currentSessionModel,options.models,options.override);return[{action:"model",label:"Model",value:options.override?.model?`override \u2014 ${options.override.model}${findModel(options.models,options.override.model)?"":" [unavailable]"}`:`inherit \u2014 ${modelId(options.currentSessionModel)}`,override:options.override?.model!==void 0},{action:"thinking",label:"Thinking",value:options.override?.thinking?`override \u2014 ${options.override.thinking}`:`inherit \u2014 ${inheritedThinking(effective,options.currentThinking)}`,override:options.override?.thinking!==void 0}]}function buildModelChoices(options){let choices=new Map;choices.set(`inherit (${modelId(options.currentSessionModel)})${options.savedModelId?"":" \u2713"}`,void 0),options.savedModelId&&!findModel(options.models,options.savedModelId)&&choices.set(`${options.savedModelId} [unavailable] \u2713`,options.savedModelId);for(let model of options.models){let id=modelId(model);choices.set(`${id}${options.savedModelId===id?" \u2713":""}`,id)}return choices}function buildThinkingChoices(options){let effective=effectiveModel(options.currentSessionModel,options.models,options.override),levels=effective?getSupportedThinkingLevels(effective):[...THINKING_LEVELS2],inherited=inheritedThinking(effective,options.currentThinking),choices=new Map;choices.set(`inherit (${inherited})${options.override?.thinking?"":" \u2713"}`,void 0);for(let level of levels)choices.set(`${level}${options.override?.thinking===level?" \u2713":""}`,level);return choices}async function persistOverride(ctx,profile,patch){try{return await updateProfileOverride(profile.name,patch,getAgentDir())}catch(error){ctx.ui.notify(`Could not save ${AGENT_PROFILE_LABELS[profile.name]} settings: ${error instanceof Error?error.message:String(error)}`,"error");return}}async function selectProfile(ctx){let labels=AGENT_PROFILES.map(profile=>AGENT_PROFILE_LABELS[profile.name]),label=await ctx.ui.select("Agents",labels);return label===void 0?void 0:AGENT_PROFILES.find(profile=>AGENT_PROFILE_LABELS[profile.name]===label)}async function showDialogSettingsMenu(ctx,profile,override,currentThinking){let options=new Map;for(let row of buildSettingsRows({override,models:ctx.modelRegistry.getAvailable(),currentSessionModel:ctx.model,currentThinking}))options.set(`${row.label} \u2014 ${row.value}`,row.action);let label=await ctx.ui.select(AGENT_PROFILE_LABELS[profile.name],[...options.keys()]);return label===void 0?void 0:options.get(label)}async function showDialogModelPicker(ctx,profile,override){let models=[...ctx.modelRegistry.getAvailable()].sort(compareModels),choices=buildModelChoices({models,currentSessionModel:ctx.model,savedModelId:override?.model}),label=await ctx.ui.select(`Model \u2014 ${AGENT_PROFILE_LABELS[profile.name]}`,[...choices.keys()]);return label===void 0?void 0:{modelId:choices.get(label)}}async function showDialogThinkingPicker(ctx,profile,override,currentThinking){let choices=buildThinkingChoices({currentSessionModel:ctx.model,models:ctx.modelRegistry.getAvailable(),override,currentThinking}),label=await ctx.ui.select(`Thinking \u2014 ${AGENT_PROFILE_LABELS[profile.name]}`,[...choices.keys()]);return label===void 0?void 0:{level:choices.get(label)}}async function runDialogProfileSettings(ctx,profile,currentThinking){let agentDir=getAgentDir();for(;;){let override=(await loadSubagentConfig(agentDir,message=>ctx.ui.notify(message,"warning"))).profiles[profile.name],action=await showDialogSettingsMenu(ctx,profile,override,currentThinking);if(!action)return;if(action==="model"){let chosen=await showDialogModelPicker(ctx,profile,override);if(!chosen)continue;await persistOverride(ctx,profile,{model:chosen.modelId})}else{let chosen=await showDialogThinkingPicker(ctx,profile,override,currentThinking);if(!chosen)continue;await persistOverride(ctx,profile,{thinking:chosen.level})}}}async function showDialogAgentsCommand(ctx,currentThinking){for(;;){let profile=await selectProfile(ctx);if(!profile)return;await runDialogProfileSettings(ctx,profile,currentThinking)}}function hint(theme2,keybindings,binding,description){let key=keyLabel(binding,{keybindings});return key?`${theme2.fg("dim",key)}${theme2.fg("muted",` ${description}`)}`:""}function navigationHint(theme2,keybindings){let keys=[keyLabel("tui.select.up",{keybindings}),keyLabel("tui.select.down",{keybindings})].filter(Boolean).join("/");return keys?`${theme2.fg("dim",keys)}${theme2.fg("muted"," navigate")}`:""}var ChoiceMenuComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2}constructor(options){super(),this._focused=!1,this.theme=options.theme,this.keybindings=options.keybindings,this.choices=options.choices,this.onDone=options.onDone,this.title=options.title,this.cancelDescription=options.cancelDescription,this.selectedIndex=Math.min(Math.max(options.initialIndex??0,0),Math.max(0,options.choices.length-1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.titleText=new Text("",1,0),this.addChild(this.titleText),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.hintText=new Text("",1,0),this.addChild(this.hintText),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.updateStaticText(),this.updateList()}updateStaticText(){this.titleText.setText(this.theme.fg("accent",this.theme.bold(this.title)));let hints=[navigationHint(this.theme,this.keybindings),hint(this.theme,this.keybindings,"tui.select.confirm","select"),hint(this.theme,this.keybindings,"tui.select.cancel",this.cancelDescription)].filter(Boolean);this.hintText.setText(hints.join(this.theme.fg("muted"," \u2022 ")))}updateList(){this.listContainer.clear();for(let[index3,choice]of this.choices.entries()){let selected=index3===this.selectedIndex,prefix=selected?this.theme.fg("accent","\u2192 "):" ",label=this.theme.fg(selected?"accent":"text",choice.label);this.listContainer.addChild(new TruncatedText(`${prefix}${label}`,1,0))}}moveSelection(offset){this.choices.length!==0&&(this.selectedIndex=(this.selectedIndex+offset+this.choices.length)%this.choices.length,this.updateList())}invalidate(){this.updateStaticText(),this.updateList(),super.invalidate()}handleInput(data){if(this.keybindings.matches(data,"tui.select.up"))this.moveSelection(-1);else if(this.keybindings.matches(data,"tui.select.down"))this.moveSelection(1);else if(this.keybindings.matches(data,"tui.select.confirm")){let choice=this.choices[this.selectedIndex];choice&&this.onDone(choice)}else this.keybindings.matches(data,"tui.select.cancel")&&this.onDone(void 0)}};var MAX_VISIBLE_MODELS=10;function modelSearchText(item){return item.modelId===void 0?`inherit ${item.model?getModelSelectorSearchText(item.model):""}`:getModelSelectorSearchText(item)}var ProfileModelListComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.searchInput.focused=value2}constructor(options){super(),this.allChoices=[],this.scopedChoices=[],this.activeChoices=[],this.filteredChoices=[],this.selectedIndex=0,this.statusTone="muted",this._focused=!1,this.theme=options.theme,this.keybindings=options.keybindings,this.models=[...options.models],this.currentSessionModel=options.currentSessionModel,this.savedModelId=options.savedModelId,this.scopedModelKeys=new Set(options.scopedModels.map(({model})=>modelId(model))),this.scope=this.scopedModelKeys.size>0?"scoped":"all",this.onDone=options.onDone,this.scopeContainer=new Container,this.addChild(this.scopeContainer),this.searchInput=new Input,this.addChild(this.searchInput),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.rebuildChoices(this.savedModelId??"")}makeInheritChoice(){return{key:"",modelId:void 0,model:this.currentSessionModel,unavailable:!1,provider:this.currentSessionModel?.provider??"",id:"inherit",name:this.currentSessionModel?.name}}makeModelChoice(model){return{key:modelId(model),modelId:modelId(model),model,unavailable:!1,provider:model.provider,id:model.id,name:model.name}}makeUnavailableChoice(modelId2){let parsed=parseModelSpec(modelId2);return{key:modelId2,modelId:modelId2,model:void 0,unavailable:!0,provider:parsed.provider,id:parsed.id,name:void 0}}buildChoices(models){let sorted=[...models].sort(compareModels),availableById=new Map(this.models.map(model=>[modelId(model),model])),choices=[this.makeInheritChoice()];if(this.savedModelId){let saved=availableById.get(this.savedModelId);choices.push(saved?this.makeModelChoice(saved):this.makeUnavailableChoice(this.savedModelId))}for(let model of sorted)modelId(model)!==this.savedModelId&&choices.push(this.makeModelChoice(model));return choices}rebuildChoices(preferredKey){let currentKey=preferredKey??this.filteredChoices[this.selectedIndex]?.key??this.savedModelId??"";this.allChoices=this.buildChoices(this.models);let scopedModels=this.models.filter(model=>this.scopedModelKeys.has(modelId(model)));this.scopedChoices=this.buildChoices(scopedModels),this.activeChoices=this.scope==="scoped"?this.scopedChoices:this.allChoices,this.applyFilter(this.searchInput.getValue(),currentKey,!1),this.updateScopeView()}applyFilter(query,preferredKey,resetSelection=!0){if(this.filteredChoices=query?fuzzyFilter(this.activeChoices,query,modelSearchText):this.activeChoices,preferredKey!==void 0){let preferredIndex=this.filteredChoices.findIndex(choice=>choice.key===preferredKey);this.selectedIndex=preferredIndex>=0?preferredIndex:0}else query&&resetSelection?this.selectedIndex=0:this.selectedIndex=Math.min(this.selectedIndex,Math.max(0,this.filteredChoices.length-1));this.updateList()}updateScopeView(){if(this.scopeContainer.clear(),this.scopedModelKeys.size===0){this.scopeContainer.addChild(new Text(this.theme.fg("warning","Only showing models from configured providers. Use /login to add providers."),0,0)),this.scopeContainer.addChild(new Spacer(1));return}let all=this.scope==="all"?this.theme.fg("accent","all"):this.theme.fg("muted","all"),scoped=this.scope==="scoped"?this.theme.fg("accent","scoped"):this.theme.fg("muted","scoped");this.scopeContainer.addChild(new Text(`${this.theme.fg("muted","Scope: ")}${all}${this.theme.fg("muted"," | ")}${scoped}`,0,0)),this.scopeContainer.addChild(new Spacer(1))}choiceLabel(choice){if(choice.modelId===void 0){let inherited=choice.model?modelId(choice.model):"none";return`inherit ${this.theme.fg("muted",`(${inherited})`)}`}if(choice.unavailable){let badge=choice.provider?`${choice.provider} \xB7 unavailable`:"unavailable";return`${choice.id} ${this.theme.fg("warning",`[${badge}]`)}`}return`${choice.id} ${this.theme.fg("muted",`[${choice.provider}]`)}`}updateList(){this.listContainer.clear();let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(MAX_VISIBLE_MODELS/2),this.filteredChoices.length-MAX_VISIBLE_MODELS)),endIndex=Math.min(startIndex+MAX_VISIBLE_MODELS,this.filteredChoices.length);for(let index3=startIndex;index3<endIndex;index3++){let choice=this.filteredChoices[index3];if(!choice)continue;let selected=index3===this.selectedIndex,saved=choice.modelId===this.savedModelId,prefix=selected?this.theme.fg("accent","\u2192 "):" ",label=this.choiceLabel(choice),styledLabel=selected?this.theme.fg("accent",label):label,checkmark=saved?this.theme.fg("success"," \u2713"):"";this.listContainer.addChild(new TruncatedText(`${prefix}${styledLabel}${checkmark}`,0,0))}if((startIndex>0||endIndex<this.filteredChoices.length)&&this.listContainer.addChild(new TruncatedText(this.theme.fg("muted",` (${this.selectedIndex+1}/${this.filteredChoices.length})`),0,0)),this.filteredChoices.length===0)this.listContainer.addChild(new Text(this.theme.fg("muted"," No matching models"),0,0));else{let selected=this.filteredChoices[this.selectedIndex];selected?.model?.name&&(this.listContainer.addChild(new Spacer(1)),this.listContainer.addChild(new Text(this.theme.fg("muted",` Model Name: ${selected.model.name}`),0,0)))}this.statusMessage&&(this.listContainer.addChild(new Spacer(1)),this.listContainer.addChild(new Text(this.theme.fg(this.statusTone,` ${this.statusMessage}`),0,0)))}moveSelection(offset){this.filteredChoices.length!==0&&(this.selectedIndex=(this.selectedIndex+offset+this.filteredChoices.length)%this.filteredChoices.length,this.updateList())}toggleScope(){if(this.scopedModelKeys.size===0)return;let currentKey=this.filteredChoices[this.selectedIndex]?.key;this.scope=this.scope==="all"?"scoped":"all",this.activeChoices=this.scope==="scoped"?this.scopedChoices:this.allChoices,this.applyFilter(this.searchInput.getValue(),currentKey,!1),this.updateScopeView()}getSelectedChoice(){let selected=this.filteredChoices[this.selectedIndex];if(selected)return{modelId:selected.modelId,model:selected.model,unavailable:selected.unavailable}}updateModels(models){let selectedKey=this.filteredChoices[this.selectedIndex]?.key;this.models=[...models],this.rebuildChoices(selectedKey)}setStatus(message,tone="muted"){this.statusMessage=message,this.statusTone=tone,this.updateList()}invalidate(){this.updateScopeView(),this.updateList(),super.invalidate()}handleInput(data){if(this.keybindings.matches(data,"tui.input.tab"))this.toggleScope();else if(this.keybindings.matches(data,"tui.select.up"))this.moveSelection(-1);else if(this.keybindings.matches(data,"tui.select.down"))this.moveSelection(1);else if(this.keybindings.matches(data,"tui.select.confirm")){let selected=this.getSelectedChoice();selected&&this.onDone(selected)}else this.keybindings.matches(data,"tui.select.cancel")?this.onDone(void 0):(this.searchInput.handleInput(data),this.applyFilter(this.searchInput.getValue()))}};var MODEL_REFRESH_TIMEOUT_MS=15e3,MAX_REFRESH_ERROR_LENGTH=240;function refreshFailureMessage(providerIds){if(providerIds.length===1)return`Could not refresh ${providerIds[0]}; showing cached models.`;let visible=providerIds.slice(0,3),omitted=providerIds.length-visible.length,suffix=omitted>0?`, +${omitted} more`:"";return`Could not refresh ${providerIds.length} model catalogs (${visible.join(", ")}${suffix}); showing cached models.`}var ModelPickerComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.modelList.focused=value2}constructor(options){super(),this.refreshAbortController=new AbortController,this.closed=!1,this._focused=!1,this.tui=options.tui,this.theme=options.theme,this.keybindings=options.keybindings,this.title=`Model \u2014 ${AGENT_PROFILE_LABELS[options.profile.name]}`,this.hasScopedModels=options.scopedModels.length>0,this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.titleText=new Text("",1,0),this.addChild(this.titleText),this.addChild(new Spacer(1)),this.modelList=new ProfileModelListComponent({theme:options.theme,keybindings:options.keybindings,models:options.models,scopedModels:options.scopedModels,currentSessionModel:options.currentSessionModel,savedModelId:options.savedModelId,onDone:options.onDone}),this.addChild(this.modelList),this.addChild(new Spacer(1)),this.hintText=new Text("",1,0),this.addChild(this.hintText),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.updateStaticText()}updateStaticText(){this.titleText.setText(this.theme.fg("accent",this.theme.bold(this.title)));let hints=[navigationHint(this.theme,this.keybindings),this.hasScopedModels?hint(this.theme,this.keybindings,"tui.input.tab","scope"):"",hint(this.theme,this.keybindings,"tui.select.confirm","select"),hint(this.theme,this.keybindings,"tui.select.cancel","back")].filter(Boolean);this.hintText.setText(hints.join(this.theme.fg("muted"," \u2022 ")))}get refreshSignal(){return this.refreshAbortController.signal}cancelRefresh(){this.refreshAbortController.abort()}get isClosed(){return this.closed}dispose(){this.closed=!0,this.refreshAbortController.abort()}updateModels(models){this.closed||(this.modelList.updateModels(models),this.tui.requestRender())}setRefreshStatus(message,tone="muted"){this.closed||(this.modelList.setStatus(message,tone),this.tui.requestRender())}invalidate(){this.updateStaticText(),super.invalidate()}handleInput(data){this.modelList.handleInput(data)}};async function refreshPickerModels(ctx,picker){let timedOut=!1,timeout=setTimeout(()=>{timedOut=!0,picker.cancelRefresh()},MODEL_REFRESH_TIMEOUT_MS);timeout.unref?.();try{let result2=await refreshModelCatalogs(ctx.modelRuntime,picker.refreshSignal);if(picker.isClosed||picker.refreshSignal.aborted&&!timedOut)return;if(picker.updateModels(ctx.modelRegistry.getAvailable()),result2.aborted&&timedOut){picker.setRefreshStatus("Model refresh timed out; showing cached models.","error");return}let providerIds=[...result2.errors.keys()];if(providerIds.length>0){picker.setRefreshStatus(refreshFailureMessage(providerIds),"error");return}let registryError=ctx.modelRegistry.getError?.();if(registryError){picker.setRefreshStatus(truncate4(registryError,MAX_REFRESH_ERROR_LENGTH),"error");return}picker.setRefreshStatus(void 0)}catch(error){if(picker.isClosed||picker.refreshSignal.aborted&&!timedOut)return;let message=timedOut?"Model refresh timed out; showing cached models.":`Could not refresh model catalogs: ${error instanceof Error?error.message:String(error)}`;picker.setRefreshStatus(truncate4(message,MAX_REFRESH_ERROR_LENGTH),"error")}finally{clearTimeout(timeout)}}var ProfileSettingsMenuComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2}constructor(options){super(),this.selectedIndex=0,this._focused=!1,this.theme=options.theme,this.keybindings=options.keybindings,this.onDone=options.onDone,this.title=AGENT_PROFILE_LABELS[options.profile.name],this.status=options.status,this.rows=buildSettingsRows({override:options.override,models:options.models,currentSessionModel:options.currentSessionModel,currentThinking:options.currentThinking}),this.selectedIndex=Math.max(0,this.rows.findIndex(row=>row.action===options.selectedAction)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.titleText=new Text("",1,0),this.addChild(this.titleText),this.addChild(new Spacer(1)),this.listContainer=new Container,this.addChild(this.listContainer),this.addChild(new Spacer(1)),this.status?(this.statusText=new Text("",1,0),this.addChild(this.statusText),this.addChild(new Spacer(1))):this.statusText=void 0,this.hintText=new Text("",1,0),this.addChild(this.hintText),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.updateStaticText(),this.updateList()}updateStaticText(){this.titleText.setText(this.theme.fg("accent",this.theme.bold(this.title))),this.statusText?.setText(this.theme.fg("muted",this.status??""));let hints=[navigationHint(this.theme,this.keybindings),hint(this.theme,this.keybindings,"tui.select.confirm","select"),hint(this.theme,this.keybindings,"tui.select.cancel","back")].filter(Boolean);this.hintText.setText(hints.join(this.theme.fg("muted"," \u2022 ")))}updateList(){this.listContainer.clear();for(let[index3,row]of this.rows.entries()){let selected=index3===this.selectedIndex,prefix=selected?this.theme.fg("accent","\u2192 "):" ",label=selected?this.theme.fg("accent",row.label):this.theme.fg("text",row.label),value2=this.theme.fg("muted",`\u2014 ${row.value}`),checkmark=row.override?this.theme.fg("success"," \u2713"):"";this.listContainer.addChild(new TruncatedText(`${prefix}${label} ${value2}${checkmark}`,1,0))}}moveSelection(offset){this.selectedIndex=(this.selectedIndex+offset+this.rows.length)%this.rows.length,this.updateList()}invalidate(){this.updateStaticText(),this.updateList(),super.invalidate()}handleInput(data){this.keybindings.matches(data,"tui.select.up")?this.moveSelection(-1):this.keybindings.matches(data,"tui.select.down")?this.moveSelection(1):this.keybindings.matches(data,"tui.select.confirm")?this.onDone(this.rows[this.selectedIndex]?.action):this.keybindings.matches(data,"tui.select.cancel")&&this.onDone(void 0)}};async function persistOverride2(ctx,profile,patch){try{return await updateProfileOverride(profile.name,patch,getAgentDir())}catch(error){ctx.ui.notify(`Could not save ${AGENT_PROFILE_LABELS[profile.name]} settings: ${error instanceof Error?error.message:String(error)}`,"error");return}}var AgentsMenuComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.activeScreen&&isFocusable(this.activeScreen)&&(this.activeScreen.focused=value2)}constructor(options){super(),this.route={kind:"profiles"},this.selectedSettingsAction="model",this.saving=!1,this.closed=!1,this._focused=!1,this.tui=options.tui,this.theme=options.theme,this.keybindings=options.keybindings,this.ctx=options.ctx,this.currentThinking=options.currentThinking,this.config=options.config,this.onDone=options.onDone,this.showProfiles()}disposeActiveScreen(){let screen=this.activeScreen;if(this.activeScreen=void 0,!screen)return;let disposable=screen;isFocusable(screen)&&(screen.focused=!1),disposable.dispose?.()}setActiveScreen(screen){this.disposeActiveScreen(),this.clear(),this.activeScreen=screen,this.addChild(screen),isFocusable(screen)&&(screen.focused=this._focused),this.tui.requestRender()}showProfiles(){this.route={kind:"profiles"};let choices=AGENT_PROFILES.map(profile=>({label:AGENT_PROFILE_LABELS[profile.name],value:profile})),initialIndex=choices.findIndex(choice=>choice.value.name===this.selectedProfile?.name);this.setActiveScreen(new ChoiceMenuComponent({theme:this.theme,keybindings:this.keybindings,title:"Agents",choices,initialIndex,cancelDescription:"close",onDone:choice=>{if(!choice){this.onDone();return}this.selectedProfile=choice.value,this.selectedSettingsAction="model",this.showSettings(choice.value)}}))}showSettings(profile,selectedAction=this.selectedSettingsAction){this.selectedProfile=profile,this.selectedSettingsAction=selectedAction,this.route={kind:"settings",profile,selectedAction},this.setActiveScreen(new ProfileSettingsMenuComponent({theme:this.theme,keybindings:this.keybindings,profile,override:this.config.profiles[profile.name],models:this.ctx.modelRegistry.getAvailable(),currentSessionModel:this.ctx.model,currentThinking:this.currentThinking,selectedAction,status:this.saving?"Saving\u2026":void 0,onDone:action=>{if(!action){this.showProfiles();return}this.selectedSettingsAction=action,action==="model"?this.showModelPicker(profile):this.showThinkingPicker(profile)}}))}showModelPicker(profile){this.route={kind:"model",profile};let override=this.config.profiles[profile.name],picker=new ModelPickerComponent({tui:this.tui,theme:this.theme,keybindings:this.keybindings,profile,savedModelId:override?.model,models:this.ctx.modelRegistry.getAvailable(),scopedModels:this.ctx.scopedModels,currentSessionModel:this.ctx.model,onDone:choice=>{if(!choice){this.showSettings(profile,"model");return}this.saveOverride(profile,{model:choice.modelId},"model")}});picker.setRefreshStatus("Refreshing model catalogs\u2026"),this.setActiveScreen(picker),refreshPickerModels(this.ctx,picker)}showThinkingPicker(profile){this.route={kind:"thinking",profile};let override=this.config.profiles[profile.name],choices=[...buildThinkingChoices({currentSessionModel:this.ctx.model,models:this.ctx.modelRegistry.getAvailable(),override,currentThinking:this.currentThinking}).entries()].map(([label,level])=>({label,value:level})),initialIndex=choices.findIndex(choice=>choice.label.endsWith(" \u2713"));this.setActiveScreen(new ChoiceMenuComponent({theme:this.theme,keybindings:this.keybindings,title:`Thinking \u2014 ${AGENT_PROFILE_LABELS[profile.name]}`,choices,initialIndex,cancelDescription:"back",onDone:choice=>{if(!choice){this.showSettings(profile,"thinking");return}this.saveOverride(profile,{thinking:choice.value},"thinking")}}))}saveOverride(profile,patch,returnAction){this.saving||(this.saving=!0,this.showSettings(profile,returnAction),persistOverride2(this.ctx,profile,patch).then(config=>this.completeSave(profile,config),()=>this.completeSave(profile,void 0)).catch(()=>{}))}completeSave(profile,config){this.closed||(this.saving=!1,config&&(this.config=config),this.route.kind==="settings"&&this.route.profile.name===profile.name&&this.showSettings(profile,this.route.selectedAction))}handleInput(data){if(!this.saving){this.activeScreen?.handleInput?.(data);return}this.keybindings.matches(data,"tui.select.cancel")&&(this.route.kind==="settings"?this.showProfiles():this.route.kind==="profiles"&&this.onDone())}dispose(){this.closed=!0,this.disposeActiveScreen(),this.clear()}};async function showTuiAgentsCommand(ctx,currentThinking){let config=await loadSubagentConfig(getAgentDir(),message=>ctx.ui.notify(message,"warning"));await ctx.ui.custom((tui,theme2,keybindings,done)=>new AgentsMenuComponent({tui,theme:theme2,keybindings,ctx,currentThinking,config,onDone:()=>done()}))}async function showAgentsCommand(ctx,currentThinking){if(!ctx.hasUI){ctx.ui.notify("/agents requires an interactive UI.","warning");return}ctx.mode==="tui"?await showTuiAgentsCommand(ctx,currentThinking):await showDialogAgentsCommand(ctx,currentThinking)}import{relative as relative8}from"node:path";function runId(batchId,index3){if(!batchId)return`subagent-${index3+1}`;let sanitized=batchId.replace(/[^A-Za-z0-9-]+/gu,"-").replace(/^-+|-+$/gu,""),hash=hashRunId(batchId);return`${sanitized.length>24?`${sanitized.slice(0,24)}-${hash}`:sanitized||`run-${hash}`}-${index3+1}`}function hashRunId(value2){let hash=2166136261;for(let index3=0;index3<value2.length;index3++)hash^=value2.charCodeAt(index3),hash=Math.imul(hash,16777619);return(hash>>>0).toString(36).padStart(6,"0").slice(0,6)}function createRunState(task,index3,batchId,parentCwd){return{id:runId(batchId,index3),agent:task.agent.name,description:task.description,cwd:relative8(parentCwd,task.cwd),model:modelId(task.model),thinking:task.thinking,status:"queued",activities:[],report:"",reportTruncated:!1,usage:emptyUsage3(),version:0}}function toRunDetails(state2){let{version:_version,reportTruncated:_reportTruncated,...details}=state2;return details}function deriveCurrentActivity(state2){if(!(state2.status==="completed"||state2.status==="failed"||state2.status==="aborted")){if(state2.retry)return`Retrying (${state2.retry.attempt}/${state2.retry.maxAttempts})\u2026`;for(let index3=state2.activities.length-1;index3>=0;index3--){let activity=state2.activities[index3];if(activity?.status==="running")return activity.summary}}}function positiveInteger(value2,fallback){return Number.isFinite(value2)?Math.max(1,Math.floor(value2)):fallback}function retryError(error){let normalized=error.replace(/\s+/gu," ").trim();return boundText2(normalized,160).replace(/\s+/gu," ").trim()}function makeRetry(attempt2,maxAttempts,deadline,error){let normalizedAttempt=positiveInteger(attempt2,1);return{attempt:normalizedAttempt,maxAttempts:Math.max(normalizedAttempt,positiveInteger(maxAttempts,normalizedAttempt)),deadline,error:retryError(error)}}function oldestEvictableActivityIndex(activities){let protectedIndexes=new Set;for(let index3=activities.length-1;index3>=0&&protectedIndexes.size<3;index3--){let activity=activities[index3];activity&&isDisplayableActivity(activity)&&protectedIndexes.add(index3)}let unprotected=activities.findIndex((_activity,index3)=>!protectedIndexes.has(index3));return unprotected>=0?unprotected:activities.length>1?0:-1}function activityTextSize(activities){return activities.reduce((total,item)=>total+item.summary.length+(item.resultSummary?.length??0),0)}function enforceActivityLimits(activities){for(;activities.length>80;){let index3=oldestEvictableActivityIndex(activities);if(index3<0)break;activities.splice(index3,1)}for(;activityTextSize(activities)>24576;){let index3=oldestEvictableActivityIndex(activities);if(index3<0)break;activities.splice(index3,1)}}function appendActivity(activities,activity){activities.push(activity),enforceActivityLimits(activities)}function isTerminal(state2){return state2.status==="completed"||state2.status==="failed"||state2.status==="aborted"}function withRevision(state2,mutate){let draft={...state2,activities:state2.activities.map(activity=>({...activity})),usage:{...state2.usage}};return mutate(draft),draft.version=state2.version+1,draft}function clearRetry(draft){draft.retry=void 0}function reduceRun(state2,event){return isTerminal(state2)&&event.type!=="retry_scheduled"?state2:withRevision(state2,draft=>{event.type!=="retry_scheduled"&&clearRetry(draft),applyEvent(draft,event),draft.currentActivity=deriveCurrentActivity(draft)})}function handleSlotAcquired(draft,event){draft.status="running",draft.startedAt=event.startedAt}function handleRetryScheduled(draft,event){let error=draft.error??"Subagent failed before retry.";draft.status="queued",draft.error=void 0,draft.startedAt=void 0,draft.endedAt=void 0,draft.report="",draft.reportTruncated=!1,draft.activities=[],draft.usage.turns=0,draft.usage.toolUses=0,draft.usage.contextTokens=void 0,draft.retry=makeRetry(event.attempt,event.maxAttempts,event.deadline,error)}function handleAutoRetryStart(draft,event){draft.retry=makeRetry(event.attempt,event.maxAttempts,event.deadline,event.error)}function handleTurnEnd(draft){draft.usage.turns++}function handleAssistantMessageSettled(draft,event){addUsage2(draft.usage,event.usage)}function handleToolStarted(draft,event){draft.usage.toolUses++,appendActivity(draft.activities,{id:event.toolCallId,toolName:event.toolName,summary:activitySummary(event.toolName,event.args),status:"running",startedAt:event.startedAt})}function handleToolUpdated(draft,event){let summary=activitySummary(event.toolName,event.args),activity=draft.activities.find(candidate=>candidate.id===event.toolCallId&&candidate.status==="running")??[...draft.activities].reverse().find(candidate=>candidate.status==="running");activity&&(activity.summary=summary,enforceActivityLimits(draft.activities))}function handleToolEnded(draft,event){let activity=draft.activities.find(candidate=>candidate.id===event.toolCallId);activity&&activity.status==="running"&&(activity.status=event.isError?"failed":"succeeded",activity.endedAt=event.endedAt,activity.resultSummary=resultSummary(event.result)||void 0,enforceActivityLimits(draft.activities))}function handleCompactionStarted(draft,event){appendActivity(draft.activities,{id:COMPACTION_ACTIVITY_ID,toolName:COMPACTION_ACTIVITY_ID,summary:"Compacting context\u2026",status:"running",startedAt:event.startedAt})}function handleCompactionEnded(draft,event){let contextTokens=draft.usage.contextTokens;addUsage2(draft.usage,event.usage),draft.usage.contextTokens=contextTokens;let activity=[...draft.activities].reverse().find(candidate=>candidate.id===COMPACTION_ACTIVITY_ID&&candidate.status==="running");activity&&(activity.status=event.error?"failed":"succeeded",activity.endedAt=event.endedAt,activity.summary=compactionSummary(event.tokensBefore,event.tokensAfter),activity.resultSummary=event.error?compactionError(event.error):void 0,enforceActivityLimits(draft.activities))}function handleSettle(draft,event){draft.status=event.verdict,draft.report=boundText2(event.report,32768),draft.reportTruncated=draft.report!==event.report,draft.error=event.error?boundText2(event.error,8192):void 0,draft.endedAt=event.endedAt,draft.retry=void 0}function handleAbortWhileQueued(draft,event){draft.status="aborted",draft.error="Subagent was aborted while queued.",draft.endedAt=event.endedAt,draft.retry=void 0}function handleAbortWhileRetrying(draft,event){draft.status="aborted",draft.error="Subagent was aborted while waiting to retry.",draft.endedAt=event.endedAt,draft.retry=void 0}function applyEvent(draft,event){switch(event.type){case"slot_acquired":handleSlotAcquired(draft,event);break;case"retry_scheduled":handleRetryScheduled(draft,event);break;case"retry_started":break;case"auto_retry_start":handleAutoRetryStart(draft,event);break;case"auto_retry_end":break;case"turn_end":handleTurnEnd(draft);break;case"assistant_message_settled":handleAssistantMessageSettled(draft,event);break;case"tool_started":handleToolStarted(draft,event);break;case"tool_updated":handleToolUpdated(draft,event);break;case"tool_ended":handleToolEnded(draft,event);break;case"compaction_started":handleCompactionStarted(draft,event);break;case"compaction_ended":handleCompactionEnded(draft,event);break;case"settle":handleSettle(draft,event);break;case"abort_while_queued":handleAbortWhileQueued(draft,event);break;case"abort_while_retrying":handleAbortWhileRetrying(draft,event);break}}function versionSum(runs){let total=0;for(let run of runs)total+=run.version;return total}function statusOf(runs){return runs.length===0||runs.some(run=>run.status==="queued"||run.status==="running")?"running":runs.every(run=>run.status==="completed")?"completed":runs.some(run=>run.status==="completed")?"partial":runs.every(run=>run.status==="aborted")?"aborted":"failed"}function isSubagentError(details){return details.status!=="failed"&&details.status!=="aborted"?!1:!details.runs.some(run=>run.status==="completed")}function statusText(details){if(details.runs.length===0)return"Initializing\u2026";let running=details.runs.filter(run=>run.status==="running").length,queued=details.runs.filter(run=>run.status==="queued").length,completed=details.runs.filter(run=>run.status==="completed").length,failed=details.runs.filter(run=>run.status==="failed").length,aborted=details.runs.filter(run=>run.status==="aborted").length,parts=[`${completed}/${details.runs.length} complete`];return running&&parts.push(`${running} running`),queued&&parts.push(`${queued} queued`),failed&&parts.push(`${failed} failed`),aborted&&parts.push(`${aborted} aborted`),parts.join(" \xB7 ")}function statusSummary(details){return statusText(details)}function getSubagentRetryView(run,now=Date.now()){let retry=run.retry;if(!retry||!Number.isFinite(retry.deadline))return;let attempt2=positiveInteger(retry.attempt,1),maxAttempts=Math.max(attempt2,positiveInteger(retry.maxAttempts,attempt2)),currentTime=Number.isFinite(now)?now:retry.deadline;return{attempt:attempt2,maxAttempts,remainingSeconds:Math.max(0,Math.ceil((retry.deadline-currentTime)/1e3)),error:retryError(typeof retry.error=="string"?retry.error:"")}}var RETRY_ERROR_LIMIT=160,FALLBACK_OUTPUT_LIMIT=4e3,OUTPUT_TRUNCATION_NOTICE_PATTERN2=/\s*\[Output truncated(?:: \d+ bytes omitted)?\.\]\s*$/u,ELAPSED_REFRESH_INTERVAL_MS=1e3,FLOW_SEPARATOR=" \xB7 ",FLOW_SEPARATOR_WIDTH=3,SingleLineText=class{constructor(text2){this.text=text2}render(width){return[truncateToWidth(this.text,Math.max(1,width),"...")]}invalidate(){}};function taskPrompt(args,index3,run){return args.tasks?.[index3]?.prompt??run.description}function profileLabel(agent){return AGENT_PROFILE_LABELS[agent]??agent}function formatDuration2(seconds){let roundedSeconds=Math.round(seconds);return roundedSeconds>=60?`${Math.floor(roundedSeconds/60)}m ${roundedSeconds%60}s`:`${seconds.toFixed(seconds<10?1:0)}s`}function elapsed(startedAt,endedAt){if(startedAt!==void 0)return formatDuration2(Math.max(0,((endedAt??Date.now())-startedAt)/1e3))}function runMarker(status,theme2){let marker=statusMarker(status);return theme2.fg(marker.color,marker.glyph)}function displayLine(text2){return plainLine(text2).replace(OUTPUT_TRUNCATION_NOTICE_PATTERN2,"...").trim()}function retryText(run){let retry=getSubagentRetryView(run);if(!retry)return;let state2=retry.remainingSeconds>0?`Retrying (${retry.attempt}/${retry.maxAttempts}) in ${retry.remainingSeconds}s`:`Retrying (${retry.attempt}/${retry.maxAttempts}) now...`,error=truncate4(displayLine(retry.error),RETRY_ERROR_LIMIT);return error?`${state2} \xB7 ${error}`:state2}function latestRunningActivity(run,toolName){for(let index3=run.activities.length-1;index3>=0;index3--){let activity=run.activities[index3];if(activity?.status==="running"&&activity.toolName===toolName)return activity}}function formatTotalTokens(value2){let count=Number.isFinite(value2)?Math.max(0,Math.round(value2)):0;if(count<1e3)return String(count);let divisor=count<999950?1e3:1e6,suffix=divisor===1e3?"k":"M",rounded=Math.round(count/divisor*10)/10;return`${Number.isInteger(rounded)?rounded.toFixed(0):rounded.toFixed(1)}${suffix}`}var MARKER_WIDTH=1;function flowSegment(run,index3,theme2,now){let marker;if(run.status==="running"){let glyph=statusSpinnerFrame(now),pad2=Math.max(0,MARKER_WIDTH-visibleWidth(glyph));marker=theme2.fg("accent",glyph)+(pad2>0?" ".repeat(pad2):"")}else marker=runMarker(run.status,theme2);return`${marker} ${theme2.fg("dim",`#${index3+1}`)} ${theme2.fg("accent",profileLabel(run.agent))}`}var CollapsedFlow=class{constructor(segments){this.segments=segments,this.cellWidth=segments.reduce((max,segment2)=>Math.max(max,visibleWidth(segment2)),1)}render(width){let usable=Math.max(1,width),joined=this.segments.join(FLOW_SEPARATOR);if(visibleWidth(joined)<=usable)return[joined];if(this.cellWidth>usable)return this.segments.map(segment2=>truncateToWidth(segment2,usable,"..."));let columnCount=Math.max(1,Math.floor((usable+FLOW_SEPARATOR_WIDTH)/(this.cellWidth+FLOW_SEPARATOR_WIDTH))),lines=[];for(let start=0;start<this.segments.length;start+=columnCount){let row=this.segments.slice(start,start+columnCount);lines.push(row.map((segment2,index3)=>{if(index3===row.length-1)return segment2;let padding=Math.max(0,this.cellWidth-visibleWidth(segment2));return`${segment2}${padding>0?" ".repeat(padding):""}${FLOW_SEPARATOR}`}).join(""))}return lines}invalidate(){}};function toolCallLabel(count){return`${count} tool call${count===1?"":"s"}`}function runHeader(run,index3,theme2){let separator=theme2.fg("dim"," \xB7 "),duration=elapsed(run.startedAt,run.endedAt)??"0.0s",metrics=[run.model,run.thinking,`${formatTotalTokens(run.usage.totalTokens)} tok`,toolCallLabel(run.usage.toolUses),duration].map(metric=>theme2.fg("muted",metric));return[theme2.fg("accent",theme2.bold(`#${index3+1} ${profileLabel(run.agent)}`)),...metrics].join(separator)}function sectionTitle(title,theme2,color2,suffix){let heading=theme2.fg(color2,theme2.bold(title));return suffix?`${heading}${theme2.fg("dim",` \xB7 ${suffix}`)}`:heading}function activityTitleSuffix(total,shown){return total<=3&&shown>=total?toolCallLabel(total):shown>0?`last ${shown} of ${total} tool calls`:toolCallLabel(total)}function activityLine(activity,theme2){let text2=theme2.fg("toolOutput",activityCallText(activity));return activity.status==="failed"?`${theme2.fg("error","\xD7")} ${text2}`:activity.status==="running"?`${theme2.fg("accent","\u203A")} ${text2}`:` ${text2}`}function addPrompt(container,run,index3,args,theme2){container.addChild(new Text(sectionTitle("Prompt",theme2,"toolTitle"),0,0)),container.addChild(new Text(theme2.fg("toolOutput",taskPrompt(args,index3,run)),2,0))}function addActivity(container,run,theme2){let toolCalls=run.activities.filter(isDisplayableActivity),shown=toolCalls.slice(-3),total=Math.max(run.usage.toolUses,toolCalls.length);if(container.addChild(new Text(sectionTitle("Activity",theme2,"toolTitle",activityTitleSuffix(total,shown.length)),0,0)),shown.length===0){let empty=total===0?"No tool calls yet.":"Activity unavailable.";container.addChild(new Text(theme2.fg("muted",empty),2,0));return}for(let activity of shown)container.addChild(new SingleLineText(activityLine(activity,theme2)))}function outcomeColor(status){return status==="completed"?"success":status==="failed"?"error":status==="aborted"?"warning":"accent"}function outcomeReport(run){if(typeof run.report=="string")return run.report;let legacyOutput=run.finalOutput;return typeof legacyOutput=="string"?legacyOutput:""}function hasOutcome(report){return report.trim().length>0}function addOutcomeMarkdown(container,report,theme2){container.addChild(new Markdown(report,2,0,getMarkdownTheme(),{color:text2=>theme2.fg("toolOutput",text2)}))}function addOutcome(container,run,theme2){let color2=outcomeColor(run.status),report=outcomeReport(run);if(container.addChild(new Text(sectionTitle("Outcome",theme2,color2),0,0)),run.status==="queued"||run.status==="running"){container.addChild(new Text(theme2.fg("muted","Still running..."),2,0));let retry=retryText(run);retry?container.addChild(new Text(theme2.fg("warning",retry),2,0)):latestRunningActivity(run,COMPACTION_ACTIVITY_ID)&&container.addChild(new Text(theme2.fg("accent","Compacting context..."),2,0));return}if(run.status==="completed"){hasOutcome(report)?addOutcomeMarkdown(container,report,theme2):container.addChild(new Text(theme2.fg("muted","No outcome returned."),2,0));return}let verdict=run.status==="failed"?"Failed":"Aborted",reason=run.error?`${verdict}: ${run.error}`:`${verdict}.`;container.addChild(new Text(theme2.fg(color2,reason),2,0)),hasOutcome(report)&&(container.addChild(new Spacer(1)),container.addChild(new Text(theme2.fg("muted","Partial outcome:"),2,0)),addOutcomeMarkdown(container,report,theme2))}function renderRun(run,index3,args,theme2){let container=new Container;return container.addChild(new SingleLineText(runHeader(run,index3,theme2))),container.addChild(new Spacer(1)),addPrompt(container,run,index3,args,theme2),container.addChild(new Spacer(1)),addActivity(container,run,theme2),container.addChild(new Spacer(1)),addOutcome(container,run,theme2),container}function fallbackResult(result2,theme2,isError){let text2=result2.content.find(part=>part.type==="text"),value2=text2?.type==="text"?truncate4(text2.text,FALLBACK_OUTPUT_LIMIT):"(no output)";return new Text(theme2.fg(isError?"error":"muted",value2),0,0)}function desiredRefreshInterval(runs,options){if(options.isPartial)return options.expanded?runs.some(run=>run.status==="running"||run.retry!==void 0)?ELAPSED_REFRESH_INTERVAL_MS:void 0:runs.some(run=>run.status==="running")?STATUS_SPINNER_INTERVAL_MS:void 0}function clearLiveRefresh(state2){state2.refreshTimer!==void 0&&clearTimeout(state2.refreshTimer),state2.refreshTimer=void 0,state2.refreshInterval=void 0}function scheduleLiveRefresh(context,isPartial){let state2=context.state;state2.dispose??=()=>clearLiveRefresh(state2);let interval=desiredRefreshInterval(context.result?.details?.runs??[],{isPartial,expanded:context.expanded});if(interval===void 0){clearLiveRefresh(state2);return}if(state2.refreshTimer!==void 0){if(state2.refreshInterval===interval)return;clearTimeout(state2.refreshTimer)}state2.refreshInterval=interval,state2.refreshTimer=setTimeout(()=>{state2.refreshTimer=void 0,state2.refreshInterval=void 0,context.invalidate()},interval),state2.refreshTimer.unref?.()}function renderSubagentCall(args,theme2){let count=Array.isArray(args.tasks)?args.tasks.length:0,title=theme2.fg(count>0?"toolTitle":"error",theme2.bold("Subagent"));return new Text(title,0,0)}function renderSubagentResult(result2,options,theme2,args,isError){let details=result2.details;if(details?.background){let summary=`Handed to background \xB7 ${details.background.id}`,rows=options.expanded?details.runs.map((run,index3)=>`#${index3+1} ${profileLabel(run.agent)} \xB7 ${run.status} at handoff`).join(`
|
|
1588
1602
|
`):"",text2=[summary,rows,"Use /bg for live progress and outcomes."].filter(Boolean).join(`
|
|
1589
|
-
`);return new Text(theme2.fg("muted",text2),0,0)}if(!details||!Array.isArray(details.runs))return fallbackResult(result2,theme2,isError);if(details.runs.length===0)return new Text(theme2.fg("muted","Starting..."),0,0);let container=new Container;if(!options.expanded){let now=Date.now();return container.addChild(new CollapsedFlow(details.runs.map((run,index3)=>flowSegment(run,index3,theme2,now)))),container}for(let[index3,run]of details.runs.entries())index3>0&&container.addChild(new Spacer(1)),container.addChild(renderRun(run,index3,args,theme2));return container}import{existsSync as existsSync24,realpathSync as realpathSync3,statSync as statSync12}from"node:fs";import{isAbsolute as isAbsolute7,relative as relative9,resolve as resolve14}from"node:path";function normalizeCwdInput(value2){if(value2===void 0)return;let trimmed=value2.trim();if(!trimmed)throw new Error("cwd must not be empty.");return trimmed.startsWith("@")?trimmed.slice(1):trimmed}function isWithin(parent,child){let normalizedParent=process.platform==="win32"?parent.toLowerCase():parent,normalizedChild=process.platform==="win32"?child.toLowerCase():child,rest=relative9(normalizedParent,normalizedChild);return rest===""||rest!==".."&&!rest.startsWith(`..${PATH_SEP}`)&&!isAbsolute7(rest)}var PATH_SEP=process.platform==="win32"?"\\":"/";function resolveTaskCwd(parentCwd,requestedCwd){let value2=normalizeCwdInput(requestedCwd),
|
|
1603
|
+
`);return new Text(theme2.fg("muted",text2),0,0)}if(!details||!Array.isArray(details.runs))return fallbackResult(result2,theme2,isError);if(details.runs.length===0)return new Text(theme2.fg("muted","Starting..."),0,0);let container=new Container;if(!options.expanded){let now=Date.now();return container.addChild(new CollapsedFlow(details.runs.map((run,index3)=>flowSegment(run,index3,theme2,now)))),container}for(let[index3,run]of details.runs.entries())index3>0&&container.addChild(new Spacer(1)),container.addChild(renderRun(run,index3,args,theme2));return container}import{existsSync as existsSync24,realpathSync as realpathSync3,statSync as statSync12}from"node:fs";import{dirname as dirname25,isAbsolute as isAbsolute7,relative as relative9,resolve as resolve14}from"node:path";function normalizeCwdInput(value2){if(value2===void 0)return;let trimmed=value2.trim();if(!trimmed)throw new Error("cwd must not be empty.");return trimmed.startsWith("@")?trimmed.slice(1):trimmed}function isWithin(parent,child){let normalizedParent=process.platform==="win32"?parent.toLowerCase():parent,normalizedChild=process.platform==="win32"?child.toLowerCase():child,rest=relative9(normalizedParent,normalizedChild);return rest===""||rest!==".."&&!rest.startsWith(`..${PATH_SEP}`)&&!isAbsolute7(rest)}var PATH_SEP=process.platform==="win32"?"\\":"/";function nearestExistingParent(candidate){let current=candidate;for(let depth=0;depth<64;depth++){let parent=dirname25(current);if(parent===current)return current;if(existsSync24(parent))return parent;current=parent}return current}function resolveTaskCwd(parentCwd,requestedCwd){let value2=normalizeCwdInput(requestedCwd),candidate=value2!==void 0&&isAbsolute7(value2)?resolve14(value2):resolve14(parentCwd,value2??".");if(!existsSync24(candidate))throw new Error(`${candidate} does not exist; nearest existing parent: ${nearestExistingParent(candidate)}`);if(!statSync12(candidate).isDirectory())throw new Error(`Subagent cwd is not a directory: ${candidate}`);let realParent=realpathSync3(parentCwd),realCandidate=realpathSync3(candidate);return{cwd:realCandidate,insideParent:isWithin(realParent,realCandidate)}}function resolveModel(override,parent){if(override?.model)return findAvailableModel(override.model,parent.modelRegistry);if(!parent.model)throw new Error("The parent session has no active model.");return parent.model}function resolveThinking(override,parent,model){let requested=override?.thinking??parent.thinking;return clampThinkingLevel(model,requested)}var DEFAULT_AGENT_NAME="explorer";function taskLabel2(task){let explicit=task.description?.trim();return explicit||truncate4(firstPlainLine(task.prompt),80)}function subagentGroupTitle(tasks){let labels=tasks.map(task=>taskLabel2(task));return labels.length===1?truncate4(`Subagent \xB7 ${labels[0]}`,100):truncate4(`Subagent \xB7 ${tasks.length} tasks: ${labels.join(", ")}`,100)}async function resolveSubagentTask(task,parentCwd,parent,configAgentDir=getAgentDir(),preloadedConfig){let agentName=task.agent??DEFAULT_AGENT_NAME,agent=AGENT_PROFILES.find(candidate=>candidate.name===agentName);if(!agent){let available=AGENT_PROFILES.map(candidate=>candidate.name).join(", ")||"none";throw new Error(`Unknown agent "${agentName}". Available agents: ${available}.`)}let override=(preloadedConfig??await loadSubagentConfig(configAgentDir)).profiles[agent.name],model=resolveModel(override,parent),{cwd,insideParent}=resolveTaskCwd(parentCwd,task.cwd??void 0);return{agent,description:taskLabel2(task),prompt:task.prompt,cwd,insideParent,model,thinking:resolveThinking(override,parent,model)}}var EMPTY_OUTPUT="(Subagent completed but returned no output.)",BATCH_RESERVE_BYTES=1*1024,JSON_ESCAPE_FACTOR=6;function planBudgets(taskCount){let count=Math.max(1,taskCount),perRunDetails=Math.max(1024,Math.floor((122880-8*1024)/count)),headingReserve=Math.min(256*count,Math.floor(49152/4)),fairShare=Math.floor((49152-headingReserve)/count);return{perRunDetails,perRunDetailsReport:Math.min(32768,Math.max(1024,perRunDetails-7*1024)),perTaskReport:Math.min(32768,Math.max(2048,fairShare)),totalReport:49152}}function detailsSize(details){return Buffer.byteLength(JSON.stringify(details),"utf8")}function selectDetailsActivities(activities){if(activities.length<=12)return activities;let required=new Set;for(let index3=activities.length-1;index3>=0&&required.size<3;index3--){let activity=activities[index3];activity&&isDisplayableActivity(activity)&&required.add(index3)}let selected=new Set;for(let index3=activities.length-12;index3<activities.length;index3++)selected.add(index3);for(let index3 of required)selected.add(index3);let ordered=[...selected].sort((left,right)=>left-right);for(;ordered.length>12;){let removable=ordered.findIndex(index3=>!required.has(index3));if(removable===-1)break;ordered.splice(removable,1)}return ordered.map(index3=>activities[index3])}function boundRuns(details,reportLimit){return{...details,runs:details.runs.map(run=>({...run,cwd:boundText2(run.cwd,1024),currentActivity:run.currentActivity?boundText2(run.currentActivity,512):void 0,retry:run.retry?{...run.retry,error:boundText2(run.retry.error,160)}:void 0,activities:selectDetailsActivities(run.activities).map(activity=>({...activity,summary:boundText2(activity.summary,256),resultSummary:activity.resultSummary?boundText2(activity.resultSummary,256):void 0})),report:boundText2(run.report,reportLimit),error:run.error?boundText2(run.error,1024):void 0}))}}function boundSubagentDetails(details){let plan=planBudgets(details.runs.length),optimistic=boundRuns(details,plan.perRunDetailsReport);if(detailsSize(optimistic)<=122880)return optimistic;let count=Math.max(1,details.runs.length),nonReportBytes=detailsSize(boundRuns(details,0)),residual=122880-nonReportBytes-BATCH_RESERVE_BYTES,likely=Math.min(plan.perRunDetailsReport,Math.max(0,Math.floor(residual/count/2))),likelyBounded=boundRuns(details,likely);if(detailsSize(likelyBounded)<=122880)return likelyBounded;let reportLimit=Math.min(plan.perRunDetailsReport,Math.max(0,Math.floor(residual/count/JSON_ESCAPE_FACTOR)));return boundRuns(details,reportLimit)}function reportSectionTitle(run,index3){return`### ${index3+1}. ${run.description} (${run.agent}) \u2014 ${run.status}`}function reportSectionBody(run){if(run.status==="completed")return run.report||EMPTY_OUTPUT;if(run.status==="failed"||run.status==="aborted"){let verdict=run.status==="aborted"?"Subagent aborted":"Subagent failed",cause=run.error?`: ${run.error}`:".",partial=run.report?`
|
|
1590
1604
|
|
|
1591
1605
|
Partial report:
|
|
1592
1606
|
${run.report}`:"";return`${verdict}${cause}${partial}`}return run.status==="queued"?"Task was queued and never started.":"Task was still running when the batch settled."}function resultContent(details){let perTaskBudget=planBudgets(details.runs.length).perTaskReport,sections=details.runs.map((run,index3)=>`${reportSectionTitle(run,index3)}
|
|
@@ -1598,23 +1612,22 @@ ${boundText2(reportSectionBody(run),perTaskBudget)}`);return boundText2(sections
|
|
|
1598
1612
|
`),49152)}function createRunCancellation(parent){let controller=new AbortController,executions=new Map,current,registrationId=0,disposed=!1,executeHandler=handler=>{if(disposed||!handler)return Promise.resolve();let existing=executions.get(handler);if(existing)return existing;let execution=Promise.resolve().then(handler).catch(()=>{});return executions.set(handler,execution),execution},trigger=()=>disposed?Promise.resolve():(controller.signal.aborted||controller.abort(),executeHandler(current?.handler)),parentListener=()=>{trigger()};return parent&&(parent.aborted?trigger():parent.addEventListener("abort",parentListener,{once:!0})),{signal:controller.signal,get aborted(){return controller.signal.aborted},abort:trigger,onAbort(handler){if(disposed)return()=>{};let registration={id:++registrationId,handler};current=registration,controller.signal.aborted&&executeHandler(handler);let unregistered=!1;return()=>{unregistered||(unregistered=!0,current?.id===registration.id&&(current=void 0))}},throwIfAborted(){if(controller.signal.aborted)throw new Error("Subagent run was aborted.")},dispose(){disposed||(disposed=!0,current=void 0,parent?.removeEventListener("abort",parentListener))}}}function abortableSleep(ms,scope){return new Promise((resolve17,reject)=>{if(scope.signal.aborted){reject(new Error("Aborted"));return}let timer,onAbort=()=>{timer&&clearTimeout(timer),scope.signal.removeEventListener("abort",onAbort),reject(new Error("Aborted"))};timer=setTimeout(()=>{scope.signal.removeEventListener("abort",onAbort),resolve17()},ms),scope.signal.addEventListener("abort",onAbort,{once:!0})})}function workerSystemPrompt(base,task){return[base,`You are Pi subagent "${task.agent.name}", working independently on one delegated task.`,"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.","Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.","Complete the task fully\u2014do not gold-plate it, but do not leave it half-done.","Stay inside the assigned working directory and delegated scope.","Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.","Do not spawn subagents or invoke tools outside the configured tool list.","Background execution is not available inside subagents. Do not set `background: true` on bash or other tools, and do not use shell detachment to bypass this restriction. Run commands in the foreground and wait for them to finish before reporting. Only the parent agent or the user can move the entire subagent invocation to the background. If the task requires a long-lived background service, report the requirement to the parent instead of starting it.","When referencing files in the final report, use paths relative to the task's working directory so the caller can locate them unambiguously.","Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.","End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.",task.agent.systemPrompt].filter(part=>!!part?.trim()).join(`
|
|
1599
1613
|
|
|
1600
1614
|
`)}function lastAssistantMessage(session){for(let index3=session.messages.length-1;index3>=0;index3--){let message=session.messages[index3];if(message?.role==="assistant")return message}}function assistantError(message){if(!(!message||message.role!=="assistant"))return message.errorMessage}function createThrottledEmitter(onProgress){let timer;return{emit:()=>{!onProgress||timer||(timer=setTimeout(()=>{timer=void 0,onProgress()},80))},cancel:()=>{timer&&clearTimeout(timer),timer=void 0}}}function mapSessionEvent(event,seenAssistantMessages,now=Date.now()){if(event.type==="auto_retry_start")return{runEvent:{type:"auto_retry_start",attempt:event.attempt,maxAttempts:event.maxAttempts,deadline:now+event.delayMs,error:event.errorMessage},immediate:!0};if(event.type==="auto_retry_end")return{runEvent:{type:"auto_retry_end"},immediate:!0};if(event.type==="turn_end")return{runEvent:{type:"turn_end"},immediate:!0};if(event.type==="compaction_start")return{runEvent:{type:"compaction_started",startedAt:now},immediate:!0};if(event.type==="compaction_end")return{runEvent:{type:"compaction_ended",usage:event.result?.usage,tokensBefore:event.result?.tokensBefore,tokensAfter:event.result?.estimatedTokensAfter,error:event.errorMessage,endedAt:now},immediate:!0};if(event.type==="message_end"&&event.message.role==="assistant"){let usage=seenAssistantMessages.has(event.message)?void 0:event.message.usage;return seenAssistantMessages.add(event.message),{runEvent:{type:"assistant_message_settled",usage},immediate:!0}}if(event.type==="tool_execution_start")return{runEvent:{type:"tool_started",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args,startedAt:now},immediate:!0};if(event.type==="tool_execution_update")return{runEvent:{type:"tool_updated",toolCallId:event.toolCallId,toolName:event.toolName,args:event.args},immediate:!1};if(event.type==="tool_execution_end")return{runEvent:{type:"tool_ended",toolCallId:event.toolCallId,result:event.result,isError:event.isError,endedAt:now},immediate:!0}}async function raceInitialization(chain,scope){return new Promise(resolve17=>{let settled=!1,finish=outcome=>{settled||(settled=!0,scope.signal.removeEventListener("abort",onAbort),resolve17(outcome))},onAbort=()=>{finish({kind:"aborted"})};if(scope.signal.aborted){onAbort(),chain.then(()=>{},()=>{});return}scope.signal.addEventListener("abort",onAbort,{once:!0}),chain.then(outcome=>finish(outcome),error=>finish({kind:"error",error}))})}async function runSdkTask(options){let{task,scope,dispatch,modelRuntime,agentDir,projectTrusted,onProgress}=options,throttled=createThrottledEmitter(onProgress),unsubscribe,unregisterAbort,session,seenAssistantMessages=new Set,emitImmediate=()=>onProgress?.(),emitThrottled=throttled.emit;unregisterAbort=scope.onAbort(async()=>{session&&await session.abort()});try{if(scope.aborted){dispatch({type:"settle",verdict:"aborted",report:"",error:"Subagent was aborted before it started.",endedAt:Date.now()});return}let settingsManager=SettingsManager.create(task.cwd,agentDir,{projectTrusted}),resourceLoader=new DefaultResourceLoader({cwd:task.cwd,agentDir,settingsManager,noExtensions:!0,noSkills:!0,noPromptTemplates:!0,noThemes:!0,systemPromptOverride:base=>workerSystemPrompt(base,task)}),initialization=(async()=>(await resourceLoader.reload(),scope.signal.aborted?{kind:"aborted"}:{kind:"created",session:(await createAgentSession({executionRole:"subagent",cwd:task.cwd,agentDir,modelRuntime,model:task.model,thinkingLevel:task.thinking,tools:task.agent.tools,resourceLoader,sessionManager:SessionManager.inMemory(task.cwd),settingsManager})).session}))(),outcome=await raceInitialization(initialization,scope);if(outcome.kind==="error")throw outcome.error;if(outcome.kind==="aborted"){initialization.then(late=>{if(late.kind==="created")try{late.session.dispose()}catch{}},()=>{}),dispatch({type:"settle",verdict:"aborted",report:"",error:"Subagent was aborted during initialization.",endedAt:Date.now()});return}if(session=outcome.session,scope.aborted){await session.abort(),dispatch({type:"settle",verdict:"aborted",report:"",error:"Subagent was aborted during initialization.",endedAt:Date.now()});return}unsubscribe=session.subscribe(event=>{let mapped=mapSessionEvent(event,seenAssistantMessages);mapped&&(dispatch(mapped.runEvent),mapped.immediate?emitImmediate():emitThrottled())}),await session.prompt(task.prompt);let finalMessage=lastAssistantMessage(session),report=finalAssistantText(session.messages),error=assistantError(finalMessage);scope.signal.aborted||finalMessage?.stopReason==="aborted"?dispatch({type:"settle",verdict:"aborted",report,error:error??"Subagent was aborted.",endedAt:Date.now()}):finalMessage?.stopReason==="error"||error?dispatch({type:"settle",verdict:"failed",report,error:error??"Subagent failed.",endedAt:Date.now()}):dispatch({type:"settle",verdict:"completed",report,error:void 0,endedAt:Date.now()})}catch(error){let report=session?finalAssistantText(session.messages):"";scope.signal.aborted?dispatch({type:"settle",verdict:"aborted",report,error:"Subagent was aborted.",endedAt:Date.now()}):dispatch({type:"settle",verdict:"failed",report,error:error instanceof Error?error.message:String(error),endedAt:Date.now()})}finally{throttled.cancel(),unregisterAbort?.(),unsubscribe?.(),session?.dispose(),emitImmediate()}}var ConcurrencyGate=class{constructor(limit=6){this.active=0,this.waiters=[],this.limit=limit}acquire(signal){return signal?.aborted?Promise.reject(new Error("Subagent was aborted while queued.")):this.active<this.limit?(this.active++,Promise.resolve(()=>this.release())):new Promise((resolve17,reject)=>{let waiter={resolve:resolve17,reject,signal,settled:!1};signal&&(waiter.abortListener=()=>{if(waiter.settled)return;waiter.settled=!0;let index3=this.waiters.indexOf(waiter);index3>=0&&this.waiters.splice(index3,1),reject(new Error("Subagent was aborted while queued."))},signal.addEventListener("abort",waiter.abortListener,{once:!0})),this.waiters.push(waiter)})}release(){for(this.active=Math.max(0,this.active-1);this.waiters.length>0;){let waiter=this.waiters.shift();if(!(waiter.settled||waiter.signal?.aborted)){waiter.settled=!0,waiter.signal?.removeEventListener("abort",waiter.abortListener),this.active++,waiter.resolve(()=>this.release());return}}}};function aggregateUsage(runs){let usage=emptyUsage3();for(let run of runs)mergeUsage(usage,run.usage);return usage}function backgroundProjection(runs,tasks,details){return{text:statusSummary(details),workers:runs.map((run,index3)=>({id:run.id,label:run.agent,profile:run.agent,description:run.description,status:run.status,prompt:tasks[index3]?.prompt??run.description,activity:run.currentActivity??run.activities.slice(-3).map(item=>item.summary).join(`
|
|
1601
|
-
`),report:{text:run.report,truncated:run.reportTruncated},error:run.error,model:`${run.model} \xB7 ${run.thinking}`,usage:`${run.usage.totalTokens} tokens \xB7 $${run.usage.cost.toFixed(4)} \xB7 ${run.usage.toolUses} tool calls`}))}}function emitDetails(runs,tasks,startedAt,onUpdate){let details={status:statusOf(runs),runs:runs.map(toRunDetails),startedAt,usage:aggregateUsage(runs)};return onUpdate?.(boundSubagentDetails(details),backgroundProjection(runs,tasks,details)),details}function validateTaskCount(tasks){if(tasks.length===0)throw new Error("Subagent task list must not be empty.");if(tasks.length>8)throw new Error(`Subagent task list is limited to ${8} tasks.`)}async function resolveTasks(tasks,options){validateTaskCount(tasks);let config=await loadSubagentConfig(options.agentDir,options.onConfigWarning);return Promise.all(tasks.map((task,index3)=>resolveSubagentTask(task,options.parentCwd,options.parent,options.agentDir,config).catch(error=>{let message=error instanceof Error?error.message:String(error);throw new Error(`Subagent task tasks[${index3}] failed to resolve: ${message}`)})))}function isRetryableRunError(error){return error?isRetryableAssistantError({role:"assistant",content:[],stopReason:"error",errorMessage:error}):!1}function shouldRetryTask(run){return run.status==="failed"&&run.usage.turns===0&&run.usage.toolUses===0&&isRetryableRunError(run.error)}async function runWithGate(task,scope,options,dispatch,getState2,onProgress){let baseDelayMs=options.taskRetryBaseDelayMs??1e3;for(let attempt2=0;;attempt2++){dispatch({type:"retry_started"});let release2,delayMs=0;try{if(release2=await options.gate.acquire(scope.signal),scope.signal.aborted){dispatch({type:"abort_while_queued",endedAt:Date.now()});return}dispatch({type:"slot_acquired",startedAt:Date.now()}),await runSdkTask({task,scope,dispatch,modelRuntime:options.modelRuntime,agentDir:options.agentDir,projectTrusted:options.projectTrusted,onProgress});let state2=getState2();if(attempt2>=2||scope.signal.aborted||!shouldRetryTask(state2))return;delayMs=baseDelayMs*2**attempt2,dispatch({type:"retry_scheduled",attempt:attempt2+1,maxAttempts:2,deadline:Date.now()+delayMs,error:state2.error})}catch(error){scope.signal.aborted?dispatch({type:"abort_while_queued",endedAt:Date.now()}):dispatch({type:"settle",verdict:"failed",report:"",error:error instanceof Error?error.message:String(error),endedAt:Date.now()});return}finally{release2?.()}try{await abortableSleep(delayMs,scope)}catch{dispatch({type:"abort_while_retrying",endedAt:Date.now()});return}}}async function runSubagentInvocation(options){let invocationScope=createRunCancellation(options.signal),unregisterInvocation=options.registerAbort?.(invocationScope.abort);try{let tasks=options.params.tasks??[],resolved=await resolveTasks(tasks,options),runs=resolved.map((task,index3)=>createRunState(task,index3,options.batchId,options.parentCwd)),startedAt=Date.now(),scopes=runs.map(()=>createRunCancellation(invocationScope.signal)),unregisterChildren=invocationScope.onAbort(async()=>{await Promise.allSettled(scopes.map(scope=>scope.abort()))}),lastVersion=versionSum(runs),progress=()=>{let version2=versionSum(runs);version2!==lastVersion&&(lastVersion=version2,emitDetails(runs,resolved,startedAt,options.onUpdate))},dispatch=(index3,event)=>{runs[index3]=reduceRun(runs[index3],event),progress()},latestDetails=emitDetails(runs,resolved,startedAt,options.onUpdate);try{invocationScope.aborted||options.onAccepted?.(),await Promise.all(resolved.map((task,index3)=>{let dispatchToRun=event=>dispatch(index3,event);return runWithGate(task,scopes[index3],options,dispatchToRun,()=>runs[index3],progress)}))}finally{unregisterChildren();for(let scope of scopes)scope.dispose()}return latestDetails=emitDetails(runs,resolved,startedAt,void 0),latestDetails.endedAt=Date.now(),{content:resultContent(latestDetails),details:boundSubagentDetails(latestDetails),projection:backgroundProjection(runs,resolved,latestDetails),usage:toNestedUsage(latestDetails.usage)}}finally{unregisterInvocation?.(),invocationScope.dispose()}}function nullable(schema,description){return typebox_exports.Optional(typebox_exports.Union([schema,typebox_exports.Null()],{description}))}var TaskSchema=typebox_exports.Object({agent:nullable(StringEnum(SUBAGENT_AGENT_NAMES,{description:"Which built-in profile runs this task"}),"Built-in profile; null or omit for explorer (the default)"),prompt:typebox_exports.String({minLength:1,maxLength:5e4,description:"Complete self-contained briefing; the worker cannot see the parent conversation"}),description:nullable(typebox_exports.String({minLength:1,maxLength:80}),"Short task label (3-5 words) shown in the /bg list, live rows, and report headings; null or omit to derive it from the prompt"),cwd:nullable(typebox_exports.String({minLength:1,maxLength:4096}),"Relative or absolute directory inside the parent working directory; null or omit to inherit it")},{additionalProperties:!1}),SubagentParamsSchema=typebox_exports.Object({background:nullable(typebox_exports.Boolean(),"true runs all tasks as one managed background group and returns a group reference immediately; false, null or omit blocks until every worker finishes and returns their reports"),tasks:typebox_exports.Array(TaskSchema,{minItems:1,maxItems:8,description:`Independent tasks run concurrently: at most ${6} active at once, excess tasks queue, and results preserve input order`})},{additionalProperties:!1});function subagent(pi){let gate=new ConcurrencyGate,workerOrdinal=0,activeAborters=new Set;pi.registerTool({name:SUBAGENT_TOOL_NAME,label:SUBAGENT_TOOL_LABEL,description:subagentToolDescription(),promptSnippet:"Delegate bounded work to isolated explorer or general workers",promptGuidelines:["Use `subagent` for bounded work that benefits from isolated context or concurrent investigation; do not delegate a task you can finish with one or two direct tool calls.","Give every task a short `description` label; it is shown in the /bg list, live rows, and report headings."],parameters:SubagentParamsSchema,async execute(toolCallId,params,signal,onUpdate,ctx){let host=ctx.background;if(host?.closed)throw new Error("Background service is closed");let managed=host?.enabled||params.background===!0;if(managed&&!host)throw new Error("Background execution requires an enabled Background host.");let latest={status:"running",runs:[],startedAt:Date.now(),usage:emptyUsage3()},ordinals=new Map,projection=view=>({...view,workers:view.workers?.map(worker=>{let ordinal=ordinals.get(worker.id);return ordinal===void 0&&(ordinal=++workerOrdinal,ordinals.set(worker.id,ordinal)),{...worker,label:`#${ordinal} ${worker.profile}`}})}),run=async control=>{let update=(details,view)=>{latest=details;let result3={content:[{type:"text",text:statusSummary(details)}],details};control?control.publish(result3,view?projection(view):void 0):onUpdate?.(result3)};update(latest);let parent={model:ctx.model,thinking:pi.getThinkingLevel(),modelRegistry:ctx.modelRegistry},execution=await runSubagentInvocation({params,parentCwd:ctx.cwd,parent,modelRuntime:ctx.modelRuntime,agentDir:getAgentDir(),projectTrusted:ctx.isProjectTrusted(),signal:control?.signal??signal,gate,batchId:control?.id??toolCallId,onUpdate:update,onAccepted:control?()=>control.accept():void 0,onConfigWarning:message=>ctx.ui.notify(message,"warning"),registerAbort:control?void 0:abort=>(activeAborters.add(abort),()=>activeAborters.delete(abort))}),result2={content:[{type:"text",text:execution.content}],details:execution.details,usage:execution.usage};return control?.publish(result2,projection(execution.projection)),result2};if(!managed)return run();let outcome=await host.execute({kind:"subagent",title:subagentGroupTitle(params.tasks),toolCallId,background:params.background===!0,signal,onUpdate,run:async control=>{let result2=await run(control),status=result2.details.status;return{result:result2,status:status==="aborted"?"cancelled":status==="running"?"failed":status}}});if(outcome.kind==="result")return outcome.result;let submittedAt=Date.now();return{content:[{type:"text",text:`Subagent group handed to background: ${outcome.task.id}. Completion arrives automatically as a notification \u2014 do not poll or immediately wait on it; continue with other work or hand back to the user. Use bg read to inspect progress, bg wait only when your next step is blocked on the result (prefer foreground next time in that case), or bg kill to stop the whole group.`}],details:{...latest,endedAt:submittedAt,background:{id:outcome.task.id,submittedAt}}}},renderCall(args,theme2){return renderSubagentCall(args,theme2)},renderResult(result2,options,theme2,context){return scheduleLiveRefresh(context,options.isPartial&&!result2.details?.background),renderSubagentResult(result2,options,theme2,context.args,context.isError)}}),pi.registerCommand(SUBAGENT_COMMAND_NAME,{description:"Configure Subagent profiles, models, and thinking levels",handler:async(_args,ctx)=>showAgentsCommand(ctx,pi.getThinkingLevel())}),pi.on("tool_result",async event=>{if(event.toolName!==SUBAGENT_TOOL_NAME)return;let details=event.details;if(details&&!details.background&&isSubagentError(details))return{isError:!0}}),pi.on("session_shutdown",async()=>{await Promise.allSettled([...activeAborters].map(abort=>abort())),activeAborters.clear()})}var TODO_TOOL_NAME="todo",TODO_TOOL_LABEL="Todo",TODOS_COMMAND_NAME="todos";var TODO_TOOL_DESCRIPTION=`Manage the conversation's task list for multi-step coding work. create atomically adds pending tasks; update edits one task by id and requires at least one of subject, description, or status; list returns every remaining task with its description, active first; delete removes tasks by ids. The list holds at most 20 tasks including completed ones, and ids are never reused. Exactly one task may be in_progress, so setting one demotes any other active task to pending; any transition is allowed, including reopening a completed task. A call that fails validation, including a delete naming an id that does not exist, leaves the list unchanged.
|
|
1602
|
-
|
|
1603
|
-
{"
|
|
1604
|
-
{"
|
|
1605
|
-
{"action": "update", "id": 2, "status": "completed", "description": "Parser verified against config fixtures"}
|
|
1606
|
-
{"action": "delete", "ids": [3]}`,TODO_PROMPT_SNIPPET="Track multi-step coding work with a small outcome-oriented task list",TODO_PROMPT_GUIDELINES=["Use `todo` for work with three or more meaningful steps, for user-provided task lists, and in long sessions where progress can drift; skip it for trivial single-step tasks and simple Q&A.","Keep exactly one `todo` task in_progress: mark it before starting the work, and completed only after its description is satisfied \u2014 never while tests fail or work is partial.","When blocked, leave the `todo` task pending and create a task for the blocker instead of faking completion.","Keep the `todo` list short: list before create to avoid duplicates, work in id order, and delete obsolete tasks promptly."];var TODO_DETAILS_SCHEMA_VERSION=2,StatusSchema=StringEnum(["pending","in_progress","completed"],{description:"Task status: pending for future work, in_progress for the single active task, completed for verified done work. Exactly one task may be in_progress; setting one demotes any other active task to pending."}),ActionSchema=StringEnum(["create","update","list","delete"],{description:"Todo operation: create one or many pending tasks from the ordered items array, update one task by id, list all remaining tasks, or delete obsolete tasks by ids. Parameters that do not apply to the chosen action are rejected."}),TaskIdSchema=typebox_exports.Integer({minimum:1,description:"Positive task id."}),CreateItemSchema=typebox_exports.Object({subject:typebox_exports.String({maxLength:160,description:"Short imperative task subject; a reviewable unit of work."}),description:typebox_exports.String({maxLength:500,description:"What done means for this task: acceptance criteria or verification detail."})}),TodoParamsSchema=typebox_exports.Object({action:ActionSchema,items:typebox_exports.Optional(typebox_exports.Array(CreateItemSchema,{minItems:1,maxItems:20,description:"create only: 1 to 20 pending tasks, created atomically in input order."})),id:typebox_exports.Optional(TaskIdSchema),subject:typebox_exports.Optional(typebox_exports.String({maxLength:160,description:"update only: replacement subject."})),description:typebox_exports.Optional(typebox_exports.String({maxLength:500,description:"update only: replacement description (what done means)."})),status:typebox_exports.Optional(StatusSchema),ids:typebox_exports.Optional(typebox_exports.Array(TaskIdSchema,{minItems:1,maxItems:20,description:"delete only: 1 to 20 ids to remove from the current list; duplicates are ignored."}))}),EMPTY_TODO_STATE={items:[],nextId:1};var TODO_STATUSES=new Set(["pending","in_progress","completed"]),TODO_ACTIONS=new Set(["create","update","list","delete"]),ACTION_PARAMS={create:new Set(["items"]),update:new Set(["id","subject","description","status"]),list:new Set([]),delete:new Set(["ids"])};function isRecord4(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function isPositiveSafeInteger(value2){return typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=1}function isTodoStatus(value2){return typeof value2=="string"&&TODO_STATUSES.has(value2)}function isTodoAction(value2){return typeof value2=="string"&&TODO_ACTIONS.has(value2)}function findItem(state2,id){return state2.items.find(item=>item.id===id)}function dedupeIds(ids){let seen=[];for(let id of ids)seen.includes(id)||seen.push(id);return seen}function normalizeText(value2){return value2.trim().replace(/\s+/g," ")}function validateNormalizedText(value2,label,maximum){if(typeof value2!="string")throw new Error(`${label} must be a string`);let normalized=normalizeText(value2);if(!normalized)throw new Error(`${label} cannot be empty`);if(normalized.length>maximum)throw new Error(`${label} exceeds ${maximum} characters`);return normalized}function findInapplicableParam(params){let allowed=ACTION_PARAMS[params.action];for(let[key,value2]of Object.entries(params))if(!(key==="action"||value2===void 0)&&!allowed.has(key))return`${key} does not apply to action ${params.action}`}function cloneTodoState(state2){return{items:state2.items.map(item=>({...item})),nextId:state2.nextId}}function applyCreate(state2,params){let rawItems=params.items;if(!Array.isArray(rawItems)||rawItems.length===0)throw new Error("items required for create");if(rawItems.length>20)throw new Error(`items exceeds ${20} tasks`);if(state2.items.length+rawItems.length>20)throw new Error(`todo list is full (max ${20} tasks); delete completed or obsolete tasks first`);if(!Number.isSafeInteger(state2.nextId)||state2.nextId<1)throw new Error("next id is invalid");if(state2.nextId>Number.MAX_SAFE_INTEGER-rawItems.length)throw new Error("next id is exhausted");let sources=[];for(let index3=0;index3<rawItems.length;index3++){let raw=rawItems[index3];if(!isRecord4(raw))throw new Error(`items[${index3}] must be an object`);for(let key of Object.keys(raw))if(key!=="subject"&&key!=="description")throw new Error(`items[${index3}].${key} does not apply to action create`);sources.push({subject:validateNormalizedText(raw.subject,`items[${index3}].subject`,160),description:validateNormalizedText(raw.description,`items[${index3}].description`,500)})}let created=sources.map((source,index3)=>({id:state2.nextId+index3,subject:source.subject,description:source.description,status:"pending"}));return{items:[...state2.items,...created],nextId:state2.nextId+created.length}}function applyUpdate(state2,params){let id=params.id;if(!isPositiveSafeInteger(id))throw new Error("id required for update");let index3=state2.items.findIndex(item=>item.id===id);if(index3===-1)throw new Error(`#${id} not found`);if(params.subject===void 0&¶ms.description===void 0&¶ms.status===void 0)throw new Error("update requires at least one of subject, description, or status");let subject=params.subject===void 0?void 0:validateNormalizedText(params.subject,"subject",160),description=params.description===void 0?void 0:validateNormalizedText(params.description,"description",500);if(params.status!==void 0&&!isTodoStatus(params.status))throw new Error("status is invalid");let current=state2.items[index3],updated={id:current.id,subject:subject??current.subject,description:description??current.description,status:params.status??current.status};return{items:state2.items.map((item,itemIndex)=>itemIndex===index3?updated:updated.status==="in_progress"&&item.status==="in_progress"?{...item,status:"pending"}:item),nextId:state2.nextId}}function applyDelete(state2,params){let rawIds=params.ids;if(!Array.isArray(rawIds)||rawIds.length===0)throw new Error("ids required for delete");if(rawIds.length>20)throw new Error(`ids exceeds ${20} ids`);let ids=[];for(let raw of rawIds){if(!isPositiveSafeInteger(raw))throw new Error("ids must contain positive integer ids");ids.push(raw)}let idsToRemove=dedupeIds(ids),byId=new Map(state2.items.map(item=>[item.id,item]));for(let candidate of idsToRemove)if(!byId.has(candidate))throw new Error(`#${candidate} not found`);let remove=new Set(idsToRemove);return{items:state2.items.filter(item=>!remove.has(item.id)),nextId:state2.nextId}}function applyTodoAction(state2,params){if(!isRecord4(params))throw new Error("todo params must be an object");if(!isTodoAction(params.action))throw new Error(`unknown todo action: ${String(params.action)}`);let inapplicable=findInapplicableParam(params);if(inapplicable)throw new Error(inapplicable);switch(params.action){case"create":return applyCreate(state2,params);case"update":return applyUpdate(state2,params);case"list":return cloneTodoState(state2);case"delete":return applyDelete(state2,params)}}function buildTodoChange(params,before,after){switch(params.action){case"create":return{kind:"create",ids:after.items.slice(before.items.length).map(item=>item.id)};case"update":{let id=params.id;if(!isPositiveSafeInteger(id))throw new Error("id required for update");let demotedId=before.items.find(item=>item.id!==id&&item.status==="in_progress"&&findItem(after,item.id)?.status==="pending")?.id;return{kind:"update",id,from:findItem(before,id)?.status??"pending",to:findItem(after,id)?.status??"pending",...demotedId!==void 0?{demotedId}:{}}}case"list":return{kind:"list"};case"delete":return{kind:"delete",removed:(Array.isArray(params.ids)?dedupeIds(params.ids):[]).map(id=>findItem(before,id)).filter(item=>item!==void 0).map(item=>({id:item.id,subject:item.subject}))}}}function buildTodoDetails(change,state2){return{schemaVersion:TODO_DETAILS_SCHEMA_VERSION,change,state:cloneTodoState(state2)}}function requireValidState(value2){let state2=normalizeSnapshotState(value2);if(!state2)throw new Error("todo state is invalid");return state2}function createTodoStore(initial){let state2=requireValidState(initial??EMPTY_TODO_STATE);return{getState(){return cloneTodoState(state2)},replaceState(next){state2=requireValidState(next)},execute(params){let before=state2,after=applyTodoAction(before,params),details=buildTodoDetails(buildTodoChange(params,before,after),after);return state2=after,details}}}function normalizeSnapshotState(value2){if(!isRecord4(value2)||!Array.isArray(value2.items)||!isPositiveSafeInteger(value2.nextId)||value2.items.length>20)return;let items=[],ids=new Set,maxId=0,activeCount=0;for(let rawItem of value2.items){if(!isRecord4(rawItem))return;let id=rawItem.id;if(!isPositiveSafeInteger(id)||ids.has(id))return;let subject=rawItem.subject,description=rawItem.description,status=rawItem.status;if(typeof subject!="string"||typeof description!="string"||subject!==normalizeText(subject)||description!==normalizeText(description)||!subject||subject.length>160||!description||description.length>500||!isTodoStatus(status))return;ids.add(id),id>maxId&&(maxId=id),status==="in_progress"&&activeCount++,items.push({id,subject,description,status})}if(!(activeCount>1)&&!(value2.nextId<=maxId))return{items,nextId:value2.nextId}}function replayTodosFromBranch(ctx){let branch=Array.from(ctx.sessionManager.getBranch());for(let index3=branch.length-1;index3>=0;index3--)try{let entry=branch[index3];if(!isRecord4(entry)||entry.type!=="message")continue;let message=entry.message;if(!isRecord4(message)||message.role!=="toolResult"||message.toolName!==TODO_TOOL_NAME)continue;let details=message.details;if(!isRecord4(details)||details.schemaVersion!==TODO_DETAILS_SCHEMA_VERSION)continue;let state2=normalizeSnapshotState(details.state);if(state2)return state2}catch{}return cloneTodoState(EMPTY_TODO_STATE)}var STATUS_MARK={pending:"[ ]",in_progress:"[>]",completed:"[x]"},STATUS_COLOR={pending:"dim",in_progress:"warning",completed:"success"},STATUS_RANK={in_progress:0,pending:1,completed:2},WIDGET_HEADER_SEPARATOR=" \xB7 ",WIDGET_ITEM_SEPARATOR=" ";function hasOpenTodos(state2){return state2.items.some(item=>item.status==="pending"||item.status==="in_progress")}function widgetCounts(state2){let counts={active:0,pending:0,completed:0};for(let item of state2.items)item.status==="in_progress"?counts.active++:item.status==="pending"?counts.pending++:counts.completed++;return counts}function widgetSegment(item,subject,theme2){return`${theme2.fg(STATUS_COLOR[item.status],STATUS_MARK[item.status])} ${theme2.fg("accent",`#${item.id}`)} ${theme2.fg("text",subject)}`}function widgetLine(header,segments,overflow){let body=[...segments,...overflow?[overflow]:[]].join(WIDGET_ITEM_SEPARATOR);return body?`${header}${WIDGET_HEADER_SEPARATOR}${body}`:header}function widgetOverflowLong(remaining,counts){let parts=[counts.active>0?`${counts.active} active`:"",counts.pending>0?`${counts.pending} pending`:"",counts.completed>0?`${counts.completed} completed`:""].filter(Boolean);return`+${remaining} more${parts.length?` (${parts.join(", ")})`:""}`}function renderWidgetLine(state2,theme2,width){let safeWidth=Math.max(1,width),items=state2.items,candidates=items.filter(item=>item.status!=="completed").sort((first,second)=>STATUS_RANK[first.status]-STATUS_RANK[second.status]||first.id-second.id);if(candidates.length===0)return[];let total=items.length,completed=items.filter(item=>item.status==="completed").length,header=`${theme2.fg("accent","Todos")} ${theme2.fg("dim",`${completed}/${total}`)}`,counts=widgetCounts(state2),shown=[],overflow="",bestOverflow=trial=>{let remaining=total-trial.length,segments2=trial.map(entry=>widgetSegment(entry.item,entry.subject,theme2)),activeShown=trial.some(entry=>entry.item.status==="in_progress")?1:0,hidden={active:counts.active-activeShown,pending:counts.pending-(trial.length-activeShown),completed:counts.completed};if(remaining<=0)return visibleWidth(widgetLine(header,segments2,""))<=safeWidth?"":void 0;let long=theme2.fg("dim",widgetOverflowLong(remaining,hidden));if(visibleWidth(widgetLine(header,segments2,long))<=safeWidth)return long;let short=theme2.fg("dim",`+${remaining} more`);return visibleWidth(widgetLine(header,segments2,short))<=safeWidth?short:void 0},fallback=()=>{let best=bestOverflow([]);return best!==void 0?[widgetLine(header,[],best)]:visibleWidth(header)<=safeWidth?[header]:[truncateToWidth(header,safeWidth,"\u2026")]};for(let candidate of candidates){let best=bestOverflow([...shown,{item:candidate,subject:candidate.subject}]);if(best!==void 0){shown.push({item:candidate,subject:candidate.subject}),overflow=best;continue}if(candidate.status!=="in_progress")break;let remaining=total-shown.length-1,suffix=remaining>0?`${WIDGET_ITEM_SEPARATOR}+${remaining} more`:"",prefix=`${header}${WIDGET_HEADER_SEPARATOR}${widgetSegment(candidate,"",theme2)}${suffix}`,available=safeWidth-visibleWidth(prefix);if(available<1)return fallback();shown.push({item:candidate,subject:truncateToWidth(candidate.subject,available,"\u2026")}),overflow=bestOverflow(shown)??""}if(shown.length===0)return fallback();let segments=shown.map(entry=>widgetSegment(entry.item,entry.subject,theme2)),line=widgetLine(header,segments,overflow);return[visibleWidth(line)<=safeWidth?line:truncateToWidth(line,safeWidth,"\u2026")]}function formatTodoList(state2){if(state2.items.length===0)return"No todos.";let counts=widgetCounts(state2),lines=[`Todos: ${counts.active} in progress, ${counts.pending} pending, ${counts.completed} completed`],items=[...state2.items].sort((first,second)=>STATUS_RANK[first.status]-STATUS_RANK[second.status]||first.id-second.id);for(let item of items)lines.push(`${STATUS_MARK[item.status]} #${item.id} ${item.subject}`),lines.push(` ${item.description}`);return lines.join(`
|
|
1607
|
-
`)}var formatCommandList=formatTodoList;function formatTodoContent(change,state2){switch(change.kind){case"create":{let parts=change.ids.map(id=>{let item=state2.items.find(entry=>entry.id===id);return item?`#${item.id}: ${item.subject}`:`#${id}`}),noun=change.ids.length===1?"task":"tasks";return`Created ${change.ids.length} ${noun}${parts.length?`: ${parts.join("; ")}`:""}`}case"update":{let item=state2.items.find(entry=>entry.id===change.id),subject=item?`: ${item.subject}`:"",transition=change.from===change.to?"":` (${change.from} -> ${change.to})`,demoted=change.demotedId!==void 0?`; demoted #${change.demotedId} to pending`:"";return`Updated #${change.id}${transition}${subject}${demoted}`}case"list":return formatTodoList(state2);case"delete":{let noun=change.removed.length===1?"task":"tasks",parts=change.removed.map(entry=>`#${entry.id}: ${entry.subject}`);return`Deleted ${change.removed.length} ${noun}${parts.length?`: ${parts.join("; ")}`:""}`}}}var CALL_ITEMS_MAX=20,CALL_SUBJECT_PREVIEW_COUNT=2,CALL_SUBJECT_PREVIEW_WIDTH=72,CALL_DESCRIPTION_PREVIEW_LENGTH=120,GROUP_FAILURE_MAX_LENGTH=120,TODO_ACTIONS2=new Set(["create","update","list","delete"]);function safeRecord2(value2){try{return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)?value2:void 0}catch{return}}function safeValue2(record,key){try{return record?.[key]}catch{return}}function safeString(value2){return typeof value2=="string"?value2:void 0}function clipText(value2,max){return safeString(value2)?.trim().replace(/\s+/g," ").slice(0,max)??""}var safeSubject=value2=>clipText(value2,160),safeDescription=value2=>clipText(value2,500);function safeId(value2){return typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=1?value2:void 0}function safeStatus(value2){let status=safeString(value2);if(status==="pending"||status==="in_progress"||status==="completed")return status}function readArray(value2,limit=CALL_ITEMS_MAX){try{if(!Array.isArray(value2))return;let length=value2.length,values=[];for(let index3=0;index3<Math.min(length,limit);index3++)try{values.push(value2[index3])}catch{values.push(void 0)}return{values,length}}catch{return}}function readIds(value2,strict){let array=readArray(value2);if(strict&&(!array||array.length===0||array.length>CALL_ITEMS_MAX))return;if(!array)return strict?void 0:[];let ids=[];for(let entry of array.values){let id=safeId(entry);if(id===void 0){if(strict)return;continue}ids.push(id)}return ids}function batchItems(value2){let result2=[];for(let raw of readArray(value2)?.values??[]){let item=safeRecord2(raw);item&&result2.push({subject:safeSubject(safeValue2(item,"subject")),description:safeDescription(safeValue2(item,"description"))})}return result2}function descriptionPreview(value2){let text2=value2.replace(/\s+/g," ");return text2.length>CALL_DESCRIPTION_PREVIEW_LENGTH?`${text2.slice(0,CALL_DESCRIPTION_PREVIEW_LENGTH-1)}\u2026`:text2}function formatSubjectPreview(subjects,total){let shown=subjects.filter(Boolean).slice(0,CALL_SUBJECT_PREVIEW_COUNT).map(subject=>truncateToWidth(subject,CALL_SUBJECT_PREVIEW_WIDTH,"\u2026"));if(!shown.length)return"";let hidden=Math.max(0,total-shown.length);return`${shown.join(", ")}${hidden?`, +${hidden} more`:""}`}function todoDetails(value2){let details=safeRecord2(value2);if(!details||safeValue2(details,"schemaVersion")!==TODO_DETAILS_SCHEMA_VERSION)return;let change=safeRecord2(safeValue2(details,"change")),state2=safeRecord2(safeValue2(details,"state"));if(!change||!state2)return;let kind=safeString(safeValue2(change,"kind"));if(!(!kind||!TODO_ACTIONS2.has(kind)))return{change,state:state2}}function createResultIds(result2,count){let details=todoDetails(result2?.details);if(!details||safeString(safeValue2(details.change,"kind"))!=="create")return;let ids=readIds(safeValue2(details.change,"ids"),!0);return ids?.length===count?ids:void 0}function deleteResultRemoved(result2){let details=todoDetails(result2?.details);if(!(!details||safeString(safeValue2(details.change,"kind"))!=="delete"))return removedEntries(safeValue2(details.change,"removed"))}function formatCallParts(args,theme2,result2){let action=clipText(args?.action,160),verb=TODO_ACTIONS2.has(action)?action:void 0,headline=[theme2.fg("toolTitle",theme2.bold(verb?`todo ${verb}`:"todo"))],details=[];if(verb==="create"){let items=batchItems(args?.items),rawCount=readArray(args?.items)?.length;if(rawCount!==void 0){let count=Math.min(rawCount,CALL_ITEMS_MAX);headline.push(theme2.fg("dim",`${count} ${count===1?"task":"tasks"}`));let subjects=items.map(item=>item.subject),preview=formatSubjectPreview(subjects,count);preview&&headline.push(theme2.fg("dim","\xB7"),theme2.fg("text",preview))}let ids=createResultIds(result2,items.length);for(let[index3,item]of items.entries()){let marker=ids?theme2.fg("accent",`#${ids[index3]}`):theme2.fg("accent",`${index3+1}.`);details.push(item.subject?`${marker} ${theme2.fg("text",item.subject)}`:marker),item.description&&details.push(` ${theme2.fg("dim",descriptionPreview(item.description))}`)}}else if(verb==="update"){let id=safeId(args?.id);id!==void 0&&headline.push(theme2.fg("accent",`#${id}`));let status=safeStatus(args?.status);status&&headline.push(theme2.fg(STATUS_COLOR[status],status));let subject=safeSubject(args?.subject);subject&&headline.push(theme2.fg("text",truncateToWidth(subject,CALL_SUBJECT_PREVIEW_WIDTH,"\u2026")));let description=safeDescription(args?.description);description&&details.push(` ${theme2.fg("dim",descriptionPreview(description))}`)}else if(verb==="delete"){let ids=readIds(args?.ids,!1)??[];ids.length&&headline.push(theme2.fg("accent",ids.map(id=>`#${id}`).join(", ")));for(let entry of deleteResultRemoved(result2)??[])details.push(`${theme2.fg("accent",`#${entry.id}`)} ${theme2.fg("text",entry.subject)}`)}return{headline:headline.join(" "),details}}function formatTodoCall(args,theme2,expanded,result2){let{headline,details}=formatCallParts(args,theme2,result2);return!expanded||details.length===0?headline:[headline,...details].join(`
|
|
1608
|
-
`)}function stateIndex(state2){let array=readArray(safeValue2(state2,"items"),20);if(!array||array.length>20)return;let byId=new Map,counts={inProgress:0,pending:0,completed:0};for(let raw of array.values){let item=safeRecord2(raw);if(!item)continue;let id=safeId(safeValue2(item,"id"));id!==void 0&&!byId.has(id)&&byId.set(id,item);let status=safeStatus(safeValue2(item,"status"));status==="in_progress"?counts.inProgress++:status==="pending"?counts.pending++:status==="completed"&&counts.completed++}return{byId,counts}}function stateSubject(map,id){let item=map.get(id);return item?safeSubject(safeValue2(item,"subject")):""}function removedEntries(value2){let array=readArray(value2);if(!array||array.length===0||array.length>CALL_ITEMS_MAX)return;let removed=[];for(let raw of array.values){let id=safeId(safeValue2(safeRecord2(raw),"id")),subject=safeSubject(safeValue2(safeRecord2(raw),"subject"));if(id===void 0||!subject)return;removed.push({id,subject})}return removed}function formatTodoGroupSuccess(args,theme2,result2){let parsed=todoDetails(result2.details);if(!parsed)return;let{change,state:state2}=parsed,verb=word=>theme2.fg("toolTitle",`todo ${word}`),withPreview=(word,ids,subjects)=>{let text2=formatSubjectPreview(subjects,subjects.length),rendered=ids.length>1&&ids.every((id,index3)=>id===ids[0]+index3)?`#${ids[0]}\u2013#${ids.at(-1)}`:ids.map(id=>`#${id}`).join(", "),base=`${verb(word)} ${theme2.fg("accent",rendered)}`;return text2?`${base}${theme2.fg("dim"," \xB7 ")}${theme2.fg("text",text2)}`:base},kind=safeString(safeValue2(change,"kind"));if(kind==="create"){let ids=readIds(safeValue2(change,"ids"),!0),index3=stateIndex(state2);if(!ids||!index3)return;let subjects=ids.map(id=>stateSubject(index3.byId,id));return withPreview("created",ids,subjects)}if(kind==="update"){let id=safeId(safeValue2(change,"id")),index3=stateIndex(state2);if(id===void 0||!index3)return;let to=safeStatus(safeValue2(change,"to")),demotedId=safeId(safeValue2(change,"demotedId")),parts=[verb("updated"),theme2.fg("accent",`#${id}`)];to&&parts.push(theme2.fg(STATUS_COLOR[to],to));let subject=stateSubject(index3.byId,id)||safeSubject(args?.subject)||"";return subject&&parts.push(theme2.fg("text",truncateToWidth(subject,CALL_SUBJECT_PREVIEW_WIDTH,"\u2026"))),demotedId!==void 0&&parts.push(theme2.fg("dim",`\xB7 demoted #${demotedId}`)),parts.join(" ")}if(kind==="list"){let counts=stateIndex(state2)?.counts;if(!counts)return;let parts=[];return counts.inProgress>0&&parts.push(`${counts.inProgress} in progress`),counts.pending>0&&parts.push(`${counts.pending} pending`),counts.completed>0&&parts.push(`${counts.completed} completed`),`${verb("list")}: ${theme2.fg("dim",parts.length?parts.join(", "):"no tasks")}`}if(kind==="delete"){let removed=removedEntries(safeValue2(change,"removed"));if(!removed)return;let subjects=removed.map(entry=>entry.subject);return withPreview("deleted",removed.map(entry=>entry.id),subjects)}}function formatTodoGroupCall(args,theme2,context){if(context.isError){let reason="tool failed";try{for(let block of context.result?.content.slice(0,8)??[]){if(block.type!=="text"||typeof block.text!="string")continue;let text2=block.text.replace(/[\u0000-\u001f\u007f-\u009f]/g," ").replace(/\s+/g," ").trim();if(text2){reason=text2.length>GROUP_FAILURE_MAX_LENGTH?`${text2.slice(0,GROUP_FAILURE_MAX_LENGTH-1)}\u2026`:text2;break}}}catch{}return`${formatTodoCall(args,theme2,!1)} ${theme2.fg("error",`failed: ${reason}`)}`}if(!context.isPartial&&context.result){let summary=formatTodoGroupSuccess(args,theme2,context.result);if(summary)return summary}return formatTodoCall(args,theme2,!1)}var WIDGET_KEY="todos",TodoWidget=class{constructor(getState2){this.registered=!1,this.getState=getState2}setUI(ui){this.ui!==ui&&(this.dispose(),this.ui=ui)}update(){if(this.ui){if(!hasOpenTodos(this.getState())){this.unregister();return}if(this.registered){this.tui?.requestRender();return}this.ui.setWidget(WIDGET_KEY,(tui,theme2)=>(this.tui=tui,{render:width=>renderWidgetLine(this.getState(),theme2,width),invalidate:()=>{}}),{placement:"aboveEditor"}),this.registered=!0}}unregister(){this.registered&&(this.ui?.setWidget(WIDGET_KEY,void 0),this.registered=!1,this.tui=void 0)}dispose(){this.unregister(),this.ui=void 0}};function safeReplay(ctx,store){try{store.replaceState(replayTodosFromBranch(ctx))}catch(error){if(!isStaleExtensionContextError(error))throw error}}function todo(pi){let store=createTodoStore(),widget;pi.registerTool({name:TODO_TOOL_NAME,label:TODO_TOOL_LABEL,description:TODO_TOOL_DESCRIPTION,promptSnippet:TODO_PROMPT_SNIPPET,promptGuidelines:TODO_PROMPT_GUIDELINES,parameters:TodoParamsSchema,executionMode:"sequential",toolGroup:TODO_TOOL_NAME,async execute(_toolCallId,params,_signal,_onUpdate){let details=store.execute(params);return{content:[{type:"text",text:formatTodoContent(details.change,details.state)}],details}},renderCall(args,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(context.toolGroupSummary?formatTodoGroupCall(args,theme2,context):formatTodoCall(args,theme2,context.expanded,context.result)),text2}}),pi.registerCommand(TODOS_COMMAND_NAME,{description:"Show the complete todo list for the current conversation branch",handler:async(_args,ctx)=>{if(!ctx.hasUI){ctx.ui.notify("/todos requires an interactive UI.","warning");return}ctx.ui.notify(formatCommandList(store.getState()),"info")}}),pi.on("session_start",async(_event,ctx)=>{safeReplay(ctx,store),ctx.hasUI&&(widget??=new TodoWidget(()=>store.getState()),widget.setUI(ctx.ui),widget.update())}),pi.on("session_tree",async(_event,ctx)=>{safeReplay(ctx,store),widget?.update()}),pi.on("session_shutdown",async(_event,_ctx)=>{widget?.dispose(),widget=void 0}),pi.on("tool_execution_end",async event=>{event.toolName!==TODO_TOOL_NAME||event.isError||widget?.update()})}var MINIMAX_CN_HOST="https://api.minimaxi.com",MINIMAX_GLOBAL_HOST="https://api.minimax.io";function trimValue(value2){return value2?.trim()||void 0}async function runtimeApiKey(modelRuntime,providerId){if(modelRuntime)try{return trimValue((await modelRuntime.getAuth(providerId))?.auth.apiKey)}catch{return}}function storedApiKey(providerId,authPath){let credential=readStoredCredential(providerId,authPath);if(!credential||credential.type!=="api_key"||typeof credential.key!="string")return;let key=isCommandConfigValue(credential.key)?resolveConfigValue(credential.key,credential.env):credential.key;return trimValue(key)}async function resolveProviderKey(modelRuntime,authPath,providerId,envVar){return await runtimeApiKey(modelRuntime,providerId)??storedApiKey(providerId,authPath)??trimValue(process.env[envVar])}async function resolveMiniMaxCredential(modelRuntime,authPath){let cnKey=await resolveProviderKey(modelRuntime,authPath,"minimax-cn","MINIMAX_CN_API_KEY");if(cnKey)return{key:cnKey,host:MINIMAX_CN_HOST};let globalKey=await resolveProviderKey(modelRuntime,authPath,"minimax","MINIMAX_API_KEY");if(globalKey)return{key:globalKey,host:trimValue(process.env.MINIMAX_API_HOST)??MINIMAX_GLOBAL_HOST}}async function resolveDeepSeekCredential(modelRuntime,authPath){let key=await resolveProviderKey(modelRuntime,authPath,"deepseek","DEEPSEEK_API_KEY");return key?{key}:void 0}function configuredEngine(credentials){return credentials.minimax&&credentials.deepseek?"dual":credentials.minimax?"minimax":credentials.deepseek?"deepseek":"none"}async function resolveSearchCredentials(modelRuntime,authPath=getAuthPath()){let[minimax,deepseek]=await Promise.all([resolveMiniMaxCredential(modelRuntime,authPath),resolveDeepSeekCredential(modelRuntime,authPath)]);return{minimax,deepseek}}var WEB_SEARCH_TOOL_NAME="web_search",WEB_SEARCH_LABEL="Web Search",WEB_SEARCH_DESCRIPTION="Search the live web through configured MiniMax and DeepSeek providers. When both are available, searches run concurrently and results are deduplicated and fused. Returns up to 12 source URLs with bounded titles and snippets, plus related searches and optional synthesis; partial provider failures still return successful results.",WEB_SEARCH_PROMPT_SNIPPET="Search the live web for current information",WEB_SEARCH_DISABLED_MESSAGE="Web search is disabled: Neither MiniMax nor DeepSeek API Key was found in auth.json or environment variables. Please add credentials via auth.json or environment variables (MINIMAX_API_KEY, DEEPSEEK_API_KEY).";function getEngineLabel(engine){return engine==="dual"?"MiniMax & DeepSeek":engine==="minimax"?"MiniMax":engine==="deepseek"?"DeepSeek":""}function getWebSearchPromptGuidelines(){return["Use `web_search` for current information, recent releases, live documentation, and other freshness-sensitive facts beyond your training cutoff.",`When using \`web_search\` for freshness-sensitive topics, account for the current date (${new Date().toISOString().slice(0,7)}) and include the year in the query when useful.`]}var TRACKING_PARAMS=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","ref","fbclid","gclid","trk","gi"]);function truncateText2(text2,maxLength){return text2.length<=maxLength?text2:maxLength<=3?text2.slice(0,maxLength):`${text2.slice(0,maxLength-3).trimEnd()}...`}function boundSingleLineText(value2,maxLength){if(typeof value2!="string")return;let normalized=value2.replace(/\s+/g," ").trim();return normalized?truncateText2(normalized,maxLength):void 0}function boundMultilineText(value2,maxLength){if(typeof value2!="string")return;let normalized=value2.trim();return normalized?truncateText2(normalized,maxLength):void 0}function normalizeUrl(rawUrl){if(typeof rawUrl!="string")return;let trimmed=rawUrl.trim();if(!(!trimmed||trimmed.length>2048))try{let url=new URL(trimmed);if(url.protocol!=="http:"&&url.protocol!=="https:")return;url.hash="";for(let parameter of TRACKING_PARAMS)url.searchParams.has(parameter)&&url.searchParams.delete(parameter);url.pathname.length>1&&url.pathname.endsWith("/")&&(url.pathname=url.pathname.replace(/\/+$/,""));let normalized=url.toString();return normalized.length<=2048?normalized:void 0}catch{return}}function normalizeHit(hit,source){let url=normalizeUrl(hit.url);if(url)return{title:boundSingleLineText(hit.title,200)??url,url,snippet:boundSingleLineText(hit.snippet,200),date:boundSingleLineText(hit.date,100),sources:[...new Set([...hit.sources,source])]}}function isUrlFallbackTitle(title,url){let normalizedTitle=normalizeUrl(title);return normalizedTitle!==void 0&&normalizedTitle===normalizeUrl(url)}function reciprocalRankScore(candidate){let score=0;for(let rank of candidate.ranks.values())score+=1/(60+rank);return score}function bestRank(candidate){return Math.min(...candidate.ranks.values())}function fuseSearchHits(results){let candidates=new Map,relatedSearches=new Set,deepseekSynthesis;for(let result2 of results){let providerRelated=Array.isArray(result2.relatedSearches)?result2.relatedSearches:[],relatedScanLimit=Math.min(providerRelated.length,64);for(let index3=0;index3<relatedScanLimit&&relatedSearches.size<8;index3++){let normalized=boundSingleLineText(providerRelated[index3],200);normalized&&relatedSearches.add(normalized)}let synthesis=boundMultilineText(result2.synthesisText,6e3);synthesis&&(deepseekSynthesis=synthesis);let providerHits=Array.isArray(result2.hits)?result2.hits:[],hitScanLimit=Math.min(providerHits.length,200);for(let index3=0;index3<hitScanLimit;index3++){let rawHit=providerHits[index3];if(!rawHit)continue;let hit=normalizeHit(rawHit,result2.source);if(!hit)continue;let rank=index3+1,existing=candidates.get(hit.url);if(!existing){candidates.set(hit.url,{hit,ranks:new Map([[result2.source,rank]])});continue}let previousRank=existing.ranks.get(result2.source);(previousRank===void 0||rank<previousRank)&&existing.ranks.set(result2.source,rank);for(let source of hit.sources)existing.hit.sources.includes(source)||existing.hit.sources.push(source);isUrlFallbackTitle(existing.hit.title,existing.hit.url)&&!isUrlFallbackTitle(hit.title,hit.url)&&(existing.hit.title=hit.title),(!existing.hit.snippet||existing.hit.snippet.length<(hit.snippet?.length??0))&&hit.snippet&&(existing.hit.snippet=hit.snippet),!existing.hit.date&&hit.date&&(existing.hit.date=hit.date)}}return{hits:[...candidates.entries()].sort(([leftUrl,left],[rightUrl,right])=>{let scoreDifference=reciprocalRankScore(right)-reciprocalRankScore(left);if(scoreDifference!==0)return scoreDifference;let rankDifference=bestRank(left)-bestRank(right);return rankDifference!==0?rankDifference:leftUrl.localeCompare(rightUrl)}).map(([,candidate])=>candidate.hit).slice(0,12),relatedSearches:relatedSearches.size>0?[...relatedSearches]:void 0,deepseekSynthesis}}function escapeMarkdownText(text2){return text2.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/</g,"\\<").replace(/>/g,"\\>")}function canonicalSources(value2){if(!Array.isArray(value2))return[];let sources=[],scanLimit=Math.min(value2.length,32);for(let index3=0;index3<scanLimit&&sources.length<2;index3++){let source=value2[index3];(source==="MiniMax"||source==="DeepSeek")&&!sources.includes(source)&&sources.push(source)}return sources}function formatHit(value2){if(!value2||typeof value2!="object")return;let hit=value2,url=normalizeUrl(hit.url);if(url)return{title:escapeMarkdownText(boundSingleLineText(hit.title,200)??url),url,snippet:boundSingleLineText(hit.snippet,200),sources:canonicalSources(hit.sources)}}function usableHits(details){let hits=Array.isArray(details.hits)?details.hits:[],formatted=[],scanLimit=Math.min(hits.length,240);for(let index3=0;index3<scanLimit&&formatted.length<12;index3++){let hit=formatHit(hits[index3]);hit&&formatted.push(hit)}return formatted}function formatResultsMarkdown(details){let parts=[],hits=usableHits(details);hits.length>0&&(parts.push(`## Web Sources (${hits.length} found via ${getEngineLabel(details.engine)})
|
|
1615
|
+
`),report:{text:run.report,truncated:run.reportTruncated},error:run.error,model:`${run.model} \xB7 ${run.thinking}`,usage:`${run.usage.totalTokens} tokens \xB7 $${run.usage.cost.toFixed(4)} \xB7 ${run.usage.toolUses} tool calls`}))}}function emitDetails(runs,tasks,startedAt,onUpdate){let details={status:statusOf(runs),runs:runs.map(toRunDetails),startedAt,usage:aggregateUsage(runs)};return onUpdate?.(boundSubagentDetails(details),backgroundProjection(runs,tasks,details)),details}function validateTaskCount(tasks){if(tasks.length===0)throw new Error("Subagent task list must not be empty.");if(tasks.length>8)throw new Error(`Subagent task list is limited to ${8} tasks.`)}async function resolveTasks(tasks,options){validateTaskCount(tasks);let config=await loadSubagentConfig(options.agentDir,options.onConfigWarning);return Promise.all(tasks.map((task,index3)=>resolveSubagentTask(task,options.parentCwd,options.parent,options.agentDir,config).catch(error=>{let message=error instanceof Error?error.message:String(error);throw new Error(`Subagent task tasks[${index3}] failed to resolve: ${message}`)})))}function isRetryableRunError(error){return error?isRetryableAssistantError({role:"assistant",content:[],stopReason:"error",errorMessage:error}):!1}function shouldRetryTask(run){return run.status==="failed"&&run.usage.turns===0&&run.usage.toolUses===0&&isRetryableRunError(run.error)}async function runWithGate(task,scope,options,dispatch,getState2,onProgress){let baseDelayMs=options.taskRetryBaseDelayMs??1e3;for(let attempt2=0;;attempt2++){dispatch({type:"retry_started"});let release2,delayMs=0;try{if(release2=await options.gate.acquire(scope.signal),scope.signal.aborted){dispatch({type:"abort_while_queued",endedAt:Date.now()});return}dispatch({type:"slot_acquired",startedAt:Date.now()}),await runSdkTask({task,scope,dispatch,modelRuntime:options.modelRuntime,agentDir:options.agentDir,projectTrusted:task.insideParent?options.projectTrusted:!1,onProgress});let state2=getState2();if(attempt2>=2||scope.signal.aborted||!shouldRetryTask(state2))return;delayMs=baseDelayMs*2**attempt2,dispatch({type:"retry_scheduled",attempt:attempt2+1,maxAttempts:2,deadline:Date.now()+delayMs,error:state2.error})}catch(error){scope.signal.aborted?dispatch({type:"abort_while_queued",endedAt:Date.now()}):dispatch({type:"settle",verdict:"failed",report:"",error:error instanceof Error?error.message:String(error),endedAt:Date.now()});return}finally{release2?.()}try{await abortableSleep(delayMs,scope)}catch{dispatch({type:"abort_while_retrying",endedAt:Date.now()});return}}}async function runSubagentInvocation(options){let invocationScope=createRunCancellation(options.signal),unregisterInvocation=options.registerAbort?.(invocationScope.abort);try{let tasks=options.params.tasks??[],resolved=await resolveTasks(tasks,options),runs=resolved.map((task,index3)=>createRunState(task,index3,options.batchId,options.parentCwd)),startedAt=Date.now(),scopes=runs.map(()=>createRunCancellation(invocationScope.signal)),unregisterChildren=invocationScope.onAbort(async()=>{await Promise.allSettled(scopes.map(scope=>scope.abort()))}),lastVersion=versionSum(runs),progress=()=>{let version2=versionSum(runs);version2!==lastVersion&&(lastVersion=version2,emitDetails(runs,resolved,startedAt,options.onUpdate))},dispatch=(index3,event)=>{runs[index3]=reduceRun(runs[index3],event),progress()},latestDetails=emitDetails(runs,resolved,startedAt,options.onUpdate);try{invocationScope.aborted||options.onAccepted?.(),await Promise.all(resolved.map((task,index3)=>{let dispatchToRun=event=>dispatch(index3,event);return runWithGate(task,scopes[index3],options,dispatchToRun,()=>runs[index3],progress)}))}finally{unregisterChildren();for(let scope of scopes)scope.dispose()}return latestDetails=emitDetails(runs,resolved,startedAt,void 0),latestDetails.endedAt=Date.now(),{content:resultContent(latestDetails),details:boundSubagentDetails(latestDetails),projection:backgroundProjection(runs,resolved,latestDetails),usage:toNestedUsage(latestDetails.usage)}}finally{unregisterInvocation?.(),invocationScope.dispose()}}function nullable(schema,description){return typebox_exports.Optional(typebox_exports.Union([schema,typebox_exports.Null()],{description}))}var TaskSchema=typebox_exports.Object({agent:nullable(StringEnum(SUBAGENT_AGENT_NAMES,{description:"Which built-in profile runs this task"}),"Built-in profile; null or omit for explorer (the default)"),prompt:typebox_exports.String({minLength:1,maxLength:5e4,description:"Complete self-contained briefing; the worker cannot see the parent conversation"}),description:nullable(typebox_exports.String({minLength:1,maxLength:80}),"Short task label (3-5 words) shown in the /bg list, live rows, and report headings; null or omit to derive it from the prompt"),cwd:nullable(typebox_exports.String({minLength:1,maxLength:4096}),"Worker directory; relative paths resolve against the parent directory. A directory outside the parent runs without that project's settings. Null or omit to inherit.")},{additionalProperties:!1}),SubagentParamsSchema=typebox_exports.Object({background:nullable(typebox_exports.Boolean(),"true runs all tasks as one managed background group and returns a group reference immediately; false, null or omit blocks until every worker finishes and returns their reports"),tasks:typebox_exports.Array(TaskSchema,{minItems:1,maxItems:8,description:`Independent tasks run concurrently: at most ${6} active at once, excess tasks queue, and results preserve input order`})},{additionalProperties:!1}),ROOT_FIELDS=new Set(["background","tasks"]),TASK_FIELDS=["agent","prompt","description","cwd"];function normalizeSubagentArguments(raw){if(raw===null||typeof raw!="object"||Array.isArray(raw))return raw;let args={...raw};for(let key of Object.keys(args))args[key]===null&&!ROOT_FIELDS.has(key)&&delete args[key];if(args.tasks===void 0&&typeof args.prompt=="string"){let task={};for(let key of TASK_FIELDS)args[key]!==void 0&&(task[key]=args[key]),delete args[key];args.tasks=[task]}return args}function subagent(pi){let gate=new ConcurrencyGate,workerOrdinal=0,activeAborters=new Set;pi.registerTool({name:SUBAGENT_TOOL_NAME,label:SUBAGENT_TOOL_LABEL,description:subagentToolDescription(),promptSnippet:"Delegate bounded work to isolated explorer or general workers",promptGuidelines:["Use `subagent` for bounded work that benefits from isolated context or concurrent investigation; do not delegate a task you can finish with one or two direct tool calls.","Give every task a short `description` label; it is shown in the /bg list, live rows, and report headings."],parameters:SubagentParamsSchema,constrainedSampling:{type:"json_schema",strict:"prefer"},prepareArguments:normalizeSubagentArguments,async execute(toolCallId,params,signal,onUpdate,ctx){let host=ctx.background;if(host?.closed)throw new Error("Background service is closed");let managed=host?.enabled||params.background===!0;if(managed&&!host)throw new Error("Background execution requires an enabled Background host.");let latest={status:"running",runs:[],startedAt:Date.now(),usage:emptyUsage3()},ordinals=new Map,projection=view=>({...view,workers:view.workers?.map(worker=>{let ordinal=ordinals.get(worker.id);return ordinal===void 0&&(ordinal=++workerOrdinal,ordinals.set(worker.id,ordinal)),{...worker,label:`#${ordinal} ${worker.profile}`}})}),run=async control=>{let update=(details,view)=>{latest=details;let result3={content:[{type:"text",text:statusSummary(details)}],details};control?control.publish(result3,view?projection(view):void 0):onUpdate?.(result3)};update(latest);let parent={model:ctx.model,thinking:pi.getThinkingLevel(),modelRegistry:ctx.modelRegistry},execution=await runSubagentInvocation({params,parentCwd:ctx.cwd,parent,modelRuntime:ctx.modelRuntime,agentDir:getAgentDir(),projectTrusted:ctx.isProjectTrusted(),signal:control?.signal??signal,gate,batchId:control?.id??toolCallId,onUpdate:update,onAccepted:control?()=>control.accept():void 0,onConfigWarning:message=>ctx.ui.notify(message,"warning"),registerAbort:control?void 0:abort=>(activeAborters.add(abort),()=>activeAborters.delete(abort))}),result2={content:[{type:"text",text:execution.content}],details:execution.details,usage:execution.usage};return control?.publish(result2,projection(execution.projection)),result2};if(!managed)return run();let outcome=await host.execute({kind:"subagent",title:subagentGroupTitle(params.tasks),toolCallId,background:params.background===!0,signal,onUpdate,run:async control=>{let result2=await run(control),status=result2.details.status;return{result:result2,status:status==="aborted"?"cancelled":status==="running"?"failed":status}}});if(outcome.kind==="result")return outcome.result;let submittedAt=Date.now();return{content:[{type:"text",text:`Subagent group handed to background: ${outcome.task.id}. Completion arrives automatically as a notification \u2014 do not poll or immediately wait on it; continue with other work or hand back to the user. Use bg read to inspect progress, bg wait only when your next step is blocked on the result (prefer foreground next time in that case), or bg kill to stop the whole group.`}],details:{...latest,endedAt:submittedAt,background:{id:outcome.task.id,submittedAt}}}},renderCall(args,theme2){return renderSubagentCall(args,theme2)},renderResult(result2,options,theme2,context){return scheduleLiveRefresh(context,options.isPartial&&!result2.details?.background),renderSubagentResult(result2,options,theme2,context.args,context.isError)}}),pi.registerCommand(SUBAGENT_COMMAND_NAME,{description:"Configure Subagent profiles, models, and thinking levels",handler:async(_args,ctx)=>showAgentsCommand(ctx,pi.getThinkingLevel())}),pi.on("tool_result",async event=>{if(event.toolName!==SUBAGENT_TOOL_NAME)return;let details=event.details;if(details&&!details.background&&isSubagentError(details))return{isError:!0}}),pi.on("session_shutdown",async()=>{await Promise.allSettled([...activeAborters].map(abort=>abort())),activeAborters.clear()})}var TODO_TOOL_NAME="todo",TODO_TOOL_LABEL="Todo",TODOS_COMMAND_NAME="todos";var TODO_TOOL_DESCRIPTION=`Manage the conversation's task list for multi-step coding work. One call applies a patch: create adds tasks (status defaults to pending), update edits tasks by id (blank or omitted fields are kept), delete removes tasks by id. Omit or leave empty any group you do not need; call with {} to list every task with its description. Exactly one task may be in_progress: setting one demotes the others. The list holds 20 tasks; when full, the oldest completed tasks are removed automatically. A call that fails validation leaves the list unchanged.
|
|
1616
|
+
|
|
1617
|
+
{"create": [{"subject": "Wire parser", "description": "Parser handles the config format", "status": "in_progress"}]}
|
|
1618
|
+
{"update": [{"id": 1, "status": "completed"}, {"id": 2, "status": "in_progress"}]}
|
|
1619
|
+
{"delete": [3]}`,TODO_PROMPT_SNIPPET="Track multi-step coding work with a small outcome-oriented task list",TODO_PROMPT_GUIDELINES=["Use `todo` for work with three or more meaningful steps, for user-provided task lists, and in long sessions where progress can drift; skip it for trivial single-step tasks and simple Q&A.","Keep exactly one `todo` task in_progress: mark it before starting the work, and completed only after its description is satisfied \u2014 never while tests fail or work is partial.","When blocked, leave the `todo` task pending and create a task for the blocker instead of faking completion.","Keep the `todo` list short: list before create to avoid duplicates, work in id order, and delete obsolete tasks promptly."];var TODO_DETAILS_SCHEMA_VERSION=3,StatusSchema=StringEnum(["pending","in_progress","completed"],{description:"Task status: pending for future work, in_progress for the single active task, completed for verified done work. Exactly one task may be in_progress; setting one demotes any other active task to pending."}),TaskIdSchema=typebox_exports.Integer({minimum:1,description:"Positive task id."}),CreateItemSchema=typebox_exports.Object({subject:typebox_exports.String({maxLength:160,description:"Short imperative task subject; a reviewable unit of work."}),description:typebox_exports.String({maxLength:500,description:"What done means for this task: acceptance criteria or verification detail."}),status:typebox_exports.Optional(StatusSchema)},{additionalProperties:!1}),UpdateItemSchema=typebox_exports.Object({id:TaskIdSchema,subject:typebox_exports.Optional(typebox_exports.String({maxLength:160,description:"Replacement subject; blank or omitted keeps the current one."})),description:typebox_exports.Optional(typebox_exports.String({maxLength:500,description:"Replacement description (what done means); blank or omitted keeps the current one."})),status:typebox_exports.Optional(StatusSchema)},{additionalProperties:!1}),TodoParamsSchema=typebox_exports.Object({create:typebox_exports.Optional(typebox_exports.Array(CreateItemSchema,{maxItems:20,description:"Tasks to add, created atomically in input order; status defaults to pending."})),update:typebox_exports.Optional(typebox_exports.Array(UpdateItemSchema,{maxItems:20,description:"Task edits by id; blank or omitted fields keep their current values."})),delete:typebox_exports.Optional(typebox_exports.Array(TaskIdSchema,{maxItems:20,description:"Ids to remove from the current list; deleting an id that is already absent is a no-op."}))},{additionalProperties:!1}),EMPTY_TODO_STATE={items:[],nextId:1};var TODO_STATUSES=new Set(["pending","in_progress","completed"]),GROUP_FIELDS=new Set(["create","update","delete"]);function isRecord5(value2){return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)}function isPositiveSafeInteger(value2){return typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=1}function isTodoStatus(value2){return typeof value2=="string"&&TODO_STATUSES.has(value2)}function dedupeIds(ids){let seen=[];for(let id of ids)seen.includes(id)||seen.push(id);return seen}function normalizeText(value2){return value2.trim().replace(/\s+/g," ")}function validateRequiredText(value2,label,maximum){if(typeof value2!="string")throw new Error(`${label} must be a string`);let normalized=normalizeText(value2);if(!normalized)throw new Error(`${label} cannot be empty`);if(normalized.length>maximum)throw new Error(`${label} exceeds ${maximum} characters`);return normalized}function validateOptionalText(value2,label,maximum){if(value2===void 0)return;if(typeof value2!="string")throw new Error(`${label} must be a string`);let normalized=normalizeText(value2);if(normalized){if(normalized.length>maximum)throw new Error(`${label} exceeds ${maximum} characters`);return normalized}}function validateOptionalStatus(value2,label){if(value2!==void 0){if(!isTodoStatus(value2))throw new Error(`${label} is invalid`);return value2}}function readCreateEntries(raw){if(raw===void 0)return[];if(!Array.isArray(raw))throw new Error("create must be an array");if(raw.length>20)throw new Error(`create exceeds ${20} tasks`);let entries=[];for(let index3=0;index3<raw.length;index3++){let item=raw[index3];if(!isRecord5(item))throw new Error(`create[${index3}] must be an object`);for(let key of Object.keys(item))if(key!=="subject"&&key!=="description"&&key!=="status")throw new Error(`create[${index3}].${key} is not a create field; valid fields: subject, description, status`);let entry={subject:validateRequiredText(item.subject,`create[${index3}].subject`,160),description:validateRequiredText(item.description,`create[${index3}].description`,500)},status=validateOptionalStatus(item.status,`create[${index3}].status`);status!==void 0&&(entry.status=status),entries.push(entry)}return entries}function readUpdateEntries(raw){if(raw===void 0)return[];if(!Array.isArray(raw))throw new Error("update must be an array");if(raw.length>20)throw new Error(`update exceeds ${20} tasks`);let entries=[];for(let index3=0;index3<raw.length;index3++){let item=raw[index3];if(!isRecord5(item))throw new Error(`update[${index3}] must be an object`);for(let key of Object.keys(item))if(key!=="id"&&key!=="subject"&&key!=="description"&&key!=="status")throw new Error(`update[${index3}].${key} is not an update field; valid fields: id, subject, description, status`);if(!isPositiveSafeInteger(item.id))throw new Error(`update[${index3}].id must be a positive integer`);let entry={id:item.id},subject=validateOptionalText(item.subject,`update[${index3}].subject`,160);subject!==void 0&&(entry.subject=subject);let description=validateOptionalText(item.description,`update[${index3}].description`,500);description!==void 0&&(entry.description=description);let status=validateOptionalStatus(item.status,`update[${index3}].status`);status!==void 0&&(entry.status=status),entries.push(entry)}return entries}function readDeleteIds(raw){if(raw===void 0)return[];if(!Array.isArray(raw))throw new Error("delete must be an array");if(raw.length>20)throw new Error(`delete exceeds ${20} ids`);let ids=[];for(let index3=0;index3<raw.length;index3++){if(!isPositiveSafeInteger(raw[index3]))throw new Error(`delete[${index3}] must be a positive integer id`);ids.push(raw[index3])}return ids}function currentIdsLabel(state2){return state2.items.length===0?"the list is empty":`current ids: ${state2.items.map(item=>`#${item.id}`).join(", ")}`}function cloneTodoState(state2){return{items:state2.items.map(item=>({...item})),nextId:state2.nextId}}function applyTodoPatch(before,params){if(!isRecord5(params))throw new Error("todo params must be an object");for(let key of Object.keys(params))if(!GROUP_FIELDS.has(key))throw new Error(`unknown todo field "${key}"; valid fields: create, update, delete`);let createEntries=readCreateEntries(params.create),updateEntries=readUpdateEntries(params.update),deleteIds=readDeleteIds(params.delete),updatedIds=new Set;for(let entry of updateEntries){if(updatedIds.has(entry.id))throw new Error(`#${entry.id} appears more than once in update`);updatedIds.add(entry.id)}let deleteSet=new Set(deleteIds);for(let entry of updateEntries)if(deleteSet.has(entry.id))throw new Error(`#${entry.id} cannot be in both update and delete`);let activations=[];createEntries.forEach((entry,index3)=>{entry.status==="in_progress"&&activations.push(`create[${index3}]`)});for(let entry of updateEntries)entry.status==="in_progress"&&activations.push(`#${entry.id}`);if(activations.length>1)throw new Error(`at most one task may be set in_progress per call; got ${activations.join(" and ")}`);let byId=new Map(before.items.map(item=>[item.id,item]));for(let entry of updateEntries)if(!byId.has(entry.id))throw new Error(`#${entry.id} not found; ${currentIdsLabel(before)}`);if(createEntries.length>0){if(!Number.isSafeInteger(before.nextId)||before.nextId<1)throw new Error("next id is invalid");if(before.nextId>Number.MAX_SAFE_INTEGER-createEntries.length)throw new Error("next id is exhausted")}let deleted=[],absent=[];for(let id of dedupeIds(deleteIds)){let item=byId.get(id);item?deleted.push({id:item.id,subject:item.subject}):absent.push(id)}let items=before.items.filter(item=>!deleteSet.has(item.id)),updated=[];if(updateEntries.length>0){let entriesById=new Map(updateEntries.map(entry=>[entry.id,entry]));items=items.map(item=>{let entry=entriesById.get(item.id);if(!entry)return item;let next={id:item.id,subject:entry.subject??item.subject,description:entry.description??item.description,status:entry.status??item.status};return updated.push({id:item.id,from:item.status,to:next.status}),next})}let created=[];if(createEntries.length>0){let newItems=createEntries.map((entry,index3)=>({id:before.nextId+index3,subject:entry.subject,description:entry.description,status:entry.status??"pending"}));for(let item of newItems)created.push(item.id);items=[...items,...newItems]}let demotedId,activatedId;for(let entry of updateEntries)entry.status==="in_progress"&&(activatedId=entry.id);if(activatedId===void 0&&createEntries.forEach((entry,index3)=>{entry.status==="in_progress"&&(activatedId=before.nextId+index3)}),activatedId!==void 0){let demoted=items.find(item=>item.id!==activatedId&&item.status==="in_progress");demoted&&(demotedId=demoted.id,items=items.map(item=>item.id===demoted.id?{...item,status:"pending"}:item))}let evicted=[];if(items.length>20){let overflow=items.length-20,evictIds=new Set,completedOldestFirst=items.filter(item=>item.status==="completed").sort((first,second)=>first.id-second.id);for(let item of completedOldestFirst){if(overflow<=0)break;evictIds.add(item.id),evicted.push({id:item.id,subject:item.subject}),overflow--}if(overflow>0)throw new Error(`at most ${20} open tasks; complete or delete some first`);items=items.filter(item=>!evictIds.has(item.id))}let change={created,updated,deleted,absent,evicted};return demotedId!==void 0&&(change.demotedId=demotedId),{state:{items,nextId:before.nextId+created.length},change}}function buildTodoDetails(change,state2){return{schemaVersion:TODO_DETAILS_SCHEMA_VERSION,change,state:cloneTodoState(state2)}}function requireValidState(value2){let state2=normalizeSnapshotState(value2);if(!state2)throw new Error("todo state is invalid");return state2}function createTodoStore(initial){let state2=requireValidState(initial??EMPTY_TODO_STATE);return{getState(){return cloneTodoState(state2)},replaceState(next){state2=requireValidState(next)},execute(params){let patch=applyTodoPatch(state2,params),details=buildTodoDetails(patch.change,patch.state);return state2=patch.state,details}}}function normalizeSnapshotState(value2){if(!isRecord5(value2)||!Array.isArray(value2.items)||!isPositiveSafeInteger(value2.nextId)||value2.items.length>20)return;let items=[],ids=new Set,maxId=0,activeCount=0;for(let rawItem of value2.items){if(!isRecord5(rawItem))return;let id=rawItem.id;if(!isPositiveSafeInteger(id)||ids.has(id))return;let subject=rawItem.subject,description=rawItem.description,status=rawItem.status;if(typeof subject!="string"||typeof description!="string"||subject!==normalizeText(subject)||description!==normalizeText(description)||!subject||subject.length>160||!description||description.length>500||!isTodoStatus(status))return;ids.add(id),id>maxId&&(maxId=id),status==="in_progress"&&activeCount++,items.push({id,subject,description,status})}if(!(activeCount>1)&&!(value2.nextId<=maxId))return{items,nextId:value2.nextId}}function replayTodosFromBranch(ctx){let branch=Array.from(ctx.sessionManager.getBranch());for(let index3=branch.length-1;index3>=0;index3--)try{let entry=branch[index3];if(!isRecord5(entry)||entry.type!=="message")continue;let message=entry.message;if(!isRecord5(message)||message.role!=="toolResult"||message.toolName!==TODO_TOOL_NAME)continue;let details=message.details;if(!isRecord5(details)||details.schemaVersion!==TODO_DETAILS_SCHEMA_VERSION)continue;let state2=normalizeSnapshotState(details.state);if(state2)return state2}catch{}return cloneTodoState(EMPTY_TODO_STATE)}var STATUS_MARK={pending:"[ ]",in_progress:"[>]",completed:"[x]"},STATUS_COLOR={pending:"dim",in_progress:"warning",completed:"success"},STATUS_RANK={in_progress:0,pending:1,completed:2},WIDGET_HEADER_SEPARATOR=" \xB7 ",WIDGET_ITEM_SEPARATOR=" ";function hasOpenTodos(state2){return state2.items.some(item=>item.status==="pending"||item.status==="in_progress")}function widgetCounts(state2){let counts={active:0,pending:0,completed:0};for(let item of state2.items)item.status==="in_progress"?counts.active++:item.status==="pending"?counts.pending++:counts.completed++;return counts}function widgetSegment(item,subject,theme2){return`${theme2.fg(STATUS_COLOR[item.status],STATUS_MARK[item.status])} ${theme2.fg("accent",`#${item.id}`)} ${theme2.fg("text",subject)}`}function widgetLine(header,segments,overflow){let body=[...segments,...overflow?[overflow]:[]].join(WIDGET_ITEM_SEPARATOR);return body?`${header}${WIDGET_HEADER_SEPARATOR}${body}`:header}function widgetOverflowLong(remaining,counts){let parts=[counts.active>0?`${counts.active} active`:"",counts.pending>0?`${counts.pending} pending`:"",counts.completed>0?`${counts.completed} completed`:""].filter(Boolean);return`+${remaining} more${parts.length?` (${parts.join(", ")})`:""}`}function renderWidgetLine(state2,theme2,width){let safeWidth=Math.max(1,width),items=state2.items,candidates=items.filter(item=>item.status!=="completed").sort((first,second)=>STATUS_RANK[first.status]-STATUS_RANK[second.status]||first.id-second.id);if(candidates.length===0)return[];let total=items.length,completed=items.filter(item=>item.status==="completed").length,header=`${theme2.fg("accent","Todos")} ${theme2.fg("dim",`${completed}/${total}`)}`,counts=widgetCounts(state2),shown=[],overflow="",bestOverflow=trial=>{let remaining=total-trial.length,segments2=trial.map(entry=>widgetSegment(entry.item,entry.subject,theme2)),activeShown=trial.some(entry=>entry.item.status==="in_progress")?1:0,hidden={active:counts.active-activeShown,pending:counts.pending-(trial.length-activeShown),completed:counts.completed};if(remaining<=0)return visibleWidth(widgetLine(header,segments2,""))<=safeWidth?"":void 0;let long=theme2.fg("dim",widgetOverflowLong(remaining,hidden));if(visibleWidth(widgetLine(header,segments2,long))<=safeWidth)return long;let short=theme2.fg("dim",`+${remaining} more`);return visibleWidth(widgetLine(header,segments2,short))<=safeWidth?short:void 0},fallback=()=>{let best=bestOverflow([]);return best!==void 0?[widgetLine(header,[],best)]:visibleWidth(header)<=safeWidth?[header]:[truncateToWidth(header,safeWidth,"\u2026")]};for(let candidate of candidates){let best=bestOverflow([...shown,{item:candidate,subject:candidate.subject}]);if(best!==void 0){shown.push({item:candidate,subject:candidate.subject}),overflow=best;continue}if(candidate.status!=="in_progress")break;let remaining=total-shown.length-1,suffix=remaining>0?`${WIDGET_ITEM_SEPARATOR}+${remaining} more`:"",prefix=`${header}${WIDGET_HEADER_SEPARATOR}${widgetSegment(candidate,"",theme2)}${suffix}`,available=safeWidth-visibleWidth(prefix);if(available<1)return fallback();shown.push({item:candidate,subject:truncateToWidth(candidate.subject,available,"\u2026")}),overflow=bestOverflow(shown)??""}if(shown.length===0)return fallback();let segments=shown.map(entry=>widgetSegment(entry.item,entry.subject,theme2)),line=widgetLine(header,segments,overflow);return[visibleWidth(line)<=safeWidth?line:truncateToWidth(line,safeWidth,"\u2026")]}function formatTodoList(state2){if(state2.items.length===0)return"No todos.";let counts=widgetCounts(state2),lines=[`Todos: ${counts.active} in progress, ${counts.pending} pending, ${counts.completed} completed`],items=[...state2.items].sort((first,second)=>STATUS_RANK[first.status]-STATUS_RANK[second.status]||first.id-second.id);for(let item of items)lines.push(`${STATUS_MARK[item.status]} #${item.id} ${item.subject}`),lines.push(` ${item.description}`);return lines.join(`
|
|
1620
|
+
`)}var formatCommandList=formatTodoList;function formatIdRange(ids){return ids.length>1&&ids.every((id,index3)=>id===ids[0]+index3)?`#${ids[0]}\u2013#${ids[ids.length-1]}`:ids.map(id=>`#${id}`).join(", ")}function formatTodoContent(change,state2){let parts=[];if(change.created.length>0){let labels=change.created.map(id=>{let item=state2.items.find(entry=>entry.id===id);if(!item)return`#${id}`;let suffix=item.status==="pending"?"":` (${item.status})`;return`#${id}: ${item.subject}${suffix}`}),noun=change.created.length===1?"task":"tasks";parts.push(`Created ${change.created.length} ${noun}: ${labels.join("; ")}`)}for(let entry of change.updated){let item=state2.items.find(candidate=>candidate.id===entry.id),subject=item?`: ${item.subject}`:"",transition=entry.from===entry.to?"":` (${entry.from} -> ${entry.to})`;parts.push(`Updated #${entry.id}${transition}${subject}`)}if(change.demotedId!==void 0&&parts.push(`demoted #${change.demotedId} to pending`),change.deleted.length>0){let noun=change.deleted.length===1?"task":"tasks",labels=change.deleted.map(entry=>`#${entry.id}: ${entry.subject}`);parts.push(`Deleted ${change.deleted.length} ${noun}: ${labels.join("; ")}`)}for(let id of change.absent)parts.push(`#${id} already absent`);if(change.evicted.length>0){let ids=change.evicted.map(entry=>entry.id);parts.push(`auto-removed completed ${formatIdRange(ids)} to stay within ${20}`)}return parts.length===0?formatTodoList(state2):parts.join("; ")}var CALL_ITEMS_MAX=20,CALL_SUBJECT_PREVIEW_COUNT=2,CALL_SUBJECT_PREVIEW_WIDTH=72,CALL_DESCRIPTION_PREVIEW_LENGTH=120,GROUP_FAILURE_MAX_LENGTH=120;function safeRecord2(value2){try{return value2!==null&&typeof value2=="object"&&!Array.isArray(value2)?value2:void 0}catch{return}}function safeValue2(record,key){try{return record?.[key]}catch{return}}function safeString(value2){return typeof value2=="string"?value2:void 0}function clipText(value2,max){return safeString(value2)?.trim().replace(/\s+/g," ").slice(0,max)??""}var safeSubject=value2=>clipText(value2,160),safeDescription=value2=>clipText(value2,500);function safeId(value2){return typeof value2=="number"&&Number.isSafeInteger(value2)&&value2>=1?value2:void 0}function safeStatus(value2){let status=safeString(value2);if(status==="pending"||status==="in_progress"||status==="completed")return status}function readArray(value2,limit=CALL_ITEMS_MAX){try{if(!Array.isArray(value2))return;let length=value2.length,values=[];for(let index3=0;index3<Math.min(length,limit);index3++)try{values.push(value2[index3])}catch{values.push(void 0)}return{values,length}}catch{return}}function readIds(value2){let array=readArray(value2);if(!array)return;let ids=[];for(let entry of array.values){let id=safeId(entry);id!==void 0&&ids.push(id)}return ids}function batchCreateItems(value2){let result2=[];for(let raw of readArray(value2)?.values??[]){let item=safeRecord2(raw);if(!item)continue;let entry={subject:safeSubject(safeValue2(item,"subject")),description:safeDescription(safeValue2(item,"description"))},status=safeStatus(safeValue2(item,"status"));status&&(entry.status=status),result2.push(entry)}return result2}function batchUpdateItems(value2){let result2=[];for(let raw of readArray(value2)?.values??[]){let item=safeRecord2(raw);if(!item)continue;let entry={subject:safeSubject(safeValue2(item,"subject")),description:safeDescription(safeValue2(item,"description"))},id=safeId(safeValue2(item,"id"));id!==void 0&&(entry.id=id);let status=safeStatus(safeValue2(item,"status"));status&&(entry.status=status),result2.push(entry)}return result2}function descriptionPreview(value2){let text2=value2.replace(/\s+/g," ");return text2.length>CALL_DESCRIPTION_PREVIEW_LENGTH?`${text2.slice(0,CALL_DESCRIPTION_PREVIEW_LENGTH-1)}\u2026`:text2}function formatSubjectPreview(subjects,total){let shown=subjects.filter(Boolean).slice(0,CALL_SUBJECT_PREVIEW_COUNT).map(subject=>truncateToWidth(subject,CALL_SUBJECT_PREVIEW_WIDTH,"\u2026"));if(!shown.length)return"";let hidden=Math.max(0,total-shown.length);return`${shown.join(", ")}${hidden?`, +${hidden} more`:""}`}function todoDetails(value2){let details=safeRecord2(value2);if(!details||safeValue2(details,"schemaVersion")!==TODO_DETAILS_SCHEMA_VERSION)return;let change=safeRecord2(safeValue2(details,"change")),state2=safeRecord2(safeValue2(details,"state"));if(!(!change||!state2))return{change,state:state2}}function createResultIds(result2,count){let details=todoDetails(result2?.details);if(!details)return;let ids=readIds(safeValue2(details.change,"created"));return ids&&ids.length===count&&count>0?ids:void 0}function deleteResultRemoved(result2){let details=todoDetails(result2?.details);return details?idSubjectEntries(safeValue2(details.change,"deleted")):[]}function deleteResultAbsent(result2){let details=todoDetails(result2?.details);return details?readIds(safeValue2(details.change,"absent"))??[]:[]}function formatCallParts(args,theme2,result2){let details=[],segments=[],pushSegment=(verb,body)=>{let title=segments.length===0?`todo ${verb}`:verb;segments.push(body?`${theme2.fg("toolTitle",theme2.bold(title))} ${body}`:theme2.fg("toolTitle",theme2.bold(title)))},hasCreate=args?.create!==void 0,hasUpdate=args?.update!==void 0,hasDelete=args?.delete!==void 0;if(hasCreate){let items=batchCreateItems(args?.create),rawCount=readArray(args?.create)?.length;if(rawCount!==0){let body=[];if(rawCount!==void 0){let count=Math.min(rawCount,CALL_ITEMS_MAX);body.push(theme2.fg("dim",`${count} ${count===1?"task":"tasks"}`));let preview=formatSubjectPreview(items.map(item=>item.subject),count);preview&&body.push(theme2.fg("dim","\xB7"),theme2.fg("text",preview))}pushSegment("create",body.join(" "))}let ids=createResultIds(result2,items.length);for(let[index3,item]of items.entries()){let marker=ids?theme2.fg("accent",`#${ids[index3]}`):theme2.fg("accent",`${index3+1}.`),status=item.status&&item.status!=="pending"?` ${theme2.fg(STATUS_COLOR[item.status],`(${item.status})`)}`:"";details.push(item.subject?`${marker} ${theme2.fg("text",item.subject)}${status}`:marker),item.description&&details.push(` ${theme2.fg("dim",descriptionPreview(item.description))}`)}}if(hasUpdate){let items=batchUpdateItems(args?.update);if(readArray(args?.update)?.length!==0){let entries=[];for(let item of items){let parts=[];item.id!==void 0&&parts.push(theme2.fg("accent",`#${item.id}`)),item.status&&parts.push(theme2.fg(STATUS_COLOR[item.status],item.status)),item.subject&&parts.push(theme2.fg("text",truncateToWidth(item.subject,CALL_SUBJECT_PREVIEW_WIDTH,"\u2026"))),parts.length>0&&entries.push(parts.join(" "))}pushSegment("update",entries.join(theme2.fg("dim",", ")))}for(let item of items)item.description&&details.push(` ${theme2.fg("dim",descriptionPreview(item.description))}`)}if(hasDelete){if(readArray(args?.delete)?.length!==0){let ids=readIds(args?.delete)??[];pushSegment("delete",ids.length>0?theme2.fg("accent",ids.map(id=>`#${id}`).join(", ")):"")}for(let entry of deleteResultRemoved(result2))details.push(`${theme2.fg("accent",`#${entry.id}`)} ${theme2.fg("text",entry.subject)}`);for(let id of deleteResultAbsent(result2))details.push(theme2.fg("dim",`#${id} already absent`))}return segments.length===0&&segments.push(theme2.fg("toolTitle",theme2.bold("todo list"))),{headline:segments.join(theme2.fg("dim"," ; ")),details}}function formatTodoCall(args,theme2,expanded,result2){let{headline,details}=formatCallParts(args,theme2,result2);return!expanded||details.length===0?headline:[headline,...details].join(`
|
|
1621
|
+
`)}function stateIndex(state2){let array=readArray(safeValue2(state2,"items"),20);if(!array||array.length>20)return;let byId=new Map,counts={inProgress:0,pending:0,completed:0};for(let raw of array.values){let item=safeRecord2(raw);if(!item)continue;let id=safeId(safeValue2(item,"id"));id!==void 0&&!byId.has(id)&&byId.set(id,item);let status=safeStatus(safeValue2(item,"status"));status==="in_progress"?counts.inProgress++:status==="pending"?counts.pending++:status==="completed"&&counts.completed++}return{byId,counts}}function stateSubject(map,id){let item=map.get(id);return item?safeSubject(safeValue2(item,"subject")):""}function idSubjectEntries(value2){let entries=[];for(let raw of readArray(value2)?.values??[]){let item=safeRecord2(raw),id=safeId(safeValue2(item,"id")),subject=safeSubject(safeValue2(item,"subject"));id===void 0||!subject||entries.push({id,subject})}return entries}function updatedEntries(value2){let entries=[];for(let raw of readArray(value2)?.values??[]){let item=safeRecord2(raw),id=safeId(safeValue2(item,"id"));if(id===void 0)continue;let entry={id},from=safeStatus(safeValue2(item,"from"));from&&(entry.from=from);let to=safeStatus(safeValue2(item,"to"));to&&(entry.to=to),entries.push(entry)}return entries}function formatTodoGroupSuccess(args,theme2,result2){let parsed=todoDetails(result2.details);if(!parsed)return;let{change,state:state2}=parsed,index3=stateIndex(state2),segments=[],pushVerb=(word,body)=>{let title=segments.length===0?`todo ${word}`:word;segments.push(body?`${theme2.fg("toolTitle",title)} ${body}`:theme2.fg("toolTitle",title))},withPreview=(word,ids,subjects)=>{let text2=formatSubjectPreview(subjects,subjects.length),base=theme2.fg("accent",formatIdRange(ids));pushVerb(word,text2?`${base}${theme2.fg("dim"," \xB7 ")}${theme2.fg("text",text2)}`:base)},created=readIds(safeValue2(change,"created"))??[];created.length>0&&index3&&withPreview("created",created,created.map(id=>stateSubject(index3.byId,id)));for(let entry of updatedEntries(safeValue2(change,"updated"))){let parts=[theme2.fg("accent",`#${entry.id}`)];entry.to&&parts.push(theme2.fg(STATUS_COLOR[entry.to],entry.to));let subject=index3?stateSubject(index3.byId,entry.id):"";subject&&parts.push(theme2.fg("text",truncateToWidth(subject,CALL_SUBJECT_PREVIEW_WIDTH,"\u2026"))),pushVerb("updated",parts.join(" "))}let demotedId=safeId(safeValue2(change,"demotedId"));demotedId!==void 0&&segments.push(theme2.fg("dim",`demoted #${demotedId}`));let deleted=idSubjectEntries(safeValue2(change,"deleted"));deleted.length>0&&withPreview("deleted",deleted.map(entry=>entry.id),deleted.map(entry=>entry.subject));for(let id of readIds(safeValue2(change,"absent"))??[])segments.push(theme2.fg("dim",`#${id} already absent`));let evicted=idSubjectEntries(safeValue2(change,"evicted"));if(evicted.length>0&&segments.push(theme2.fg("dim",`auto-removed ${evicted.map(entry=>`#${entry.id}`).join(", ")}`)),segments.length===0){if(!index3)return;let parts=[];return index3.counts.inProgress>0&&parts.push(`${index3.counts.inProgress} in progress`),index3.counts.pending>0&&parts.push(`${index3.counts.pending} pending`),index3.counts.completed>0&&parts.push(`${index3.counts.completed} completed`),`${theme2.fg("toolTitle","todo list")}: ${theme2.fg("dim",parts.length?parts.join(", "):"no tasks")}`}return segments.join(theme2.fg("dim"," ; "))}function formatTodoGroupCall(args,theme2,context){if(context.isError){let reason="tool failed";try{for(let block of context.result?.content.slice(0,8)??[]){if(block.type!=="text"||typeof block.text!="string")continue;let text2=block.text.replace(/[\u0000-\u001f\u007f-\u009f]/g," ").replace(/\s+/g," ").trim();if(text2){reason=text2.length>GROUP_FAILURE_MAX_LENGTH?`${text2.slice(0,GROUP_FAILURE_MAX_LENGTH-1)}\u2026`:text2;break}}}catch{}return`${formatTodoCall(args,theme2,!1)} ${theme2.fg("error",`failed: ${reason}`)}`}if(!context.isPartial&&context.result){let summary=formatTodoGroupSuccess(args,theme2,context.result);if(summary)return summary}return formatTodoCall(args,theme2,!1)}var WIDGET_KEY="todos",TodoWidget=class{constructor(getState2){this.registered=!1,this.getState=getState2}setUI(ui){this.ui!==ui&&(this.dispose(),this.ui=ui)}update(){if(this.ui){if(!hasOpenTodos(this.getState())){this.unregister();return}if(this.registered){this.tui?.requestRender();return}this.ui.setWidget(WIDGET_KEY,(tui,theme2)=>(this.tui=tui,{render:width=>renderWidgetLine(this.getState(),theme2,width),invalidate:()=>{}}),{placement:"aboveEditor"}),this.registered=!0}}unregister(){this.registered&&(this.ui?.setWidget(WIDGET_KEY,void 0),this.registered=!1,this.tui=void 0)}dispose(){this.unregister(),this.ui=void 0}};function safeReplay(ctx,store){try{store.replaceState(replayTodosFromBranch(ctx))}catch(error){if(!isStaleExtensionContextError(error))throw error}}function todo(pi){let store=createTodoStore(),widget;pi.registerTool({name:TODO_TOOL_NAME,label:TODO_TOOL_LABEL,description:TODO_TOOL_DESCRIPTION,promptSnippet:TODO_PROMPT_SNIPPET,promptGuidelines:TODO_PROMPT_GUIDELINES,parameters:TodoParamsSchema,constrainedSampling:{type:"json_schema",strict:"prefer"},executionMode:"sequential",toolGroup:TODO_TOOL_NAME,async execute(_toolCallId,params,_signal,_onUpdate){let details=store.execute(params);return{content:[{type:"text",text:formatTodoContent(details.change,details.state)}],details}},renderCall(args,theme2,context){let text2=context.lastComponent??new Text("",0,0);return text2.setText(context.toolGroupSummary?formatTodoGroupCall(args,theme2,context):formatTodoCall(args,theme2,context.expanded,context.result)),text2}}),pi.registerCommand(TODOS_COMMAND_NAME,{description:"Show the complete todo list for the current conversation branch",handler:async(_args,ctx)=>{if(!ctx.hasUI){ctx.ui.notify("/todos requires an interactive UI.","warning");return}ctx.ui.notify(formatCommandList(store.getState()),"info")}}),pi.on("session_start",async(_event,ctx)=>{safeReplay(ctx,store),ctx.hasUI&&(widget??=new TodoWidget(()=>store.getState()),widget.setUI(ctx.ui),widget.update())}),pi.on("session_tree",async(_event,ctx)=>{safeReplay(ctx,store),widget?.update()}),pi.on("session_shutdown",async(_event,_ctx)=>{widget?.dispose(),widget=void 0}),pi.on("tool_execution_end",async event=>{event.toolName!==TODO_TOOL_NAME||event.isError||widget?.update()})}var MINIMAX_CN_HOST="https://api.minimaxi.com",MINIMAX_GLOBAL_HOST="https://api.minimax.io";function trimValue(value2){return value2?.trim()||void 0}async function runtimeApiKey(modelRuntime,providerId){if(modelRuntime)try{return trimValue((await modelRuntime.getAuth(providerId))?.auth.apiKey)}catch{return}}function storedApiKey(providerId,authPath){let credential=readStoredCredential(providerId,authPath);if(!credential||credential.type!=="api_key"||typeof credential.key!="string")return;let key=isCommandConfigValue(credential.key)?resolveConfigValue(credential.key,credential.env):credential.key;return trimValue(key)}async function resolveProviderKey(modelRuntime,authPath,providerId,envVar){return await runtimeApiKey(modelRuntime,providerId)??storedApiKey(providerId,authPath)??trimValue(process.env[envVar])}async function resolveMiniMaxCredential(modelRuntime,authPath){let cnKey=await resolveProviderKey(modelRuntime,authPath,"minimax-cn","MINIMAX_CN_API_KEY");if(cnKey)return{key:cnKey,host:MINIMAX_CN_HOST};let globalKey=await resolveProviderKey(modelRuntime,authPath,"minimax","MINIMAX_API_KEY");if(globalKey)return{key:globalKey,host:trimValue(process.env.MINIMAX_API_HOST)??MINIMAX_GLOBAL_HOST}}async function resolveDeepSeekCredential(modelRuntime,authPath){let key=await resolveProviderKey(modelRuntime,authPath,"deepseek","DEEPSEEK_API_KEY");return key?{key}:void 0}function configuredEngine(credentials){return credentials.minimax&&credentials.deepseek?"dual":credentials.minimax?"minimax":credentials.deepseek?"deepseek":"none"}async function resolveSearchCredentials(modelRuntime,authPath=getAuthPath()){let[minimax,deepseek]=await Promise.all([resolveMiniMaxCredential(modelRuntime,authPath),resolveDeepSeekCredential(modelRuntime,authPath)]);return{minimax,deepseek}}var WEB_SEARCH_TOOL_NAME="web_search",WEB_SEARCH_LABEL="Web Search",WEB_SEARCH_DESCRIPTION="Search the live web through configured MiniMax and DeepSeek providers. When both are available, searches run concurrently and results are deduplicated and fused. Returns up to 12 source URLs with bounded titles and snippets, plus related searches and optional synthesis; partial provider failures still return successful results.",WEB_SEARCH_PROMPT_SNIPPET="Search the live web for current information",WEB_SEARCH_DISABLED_MESSAGE="Web search is disabled: Neither MiniMax nor DeepSeek API Key was found in auth.json or environment variables. Please add credentials via auth.json or environment variables (MINIMAX_API_KEY, DEEPSEEK_API_KEY).";function getEngineLabel(engine){return engine==="dual"?"MiniMax & DeepSeek":engine==="minimax"?"MiniMax":engine==="deepseek"?"DeepSeek":""}function getWebSearchPromptGuidelines(){return["Use `web_search` for current information, recent releases, live documentation, and other freshness-sensitive facts beyond your training cutoff.",`When using \`web_search\` for freshness-sensitive topics, account for the current date (${new Date().toISOString().slice(0,7)}) and include the year in the query when useful.`]}var TRACKING_PARAMS=new Set(["utm_source","utm_medium","utm_campaign","utm_term","utm_content","ref","fbclid","gclid","trk","gi"]);function truncateText2(text2,maxLength){return text2.length<=maxLength?text2:maxLength<=3?text2.slice(0,maxLength):`${text2.slice(0,maxLength-3).trimEnd()}...`}function boundSingleLineText(value2,maxLength){if(typeof value2!="string")return;let normalized=value2.replace(/\s+/g," ").trim();return normalized?truncateText2(normalized,maxLength):void 0}function boundMultilineText(value2,maxLength){if(typeof value2!="string")return;let normalized=value2.trim();return normalized?truncateText2(normalized,maxLength):void 0}function normalizeUrl(rawUrl){if(typeof rawUrl!="string")return;let trimmed=rawUrl.trim();if(!(!trimmed||trimmed.length>2048))try{let url=new URL(trimmed);if(url.protocol!=="http:"&&url.protocol!=="https:")return;url.hash="";for(let parameter of TRACKING_PARAMS)url.searchParams.has(parameter)&&url.searchParams.delete(parameter);url.pathname.length>1&&url.pathname.endsWith("/")&&(url.pathname=url.pathname.replace(/\/+$/,""));let normalized=url.toString();return normalized.length<=2048?normalized:void 0}catch{return}}function normalizeHit(hit,source){let url=normalizeUrl(hit.url);if(url)return{title:boundSingleLineText(hit.title,200)??url,url,snippet:boundSingleLineText(hit.snippet,200),date:boundSingleLineText(hit.date,100),sources:[...new Set([...hit.sources,source])]}}function isUrlFallbackTitle(title,url){let normalizedTitle=normalizeUrl(title);return normalizedTitle!==void 0&&normalizedTitle===normalizeUrl(url)}function reciprocalRankScore(candidate){let score=0;for(let rank of candidate.ranks.values())score+=1/(60+rank);return score}function bestRank(candidate){return Math.min(...candidate.ranks.values())}function fuseSearchHits(results){let candidates=new Map,relatedSearches=new Set,deepseekSynthesis;for(let result2 of results){let providerRelated=Array.isArray(result2.relatedSearches)?result2.relatedSearches:[],relatedScanLimit=Math.min(providerRelated.length,64);for(let index3=0;index3<relatedScanLimit&&relatedSearches.size<8;index3++){let normalized=boundSingleLineText(providerRelated[index3],200);normalized&&relatedSearches.add(normalized)}let synthesis=boundMultilineText(result2.synthesisText,6e3);synthesis&&(deepseekSynthesis=synthesis);let providerHits=Array.isArray(result2.hits)?result2.hits:[],hitScanLimit=Math.min(providerHits.length,200);for(let index3=0;index3<hitScanLimit;index3++){let rawHit=providerHits[index3];if(!rawHit)continue;let hit=normalizeHit(rawHit,result2.source);if(!hit)continue;let rank=index3+1,existing=candidates.get(hit.url);if(!existing){candidates.set(hit.url,{hit,ranks:new Map([[result2.source,rank]])});continue}let previousRank=existing.ranks.get(result2.source);(previousRank===void 0||rank<previousRank)&&existing.ranks.set(result2.source,rank);for(let source of hit.sources)existing.hit.sources.includes(source)||existing.hit.sources.push(source);isUrlFallbackTitle(existing.hit.title,existing.hit.url)&&!isUrlFallbackTitle(hit.title,hit.url)&&(existing.hit.title=hit.title),(!existing.hit.snippet||existing.hit.snippet.length<(hit.snippet?.length??0))&&hit.snippet&&(existing.hit.snippet=hit.snippet),!existing.hit.date&&hit.date&&(existing.hit.date=hit.date)}}return{hits:[...candidates.entries()].sort(([leftUrl,left],[rightUrl,right])=>{let scoreDifference=reciprocalRankScore(right)-reciprocalRankScore(left);if(scoreDifference!==0)return scoreDifference;let rankDifference=bestRank(left)-bestRank(right);return rankDifference!==0?rankDifference:leftUrl.localeCompare(rightUrl)}).map(([,candidate])=>candidate.hit).slice(0,12),relatedSearches:relatedSearches.size>0?[...relatedSearches]:void 0,deepseekSynthesis}}function escapeMarkdownText(text2){return text2.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/</g,"\\<").replace(/>/g,"\\>")}function canonicalSources(value2){if(!Array.isArray(value2))return[];let sources=[],scanLimit=Math.min(value2.length,32);for(let index3=0;index3<scanLimit&&sources.length<2;index3++){let source=value2[index3];(source==="MiniMax"||source==="DeepSeek")&&!sources.includes(source)&&sources.push(source)}return sources}function formatHit(value2){if(!value2||typeof value2!="object")return;let hit=value2,url=normalizeUrl(hit.url);if(url)return{title:escapeMarkdownText(boundSingleLineText(hit.title,200)??url),url,snippet:boundSingleLineText(hit.snippet,200),sources:canonicalSources(hit.sources)}}function usableHits(details){let hits=Array.isArray(details.hits)?details.hits:[],formatted=[],scanLimit=Math.min(hits.length,240);for(let index3=0;index3<scanLimit&&formatted.length<12;index3++){let hit=formatHit(hits[index3]);hit&&formatted.push(hit)}return formatted}function formatResultsMarkdown(details){let parts=[],hits=usableHits(details);hits.length>0&&(parts.push(`## Web Sources (${hits.length} found via ${getEngineLabel(details.engine)})
|
|
1609
1622
|
`),hits.forEach((hit,index3)=>{let sourceTag=hit.sources.length>1?` \u2014 *(found by ${hit.sources.join(" & ")})*`:"";parts.push(`${index3+1}. **[${hit.title}](<${hit.url}>)**${sourceTag}`),hit.snippet&&parts.push(` - ${escapeMarkdownText(hit.snippet)}`)}),parts.push(""));let synthesis=boundMultilineText(details.deepseekSynthesis,6e3);synthesis&&(parts.push(`## DeepSeek Search Synthesis
|
|
1610
1623
|
`),parts.push(escapeMarkdownText(synthesis)),parts.push(""));let relatedSearches=[],historicalRelated=Array.isArray(details.relatedSearches)?details.relatedSearches:[],relatedScanLimit=Math.min(historicalRelated.length,64);for(let index3=0;index3<relatedScanLimit&&relatedSearches.length<8;index3++){let related=boundSingleLineText(historicalRelated[index3],200);related&&relatedSearches.push(related)}return relatedSearches.length>0&&(parts.push(`## Related Searches
|
|
1611
1624
|
`),parts.push(relatedSearches.map(related=>`- ${escapeMarkdownText(related)}`).join(`
|
|
1612
1625
|
`)),parts.push("")),parts.join(`
|
|
1613
1626
|
`)}function formatSearchOutput(query,details){if(details.status==="disabled")return WEB_SEARCH_DISABLED_MESSAGE;let boundedQuery=boundSingleLineText(query,500)??"";if(details.status==="error"){let errorMessage6=boundSingleLineText(details.errorMessage,500)??"Unknown search error";return`Web search failed for "${boundedQuery}": ${errorMessage6}`}let hasSources=usableHits(details).length>0,hasSynthesis=boundMultilineText(details.deepseekSynthesis,6e3)!==void 0;if(!hasSources&&!hasSynthesis)return`No search results found for "${boundedQuery}". Try rephrasing with different keywords.`;let parts=[`# Web Search Results for: "${boundedQuery}"
|
|
1614
1627
|
`,formatResultsMarkdown(details)];return hasSources&&parts.push("---","Use these search results to answer the user, and cite the relevant source URLs in your response."),parts.join(`
|
|
1615
|
-
`)}var MAX_RESPONSE_BODY_BYTES=2*1024*1024,MAX_ERROR_BODY_BYTES=200;async function postJson(url,headers,body,signal,timeoutMs,errorLabel){let timeoutSignal=AbortSignal.timeout(timeoutMs),requestSignal=signal?AbortSignal.any([signal,timeoutSignal]):timeoutSignal,response=await fetch(url,{method:"POST",headers,body:JSON.stringify(body),signal:requestSignal});if(!response.ok){let errorText2="";try{errorText2=await readResponseTextBounded(response,{maxBytes:MAX_ERROR_BODY_BYTES,signal:requestSignal})}catch{requestSignal.throwIfAborted()}throw new Error(`${errorLabel} returned HTTP ${response.status} ${response.statusText}: ${errorText2}`)}let responseText=await readResponseTextBounded(response,{maxBytes:MAX_RESPONSE_BODY_BYTES,overflowMessage:`${errorLabel} response exceeded ${MAX_RESPONSE_BODY_BYTES} bytes`,signal:requestSignal});try{return JSON.parse(responseText)}catch{throw new Error(`${errorLabel} returned invalid JSON`)}}var DEFAULT_DEEPSEEK_MESSAGES_ENDPOINT="https://api.deepseek.com/anthropic/v1/messages",DEFAULT_DEEPSEEK_SEARCH_MODEL="claude-sonnet-search";function
|
|
1628
|
+
`)}var MAX_RESPONSE_BODY_BYTES=2*1024*1024,MAX_ERROR_BODY_BYTES=200;async function postJson(url,headers,body,signal,timeoutMs,errorLabel){let timeoutSignal=AbortSignal.timeout(timeoutMs),requestSignal=signal?AbortSignal.any([signal,timeoutSignal]):timeoutSignal,response=await fetch(url,{method:"POST",headers,body:JSON.stringify(body),signal:requestSignal});if(!response.ok){let errorText2="";try{errorText2=await readResponseTextBounded(response,{maxBytes:MAX_ERROR_BODY_BYTES,signal:requestSignal})}catch{requestSignal.throwIfAborted()}throw new Error(`${errorLabel} returned HTTP ${response.status} ${response.statusText}: ${errorText2}`)}let responseText=await readResponseTextBounded(response,{maxBytes:MAX_RESPONSE_BODY_BYTES,overflowMessage:`${errorLabel} response exceeded ${MAX_RESPONSE_BODY_BYTES} bytes`,signal:requestSignal});try{return JSON.parse(responseText)}catch{throw new Error(`${errorLabel} returned invalid JSON`)}}var DEFAULT_DEEPSEEK_MESSAGES_ENDPOINT="https://api.deepseek.com/anthropic/v1/messages",DEFAULT_DEEPSEEK_SEARCH_MODEL="claude-sonnet-search";function isRecord6(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function stringField(record,key){let value2=record[key];return typeof value2=="string"?value2:void 0}function parseSearchHit(value2){if(!isRecord6(value2)||value2.type!=="web_search_result")return;let url=stringField(value2,"url")?.trim();if(!url)return;let title=stringField(value2,"title")?.trim(),pageAge=stringField(value2,"page_age")?.trim();return{title:title||url,url,date:pageAge||void 0,sources:["DeepSeek"]}}function errorMessage5(value2){if(isRecord6(value2))return stringField(value2,"message")||stringField(value2,"type")||"Unknown error"}function searchToolErrorMessage(value2){return stringField(value2,"message")?.trim()||stringField(value2,"error_code")?.trim()||stringField(value2,"type")?.trim()||"Unknown search tool error"}function parseSearchToolContent(value2){if(Array.isArray(value2)){let hits=[];for(let item of value2){let hit=parseSearchHit(item);if(!hit)throw new Error("DeepSeek returned malformed web_search_tool_result content");hits.length<200&&hits.push(hit)}return hits}throw isRecord6(value2)?value2.type==="web_search_tool_result_error"||value2.error_code!==void 0||value2.message!==void 0?new Error(`DeepSeek web search failed: ${searchToolErrorMessage(value2)}`):new Error("DeepSeek returned malformed web_search_tool_result content"):new Error("DeepSeek returned malformed web_search_tool_result content")}async function searchDeepSeek(options){let endpoint=options.baseUrl||DEFAULT_DEEPSEEK_MESSAGES_ENDPOINT,model=options.model||DEFAULT_DEEPSEEK_SEARCH_MODEL,rawData=await postJson(endpoint,{"Content-Type":"application/json","x-api-key":options.apiKey,Authorization:`Bearer ${options.apiKey}`,"anthropic-version":"2023-06-01"},{model,max_tokens:1024,messages:[{role:"user",content:options.query}],tools:[{type:"web_search_20250305",name:"web_search"}]},options.signal,9e4,"DeepSeek Messages search API"),data=isRecord6(rawData)?rawData:{},upstreamError=errorMessage5(data.error);if(upstreamError)throw new Error(`DeepSeek search error: ${upstreamError}`);let hits=[],synthesisParts=[],sawStructuredResult=!1,content=Array.isArray(data.content)?data.content:[];for(let value2 of content)if(isRecord6(value2)){if(value2.type==="web_search_tool_result"){sawStructuredResult=!0;for(let hit of parseSearchToolContent(value2.content))hits.length<200&&hits.push(hit);continue}if(value2.type==="text"){let text2=stringField(value2,"text")?.trim();text2&&synthesisParts.push(text2)}}if(!sawStructuredResult)throw new Error("DeepSeek returned no web_search_tool_result block");return{source:"DeepSeek",hits,synthesisText:synthesisParts.length>0?synthesisParts.join(`
|
|
1616
1629
|
|
|
1617
|
-
`):void 0}}function isRecord6(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function stringField2(record,key){let value2=record[key];return typeof value2=="string"?value2:void 0}function parseSearchHit2(value2){if(!isRecord6(value2))return;let url=stringField2(value2,"link")?.trim();if(url)return{title:stringField2(value2,"title")?.trim()||url,url,snippet:stringField2(value2,"snippet")?.trim()||void 0,date:stringField2(value2,"date")?.trim()||void 0,sources:["MiniMax"]}}async function searchMiniMax(options){let host=options.apiHost?.replace(/\/+$/,"")||"https://api.minimaxi.com",rawData=await postJson(`${host}/v1/coding_plan/search`,{"Content-Type":"application/json",Authorization:`Bearer ${options.apiKey}`},{q:options.query.trim()},options.signal,6e4,"MiniMax search API"),data=isRecord6(rawData)?rawData:{},baseResponse=isRecord6(data.base_resp)?data.base_resp:void 0,statusCode=baseResponse?.status_code;if(baseResponse&&typeof statusCode=="number"&&statusCode!==0)throw new Error(`MiniMax search failed: [${statusCode}] ${stringField2(baseResponse,"status_msg")??"Unknown error"}`);let hits=[],organic=Array.isArray(data.organic)?data.organic:[],hitScanLimit=Math.min(organic.length,200);for(let index3=0;index3<hitScanLimit;index3++){let hit=parseSearchHit2(organic[index3]);hit&&hits.push(hit)}let relatedSearches=[],related=Array.isArray(data.related_searches)?data.related_searches:[],relatedScanLimit=Math.min(related.length,64);for(let index3=0;index3<relatedScanLimit&&relatedSearches.length<8;index3++){let value2=related[index3],query=isRecord6(value2)?stringField2(value2,"query")?.trim():void 0;query&&relatedSearches.push(query)}return{source:"MiniMax",hits,relatedSearches:relatedSearches.length>0?relatedSearches:void 0}}async function executeWebSearch(params,credentials,signal,onUpdate){let startTime=Date.now(),query=boundSingleLineText(params.query,500)??"",engine=configuredEngine(credentials);if(!query){let details2={query:"",durationMs:0,status:"error",engine,totalHits:0,hits:[],errorMessage:"Search query must not be empty."};return{formattedOutput:formatSearchOutput(query,details2),details:details2}}if(engine==="none"){let details2={query,durationMs:0,status:"disabled",engine:"none",totalHits:0,hits:[],errorMessage:WEB_SEARCH_DISABLED_MESSAGE};return{formattedOutput:formatSearchOutput(query,details2),details:details2}}signal?.throwIfAborted(),onUpdate?.({content:[{type:"text",text:`Searching for "${query}" via ${getEngineLabel(engine)}...`}],details:{query,durationMs:0,status:"success",engine,totalHits:0,hits:[]}});let searches=[];credentials.minimax&&searches.push(searchMiniMax({query,apiKey:credentials.minimax.key,apiHost:credentials.minimax.host,signal})),credentials.deepseek&&searches.push(searchDeepSeek({query,apiKey:credentials.deepseek.key,signal}));let settledResults=await Promise.allSettled(searches);signal?.throwIfAborted();let durationMs=Date.now()-startTime,successfulResults=[],errors=[];for(let result2 of settledResults)result2.status==="fulfilled"?successfulResults.push(result2.value):errors.push(result2.reason instanceof Error?result2.reason.message:String(result2.reason));if(successfulResults.length===0){let details2={query,durationMs,status:"error",engine,totalHits:0,hits:[],errorMessage:boundSingleLineText(errors.join(" | "),500)??"All search engines failed"};return{formattedOutput:formatSearchOutput(query,details2),details:details2}}let{hits,relatedSearches,deepseekSynthesis}=fuseSearchHits(successfulResults),respondedSources=new Set(successfulResults.map(result2=>result2.source)),contributingEngine=respondedSources.size>1?"dual":respondedSources.has("MiniMax")?"minimax":"deepseek",details={query,durationMs,status:"success",engine:contributingEngine,totalHits:hits.length,hits,relatedSearches,deepseekSynthesis};return{formattedOutput:formatSearchOutput(query,details),details}}var ELAPSED_DISPLAY_THRESHOLD_MS=2e3;function singleLine3(text2){return typeof text2=="string"?text2.replace(/\s+/g," ").trim():""}function truncateText3(text2,maxLength){return text2.length<=maxLength?text2:`${text2.slice(0,maxLength-3)}...`}function firstText2(result2){for(let part of result2.content??[])if(part.type==="text"&&typeof part.text=="string")return part.text;return""}function domainSummary(value2){if(!Array.isArray(value2))return"";let seen=new Set,scanLimit=Math.min(value2.length,240);for(let index3=0;index3<scanLimit;index3++){let hit=value2[index3];if(!hit||typeof hit!="object")continue;let url=hit.url;if(typeof url=="string")try{let host=new URL(url).hostname.replace(/^www\./,"");host&&seen.add(host)}catch{}}if(seen.size===0)return"";let domains=[...seen],shown=domains.slice(0,2).join(", ");return domains.length>2?` \xB7 ${shown}, +${domains.length-2}`:` \xB7 ${shown}`}function renderWebSearchCall(args,theme2){let line=theme2.fg("toolTitle",theme2.bold(`${WEB_SEARCH_LABEL} `)),query=singleLine3(args&&typeof args=="object"&&!Array.isArray(args)?args.query:"");return line+=theme2.fg("accent",`"${truncateText3(query,60)}"`),new Text(line,0,0)}function markdownBlock2(text2){let container=new Container;return container.addChild(new Spacer(1)),container.addChild(new Markdown(text2,1,0,getMarkdownTheme())),container}function renderWebSearchResult(result2,options,theme2,isError,elapsedMs){let details=result2.details;if(options.isPartial){let engine=getEngineLabel(details?.engine),label=engine?`Searching via ${engine}...`:"Searching the web...",suffix=elapsedMs!==void 0&&elapsedMs>=ELAPSED_DISPLAY_THRESHOLD_MS?theme2.fg("muted",` (${Math.round(elapsedMs/1e3)}s)`):"";return new Text(`${theme2.fg("warning",label)}${suffix}`,0,0)}let text2=firstText2(result2),errorMessage6=details?.errorMessage;if(details?.status==="disabled")return new Text(theme2.fg("warning","disabled \xB7 no MiniMax/DeepSeek key \u2014 /login minimax-cn or export MINIMAX_API_KEY / DEEPSEEK_API_KEY"),0,0);if(isError||details?.status==="error"){let line=truncateText3(errorMessage6??(singleLine3(text2)||"Search request failed"),160);return new Text(theme2.fg("error",`failed \xB7 ${line}`),0,0)}if(!options.expanded){let hint2=`${theme2.fg("muted"," (")}${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`;if(!details){let line=truncateText3(singleLine3(text2),100)||"done";return new Text(`${theme2.fg("toolOutput",line)}${hint2}`,0,0)}let historicalHits=Array.isArray(details.hits)?details.hits:[],hitCount=details.totalHits??historicalHits.length,engine=getEngineLabel(details.engine),engineLabel=engine?` via ${engine}`:"",duration=details.durationMs?` \xB7 ${(details.durationMs/1e3).toFixed(1)}s`:"",countText=hitCount===1?"1 result":hitCount===0?"no results":`${hitCount} results`,summary=theme2.fg("toolOutput",truncateText3(`${countText}${engineLabel}${duration}${domainSummary(historicalHits)}`,100));return new Text(`${summary}${hint2}`,0,0)}if(details){let body=formatResultsMarkdown(details);if(body.trim())return markdownBlock2(body)}return markdownBlock2(text2)}var WebSearchParamsSchema=typebox_exports.Object({query:typebox_exports.String({minLength:1,maxLength:500,description:"The search query. Aim for 3-5 keywords; include a year when freshness matters."})});function normalizeWebSearchParams(raw){if(typeof raw=="string")return{query:raw.trim()};if(!raw||typeof raw!="object"||Array.isArray(raw))return{query:String(raw??"").trim()};let record=raw,query="";return typeof record.query=="string"?query=record.query.trim():typeof record.q=="string"?query=record.q.trim():typeof record.search_query=="string"?query=record.search_query.trim():typeof record.prompt=="string"&&(query=record.prompt.trim()),{query}}function trackQueryElapsed2(context,isPartial){let state2=context.state;if(isPartial)return state2.startedAt??=Date.now(),state2.refreshTimer===void 0&&(state2.refreshTimer=setTimeout(()=>{state2.refreshTimer=void 0,context.invalidate()},1e3),state2.refreshTimer.unref?.()),Date.now()-state2.startedAt;state2.refreshTimer!==void 0&&(clearTimeout(state2.refreshTimer),state2.refreshTimer=void 0)}function webSearch(pi){pi.registerTool({name:WEB_SEARCH_TOOL_NAME,label:WEB_SEARCH_LABEL,description:WEB_SEARCH_DESCRIPTION,promptSnippet:WEB_SEARCH_PROMPT_SNIPPET,promptGuidelines:getWebSearchPromptGuidelines(),parameters:WebSearchParamsSchema,prepareArguments:normalizeWebSearchParams,async execute(_toolCallId,params,signal,onUpdate,ctx){let credentials=await resolveSearchCredentials(ctx.modelRuntime),execution=await executeWebSearch(params,credentials,signal,onUpdate);return{content:[{type:"text",text:execution.formattedOutput}],details:execution.details}},renderCall(args,theme2){return renderWebSearchCall(args,theme2)},renderResult(result2,options,theme2,context){let elapsedMs=trackQueryElapsed2(context,options.isPartial);return renderWebSearchResult(result2,options,theme2,context.isError,elapsedMs)}}),pi.on("session_start",async(_event,ctx)=>{let credentials=await resolveSearchCredentials(ctx.modelRuntime);if(configuredEngine(credentials)!=="none")return;let active=new Set(pi.getActiveTools());active.delete(WEB_SEARCH_TOOL_NAME)&&pi.setActiveTools([...active])}),pi.on("tool_result",async event=>{if(event.toolName!==WEB_SEARCH_TOOL_NAME)return;if(event.details?.status==="error")return{isError:!0}})}var builtInExtensions=[{name:"llama.cpp",factory:llamaExtension,hidden:!0},{name:"background",factory:background_default,hidden:!0},{name:"btw",factory:btwExtension,hidden:!0},{name:"deepwiki",factory:deepwiki,hidden:!0},{name:"provider",factory:providerExtension,hidden:!0},{name:"question",factory:question,hidden:!0},{name:"statusline",factory:statusline,hidden:!0},{name:"subagent",factory:subagent,hidden:!0},{name:"todo",factory:todo,hidden:!0},{name:"web_search",factory:webSearch,hidden:!0}];import{existsSync as existsSync25,mkdirSync as mkdirSync13,readdirSync as readdirSync10,readFileSync as readFileSync22,renameSync as renameSync2,rmSync as rmSync6,writeFileSync as writeFileSync13}from"fs";import{dirname as dirname25,join as join43}from"path";var MIGRATION_GUIDE_URL="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md#extensions-migration",EXTENSIONS_DOC_URL="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/extensions.md";function migrateAuthToAuthJson(){let agentDir=getAgentDir(),authPath=join43(agentDir,"auth.json"),oauthPath=join43(agentDir,"oauth.json"),settingsPath=join43(agentDir,"settings.json");if(existsSync25(authPath))return[];let migrated={},providers=[];if(existsSync25(oauthPath))try{let oauth=JSON.parse(stripBom(readFileSync22(oauthPath,"utf-8")));for(let[provider,cred]of Object.entries(oauth))migrated[provider]={type:"oauth",...cred},providers.push(provider);renameSync2(oauthPath,`${oauthPath}.migrated`)}catch{}if(existsSync25(settingsPath))try{let content=readFileSync22(settingsPath,"utf-8"),settings2=JSON.parse(stripBom(content));if(settings2.apiKeys&&typeof settings2.apiKeys=="object"){for(let[provider,key]of Object.entries(settings2.apiKeys))!migrated[provider]&&typeof key=="string"&&(migrated[provider]={type:"api_key",key},providers.push(provider));delete settings2.apiKeys,writeFileSync13(settingsPath,JSON.stringify(settings2,null,2))}}catch{}return Object.keys(migrated).length>0&&(mkdirSync13(dirname25(authPath),{recursive:!0}),writeFileSync13(authPath,JSON.stringify(migrated,null,2),{mode:384})),providers}function migrateSessionsFromAgentRoot(){let agentDir=getAgentDir(),files;try{files=readdirSync10(agentDir).filter(f2=>f2.endsWith(".jsonl")).map(f2=>join43(agentDir,f2))}catch{return}if(files.length!==0)for(let file of files)try{let firstLine=readFileSync22(file,"utf8").split(`
|
|
1630
|
+
`):void 0}}function isRecord7(value2){return typeof value2=="object"&&value2!==null&&!Array.isArray(value2)}function stringField2(record,key){let value2=record[key];return typeof value2=="string"?value2:void 0}function parseSearchHit2(value2){if(!isRecord7(value2))return;let url=stringField2(value2,"link")?.trim();if(url)return{title:stringField2(value2,"title")?.trim()||url,url,snippet:stringField2(value2,"snippet")?.trim()||void 0,date:stringField2(value2,"date")?.trim()||void 0,sources:["MiniMax"]}}async function searchMiniMax(options){let host=options.apiHost?.replace(/\/+$/,"")||"https://api.minimaxi.com",rawData=await postJson(`${host}/v1/coding_plan/search`,{"Content-Type":"application/json",Authorization:`Bearer ${options.apiKey}`},{q:options.query.trim()},options.signal,6e4,"MiniMax search API"),data=isRecord7(rawData)?rawData:{},baseResponse=isRecord7(data.base_resp)?data.base_resp:void 0,statusCode=baseResponse?.status_code;if(baseResponse&&typeof statusCode=="number"&&statusCode!==0)throw new Error(`MiniMax search failed: [${statusCode}] ${stringField2(baseResponse,"status_msg")??"Unknown error"}`);let hits=[],organic=Array.isArray(data.organic)?data.organic:[],hitScanLimit=Math.min(organic.length,200);for(let index3=0;index3<hitScanLimit;index3++){let hit=parseSearchHit2(organic[index3]);hit&&hits.push(hit)}let relatedSearches=[],related=Array.isArray(data.related_searches)?data.related_searches:[],relatedScanLimit=Math.min(related.length,64);for(let index3=0;index3<relatedScanLimit&&relatedSearches.length<8;index3++){let value2=related[index3],query=isRecord7(value2)?stringField2(value2,"query")?.trim():void 0;query&&relatedSearches.push(query)}return{source:"MiniMax",hits,relatedSearches:relatedSearches.length>0?relatedSearches:void 0}}async function executeWebSearch(params,credentials,signal,onUpdate){let startTime=Date.now(),query=boundSingleLineText(params.query,500)??"",engine=configuredEngine(credentials);if(!query){let details2={query:"",durationMs:0,status:"error",engine,totalHits:0,hits:[],errorMessage:"Search query must not be empty."};return{formattedOutput:formatSearchOutput(query,details2),details:details2}}if(engine==="none"){let details2={query,durationMs:0,status:"disabled",engine:"none",totalHits:0,hits:[],errorMessage:WEB_SEARCH_DISABLED_MESSAGE};return{formattedOutput:formatSearchOutput(query,details2),details:details2}}signal?.throwIfAborted(),onUpdate?.({content:[{type:"text",text:`Searching for "${query}" via ${getEngineLabel(engine)}...`}],details:{query,durationMs:0,status:"success",engine,totalHits:0,hits:[]}});let searches=[];credentials.minimax&&searches.push(searchMiniMax({query,apiKey:credentials.minimax.key,apiHost:credentials.minimax.host,signal})),credentials.deepseek&&searches.push(searchDeepSeek({query,apiKey:credentials.deepseek.key,signal}));let settledResults=await Promise.allSettled(searches);signal?.throwIfAborted();let durationMs=Date.now()-startTime,successfulResults=[],errors=[];for(let result2 of settledResults)result2.status==="fulfilled"?successfulResults.push(result2.value):errors.push(result2.reason instanceof Error?result2.reason.message:String(result2.reason));if(successfulResults.length===0){let details2={query,durationMs,status:"error",engine,totalHits:0,hits:[],errorMessage:boundSingleLineText(errors.join(" | "),500)??"All search engines failed"};return{formattedOutput:formatSearchOutput(query,details2),details:details2}}let{hits,relatedSearches,deepseekSynthesis}=fuseSearchHits(successfulResults),respondedSources=new Set(successfulResults.map(result2=>result2.source)),contributingEngine=respondedSources.size>1?"dual":respondedSources.has("MiniMax")?"minimax":"deepseek",details={query,durationMs,status:"success",engine:contributingEngine,totalHits:hits.length,hits,relatedSearches,deepseekSynthesis};return{formattedOutput:formatSearchOutput(query,details),details}}var ELAPSED_DISPLAY_THRESHOLD_MS=2e3;function singleLine3(text2){return typeof text2=="string"?text2.replace(/\s+/g," ").trim():""}function truncateText3(text2,maxLength){return text2.length<=maxLength?text2:`${text2.slice(0,maxLength-3)}...`}function firstText2(result2){for(let part of result2.content??[])if(part.type==="text"&&typeof part.text=="string")return part.text;return""}function domainSummary(value2){if(!Array.isArray(value2))return"";let seen=new Set,scanLimit=Math.min(value2.length,240);for(let index3=0;index3<scanLimit;index3++){let hit=value2[index3];if(!hit||typeof hit!="object")continue;let url=hit.url;if(typeof url=="string")try{let host=new URL(url).hostname.replace(/^www\./,"");host&&seen.add(host)}catch{}}if(seen.size===0)return"";let domains=[...seen],shown=domains.slice(0,2).join(", ");return domains.length>2?` \xB7 ${shown}, +${domains.length-2}`:` \xB7 ${shown}`}function renderWebSearchCall(args,theme2){let line=theme2.fg("toolTitle",theme2.bold(`${WEB_SEARCH_LABEL} `)),query=singleLine3(args&&typeof args=="object"&&!Array.isArray(args)?args.query:"");return line+=theme2.fg("accent",`"${truncateText3(query,60)}"`),new Text(line,0,0)}function markdownBlock2(text2){let container=new Container;return container.addChild(new Spacer(1)),container.addChild(new Markdown(text2,1,0,getMarkdownTheme())),container}function renderWebSearchResult(result2,options,theme2,isError,elapsedMs){let details=result2.details;if(options.isPartial){let engine=getEngineLabel(details?.engine),label=engine?`Searching via ${engine}...`:"Searching the web...",suffix=elapsedMs!==void 0&&elapsedMs>=ELAPSED_DISPLAY_THRESHOLD_MS?theme2.fg("muted",` (${Math.round(elapsedMs/1e3)}s)`):"";return new Text(`${theme2.fg("warning",label)}${suffix}`,0,0)}let text2=firstText2(result2),errorMessage6=details?.errorMessage;if(details?.status==="disabled")return new Text(theme2.fg("warning","disabled \xB7 no MiniMax/DeepSeek key \u2014 /login minimax-cn or export MINIMAX_API_KEY / DEEPSEEK_API_KEY"),0,0);if(isError||details?.status==="error"){let line=truncateText3(errorMessage6??(singleLine3(text2)||"Search request failed"),160);return new Text(theme2.fg("error",`failed \xB7 ${line}`),0,0)}if(!options.expanded){let hint2=`${theme2.fg("muted"," (")}${keyHint("app.tools.expand","to expand")}${theme2.fg("muted",")")}`;if(!details){let line=truncateText3(singleLine3(text2),100)||"done";return new Text(`${theme2.fg("toolOutput",line)}${hint2}`,0,0)}let historicalHits=Array.isArray(details.hits)?details.hits:[],hitCount=details.totalHits??historicalHits.length,engine=getEngineLabel(details.engine),engineLabel=engine?` via ${engine}`:"",duration=details.durationMs?` \xB7 ${(details.durationMs/1e3).toFixed(1)}s`:"",countText=hitCount===1?"1 result":hitCount===0?"no results":`${hitCount} results`,summary=theme2.fg("toolOutput",truncateText3(`${countText}${engineLabel}${duration}${domainSummary(historicalHits)}`,100));return new Text(`${summary}${hint2}`,0,0)}if(details){let body=formatResultsMarkdown(details);if(body.trim())return markdownBlock2(body)}return markdownBlock2(text2)}var WebSearchParamsSchema=typebox_exports.Object({query:typebox_exports.String({minLength:1,maxLength:500,description:"The search query. Aim for 3-5 keywords; include a year when freshness matters."})});function normalizeWebSearchParams(raw){if(typeof raw=="string")return{query:raw.trim()};if(!raw||typeof raw!="object"||Array.isArray(raw))return{query:String(raw??"").trim()};let record=raw,query="";return typeof record.query=="string"?query=record.query.trim():typeof record.q=="string"?query=record.q.trim():typeof record.search_query=="string"?query=record.search_query.trim():typeof record.prompt=="string"&&(query=record.prompt.trim()),{query}}function trackQueryElapsed2(context,isPartial){let state2=context.state;if(isPartial)return state2.startedAt??=Date.now(),state2.refreshTimer===void 0&&(state2.refreshTimer=setTimeout(()=>{state2.refreshTimer=void 0,context.invalidate()},1e3),state2.refreshTimer.unref?.()),Date.now()-state2.startedAt;state2.refreshTimer!==void 0&&(clearTimeout(state2.refreshTimer),state2.refreshTimer=void 0)}function webSearch(pi){pi.registerTool({name:WEB_SEARCH_TOOL_NAME,label:WEB_SEARCH_LABEL,description:WEB_SEARCH_DESCRIPTION,promptSnippet:WEB_SEARCH_PROMPT_SNIPPET,promptGuidelines:getWebSearchPromptGuidelines(),parameters:WebSearchParamsSchema,prepareArguments:normalizeWebSearchParams,async execute(_toolCallId,params,signal,onUpdate,ctx){let credentials=await resolveSearchCredentials(ctx.modelRuntime),execution=await executeWebSearch(params,credentials,signal,onUpdate);return{content:[{type:"text",text:execution.formattedOutput}],details:execution.details}},renderCall(args,theme2){return renderWebSearchCall(args,theme2)},renderResult(result2,options,theme2,context){let elapsedMs=trackQueryElapsed2(context,options.isPartial);return renderWebSearchResult(result2,options,theme2,context.isError,elapsedMs)}}),pi.on("session_start",async(_event,ctx)=>{let credentials=await resolveSearchCredentials(ctx.modelRuntime);if(configuredEngine(credentials)!=="none")return;let active=new Set(pi.getActiveTools());active.delete(WEB_SEARCH_TOOL_NAME)&&pi.setActiveTools([...active])}),pi.on("tool_result",async event=>{if(event.toolName!==WEB_SEARCH_TOOL_NAME)return;if(event.details?.status==="error")return{isError:!0}})}var builtInExtensions=[{name:"llama.cpp",factory:llamaExtension,hidden:!0},{name:"background",factory:background_default,hidden:!0},{name:"btw",factory:btwExtension,hidden:!0},{name:"deepwiki",factory:deepwiki,hidden:!0},{name:"provider",factory:providerExtension,hidden:!0},{name:"question",factory:question,hidden:!0},{name:"statusline",factory:statusline,hidden:!0},{name:"subagent",factory:subagent,hidden:!0},{name:"todo",factory:todo,hidden:!0},{name:"web_search",factory:webSearch,hidden:!0}];import{existsSync as existsSync25,mkdirSync as mkdirSync13,readdirSync as readdirSync10,readFileSync as readFileSync22,renameSync as renameSync2,rmSync as rmSync6,writeFileSync as writeFileSync13}from"fs";import{dirname as dirname26,join as join43}from"path";var MIGRATION_GUIDE_URL="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/CHANGELOG.md#extensions-migration",EXTENSIONS_DOC_URL="https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/extensions.md";function migrateAuthToAuthJson(){let agentDir=getAgentDir(),authPath=join43(agentDir,"auth.json"),oauthPath=join43(agentDir,"oauth.json"),settingsPath=join43(agentDir,"settings.json");if(existsSync25(authPath))return[];let migrated={},providers=[];if(existsSync25(oauthPath))try{let oauth=JSON.parse(stripBom(readFileSync22(oauthPath,"utf-8")));for(let[provider,cred]of Object.entries(oauth))migrated[provider]={type:"oauth",...cred},providers.push(provider);renameSync2(oauthPath,`${oauthPath}.migrated`)}catch{}if(existsSync25(settingsPath))try{let content=readFileSync22(settingsPath,"utf-8"),settings2=JSON.parse(stripBom(content));if(settings2.apiKeys&&typeof settings2.apiKeys=="object"){for(let[provider,key]of Object.entries(settings2.apiKeys))!migrated[provider]&&typeof key=="string"&&(migrated[provider]={type:"api_key",key},providers.push(provider));delete settings2.apiKeys,writeFileSync13(settingsPath,JSON.stringify(settings2,null,2))}}catch{}return Object.keys(migrated).length>0&&(mkdirSync13(dirname26(authPath),{recursive:!0}),writeFileSync13(authPath,JSON.stringify(migrated,null,2),{mode:384})),providers}function migrateSessionsFromAgentRoot(){let agentDir=getAgentDir(),files;try{files=readdirSync10(agentDir).filter(f2=>f2.endsWith(".jsonl")).map(f2=>join43(agentDir,f2))}catch{return}if(files.length!==0)for(let file of files)try{let firstLine=readFileSync22(file,"utf8").split(`
|
|
1618
1631
|
`)[0];if(!firstLine?.trim())continue;let header=JSON.parse(firstLine);if(header.type!=="session"||!header.cwd)continue;let safePath=`--${header.cwd.replace(/^[/\\]/,"").replace(/[/\\:]/g,"-")}--`,correctDir=join43(agentDir,"sessions",safePath);existsSync25(correctDir)||mkdirSync13(correctDir,{recursive:!0});let fileName=file.split("/").pop()||file.split("\\").pop(),newPath=join43(correctDir,fileName);if(existsSync25(newPath))continue;renameSync2(file,newPath)}catch{}}function migrateCommandsToPrompts(baseDir,label){let commandsDir=join43(baseDir,"commands"),promptsDir=join43(baseDir,"prompts");if(existsSync25(commandsDir)&&!existsSync25(promptsDir))try{return renameSync2(commandsDir,promptsDir),console.log(source_default.green(`Migrated ${label} commands/ \u2192 prompts/`)),!0}catch(err2){console.log(source_default.yellow(`Warning: Could not migrate ${label} commands/ to prompts/: ${err2 instanceof Error?err2.message:err2}`))}return!1}function migrateKeybindingsConfigFile(){let configPath=join43(getAgentDir(),"keybindings.json");if(existsSync25(configPath))try{let parsed=JSON.parse(stripBom(readFileSync22(configPath,"utf-8")));if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))return;let{config,migrated}=migrateKeybindingsConfig(parsed);if(!migrated)return;writeFileSync13(configPath,`${JSON.stringify(config,null,2)}
|
|
1619
1632
|
`,"utf-8")}catch{}}function migrateToolsToBin(){let agentDir=getAgentDir(),toolsDir=join43(agentDir,"tools"),binDir=getBinDir();if(!existsSync25(toolsDir))return;let binaries=["fd","rg","fd.exe","rg.exe"],movedAny=!1;for(let bin of binaries){let oldPath=join43(toolsDir,bin),newPath=join43(binDir,bin);if(existsSync25(oldPath))if(existsSync25(binDir)||mkdirSync13(binDir,{recursive:!0}),existsSync25(newPath))try{rmSync6?.(oldPath,{force:!0})}catch{}else try{renameSync2(oldPath,newPath),movedAny=!0}catch{}}movedAny&&console.log(source_default.green("Migrated managed binaries tools/ \u2192 bin/"))}function checkDeprecatedExtensionDirs(baseDir,label){let hooksDir=join43(baseDir,"hooks"),toolsDir=join43(baseDir,"tools"),warnings=[];if(existsSync25(hooksDir)&&warnings.push(`${label} hooks/ directory found. Hooks have been renamed to extensions.`),existsSync25(toolsDir))try{readdirSync10(toolsDir).filter(e=>{let lower=e.toLowerCase();return lower!=="fd"&&lower!=="rg"&&lower!=="fd.exe"&&lower!=="rg.exe"&&!e.startsWith(".")}).length>0&&warnings.push(`${label} tools/ directory contains custom tools. Custom tools have been merged into extensions.`)}catch{}return warnings}function migrateExtensionSystem(cwd){let agentDir=getAgentDir(),projectDir=join43(cwd,CONFIG_DIR_NAME);return migrateCommandsToPrompts(agentDir,"Global"),migrateCommandsToPrompts(projectDir,"Project"),[...checkDeprecatedExtensionDirs(agentDir,"Global"),...checkDeprecatedExtensionDirs(projectDir,"Project")]}async function showDeprecationWarnings(warnings){if(warnings.length!==0){for(let warning of warnings)console.log(source_default.yellow(`Warning: ${warning}`));console.log(source_default.yellow(`
|
|
1620
1633
|
Move your extensions to the extensions/ directory.`)),console.log(source_default.yellow(`Migration guide: ${MIGRATION_GUIDE_URL}`)),console.log(source_default.yellow(`Documentation: ${EXTENSIONS_DOC_URL}`)),console.log(source_default.dim(`
|
|
@@ -1629,7 +1642,7 @@ See the built-in themes (dark.json, light.json) for reference values.`),otherErr
|
|
|
1629
1642
|
|
|
1630
1643
|
Other errors:
|
|
1631
1644
|
${otherErrors.join(`
|
|
1632
|
-
`)}`),new Error(errorMessage6)}let themeJson=json;if(themeJson.name.includes("/"))throw new Error(`Invalid theme name "${themeJson.name}": theme names cannot contain "/" because it is reserved for automatic light/dark theme settings.`);return themeJson}import{existsSync as existsSync27,mkdirSync as mkdirSync15,mkdtempSync as mkdtempSync3,readdirSync as readdirSync11,readFileSync as readFileSync23,renameSync as renameSync4,rmSync as rmSync8,writeFileSync as writeFileSync14}from"node:fs";import{join as join46,resolve as resolve16}from"node:path";var import_proper_lockfile6=__toESM(require_proper_lockfile(),1);import{homedir as homedir12}from"node:os";import{basename as basename13,dirname as dirname26,join as join44,relative as relative10}from"node:path";var RESOURCE_TYPES2=["extensions","skills","prompts","themes"],RESOURCE_TYPE_LABELS={extensions:"Extensions",skills:"Skills",prompts:"Prompts",themes:"Themes"};function formatBaseDir(baseDir){let homeDir=homedir12(),displayPath2;return baseDir===homeDir?displayPath2="~":baseDir.startsWith(homeDir)?displayPath2=`~${baseDir.slice(homeDir.length).replace(/\\/g,"/")}`:displayPath2=baseDir.replace(/\\/g,"/"),displayPath2.endsWith("/")?displayPath2:`${displayPath2}/`}function getGroupLabel(metadata,agentDir){return metadata.origin==="package"?`${metadata.source} (${metadata.scope})`:metadata.source==="auto"?metadata.baseDir?metadata.scope==="user"?`User (${formatBaseDir(metadata.baseDir)})`:`Project (${formatBaseDir(metadata.baseDir)})`:metadata.scope==="user"?`User (${formatBaseDir(agentDir)})`:`Project (${CONFIG_DIR_NAME}/)`:metadata.scope==="user"?"User settings":"Project settings"}function buildGroups(resolved,agentDir){let groupMap=new Map,addToGroup=(resources,resourceType)=>{for(let res of resources){let{path:path14,enabled,metadata}=res,groupKey2=`${metadata.origin}:${metadata.scope}:${metadata.source}:${metadata.baseDir??""}`;groupMap.has(groupKey2)||groupMap.set(groupKey2,{key:groupKey2,label:getGroupLabel(metadata,agentDir),scope:metadata.scope,origin:metadata.origin,source:metadata.source,subgroups:[]});let group=groupMap.get(groupKey2),subgroupKey=`${groupKey2}:${resourceType}`,subgroup=group.subgroups.find(sg=>sg.type===resourceType);subgroup||(subgroup={type:resourceType,label:RESOURCE_TYPE_LABELS[resourceType],items:[]},group.subgroups.push(subgroup));let fileName=basename13(path14),parentFolder=basename13(dirname26(path14)),displayName;resourceType==="extensions"&&parentFolder!=="extensions"?displayName=`${parentFolder}/${fileName}`:resourceType==="skills"&&fileName==="SKILL.md"?displayName=parentFolder:displayName=fileName,subgroup.items.push({path:path14,enabled,metadata,resourceType,displayName,groupKey:groupKey2,subgroupKey})}};addToGroup(resolved.extensions,"extensions"),addToGroup(resolved.skills,"skills"),addToGroup(resolved.prompts,"prompts"),addToGroup(resolved.themes,"themes");let groups=Array.from(groupMap.values());groups.sort((a,b2)=>a.origin!==b2.origin?a.origin==="package"?-1:1:a.scope!==b2.scope?a.scope==="user"?-1:1:a.source.localeCompare(b2.source));let typeOrder={extensions:0,skills:1,prompts:2,themes:3};for(let group of groups){group.subgroups.sort((a,b2)=>typeOrder[a.type]-typeOrder[b2.type]);for(let subgroup of group.subgroups)subgroup.items.sort((a,b2)=>a.displayName.localeCompare(b2.displayName))}return groups}var ConfigSelectorHeader=class{constructor(writeScope,projectModeAvailable){this.writeScope=writeScope,this.projectModeAvailable=projectModeAvailable}setWriteScope(writeScope){this.writeScope=writeScope}invalidate(){}render(width){let title=theme.bold(this.writeScope==="project"?"Project Local Resources":"Global Resources"),sep12=theme.fg("muted"," \xB7 "),switchHint=this.projectModeAvailable?keyHint("tui.input.tab","switch mode")+sep12:"",actionHint=this.writeScope==="project"?rawKeyHint("space","cycle inherit/+/-"):rawKeyHint("space","toggle"),hint2=switchHint+actionHint+sep12+rawKeyHint("esc","close"),spacing=Math.max(1,width-visibleWidth(title)-visibleWidth(hint2)),scopeHint=this.writeScope==="project"?theme.fg("muted",`${CONFIG_DIR_NAME}/settings.json \xB7 inherited global resources are dimmed`):theme.fg("muted",`~/${CONFIG_DIR_NAME}/agent/settings.json`);return[truncateToWidth(`${title}${" ".repeat(spacing)}${hint2}`,width,""),truncateToWidth(scopeHint,width,"")]}},ResourceList=class{get focused(){return this._focused}set focused(value2){this._focused=value2,this.searchInput.focused=value2}constructor(groupsByScope,settingsManager,cwd,agentDir,terminalHeight,writeScope="global"){this.flatItems=[],this.filteredItems=[],this.selectedIndex=0,this._focused=!1,this.groupsByScope=groupsByScope,this.settingsManager=settingsManager,this.cwd=cwd,this.agentDir=agentDir,this.writeScope=writeScope,this.inheritedEnabledByKey=this.buildInheritedEnabledMap(groupsByScope.global),this.searchInput=new Input;let chrome=8;this.maxVisible=Math.max(5,(terminalHeight??24)-chrome),this.buildFlatList(),this.filteredItems=[...this.flatItems]}setWriteScope(writeScope){this.writeScope=writeScope,this.buildFlatList(),this.filterItems(this.searchInput.getValue())}get groups(){return this.groupsByScope[this.writeScope]}buildInheritedEnabledMap(groups){let result2=new Map;for(let group of groups)for(let subgroup of group.subgroups)for(let item of subgroup.items)result2.set(this.getResourceItemKey(item),item.enabled);return result2}buildFlatList(){this.flatItems=[];for(let group of this.groups){this.flatItems.push({type:"group",group});for(let subgroup of group.subgroups){this.flatItems.push({type:"subgroup",subgroup,group});for(let item of subgroup.items)this.flatItems.push({type:"item",item})}}this.selectedIndex=this.flatItems.findIndex(e=>e.type==="item"),this.selectedIndex<0&&(this.selectedIndex=0)}findNextItem(fromIndex,direction){let idx=fromIndex+direction;for(;idx>=0&&idx<this.filteredItems.length;){if(this.filteredItems[idx].type==="item")return idx;idx+=direction}return fromIndex}filterItems(query){if(!query.trim()){this.filteredItems=[...this.flatItems],this.selectFirstItem();return}let lowerQuery=query.toLowerCase(),matchingItems=new Set,matchingSubgroups=new Set,matchingGroups=new Set;for(let entry of this.flatItems)if(entry.type==="item"){let item=entry.item;(item.displayName.toLowerCase().includes(lowerQuery)||item.resourceType.toLowerCase().includes(lowerQuery)||item.path.toLowerCase().includes(lowerQuery))&&matchingItems.add(item)}for(let group of this.groups)for(let subgroup of group.subgroups)for(let item of subgroup.items)matchingItems.has(item)&&(matchingSubgroups.add(subgroup),matchingGroups.add(group));this.filteredItems=[];for(let entry of this.flatItems)entry.type==="group"&&matchingGroups.has(entry.group)?this.filteredItems.push(entry):entry.type==="subgroup"&&matchingSubgroups.has(entry.subgroup)?this.filteredItems.push(entry):entry.type==="item"&&matchingItems.has(entry.item)&&this.filteredItems.push(entry);this.selectFirstItem()}selectFirstItem(){let firstItemIndex=this.filteredItems.findIndex(e=>e.type==="item");this.selectedIndex=firstItemIndex>=0?firstItemIndex:0}updateItem(item,enabled){item.enabled=enabled;for(let group of this.groups)for(let subgroup of group.subgroups){let found=subgroup.items.find(i=>i.path===item.path&&i.resourceType===item.resourceType);if(found){found.enabled=enabled;return}}}invalidate(){}render(width){let lines=[];if(lines.push(...this.searchInput.render(width)),lines.push(""),this.filteredItems.length===0)return lines.push(theme.fg("muted"," No resources found")),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.filteredItems.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.filteredItems.length);for(let i=startIndex;i<endIndex;i++){let entry=this.filteredItems[i],isSelected=i===this.selectedIndex;if(entry.type==="group"){let inherited=this.writeScope==="project"&&entry.group.scope==="user",label=theme.bold(`${entry.group.label}${inherited?" \xB7 inherited global":""}`),groupLine=theme.fg(inherited?"dim":"accent",label);lines.push(truncateToWidth(` ${groupLine}`,width,""))}else if(entry.type==="subgroup"){let color2=this.writeScope==="project"&&entry.group.scope==="user"?"dim":"muted",subgroupLine=theme.fg(color2,entry.subgroup.label);lines.push(truncateToWidth(` ${subgroupLine}`,width,""))}else{let item=entry.item,cursor=isSelected?"> ":" ",dimmed=this.isDimmedItem(item),nameText=isSelected&&!dimmed?theme.bold(item.displayName):item.displayName,name=dimmed?theme.fg("dim",nameText):nameText;lines.push(truncateToWidth(`${cursor} ${this.renderCheckbox(item)} ${name}${this.getItemSuffix(item)}`,width,"..."))}}if(startIndex>0||endIndex<this.filteredItems.length){let itemCount=this.filteredItems.filter(e=>e.type==="item").length,currentItemIndex=this.filteredItems.slice(0,this.selectedIndex).filter(e=>e.type==="item").length+1;lines.push(theme.fg("dim",` (${currentItemIndex}/${itemCount})`))}return lines}handleInput(data){let kb=getKeybindings();if(kb.matches(data,"tui.select.up")){this.selectedIndex=this.findNextItem(this.selectedIndex,-1);return}if(kb.matches(data,"tui.select.down")){this.selectedIndex=this.findNextItem(this.selectedIndex,1);return}if(kb.matches(data,"tui.select.pageUp")){let target=Math.max(0,this.selectedIndex-this.maxVisible);for(;target<this.filteredItems.length&&this.filteredItems[target].type!=="item";)target++;target<this.filteredItems.length&&(this.selectedIndex=target);return}if(kb.matches(data,"tui.select.pageDown")){let target=Math.min(this.filteredItems.length-1,this.selectedIndex+this.maxVisible);for(;target>=0&&this.filteredItems[target].type!=="item";)target--;target>=0&&(this.selectedIndex=target);return}if(kb.matches(data,"tui.select.cancel")){this.onCancel?.();return}if(matchesKey(data,"ctrl+c")){this.onExit?.();return}if(kb.matches(data,"tui.input.tab")){this.onSwitchMode?.();return}if(data===" "||kb.matches(data,"tui.select.confirm")){let entry=this.filteredItems[this.selectedIndex];if(entry?.type==="item"&&(this.writeScope==="project"||this.getItemScope(entry.item)==="user")){let newEnabled=this.toggleResource(entry.item);newEnabled!==void 0&&(this.updateItem(entry.item,newEnabled),this.onToggle?.(entry.item,newEnabled))}return}this.searchInput.handleInput(data),this.filterItems(this.searchInput.getValue())}toggleResource(item){if(this.writeScope==="project"){let state2=this.getNextOverrideState(item);return this.setProjectResourceOverride(item,state2)?state2==="inherit"?this.getInheritedEnabled(item):state2==="load":void 0}let enabled=!item.enabled;return item.metadata.origin==="top-level"?this.toggleTopLevelResource(item,enabled):this.togglePackageResource(item,enabled),enabled}toggleTopLevelResource(item,enabled){let scope=item.metadata.scope,settings2=scope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings(),arrayKey=item.resourceType,current=settings2[arrayKey]??[],pattern=this.getResourcePattern(item),disablePattern=`-${pattern}`,enablePattern=`+${pattern}`,updated=current.filter(p=>(p.startsWith("!")||p.startsWith("+")||p.startsWith("-")?p.slice(1):p)!==pattern);enabled?updated.push(enablePattern):updated.push(disablePattern),scope==="project"?arrayKey==="extensions"?this.settingsManager.setProjectExtensionPaths(updated):arrayKey==="skills"?this.settingsManager.setProjectSkillPaths(updated):arrayKey==="prompts"?this.settingsManager.setProjectPromptTemplatePaths(updated):arrayKey==="themes"&&this.settingsManager.setProjectThemePaths(updated):arrayKey==="extensions"?this.settingsManager.setExtensionPaths(updated):arrayKey==="skills"?this.settingsManager.setSkillPaths(updated):arrayKey==="prompts"?this.settingsManager.setPromptTemplatePaths(updated):arrayKey==="themes"&&this.settingsManager.setThemePaths(updated)}togglePackageResource(item,enabled){let scope=item.metadata.scope,packages=[...(scope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings()).packages??[]],pkgIndex=packages.findIndex(pkg3=>(typeof pkg3=="string"?pkg3:pkg3.source)===item.metadata.source);if(pkgIndex===-1)return;let pkg2=packages[pkgIndex];typeof pkg2=="string"&&(pkg2={source:pkg2},packages[pkgIndex]=pkg2);let arrayKey=item.resourceType,current=pkg2[arrayKey]??[],pattern=this.getPackageResourcePattern(item),disablePattern=`-${pattern}`,enablePattern=`+${pattern}`,updated=current.filter(p=>(p.startsWith("!")||p.startsWith("+")||p.startsWith("-")?p.slice(1):p)!==pattern);enabled?updated.push(enablePattern):updated.push(disablePattern),pkg2[arrayKey]=updated.length>0?updated:void 0,["extensions","skills","prompts","themes"].some(k2=>pkg2[k2]!==void 0)||(packages[pkgIndex]=pkg2.source),scope==="project"?this.settingsManager.setProjectPackages(packages):this.settingsManager.setPackages(packages)}renderCheckbox(item){if(this.writeScope==="project"){let state2=this.getProjectOverrideState(item);return state2==="load"?theme.fg("success","[+]"):state2==="unload"?theme.fg("warning","[-]"):theme.fg("dim",item.enabled?"[x]":"[ ]")}return item.enabled?theme.fg("success","[x]"):theme.fg("dim","[ ]")}getItemSuffix(item){if(this.writeScope!=="project")return"";let state2=this.getProjectOverrideState(item);return state2==="load"?theme.fg("muted"," project load"):state2==="unload"?theme.fg("muted"," project unload"):this.isInheritedGlobalItem(item)?theme.fg("dim"," inherited global"):""}isDimmedItem(item){return this.writeScope==="project"&&this.isInheritedGlobalItem(item)&&this.getProjectOverrideState(item)==="inherit"}setProjectResourceOverride(item,state2){return item.metadata.origin==="top-level"?this.setProjectTopLevelOverride(item,state2):this.setProjectPackageOverride(item,state2)}setProjectTopLevelOverride(item,state2){let current=this.settingsManager.getProjectSettings()[item.resourceType]??[],pattern=this.isInheritedGlobalItem(item)?item.path:this.getResourcePatternForScope(item,"project"),patterns=this.getTopLevelOverridePatterns(item,"project"),updated=current.filter(entry=>{let target=this.getPatternEntryTarget(entry);return(entry.startsWith("!")||entry.startsWith("+")||entry.startsWith("-"))&&patterns.has(target)?!1:!(state2==="inherit"&&this.isInheritedGlobalItem(item)&&target===pattern)});return state2!=="inherit"&&(this.isInheritedGlobalItem(item)&&!updated.includes(pattern)&&updated.push(pattern),updated.push(`${state2==="load"?"+":"-"}${pattern}`)),this.setProjectTopLevelPaths(item.resourceType,updated),!0}setProjectTopLevelPaths(key,paths){key==="extensions"?this.settingsManager.setProjectExtensionPaths(paths):key==="skills"?this.settingsManager.setProjectSkillPaths(paths):key==="prompts"?this.settingsManager.setProjectPromptTemplatePaths(paths):this.settingsManager.setProjectThemePaths(paths)}setProjectPackageOverride(item,state2){let packages=[...this.settingsManager.getProjectSettings().packages??[]],pkgIndex=packages.findIndex(pkg3=>this.packageSourceStringMatches(item.metadata.source,this.getItemScope(item),typeof pkg3=="string"?pkg3:pkg3.source,"project"));if(pkgIndex===-1){if(state2==="inherit")return!1;packages.push(this.createPackageOverrideSource(item)),pkgIndex=packages.length-1}let pkg2=packages[pkgIndex];if(pkg2===void 0)return!1;typeof pkg2=="string"&&(pkg2={source:pkg2},packages[pkgIndex]=pkg2);let pattern=this.getPackageResourcePattern(item),updated=(pkg2[item.resourceType]??[]).filter(entry=>this.getPatternEntryTarget(entry)!==pattern);return state2!=="inherit"&&updated.push(`${state2==="load"?"+":"-"}${pattern}`),pkg2[item.resourceType]=updated.length>0?updated:void 0,RESOURCE_TYPES2.some(key=>pkg2[key]!==void 0)||(pkg2.autoload===!1?packages.splice(pkgIndex,1):packages[pkgIndex]=pkg2.source),this.settingsManager.setProjectPackages(packages),!0}getNextOverrideState(item){let state2=this.getProjectOverrideState(item),inheritedEnabled=this.getInheritedEnabled(item);return state2==="inherit"?inheritedEnabled?"unload":"load":state2==="unload"?inheritedEnabled?"load":"inherit":inheritedEnabled?"inherit":"unload"}getProjectOverrideState(item){if(this.writeScope!=="project")return"inherit";if(item.metadata.origin==="top-level")return this.getOverrideStateFromEntries(this.settingsManager.getProjectSettings()[item.resourceType]??[],this.getTopLevelOverridePatterns(item,"project"),!1);let pkg2=this.findMatchingPackageSource(item,"project");if(typeof pkg2!="object")return"inherit";let entries=pkg2[item.resourceType];return entries===void 0?"inherit":this.getOverrideStateFromEntries(entries,new Set([this.getPackageResourcePattern(item)]),pkg2.autoload!==!1)}getOverrideStateFromEntries(entries,patterns,emptyArrayIsUnload){if(entries.length===0&&emptyArrayIsUnload)return"unload";let state2="inherit";for(let entry of entries)patterns.has(this.getPatternEntryTarget(entry))&&(entry.startsWith("!")||entry.startsWith("-")?state2="unload":state2="load");return state2}getInheritedEnabled(item){return this.inheritedEnabledByKey.get(this.getResourceItemKey(item))??(this.getItemScope(item)==="user"?item.enabled:!0)}isInheritedGlobalItem(item){return this.getItemScope(item)==="user"||this.inheritedEnabledByKey.has(this.getResourceItemKey(item))}getTopLevelOverridePatterns(item,scope){let baseDir=this.getTopLevelBaseDir(scope),patterns=new Set([this.getResourcePatternForScope(item,scope),item.path,relative10(baseDir,item.path)]);return item.metadata.baseDir&&patterns.add(relative10(item.metadata.baseDir,item.path)),patterns}getResourcePatternForScope(item,scope){let sourceScope=this.getItemScope(item);if(scope!==sourceScope)return item.path;let baseDir=item.metadata.baseDir??this.getTopLevelBaseDir(sourceScope);return relative10(baseDir,item.path)}createPackageOverrideSource(item){let source=item.metadata.source;if(!isLocalPath(source))return{source,autoload:!1};let sourcePath=resolvePath(source,this.getTopLevelBaseDir(this.getItemScope(item)),{trim:!0});return{source:relative10(this.getTopLevelBaseDir("project"),sourcePath)||".",autoload:!1}}packageSourceStringMatches(leftSource,leftScope,rightSource,rightScope){if(leftSource===rightSource)return!0;if(!isLocalPath(leftSource)||!isLocalPath(rightSource))return!1;let left=resolvePath(leftSource,this.getTopLevelBaseDir(leftScope),{trim:!0}),right=resolvePath(rightSource,this.getTopLevelBaseDir(rightScope),{trim:!0});return left===right}findMatchingPackageSource(item,targetScope){return((targetScope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings()).packages??[]).find(pkg2=>this.packageSourceStringMatches(item.metadata.source,this.getItemScope(item),typeof pkg2=="string"?pkg2:pkg2.source,targetScope))}getPatternEntryTarget(entry){return entry.startsWith("!")||entry.startsWith("+")||entry.startsWith("-")?entry.slice(1):entry}getResourceItemKey(item){return`${item.resourceType}:${canonicalizePath(item.path)}`}getItemScope(item){return item.metadata.scope==="project"?"project":"user"}getTopLevelBaseDir(scope){return scope==="project"?join44(this.cwd,CONFIG_DIR_NAME):this.agentDir}getResourcePattern(item){let scope=item.metadata.scope,baseDir=item.metadata.baseDir??this.getTopLevelBaseDir(scope);return relative10(baseDir,item.path)}getPackageResourcePattern(item){let baseDir=item.metadata.baseDir??dirname26(item.path);return relative10(baseDir,item.path)}},ConfigSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.resourceList.focused=value2}constructor(resolvedPaths,settingsManager,cwd,agentDir,onClose,onExit,requestRender,terminalHeight,writeScope="global",projectModeAvailable=!0){super(),this._focused=!1,this.writeScope=writeScope;let groupsByScope={global:buildGroups(resolvedPaths.global,agentDir),project:buildGroups(resolvedPaths.project,agentDir)};this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.header=new ConfigSelectorHeader(this.writeScope,projectModeAvailable),this.addChild(this.header),this.addChild(new Spacer(1)),this.resourceList=new ResourceList(groupsByScope,settingsManager,cwd,agentDir,terminalHeight,this.writeScope),this.resourceList.onCancel=onClose,this.resourceList.onExit=onExit,this.resourceList.onToggle=()=>requestRender(),projectModeAvailable&&(this.resourceList.onSwitchMode=()=>{this.switchWriteScope(),requestRender()}),this.addChild(this.resourceList),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder)}switchWriteScope(){this.writeScope=this.writeScope==="global"?"project":"global",this.header.setWriteScope(this.writeScope),this.resourceList.setWriteScope(this.writeScope)}getResourceList(){return this.resourceList}};async function selectConfig(options){return initTheme(options.settingsManager.getTheme(),!0),new Promise(resolve17=>{let ui=new TuiMainScreen(new ProcessTerminal,options.settingsManager.getShowHardwareCursor(),options.agentDir);ui.setClearOnShrink(options.settingsManager.getClearOnShrink());let resolved=!1,selector=new ConfigSelectorComponent(options.resolvedPaths,options.settingsManager,options.cwd,options.agentDir,()=>{resolved||(resolved=!0,ui.stop(),stopThemeWatcher(),resolve17())},()=>{ui.stop(),stopThemeWatcher(),process.exit(0)},()=>ui.requestRender(),ui.terminal.rows,options.writeScope,options.projectModeAvailable);ui.addChild(selector),ui.setFocus(selector.getResourceList()),ui.start()})}import{randomUUID as randomUUID10}from"node:crypto";import{copyFileSync as copyFileSync2,existsSync as existsSync26,mkdirSync as mkdirSync14,renameSync as renameSync3,rmSync as rmSync7}from"node:fs";import{basename as basename14,dirname as dirname27,join as join45,relative as relative11,resolve as resolve15,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath2(path14){return toNamespacedPath(resolve15(path14))}function getQuarantineRoot(packageDir){let current=resolve15(packageDir);for(;;){if(basename14(current).toLowerCase()==="node_modules")return join45(current,QUARANTINE_DIR_NAME);let parent=dirname27(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath2(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath2(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync7(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath2(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join45(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID10()}`);for(let loadedFile of loadedFiles){if(!existsSync26(loadedFile))continue;let quarantinePath=join45(quarantineRunDir,relative11(resolvedPackageDir,loadedFile));mkdirSync14(dirname27(quarantinePath),{recursive:!0}),renameSync3(loadedFile,quarantinePath),copyFileSync2(quarantinePath,loadedFile)}}var DEFAULT_INSTALLER_API_BASE="https://pi.dev/api/installer/releases",MANAGED_INSTALL_MARKER="managed-install.json",MANAGED_RELEASE_VERSION_RE=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function getActiveManagedInstallRoot(){let configuredRoot=process.env.PI_MANAGED_INSTALL_ROOT?.trim();if(!configuredRoot)return;let managedRoot=resolve16(configuredRoot),releasesDir=canonicalizePath(join46(managedRoot,"releases"));if(getCwdRelativePath(canonicalizePath(getPackageDir()),releasesDir)===void 0)return;let markerPath=join46(managedRoot,MANAGED_INSTALL_MARKER);try{let marker=JSON.parse(readFileSync23(markerPath,"utf8"));if(marker.kind!=="pi-managed-install"||marker.schemaVersion!==1||marker.layout!=="releases-v1")throw new Error}catch{throw new Error(`Managed install marker is missing or invalid: ${markerPath}`)}return managedRoot}async function fetchInstallerArtifact(url,label){let response=await fetch(url,{headers:{"User-Agent":getPiUserAgent(VERSION)}});if(!response.ok)throw new Error(`Could not download managed installer ${label} from ${url}: HTTP ${response.status}`);return await response.text()}async function runManagedNpmCi(stageDir){let args=["ci","--ignore-scripts","--min-release-age=0","--omit=dev","--include=optional","--no-fund","--no-audit","--loglevel=error","--progress=false"],code=await waitForChildProcess(spawnProcess("npm",args,{cwd:stageDir,stdio:"inherit"}));if(code!==0)throw new Error(`npm ${args.join(" ")} exited with code ${code??"unknown"}`)}function verifyManagedRelease(releaseDir,expectedVersion){let binPath=join46(releaseDir,"node_modules",".bin",process.platform==="win32"?`${APP_NAME}.cmd`:APP_NAME),result2=spawnProcessSync(binPath,["--version"],{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(result2.error||result2.status!==0){let reason=result2.error?.message||result2.stderr.trim()||`exit code ${result2.status??"unknown"}`;throw new Error(`Could not verify managed Pi ${expectedVersion}: ${reason}`)}let installedVersion=result2.stdout.trim();if(installedVersion!==expectedVersion)throw new Error(`Managed Pi smoke test returned version ${installedVersion}; expected ${expectedVersion}.`)}function activateManagedRelease(managedRoot,version2){let currentPath=join46(managedRoot,"current-version"),temporaryPath=join46(managedRoot,`current-version.tmp.${process.pid}-${Date.now()}`);try{writeFileSync14(temporaryPath,`${version2}
|
|
1645
|
+
`)}`),new Error(errorMessage6)}let themeJson=json;if(themeJson.name.includes("/"))throw new Error(`Invalid theme name "${themeJson.name}": theme names cannot contain "/" because it is reserved for automatic light/dark theme settings.`);return themeJson}import{existsSync as existsSync27,mkdirSync as mkdirSync15,mkdtempSync as mkdtempSync3,readdirSync as readdirSync11,readFileSync as readFileSync23,renameSync as renameSync4,rmSync as rmSync8,writeFileSync as writeFileSync14}from"node:fs";import{join as join46,resolve as resolve16}from"node:path";var import_proper_lockfile6=__toESM(require_proper_lockfile(),1);import{homedir as homedir12}from"node:os";import{basename as basename13,dirname as dirname27,join as join44,relative as relative10}from"node:path";var RESOURCE_TYPES2=["extensions","skills","prompts","themes"],RESOURCE_TYPE_LABELS={extensions:"Extensions",skills:"Skills",prompts:"Prompts",themes:"Themes"};function formatBaseDir(baseDir){let homeDir=homedir12(),displayPath2;return baseDir===homeDir?displayPath2="~":baseDir.startsWith(homeDir)?displayPath2=`~${baseDir.slice(homeDir.length).replace(/\\/g,"/")}`:displayPath2=baseDir.replace(/\\/g,"/"),displayPath2.endsWith("/")?displayPath2:`${displayPath2}/`}function getGroupLabel(metadata,agentDir){return metadata.origin==="package"?`${metadata.source} (${metadata.scope})`:metadata.source==="auto"?metadata.baseDir?metadata.scope==="user"?`User (${formatBaseDir(metadata.baseDir)})`:`Project (${formatBaseDir(metadata.baseDir)})`:metadata.scope==="user"?`User (${formatBaseDir(agentDir)})`:`Project (${CONFIG_DIR_NAME}/)`:metadata.scope==="user"?"User settings":"Project settings"}function buildGroups(resolved,agentDir){let groupMap=new Map,addToGroup=(resources,resourceType)=>{for(let res of resources){let{path:path14,enabled,metadata}=res,groupKey2=`${metadata.origin}:${metadata.scope}:${metadata.source}:${metadata.baseDir??""}`;groupMap.has(groupKey2)||groupMap.set(groupKey2,{key:groupKey2,label:getGroupLabel(metadata,agentDir),scope:metadata.scope,origin:metadata.origin,source:metadata.source,subgroups:[]});let group=groupMap.get(groupKey2),subgroupKey=`${groupKey2}:${resourceType}`,subgroup=group.subgroups.find(sg=>sg.type===resourceType);subgroup||(subgroup={type:resourceType,label:RESOURCE_TYPE_LABELS[resourceType],items:[]},group.subgroups.push(subgroup));let fileName=basename13(path14),parentFolder=basename13(dirname27(path14)),displayName;resourceType==="extensions"&&parentFolder!=="extensions"?displayName=`${parentFolder}/${fileName}`:resourceType==="skills"&&fileName==="SKILL.md"?displayName=parentFolder:displayName=fileName,subgroup.items.push({path:path14,enabled,metadata,resourceType,displayName,groupKey:groupKey2,subgroupKey})}};addToGroup(resolved.extensions,"extensions"),addToGroup(resolved.skills,"skills"),addToGroup(resolved.prompts,"prompts"),addToGroup(resolved.themes,"themes");let groups=Array.from(groupMap.values());groups.sort((a,b2)=>a.origin!==b2.origin?a.origin==="package"?-1:1:a.scope!==b2.scope?a.scope==="user"?-1:1:a.source.localeCompare(b2.source));let typeOrder={extensions:0,skills:1,prompts:2,themes:3};for(let group of groups){group.subgroups.sort((a,b2)=>typeOrder[a.type]-typeOrder[b2.type]);for(let subgroup of group.subgroups)subgroup.items.sort((a,b2)=>a.displayName.localeCompare(b2.displayName))}return groups}var ConfigSelectorHeader=class{constructor(writeScope,projectModeAvailable){this.writeScope=writeScope,this.projectModeAvailable=projectModeAvailable}setWriteScope(writeScope){this.writeScope=writeScope}invalidate(){}render(width){let title=theme.bold(this.writeScope==="project"?"Project Local Resources":"Global Resources"),sep12=theme.fg("muted"," \xB7 "),switchHint=this.projectModeAvailable?keyHint("tui.input.tab","switch mode")+sep12:"",actionHint=this.writeScope==="project"?rawKeyHint("space","cycle inherit/+/-"):rawKeyHint("space","toggle"),hint2=switchHint+actionHint+sep12+rawKeyHint("esc","close"),spacing=Math.max(1,width-visibleWidth(title)-visibleWidth(hint2)),scopeHint=this.writeScope==="project"?theme.fg("muted",`${CONFIG_DIR_NAME}/settings.json \xB7 inherited global resources are dimmed`):theme.fg("muted",`~/${CONFIG_DIR_NAME}/agent/settings.json`);return[truncateToWidth(`${title}${" ".repeat(spacing)}${hint2}`,width,""),truncateToWidth(scopeHint,width,"")]}},ResourceList=class{get focused(){return this._focused}set focused(value2){this._focused=value2,this.searchInput.focused=value2}constructor(groupsByScope,settingsManager,cwd,agentDir,terminalHeight,writeScope="global"){this.flatItems=[],this.filteredItems=[],this.selectedIndex=0,this._focused=!1,this.groupsByScope=groupsByScope,this.settingsManager=settingsManager,this.cwd=cwd,this.agentDir=agentDir,this.writeScope=writeScope,this.inheritedEnabledByKey=this.buildInheritedEnabledMap(groupsByScope.global),this.searchInput=new Input;let chrome=8;this.maxVisible=Math.max(5,(terminalHeight??24)-chrome),this.buildFlatList(),this.filteredItems=[...this.flatItems]}setWriteScope(writeScope){this.writeScope=writeScope,this.buildFlatList(),this.filterItems(this.searchInput.getValue())}get groups(){return this.groupsByScope[this.writeScope]}buildInheritedEnabledMap(groups){let result2=new Map;for(let group of groups)for(let subgroup of group.subgroups)for(let item of subgroup.items)result2.set(this.getResourceItemKey(item),item.enabled);return result2}buildFlatList(){this.flatItems=[];for(let group of this.groups){this.flatItems.push({type:"group",group});for(let subgroup of group.subgroups){this.flatItems.push({type:"subgroup",subgroup,group});for(let item of subgroup.items)this.flatItems.push({type:"item",item})}}this.selectedIndex=this.flatItems.findIndex(e=>e.type==="item"),this.selectedIndex<0&&(this.selectedIndex=0)}findNextItem(fromIndex,direction){let idx=fromIndex+direction;for(;idx>=0&&idx<this.filteredItems.length;){if(this.filteredItems[idx].type==="item")return idx;idx+=direction}return fromIndex}filterItems(query){if(!query.trim()){this.filteredItems=[...this.flatItems],this.selectFirstItem();return}let lowerQuery=query.toLowerCase(),matchingItems=new Set,matchingSubgroups=new Set,matchingGroups=new Set;for(let entry of this.flatItems)if(entry.type==="item"){let item=entry.item;(item.displayName.toLowerCase().includes(lowerQuery)||item.resourceType.toLowerCase().includes(lowerQuery)||item.path.toLowerCase().includes(lowerQuery))&&matchingItems.add(item)}for(let group of this.groups)for(let subgroup of group.subgroups)for(let item of subgroup.items)matchingItems.has(item)&&(matchingSubgroups.add(subgroup),matchingGroups.add(group));this.filteredItems=[];for(let entry of this.flatItems)entry.type==="group"&&matchingGroups.has(entry.group)?this.filteredItems.push(entry):entry.type==="subgroup"&&matchingSubgroups.has(entry.subgroup)?this.filteredItems.push(entry):entry.type==="item"&&matchingItems.has(entry.item)&&this.filteredItems.push(entry);this.selectFirstItem()}selectFirstItem(){let firstItemIndex=this.filteredItems.findIndex(e=>e.type==="item");this.selectedIndex=firstItemIndex>=0?firstItemIndex:0}updateItem(item,enabled){item.enabled=enabled;for(let group of this.groups)for(let subgroup of group.subgroups){let found=subgroup.items.find(i=>i.path===item.path&&i.resourceType===item.resourceType);if(found){found.enabled=enabled;return}}}invalidate(){}render(width){let lines=[];if(lines.push(...this.searchInput.render(width)),lines.push(""),this.filteredItems.length===0)return lines.push(theme.fg("muted"," No resources found")),lines;let startIndex=Math.max(0,Math.min(this.selectedIndex-Math.floor(this.maxVisible/2),this.filteredItems.length-this.maxVisible)),endIndex=Math.min(startIndex+this.maxVisible,this.filteredItems.length);for(let i=startIndex;i<endIndex;i++){let entry=this.filteredItems[i],isSelected=i===this.selectedIndex;if(entry.type==="group"){let inherited=this.writeScope==="project"&&entry.group.scope==="user",label=theme.bold(`${entry.group.label}${inherited?" \xB7 inherited global":""}`),groupLine=theme.fg(inherited?"dim":"accent",label);lines.push(truncateToWidth(` ${groupLine}`,width,""))}else if(entry.type==="subgroup"){let color2=this.writeScope==="project"&&entry.group.scope==="user"?"dim":"muted",subgroupLine=theme.fg(color2,entry.subgroup.label);lines.push(truncateToWidth(` ${subgroupLine}`,width,""))}else{let item=entry.item,cursor=isSelected?"> ":" ",dimmed=this.isDimmedItem(item),nameText=isSelected&&!dimmed?theme.bold(item.displayName):item.displayName,name=dimmed?theme.fg("dim",nameText):nameText;lines.push(truncateToWidth(`${cursor} ${this.renderCheckbox(item)} ${name}${this.getItemSuffix(item)}`,width,"..."))}}if(startIndex>0||endIndex<this.filteredItems.length){let itemCount=this.filteredItems.filter(e=>e.type==="item").length,currentItemIndex=this.filteredItems.slice(0,this.selectedIndex).filter(e=>e.type==="item").length+1;lines.push(theme.fg("dim",` (${currentItemIndex}/${itemCount})`))}return lines}handleInput(data){let kb=getKeybindings();if(kb.matches(data,"tui.select.up")){this.selectedIndex=this.findNextItem(this.selectedIndex,-1);return}if(kb.matches(data,"tui.select.down")){this.selectedIndex=this.findNextItem(this.selectedIndex,1);return}if(kb.matches(data,"tui.select.pageUp")){let target=Math.max(0,this.selectedIndex-this.maxVisible);for(;target<this.filteredItems.length&&this.filteredItems[target].type!=="item";)target++;target<this.filteredItems.length&&(this.selectedIndex=target);return}if(kb.matches(data,"tui.select.pageDown")){let target=Math.min(this.filteredItems.length-1,this.selectedIndex+this.maxVisible);for(;target>=0&&this.filteredItems[target].type!=="item";)target--;target>=0&&(this.selectedIndex=target);return}if(kb.matches(data,"tui.select.cancel")){this.onCancel?.();return}if(matchesKey(data,"ctrl+c")){this.onExit?.();return}if(kb.matches(data,"tui.input.tab")){this.onSwitchMode?.();return}if(data===" "||kb.matches(data,"tui.select.confirm")){let entry=this.filteredItems[this.selectedIndex];if(entry?.type==="item"&&(this.writeScope==="project"||this.getItemScope(entry.item)==="user")){let newEnabled=this.toggleResource(entry.item);newEnabled!==void 0&&(this.updateItem(entry.item,newEnabled),this.onToggle?.(entry.item,newEnabled))}return}this.searchInput.handleInput(data),this.filterItems(this.searchInput.getValue())}toggleResource(item){if(this.writeScope==="project"){let state2=this.getNextOverrideState(item);return this.setProjectResourceOverride(item,state2)?state2==="inherit"?this.getInheritedEnabled(item):state2==="load":void 0}let enabled=!item.enabled;return item.metadata.origin==="top-level"?this.toggleTopLevelResource(item,enabled):this.togglePackageResource(item,enabled),enabled}toggleTopLevelResource(item,enabled){let scope=item.metadata.scope,settings2=scope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings(),arrayKey=item.resourceType,current=settings2[arrayKey]??[],pattern=this.getResourcePattern(item),disablePattern=`-${pattern}`,enablePattern=`+${pattern}`,updated=current.filter(p=>(p.startsWith("!")||p.startsWith("+")||p.startsWith("-")?p.slice(1):p)!==pattern);enabled?updated.push(enablePattern):updated.push(disablePattern),scope==="project"?arrayKey==="extensions"?this.settingsManager.setProjectExtensionPaths(updated):arrayKey==="skills"?this.settingsManager.setProjectSkillPaths(updated):arrayKey==="prompts"?this.settingsManager.setProjectPromptTemplatePaths(updated):arrayKey==="themes"&&this.settingsManager.setProjectThemePaths(updated):arrayKey==="extensions"?this.settingsManager.setExtensionPaths(updated):arrayKey==="skills"?this.settingsManager.setSkillPaths(updated):arrayKey==="prompts"?this.settingsManager.setPromptTemplatePaths(updated):arrayKey==="themes"&&this.settingsManager.setThemePaths(updated)}togglePackageResource(item,enabled){let scope=item.metadata.scope,packages=[...(scope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings()).packages??[]],pkgIndex=packages.findIndex(pkg3=>(typeof pkg3=="string"?pkg3:pkg3.source)===item.metadata.source);if(pkgIndex===-1)return;let pkg2=packages[pkgIndex];typeof pkg2=="string"&&(pkg2={source:pkg2},packages[pkgIndex]=pkg2);let arrayKey=item.resourceType,current=pkg2[arrayKey]??[],pattern=this.getPackageResourcePattern(item),disablePattern=`-${pattern}`,enablePattern=`+${pattern}`,updated=current.filter(p=>(p.startsWith("!")||p.startsWith("+")||p.startsWith("-")?p.slice(1):p)!==pattern);enabled?updated.push(enablePattern):updated.push(disablePattern),pkg2[arrayKey]=updated.length>0?updated:void 0,["extensions","skills","prompts","themes"].some(k2=>pkg2[k2]!==void 0)||(packages[pkgIndex]=pkg2.source),scope==="project"?this.settingsManager.setProjectPackages(packages):this.settingsManager.setPackages(packages)}renderCheckbox(item){if(this.writeScope==="project"){let state2=this.getProjectOverrideState(item);return state2==="load"?theme.fg("success","[+]"):state2==="unload"?theme.fg("warning","[-]"):theme.fg("dim",item.enabled?"[x]":"[ ]")}return item.enabled?theme.fg("success","[x]"):theme.fg("dim","[ ]")}getItemSuffix(item){if(this.writeScope!=="project")return"";let state2=this.getProjectOverrideState(item);return state2==="load"?theme.fg("muted"," project load"):state2==="unload"?theme.fg("muted"," project unload"):this.isInheritedGlobalItem(item)?theme.fg("dim"," inherited global"):""}isDimmedItem(item){return this.writeScope==="project"&&this.isInheritedGlobalItem(item)&&this.getProjectOverrideState(item)==="inherit"}setProjectResourceOverride(item,state2){return item.metadata.origin==="top-level"?this.setProjectTopLevelOverride(item,state2):this.setProjectPackageOverride(item,state2)}setProjectTopLevelOverride(item,state2){let current=this.settingsManager.getProjectSettings()[item.resourceType]??[],pattern=this.isInheritedGlobalItem(item)?item.path:this.getResourcePatternForScope(item,"project"),patterns=this.getTopLevelOverridePatterns(item,"project"),updated=current.filter(entry=>{let target=this.getPatternEntryTarget(entry);return(entry.startsWith("!")||entry.startsWith("+")||entry.startsWith("-"))&&patterns.has(target)?!1:!(state2==="inherit"&&this.isInheritedGlobalItem(item)&&target===pattern)});return state2!=="inherit"&&(this.isInheritedGlobalItem(item)&&!updated.includes(pattern)&&updated.push(pattern),updated.push(`${state2==="load"?"+":"-"}${pattern}`)),this.setProjectTopLevelPaths(item.resourceType,updated),!0}setProjectTopLevelPaths(key,paths){key==="extensions"?this.settingsManager.setProjectExtensionPaths(paths):key==="skills"?this.settingsManager.setProjectSkillPaths(paths):key==="prompts"?this.settingsManager.setProjectPromptTemplatePaths(paths):this.settingsManager.setProjectThemePaths(paths)}setProjectPackageOverride(item,state2){let packages=[...this.settingsManager.getProjectSettings().packages??[]],pkgIndex=packages.findIndex(pkg3=>this.packageSourceStringMatches(item.metadata.source,this.getItemScope(item),typeof pkg3=="string"?pkg3:pkg3.source,"project"));if(pkgIndex===-1){if(state2==="inherit")return!1;packages.push(this.createPackageOverrideSource(item)),pkgIndex=packages.length-1}let pkg2=packages[pkgIndex];if(pkg2===void 0)return!1;typeof pkg2=="string"&&(pkg2={source:pkg2},packages[pkgIndex]=pkg2);let pattern=this.getPackageResourcePattern(item),updated=(pkg2[item.resourceType]??[]).filter(entry=>this.getPatternEntryTarget(entry)!==pattern);return state2!=="inherit"&&updated.push(`${state2==="load"?"+":"-"}${pattern}`),pkg2[item.resourceType]=updated.length>0?updated:void 0,RESOURCE_TYPES2.some(key=>pkg2[key]!==void 0)||(pkg2.autoload===!1?packages.splice(pkgIndex,1):packages[pkgIndex]=pkg2.source),this.settingsManager.setProjectPackages(packages),!0}getNextOverrideState(item){let state2=this.getProjectOverrideState(item),inheritedEnabled=this.getInheritedEnabled(item);return state2==="inherit"?inheritedEnabled?"unload":"load":state2==="unload"?inheritedEnabled?"load":"inherit":inheritedEnabled?"inherit":"unload"}getProjectOverrideState(item){if(this.writeScope!=="project")return"inherit";if(item.metadata.origin==="top-level")return this.getOverrideStateFromEntries(this.settingsManager.getProjectSettings()[item.resourceType]??[],this.getTopLevelOverridePatterns(item,"project"),!1);let pkg2=this.findMatchingPackageSource(item,"project");if(typeof pkg2!="object")return"inherit";let entries=pkg2[item.resourceType];return entries===void 0?"inherit":this.getOverrideStateFromEntries(entries,new Set([this.getPackageResourcePattern(item)]),pkg2.autoload!==!1)}getOverrideStateFromEntries(entries,patterns,emptyArrayIsUnload){if(entries.length===0&&emptyArrayIsUnload)return"unload";let state2="inherit";for(let entry of entries)patterns.has(this.getPatternEntryTarget(entry))&&(entry.startsWith("!")||entry.startsWith("-")?state2="unload":state2="load");return state2}getInheritedEnabled(item){return this.inheritedEnabledByKey.get(this.getResourceItemKey(item))??(this.getItemScope(item)==="user"?item.enabled:!0)}isInheritedGlobalItem(item){return this.getItemScope(item)==="user"||this.inheritedEnabledByKey.has(this.getResourceItemKey(item))}getTopLevelOverridePatterns(item,scope){let baseDir=this.getTopLevelBaseDir(scope),patterns=new Set([this.getResourcePatternForScope(item,scope),item.path,relative10(baseDir,item.path)]);return item.metadata.baseDir&&patterns.add(relative10(item.metadata.baseDir,item.path)),patterns}getResourcePatternForScope(item,scope){let sourceScope=this.getItemScope(item);if(scope!==sourceScope)return item.path;let baseDir=item.metadata.baseDir??this.getTopLevelBaseDir(sourceScope);return relative10(baseDir,item.path)}createPackageOverrideSource(item){let source=item.metadata.source;if(!isLocalPath(source))return{source,autoload:!1};let sourcePath=resolvePath(source,this.getTopLevelBaseDir(this.getItemScope(item)),{trim:!0});return{source:relative10(this.getTopLevelBaseDir("project"),sourcePath)||".",autoload:!1}}packageSourceStringMatches(leftSource,leftScope,rightSource,rightScope){if(leftSource===rightSource)return!0;if(!isLocalPath(leftSource)||!isLocalPath(rightSource))return!1;let left=resolvePath(leftSource,this.getTopLevelBaseDir(leftScope),{trim:!0}),right=resolvePath(rightSource,this.getTopLevelBaseDir(rightScope),{trim:!0});return left===right}findMatchingPackageSource(item,targetScope){return((targetScope==="project"?this.settingsManager.getProjectSettings():this.settingsManager.getGlobalSettings()).packages??[]).find(pkg2=>this.packageSourceStringMatches(item.metadata.source,this.getItemScope(item),typeof pkg2=="string"?pkg2:pkg2.source,targetScope))}getPatternEntryTarget(entry){return entry.startsWith("!")||entry.startsWith("+")||entry.startsWith("-")?entry.slice(1):entry}getResourceItemKey(item){return`${item.resourceType}:${canonicalizePath(item.path)}`}getItemScope(item){return item.metadata.scope==="project"?"project":"user"}getTopLevelBaseDir(scope){return scope==="project"?join44(this.cwd,CONFIG_DIR_NAME):this.agentDir}getResourcePattern(item){let scope=item.metadata.scope,baseDir=item.metadata.baseDir??this.getTopLevelBaseDir(scope);return relative10(baseDir,item.path)}getPackageResourcePattern(item){let baseDir=item.metadata.baseDir??dirname27(item.path);return relative10(baseDir,item.path)}},ConfigSelectorComponent=class extends Container{get focused(){return this._focused}set focused(value2){this._focused=value2,this.resourceList.focused=value2}constructor(resolvedPaths,settingsManager,cwd,agentDir,onClose,onExit,requestRender,terminalHeight,writeScope="global",projectModeAvailable=!0){super(),this._focused=!1,this.writeScope=writeScope;let groupsByScope={global:buildGroups(resolvedPaths.global,agentDir),project:buildGroups(resolvedPaths.project,agentDir)};this.addChild(new Spacer(1)),this.addChild(new DynamicBorder),this.addChild(new Spacer(1)),this.header=new ConfigSelectorHeader(this.writeScope,projectModeAvailable),this.addChild(this.header),this.addChild(new Spacer(1)),this.resourceList=new ResourceList(groupsByScope,settingsManager,cwd,agentDir,terminalHeight,this.writeScope),this.resourceList.onCancel=onClose,this.resourceList.onExit=onExit,this.resourceList.onToggle=()=>requestRender(),projectModeAvailable&&(this.resourceList.onSwitchMode=()=>{this.switchWriteScope(),requestRender()}),this.addChild(this.resourceList),this.addChild(new Spacer(1)),this.addChild(new DynamicBorder)}switchWriteScope(){this.writeScope=this.writeScope==="global"?"project":"global",this.header.setWriteScope(this.writeScope),this.resourceList.setWriteScope(this.writeScope)}getResourceList(){return this.resourceList}};async function selectConfig(options){return initTheme(options.settingsManager.getTheme(),!0),new Promise(resolve17=>{let ui=new TuiMainScreen(new ProcessTerminal,options.settingsManager.getShowHardwareCursor(),options.agentDir);ui.setClearOnShrink(options.settingsManager.getClearOnShrink());let resolved=!1,selector=new ConfigSelectorComponent(options.resolvedPaths,options.settingsManager,options.cwd,options.agentDir,()=>{resolved||(resolved=!0,ui.stop(),stopThemeWatcher(),resolve17())},()=>{ui.stop(),stopThemeWatcher(),process.exit(0)},()=>ui.requestRender(),ui.terminal.rows,options.writeScope,options.projectModeAvailable);ui.addChild(selector),ui.setFocus(selector.getResourceList()),ui.start()})}import{randomUUID as randomUUID10}from"node:crypto";import{copyFileSync as copyFileSync2,existsSync as existsSync26,mkdirSync as mkdirSync14,renameSync as renameSync3,rmSync as rmSync7}from"node:fs";import{basename as basename14,dirname as dirname28,join as join45,relative as relative11,resolve as resolve15,toNamespacedPath}from"node:path";var QUARANTINE_DIR_NAME=".pi-native-quarantine";function normalizePath2(path14){return toNamespacedPath(resolve15(path14))}function getQuarantineRoot(packageDir){let current=resolve15(packageDir);for(;;){if(basename14(current).toLowerCase()==="node_modules")return join45(current,QUARANTINE_DIR_NAME);let parent=dirname28(current);if(parent===current)return;current=parent}}function getLoadedSharedObjectsInPackageDir(packageDir){let sharedObjects=process.report.getReport().sharedObjects;if(!Array.isArray(sharedObjects))return[];let root=normalizePath2(packageDir).toLowerCase(),seen=new Set,loadedFiles=[];for(let value2 of sharedObjects){if(typeof value2!="string")continue;let filePath=normalizePath2(value2),comparisonPath=filePath.toLowerCase();getCwdRelativePath(comparisonPath,root)===void 0||seen.has(comparisonPath)||(seen.add(comparisonPath),loadedFiles.push(filePath))}return loadedFiles}function cleanupWindowsSelfUpdateQuarantine(packageDir){let quarantineRoot=getQuarantineRoot(packageDir);if(quarantineRoot)try{rmSync7(quarantineRoot,{recursive:!0,force:!0})}catch{}}function quarantineWindowsNativeDependencies(packageDir){let resolvedPackageDir=normalizePath2(packageDir),quarantineRoot=getQuarantineRoot(resolvedPackageDir);if(!quarantineRoot)return;let loadedFiles=getLoadedSharedObjectsInPackageDir(resolvedPackageDir);if(loadedFiles.length===0)return;let quarantineRunDir=join45(quarantineRoot,`${Date.now()}-${process.pid}-${randomUUID10()}`);for(let loadedFile of loadedFiles){if(!existsSync26(loadedFile))continue;let quarantinePath=join45(quarantineRunDir,relative11(resolvedPackageDir,loadedFile));mkdirSync14(dirname28(quarantinePath),{recursive:!0}),renameSync3(loadedFile,quarantinePath),copyFileSync2(quarantinePath,loadedFile)}}var DEFAULT_INSTALLER_API_BASE="https://pi.dev/api/installer/releases",MANAGED_INSTALL_MARKER="managed-install.json",MANAGED_RELEASE_VERSION_RE=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;function getActiveManagedInstallRoot(){let configuredRoot=process.env.PI_MANAGED_INSTALL_ROOT?.trim();if(!configuredRoot)return;let managedRoot=resolve16(configuredRoot),releasesDir=canonicalizePath(join46(managedRoot,"releases"));if(getCwdRelativePath(canonicalizePath(getPackageDir()),releasesDir)===void 0)return;let markerPath=join46(managedRoot,MANAGED_INSTALL_MARKER);try{let marker=JSON.parse(readFileSync23(markerPath,"utf8"));if(marker.kind!=="pi-managed-install"||marker.schemaVersion!==1||marker.layout!=="releases-v1")throw new Error}catch{throw new Error(`Managed install marker is missing or invalid: ${markerPath}`)}return managedRoot}async function fetchInstallerArtifact(url,label){let response=await fetch(url,{headers:{"User-Agent":getPiUserAgent(VERSION)}});if(!response.ok)throw new Error(`Could not download managed installer ${label} from ${url}: HTTP ${response.status}`);return await response.text()}async function runManagedNpmCi(stageDir){let args=["ci","--ignore-scripts","--min-release-age=0","--omit=dev","--include=optional","--no-fund","--no-audit","--loglevel=error","--progress=false"],code=await waitForChildProcess(spawnProcess("npm",args,{cwd:stageDir,stdio:"inherit"}));if(code!==0)throw new Error(`npm ${args.join(" ")} exited with code ${code??"unknown"}`)}function verifyManagedRelease(releaseDir,expectedVersion){let binPath=join46(releaseDir,"node_modules",".bin",process.platform==="win32"?`${APP_NAME}.cmd`:APP_NAME),result2=spawnProcessSync(binPath,["--version"],{encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(result2.error||result2.status!==0){let reason=result2.error?.message||result2.stderr.trim()||`exit code ${result2.status??"unknown"}`;throw new Error(`Could not verify managed Pi ${expectedVersion}: ${reason}`)}let installedVersion=result2.stdout.trim();if(installedVersion!==expectedVersion)throw new Error(`Managed Pi smoke test returned version ${installedVersion}; expected ${expectedVersion}.`)}function activateManagedRelease(managedRoot,version2){let currentPath=join46(managedRoot,"current-version"),temporaryPath=join46(managedRoot,`current-version.tmp.${process.pid}-${Date.now()}`);try{writeFileSync14(temporaryPath,`${version2}
|
|
1633
1646
|
`),renameSync4(temporaryPath,currentPath)}finally{rmSync8(temporaryPath,{force:!0})}}function cleanupManagedStaging(managedRoot){let stagingRoot=join46(managedRoot,"staging");try{for(let entry of readdirSync11(stagingRoot))entry.startsWith("update-")&&rmSync8(join46(stagingRoot,entry),{force:!0,recursive:!0})}catch{}}function cleanupManagedInstall(){let managedRoot;try{managedRoot=getActiveManagedInstallRoot()}catch{return}if(managedRoot)try{let releaseLock=import_proper_lockfile6.default.lockSync(join46(managedRoot,"update"),{realpath:!1});try{cleanupManagedStaging(managedRoot)}finally{releaseLock()}}catch{}}async function runManagedSelfUpdate(managedRoot,version2){if(!MANAGED_RELEASE_VERSION_RE.test(version2))throw new Error(`Invalid managed release version: ${version2}`);let releaseLock;try{releaseLock=await import_proper_lockfile6.default.lock(join46(managedRoot,"update"),{realpath:!1})}catch(error){throw error instanceof Error&&"code"in error&&error.code==="ELOCKED"?new Error("Another managed Pi update is already running."):error}let stageDir;try{cleanupManagedStaging(managedRoot);let releaseUrl=`${(process.env.PI_INSTALLER_API_BASE?.trim()||DEFAULT_INSTALLER_API_BASE).replace(/\/+$/,"")}/${encodeURIComponent(version2)}`,stagingRoot=join46(managedRoot,"staging"),releasesRoot=join46(managedRoot,"releases");mkdirSync15(releasesRoot,{recursive:!0});let releaseDir=join46(releasesRoot,version2);if(existsSync27(releaseDir)){verifyManagedRelease(releaseDir,version2),activateManagedRelease(managedRoot,version2);return}mkdirSync15(stagingRoot,{recursive:!0}),stageDir=mkdtempSync3(join46(stagingRoot,"update-"));let[packageJsonContent,packageLockContent]=await Promise.all([fetchInstallerArtifact(`${releaseUrl}/package.json`,"package.json"),fetchInstallerArtifact(`${releaseUrl}/package-lock.json`,"package-lock.json")]);writeFileSync14(join46(stageDir,"package.json"),packageJsonContent),writeFileSync14(join46(stageDir,"package-lock.json"),packageLockContent),await runManagedNpmCi(stageDir),verifyManagedRelease(stageDir,version2),renameSync4(stageDir,releaseDir),activateManagedRelease(managedRoot,version2)}finally{stageDir&&rmSync8(stageDir,{force:!0,recursive:!0}),await releaseLock()}}var SELF_UPDATE_NOTE_MARKDOWN_THEME={heading:text2=>source_default.bold(source_default.yellow(text2)),link:text2=>source_default.cyan(text2),linkUrl:text2=>source_default.dim(text2),code:text2=>source_default.yellow(text2),codeBlock:text2=>source_default.dim(text2),codeBlockBorder:text2=>source_default.dim(text2),quote:text2=>source_default.dim(text2),quoteBorder:text2=>source_default.dim(text2),hr:text2=>source_default.dim(text2),listBullet:text2=>source_default.yellow(text2),bold:text2=>source_default.bold(text2),italic:text2=>source_default.italic(text2),strikethrough:text2=>source_default.strikethrough(text2),underline:text2=>source_default.underline(text2)};function reportSettingsErrors(settingsManager,context){let errors=settingsManager.drainErrors();for(let{scope,error}of errors)console.error(source_default.yellow(`Warning (${context}, ${scope} settings): ${error.message}`)),error.stack&&console.error(source_default.dim(error.stack))}function getPackageCommandUsage(command){switch(command){case"install":return`${APP_NAME} install <source> [-l] [--approve|--no-approve]`;case"remove":return`${APP_NAME} remove <source> [-l] [--approve|--no-approve]`;case"update":return`${APP_NAME} update [source|self|pi] [--self|--extensions|--models|--all] [--extension <source>] [--approve|--no-approve] [--force]`;case"list":return`${APP_NAME} list [--approve|--no-approve]`}}var CONFIG_COMMAND_USAGE=`${APP_NAME} config [-l] [--approve|--no-approve]`;function printConfigCommandHelp(){console.log(`${source_default.bold("Usage:")}
|
|
1634
1647
|
${CONFIG_COMMAND_USAGE}
|
|
1635
1648
|
|