@code-yeongyu/senpi 2026.10.2 → 2026.10.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 +22 -0
- package/dist/bundle/chunks/{app-server-command-SZJAJX5J.js → app-server-command-VSOBULUS.js} +1 -1
- package/dist/bundle/chunks/{chunk-PA7DXEUM.js → chunk-2EYJJDES.js} +13 -30
- package/dist/bundle/chunks/{chunk-LACVPFMM.js → chunk-ATACOV2Q.js} +3 -3
- package/dist/bundle/chunks/{chunk-2NAN2JVY.js → chunk-E6TL3R3I.js} +1 -1
- package/dist/bundle/chunks/chunk-Q23IMPRD.js +6 -0
- package/dist/bundle/chunks/{chunk-GIK2N57G.js → chunk-WIBTUARS.js} +20 -2
- package/dist/bundle/chunks/chunk-XOUTBUAV.js +24 -0
- package/dist/bundle/chunks/{cli-main-B66BJ6WS.js → cli-main-RH4BAWCJ.js} +1 -1
- package/dist/bundle/chunks/{host-command-ESRPUXI2.js → host-command-2ZP7B3DA.js} +1 -1
- package/dist/bundle/chunks/{host-lifecycle-P65B4FWL.js → host-lifecycle-3ZZLFX55.js} +1 -1
- package/dist/bundle/chunks/host-lifecycle.js +2 -2
- package/dist/bundle/chunks/{interactive-mode-LBS4DGTM.js → interactive-mode-LBBIPYPZ.js} +1 -1
- package/dist/bundle/chunks/{multi-session-host-5C2TC4BN.js → multi-session-host-GFWO2JUC.js} +1 -1
- package/dist/bundle/chunks/{package-manager-cli-K3JGGB65.js → package-manager-cli-VHCS5NXO.js} +1 -1
- package/dist/bundle/chunks/{rpc-mode-FJGYYLVG.js → rpc-mode-KAZWRS2K.js} +1 -1
- package/dist/bundle/chunks/{schedule-command-BT36FE6F.js → schedule-command-OUALJDGD.js} +1 -1
- package/dist/bundle/chunks/{session-picker-MMTSHPR5.js → session-picker-UYF62GAF.js} +1 -1
- package/dist/bundle/chunks/session-worker.js +35 -34
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/bundle/runtime-manifest.json +1 -1
- package/dist/core/agent-session.d.ts +4 -0
- package/dist/core/agent-session.js +60 -27
- package/dist/core/extensions/builtin/mcp/index.js +19 -10
- package/dist/core/extensions/builtin/mcp/service-register.d.ts +1 -0
- package/dist/core/extensions/builtin/mcp/service-register.js +2 -4
- package/dist/core/extensions/builtin/mcp/service-tools-changed.d.ts +11 -2
- package/dist/core/extensions/builtin/mcp/service-tools-changed.js +33 -6
- package/dist/core/extensions/builtin/mcp/service-types.d.ts +0 -2
- package/dist/core/extensions/builtin/mcp/service.d.ts +18 -8
- package/dist/core/extensions/builtin/mcp/service.js +231 -76
- package/dist/core/settings-manager.d.ts +2 -0
- package/dist/core/settings-manager.js +7 -0
- package/dist/core/skill-invocation.d.ts +10 -2
- package/dist/core/skill-invocation.js +13 -3
- package/dist/core/webview/native-webview.d.ts +1 -0
- package/dist/core/webview/webview-client.d.ts +5 -2
- package/dist/core/webview/webview-client.js +1 -1
- package/dist/core/webview/webview-readiness.d.ts +41 -0
- package/dist/core/webview/webview-readiness.js +48 -0
- package/dist/core/webview/webview-service.d.ts +8 -1
- package/dist/core/webview/webview-service.js +56 -16
- package/dist/modes/rpc/host-exec-argv.d.ts +7 -0
- package/dist/modes/rpc/host-exec-argv.js +45 -0
- package/dist/modes/rpc/host-launch.js +3 -2
- package/dist/modes/rpc/host-lifecycle.js +2 -1
- package/docs/rpc.md +2 -0
- package/docs/settings.md +1 -0
- package/docs/skills.md +4 -2
- package/package.json +6 -6
- package/dist/bundle/chunks/chunk-UB2RTUY7.js +0 -24
- package/dist/bundle/chunks/chunk-XOZFAFCS.js +0 -6
|
@@ -154,6 +154,24 @@ ${otherErrors.join(`
|
|
|
154
154
|
`)}}function getLanguageFromPath(filePath){let ext=filePath.split(".").pop()?.toLowerCase();return ext?{ts:"typescript",tsx:"typescript",js:"javascript",jsx:"javascript",mjs:"javascript",cjs:"javascript",py:"python",rb:"ruby",rs:"rust",go:"go",java:"java",kt:"kotlin",swift:"swift",c:"c",h:"c",cpp:"cpp",cc:"cpp",cxx:"cpp",hpp:"cpp",cs:"csharp",php:"php",sh:"bash",bash:"bash",zsh:"bash",fish:"fish",ps1:"powershell",sql:"sql",html:"html",htm:"html",css:"css",scss:"scss",sass:"sass",less:"less",json:"json",yaml:"yaml",yml:"yaml",toml:"toml",xml:"xml",md:"markdown",markdown:"markdown",dockerfile:"dockerfile",makefile:"makefile",cmake:"cmake",lua:"lua",perl:"perl",r:"r",scala:"scala",clj:"clojure",ex:"elixir",exs:"elixir",erl:"erlang",hs:"haskell",ml:"ocaml",vim:"vim",graphql:"graphql",proto:"protobuf",tf:"hcl",hcl:"hcl"}[ext]:void 0}function getMarkdownTheme(){return{heading:text=>theme.fg("mdHeading",text),link:text=>theme.fg("mdLink",text),linkUrl:text=>theme.fg("mdLinkUrl",text),code:text=>theme.fg("mdCode",text),codeBlock:text=>theme.fg("mdCodeBlock",text),codeBlockBorder:text=>theme.fg("mdCodeBlockBorder",text),quote:text=>theme.fg("mdQuote",text),quoteBorder:text=>theme.fg("mdQuoteBorder",text),hr:text=>theme.fg("mdHr",text),listBullet:text=>theme.fg("mdListBullet",text),bold:text=>theme.bold(text),italic:text=>theme.italic(text),underline:text=>theme.underline(text),strikethrough:text=>theme.strikethrough(text),highlightCode:(code,lang)=>{let validLang=lang&&supportsLanguage(lang)?lang:void 0;if(!validLang)return code.split(`
|
|
155
155
|
`).map(line=>theme.fg("mdCodeBlock",line));let opts={language:validLang,ignoreIllegals:!0,theme:getCliHighlightTheme(theme)};try{return highlight(code,opts).split(`
|
|
156
156
|
`)}catch{return code.split(`
|
|
157
|
-
`).map(line=>theme.fg("mdCodeBlock",line))}}}}function getSelectListTheme(){return{selectedPrefix:text=>theme.fg("accent",text),selectedText:text=>theme.fg("accent",text),description:text=>theme.fg("muted",text),scrollInfo:text=>theme.fg("muted",text),noMatch:text=>theme.fg("muted",text)}}function getEditorTheme(){return{borderColor:text=>theme.fg("borderMuted",text),mention:text=>theme.fg("skillMention",`\x1B[1m${text}\x1B[22m`),selectList:getSelectListTheme()}}function getSettingsListTheme(){return{label:(text,selected)=>selected?theme.fg("accent",text):text,value:(text,selected)=>selected?theme.fg("accent",text):theme.fg("muted",text),description:text=>theme.fg("dim",text),cursor:theme.fg("accent","\u2192 "),hint:text=>theme.fg("dim",text)}}var stdoutTakeoverState,stderrTakeoverState,visibleStderrObservation;var rawStdoutWriteTail=Promise.resolve();function getRawStdoutWrite(){return stdoutTakeoverState?stdoutTakeoverState.rawStdoutWrite:process.stdout.write.bind(process.stdout)}async function writeRawStdoutChunk(text){for(;;)try{await new Promise((resolve2,reject)=>{try{getRawStdoutWrite()(text,error=>{error?reject(error):resolve2()})}catch(error){reject(error instanceof Error?error:new Error(String(error)))}});return}catch(error){let writeError=error instanceof Error?error:new Error(String(error)),code=writeError.code;if(code!=="ENOBUFS"&&code!=="EAGAIN"&&code!=="EWOULDBLOCK")throw writeError;await new Promise(resolve2=>setTimeout(resolve2,10))}}function takeOverStdout(){if(stdoutTakeoverState)return;let rawStdoutWrite=process.stdout.write.bind(process.stdout),rawStderrWrite=process.stderr.write.bind(process.stderr),originalStdoutWrite=process.stdout.write;process.stdout.write=((chunk,encodingOrCallback,callback)=>typeof encodingOrCallback=="function"?rawStderrWrite(String(chunk),encodingOrCallback):rawStderrWrite(String(chunk),callback)),stdoutTakeoverState={rawStdoutWrite,rawStderrWrite,originalStdoutWrite}}function restoreStdout(){stdoutTakeoverState&&(process.stdout.write=stdoutTakeoverState.originalStdoutWrite,stdoutTakeoverState=void 0)}function stdioChunkToString(chunk,encoding){return typeof chunk=="string"?chunk:Buffer.from(chunk).toString(encoding)}function normalizeThrownError(error){return error instanceof Error?error:new Error(String(error))}function writeOriginalStderr(state,text){text.length!==0&&state.originalStderrWrite.call(process.stderr,text)}function observeVisibleStderrWrites(listener){if(!visibleStderrObservation){let original=stderrTakeoverState?.originalStderrWrite??process.stderr.write,listeners=new Set,writer=function(...args){for(let notify2 of listeners)notify2();return Reflect.apply(original,this,args)};visibleStderrObservation={original,writer,listeners},stderrTakeoverState?stderrTakeoverState.originalStderrWrite=writer:process.stderr.write=writer}let observation=visibleStderrObservation,notify=()=>listener();return observation.listeners.add(notify),()=>{!observation.listeners.delete(notify)||observation.listeners.size>0||(stderrTakeoverState?.originalStderrWrite===observation.writer&&(stderrTakeoverState.originalStderrWrite=observation.original),process.stderr.write===observation.writer&&(process.stderr.write=observation.original),visibleStderrObservation=void 0)}}function takeOverStderr(onHiddenDiagnostic,formatHiddenDiagnosticFallback){if(stderrTakeoverState)return;let originalStderrWrite=process.stderr.write;process.stderr.write=((chunk,encodingOrCallback,callback)=>{let text=stdioChunkToString(chunk,typeof encodingOrCallback=="string"?encodingOrCallback:void 0);try{stderrTakeoverState?.onHiddenDiagnostic?.(text)}catch(error){let state=stderrTakeoverState;if(state){let fallbackText=state.formatHiddenDiagnosticFallback?.(text)??text;writeOriginalStderr(state,fallbackText)}let writeError=normalizeThrownError(error);return typeof encodingOrCallback=="function"?encodingOrCallback(writeError):callback?.(writeError),!1}return typeof encodingOrCallback=="function"?encodingOrCallback(null):callback?.(null),!0}),stderrTakeoverState={formatHiddenDiagnosticFallback,originalStderrWrite,onHiddenDiagnostic}}function restoreStderr(){stderrTakeoverState&&(process.stderr.write=stderrTakeoverState.originalStderrWrite,stderrTakeoverState=void 0)}function isStdoutTakenOver(){return stdoutTakeoverState!==void 0}function writeRawStdout(text){text.length!==0&&(rawStdoutWriteTail=rawStdoutWriteTail.then(()=>writeRawStdoutChunk(text)),rawStdoutWriteTail.catch(()=>{process.exit(1)}))}async function waitForRawStdoutBackpressure(){for(;;){let tail=rawStdoutWriteTail;if(await tail,tail===rawStdoutWriteTail)return}}async function flushRawStdout(){await waitForRawStdoutBackpressure(),await writeRawStdoutChunk("")}var KIMI_RETRYABLE_STATUS_CODES=new Set([408,409,429,500,502,503,504,529]);function classifyKimiHttpStatus(statusCode){return statusCode===void 0||!KIMI_RETRYABLE_STATUS_CODES.has(statusCode)?{verdict:"terminal"}:statusCode===429?{verdict:"rate-limited"}:{verdict:"transient"}}function assertNever(kind){throw new Error(`Unhandled retry failure kind: ${kind}`)}var classifyKimiFailure=failure=>{switch(failure.kind){case"abort":case"refusal":case"sensitive":case"quota-exhausted":case"image-format":case"unknown":return{verdict:"terminal"};case"connection":case"timeout":case"provider":return{verdict:"transient"};case"empty-response":return failure.finishReason==="filtered"?{verdict:"terminal"}:{verdict:"transient"};case"http-status":return classifyKimiHttpStatus(failure.statusCode);default:return assertNever(failure.kind)}},SENPI_STRUCTURED_RETRYABLE_STATUS_CODES=new Set([408,409,429,500,502,503,504,522,524,529]),SENPI_STRUCTURED_TERMINAL_PROVIDER_CODES=new Set(["insufficient_quota","credits_required",...USAGE_LIMIT_EXHAUSTION.codes]),classifySenpiAssistantFailure=failure=>{switch(failure.kind){case"abort":case"refusal":case"sensitive":case"quota-exhausted":case"image-format":return{verdict:"terminal"}}let regexVerdict=classifyErrorMessage(failure.message);return regexVerdict==="non-retryable"?{verdict:"terminal"}:failure.shouldRetry===!1?{verdict:"terminal"}:failure.providerCodes?.some(code=>SENPI_STRUCTURED_TERMINAL_PROVIDER_CODES.has(code))?{verdict:"terminal"}:regexVerdict==="retryable"?{verdict:"transient"}:failure.statusCode!==void 0&&SENPI_STRUCTURED_RETRYABLE_STATUS_CODES.has(failure.statusCode)?failure.statusCode===429?{verdict:"rate-limited"}:{verdict:"transient"}:{verdict:"terminal"}};var extractNormalizedHint=failure=>failure.retryAfterMs,senpiDefaultTurnStrategy=()=>{throw new Error("senpi-default turn tier strategy must be injected by coding-agent")},SENPI_DEFAULT_RETRY_PROFILE={id:"senpi-default",providerRequest:{enabled:!0,maxRetries:0,backoff:{baseDelayMs:500,growthFactor:2,perAttemptCapMs:8e3,jitter:{mode:"subtractive",ratio:.25}},extractServerHint:extractNormalizedHint,serverHint:{mode:"override",acceptZero:!0,ceiling:{maxDelayMs:6e4,onExceeded:"error-with-marker"}},classify:classifySenpiAssistantFailure},turn:{enabled:!0,maxRetries:5,backoff:{baseDelayMs:2e3,growthFactor:2,perAttemptCapMs:8e3,jitter:{mode:"additive",ratio:.25}},extractServerHint:extractNormalizedHint,serverHint:{mode:"tiered",strategy:senpiDefaultTurnStrategy},classify:classifySenpiAssistantFailure},fallback:{terminal:"immediate-if-eligible",transient:"after-turn-budget",rateLimited:"tiered",resetBudgetOnModelChange:!0}},KIMI_CODE_RETRY_PROFILE={id:"kimi-code",providerRequest:{enabled:!1,maxRetries:0,backoff:{baseDelayMs:500,growthFactor:2,perAttemptCapMs:32e3,jitter:{mode:"additive",ratio:.25}},extractServerHint:extractNormalizedHint,serverHint:{mode:"override",acceptZero:!1,ceiling:{maxDelayMs:null,onExceeded:"error-with-marker"}},classify:classifyKimiFailure},turn:{enabled:!0,maxRetries:9,backoff:{baseDelayMs:500,growthFactor:2,perAttemptCapMs:32e3,jitter:{mode:"additive",ratio:.25}},extractServerHint:extractNormalizedHint,serverHint:{mode:"override",acceptZero:!1,ceiling:{maxDelayMs:null,onExceeded:"error-with-marker"}},classify:classifyKimiFailure},fallback:{terminal:"immediate-if-eligible",transient:"after-turn-budget",rateLimited:"after-turn-budget",resetBudgetOnModelChange:!0}};var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{createHash,randomUUID}from"crypto";import{existsSync as existsSync2,mkdirSync as mkdirSync2,readFileSync as readFileSync2,renameSync,rmSync,writeFileSync}from"fs";import{mkdir,readFile,rename,rm,writeFile}from"fs/promises";import{homedir}from"os";import{dirname as dirname2,join as join2}from"path";var DEFAULT_COMPACTION_TOKEN_SETTINGS={reserveTokens:16384,keepRecentTokens:2e4};function isPlainObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isNonNegativeSafeInteger(value){return typeof value=="number"&&Number.isSafeInteger(value)&&value>=0}function compactionEnabled(settings){return settings?.enabled??!0}function compactionTokenSetting(settings,field,forModel){let ordinary=settings?.[field];if(ordinary!==void 0&&!isNonNegativeSafeInteger(ordinary))throw new Error(`Invalid compaction.${field} setting: ${String(ordinary)}. Expected a non-negative safe integer.`);let modelKey=forModel?`${forModel.provider}/${forModel.id}`:void 0,entry=modelKey!==void 0?settings?.modelOverrides?.[modelKey]:void 0;if(entry!==void 0&&!isPlainObject(entry))throw new Error(`Invalid compaction.modelOverrides["${modelKey}"] setting: ${String(entry)}. Expected an object.`);let override=entry?.[field];if(override!==void 0&&!isNonNegativeSafeInteger(override))throw new Error(`Invalid compaction.modelOverrides["${modelKey}"].${field} setting: ${String(override)}. Expected a non-negative safe integer.`);return override??ordinary??DEFAULT_COMPACTION_TOKEN_SETTINGS[field]}function compactionReserveTokens(settings,forModel){return compactionTokenSetting(settings,"reserveTokens",forModel)}function compactionKeepRecentTokens(settings,forModel){return compactionTokenSetting(settings,"keepRecentTokens",forModel)}var DEFAULTS={enabled:!0,reserveTokens:16384,keepRecentTokens:2e4,speculativeEnabled:!0,speculativeFraction:.75,speculativeCooldownMs:3e4,restorationEnabled:!0,restorationMaxItems:10,restorationMaxTokensPerItem:5e3,restorationMaxTotalTokens:5e4,restorationContextRatio:.15,idleCompactionEnabled:!0,graceBandEnabled:!0,toolAdmissionEnabled:!0,reminderEnabled:!0,reserveScalingEnabled:!0};function finiteNumber(value,fallback,minimum=0){return typeof value=="number"&&Number.isFinite(value)?Math.max(minimum,value):fallback}function resolveCompactionSettings(settings,forModel){let raw=settings;return{enabled:typeof raw?.enabled=="boolean"?raw.enabled:DEFAULTS.enabled,reserveTokens:compactionReserveTokens(settings,forModel),keepRecentTokens:compactionKeepRecentTokens(settings,forModel),speculativeEnabled:typeof raw?.speculativeEnabled=="boolean"?raw.speculativeEnabled:DEFAULTS.speculativeEnabled,speculativeFraction:finiteNumber(raw?.speculativeFraction,DEFAULTS.speculativeFraction),speculativeCooldownMs:finiteNumber(raw?.speculativeCooldownMs,DEFAULTS.speculativeCooldownMs),restorationEnabled:typeof raw?.restorationEnabled=="boolean"?raw.restorationEnabled:DEFAULTS.restorationEnabled,restorationMaxItems:finiteNumber(raw?.restorationMaxItems,DEFAULTS.restorationMaxItems),restorationMaxTokensPerItem:finiteNumber(raw?.restorationMaxTokensPerItem,DEFAULTS.restorationMaxTokensPerItem),restorationMaxTotalTokens:finiteNumber(raw?.restorationMaxTotalTokens,DEFAULTS.restorationMaxTotalTokens),restorationContextRatio:finiteNumber(raw?.restorationContextRatio,DEFAULTS.restorationContextRatio),idleCompactionEnabled:typeof raw?.idleCompactionEnabled=="boolean"?raw.idleCompactionEnabled:DEFAULTS.idleCompactionEnabled,graceBandEnabled:typeof raw?.graceBandEnabled=="boolean"?raw.graceBandEnabled:DEFAULTS.graceBandEnabled,toolAdmissionEnabled:typeof raw?.toolAdmissionEnabled=="boolean"?raw.toolAdmissionEnabled:DEFAULTS.toolAdmissionEnabled,reminderEnabled:typeof raw?.reminderEnabled=="boolean"?raw.reminderEnabled:DEFAULTS.reminderEnabled,reserveScalingEnabled:typeof raw?.reserveScalingEnabled=="boolean"?raw.reserveScalingEnabled:DEFAULTS.reserveScalingEnabled,speculativeLeadTokens:typeof raw?.speculativeLeadTokens=="number"&&Number.isFinite(raw.speculativeLeadTokens)?Math.max(0,raw.speculativeLeadTokens):void 0,summarizationMaxDurationMs:typeof raw?.summarizationMaxDurationMs=="number"&&Number.isFinite(raw.summarizationMaxDurationMs)&&raw.summarizationMaxDurationMs>0?raw.summarizationMaxDurationMs:void 0}}import{resolve}from"node:path";var DEFAULT_CIRCUIT_COOLDOWN_MS=6e4,DEFAULT_CIRCUIT_MAX_COOLDOWN_MS=30*6e4;function nonNegativeMs(value,fallback){return typeof value=="number"&&Number.isFinite(value)&&value>=0?value:fallback}function resolveFallbackCircuitSettings(settings){let cooldownMs=nonNegativeMs(settings?.circuitCooldownMs,DEFAULT_CIRCUIT_COOLDOWN_MS),maxCooldownMs=nonNegativeMs(settings?.circuitMaxCooldownMs,DEFAULT_CIRCUIT_MAX_COOLDOWN_MS);return{cooldownMs,maxCooldownMs:Math.max(cooldownMs,maxCooldownMs)}}var FallbackCircuitBreaker=class{constructor(){this.circuits=new Map,this.generations=0}get size(){return this.circuits.size}open(selector,request){let previous=this.circuits.get(selector),consecutiveOpens=(previous?.consecutiveOpens??0)+1,cooldownMs=Math.min(request.cooldownMs*2**(consecutiveOpens-1),request.maxCooldownMs),retryAfterMs=request.retryAfterMs,hinted=retryAfterMs!==void 0&&Number.isFinite(retryAfterMs)&&retryAfterMs>0?request.now+retryAfterMs:0,retryFloorUntil=Math.max(hinted,previous&&previous.retryFloorUntil>request.now?previous.retryFloorUntil:0),openUntil=Math.max(request.now+cooldownMs,Math.min(retryFloorUntil,request.now+request.maxCooldownMs));return this.circuits.set(selector,{openUntil,retryFloorUntil,consecutiveOpens,cooldownMs,maxCooldownMs:request.maxCooldownMs,probe:void 0}),openUntil}isOpen(selector,now,owner){let circuit=this.circuits.get(selector);return circuit?now<circuit.openUntil?!0:circuit.probe!==void 0&&circuit.probe.owner!==owner:!1}admit(selector,now,owner){let circuit=this.circuits.get(selector);return circuit?now<circuit.openUntil?{kind:"open"}:circuit.probe&&circuit.probe.owner!==owner?{kind:"open"}:(circuit.probe??={owner,generation:++this.generations},{kind:"probe",token:{selector,owner,generation:circuit.probe.generation}}):{kind:"closed"}}release(token){let probe=this.circuits.get(token.selector)?.probe;if(probe&&probe.owner===token.owner&&probe.generation===token.generation){let circuit=this.circuits.get(token.selector);circuit&&(circuit.probe=void 0)}}releaseOwnersWithPrefix(prefix){for(let circuit of this.circuits.values())circuit.probe?.owner.startsWith(prefix)&&(circuit.probe=void 0)}close(selector){this.circuits.delete(selector)}has(selector){return this.circuits.has(selector)}sweep(now){for(let[selector,circuit]of this.circuits)!circuit.probe&&now>=circuit.openUntil+circuit.maxCooldownMs&&this.circuits.delete(selector)}};function createFallbackCircuitAccess(deps){let enabled=()=>deps.settings().cooldownMs>0;return{noteFailure(selector,failure){if(!enabled())return;let{cooldownMs,maxCooldownMs}=deps.settings(),now=deps.now(),retryAfterMs=failure.retryAfterMs??(failure.errorMessage===void 0?void 0:parseRetryAfterMsMarker(failure.errorMessage));deps.breaker.sweep(now);let openUntil=deps.breaker.open(selector,{now,cooldownMs,maxCooldownMs,retryAfterMs});deps.logger.info("circuit_opened",{selector,durationMs:openUntil-now,retryAfterMs})},governs:selector=>enabled()&&deps.breaker.has(selector),isOpen:(selector,lane="turn")=>enabled()&&deps.breaker.isOpen(selector,deps.now(),laneOwner(deps.owner(),lane)),admit:(selector,lane="turn")=>enabled()?deps.breaker.admit(selector,deps.now(),laneOwner(deps.owner(),lane)):{kind:"closed"},release:token=>deps.breaker.release(token),releaseAll:()=>deps.breaker.releaseOwnersWithPrefix(`${deps.owner()}:`),close:selector=>deps.breaker.close(selector)}}function laneOwner(session,lane){return`${session}:${lane}`}var breakersByAgentDir=new Map;function evictUnheldEmptyBreakers(){for(let[key,entry]of breakersByAgentDir)entry.owners===0&&entry.breaker.size===0&&breakersByAgentDir.delete(key)}function entryFor(agentDir){let key=resolve(agentDir),entry=breakersByAgentDir.get(key);return entry||(evictUnheldEmptyBreakers(),entry={breaker:new FallbackCircuitBreaker,owners:0},breakersByAgentDir.set(key,entry)),entry}function acquireFallbackCircuits(agentDir){let entry=entryFor(agentDir);entry.owners++;let released=!1;return{breaker:entry.breaker,release(){released||(released=!0,entry.owners--,evictUnheldEmptyBreakers())}}}function monotonicNow(){return performance.timeOrigin+performance.now()}function isPlainObject2(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function describeValue(value){return value===null?"null":Array.isArray(value)?"an array":`a ${typeof value}`}function isNonNegativeSafeInteger2(value){return typeof value=="number"&&Number.isSafeInteger(value)&&value>=0}function isFiniteAtLeast(value,min){return typeof value=="number"&&Number.isFinite(value)&&value>=min}function isFiniteRatio(value){return typeof value=="number"&&Number.isFinite(value)&&value>=0&&value<=1}function validateStageKnobs(stage,providerId,stageName,warnings){if(stage===void 0)return;if(!isPlainObject2(stage)){warnings.push(`retry.providers.${providerId}.${stageName} must be a plain object, but got ${describeValue(stage)}.`);return}let out={},invalid=[];if(stage.enabled!==void 0&&(typeof stage.enabled=="boolean"?out.enabled=stage.enabled:invalid.push("enabled")),stage.maxRetries!==void 0&&(isNonNegativeSafeInteger2(stage.maxRetries)?out.maxRetries=stage.maxRetries:invalid.push("maxRetries")),stage.baseDelayMs!==void 0&&(isNonNegativeSafeInteger2(stage.baseDelayMs)?out.baseDelayMs=stage.baseDelayMs:invalid.push("baseDelayMs")),stage.growthFactor!==void 0&&(isFiniteAtLeast(stage.growthFactor,1)?out.growthFactor=stage.growthFactor:invalid.push("growthFactor")),stage.perAttemptCapMs!==void 0&&(stage.perAttemptCapMs===null?out.perAttemptCapMs=null:isNonNegativeSafeInteger2(stage.perAttemptCapMs)?out.perAttemptCapMs=stage.perAttemptCapMs:invalid.push("perAttemptCapMs")),stage.jitter!==void 0)if(isPlainObject2(stage.jitter)){let mode=stage.jitter.mode;mode==="none"?out.jitter={mode:"none"}:(mode==="additive"||mode==="subtractive")&&isFiniteRatio(stage.jitter.ratio)?out.jitter={mode,ratio:stage.jitter.ratio}:invalid.push("jitter")}else invalid.push("jitter");if(stage.serverHintMaxDelayMs!==void 0&&(stage.serverHintMaxDelayMs===null?out.serverHintMaxDelayMs=null:isNonNegativeSafeInteger2(stage.serverHintMaxDelayMs)?out.serverHintMaxDelayMs=stage.serverHintMaxDelayMs:invalid.push("serverHintMaxDelayMs")),invalid.length>0){warnings.push(`retry.providers.${providerId}.${stageName} has invalid knob(s): ${invalid.join(", ")}.`);return}return out}function validateRetryProviderOverrides(value,knownProviderIds,tieredProviderIds){if(value===void 0)return{overrides:{},warnings:[]};if(!isPlainObject2(value))return{overrides:{},warnings:[`retry.providers must be a plain object keyed by provider id, but got ${describeValue(value)}.`]};let overrides={},warnings=[];for(let[providerId,entry]of Object.entries(value)){if(!knownProviderIds.has(providerId)){warnings.push(`retry.providers.${providerId}: unknown provider id "${providerId}".`);continue}if(!isPlainObject2(entry)){warnings.push(`retry.providers.${providerId} must be a plain object, but got ${describeValue(entry)}.`);continue}let stageWarnings=[],providerRequest=validateStageKnobs(entry.providerRequest,providerId,"providerRequest",stageWarnings),turn=validateStageKnobs(entry.turn,providerId,"turn",stageWarnings);if(stageWarnings.length>0){warnings.push(...stageWarnings);continue}if(tieredProviderIds?.has(providerId)&&(providerRequest?.serverHintMaxDelayMs!==void 0||turn?.serverHintMaxDelayMs!==void 0)){warnings.push(`retry.providers.${providerId}: serverHintMaxDelayMs is invalid for a tiered stage (tier thresholds own that strategy).`);continue}let result={};if(providerRequest!==void 0&&(result.providerRequest=providerRequest),turn!==void 0&&(result.turn=turn),providerRequest===void 0&&turn===void 0){warnings.push(`retry.providers.${providerId} has no recognized knobs.`);continue}overrides[providerId]=result}return{overrides,warnings}}var DEFAULT_FALLBACK_CHAINS={"claude-fable-5-1":["claude-opus-5-5:max","claude-opus-5:max","claude-opus-4-8:max","claude-opus-4-6:max"],"claude-fable-5":["claude-opus-5-5:max","claude-opus-5:max","claude-opus-4-8:max","claude-opus-4-6:max"],"claude-opus-5-5":["claude-opus-5:max","claude-opus-4-8:max","claude-opus-4-6:max"]};function cloneDefaultFallbackChains(){let chains={};for(let[key,entries]of Object.entries(DEFAULT_FALLBACK_CHAINS))chains[key]=[...entries];return chains}function isPlainObject3(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function isStringArray(value){return Array.isArray(value)&&value.every(entry=>typeof entry=="string")}function resolveFallbackChains(value){if(value===void 0||!isPlainObject3(value))return cloneDefaultFallbackChains();let chains=cloneDefaultFallbackChains();for(let[key,entries]of Object.entries(value)){if(!isStringArray(entries))return cloneDefaultFallbackChains();chains[key]=[...entries]}return chains}function resolveRetryFallbackSettings(settings){return{modelFallback:typeof settings?.modelFallback=="boolean"?settings.modelFallback:!0,chains:resolveFallbackChains(settings?.fallbackChains),revertPolicy:settings?.fallbackRevertPolicy==="never"?"never":"cooldown-expiry"}}function resolveAbortServerSideFallback(settings){return typeof settings?.abortServerSideFallback=="boolean"?settings.abortServerSideFallback:!0}var DEFAULT_HINTED_WAIT_CAP_MS=3e5,DEFAULT_PROBE_BACK_MAX_MS=36e5;function resolveHintPolicySettings(settings){let hintedWaitCapMs=typeof settings?.hintedWaitCapMs=="number"&&settings.hintedWaitCapMs>=0?settings.hintedWaitCapMs:DEFAULT_HINTED_WAIT_CAP_MS,probeBackMaxMs=typeof settings?.probeBackMaxMs=="number"&&settings.probeBackMaxMs>=0?settings.probeBackMaxMs:DEFAULT_PROBE_BACK_MAX_MS;return probeBackMaxMs<=hintedWaitCapMs?{hintedWaitCapMs:DEFAULT_HINTED_WAIT_CAP_MS,probeBackMaxMs:DEFAULT_PROBE_BACK_MAX_MS}:{hintedWaitCapMs,probeBackMaxMs}}function parseSettingsJson(content){content=stripBom(content);let withoutComments=[],inString=!1,escaped=!1;for(let index=0;index<content.length;index+=1){let char=content[index],next=content[index+1];if(inString){withoutComments.push(char),escaped?escaped=!1:char==="\\"?escaped=!0:char==='"'&&(inString=!1);continue}if(char==='"'){inString=!0,withoutComments.push(char);continue}if(char==="/"&&next==="/"){for(withoutComments.push(" "," "),index+=2;index<content.length&&content[index]!==`
|
|
157
|
+
`).map(line=>theme.fg("mdCodeBlock",line))}}}}function getSelectListTheme(){return{selectedPrefix:text=>theme.fg("accent",text),selectedText:text=>theme.fg("accent",text),description:text=>theme.fg("muted",text),scrollInfo:text=>theme.fg("muted",text),noMatch:text=>theme.fg("muted",text)}}function getEditorTheme(){return{borderColor:text=>theme.fg("borderMuted",text),mention:text=>theme.fg("skillMention",`\x1B[1m${text}\x1B[22m`),selectList:getSelectListTheme()}}function getSettingsListTheme(){return{label:(text,selected)=>selected?theme.fg("accent",text):text,value:(text,selected)=>selected?theme.fg("accent",text):theme.fg("muted",text),description:text=>theme.fg("dim",text),cursor:theme.fg("accent","\u2192 "),hint:text=>theme.fg("dim",text)}}var stdoutTakeoverState,stderrTakeoverState,visibleStderrObservation;var rawStdoutWriteTail=Promise.resolve();function getRawStdoutWrite(){return stdoutTakeoverState?stdoutTakeoverState.rawStdoutWrite:process.stdout.write.bind(process.stdout)}async function writeRawStdoutChunk(text){for(;;)try{await new Promise((resolve2,reject)=>{try{getRawStdoutWrite()(text,error=>{error?reject(error):resolve2()})}catch(error){reject(error instanceof Error?error:new Error(String(error)))}});return}catch(error){let writeError=error instanceof Error?error:new Error(String(error)),code=writeError.code;if(code!=="ENOBUFS"&&code!=="EAGAIN"&&code!=="EWOULDBLOCK")throw writeError;await new Promise(resolve2=>setTimeout(resolve2,10))}}function takeOverStdout(){if(stdoutTakeoverState)return;let rawStdoutWrite=process.stdout.write.bind(process.stdout),rawStderrWrite=process.stderr.write.bind(process.stderr),originalStdoutWrite=process.stdout.write;process.stdout.write=((chunk,encodingOrCallback,callback)=>typeof encodingOrCallback=="function"?rawStderrWrite(String(chunk),encodingOrCallback):rawStderrWrite(String(chunk),callback)),stdoutTakeoverState={rawStdoutWrite,rawStderrWrite,originalStdoutWrite}}function restoreStdout(){stdoutTakeoverState&&(process.stdout.write=stdoutTakeoverState.originalStdoutWrite,stdoutTakeoverState=void 0)}function stdioChunkToString(chunk,encoding){return typeof chunk=="string"?chunk:Buffer.from(chunk).toString(encoding)}function normalizeThrownError(error){return error instanceof Error?error:new Error(String(error))}function writeOriginalStderr(state,text){text.length!==0&&state.originalStderrWrite.call(process.stderr,text)}function observeVisibleStderrWrites(listener){if(!visibleStderrObservation){let original=stderrTakeoverState?.originalStderrWrite??process.stderr.write,listeners=new Set,writer=function(...args){for(let notify2 of listeners)notify2();return Reflect.apply(original,this,args)};visibleStderrObservation={original,writer,listeners},stderrTakeoverState?stderrTakeoverState.originalStderrWrite=writer:process.stderr.write=writer}let observation=visibleStderrObservation,notify=()=>listener();return observation.listeners.add(notify),()=>{!observation.listeners.delete(notify)||observation.listeners.size>0||(stderrTakeoverState?.originalStderrWrite===observation.writer&&(stderrTakeoverState.originalStderrWrite=observation.original),process.stderr.write===observation.writer&&(process.stderr.write=observation.original),visibleStderrObservation=void 0)}}function takeOverStderr(onHiddenDiagnostic,formatHiddenDiagnosticFallback){if(stderrTakeoverState)return;let originalStderrWrite=process.stderr.write;process.stderr.write=((chunk,encodingOrCallback,callback)=>{let text=stdioChunkToString(chunk,typeof encodingOrCallback=="string"?encodingOrCallback:void 0);try{stderrTakeoverState?.onHiddenDiagnostic?.(text)}catch(error){let state=stderrTakeoverState;if(state){let fallbackText=state.formatHiddenDiagnosticFallback?.(text)??text;writeOriginalStderr(state,fallbackText)}let writeError=normalizeThrownError(error);return typeof encodingOrCallback=="function"?encodingOrCallback(writeError):callback?.(writeError),!1}return typeof encodingOrCallback=="function"?encodingOrCallback(null):callback?.(null),!0}),stderrTakeoverState={formatHiddenDiagnosticFallback,originalStderrWrite,onHiddenDiagnostic}}function restoreStderr(){stderrTakeoverState&&(process.stderr.write=stderrTakeoverState.originalStderrWrite,stderrTakeoverState=void 0)}function isStdoutTakenOver(){return stdoutTakeoverState!==void 0}function writeRawStdout(text){text.length!==0&&(rawStdoutWriteTail=rawStdoutWriteTail.then(()=>writeRawStdoutChunk(text)),rawStdoutWriteTail.catch(()=>{process.exit(1)}))}async function waitForRawStdoutBackpressure(){for(;;){let tail=rawStdoutWriteTail;if(await tail,tail===rawStdoutWriteTail)return}}async function flushRawStdout(){await waitForRawStdoutBackpressure(),await writeRawStdoutChunk("")}function formatSkillInvocationPrompt(skills,userRequest){let expandedSkills=skills.map(skill=>`The user explicitly invoked the "${skill.name}" skill. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions.
|
|
158
|
+
|
|
159
|
+
<skill-instruction name="${skill.name}" location="${skill.filePath}">
|
|
160
|
+
References are relative to ${skill.baseDir}.
|
|
161
|
+
|
|
162
|
+
${skill.body}
|
|
163
|
+
</skill-instruction>`).join(`
|
|
164
|
+
|
|
165
|
+
`);return userRequest&&/\S/.test(userRequest)?`${expandedSkills}
|
|
166
|
+
|
|
167
|
+
<user-request>
|
|
168
|
+
${userRequest}
|
|
169
|
+
</user-request>`:expandedSkills}var SKILL_INSTRUCTION_PATTERN=/^The user explicitly invoked the "([^"]+)" skill\. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions\.\n\n<skill-instruction name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill-instruction>/;function matchSkillInstruction(text){let match=text.match(SKILL_INSTRUCTION_PATTERN);return!match||match[1]!==match[2]?null:{skill:{name:match[1],location:match[3],content:match[4]},length:match[0].length}}function toParsedSkillBlock(skills,userMessage){let first=skills[0];return first?{...first,skills,userMessage}:null}function parseSkillBlock(text){let first=matchSkillInstruction(text);if(first){let skills=[first.skill],remainder=text.slice(first.length);for(;remainder.startsWith(`
|
|
170
|
+
|
|
171
|
+
The user explicitly invoked the `);){let chained=matchSkillInstruction(remainder.slice(2));if(!chained)return null;skills.push(chained.skill),remainder=remainder.slice(chained.length+2)}let requestMatch=remainder.match(/^\n\n<user-request>\n([\s\S]*?)\n<\/user-request>$/);return remainder&&!requestMatch?null:toParsedSkillBlock(skills,requestMatch?.[1].trim()||void 0)}let legacyMatch=text.match(/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/);return legacyMatch?toParsedSkillBlock([{name:legacyMatch[1],location:legacyMatch[2],content:legacyMatch[3]}],legacyMatch[4]?.trim()||void 0):null}var MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT=64,SKILL_NAMESPACE="skill:",LEADING_SKILL_INVOCATION_PATTERN=/^(?:\/skill:([a-zA-Z][a-zA-Z0-9:_-]*)|\$([a-zA-Z][a-zA-Z0-9:_-]*))(?=\s|$)/,INLINE_DOLLAR_SKILL_INVOCATION_PATTERN=/(^|\s)\$([a-zA-Z][a-zA-Z0-9:_-]*)(?=\s|$)/g;function inlineSkillName(token,knownSkillNames){return token.startsWith(SKILL_NAMESPACE)?token.slice(SKILL_NAMESPACE.length)||null:knownSkillNames?.has(token)?token:null}function parseSkillInvocationTokens(text,options={}){let tokens=[],cursor=0;for(;cursor<text.length;){for(;cursor<text.length&&/\s/.test(text[cursor]);)cursor++;let match=text.slice(cursor).match(LEADING_SKILL_INVOCATION_PATTERN);if(!match)break;let syntax=match[1]?"slash":"dollar",dollarName=match[2],name=match[1]??(dollarName?.startsWith("skill:")?dollarName.slice(6):dollarName);if(!name)break;if(tokens.push({name,syntax,start:cursor,end:cursor+match[0].length,position:"leading"}),tokens.length>=MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT)return tokens;cursor+=match[0].length}INLINE_DOLLAR_SKILL_INVOCATION_PATTERN.lastIndex=cursor;for(let match of text.matchAll(INLINE_DOLLAR_SKILL_INVOCATION_PATTERN)){let token=match[2]??"",name=inlineSkillName(token,options.knownSkillNames);if(name===null)continue;let start=(match.index??0)+(match[1]??"").length;if(tokens.push({name,syntax:"dollar",start,end:start+token.length+1,position:"inline"}),tokens.length>=MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT)break}return tokens}function stripLeadingInvocationSeparators(text){let cursor=0;for(;text[cursor]===" "||text[cursor]===" ";)cursor++;for(;text[cursor]===`
|
|
172
|
+
`||text[cursor]==="\r"&&text[cursor+1]===`
|
|
173
|
+
`;){cursor+=text[cursor]==="\r"?2:1;let lineStart=cursor;for(;text[cursor]===" "||text[cursor]===" ";)cursor++;if(text[cursor]!==`
|
|
174
|
+
`&&!(text[cursor]==="\r"&&text[cursor+1]===`
|
|
175
|
+
`))return text.slice(lineStart)}return text.slice(cursor)}function removeSkillInvocationTokens(text,tokens,unloaded=new Set){let cursor=0,result="";for(let token of tokens)result+=text.slice(cursor,token.start),unloaded.has(token)?result+=`[skill not loaded: ${token.name}]`:token.position==="inline"&&(result+=`[skill: ${token.name}]`),cursor=token.end,token.position==="inline"&&(result.endsWith(" ")||result.endsWith(" "))&&(text[cursor]===" "||text[cursor]===" ")&&cursor++;return result+=text.slice(cursor),tokens.some(token=>token.position==="leading")?stripLeadingInvocationSeparators(result):result}var MAX_SKILL_EXPANSIONS_PER_PROMPT=5;var KIMI_RETRYABLE_STATUS_CODES=new Set([408,409,429,500,502,503,504,529]);function classifyKimiHttpStatus(statusCode){return statusCode===void 0||!KIMI_RETRYABLE_STATUS_CODES.has(statusCode)?{verdict:"terminal"}:statusCode===429?{verdict:"rate-limited"}:{verdict:"transient"}}function assertNever(kind){throw new Error(`Unhandled retry failure kind: ${kind}`)}var classifyKimiFailure=failure=>{switch(failure.kind){case"abort":case"refusal":case"sensitive":case"quota-exhausted":case"image-format":case"unknown":return{verdict:"terminal"};case"connection":case"timeout":case"provider":return{verdict:"transient"};case"empty-response":return failure.finishReason==="filtered"?{verdict:"terminal"}:{verdict:"transient"};case"http-status":return classifyKimiHttpStatus(failure.statusCode);default:return assertNever(failure.kind)}},SENPI_STRUCTURED_RETRYABLE_STATUS_CODES=new Set([408,409,429,500,502,503,504,522,524,529]),SENPI_STRUCTURED_TERMINAL_PROVIDER_CODES=new Set(["insufficient_quota","credits_required",...USAGE_LIMIT_EXHAUSTION.codes]),classifySenpiAssistantFailure=failure=>{switch(failure.kind){case"abort":case"refusal":case"sensitive":case"quota-exhausted":case"image-format":return{verdict:"terminal"}}let regexVerdict=classifyErrorMessage(failure.message);return regexVerdict==="non-retryable"?{verdict:"terminal"}:failure.shouldRetry===!1?{verdict:"terminal"}:failure.providerCodes?.some(code=>SENPI_STRUCTURED_TERMINAL_PROVIDER_CODES.has(code))?{verdict:"terminal"}:regexVerdict==="retryable"?{verdict:"transient"}:failure.statusCode!==void 0&&SENPI_STRUCTURED_RETRYABLE_STATUS_CODES.has(failure.statusCode)?failure.statusCode===429?{verdict:"rate-limited"}:{verdict:"transient"}:{verdict:"terminal"}};var extractNormalizedHint=failure=>failure.retryAfterMs,senpiDefaultTurnStrategy=()=>{throw new Error("senpi-default turn tier strategy must be injected by coding-agent")},SENPI_DEFAULT_RETRY_PROFILE={id:"senpi-default",providerRequest:{enabled:!0,maxRetries:0,backoff:{baseDelayMs:500,growthFactor:2,perAttemptCapMs:8e3,jitter:{mode:"subtractive",ratio:.25}},extractServerHint:extractNormalizedHint,serverHint:{mode:"override",acceptZero:!0,ceiling:{maxDelayMs:6e4,onExceeded:"error-with-marker"}},classify:classifySenpiAssistantFailure},turn:{enabled:!0,maxRetries:5,backoff:{baseDelayMs:2e3,growthFactor:2,perAttemptCapMs:8e3,jitter:{mode:"additive",ratio:.25}},extractServerHint:extractNormalizedHint,serverHint:{mode:"tiered",strategy:senpiDefaultTurnStrategy},classify:classifySenpiAssistantFailure},fallback:{terminal:"immediate-if-eligible",transient:"after-turn-budget",rateLimited:"tiered",resetBudgetOnModelChange:!0}},KIMI_CODE_RETRY_PROFILE={id:"kimi-code",providerRequest:{enabled:!1,maxRetries:0,backoff:{baseDelayMs:500,growthFactor:2,perAttemptCapMs:32e3,jitter:{mode:"additive",ratio:.25}},extractServerHint:extractNormalizedHint,serverHint:{mode:"override",acceptZero:!1,ceiling:{maxDelayMs:null,onExceeded:"error-with-marker"}},classify:classifyKimiFailure},turn:{enabled:!0,maxRetries:9,backoff:{baseDelayMs:500,growthFactor:2,perAttemptCapMs:32e3,jitter:{mode:"additive",ratio:.25}},extractServerHint:extractNormalizedHint,serverHint:{mode:"override",acceptZero:!1,ceiling:{maxDelayMs:null,onExceeded:"error-with-marker"}},classify:classifyKimiFailure},fallback:{terminal:"immediate-if-eligible",transient:"after-turn-budget",rateLimited:"after-turn-budget",resetBudgetOnModelChange:!0}};var import_proper_lockfile=__toESM(require_proper_lockfile(),1);import{createHash,randomUUID}from"crypto";import{existsSync as existsSync2,mkdirSync as mkdirSync2,readFileSync as readFileSync2,renameSync,rmSync,writeFileSync}from"fs";import{mkdir,readFile,rename,rm,writeFile}from"fs/promises";import{homedir}from"os";import{dirname as dirname2,join as join2}from"path";var DEFAULT_COMPACTION_TOKEN_SETTINGS={reserveTokens:16384,keepRecentTokens:2e4};function isPlainObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function isNonNegativeSafeInteger(value){return typeof value=="number"&&Number.isSafeInteger(value)&&value>=0}function compactionEnabled(settings){return settings?.enabled??!0}function compactionTokenSetting(settings,field,forModel){let ordinary=settings?.[field];if(ordinary!==void 0&&!isNonNegativeSafeInteger(ordinary))throw new Error(`Invalid compaction.${field} setting: ${String(ordinary)}. Expected a non-negative safe integer.`);let modelKey=forModel?`${forModel.provider}/${forModel.id}`:void 0,entry=modelKey!==void 0?settings?.modelOverrides?.[modelKey]:void 0;if(entry!==void 0&&!isPlainObject(entry))throw new Error(`Invalid compaction.modelOverrides["${modelKey}"] setting: ${String(entry)}. Expected an object.`);let override=entry?.[field];if(override!==void 0&&!isNonNegativeSafeInteger(override))throw new Error(`Invalid compaction.modelOverrides["${modelKey}"].${field} setting: ${String(override)}. Expected a non-negative safe integer.`);return override??ordinary??DEFAULT_COMPACTION_TOKEN_SETTINGS[field]}function compactionReserveTokens(settings,forModel){return compactionTokenSetting(settings,"reserveTokens",forModel)}function compactionKeepRecentTokens(settings,forModel){return compactionTokenSetting(settings,"keepRecentTokens",forModel)}var DEFAULTS={enabled:!0,reserveTokens:16384,keepRecentTokens:2e4,speculativeEnabled:!0,speculativeFraction:.75,speculativeCooldownMs:3e4,restorationEnabled:!0,restorationMaxItems:10,restorationMaxTokensPerItem:5e3,restorationMaxTotalTokens:5e4,restorationContextRatio:.15,idleCompactionEnabled:!0,graceBandEnabled:!0,toolAdmissionEnabled:!0,reminderEnabled:!0,reserveScalingEnabled:!0};function finiteNumber(value,fallback,minimum=0){return typeof value=="number"&&Number.isFinite(value)?Math.max(minimum,value):fallback}function resolveCompactionSettings(settings,forModel){let raw=settings;return{enabled:typeof raw?.enabled=="boolean"?raw.enabled:DEFAULTS.enabled,reserveTokens:compactionReserveTokens(settings,forModel),keepRecentTokens:compactionKeepRecentTokens(settings,forModel),speculativeEnabled:typeof raw?.speculativeEnabled=="boolean"?raw.speculativeEnabled:DEFAULTS.speculativeEnabled,speculativeFraction:finiteNumber(raw?.speculativeFraction,DEFAULTS.speculativeFraction),speculativeCooldownMs:finiteNumber(raw?.speculativeCooldownMs,DEFAULTS.speculativeCooldownMs),restorationEnabled:typeof raw?.restorationEnabled=="boolean"?raw.restorationEnabled:DEFAULTS.restorationEnabled,restorationMaxItems:finiteNumber(raw?.restorationMaxItems,DEFAULTS.restorationMaxItems),restorationMaxTokensPerItem:finiteNumber(raw?.restorationMaxTokensPerItem,DEFAULTS.restorationMaxTokensPerItem),restorationMaxTotalTokens:finiteNumber(raw?.restorationMaxTotalTokens,DEFAULTS.restorationMaxTotalTokens),restorationContextRatio:finiteNumber(raw?.restorationContextRatio,DEFAULTS.restorationContextRatio),idleCompactionEnabled:typeof raw?.idleCompactionEnabled=="boolean"?raw.idleCompactionEnabled:DEFAULTS.idleCompactionEnabled,graceBandEnabled:typeof raw?.graceBandEnabled=="boolean"?raw.graceBandEnabled:DEFAULTS.graceBandEnabled,toolAdmissionEnabled:typeof raw?.toolAdmissionEnabled=="boolean"?raw.toolAdmissionEnabled:DEFAULTS.toolAdmissionEnabled,reminderEnabled:typeof raw?.reminderEnabled=="boolean"?raw.reminderEnabled:DEFAULTS.reminderEnabled,reserveScalingEnabled:typeof raw?.reserveScalingEnabled=="boolean"?raw.reserveScalingEnabled:DEFAULTS.reserveScalingEnabled,speculativeLeadTokens:typeof raw?.speculativeLeadTokens=="number"&&Number.isFinite(raw.speculativeLeadTokens)?Math.max(0,raw.speculativeLeadTokens):void 0,summarizationMaxDurationMs:typeof raw?.summarizationMaxDurationMs=="number"&&Number.isFinite(raw.summarizationMaxDurationMs)&&raw.summarizationMaxDurationMs>0?raw.summarizationMaxDurationMs:void 0}}import{resolve}from"node:path";var DEFAULT_CIRCUIT_COOLDOWN_MS=6e4,DEFAULT_CIRCUIT_MAX_COOLDOWN_MS=30*6e4;function nonNegativeMs(value,fallback){return typeof value=="number"&&Number.isFinite(value)&&value>=0?value:fallback}function resolveFallbackCircuitSettings(settings){let cooldownMs=nonNegativeMs(settings?.circuitCooldownMs,DEFAULT_CIRCUIT_COOLDOWN_MS),maxCooldownMs=nonNegativeMs(settings?.circuitMaxCooldownMs,DEFAULT_CIRCUIT_MAX_COOLDOWN_MS);return{cooldownMs,maxCooldownMs:Math.max(cooldownMs,maxCooldownMs)}}var FallbackCircuitBreaker=class{constructor(){this.circuits=new Map,this.generations=0}get size(){return this.circuits.size}open(selector,request){let previous=this.circuits.get(selector),consecutiveOpens=(previous?.consecutiveOpens??0)+1,cooldownMs=Math.min(request.cooldownMs*2**(consecutiveOpens-1),request.maxCooldownMs),retryAfterMs=request.retryAfterMs,hinted=retryAfterMs!==void 0&&Number.isFinite(retryAfterMs)&&retryAfterMs>0?request.now+retryAfterMs:0,retryFloorUntil=Math.max(hinted,previous&&previous.retryFloorUntil>request.now?previous.retryFloorUntil:0),openUntil=Math.max(request.now+cooldownMs,Math.min(retryFloorUntil,request.now+request.maxCooldownMs));return this.circuits.set(selector,{openUntil,retryFloorUntil,consecutiveOpens,cooldownMs,maxCooldownMs:request.maxCooldownMs,probe:void 0}),openUntil}isOpen(selector,now,owner){let circuit=this.circuits.get(selector);return circuit?now<circuit.openUntil?!0:circuit.probe!==void 0&&circuit.probe.owner!==owner:!1}admit(selector,now,owner){let circuit=this.circuits.get(selector);return circuit?now<circuit.openUntil?{kind:"open"}:circuit.probe&&circuit.probe.owner!==owner?{kind:"open"}:(circuit.probe??={owner,generation:++this.generations},{kind:"probe",token:{selector,owner,generation:circuit.probe.generation}}):{kind:"closed"}}release(token){let probe=this.circuits.get(token.selector)?.probe;if(probe&&probe.owner===token.owner&&probe.generation===token.generation){let circuit=this.circuits.get(token.selector);circuit&&(circuit.probe=void 0)}}releaseOwnersWithPrefix(prefix){for(let circuit of this.circuits.values())circuit.probe?.owner.startsWith(prefix)&&(circuit.probe=void 0)}close(selector){this.circuits.delete(selector)}has(selector){return this.circuits.has(selector)}sweep(now){for(let[selector,circuit]of this.circuits)!circuit.probe&&now>=circuit.openUntil+circuit.maxCooldownMs&&this.circuits.delete(selector)}};function createFallbackCircuitAccess(deps){let enabled=()=>deps.settings().cooldownMs>0;return{noteFailure(selector,failure){if(!enabled())return;let{cooldownMs,maxCooldownMs}=deps.settings(),now=deps.now(),retryAfterMs=failure.retryAfterMs??(failure.errorMessage===void 0?void 0:parseRetryAfterMsMarker(failure.errorMessage));deps.breaker.sweep(now);let openUntil=deps.breaker.open(selector,{now,cooldownMs,maxCooldownMs,retryAfterMs});deps.logger.info("circuit_opened",{selector,durationMs:openUntil-now,retryAfterMs})},governs:selector=>enabled()&&deps.breaker.has(selector),isOpen:(selector,lane="turn")=>enabled()&&deps.breaker.isOpen(selector,deps.now(),laneOwner(deps.owner(),lane)),admit:(selector,lane="turn")=>enabled()?deps.breaker.admit(selector,deps.now(),laneOwner(deps.owner(),lane)):{kind:"closed"},release:token=>deps.breaker.release(token),releaseAll:()=>deps.breaker.releaseOwnersWithPrefix(`${deps.owner()}:`),close:selector=>deps.breaker.close(selector)}}function laneOwner(session,lane){return`${session}:${lane}`}var breakersByAgentDir=new Map;function evictUnheldEmptyBreakers(){for(let[key,entry]of breakersByAgentDir)entry.owners===0&&entry.breaker.size===0&&breakersByAgentDir.delete(key)}function entryFor(agentDir){let key=resolve(agentDir),entry=breakersByAgentDir.get(key);return entry||(evictUnheldEmptyBreakers(),entry={breaker:new FallbackCircuitBreaker,owners:0},breakersByAgentDir.set(key,entry)),entry}function acquireFallbackCircuits(agentDir){let entry=entryFor(agentDir);entry.owners++;let released=!1;return{breaker:entry.breaker,release(){released||(released=!0,entry.owners--,evictUnheldEmptyBreakers())}}}function monotonicNow(){return performance.timeOrigin+performance.now()}function isPlainObject2(value){if(value===null||typeof value!="object"||Array.isArray(value))return!1;let prototype=Object.getPrototypeOf(value);return prototype===Object.prototype||prototype===null}function describeValue(value){return value===null?"null":Array.isArray(value)?"an array":`a ${typeof value}`}function isNonNegativeSafeInteger2(value){return typeof value=="number"&&Number.isSafeInteger(value)&&value>=0}function isFiniteAtLeast(value,min){return typeof value=="number"&&Number.isFinite(value)&&value>=min}function isFiniteRatio(value){return typeof value=="number"&&Number.isFinite(value)&&value>=0&&value<=1}function validateStageKnobs(stage,providerId,stageName,warnings){if(stage===void 0)return;if(!isPlainObject2(stage)){warnings.push(`retry.providers.${providerId}.${stageName} must be a plain object, but got ${describeValue(stage)}.`);return}let out={},invalid=[];if(stage.enabled!==void 0&&(typeof stage.enabled=="boolean"?out.enabled=stage.enabled:invalid.push("enabled")),stage.maxRetries!==void 0&&(isNonNegativeSafeInteger2(stage.maxRetries)?out.maxRetries=stage.maxRetries:invalid.push("maxRetries")),stage.baseDelayMs!==void 0&&(isNonNegativeSafeInteger2(stage.baseDelayMs)?out.baseDelayMs=stage.baseDelayMs:invalid.push("baseDelayMs")),stage.growthFactor!==void 0&&(isFiniteAtLeast(stage.growthFactor,1)?out.growthFactor=stage.growthFactor:invalid.push("growthFactor")),stage.perAttemptCapMs!==void 0&&(stage.perAttemptCapMs===null?out.perAttemptCapMs=null:isNonNegativeSafeInteger2(stage.perAttemptCapMs)?out.perAttemptCapMs=stage.perAttemptCapMs:invalid.push("perAttemptCapMs")),stage.jitter!==void 0)if(isPlainObject2(stage.jitter)){let mode=stage.jitter.mode;mode==="none"?out.jitter={mode:"none"}:(mode==="additive"||mode==="subtractive")&&isFiniteRatio(stage.jitter.ratio)?out.jitter={mode,ratio:stage.jitter.ratio}:invalid.push("jitter")}else invalid.push("jitter");if(stage.serverHintMaxDelayMs!==void 0&&(stage.serverHintMaxDelayMs===null?out.serverHintMaxDelayMs=null:isNonNegativeSafeInteger2(stage.serverHintMaxDelayMs)?out.serverHintMaxDelayMs=stage.serverHintMaxDelayMs:invalid.push("serverHintMaxDelayMs")),invalid.length>0){warnings.push(`retry.providers.${providerId}.${stageName} has invalid knob(s): ${invalid.join(", ")}.`);return}return out}function validateRetryProviderOverrides(value,knownProviderIds,tieredProviderIds){if(value===void 0)return{overrides:{},warnings:[]};if(!isPlainObject2(value))return{overrides:{},warnings:[`retry.providers must be a plain object keyed by provider id, but got ${describeValue(value)}.`]};let overrides={},warnings=[];for(let[providerId,entry]of Object.entries(value)){if(!knownProviderIds.has(providerId)){warnings.push(`retry.providers.${providerId}: unknown provider id "${providerId}".`);continue}if(!isPlainObject2(entry)){warnings.push(`retry.providers.${providerId} must be a plain object, but got ${describeValue(entry)}.`);continue}let stageWarnings=[],providerRequest=validateStageKnobs(entry.providerRequest,providerId,"providerRequest",stageWarnings),turn=validateStageKnobs(entry.turn,providerId,"turn",stageWarnings);if(stageWarnings.length>0){warnings.push(...stageWarnings);continue}if(tieredProviderIds?.has(providerId)&&(providerRequest?.serverHintMaxDelayMs!==void 0||turn?.serverHintMaxDelayMs!==void 0)){warnings.push(`retry.providers.${providerId}: serverHintMaxDelayMs is invalid for a tiered stage (tier thresholds own that strategy).`);continue}let result={};if(providerRequest!==void 0&&(result.providerRequest=providerRequest),turn!==void 0&&(result.turn=turn),providerRequest===void 0&&turn===void 0){warnings.push(`retry.providers.${providerId} has no recognized knobs.`);continue}overrides[providerId]=result}return{overrides,warnings}}var DEFAULT_FALLBACK_CHAINS={"claude-fable-5-1":["claude-opus-5-5:max","claude-opus-5:max","claude-opus-4-8:max","claude-opus-4-6:max"],"claude-fable-5":["claude-opus-5-5:max","claude-opus-5:max","claude-opus-4-8:max","claude-opus-4-6:max"],"claude-opus-5-5":["claude-opus-5:max","claude-opus-4-8:max","claude-opus-4-6:max"]};function cloneDefaultFallbackChains(){let chains={};for(let[key,entries]of Object.entries(DEFAULT_FALLBACK_CHAINS))chains[key]=[...entries];return chains}function isPlainObject3(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function isStringArray(value){return Array.isArray(value)&&value.every(entry=>typeof entry=="string")}function resolveFallbackChains(value){if(value===void 0||!isPlainObject3(value))return cloneDefaultFallbackChains();let chains=cloneDefaultFallbackChains();for(let[key,entries]of Object.entries(value)){if(!isStringArray(entries))return cloneDefaultFallbackChains();chains[key]=[...entries]}return chains}function resolveRetryFallbackSettings(settings){return{modelFallback:typeof settings?.modelFallback=="boolean"?settings.modelFallback:!0,chains:resolveFallbackChains(settings?.fallbackChains),revertPolicy:settings?.fallbackRevertPolicy==="never"?"never":"cooldown-expiry"}}function resolveAbortServerSideFallback(settings){return typeof settings?.abortServerSideFallback=="boolean"?settings.abortServerSideFallback:!0}var DEFAULT_HINTED_WAIT_CAP_MS=3e5,DEFAULT_PROBE_BACK_MAX_MS=36e5;function resolveHintPolicySettings(settings){let hintedWaitCapMs=typeof settings?.hintedWaitCapMs=="number"&&settings.hintedWaitCapMs>=0?settings.hintedWaitCapMs:DEFAULT_HINTED_WAIT_CAP_MS,probeBackMaxMs=typeof settings?.probeBackMaxMs=="number"&&settings.probeBackMaxMs>=0?settings.probeBackMaxMs:DEFAULT_PROBE_BACK_MAX_MS;return probeBackMaxMs<=hintedWaitCapMs?{hintedWaitCapMs:DEFAULT_HINTED_WAIT_CAP_MS,probeBackMaxMs:DEFAULT_PROBE_BACK_MAX_MS}:{hintedWaitCapMs,probeBackMaxMs}}function parseSettingsJson(content){content=stripBom(content);let withoutComments=[],inString=!1,escaped=!1;for(let index=0;index<content.length;index+=1){let char=content[index],next=content[index+1];if(inString){withoutComments.push(char),escaped?escaped=!1:char==="\\"?escaped=!0:char==='"'&&(inString=!1);continue}if(char==='"'){inString=!0,withoutComments.push(char);continue}if(char==="/"&&next==="/"){for(withoutComments.push(" "," "),index+=2;index<content.length&&content[index]!==`
|
|
158
176
|
`&&content[index]!=="\r";)withoutComments.push(" "),index+=1;index<content.length&&withoutComments.push(content[index]);continue}if(char==="/"&&next==="*"){withoutComments.push(" "," "),index+=2;let closed=!1;for(;index<content.length;index+=1){if(content[index]==="*"&&content[index+1]==="/"){withoutComments.push(" "," "),index+=1,closed=!0;break}withoutComments.push(content[index]===`
|
|
159
|
-
`||content[index]==="\r"?content[index]:" ")}if(!closed)throw new SyntaxError("Unterminated block comment in settings");continue}withoutComments.push(char)}let normalized=withoutComments;inString=!1,escaped=!1;for(let index=0;index<normalized.length;index+=1){let char=normalized[index];if(inString){escaped?escaped=!1:char==="\\"?escaped=!0:char==='"'&&(inString=!1);continue}if(char==='"'){inString=!0;continue}if(char!==",")continue;let nextIndex=index+1;for(;nextIndex<normalized.length&&/\s/.test(normalized[nextIndex]);)nextIndex+=1;(normalized[nextIndex]==="}"||normalized[nextIndex]==="]")&&(normalized[index]=" ")}let parsed=JSON.parse(normalized.join(""));if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new TypeError("Settings must contain a JSON object");return parsed}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function withoutOverride(overrides,field,nestedKey){if(!(field in overrides))return overrides;let next={...overrides},current=next[field];if(nestedKey===void 0||!isRecord(current))return delete next[field],next;if(!(nestedKey in current))return overrides;let nested={...current};return delete nested[nestedKey],Object.keys(nested).length===0?delete next[field]:next[field]=nested,next}var RETIRED_NESTED_KEYS=[["experimental","sharedHost"]];function removeRetiredSettingsKeys(raw){let removed=!1;for(let[parent,key]of RETIRED_NESTED_KEYS){let container=raw[parent];if(typeof container!="object"||container===null||Array.isArray(container)||!(key in container))continue;let remaining={...container};delete remaining[key],Object.keys(remaining).length===0?delete raw[parent]:raw[parent]=remaining,removed=!0}return removed}var failedRewrites=new Set;function writeRawScopedSettings(storage,scope){let target=storage.selectSource?.(scope)?.path??storage;if(!failedRewrites.has(target))try{storage.withLock(scope,current=>{if(!current)return;let raw=parseSettingsJson(current);return removeRetiredSettingsKeys(raw)?JSON.stringify(raw,null,2):void 0})}catch(error){failedRewrites.add(target);let detail=error instanceof Error?`${error.name}: ${error.message}`:String(error);try{appendDebugLogEntry(`settings: could not remove retired ${scope} settings keys`,detail)}catch{}}}var TERMINAL_MOUSE_MODES=["off","whilePending","always"];function isTerminalMouseMode(value){return value==="off"||value==="whilePending"||value==="always"}var DEFAULT_STREAM_START_TIMEOUT_MS=3e5,DEFAULT_PROVIDER_STREAM_RETRY_TIMEOUT_MS=3e4,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS=2e3,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS=1e4,THINKING_LEVEL_VALUES=new Set(["off","minimal","low","medium","high","xhigh","max"]),MODEL_SERVICE_TIER_VALUES=new Set(["auto","flex","priority"]);function modelMemoryKey(provider,modelId){return`${provider}/${modelId}`}function readModelMemoryEntry(map,key,allowed){if(typeof map!="object"||map===null||Array.isArray(map))return;let value=map[key];return typeof value=="string"&&allowed.has(value)?value:void 0}function isMergeableObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function deepMergeObjects(base,overrides){let result={...base};for(let key of Object.keys(overrides)){let overrideValue=overrides[key];if(overrideValue===void 0)continue;let baseValue=base[key];result[key]=isMergeableObject(baseValue)&&isMergeableObject(overrideValue)?deepMergeObjects(baseValue,overrideValue):overrideValue}return result}var DEFAULT_TOOL_NAMES=["read","bash","edit","write","grep"];function isToolModifier(entry){return typeof entry=="string"&&(entry.startsWith("+")||entry.startsWith("-"))}function mergeDefaultTools(base,overrides){return overrides===void 0?base:!Array.isArray(base)||!Array.isArray(overrides)||!overrides.every(isToolModifier)?overrides:[...base,...overrides]}function resolveDefaultTools(entries){let plain=entries.filter(entry=>!isToolModifier(entry)),tools=plain.length>0||entries.length===0?plain:[...DEFAULT_TOOL_NAMES];for(let entry of entries){if(!isToolModifier(entry))continue;let name=entry.slice(1),index=tools.indexOf(name);entry.startsWith("+")&&index===-1&&name?tools.push(name):entry.startsWith("-")&&index!==-1&&tools.splice(index,1)}return tools}function deepMergeSettings(base,overrides){let merged=deepMergeObjects(base,overrides);overrides.retry?.fallbackChains!==void 0&&(merged.retry={...merged.retry,fallbackChains:structuredClone(overrides.retry.fallbackChains)});let defaultTools=mergeDefaultTools(base.defaultTools,overrides.defaultTools);return defaultTools===void 0?merged:{...merged,defaultTools}}function resolveAskUserTimeoutMinutes(value){return typeof value!="number"||!Number.isFinite(value)?30:Math.min(120,Math.max(1,Math.floor(value)))}function parseTimeoutSetting(value,settingName){let timeoutMs=parseHttpIdleTimeoutMs(value);if(timeoutMs!==void 0)return timeoutMs;if(value!==void 0)throw new Error(`Invalid ${settingName} setting: ${String(value)}`)}var SELF_WRITE_TTL_MS=15e3,MAX_SELF_WRITES_PER_PATH=8,selfWritesByPath=new Map,selfWriteClock=Date.now;function recordSelfWrite(absPath,content){let now=selfWriteClock(),writes=selfWritesByPath.get(absPath)??new Map;for(let[hash2,recordedAt]of writes)now-recordedAt>SELF_WRITE_TTL_MS&&writes.delete(hash2);let hash=createHash("sha256").update(content).digest("hex");for(writes.delete(hash),writes.set(hash,now);writes.size>MAX_SELF_WRITES_PER_PATH;){let oldestHash=writes.keys().next().value;if(oldestHash===void 0)break;writes.delete(oldestHash)}selfWritesByPath.set(absPath,writes)}function wasSelfWrite(absPath,hash){let writes=selfWritesByPath.get(absPath);if(!writes)return!1;let now=selfWriteClock();for(let[trackedHash,recordedAt]of writes)now-recordedAt>SELF_WRITE_TTL_MS&&writes.delete(trackedHash);return writes.delete(hash)?(writes.size===0&&selfWritesByPath.delete(absPath),!0):(writes.size===0&&selfWritesByPath.delete(absPath),!1)}function getSettingsDirectory(cwd,agentDir,scope,homeDir){if(scope==="global")return resolvePath(agentDir);let resolvedCwd=resolvePath(cwd);return findNearestParentConfigDir(resolvedCwd,homeDir,CONFIG_DIR_NAME)??join2(resolvedCwd,CONFIG_DIR_NAME)}function resolveSettingsSource(cwd,agentDir,scope,homeDir=homedir()){let directory=getSettingsDirectory(cwd,agentDir,scope,homeDir),jsoncPath=join2(directory,"settings.jsonc");if(existsSync2(jsoncPath))return{path:jsoncPath,format:"jsonc",reason:"explicit-jsonc",scope};let jsonPath=join2(directory,"settings.json");if(existsSync2(jsonPath))return{path:jsonPath,format:"json",reason:"json-only",scope}}function getSettingsPath(cwd,agentDir,scope,homeDir=homedir()){return resolveSettingsSource(cwd,agentDir,scope,homeDir)?.path??join2(getSettingsDirectory(cwd,agentDir,scope,homeDir),"settings.json")}function getInMemorySettingsPath(scope){return scope==="global"?"/__senpi_in_memory__/settings.json":"/__senpi_in_memory__/.senpi/settings.json"}function toSettingsError(scope,error,path3){return{scope,...path3?{path:path3}:{},error:error instanceof Error?error:new Error(String(error))}}var SettingsLockBusy=class extends Error{},FileSettingsStorage=class{constructor(cwd,agentDir,homeDir=homedir()){this.cwd=cwd,this.agentDir=agentDir,this.homeDir=homeDir,this.globalSettingsPath=getSettingsPath(cwd,agentDir,"global",homeDir),this.projectSettingsPath=getSettingsPath(cwd,agentDir,"project",homeDir)}selectSource(scope){let source2=resolveSettingsSource(this.cwd,this.agentDir,scope,this.homeDir),path3=source2?.path??join2(getSettingsDirectory(this.cwd,this.agentDir,scope,this.homeDir),"settings.json");return scope==="global"?this.globalSettingsPath=path3:this.projectSettingsPath=path3,source2}tryAcquireLockSync(path3){try{return import_proper_lockfile.default.lockSync(path3,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error){throw isLockError(error)?new SettingsLockBusy:error}}acquireLockSyncWithRetry(path3){let startedAt=Date.now(),attempt=0;for(;;)try{return import_proper_lockfile.default.lockSync(path3,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error){if(!isLockError(error))throw error;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path3,waitedMs,error);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}async acquireLockWithRetry(path3){let startedAt=Date.now(),attempt=0;for(;;)try{return await import_proper_lockfile.default.lock(path3,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error){if(!isLockError(error))throw error;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(path3,waitedMs,error);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt++,await new Promise(resolve2=>setTimeout(resolve2,delayMs))}}async withLockAsync(scope,fn,underLock){let path3=scope==="global"?this.globalSettingsPath:this.projectSettingsPath,readCurrent=async()=>{try{return await readFile(path3,"utf-8")}catch(error){if(error.code==="ENOENT")return;throw error}},current=await readCurrent(),next=fn(current);if(next===void 0)return;await mkdir(dirname2(path3),{recursive:!0});let release=await this.acquireLockWithRetry(path3);try{underLock?.();let lockedContent=await readCurrent();if(lockedContent!==current&&(next=fn(lockedContent)),next!==void 0){let tempPath=`${path3}.${process.pid}.${randomUUID()}.tmp`;try{await writeFile(tempPath,next,"utf-8"),await rename(tempPath,path3),recordSelfWrite(path3,next)}catch(error){throw await rm(tempPath,{force:!0}),error}}}finally{await release()}}tryWithLock(scope,fn){try{return this.withLock(scope,fn,!1),!0}catch(error){if(error instanceof SettingsLockBusy)return!1;throw error}}withLock(scope,fn,waitForLock=!0){let path3=scope==="global"?this.globalSettingsPath:this.projectSettingsPath,dir=dirname2(path3),current=existsSync2(path3)?readFileSync2(path3,"utf-8"):void 0,next=fn(current);if(next===void 0)return;existsSync2(dir)||mkdirSync2(dir,{recursive:!0});let release=waitForLock?this.acquireLockSyncWithRetry(path3):this.tryAcquireLockSync(path3);try{let underLock=existsSync2(path3)?readFileSync2(path3,"utf-8"):void 0;if(underLock!==current&&(next=fn(underLock)),next!==void 0){let tempPath=`${path3}.${process.pid}.${randomUUID()}.tmp`;try{writeFileSync(tempPath,next,"utf-8"),recordSelfWrite(path3,next),renameSync(tempPath,path3)}catch(error){throw rmSync(tempPath,{force:!0}),error}}}finally{release()}}},InMemorySettingsStorage=class{withLock(scope,fn){let current=scope==="global"?this.global:this.project,next=fn(current);next!==void 0&&(scope==="global"?this.global=next:this.project=next,recordSelfWrite(getInMemorySettingsPath(scope),next))}},SettingsManager=class _SettingsManager{constructor(storage,initialGlobal,initialProject,globalLoadError=null,projectLoadError=null,initialErrors=[],projectTrusted=!0,initialSources=[],settingsPaths={}){this.runtimeOverrides={},this.modifiedFields=new Set,this.modifiedNestedFields=new Map,this.modifiedProjectFields=new Set,this.modifiedProjectNestedFields=new Map,this.globalSettingsLoadError=null,this.projectSettingsLoadError=null,this.writeQueue=Promise.resolve(),this.selectedSources=new Map,this.sourceListeners=[],this.providerSettingsListeners=new Set,this.storage=storage,this.globalSettings=initialGlobal,this.projectSettings=initialProject,this.projectTrusted=projectTrusted,this.globalSettingsLoadError=globalLoadError,this.projectSettingsLoadError=projectLoadError,this.errors=[...initialErrors],this.settingsPaths=settingsPaths;for(let source2 of initialSources)this.selectedSources.set(source2.scope,source2);this.settings=deepMergeSettings(this.globalSettings,this.projectSettings)}static create(cwd,agentDir=getAgentDir(),options={}){let storage=new FileSettingsStorage(cwd,agentDir);return _SettingsManager.fromStorage(storage,options)}static fromStorage(storage,options={}){let projectTrusted=options.projectTrusted??!0,initialSources=[],settingsPaths={},globalSource=storage.selectSource?.("global");globalSource&&(initialSources.push(globalSource),settingsPaths.global=globalSource.path);let globalLoad=_SettingsManager.tryLoadFromStorage(storage,"global"),projectSource=projectTrusted?storage.selectSource?.("project"):void 0;projectSource&&(initialSources.push(projectSource),settingsPaths.project=projectSource.path);let projectLoad=_SettingsManager.tryLoadFromStorage(storage,"project",projectTrusted),initialErrors=[];return globalLoad.error&&initialErrors.push(toSettingsError("global",globalLoad.error,settingsPaths.global)),projectLoad.error&&initialErrors.push(toSettingsError("project",projectLoad.error,settingsPaths.project)),new _SettingsManager(storage,globalLoad.settings,projectLoad.settings,globalLoad.error,projectLoad.error,initialErrors,projectTrusted,initialSources,settingsPaths)}static inMemory(settings={},options={}){let storage=new InMemorySettingsStorage,initialSettings=_SettingsManager.migrateSettings(structuredClone(settings));return storage.withLock("global",()=>JSON.stringify(initialSettings,null,2)),_SettingsManager.fromStorage(storage,options)}static loadFromStorage(storage,scope,projectTrusted=!0){if(scope==="project"&&!projectTrusted)return{};let content;if(storage.withLock(scope,current=>{content=current}),!content)return{};let raw=parseSettingsJson(content);return removeRetiredSettingsKeys(raw)&&scope==="global"&&writeRawScopedSettings(storage,scope),_SettingsManager.migrateSettings(raw)}static tryLoadFromStorage(storage,scope,projectTrusted=!0){try{return{settings:_SettingsManager.loadFromStorage(storage,scope,projectTrusted),error:null}}catch(error){return{settings:{},error}}}static migrateSettings(settings){if("queueMode"in settings&&!("steeringMode"in settings)&&(settings.steeringMode=settings.queueMode,delete settings.queueMode),!("transport"in settings)&&typeof settings.websockets=="boolean"&&(settings.transport=settings.websockets?"websocket":"sse",delete settings.websockets),"skills"in settings&&typeof settings.skills=="object"&&settings.skills!==null&&!Array.isArray(settings.skills)){let skillsSettings=settings.skills;skillsSettings.enableSkillCommands!==void 0&&settings.enableSkillCommands===void 0&&(settings.enableSkillCommands=skillsSettings.enableSkillCommands),Array.isArray(skillsSettings.customDirectories)&&skillsSettings.customDirectories.length>0?settings.skills=skillsSettings.customDirectories:delete settings.skills}if("retry"in settings&&typeof settings.retry=="object"&&settings.retry!==null&&!Array.isArray(settings.retry)){let retrySettings=settings.retry,providerSettings=typeof retrySettings.provider=="object"&&retrySettings.provider!==null?retrySettings.provider:void 0;typeof retrySettings.maxDelayMs=="number"&&(providerSettings?.maxRetryDelayMs===void 0||providerSettings?.maxRetryDelayMs===null)&&(retrySettings.provider={...providerSettings??{},maxRetryDelayMs:retrySettings.maxDelayMs}),delete retrySettings.maxDelayMs}return _SettingsManager.migrateRenamedProviderIds(settings),settings}static providerSettingsKey(providerId){return`${providerId.split("-").map((part,i)=>i===0?part:part.charAt(0).toUpperCase()+part.slice(1)).join("")}Provider`}static migrateRenamedProviderIds(settings){for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacyKey=_SettingsManager.providerSettingsKey(legacyId),canonicalKey=_SettingsManager.providerSettingsKey(canonicalId);legacyKey in settings&&!(canonicalKey in settings)&&(settings[canonicalKey]=settings[legacyKey],delete settings[legacyKey])}typeof settings.defaultProvider=="string"&&(settings.defaultProvider=normalizeProviderId(settings.defaultProvider)),typeof settings.defaultModel=="string"&&(settings.defaultModel=normalizeModelRef(settings.defaultModel)),Array.isArray(settings.favoriteModels)&&(settings.favoriteModels=settings.favoriteModels.map(entry=>typeof entry=="string"?normalizeModelRef(entry):entry));for(let field of["modelThinkingLevels","modelServiceTiers","modelLastOnThinkingLevels"]){let map=settings[field];typeof map=="object"&&map!==null&&!Array.isArray(map)&&(settings[field]=_SettingsManager.rekeyByModelRef(map))}if(typeof settings.retry=="object"&&settings.retry!==null&&!Array.isArray(settings.retry)){let retry=settings.retry,chains=retry.fallbackChains;if(typeof chains=="object"&&chains!==null&&!Array.isArray(chains)){let rekeyed={};for(let[key,rungs]of Object.entries(chains)){let nextRungs=Array.isArray(rungs)?rungs.map(rung=>typeof rung=="string"?normalizeModelRef(rung):rung):rungs;rekeyed[normalizeModelRef(key)]=nextRungs}retry.fallbackChains=rekeyed}}}static rekeyByModelRef(map){let out={};for(let[key,value]of Object.entries(map))out[normalizeModelRef(key)]=value;return out}getSettings(){return structuredClone(this.settings)}getGlobalSettings(){return structuredClone(this.globalSettings)}getProjectSettings(){return structuredClone(this.projectSettings)}getProviderSettings(){return structuredClone(this.settings.providers??{})}getProviderConcurrencyLimit(providerId){let value=readByProviderId(this.settings.providers,providerId)?.maxConcurrency;return typeof value=="number"&&Number.isInteger(value)&&value>0?value:1/0}subscribeToProviderSettings(listener){return this.providerSettingsListeners.add(listener),()=>this.providerSettingsListeners.delete(listener)}updateSettings(settings){this.settings=settings;for(let listener of this.providerSettingsListeners)listener()}getPromptCacheGoalBackstopMaxSeconds(){return this.projectSettings.promptCache?.goalBackstopMaxSeconds??this.globalSettings.promptCache?.goalBackstopMaxSeconds??270}getPromptCacheKeepAliveSettings(){let configured=this.settings.promptCache?.keepAlive;return{enabled:configured?.enabled??!1,maxRequestsPerSession:configured?.maxRequestsPerSession??3,maxCostUsdPerSession:configured?.maxCostUsdPerSession??.05,marginSeconds:configured?.marginSeconds??60}}getAskUserSettings(){let configured=this.settings.askUser;return{enabled:typeof configured?.enabled=="boolean"?configured.enabled:!0,timeoutMinutes:resolveAskUserTimeoutMinutes(configured?.timeoutMinutes),bell:typeof configured?.bell=="boolean"?configured.bell:!0}}getTodoFirstTurnPlan(){let configured=this.settings.todo?.firstTurnPlan;return configured==="remind"||configured==="off"?configured:"force"}getTodoTurnEndBackstop(){let configured=this.settings.todo?.turnEndBackstop;return typeof configured=="boolean"?configured:!0}isProjectTrusted(){return this.projectTrusted}setProjectTrusted(trusted){if(this.projectTrusted===trusted)return;if(this.projectTrusted=trusted,this.modifiedProjectFields.clear(),this.modifiedProjectNestedFields.clear(),!trusted){this.projectSettings={},this.projectSettingsLoadError=null,this.updateSettings(this.mergedSettings());return}this.selectAndPublishSource("project");let projectLoad=_SettingsManager.tryLoadFromStorage(this.storage,"project",trusted);this.projectSettings=projectLoad.settings,this.projectSettingsLoadError=projectLoad.error,projectLoad.error&&this.recordError("project",projectLoad.error),this.updateSettings(this.mergedSettings())}async reload(){await this.writeQueue,this.selectAndPublishSource("global");let globalLoad=_SettingsManager.tryLoadFromStorage(this.storage,"global");globalLoad.error?(this.globalSettingsLoadError=globalLoad.error,this.recordError("global",globalLoad.error)):(this.globalSettings=globalLoad.settings,this.globalSettingsLoadError=null),this.modifiedFields.clear(),this.modifiedNestedFields.clear(),this.modifiedProjectFields.clear(),this.modifiedProjectNestedFields.clear(),this.projectTrusted&&this.selectAndPublishSource("project");let projectLoad=_SettingsManager.tryLoadFromStorage(this.storage,"project",this.projectTrusted);projectLoad.error?(this.projectSettingsLoadError=projectLoad.error,this.recordError("project",projectLoad.error)):(this.projectSettings=projectLoad.settings,this.projectSettingsLoadError=null),this.updateSettings(this.mergedSettings())}getSelectedSettingsSources(){return[...this.selectedSources.values()].map(source2=>({...source2}))}subscribeToSourceSelection(listener){return this.sourceListeners.push(listener),()=>{let index=this.sourceListeners.indexOf(listener);index!==-1&&this.sourceListeners.splice(index,1)}}selectAndPublishSource(scope){let source2=this.storage.selectSource?.(scope);if(!source2){this.selectedSources.delete(scope);return}this.selectedSources.set(scope,source2);for(let listener of this.sourceListeners)listener({...source2})}applyOverrides(overrides){this.runtimeOverrides=deepMergeSettings(this.runtimeOverrides,overrides),this.updateSettings(this.mergedSettings())}mergedSettings(){return deepMergeSettings(deepMergeSettings(this.globalSettings,this.projectSettings),this.runtimeOverrides)}markModified(field,nestedKey){this.runtimeOverrides=withoutOverride(this.runtimeOverrides,field,nestedKey),this.modifiedFields.add(field),nestedKey&&(this.modifiedNestedFields.has(field)||this.modifiedNestedFields.set(field,new Set),this.modifiedNestedFields.get(field).add(nestedKey))}markProjectModified(field,nestedKey){this.runtimeOverrides=withoutOverride(this.runtimeOverrides,field,nestedKey),this.modifiedProjectFields.add(field),nestedKey&&(this.modifiedProjectNestedFields.has(field)||this.modifiedProjectNestedFields.set(field,new Set),this.modifiedProjectNestedFields.get(field).add(nestedKey))}assertProjectTrustedForWrite(){if(!this.projectTrusted)throw new Error("Project is not trusted; refusing to write project settings")}recordError(scope,error){let normalizedError=error instanceof Error?error:new Error(String(error));this.errors.push(toSettingsError(scope,normalizedError,this.settingsPaths[scope]))}clearModifiedScope(scope){if(scope==="global"){this.modifiedFields.clear(),this.modifiedNestedFields.clear();return}this.modifiedProjectFields.clear(),this.modifiedProjectNestedFields.clear()}enqueueWrite(scope,task){this.writeQueue=this.writeQueue.then(async()=>{scope==="project"&&this.assertProjectTrustedForWrite(),await task(),this.clearModifiedScope(scope)}).catch(error=>{this.recordError(scope,error)})}cloneModifiedNestedFields(source2){let snapshot=new Map;for(let[key,value]of source2.entries())snapshot.set(key,new Set(value));return snapshot}persistScopedSettings(scope,snapshotSettings,modifiedFields,modifiedNestedFields){let merge=current=>{let currentFileSettings=current?_SettingsManager.migrateSettings(parseSettingsJson(current)):{},mergedSettings={...currentFileSettings};for(let field of modifiedFields){let value=snapshotSettings[field];if(modifiedNestedFields.has(field)&&typeof value=="object"&&value!==null){let nestedModified=modifiedNestedFields.get(field),baseNested=currentFileSettings[field]??{},inMemoryNested=value,mergedNested={...baseNested};for(let nestedKey of nestedModified)mergedNested[nestedKey]=inMemoryNested[nestedKey];mergedSettings[field]=mergedNested}else mergedSettings[field]=value}return JSON.stringify(mergedSettings,null,2)},storage=this.storage;if(!storage.withLockAsync||!storage.tryWithLock){storage.withLock(scope,merge);return}if(!storage.tryWithLock(scope,merge))return storage.withLockAsync(scope,merge,scope==="project"?()=>this.assertProjectTrustedForWrite():void 0)}save(){if(this.updateSettings(this.mergedSettings()),this.globalSettingsLoadError)return;let snapshotGlobalSettings=structuredClone(this.globalSettings),modifiedFields=new Set(this.modifiedFields),modifiedNestedFields=this.cloneModifiedNestedFields(this.modifiedNestedFields);this.enqueueWrite("global",()=>this.persistScopedSettings("global",snapshotGlobalSettings,modifiedFields,modifiedNestedFields))}saveProjectSettings(settings){if(this.assertProjectTrustedForWrite(),this.projectSettings=structuredClone(settings),this.updateSettings(this.mergedSettings()),this.projectSettingsLoadError)return;let snapshotProjectSettings=structuredClone(this.projectSettings),modifiedFields=new Set(this.modifiedProjectFields),modifiedNestedFields=this.cloneModifiedNestedFields(this.modifiedProjectNestedFields);this.enqueueWrite("project",()=>this.persistScopedSettings("project",snapshotProjectSettings,modifiedFields,modifiedNestedFields))}updateProjectSettings(field,update){this.assertProjectTrustedForWrite();let projectSettings=structuredClone(this.projectSettings);update(projectSettings),this.markProjectModified(field),this.saveProjectSettings(projectSettings)}async flush(){await this.writeQueue}drainErrors(){let drained=[...this.errors];return this.errors=[],drained}getLastChangelogVersion(){return this.settings.lastChangelogVersion}setLastChangelogVersion(version){this.globalSettings.lastChangelogVersion=version,this.markModified("lastChangelogVersion"),this.save()}getChangelogSeen(source2="engine"){return this.settings.changelogSeen?.[source2]??(source2==="engine"?this.settings.lastChangelogVersion:void 0)}setChangelogSeen(source2,version){!source2||this.globalSettings.changelogSeen?.[source2]===version||(this.globalSettings.changelogSeen={...this.globalSettings.changelogSeen??{},[source2]:version},this.markModified("changelogSeen",source2),this.save())}getSessionDir(){let sessionDir=this.settings.sessionDir;return sessionDir&&normalizePath(sessionDir)}getDefaultProvider(){return this.settings.defaultProvider}getDefaultModel(){return this.settings.defaultModel}setDefaultProvider(provider){this.globalSettings.defaultProvider=provider,this.markModified("defaultProvider"),this.save()}setDefaultModel(modelId){this.globalSettings.defaultModel=modelId,this.markModified("defaultModel"),this.save()}setDefaultModelAndProvider(provider,modelId){this.globalSettings.defaultProvider=provider,this.globalSettings.defaultModel=modelId,this.markModified("defaultProvider"),this.markModified("defaultModel"),this.save()}getSteeringMode(){return this.settings.steeringMode||"all"}setSteeringMode(mode){this.globalSettings.steeringMode=mode,this.markModified("steeringMode"),this.save()}getFollowUpMode(){return this.settings.followUpMode||"one-at-a-time"}setFollowUpMode(mode){this.globalSettings.followUpMode=mode,this.markModified("followUpMode"),this.save()}getThemeSetting(){let value=this.settings.theme;if(typeof value=="string")return value}getTheme(){let theme2=this.getThemeSetting();return theme2?.includes("/")?void 0:theme2}setTheme(theme2){this.globalSettings.theme=theme2,this.markModified("theme"),this.save()}getDefaultThinkingLevel(){return this.settings.defaultThinkingLevel}setDefaultThinkingLevel(level){this.globalSettings.defaultThinkingLevel=level,this.markModified("defaultThinkingLevel"),this.save()}getAllModelThinkingLevels(){return{...this.settings.modelThinkingLevels??{}}}getModelThinkingLevel(provider,modelId){return readModelMemoryEntry(this.settings.modelThinkingLevels,modelMemoryKey(provider,modelId),THINKING_LEVEL_VALUES)}setModelThinkingLevel(provider,modelId,level,options={}){let key=modelMemoryKey(provider,modelId),existing=this.globalSettings.modelThinkingLevels,map=typeof existing=="object"&&existing!==null&&!Array.isArray(existing)?{...existing}:{};level===void 0?delete map[key]:map[key]=level,this.globalSettings.modelThinkingLevels=map,this.markModified("modelThinkingLevels",key),level!=="off"&&!options.preserveLastOn&&this.updateModelLastOnThinkingLevel(key,level),this.save()}getModelLastOnThinkingLevel(provider,modelId){let level=readModelMemoryEntry(this.settings.modelLastOnThinkingLevels,modelMemoryKey(provider,modelId),THINKING_LEVEL_VALUES);return level==="off"?void 0:level}setModelLastOnThinkingLevel(provider,modelId,level){this.updateModelLastOnThinkingLevel(modelMemoryKey(provider,modelId),level==="off"?void 0:level),this.save()}updateModelLastOnThinkingLevel(key,level){let existing=this.globalSettings.modelLastOnThinkingLevels,map=typeof existing=="object"&&existing!==null&&!Array.isArray(existing)?{...existing}:{};level===void 0?delete map[key]:map[key]=level,this.globalSettings.modelLastOnThinkingLevels=map,this.markModified("modelLastOnThinkingLevels",key)}getModelServiceTier(provider,modelId){return readModelMemoryEntry(this.settings.modelServiceTiers,modelMemoryKey(provider,modelId),MODEL_SERVICE_TIER_VALUES)}setModelServiceTier(provider,modelId,tier){let key=modelMemoryKey(provider,modelId),existing=this.globalSettings.modelServiceTiers,map=typeof existing=="object"&&existing!==null&&!Array.isArray(existing)?{...existing}:{};tier===void 0?delete map[key]:map[key]=tier,this.globalSettings.modelServiceTiers=map,this.markModified("modelServiceTiers",key),this.save()}getTransport(){return this.settings.transport??"auto"}getOpenAIServiceTier(){return this.settings.openai?.serviceTier}setTransport(transport){this.globalSettings.transport=transport,this.markModified("transport"),this.save()}getCompactionEnabled(){return compactionEnabled(this.settings.compaction)}setCompactionEnabled(enabled){this.globalSettings.compaction||(this.globalSettings.compaction={}),this.globalSettings.compaction.enabled=enabled,this.markModified("compaction","enabled"),this.save()}getCompactionReserveTokens(forModel){return compactionReserveTokens(this.settings.compaction,forModel)}getCompactionKeepRecentTokens(forModel){return compactionKeepRecentTokens(this.settings.compaction,forModel)}getCompactionSettings(forModel){return{...resolveCompactionSettings(this.settings.compaction,forModel),model:this.settings.compaction?.model}}getBranchSummarySettings(){return{reserveTokens:this.settings.branchSummary?.reserveTokens??16384,skipPrompt:this.settings.branchSummary?.skipPrompt??!1}}getBranchSummarySkipPrompt(){return this.settings.branchSummary?.skipPrompt??!1}getRetryEnabled(){return this.settings.retry?.enabled??!0}setRetryEnabled(enabled){this.globalSettings.retry||(this.globalSettings.retry={}),this.globalSettings.retry.enabled=enabled,this.markModified("retry","enabled"),this.save()}isRetryMaxAgentDelayMsConfigured(){return this.settings.retry?.maxAgentDelayMs!==void 0}getRetrySettings(){return{enabled:this.getRetryEnabled(),maxRetries:this.settings.retry?.maxRetries??SENPI_DEFAULT_RETRY_PROFILE.turn.maxRetries,baseDelayMs:this.settings.retry?.baseDelayMs??2e3,maxAgentDelayMs:this.settings.retry?.maxAgentDelayMs??DEFAULT_MAX_AGENT_RETRY_DELAY_MS}}getAbortServerSideFallback(){return resolveAbortServerSideFallback(this.settings.retry)}getRawFallbackChains(){return this.settings.retry?.fallbackChains}getFallbackChainsScope(){if(this.projectSettings.retry?.fallbackChains!==void 0)return"project";if(this.globalSettings.retry?.fallbackChains!==void 0)return"global"}getRetryFallbackSettings(){return resolveRetryFallbackSettings(this.settings.retry)}getFallbackCircuitSettings(){return resolveFallbackCircuitSettings(this.settings.fallback)}getHintPolicySettings(){return resolveHintPolicySettings(this.settings.retry)}setFallbackChain(key,entries){this.globalSettings.retry||(this.globalSettings.retry={});let chains=this.getGlobalFallbackChains();this.globalSettings.retry.fallbackChains={...chains,[key]:[...entries]},this.markModified("retry","fallbackChains"),this.save()}removeFallbackChain(key){let chains=this.getGlobalFallbackChains();key in chains&&(this.globalSettings.retry||(this.globalSettings.retry={}),delete chains[key],this.globalSettings.retry.fallbackChains=chains,this.markModified("retry","fallbackChains"),this.save())}setModelFallbackEnabled(enabled){this.globalSettings.retry||(this.globalSettings.retry={}),this.globalSettings.retry.modelFallback=enabled,this.markModified("retry","modelFallback"),this.save()}setFallbackRevertPolicy(policy){this.globalSettings.retry||(this.globalSettings.retry={}),this.globalSettings.retry.fallbackRevertPolicy=policy,this.markModified("retry","fallbackRevertPolicy"),this.save()}getGlobalFallbackChains(){let fallbackChains=this.globalSettings.retry?.fallbackChains;if(typeof fallbackChains!="object"||fallbackChains===null||Array.isArray(fallbackChains))return{};let chains={};for(let[key,entries]of Object.entries(fallbackChains))Array.isArray(entries)&&entries.every(entry=>typeof entry=="string")&&(chains[key]=[...entries]);return chains}getHttpIdleTimeoutMs(){return parseTimeoutSetting(this.settings.httpIdleTimeoutMs,"httpIdleTimeoutMs")??DEFAULT_HTTP_IDLE_TIMEOUT_MS}setHttpIdleTimeoutMs(timeoutMs){if(!Number.isFinite(timeoutMs)||timeoutMs<0)throw new Error(`Invalid httpIdleTimeoutMs setting: ${String(timeoutMs)}`);this.globalSettings.httpIdleTimeoutMs=Math.floor(timeoutMs),this.markModified("httpIdleTimeoutMs"),this.save()}getSessionShutdownHandlerWarnMs(){return parseTimeoutSetting(this.settings.sessionShutdownHandlerWarnMs,"sessionShutdownHandlerWarnMs")??DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}setSessionShutdownHandlerWarnMs(warnMs){if(!Number.isFinite(warnMs)||warnMs<0)throw new Error(`Invalid sessionShutdownHandlerWarnMs setting: ${String(warnMs)}`);this.globalSettings.sessionShutdownHandlerWarnMs=Math.floor(warnMs),this.markModified("sessionShutdownHandlerWarnMs"),this.save()}getSessionShutdownHandlerTimeoutMs(){return parseTimeoutSetting(this.settings.sessionShutdownHandlerTimeoutMs,"sessionShutdownHandlerTimeoutMs")??DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}setSessionShutdownHandlerTimeoutMs(timeoutMs){if(!Number.isFinite(timeoutMs)||timeoutMs<0)throw new Error(`Invalid sessionShutdownHandlerTimeoutMs setting: ${String(timeoutMs)}`);this.globalSettings.sessionShutdownHandlerTimeoutMs=Math.floor(timeoutMs),this.markModified("sessionShutdownHandlerTimeoutMs"),this.save()}getProviderRetrySettings(){return{timeoutMs:this.settings.retry?.provider?.timeoutMs,maxRetries:this.settings.retry?.provider?.maxRetries,maxRetryDelayMs:this.settings.retry?.provider?.maxRetryDelayMs??6e4}}resolveRetryProfile(provider){let base=provider?.retryPolicy??SENPI_DEFAULT_RETRY_PROFILE,declared=provider?.retryPolicy!==void 0,turnBackoff={...base.turn.backoff};declared||this.settings.retry?.maxRetries!==void 0&&(turnBackoff.baseDelayMs=this.settings.retry.baseDelayMs??turnBackoff.baseDelayMs);let turnMaxRetries=base.turn.maxRetries,turnBaseDelayMs=turnBackoff.baseDelayMs;declared||(this.settings.retry?.maxRetries!==void 0&&(turnMaxRetries=this.settings.retry.maxRetries),this.settings.retry?.baseDelayMs!==void 0&&(turnBaseDelayMs=this.settings.retry.baseDelayMs));let providerOverride=this._resolveRetryProviderOverride(provider?.id);providerOverride?.turn?.maxRetries!==void 0&&(turnMaxRetries=providerOverride.turn.maxRetries),providerOverride?.turn?.baseDelayMs!==void 0&&(turnBaseDelayMs=providerOverride.turn.baseDelayMs);let turnEnabled=this.getRetryEnabled()?providerOverride?.turn?.enabled??base.turn.enabled:!1,tierStrategy=base.turn.serverHint.mode==="tiered"?base.turn.serverHint.strategy:()=>{throw new Error("not tiered")},turn={enabled:turnEnabled,maxRetries:turnMaxRetries,backoff:{...base.turn.backoff,baseDelayMs:turnBaseDelayMs},extractServerHint:base.turn.extractServerHint,serverHint:base.turn.serverHint.mode==="tiered"?{mode:"tiered",strategy:tierStrategy}:base.turn.serverHint,classify:base.turn.classify};return{id:base.id,providerRequest:base.providerRequest,turn,fallback:base.fallback}}_resolveRetryProviderOverride(providerId){if(providerId===void 0)return;let raw=this.settings.retry?.providers;if(raw===void 0)return;let{overrides}=validateRetryProviderOverrides(raw,new Set([providerId]));return overrides[providerId]}getProviderStreamRetryTimeoutMs(){let explicit=this.settings.retry?.provider?.streamRetryTimeoutMs;return explicit!==void 0?explicit>0?explicit:void 0:DEFAULT_PROVIDER_STREAM_RETRY_TIMEOUT_MS}getAgentStreamIdleTimeoutMs(){let providerTimeoutMs=this.settings.retry?.provider?.timeoutMs;if(providerTimeoutMs!==void 0)return providerTimeoutMs;let httpIdleTimeoutMs=this.getHttpIdleTimeoutMs();return httpIdleTimeoutMs===0?void 0:httpIdleTimeoutMs}getAgentStreamStartTimeoutMs(){let explicit=this.settings.retry?.provider?.streamStartTimeoutMs;if(explicit!==void 0)return explicit>0?explicit:void 0;let idleTimeoutMs=this.getAgentStreamIdleTimeoutMs();if(idleTimeoutMs!==void 0)return Math.min(DEFAULT_STREAM_START_TIMEOUT_MS,idleTimeoutMs)}getWebSocketConnectTimeoutMs(){return parseTimeoutSetting(this.settings.websocketConnectTimeoutMs,"websocketConnectTimeoutMs")}getHideThinkingBlock(){return this.settings.hideThinkingBlock??!1}getSmoothStreaming(){return this.settings.smoothStreaming??!0}getSmoothStreamingFps(){let fps=this.settings.smoothStreamingFps;return typeof fps!="number"||!Number.isFinite(fps)?60:Math.min(120,Math.max(30,fps))}getShowCacheMissNotices(){return this.settings.showCacheMissNotices??!1}getExternalEditorCommand(){let configuredEditor=this.settings.externalEditor;if(typeof configuredEditor=="string"&&configuredEditor.trim()!=="")return configuredEditor;let environmentEditor=process.env.VISUAL||process.env.EDITOR;return environmentEditor||(process.platform==="win32"?"notepad":"nano")}setHideThinkingBlock(hide){this.globalSettings.hideThinkingBlock=hide,this.markModified("hideThinkingBlock"),this.save()}setSmoothStreaming(enabled){this.globalSettings.smoothStreaming=enabled,this.markModified("smoothStreaming"),this.save()}setSmoothStreamingFps(fps){this.globalSettings.smoothStreamingFps=fps,this.markModified("smoothStreamingFps"),this.save()}setShowCacheMissNotices(show){this.globalSettings.showCacheMissNotices=show,this.markModified("showCacheMissNotices"),this.save()}getShellPath(){let shellPath=this.settings.shellPath;return shellPath&&normalizePath(shellPath)}setShellPath(path3){this.globalSettings.shellPath=path3,this.markModified("shellPath"),this.save()}getQuietStartup(){let value=this.settings.quietStartup;return value===!0||value==="header"?value:!1}setQuietStartup(quiet){this.globalSettings.quietStartup=quiet,this.markModified("quietStartup"),this.save()}getTipsEnabled(){return this.settings.tips??!0}getTipsHistory(){let history=this.settings.tipsHistory;return typeof history!="object"||history===null||Array.isArray(history)?{}:{...history}}setTipsHistory(history){this.globalSettings.tipsHistory=history,this.markModified("tipsHistory"),this.save()}setTipShown(tipId,timestamp){let history=this.getTipsHistory();history[tipId]=timestamp,this.globalSettings.tipsHistory=history,this.markModified("tipsHistory",tipId),this.save()}getDefaultProjectTrust(){let value=this.globalSettings.defaultProjectTrust;return value==="always"||value==="never"?value:"ask"}setDefaultProjectTrust(defaultProjectTrust){this.globalSettings.defaultProjectTrust=defaultProjectTrust,this.markModified("defaultProjectTrust"),this.save()}getShellCommandPrefix(){return this.settings.shellCommandPrefix}setShellCommandPrefix(prefix){this.globalSettings.shellCommandPrefix=prefix,this.markModified("shellCommandPrefix"),this.save()}getNpmCommand(){return this.settings.npmCommand?[...this.settings.npmCommand]:void 0}setNpmCommand(command){this.globalSettings.npmCommand=command?[...command]:void 0,this.markModified("npmCommand"),this.save()}getCollapseChangelog(){return this.settings.collapseChangelog??!1}setCollapseChangelog(collapse){this.globalSettings.collapseChangelog=collapse,this.markModified("collapseChangelog"),this.save()}getEnableInstallTelemetry(){return this.settings.enableInstallTelemetry??!0}setEnableInstallTelemetry(enabled){this.globalSettings.enableInstallTelemetry=enabled,this.markModified("enableInstallTelemetry"),this.save()}getEnableAnalytics(){return this.settings.enableAnalytics??!1}getTrackingId(){return this.settings.trackingId}setEnableAnalytics(enabled){this.globalSettings.enableAnalytics=enabled,this.markModified("enableAnalytics"),enabled&&!this.globalSettings.trackingId&&(this.globalSettings.trackingId=randomUUID(),this.markModified("trackingId")),this.save()}getOrCreateDeviceId(){return this.globalSettings.deviceId||(this.globalSettings.deviceId=randomUUID(),this.markModified("deviceId"),this.save()),this.globalSettings.deviceId}getPackages(){return[...this.settings.packages??[]]}getDisabledBuiltinExtensions(){return[...this.settings.disabledBuiltinExtensions??[]]}getEnabledBuiltinExtensions(){return this.settings.enabledBuiltinExtensions?[...this.settings.enabledBuiltinExtensions]:void 0}setPackages(packages){this.globalSettings.packages=packages,this.markModified("packages"),this.save()}setProjectPackages(packages){this.updateProjectSettings("packages",settings=>{settings.packages=packages})}getExtensionPaths(){return[...this.settings.extensions??[]]}setExtensionPaths(paths){this.globalSettings.extensions=paths,this.markModified("extensions"),this.save()}setProjectExtensionPaths(paths){this.updateProjectSettings("extensions",settings=>{settings.extensions=paths})}getSkillPaths(){return[...this.settings.skills??[]]}setSkillPaths(paths){this.globalSettings.skills=paths,this.markModified("skills"),this.save()}setProjectSkillPaths(paths){this.updateProjectSettings("skills",settings=>{settings.skills=paths})}getPromptTemplatePaths(){return[...this.settings.prompts??[]]}setPromptTemplatePaths(paths){this.globalSettings.prompts=paths,this.markModified("prompts"),this.save()}setProjectPromptTemplatePaths(paths){this.updateProjectSettings("prompts",settings=>{settings.prompts=paths})}getThemePaths(){return[...this.settings.themes??[]]}setThemePaths(paths){this.globalSettings.themes=paths,this.markModified("themes"),this.save()}setProjectThemePaths(paths){this.updateProjectSettings("themes",settings=>{settings.themes=paths})}getEnableSkillCommands(){return this.settings.enableSkillCommands??!0}setEnableSkillCommands(enabled){this.globalSettings.enableSkillCommands=enabled,this.markModified("enableSkillCommands"),this.save()}getThinkingBudgets(){return this.settings.thinkingBudgets}getTerminalCapabilityOverrides(){let terminal=this.settings.terminal,imageSetting=terminal?.images,imageOverride=imageSetting!==void 0?imageSetting:envValue("IMAGE_PROTOCOL")?.toLowerCase(),trueColorSetting=terminal?.trueColor,trueColorOverride=trueColorSetting!==void 0?trueColorSetting:envValue("TRUE_COLOR"),hyperlinksSetting=terminal?.hyperlinks,hyperlinksOverride=hyperlinksSetting!==void 0?hyperlinksSetting:envValue("HYPERLINKS");return{...imageOverride==="kitty"||imageOverride==="iterm2"?{images:imageOverride}:imageOverride===!1||imageOverride==="none"||imageOverride==="0"?{images:null}:{},...typeof trueColorOverride=="boolean"?{trueColor:trueColorOverride}:trueColorOverride==="1"||trueColorOverride==="0"?{trueColor:trueColorOverride==="1"}:{},...typeof hyperlinksOverride=="boolean"?{hyperlinks:hyperlinksOverride}:hyperlinksOverride==="1"||hyperlinksOverride==="0"?{hyperlinks:hyperlinksOverride==="1"}:{}}}getShowImages(){return this.settings.terminal?.showImages??!0}setShowImages(show){this.globalSettings.terminal||(this.globalSettings.terminal={}),this.globalSettings.terminal.showImages=show,this.markModified("terminal","showImages"),this.save()}getImageWidthCells(){let width=this.settings.terminal?.imageWidthCells;return typeof width!="number"||!Number.isFinite(width)?60:Math.max(1,Math.floor(width))}setImageWidthCells(width){this.globalSettings.terminal||(this.globalSettings.terminal={}),this.globalSettings.terminal.imageWidthCells=Math.max(1,Math.floor(width)),this.markModified("terminal","imageWidthCells"),this.save()}getTerminalMouse(){let value=this.settings.terminal?.mouse;return isTerminalMouseMode(value)?value:"whilePending"}setTerminalMouse(mouse){if(!isTerminalMouseMode(mouse))throw new TypeError("Invalid terminal.mouse");this.globalSettings.terminal??={},this.globalSettings.terminal.mouse=mouse,this.markModified("terminal","mouse"),this.save()}getClearOnShrink(){return this.settings.terminal?.clearOnShrink!==void 0?this.settings.terminal.clearOnShrink:envValue("CLEAR_ON_SHRINK")==="1"}setClearOnShrink(enabled){this.globalSettings.terminal||(this.globalSettings.terminal={}),this.globalSettings.terminal.clearOnShrink=enabled,this.markModified("terminal","clearOnShrink"),this.save()}getShowTerminalProgress(){return this.settings.terminal?.showTerminalProgress??!1}setShowTerminalProgress(enabled){this.globalSettings.terminal||(this.globalSettings.terminal={}),this.globalSettings.terminal.showTerminalProgress=enabled,this.markModified("terminal","showTerminalProgress"),this.save()}getTuiMode(){return this.settings.tuiMode==="fullscreen"?"fullscreen":"regular"}setTuiMode(mode){this.globalSettings.tuiMode=mode,this.markModified("tuiMode"),this.save()}getFullscreenExitOutput(){return this.settings.fullscreenExitOutput==="resume-hint"?"resume-hint":"transcript"}setFullscreenExitOutput(output){this.globalSettings.fullscreenExitOutput=output,this.markModified("fullscreenExitOutput"),this.save()}getFullscreenScrollbar(){let mode=this.settings.fullscreenScrollbar;return mode==="always"||mode==="hidden"?mode:"auto"}setFullscreenScrollbar(mode){this.globalSettings.fullscreenScrollbar=mode,this.markModified("fullscreenScrollbar"),this.save()}getFullscreenCopyOnSelect(){return this.settings.fullscreenCopyOnSelect??!0}setFullscreenCopyOnSelect(enabled){this.globalSettings.fullscreenCopyOnSelect=enabled,this.markModified("fullscreenCopyOnSelect"),this.save()}getFullscreenWheelScrollLines(){let lines=this.settings.fullscreenWheelScrollLines;return typeof lines=="number"&&Number.isFinite(lines)?Math.max(1,Math.min(100,Math.floor(lines))):"auto"}setFullscreenWheelScrollLines(lines){this.globalSettings.fullscreenWheelScrollLines=lines==="auto"?lines:Math.max(1,Math.min(100,Math.floor(lines))),this.markModified("fullscreenWheelScrollLines"),this.save()}getImageAutoResize(){return this.settings.images?.autoResize??!0}setImageAutoResize(enabled){this.globalSettings.images||(this.globalSettings.images={}),this.globalSettings.images.autoResize=enabled,this.markModified("images","autoResize"),this.save()}getBlockImages(){return this.settings.images?.blockImages??!1}getMaxHistoricalImages(){let value=this.settings.images?.maxHistoricalImages;return Number.isInteger(value)&&value!==void 0&&value>=0?value:void 0}setBlockImages(blocked){this.globalSettings.images||(this.globalSettings.images={}),this.globalSettings.images.blockImages=blocked,this.markModified("images","blockImages"),this.save()}getEnabledModels(){return this.settings.enabledModels}getRecommendedModels(){return this.settings.recommendedModels?[...this.settings.recommendedModels]:void 0}getFavoriteModels(){return this.settings.favoriteModels}setFavoriteModels(patterns){this.globalSettings.favoriteModels=patterns,this.markModified("favoriteModels"),this.save()}getDefaultTools(){let tools=this.settings.defaultTools;if(tools!==void 0)return resolveDefaultTools(Array.isArray(tools)?tools.filter(tool=>typeof tool=="string"):[])}setEnabledModels(patterns){this.globalSettings.enabledModels=patterns,this.markModified("enabledModels"),this.save()}getDoubleEscapeAction(){return this.settings.doubleEscapeAction??"tree"}setDoubleEscapeAction(action){this.globalSettings.doubleEscapeAction=action,this.markModified("doubleEscapeAction"),this.save()}getTreeFilterMode(){let mode=this.settings.treeFilterMode;return mode&&["default","no-tools","user-only","labeled-only","all"].includes(mode)?mode:"default"}setTreeFilterMode(mode){this.globalSettings.treeFilterMode=mode,this.markModified("treeFilterMode"),this.save()}getShowHardwareCursor(){return this.settings.showHardwareCursor??envValue("HARDWARE_CURSOR")==="1"}setShowHardwareCursor(enabled){this.globalSettings.showHardwareCursor=enabled,this.markModified("showHardwareCursor"),this.save()}getEditorPaddingX(){return this.settings.editorPaddingX??0}setEditorPaddingX(padding){this.globalSettings.editorPaddingX=Math.max(0,Math.min(3,Math.floor(padding))),this.markModified("editorPaddingX"),this.save()}getOutputPad(){return this.settings.outputPad===0?0:1}setOutputPad(padding){this.globalSettings.outputPad=padding,this.markModified("outputPad"),this.save()}getAutocompleteMaxVisible(){return this.settings.autocompleteMaxVisible??5}setAutocompleteMaxVisible(maxVisible){this.globalSettings.autocompleteMaxVisible=Math.max(3,Math.min(20,Math.floor(maxVisible))),this.markModified("autocompleteMaxVisible"),this.save()}getCodeBlockIndent(){return this.settings.markdown?.codeBlockIndent??" "}getMermaidRenderingMode(){let mode=this.settings.markdown?.mermaid;return mode==="off"||mode==="final"?mode:"streaming"}setMermaidRenderingMode(mode){this.globalSettings.markdown??={},this.globalSettings.markdown.mermaid=mode,this.markModified("markdown","mermaid"),this.save()}getWarnings(){return{...this.settings.warnings??{}}}setWarnings(warnings){this.globalSettings.warnings={...warnings},this.markModified("warnings"),this.save()}};export{require_undici,HTTP_IDLE_TIMEOUT_CHOICES,formatHttpIdleTimeoutMs,applyHttpProxySettings,configureHttpDispatcher,KIMI_CODE_RETRY_PROFILE,redactSensitiveOutput,redactSensitiveTokenValues,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,SYSTEM_THEME_NAME,setTerminalColors,setTerminalColorScheme,markTerminalColorsPending,Theme,getAvailableThemes,getAvailableThemesWithPaths,loadThemeFromPath,getThemeByName,parseAutoThemeSetting,resolveThemeSetting,getTerminalTheme,theme,setRegisteredThemes,initTheme,setTheme,setThemeInstance,onThemeChange,stopThemeWatcher,getResolvedThemeColors,getThemeExportColors,highlightCode,getLanguageFromPath,getMarkdownTheme,getSelectListTheme,getEditorTheme,getSettingsListTheme,takeOverStdout,restoreStdout,observeVisibleStderrWrites,takeOverStderr,restoreStderr,isStdoutTakenOver,writeRawStdout,waitForRawStdoutBackpressure,flushRawStdout,createFallbackCircuitAccess,acquireFallbackCircuits,monotonicNow,parseSettingsJson,TERMINAL_MOUSE_MODES,isTerminalMouseMode,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_TOOL_NAMES,wasSelfWrite,getSettingsPath,FileSettingsStorage,SettingsManager};
|
|
177
|
+
`||content[index]==="\r"?content[index]:" ")}if(!closed)throw new SyntaxError("Unterminated block comment in settings");continue}withoutComments.push(char)}let normalized=withoutComments;inString=!1,escaped=!1;for(let index=0;index<normalized.length;index+=1){let char=normalized[index];if(inString){escaped?escaped=!1:char==="\\"?escaped=!0:char==='"'&&(inString=!1);continue}if(char==='"'){inString=!0;continue}if(char!==",")continue;let nextIndex=index+1;for(;nextIndex<normalized.length&&/\s/.test(normalized[nextIndex]);)nextIndex+=1;(normalized[nextIndex]==="}"||normalized[nextIndex]==="]")&&(normalized[index]=" ")}let parsed=JSON.parse(normalized.join(""));if(typeof parsed!="object"||parsed===null||Array.isArray(parsed))throw new TypeError("Settings must contain a JSON object");return parsed}function isRecord(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function withoutOverride(overrides,field,nestedKey){if(!(field in overrides))return overrides;let next={...overrides},current=next[field];if(nestedKey===void 0||!isRecord(current))return delete next[field],next;if(!(nestedKey in current))return overrides;let nested={...current};return delete nested[nestedKey],Object.keys(nested).length===0?delete next[field]:next[field]=nested,next}var RETIRED_NESTED_KEYS=[["experimental","sharedHost"]];function removeRetiredSettingsKeys(raw){let removed=!1;for(let[parent,key]of RETIRED_NESTED_KEYS){let container=raw[parent];if(typeof container!="object"||container===null||Array.isArray(container)||!(key in container))continue;let remaining={...container};delete remaining[key],Object.keys(remaining).length===0?delete raw[parent]:raw[parent]=remaining,removed=!0}return removed}var failedRewrites=new Set;function writeRawScopedSettings(storage,scope){let target=storage.selectSource?.(scope)?.path??storage;if(!failedRewrites.has(target))try{storage.withLock(scope,current=>{if(!current)return;let raw=parseSettingsJson(current);return removeRetiredSettingsKeys(raw)?JSON.stringify(raw,null,2):void 0})}catch(error){failedRewrites.add(target);let detail=error instanceof Error?`${error.name}: ${error.message}`:String(error);try{appendDebugLogEntry(`settings: could not remove retired ${scope} settings keys`,detail)}catch{}}}var TERMINAL_MOUSE_MODES=["off","whilePending","always"];function isTerminalMouseMode(value){return value==="off"||value==="whilePending"||value==="always"}var DEFAULT_STREAM_START_TIMEOUT_MS=3e5,DEFAULT_PROVIDER_STREAM_RETRY_TIMEOUT_MS=3e4,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS=2e3,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS=1e4,THINKING_LEVEL_VALUES=new Set(["off","minimal","low","medium","high","xhigh","max"]),MODEL_SERVICE_TIER_VALUES=new Set(["auto","flex","priority"]);function modelMemoryKey(provider,modelId){return`${provider}/${modelId}`}function readModelMemoryEntry(map,key,allowed){if(typeof map!="object"||map===null||Array.isArray(map))return;let value=map[key];return typeof value=="string"&&allowed.has(value)?value:void 0}function isMergeableObject(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}function deepMergeObjects(base,overrides){let result={...base};for(let key of Object.keys(overrides)){let overrideValue=overrides[key];if(overrideValue===void 0)continue;let baseValue=base[key];result[key]=isMergeableObject(baseValue)&&isMergeableObject(overrideValue)?deepMergeObjects(baseValue,overrideValue):overrideValue}return result}var DEFAULT_TOOL_NAMES=["read","bash","edit","write","grep"];function isToolModifier(entry){return typeof entry=="string"&&(entry.startsWith("+")||entry.startsWith("-"))}function mergeDefaultTools(base,overrides){return overrides===void 0?base:!Array.isArray(base)||!Array.isArray(overrides)||!overrides.every(isToolModifier)?overrides:[...base,...overrides]}function resolveDefaultTools(entries){let plain=entries.filter(entry=>!isToolModifier(entry)),tools=plain.length>0||entries.length===0?plain:[...DEFAULT_TOOL_NAMES];for(let entry of entries){if(!isToolModifier(entry))continue;let name=entry.slice(1),index=tools.indexOf(name);entry.startsWith("+")&&index===-1&&name?tools.push(name):entry.startsWith("-")&&index!==-1&&tools.splice(index,1)}return tools}function deepMergeSettings(base,overrides){let merged=deepMergeObjects(base,overrides);overrides.retry?.fallbackChains!==void 0&&(merged.retry={...merged.retry,fallbackChains:structuredClone(overrides.retry.fallbackChains)});let defaultTools=mergeDefaultTools(base.defaultTools,overrides.defaultTools);return defaultTools===void 0?merged:{...merged,defaultTools}}function resolveAskUserTimeoutMinutes(value){return typeof value!="number"||!Number.isFinite(value)?30:Math.min(120,Math.max(1,Math.floor(value)))}function parseTimeoutSetting(value,settingName){let timeoutMs=parseHttpIdleTimeoutMs(value);if(timeoutMs!==void 0)return timeoutMs;if(value!==void 0)throw new Error(`Invalid ${settingName} setting: ${String(value)}`)}var SELF_WRITE_TTL_MS=15e3,MAX_SELF_WRITES_PER_PATH=8,selfWritesByPath=new Map,selfWriteClock=Date.now;function recordSelfWrite(absPath,content){let now=selfWriteClock(),writes=selfWritesByPath.get(absPath)??new Map;for(let[hash2,recordedAt]of writes)now-recordedAt>SELF_WRITE_TTL_MS&&writes.delete(hash2);let hash=createHash("sha256").update(content).digest("hex");for(writes.delete(hash),writes.set(hash,now);writes.size>MAX_SELF_WRITES_PER_PATH;){let oldestHash=writes.keys().next().value;if(oldestHash===void 0)break;writes.delete(oldestHash)}selfWritesByPath.set(absPath,writes)}function wasSelfWrite(absPath,hash){let writes=selfWritesByPath.get(absPath);if(!writes)return!1;let now=selfWriteClock();for(let[trackedHash,recordedAt]of writes)now-recordedAt>SELF_WRITE_TTL_MS&&writes.delete(trackedHash);return writes.delete(hash)?(writes.size===0&&selfWritesByPath.delete(absPath),!0):(writes.size===0&&selfWritesByPath.delete(absPath),!1)}function getSettingsDirectory(cwd,agentDir,scope,homeDir){if(scope==="global")return resolvePath(agentDir);let resolvedCwd=resolvePath(cwd);return findNearestParentConfigDir(resolvedCwd,homeDir,CONFIG_DIR_NAME)??join2(resolvedCwd,CONFIG_DIR_NAME)}function resolveSettingsSource(cwd,agentDir,scope,homeDir=homedir()){let directory=getSettingsDirectory(cwd,agentDir,scope,homeDir),jsoncPath=join2(directory,"settings.jsonc");if(existsSync2(jsoncPath))return{path:jsoncPath,format:"jsonc",reason:"explicit-jsonc",scope};let jsonPath=join2(directory,"settings.json");if(existsSync2(jsonPath))return{path:jsonPath,format:"json",reason:"json-only",scope}}function getSettingsPath(cwd,agentDir,scope,homeDir=homedir()){return resolveSettingsSource(cwd,agentDir,scope,homeDir)?.path??join2(getSettingsDirectory(cwd,agentDir,scope,homeDir),"settings.json")}function getInMemorySettingsPath(scope){return scope==="global"?"/__senpi_in_memory__/settings.json":"/__senpi_in_memory__/.senpi/settings.json"}function toSettingsError(scope,error,path3){return{scope,...path3?{path:path3}:{},error:error instanceof Error?error:new Error(String(error))}}var SettingsLockBusy=class extends Error{},FileSettingsStorage=class{constructor(cwd,agentDir,homeDir=homedir()){this.cwd=cwd,this.agentDir=agentDir,this.homeDir=homeDir,this.globalSettingsPath=getSettingsPath(cwd,agentDir,"global",homeDir),this.projectSettingsPath=getSettingsPath(cwd,agentDir,"project",homeDir)}selectSource(scope){let source2=resolveSettingsSource(this.cwd,this.agentDir,scope,this.homeDir),path3=source2?.path??join2(getSettingsDirectory(this.cwd,this.agentDir,scope,this.homeDir),"settings.json");return scope==="global"?this.globalSettingsPath=path3:this.projectSettingsPath=path3,source2}tryAcquireLockSync(path3){try{return import_proper_lockfile.default.lockSync(path3,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error){throw isLockError(error)?new SettingsLockBusy:error}}acquireLockSyncWithRetry(path3){let startedAt=Date.now(),attempt=0;for(;;)try{return import_proper_lockfile.default.lockSync(path3,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error){if(!isLockError(error))throw error;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_SYNC_LOCK_BUDGET_MS)throw new CredentialStoreBusyError(path3,waitedMs,error);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_SYNC_LOCK_BUDGET_MS-waitedMs);attempt++;let sleeper=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(sleeper,0,0,delayMs)}}async acquireLockWithRetry(path3){let startedAt=Date.now(),attempt=0;for(;;)try{return await import_proper_lockfile.default.lock(path3,{...FILE_STORAGE_LOCK_OPTIONS,retries:0})}catch(error){if(!isLockError(error))throw error;let waitedMs=Date.now()-startedAt;if(waitedMs>=FILE_STORAGE_LOCK_RETRY_BUDGET_MS)throw new CredentialStoreBusyError(path3,waitedMs,error);let delayMs=Math.min(FILE_STORAGE_LOCK_RETRY_MIN_DELAY_MS*2**attempt,FILE_STORAGE_LOCK_RETRY_MAX_DELAY_MS,FILE_STORAGE_LOCK_RETRY_BUDGET_MS-waitedMs);attempt++,await new Promise(resolve2=>setTimeout(resolve2,delayMs))}}async withLockAsync(scope,fn,underLock){let path3=scope==="global"?this.globalSettingsPath:this.projectSettingsPath,readCurrent=async()=>{try{return await readFile(path3,"utf-8")}catch(error){if(error.code==="ENOENT")return;throw error}},current=await readCurrent(),next=fn(current);if(next===void 0)return;await mkdir(dirname2(path3),{recursive:!0});let release=await this.acquireLockWithRetry(path3);try{underLock?.();let lockedContent=await readCurrent();if(lockedContent!==current&&(next=fn(lockedContent)),next!==void 0){let tempPath=`${path3}.${process.pid}.${randomUUID()}.tmp`;try{await writeFile(tempPath,next,"utf-8"),await rename(tempPath,path3),recordSelfWrite(path3,next)}catch(error){throw await rm(tempPath,{force:!0}),error}}}finally{await release()}}tryWithLock(scope,fn){try{return this.withLock(scope,fn,!1),!0}catch(error){if(error instanceof SettingsLockBusy)return!1;throw error}}withLock(scope,fn,waitForLock=!0){let path3=scope==="global"?this.globalSettingsPath:this.projectSettingsPath,dir=dirname2(path3),current=existsSync2(path3)?readFileSync2(path3,"utf-8"):void 0,next=fn(current);if(next===void 0)return;existsSync2(dir)||mkdirSync2(dir,{recursive:!0});let release=waitForLock?this.acquireLockSyncWithRetry(path3):this.tryAcquireLockSync(path3);try{let underLock=existsSync2(path3)?readFileSync2(path3,"utf-8"):void 0;if(underLock!==current&&(next=fn(underLock)),next!==void 0){let tempPath=`${path3}.${process.pid}.${randomUUID()}.tmp`;try{writeFileSync(tempPath,next,"utf-8"),recordSelfWrite(path3,next),renameSync(tempPath,path3)}catch(error){throw rmSync(tempPath,{force:!0}),error}}}finally{release()}}},InMemorySettingsStorage=class{withLock(scope,fn){let current=scope==="global"?this.global:this.project,next=fn(current);next!==void 0&&(scope==="global"?this.global=next:this.project=next,recordSelfWrite(getInMemorySettingsPath(scope),next))}},SettingsManager=class _SettingsManager{constructor(storage,initialGlobal,initialProject,globalLoadError=null,projectLoadError=null,initialErrors=[],projectTrusted=!0,initialSources=[],settingsPaths={}){this.runtimeOverrides={},this.modifiedFields=new Set,this.modifiedNestedFields=new Map,this.modifiedProjectFields=new Set,this.modifiedProjectNestedFields=new Map,this.globalSettingsLoadError=null,this.projectSettingsLoadError=null,this.writeQueue=Promise.resolve(),this.selectedSources=new Map,this.sourceListeners=[],this.providerSettingsListeners=new Set,this.storage=storage,this.globalSettings=initialGlobal,this.projectSettings=initialProject,this.projectTrusted=projectTrusted,this.globalSettingsLoadError=globalLoadError,this.projectSettingsLoadError=projectLoadError,this.errors=[...initialErrors],this.settingsPaths=settingsPaths;for(let source2 of initialSources)this.selectedSources.set(source2.scope,source2);this.settings=deepMergeSettings(this.globalSettings,this.projectSettings)}static create(cwd,agentDir=getAgentDir(),options={}){let storage=new FileSettingsStorage(cwd,agentDir);return _SettingsManager.fromStorage(storage,options)}static fromStorage(storage,options={}){let projectTrusted=options.projectTrusted??!0,initialSources=[],settingsPaths={},globalSource=storage.selectSource?.("global");globalSource&&(initialSources.push(globalSource),settingsPaths.global=globalSource.path);let globalLoad=_SettingsManager.tryLoadFromStorage(storage,"global"),projectSource=projectTrusted?storage.selectSource?.("project"):void 0;projectSource&&(initialSources.push(projectSource),settingsPaths.project=projectSource.path);let projectLoad=_SettingsManager.tryLoadFromStorage(storage,"project",projectTrusted),initialErrors=[];return globalLoad.error&&initialErrors.push(toSettingsError("global",globalLoad.error,settingsPaths.global)),projectLoad.error&&initialErrors.push(toSettingsError("project",projectLoad.error,settingsPaths.project)),new _SettingsManager(storage,globalLoad.settings,projectLoad.settings,globalLoad.error,projectLoad.error,initialErrors,projectTrusted,initialSources,settingsPaths)}static inMemory(settings={},options={}){let storage=new InMemorySettingsStorage,initialSettings=_SettingsManager.migrateSettings(structuredClone(settings));return storage.withLock("global",()=>JSON.stringify(initialSettings,null,2)),_SettingsManager.fromStorage(storage,options)}static loadFromStorage(storage,scope,projectTrusted=!0){if(scope==="project"&&!projectTrusted)return{};let content;if(storage.withLock(scope,current=>{content=current}),!content)return{};let raw=parseSettingsJson(content);return removeRetiredSettingsKeys(raw)&&scope==="global"&&writeRawScopedSettings(storage,scope),_SettingsManager.migrateSettings(raw)}static tryLoadFromStorage(storage,scope,projectTrusted=!0){try{return{settings:_SettingsManager.loadFromStorage(storage,scope,projectTrusted),error:null}}catch(error){return{settings:{},error}}}static migrateSettings(settings){if("queueMode"in settings&&!("steeringMode"in settings)&&(settings.steeringMode=settings.queueMode,delete settings.queueMode),!("transport"in settings)&&typeof settings.websockets=="boolean"&&(settings.transport=settings.websockets?"websocket":"sse",delete settings.websockets),"skills"in settings&&typeof settings.skills=="object"&&settings.skills!==null&&!Array.isArray(settings.skills)){let skillsSettings=settings.skills;skillsSettings.enableSkillCommands!==void 0&&settings.enableSkillCommands===void 0&&(settings.enableSkillCommands=skillsSettings.enableSkillCommands),Array.isArray(skillsSettings.customDirectories)&&skillsSettings.customDirectories.length>0?settings.skills=skillsSettings.customDirectories:delete settings.skills}if("retry"in settings&&typeof settings.retry=="object"&&settings.retry!==null&&!Array.isArray(settings.retry)){let retrySettings=settings.retry,providerSettings=typeof retrySettings.provider=="object"&&retrySettings.provider!==null?retrySettings.provider:void 0;typeof retrySettings.maxDelayMs=="number"&&(providerSettings?.maxRetryDelayMs===void 0||providerSettings?.maxRetryDelayMs===null)&&(retrySettings.provider={...providerSettings??{},maxRetryDelayMs:retrySettings.maxDelayMs}),delete retrySettings.maxDelayMs}return _SettingsManager.migrateRenamedProviderIds(settings),settings}static providerSettingsKey(providerId){return`${providerId.split("-").map((part,i)=>i===0?part:part.charAt(0).toUpperCase()+part.slice(1)).join("")}Provider`}static migrateRenamedProviderIds(settings){for(let[legacyId,canonicalId]of Object.entries(LEGACY_PROVIDER_IDS)){let legacyKey=_SettingsManager.providerSettingsKey(legacyId),canonicalKey=_SettingsManager.providerSettingsKey(canonicalId);legacyKey in settings&&!(canonicalKey in settings)&&(settings[canonicalKey]=settings[legacyKey],delete settings[legacyKey])}typeof settings.defaultProvider=="string"&&(settings.defaultProvider=normalizeProviderId(settings.defaultProvider)),typeof settings.defaultModel=="string"&&(settings.defaultModel=normalizeModelRef(settings.defaultModel)),Array.isArray(settings.favoriteModels)&&(settings.favoriteModels=settings.favoriteModels.map(entry=>typeof entry=="string"?normalizeModelRef(entry):entry));for(let field of["modelThinkingLevels","modelServiceTiers","modelLastOnThinkingLevels"]){let map=settings[field];typeof map=="object"&&map!==null&&!Array.isArray(map)&&(settings[field]=_SettingsManager.rekeyByModelRef(map))}if(typeof settings.retry=="object"&&settings.retry!==null&&!Array.isArray(settings.retry)){let retry=settings.retry,chains=retry.fallbackChains;if(typeof chains=="object"&&chains!==null&&!Array.isArray(chains)){let rekeyed={};for(let[key,rungs]of Object.entries(chains)){let nextRungs=Array.isArray(rungs)?rungs.map(rung=>typeof rung=="string"?normalizeModelRef(rung):rung):rungs;rekeyed[normalizeModelRef(key)]=nextRungs}retry.fallbackChains=rekeyed}}}static rekeyByModelRef(map){let out={};for(let[key,value]of Object.entries(map))out[normalizeModelRef(key)]=value;return out}getSettings(){return structuredClone(this.settings)}getGlobalSettings(){return structuredClone(this.globalSettings)}getProjectSettings(){return structuredClone(this.projectSettings)}getProviderSettings(){return structuredClone(this.settings.providers??{})}getProviderConcurrencyLimit(providerId){let value=readByProviderId(this.settings.providers,providerId)?.maxConcurrency;return typeof value=="number"&&Number.isInteger(value)&&value>0?value:1/0}subscribeToProviderSettings(listener){return this.providerSettingsListeners.add(listener),()=>this.providerSettingsListeners.delete(listener)}updateSettings(settings){this.settings=settings;for(let listener of this.providerSettingsListeners)listener()}getPromptCacheGoalBackstopMaxSeconds(){return this.projectSettings.promptCache?.goalBackstopMaxSeconds??this.globalSettings.promptCache?.goalBackstopMaxSeconds??270}getPromptCacheKeepAliveSettings(){let configured=this.settings.promptCache?.keepAlive;return{enabled:configured?.enabled??!1,maxRequestsPerSession:configured?.maxRequestsPerSession??3,maxCostUsdPerSession:configured?.maxCostUsdPerSession??.05,marginSeconds:configured?.marginSeconds??60}}getAskUserSettings(){let configured=this.settings.askUser;return{enabled:typeof configured?.enabled=="boolean"?configured.enabled:!0,timeoutMinutes:resolveAskUserTimeoutMinutes(configured?.timeoutMinutes),bell:typeof configured?.bell=="boolean"?configured.bell:!0}}getTodoFirstTurnPlan(){let configured=this.settings.todo?.firstTurnPlan;return configured==="remind"||configured==="off"?configured:"force"}getTodoTurnEndBackstop(){let configured=this.settings.todo?.turnEndBackstop;return typeof configured=="boolean"?configured:!0}isProjectTrusted(){return this.projectTrusted}setProjectTrusted(trusted){if(this.projectTrusted===trusted)return;if(this.projectTrusted=trusted,this.modifiedProjectFields.clear(),this.modifiedProjectNestedFields.clear(),!trusted){this.projectSettings={},this.projectSettingsLoadError=null,this.updateSettings(this.mergedSettings());return}this.selectAndPublishSource("project");let projectLoad=_SettingsManager.tryLoadFromStorage(this.storage,"project",trusted);this.projectSettings=projectLoad.settings,this.projectSettingsLoadError=projectLoad.error,projectLoad.error&&this.recordError("project",projectLoad.error),this.updateSettings(this.mergedSettings())}async reload(){await this.writeQueue,this.selectAndPublishSource("global");let globalLoad=_SettingsManager.tryLoadFromStorage(this.storage,"global");globalLoad.error?(this.globalSettingsLoadError=globalLoad.error,this.recordError("global",globalLoad.error)):(this.globalSettings=globalLoad.settings,this.globalSettingsLoadError=null),this.modifiedFields.clear(),this.modifiedNestedFields.clear(),this.modifiedProjectFields.clear(),this.modifiedProjectNestedFields.clear(),this.projectTrusted&&this.selectAndPublishSource("project");let projectLoad=_SettingsManager.tryLoadFromStorage(this.storage,"project",this.projectTrusted);projectLoad.error?(this.projectSettingsLoadError=projectLoad.error,this.recordError("project",projectLoad.error)):(this.projectSettings=projectLoad.settings,this.projectSettingsLoadError=null),this.updateSettings(this.mergedSettings())}getSelectedSettingsSources(){return[...this.selectedSources.values()].map(source2=>({...source2}))}subscribeToSourceSelection(listener){return this.sourceListeners.push(listener),()=>{let index=this.sourceListeners.indexOf(listener);index!==-1&&this.sourceListeners.splice(index,1)}}selectAndPublishSource(scope){let source2=this.storage.selectSource?.(scope);if(!source2){this.selectedSources.delete(scope);return}this.selectedSources.set(scope,source2);for(let listener of this.sourceListeners)listener({...source2})}applyOverrides(overrides){this.runtimeOverrides=deepMergeSettings(this.runtimeOverrides,overrides),this.updateSettings(this.mergedSettings())}mergedSettings(){return deepMergeSettings(deepMergeSettings(this.globalSettings,this.projectSettings),this.runtimeOverrides)}markModified(field,nestedKey){this.runtimeOverrides=withoutOverride(this.runtimeOverrides,field,nestedKey),this.modifiedFields.add(field),nestedKey&&(this.modifiedNestedFields.has(field)||this.modifiedNestedFields.set(field,new Set),this.modifiedNestedFields.get(field).add(nestedKey))}markProjectModified(field,nestedKey){this.runtimeOverrides=withoutOverride(this.runtimeOverrides,field,nestedKey),this.modifiedProjectFields.add(field),nestedKey&&(this.modifiedProjectNestedFields.has(field)||this.modifiedProjectNestedFields.set(field,new Set),this.modifiedProjectNestedFields.get(field).add(nestedKey))}assertProjectTrustedForWrite(){if(!this.projectTrusted)throw new Error("Project is not trusted; refusing to write project settings")}recordError(scope,error){let normalizedError=error instanceof Error?error:new Error(String(error));this.errors.push(toSettingsError(scope,normalizedError,this.settingsPaths[scope]))}clearModifiedScope(scope){if(scope==="global"){this.modifiedFields.clear(),this.modifiedNestedFields.clear();return}this.modifiedProjectFields.clear(),this.modifiedProjectNestedFields.clear()}enqueueWrite(scope,task){this.writeQueue=this.writeQueue.then(async()=>{scope==="project"&&this.assertProjectTrustedForWrite(),await task(),this.clearModifiedScope(scope)}).catch(error=>{this.recordError(scope,error)})}cloneModifiedNestedFields(source2){let snapshot=new Map;for(let[key,value]of source2.entries())snapshot.set(key,new Set(value));return snapshot}persistScopedSettings(scope,snapshotSettings,modifiedFields,modifiedNestedFields){let merge=current=>{let currentFileSettings=current?_SettingsManager.migrateSettings(parseSettingsJson(current)):{},mergedSettings={...currentFileSettings};for(let field of modifiedFields){let value=snapshotSettings[field];if(modifiedNestedFields.has(field)&&typeof value=="object"&&value!==null){let nestedModified=modifiedNestedFields.get(field),baseNested=currentFileSettings[field]??{},inMemoryNested=value,mergedNested={...baseNested};for(let nestedKey of nestedModified)mergedNested[nestedKey]=inMemoryNested[nestedKey];mergedSettings[field]=mergedNested}else mergedSettings[field]=value}return JSON.stringify(mergedSettings,null,2)},storage=this.storage;if(!storage.withLockAsync||!storage.tryWithLock){storage.withLock(scope,merge);return}if(!storage.tryWithLock(scope,merge))return storage.withLockAsync(scope,merge,scope==="project"?()=>this.assertProjectTrustedForWrite():void 0)}save(){if(this.updateSettings(this.mergedSettings()),this.globalSettingsLoadError)return;let snapshotGlobalSettings=structuredClone(this.globalSettings),modifiedFields=new Set(this.modifiedFields),modifiedNestedFields=this.cloneModifiedNestedFields(this.modifiedNestedFields);this.enqueueWrite("global",()=>this.persistScopedSettings("global",snapshotGlobalSettings,modifiedFields,modifiedNestedFields))}saveProjectSettings(settings){if(this.assertProjectTrustedForWrite(),this.projectSettings=structuredClone(settings),this.updateSettings(this.mergedSettings()),this.projectSettingsLoadError)return;let snapshotProjectSettings=structuredClone(this.projectSettings),modifiedFields=new Set(this.modifiedProjectFields),modifiedNestedFields=this.cloneModifiedNestedFields(this.modifiedProjectNestedFields);this.enqueueWrite("project",()=>this.persistScopedSettings("project",snapshotProjectSettings,modifiedFields,modifiedNestedFields))}updateProjectSettings(field,update){this.assertProjectTrustedForWrite();let projectSettings=structuredClone(this.projectSettings);update(projectSettings),this.markProjectModified(field),this.saveProjectSettings(projectSettings)}async flush(){await this.writeQueue}drainErrors(){let drained=[...this.errors];return this.errors=[],drained}getLastChangelogVersion(){return this.settings.lastChangelogVersion}setLastChangelogVersion(version){this.globalSettings.lastChangelogVersion=version,this.markModified("lastChangelogVersion"),this.save()}getChangelogSeen(source2="engine"){return this.settings.changelogSeen?.[source2]??(source2==="engine"?this.settings.lastChangelogVersion:void 0)}setChangelogSeen(source2,version){!source2||this.globalSettings.changelogSeen?.[source2]===version||(this.globalSettings.changelogSeen={...this.globalSettings.changelogSeen??{},[source2]:version},this.markModified("changelogSeen",source2),this.save())}getSessionDir(){let sessionDir=this.settings.sessionDir;return sessionDir&&normalizePath(sessionDir)}getDefaultProvider(){return this.settings.defaultProvider}getDefaultModel(){return this.settings.defaultModel}setDefaultProvider(provider){this.globalSettings.defaultProvider=provider,this.markModified("defaultProvider"),this.save()}setDefaultModel(modelId){this.globalSettings.defaultModel=modelId,this.markModified("defaultModel"),this.save()}setDefaultModelAndProvider(provider,modelId){this.globalSettings.defaultProvider=provider,this.globalSettings.defaultModel=modelId,this.markModified("defaultProvider"),this.markModified("defaultModel"),this.save()}getSteeringMode(){return this.settings.steeringMode||"all"}setSteeringMode(mode){this.globalSettings.steeringMode=mode,this.markModified("steeringMode"),this.save()}getFollowUpMode(){return this.settings.followUpMode||"one-at-a-time"}setFollowUpMode(mode){this.globalSettings.followUpMode=mode,this.markModified("followUpMode"),this.save()}getThemeSetting(){let value=this.settings.theme;if(typeof value=="string")return value}getTheme(){let theme2=this.getThemeSetting();return theme2?.includes("/")?void 0:theme2}setTheme(theme2){this.globalSettings.theme=theme2,this.markModified("theme"),this.save()}getDefaultThinkingLevel(){return this.settings.defaultThinkingLevel}setDefaultThinkingLevel(level){this.globalSettings.defaultThinkingLevel=level,this.markModified("defaultThinkingLevel"),this.save()}getAllModelThinkingLevels(){return{...this.settings.modelThinkingLevels??{}}}getModelThinkingLevel(provider,modelId){return readModelMemoryEntry(this.settings.modelThinkingLevels,modelMemoryKey(provider,modelId),THINKING_LEVEL_VALUES)}setModelThinkingLevel(provider,modelId,level,options={}){let key=modelMemoryKey(provider,modelId),existing=this.globalSettings.modelThinkingLevels,map=typeof existing=="object"&&existing!==null&&!Array.isArray(existing)?{...existing}:{};level===void 0?delete map[key]:map[key]=level,this.globalSettings.modelThinkingLevels=map,this.markModified("modelThinkingLevels",key),level!=="off"&&!options.preserveLastOn&&this.updateModelLastOnThinkingLevel(key,level),this.save()}getModelLastOnThinkingLevel(provider,modelId){let level=readModelMemoryEntry(this.settings.modelLastOnThinkingLevels,modelMemoryKey(provider,modelId),THINKING_LEVEL_VALUES);return level==="off"?void 0:level}setModelLastOnThinkingLevel(provider,modelId,level){this.updateModelLastOnThinkingLevel(modelMemoryKey(provider,modelId),level==="off"?void 0:level),this.save()}updateModelLastOnThinkingLevel(key,level){let existing=this.globalSettings.modelLastOnThinkingLevels,map=typeof existing=="object"&&existing!==null&&!Array.isArray(existing)?{...existing}:{};level===void 0?delete map[key]:map[key]=level,this.globalSettings.modelLastOnThinkingLevels=map,this.markModified("modelLastOnThinkingLevels",key)}getModelServiceTier(provider,modelId){return readModelMemoryEntry(this.settings.modelServiceTiers,modelMemoryKey(provider,modelId),MODEL_SERVICE_TIER_VALUES)}setModelServiceTier(provider,modelId,tier){let key=modelMemoryKey(provider,modelId),existing=this.globalSettings.modelServiceTiers,map=typeof existing=="object"&&existing!==null&&!Array.isArray(existing)?{...existing}:{};tier===void 0?delete map[key]:map[key]=tier,this.globalSettings.modelServiceTiers=map,this.markModified("modelServiceTiers",key),this.save()}getTransport(){return this.settings.transport??"auto"}getOpenAIServiceTier(){return this.settings.openai?.serviceTier}setTransport(transport){this.globalSettings.transport=transport,this.markModified("transport"),this.save()}getCompactionEnabled(){return compactionEnabled(this.settings.compaction)}setCompactionEnabled(enabled){this.globalSettings.compaction||(this.globalSettings.compaction={}),this.globalSettings.compaction.enabled=enabled,this.markModified("compaction","enabled"),this.save()}getCompactionReserveTokens(forModel){return compactionReserveTokens(this.settings.compaction,forModel)}getCompactionKeepRecentTokens(forModel){return compactionKeepRecentTokens(this.settings.compaction,forModel)}getCompactionSettings(forModel){return{...resolveCompactionSettings(this.settings.compaction,forModel),model:this.settings.compaction?.model}}getBranchSummarySettings(){return{reserveTokens:this.settings.branchSummary?.reserveTokens??16384,skipPrompt:this.settings.branchSummary?.skipPrompt??!1}}getBranchSummarySkipPrompt(){return this.settings.branchSummary?.skipPrompt??!1}getRetryEnabled(){return this.settings.retry?.enabled??!0}setRetryEnabled(enabled){this.globalSettings.retry||(this.globalSettings.retry={}),this.globalSettings.retry.enabled=enabled,this.markModified("retry","enabled"),this.save()}isRetryMaxAgentDelayMsConfigured(){return this.settings.retry?.maxAgentDelayMs!==void 0}getRetrySettings(){return{enabled:this.getRetryEnabled(),maxRetries:this.settings.retry?.maxRetries??SENPI_DEFAULT_RETRY_PROFILE.turn.maxRetries,baseDelayMs:this.settings.retry?.baseDelayMs??2e3,maxAgentDelayMs:this.settings.retry?.maxAgentDelayMs??DEFAULT_MAX_AGENT_RETRY_DELAY_MS}}getAbortServerSideFallback(){return resolveAbortServerSideFallback(this.settings.retry)}getRawFallbackChains(){return this.settings.retry?.fallbackChains}getFallbackChainsScope(){if(this.projectSettings.retry?.fallbackChains!==void 0)return"project";if(this.globalSettings.retry?.fallbackChains!==void 0)return"global"}getRetryFallbackSettings(){return resolveRetryFallbackSettings(this.settings.retry)}getFallbackCircuitSettings(){return resolveFallbackCircuitSettings(this.settings.fallback)}getHintPolicySettings(){return resolveHintPolicySettings(this.settings.retry)}setFallbackChain(key,entries){this.globalSettings.retry||(this.globalSettings.retry={});let chains=this.getGlobalFallbackChains();this.globalSettings.retry.fallbackChains={...chains,[key]:[...entries]},this.markModified("retry","fallbackChains"),this.save()}removeFallbackChain(key){let chains=this.getGlobalFallbackChains();key in chains&&(this.globalSettings.retry||(this.globalSettings.retry={}),delete chains[key],this.globalSettings.retry.fallbackChains=chains,this.markModified("retry","fallbackChains"),this.save())}setModelFallbackEnabled(enabled){this.globalSettings.retry||(this.globalSettings.retry={}),this.globalSettings.retry.modelFallback=enabled,this.markModified("retry","modelFallback"),this.save()}setFallbackRevertPolicy(policy){this.globalSettings.retry||(this.globalSettings.retry={}),this.globalSettings.retry.fallbackRevertPolicy=policy,this.markModified("retry","fallbackRevertPolicy"),this.save()}getGlobalFallbackChains(){let fallbackChains=this.globalSettings.retry?.fallbackChains;if(typeof fallbackChains!="object"||fallbackChains===null||Array.isArray(fallbackChains))return{};let chains={};for(let[key,entries]of Object.entries(fallbackChains))Array.isArray(entries)&&entries.every(entry=>typeof entry=="string")&&(chains[key]=[...entries]);return chains}getHttpIdleTimeoutMs(){return parseTimeoutSetting(this.settings.httpIdleTimeoutMs,"httpIdleTimeoutMs")??DEFAULT_HTTP_IDLE_TIMEOUT_MS}setHttpIdleTimeoutMs(timeoutMs){if(!Number.isFinite(timeoutMs)||timeoutMs<0)throw new Error(`Invalid httpIdleTimeoutMs setting: ${String(timeoutMs)}`);this.globalSettings.httpIdleTimeoutMs=Math.floor(timeoutMs),this.markModified("httpIdleTimeoutMs"),this.save()}getSessionShutdownHandlerWarnMs(){return parseTimeoutSetting(this.settings.sessionShutdownHandlerWarnMs,"sessionShutdownHandlerWarnMs")??DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS}setSessionShutdownHandlerWarnMs(warnMs){if(!Number.isFinite(warnMs)||warnMs<0)throw new Error(`Invalid sessionShutdownHandlerWarnMs setting: ${String(warnMs)}`);this.globalSettings.sessionShutdownHandlerWarnMs=Math.floor(warnMs),this.markModified("sessionShutdownHandlerWarnMs"),this.save()}getSessionShutdownHandlerTimeoutMs(){return parseTimeoutSetting(this.settings.sessionShutdownHandlerTimeoutMs,"sessionShutdownHandlerTimeoutMs")??DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS}setSessionShutdownHandlerTimeoutMs(timeoutMs){if(!Number.isFinite(timeoutMs)||timeoutMs<0)throw new Error(`Invalid sessionShutdownHandlerTimeoutMs setting: ${String(timeoutMs)}`);this.globalSettings.sessionShutdownHandlerTimeoutMs=Math.floor(timeoutMs),this.markModified("sessionShutdownHandlerTimeoutMs"),this.save()}getProviderRetrySettings(){return{timeoutMs:this.settings.retry?.provider?.timeoutMs,maxRetries:this.settings.retry?.provider?.maxRetries,maxRetryDelayMs:this.settings.retry?.provider?.maxRetryDelayMs??6e4}}resolveRetryProfile(provider){let base=provider?.retryPolicy??SENPI_DEFAULT_RETRY_PROFILE,declared=provider?.retryPolicy!==void 0,turnBackoff={...base.turn.backoff};declared||this.settings.retry?.maxRetries!==void 0&&(turnBackoff.baseDelayMs=this.settings.retry.baseDelayMs??turnBackoff.baseDelayMs);let turnMaxRetries=base.turn.maxRetries,turnBaseDelayMs=turnBackoff.baseDelayMs;declared||(this.settings.retry?.maxRetries!==void 0&&(turnMaxRetries=this.settings.retry.maxRetries),this.settings.retry?.baseDelayMs!==void 0&&(turnBaseDelayMs=this.settings.retry.baseDelayMs));let providerOverride=this._resolveRetryProviderOverride(provider?.id);providerOverride?.turn?.maxRetries!==void 0&&(turnMaxRetries=providerOverride.turn.maxRetries),providerOverride?.turn?.baseDelayMs!==void 0&&(turnBaseDelayMs=providerOverride.turn.baseDelayMs);let turnEnabled=this.getRetryEnabled()?providerOverride?.turn?.enabled??base.turn.enabled:!1,tierStrategy=base.turn.serverHint.mode==="tiered"?base.turn.serverHint.strategy:()=>{throw new Error("not tiered")},turn={enabled:turnEnabled,maxRetries:turnMaxRetries,backoff:{...base.turn.backoff,baseDelayMs:turnBaseDelayMs},extractServerHint:base.turn.extractServerHint,serverHint:base.turn.serverHint.mode==="tiered"?{mode:"tiered",strategy:tierStrategy}:base.turn.serverHint,classify:base.turn.classify};return{id:base.id,providerRequest:base.providerRequest,turn,fallback:base.fallback}}_resolveRetryProviderOverride(providerId){if(providerId===void 0)return;let raw=this.settings.retry?.providers;if(raw===void 0)return;let{overrides}=validateRetryProviderOverrides(raw,new Set([providerId]));return overrides[providerId]}getProviderStreamRetryTimeoutMs(){let explicit=this.settings.retry?.provider?.streamRetryTimeoutMs;return explicit!==void 0?explicit>0?explicit:void 0:DEFAULT_PROVIDER_STREAM_RETRY_TIMEOUT_MS}getAgentStreamIdleTimeoutMs(){let providerTimeoutMs=this.settings.retry?.provider?.timeoutMs;if(providerTimeoutMs!==void 0)return providerTimeoutMs;let httpIdleTimeoutMs=this.getHttpIdleTimeoutMs();return httpIdleTimeoutMs===0?void 0:httpIdleTimeoutMs}getAgentStreamStartTimeoutMs(){let explicit=this.settings.retry?.provider?.streamStartTimeoutMs;if(explicit!==void 0)return explicit>0?explicit:void 0;let idleTimeoutMs=this.getAgentStreamIdleTimeoutMs();if(idleTimeoutMs!==void 0)return Math.min(DEFAULT_STREAM_START_TIMEOUT_MS,idleTimeoutMs)}getWebSocketConnectTimeoutMs(){return parseTimeoutSetting(this.settings.websocketConnectTimeoutMs,"websocketConnectTimeoutMs")}getHideThinkingBlock(){return this.settings.hideThinkingBlock??!1}getSmoothStreaming(){return this.settings.smoothStreaming??!0}getSmoothStreamingFps(){let fps=this.settings.smoothStreamingFps;return typeof fps!="number"||!Number.isFinite(fps)?60:Math.min(120,Math.max(30,fps))}getShowCacheMissNotices(){return this.settings.showCacheMissNotices??!1}getExternalEditorCommand(){let configuredEditor=this.settings.externalEditor;if(typeof configuredEditor=="string"&&configuredEditor.trim()!=="")return configuredEditor;let environmentEditor=process.env.VISUAL||process.env.EDITOR;return environmentEditor||(process.platform==="win32"?"notepad":"nano")}setHideThinkingBlock(hide){this.globalSettings.hideThinkingBlock=hide,this.markModified("hideThinkingBlock"),this.save()}setSmoothStreaming(enabled){this.globalSettings.smoothStreaming=enabled,this.markModified("smoothStreaming"),this.save()}setSmoothStreamingFps(fps){this.globalSettings.smoothStreamingFps=fps,this.markModified("smoothStreamingFps"),this.save()}setShowCacheMissNotices(show){this.globalSettings.showCacheMissNotices=show,this.markModified("showCacheMissNotices"),this.save()}getShellPath(){let shellPath=this.settings.shellPath;return shellPath&&normalizePath(shellPath)}setShellPath(path3){this.globalSettings.shellPath=path3,this.markModified("shellPath"),this.save()}getQuietStartup(){let value=this.settings.quietStartup;return value===!0||value==="header"?value:!1}setQuietStartup(quiet){this.globalSettings.quietStartup=quiet,this.markModified("quietStartup"),this.save()}getTipsEnabled(){return this.settings.tips??!0}getTipsHistory(){let history=this.settings.tipsHistory;return typeof history!="object"||history===null||Array.isArray(history)?{}:{...history}}setTipsHistory(history){this.globalSettings.tipsHistory=history,this.markModified("tipsHistory"),this.save()}setTipShown(tipId,timestamp){let history=this.getTipsHistory();history[tipId]=timestamp,this.globalSettings.tipsHistory=history,this.markModified("tipsHistory",tipId),this.save()}getDefaultProjectTrust(){let value=this.globalSettings.defaultProjectTrust;return value==="always"||value==="never"?value:"ask"}setDefaultProjectTrust(defaultProjectTrust){this.globalSettings.defaultProjectTrust=defaultProjectTrust,this.markModified("defaultProjectTrust"),this.save()}getShellCommandPrefix(){return this.settings.shellCommandPrefix}setShellCommandPrefix(prefix){this.globalSettings.shellCommandPrefix=prefix,this.markModified("shellCommandPrefix"),this.save()}getNpmCommand(){return this.settings.npmCommand?[...this.settings.npmCommand]:void 0}setNpmCommand(command){this.globalSettings.npmCommand=command?[...command]:void 0,this.markModified("npmCommand"),this.save()}getCollapseChangelog(){return this.settings.collapseChangelog??!1}setCollapseChangelog(collapse){this.globalSettings.collapseChangelog=collapse,this.markModified("collapseChangelog"),this.save()}getEnableInstallTelemetry(){return this.settings.enableInstallTelemetry??!0}setEnableInstallTelemetry(enabled){this.globalSettings.enableInstallTelemetry=enabled,this.markModified("enableInstallTelemetry"),this.save()}getEnableAnalytics(){return this.settings.enableAnalytics??!1}getTrackingId(){return this.settings.trackingId}setEnableAnalytics(enabled){this.globalSettings.enableAnalytics=enabled,this.markModified("enableAnalytics"),enabled&&!this.globalSettings.trackingId&&(this.globalSettings.trackingId=randomUUID(),this.markModified("trackingId")),this.save()}getOrCreateDeviceId(){return this.globalSettings.deviceId||(this.globalSettings.deviceId=randomUUID(),this.markModified("deviceId"),this.save()),this.globalSettings.deviceId}getPackages(){return[...this.settings.packages??[]]}getDisabledBuiltinExtensions(){return[...this.settings.disabledBuiltinExtensions??[]]}getEnabledBuiltinExtensions(){return this.settings.enabledBuiltinExtensions?[...this.settings.enabledBuiltinExtensions]:void 0}setPackages(packages){this.globalSettings.packages=packages,this.markModified("packages"),this.save()}setProjectPackages(packages){this.updateProjectSettings("packages",settings=>{settings.packages=packages})}getExtensionPaths(){return[...this.settings.extensions??[]]}setExtensionPaths(paths){this.globalSettings.extensions=paths,this.markModified("extensions"),this.save()}setProjectExtensionPaths(paths){this.updateProjectSettings("extensions",settings=>{settings.extensions=paths})}getSkillPaths(){return[...this.settings.skills??[]]}setSkillPaths(paths){this.globalSettings.skills=paths,this.markModified("skills"),this.save()}setProjectSkillPaths(paths){this.updateProjectSettings("skills",settings=>{settings.skills=paths})}getPromptTemplatePaths(){return[...this.settings.prompts??[]]}setPromptTemplatePaths(paths){this.globalSettings.prompts=paths,this.markModified("prompts"),this.save()}setProjectPromptTemplatePaths(paths){this.updateProjectSettings("prompts",settings=>{settings.prompts=paths})}getThemePaths(){return[...this.settings.themes??[]]}setThemePaths(paths){this.globalSettings.themes=paths,this.markModified("themes"),this.save()}setProjectThemePaths(paths){this.updateProjectSettings("themes",settings=>{settings.themes=paths})}getEnableSkillCommands(){return this.settings.enableSkillCommands??!0}getMaxSkillExpansionsPerPrompt(){let value=this.settings.maxSkillExpansionsPerPrompt;return typeof value=="number"&&Number.isInteger(value)&&value>0?value:MAX_SKILL_EXPANSIONS_PER_PROMPT}setEnableSkillCommands(enabled){this.globalSettings.enableSkillCommands=enabled,this.markModified("enableSkillCommands"),this.save()}getThinkingBudgets(){return this.settings.thinkingBudgets}getTerminalCapabilityOverrides(){let terminal=this.settings.terminal,imageSetting=terminal?.images,imageOverride=imageSetting!==void 0?imageSetting:envValue("IMAGE_PROTOCOL")?.toLowerCase(),trueColorSetting=terminal?.trueColor,trueColorOverride=trueColorSetting!==void 0?trueColorSetting:envValue("TRUE_COLOR"),hyperlinksSetting=terminal?.hyperlinks,hyperlinksOverride=hyperlinksSetting!==void 0?hyperlinksSetting:envValue("HYPERLINKS");return{...imageOverride==="kitty"||imageOverride==="iterm2"?{images:imageOverride}:imageOverride===!1||imageOverride==="none"||imageOverride==="0"?{images:null}:{},...typeof trueColorOverride=="boolean"?{trueColor:trueColorOverride}:trueColorOverride==="1"||trueColorOverride==="0"?{trueColor:trueColorOverride==="1"}:{},...typeof hyperlinksOverride=="boolean"?{hyperlinks:hyperlinksOverride}:hyperlinksOverride==="1"||hyperlinksOverride==="0"?{hyperlinks:hyperlinksOverride==="1"}:{}}}getShowImages(){return this.settings.terminal?.showImages??!0}setShowImages(show){this.globalSettings.terminal||(this.globalSettings.terminal={}),this.globalSettings.terminal.showImages=show,this.markModified("terminal","showImages"),this.save()}getImageWidthCells(){let width=this.settings.terminal?.imageWidthCells;return typeof width!="number"||!Number.isFinite(width)?60:Math.max(1,Math.floor(width))}setImageWidthCells(width){this.globalSettings.terminal||(this.globalSettings.terminal={}),this.globalSettings.terminal.imageWidthCells=Math.max(1,Math.floor(width)),this.markModified("terminal","imageWidthCells"),this.save()}getTerminalMouse(){let value=this.settings.terminal?.mouse;return isTerminalMouseMode(value)?value:"whilePending"}setTerminalMouse(mouse){if(!isTerminalMouseMode(mouse))throw new TypeError("Invalid terminal.mouse");this.globalSettings.terminal??={},this.globalSettings.terminal.mouse=mouse,this.markModified("terminal","mouse"),this.save()}getClearOnShrink(){return this.settings.terminal?.clearOnShrink!==void 0?this.settings.terminal.clearOnShrink:envValue("CLEAR_ON_SHRINK")==="1"}setClearOnShrink(enabled){this.globalSettings.terminal||(this.globalSettings.terminal={}),this.globalSettings.terminal.clearOnShrink=enabled,this.markModified("terminal","clearOnShrink"),this.save()}getShowTerminalProgress(){return this.settings.terminal?.showTerminalProgress??!1}setShowTerminalProgress(enabled){this.globalSettings.terminal||(this.globalSettings.terminal={}),this.globalSettings.terminal.showTerminalProgress=enabled,this.markModified("terminal","showTerminalProgress"),this.save()}getTuiMode(){return this.settings.tuiMode==="fullscreen"?"fullscreen":"regular"}setTuiMode(mode){this.globalSettings.tuiMode=mode,this.markModified("tuiMode"),this.save()}getFullscreenExitOutput(){return this.settings.fullscreenExitOutput==="resume-hint"?"resume-hint":"transcript"}setFullscreenExitOutput(output){this.globalSettings.fullscreenExitOutput=output,this.markModified("fullscreenExitOutput"),this.save()}getFullscreenScrollbar(){let mode=this.settings.fullscreenScrollbar;return mode==="always"||mode==="hidden"?mode:"auto"}setFullscreenScrollbar(mode){this.globalSettings.fullscreenScrollbar=mode,this.markModified("fullscreenScrollbar"),this.save()}getFullscreenCopyOnSelect(){return this.settings.fullscreenCopyOnSelect??!0}setFullscreenCopyOnSelect(enabled){this.globalSettings.fullscreenCopyOnSelect=enabled,this.markModified("fullscreenCopyOnSelect"),this.save()}getFullscreenWheelScrollLines(){let lines=this.settings.fullscreenWheelScrollLines;return typeof lines=="number"&&Number.isFinite(lines)?Math.max(1,Math.min(100,Math.floor(lines))):"auto"}setFullscreenWheelScrollLines(lines){this.globalSettings.fullscreenWheelScrollLines=lines==="auto"?lines:Math.max(1,Math.min(100,Math.floor(lines))),this.markModified("fullscreenWheelScrollLines"),this.save()}getImageAutoResize(){return this.settings.images?.autoResize??!0}setImageAutoResize(enabled){this.globalSettings.images||(this.globalSettings.images={}),this.globalSettings.images.autoResize=enabled,this.markModified("images","autoResize"),this.save()}getBlockImages(){return this.settings.images?.blockImages??!1}getMaxHistoricalImages(){let value=this.settings.images?.maxHistoricalImages;return Number.isInteger(value)&&value!==void 0&&value>=0?value:void 0}setBlockImages(blocked){this.globalSettings.images||(this.globalSettings.images={}),this.globalSettings.images.blockImages=blocked,this.markModified("images","blockImages"),this.save()}getEnabledModels(){return this.settings.enabledModels}getRecommendedModels(){return this.settings.recommendedModels?[...this.settings.recommendedModels]:void 0}getFavoriteModels(){return this.settings.favoriteModels}setFavoriteModels(patterns){this.globalSettings.favoriteModels=patterns,this.markModified("favoriteModels"),this.save()}getDefaultTools(){let tools=this.settings.defaultTools;if(tools!==void 0)return resolveDefaultTools(Array.isArray(tools)?tools.filter(tool=>typeof tool=="string"):[])}setEnabledModels(patterns){this.globalSettings.enabledModels=patterns,this.markModified("enabledModels"),this.save()}getDoubleEscapeAction(){return this.settings.doubleEscapeAction??"tree"}setDoubleEscapeAction(action){this.globalSettings.doubleEscapeAction=action,this.markModified("doubleEscapeAction"),this.save()}getTreeFilterMode(){let mode=this.settings.treeFilterMode;return mode&&["default","no-tools","user-only","labeled-only","all"].includes(mode)?mode:"default"}setTreeFilterMode(mode){this.globalSettings.treeFilterMode=mode,this.markModified("treeFilterMode"),this.save()}getShowHardwareCursor(){return this.settings.showHardwareCursor??envValue("HARDWARE_CURSOR")==="1"}setShowHardwareCursor(enabled){this.globalSettings.showHardwareCursor=enabled,this.markModified("showHardwareCursor"),this.save()}getEditorPaddingX(){return this.settings.editorPaddingX??0}setEditorPaddingX(padding){this.globalSettings.editorPaddingX=Math.max(0,Math.min(3,Math.floor(padding))),this.markModified("editorPaddingX"),this.save()}getOutputPad(){return this.settings.outputPad===0?0:1}setOutputPad(padding){this.globalSettings.outputPad=padding,this.markModified("outputPad"),this.save()}getAutocompleteMaxVisible(){return this.settings.autocompleteMaxVisible??5}setAutocompleteMaxVisible(maxVisible){this.globalSettings.autocompleteMaxVisible=Math.max(3,Math.min(20,Math.floor(maxVisible))),this.markModified("autocompleteMaxVisible"),this.save()}getCodeBlockIndent(){return this.settings.markdown?.codeBlockIndent??" "}getMermaidRenderingMode(){let mode=this.settings.markdown?.mermaid;return mode==="off"||mode==="final"?mode:"streaming"}setMermaidRenderingMode(mode){this.globalSettings.markdown??={},this.globalSettings.markdown.mermaid=mode,this.markModified("markdown","mermaid"),this.save()}getWarnings(){return{...this.settings.warnings??{}}}setWarnings(warnings){this.globalSettings.warnings={...warnings},this.markModified("warnings"),this.save()}};export{require_undici,HTTP_IDLE_TIMEOUT_CHOICES,formatHttpIdleTimeoutMs,applyHttpProxySettings,configureHttpDispatcher,KIMI_CODE_RETRY_PROFILE,redactSensitiveOutput,redactSensitiveTokenValues,appendHiddenTuiStdout,appendUncaughtCrashLog,appendUnhandledRejectionLog,SYSTEM_THEME_NAME,setTerminalColors,setTerminalColorScheme,markTerminalColorsPending,Theme,getAvailableThemes,getAvailableThemesWithPaths,loadThemeFromPath,getThemeByName,parseAutoThemeSetting,resolveThemeSetting,getTerminalTheme,theme,setRegisteredThemes,initTheme,setTheme,setThemeInstance,onThemeChange,stopThemeWatcher,getResolvedThemeColors,getThemeExportColors,highlightCode,getLanguageFromPath,getMarkdownTheme,getSelectListTheme,getEditorTheme,getSettingsListTheme,takeOverStdout,restoreStdout,observeVisibleStderrWrites,takeOverStderr,restoreStderr,isStdoutTakenOver,writeRawStdout,waitForRawStdoutBackpressure,flushRawStdout,createFallbackCircuitAccess,acquireFallbackCircuits,monotonicNow,parseSettingsJson,formatSkillInvocationPrompt,parseSkillBlock,parseSkillInvocationTokens,removeSkillInvocationTokens,TERMINAL_MOUSE_MODES,isTerminalMouseMode,DEFAULT_STREAM_START_TIMEOUT_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_WARN_MS,DEFAULT_SESSION_SHUTDOWN_HANDLER_TIMEOUT_MS,DEFAULT_TOOL_NAMES,wasSelfWrite,getSettingsPath,FileSettingsStorage,SettingsManager};
|