iclavue 13.9.1 → 13.9.2

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/dist/cli.js CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __createRequire } from "node:module";
3
3
  const require = __createRequire(import.meta.url);
4
- // clavue v13.9.1 (built from source)
4
+ // clavue v13.9.2 (built from source)
5
5
  // Copyright (c) Anthropic PBC. All rights reserved.
6
6
  const __clavueCliArgs = process.argv.slice(2);
7
7
  if (__clavueCliArgs.length === 1 && (__clavueCliArgs[0] === "--version" || __clavueCliArgs[0] === "-v" || __clavueCliArgs[0] === "-V")) {
8
- console.log("13.9.1 (Clavue)");
8
+ console.log("13.9.2 (Clavue)");
9
9
  process.exit(0);
10
10
  }
11
11
  var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __knownSymbol=(name,symbol2)=>(symbol2=Symbol[name])?symbol2:Symbol.for("Symbol."+name),__typeError=msg=>{throw TypeError(msg)};var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0}),__require=(x3=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x3,{get:(a2,b3)=>(typeof require<"u"?require:a2)[b3]}):x3)(function(x3){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x3+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all4)=>{for(var name in all4)__defProp(target,name,{get:all4[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key3 of __getOwnPropNames(from))!__hasOwnProp.call(to,key3)&&key3!==except&&__defProp(to,key3,{get:()=>from[key3],enumerable:!(desc=__getOwnPropDesc(from,key3))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var __using=(stack,value,async)=>{if(value!=null){typeof value!="object"&&typeof value!="function"&&__typeError("Object expected");var dispose4,inner;async&&(dispose4=value[__knownSymbol("asyncDispose")]),dispose4===void 0&&(dispose4=value[__knownSymbol("dispose")],async&&(inner=dispose4)),typeof dispose4!="function"&&__typeError("Object not disposable"),inner&&(dispose4=function(){try{inner.call(this)}catch(e2){return Promise.reject(e2)}}),stack.push([async,dispose4,value])}else async&&stack.push([async]);return value},__callDispose=(stack,error40,hasError)=>{var E2=typeof SuppressedError=="function"?SuppressedError:function(e2,s2,m3,_2){return _2=Error(m3),_2.name="SuppressedError",_2.error=e2,_2.suppressed=s2,_2},fail4=e2=>error40=hasError?new E2(e2,error40,"An error was suppressed during disposal"):(hasError=!0,e2),next=it=>{for(;it=stack.pop();)try{var result2=it[1]&&it[1].call(it[2]);if(it[0])return Promise.resolve(result2).then(next,e2=>(fail4(e2),next()))}catch(e2){fail4(e2)}if(hasError)throw error40};return next()};var nodePreflight_exports={};__export(nodePreflight_exports,{MIN_NODE_MAJOR:()=>MIN_NODE_MAJOR,MIN_NODE_MINOR:()=>MIN_NODE_MINOR,nodePreflightMessage:()=>nodePreflightMessage,nodePreflightShouldExit:()=>nodePreflightShouldExit,nodeVersionTooOld:()=>nodeVersionTooOld});function nodeVersionTooOld(version3=process.versions.node){let parts=version3.split(".").map(part=>Number(part)),major=parts[0]??0,minor=parts[1]??0;return major<22||major===22&&minor<18}function nodePreflightMessage(found){return`clavue needs Node.js >= 22.18.0 (found ${found}).
@@ -34,7 +34,7 @@ Upgrade Node, then run clavue again:
34
34
  `);for(;nl>=0;){let line=buf.slice(0,nl).trim();if(buf=buf.slice(nl+1),nl=buf.indexOf(`
35
35
  `),!line)continue;let request=parseGotoIpcRequest(line),reply;if(!request)reply={ok:!1,error:"unreadable goto"};else if(request.kind==="status"){let snap=options.onStatus?.()??{busy:!1};reply={ok:!0,busy:snap.busy,...snap.lastMutation?{lastMutation:snap.lastMutation}:{},...snap.sessionId?{sessionId:snap.sessionId}:{}}}else{let target=request.kind==="goto-last"?lastMutationTarget():request.target;try{reply=options.onGoto(target)}catch(error40){reply={ok:!1,error:error40 instanceof Error?error40.message:String(error40)}}}try{sock.write(`${JSON.stringify(reply)}
36
36
  `)}catch{}}}),sock.on("error",()=>{try{sock.destroy()}catch{}})});next.once("error",reject2),next.listen(socketPath3,()=>resolveListen(next))})}catch{return null}try{chmodSync(socketPath3,384)}catch{}let pointer=gotoIpcPointerPath(configDir3);writePrivateFile(pointer,`${socketPath3}
37
- `);let stopped=!1;return{socketPath:socketPath3,stop:__name(async()=>{if(!stopped){stopped=!0,await new Promise(resolveClose=>{server2.close(()=>resolveClose())}).catch(()=>{});try{unlinkSync(socketPath3)}catch{}try{readGotoIpcPointer(configDir3)===socketPath3&&unlinkSync(pointer)}catch{}}},"stop")}}var STARTUP_OPEN_FILE,GOTO_IPC_POINTER_FILE,LAST_MUTATION_FILE,LAST_MUTATION_SENTINEL,init_cliGoto=__esm({"src/runtime/cliGoto.ts"(){init_envUtils();init_secretLabelRedact();STARTUP_OPEN_FILE="startup-open.json",GOTO_IPC_POINTER_FILE="ipc",LAST_MUTATION_FILE="last-mutation.json",LAST_MUTATION_SENTINEL="@last";__name(isUnixSocket,"isUnixSocket");__name(defaultExists,"defaultExists");__name(isFilePath,"isFilePath");__name(parseGoto,"parseGoto");__name(takeGotoOptions,"takeGotoOptions");__name(formatGoto,"formatGoto");__name(formatGotoNotice,"formatGotoNotice");__name(formatGotoAtToken,"formatGotoAtToken");__name(startupOpenPath,"startupOpenPath");__name(gotoIpcPointerPath,"gotoIpcPointerPath");__name(asGotoTarget,"asGotoTarget");__name(parseStartupOpen,"parseStartupOpen");__name(lastMutationTarget,"lastMutationTarget");__name(isLastMutationTarget,"isLastMutationTarget");__name(lastMutationPath,"lastMutationPath");__name(writeLastMutation,"writeLastMutation");__name(readLastMutation,"readLastMutation");__name(parseGotoIpcRequest,"parseGotoIpcRequest");__name(parseGotoIpcLine,"parseGotoIpcLine");__name(formatWindowStatus,"formatWindowStatus");__name(writePrivateFile,"writePrivateFile");__name(writeStartupOpen,"writeStartupOpen");__name(consumeStartupOpen,"consumeStartupOpen");__name(readGotoIpcPointer,"readGotoIpcPointer");__name(resolveGotoIpcSocket,"resolveGotoIpcSocket");__name(forgetGotoIpcSocket,"forgetGotoIpcSocket");__name(sendGotoIpc,"sendGotoIpc");__name(sendStatusIpc,"sendStatusIpc");__name(startGotoIpcServer,"startGotoIpcServer")}});var branding_exports={};__export(branding_exports,{APP_BRAND_GLYPH:()=>APP_BRAND_GLYPH,APP_BRAND_LOCKUP:()=>APP_BRAND_LOCKUP,APP_BRAND_SUBTITLE:()=>APP_BRAND_SUBTITLE,APP_BRAND_TAGLINE_SHORT_EN:()=>APP_BRAND_TAGLINE_SHORT_EN,APP_BRAND_TAGLINE_SHORT_ZH:()=>APP_BRAND_TAGLINE_SHORT_ZH,APP_BRAND_TAGLINE_ZH:()=>APP_BRAND_TAGLINE_ZH,APP_NAME:()=>APP_NAME,APP_NAME_ZH:()=>APP_NAME_ZH,APP_VERSION:()=>APP_VERSION,APP_WELCOME_TITLE:()=>APP_WELCOME_TITLE,APP_WORDMARK:()=>APP_WORDMARK,CLI_COMMAND_NAME:()=>CLI_COMMAND_NAME,PRODUCT_CATEGORY:()=>PRODUCT_CATEGORY,PRODUCT_CATEGORY_ZH:()=>PRODUCT_CATEGORY_ZH});var APP_NAME,APP_NAME_ZH,APP_BRAND_GLYPH,CLI_COMMAND_NAME,PRODUCT_CATEGORY,PRODUCT_CATEGORY_ZH,APP_VERSION_FALLBACK,APP_VERSION,APP_WORDMARK,APP_BRAND_SUBTITLE,APP_BRAND_TAGLINE_ZH,APP_BRAND_TAGLINE_SHORT_ZH,APP_BRAND_TAGLINE_SHORT_EN,APP_BRAND_LOCKUP,APP_WELCOME_TITLE,init_branding=__esm({"src/constants/branding.ts"(){APP_NAME="Clavue",APP_NAME_ZH="\u514B\u62C9\u7EF4",APP_BRAND_GLYPH="\u9F8D",CLI_COMMAND_NAME="clavue",PRODUCT_CATEGORY="Clavue Mainline",PRODUCT_CATEGORY_ZH="Clavue \u4E3B\u7EBF",APP_VERSION_FALLBACK="13.9.1",APP_VERSION=typeof MACRO<"u"?"13.9.1":APP_VERSION_FALLBACK,APP_WORDMARK=`/${APP_NAME.toLowerCase()}`,APP_BRAND_SUBTITLE="AI coding CLI",APP_BRAND_TAGLINE_ZH="\u9F8D\u884C\u4EE3\u7801 \xB7 \u6267\u884C\u4F18\u5148\u7684 AI \u7F16\u7801\u63A7\u5236\u53F0",APP_BRAND_TAGLINE_SHORT_ZH="\u9F8D\u884C\u4EE3\u7801 \xB7 \u6267\u884C\u4F18\u5148",APP_BRAND_TAGLINE_SHORT_EN="Dragon code \xB7 execution-first",APP_BRAND_LOCKUP=`\u9F8D ${APP_NAME.toUpperCase()}`,APP_WELCOME_TITLE=APP_WORDMARK}});function arrayMap(array2,iteratee2){for(var index=-1,length=array2==null?0:array2.length,result2=Array(length);++index<length;)result2[index]=iteratee2(array2[index],index,array2);return result2}var arrayMap_default,init_arrayMap=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arrayMap.js"(){__name(arrayMap,"arrayMap");arrayMap_default=arrayMap}});function stackClear(){this.__data__=new ListCache_default,this.size=0}var stackClear_default,init_stackClear=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackClear.js"(){init_ListCache();__name(stackClear,"stackClear");stackClear_default=stackClear}});function stackDelete(key3){var data=this.__data__,result2=data.delete(key3);return this.size=data.size,result2}var stackDelete_default,init_stackDelete=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackDelete.js"(){__name(stackDelete,"stackDelete");stackDelete_default=stackDelete}});function stackGet(key3){return this.__data__.get(key3)}var stackGet_default,init_stackGet=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackGet.js"(){__name(stackGet,"stackGet");stackGet_default=stackGet}});function stackHas(key3){return this.__data__.has(key3)}var stackHas_default,init_stackHas=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackHas.js"(){__name(stackHas,"stackHas");stackHas_default=stackHas}});function stackSet(key3,value){var data=this.__data__;if(data instanceof ListCache_default){var pairs=data.__data__;if(!Map_default||pairs.length<LARGE_ARRAY_SIZE-1)return pairs.push([key3,value]),this.size=++data.size,this;data=this.__data__=new MapCache_default(pairs)}return data.set(key3,value),this.size=data.size,this}var LARGE_ARRAY_SIZE,stackSet_default,init_stackSet=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackSet.js"(){init_ListCache();init_Map();init_MapCache();LARGE_ARRAY_SIZE=200;__name(stackSet,"stackSet");stackSet_default=stackSet}});function Stack(entries){var data=this.__data__=new ListCache_default(entries);this.size=data.size}var Stack_default,init_Stack=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_Stack.js"(){init_ListCache();init_stackClear();init_stackDelete();init_stackGet();init_stackHas();init_stackSet();__name(Stack,"Stack");Stack.prototype.clear=stackClear_default;Stack.prototype.delete=stackDelete_default;Stack.prototype.get=stackGet_default;Stack.prototype.has=stackHas_default;Stack.prototype.set=stackSet_default;Stack_default=Stack}});function setCacheAdd(value){return this.__data__.set(value,HASH_UNDEFINED3),this}var HASH_UNDEFINED3,setCacheAdd_default,init_setCacheAdd=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_setCacheAdd.js"(){HASH_UNDEFINED3="__lodash_hash_undefined__";__name(setCacheAdd,"setCacheAdd");setCacheAdd_default=setCacheAdd}});function setCacheHas(value){return this.__data__.has(value)}var setCacheHas_default,init_setCacheHas=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_setCacheHas.js"(){__name(setCacheHas,"setCacheHas");setCacheHas_default=setCacheHas}});function SetCache(values2){var index=-1,length=values2==null?0:values2.length;for(this.__data__=new MapCache_default;++index<length;)this.add(values2[index])}var SetCache_default,init_SetCache=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_SetCache.js"(){init_MapCache();init_setCacheAdd();init_setCacheHas();__name(SetCache,"SetCache");SetCache.prototype.add=SetCache.prototype.push=setCacheAdd_default;SetCache.prototype.has=setCacheHas_default;SetCache_default=SetCache}});function arraySome(array2,predicate){for(var index=-1,length=array2==null?0:array2.length;++index<length;)if(predicate(array2[index],index,array2))return!0;return!1}var arraySome_default,init_arraySome=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arraySome.js"(){__name(arraySome,"arraySome");arraySome_default=arraySome}});function cacheHas(cache5,key3){return cache5.has(key3)}var cacheHas_default,init_cacheHas=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_cacheHas.js"(){__name(cacheHas,"cacheHas");cacheHas_default=cacheHas}});function equalArrays(array2,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array2.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength))return!1;var arrStacked=stack.get(array2),othStacked=stack.get(other);if(arrStacked&&othStacked)return arrStacked==other&&othStacked==array2;var index=-1,result2=!0,seen2=bitmask&COMPARE_UNORDERED_FLAG?new SetCache_default:void 0;for(stack.set(array2,other),stack.set(other,array2);++index<arrLength;){var arrValue=array2[index],othValue=other[index];if(customizer)var compared=isPartial?customizer(othValue,arrValue,index,other,array2,stack):customizer(arrValue,othValue,index,array2,other,stack);if(compared!==void 0){if(compared)continue;result2=!1;break}if(seen2){if(!arraySome_default(other,function(othValue2,othIndex){if(!cacheHas_default(seen2,othIndex)&&(arrValue===othValue2||equalFunc(arrValue,othValue2,bitmask,customizer,stack)))return seen2.push(othIndex)})){result2=!1;break}}else if(!(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){result2=!1;break}}return stack.delete(array2),stack.delete(other),result2}var COMPARE_PARTIAL_FLAG,COMPARE_UNORDERED_FLAG,equalArrays_default,init_equalArrays=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_equalArrays.js"(){init_SetCache();init_arraySome();init_cacheHas();COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2;__name(equalArrays,"equalArrays");equalArrays_default=equalArrays}});var Uint8Array2,Uint8Array_default,init_Uint8Array=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_Uint8Array.js"(){init_root();Uint8Array2=root_default.Uint8Array,Uint8Array_default=Uint8Array2}});function mapToArray(map3){var index=-1,result2=Array(map3.size);return map3.forEach(function(value,key3){result2[++index]=[key3,value]}),result2}var mapToArray_default,init_mapToArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_mapToArray.js"(){__name(mapToArray,"mapToArray");mapToArray_default=mapToArray}});function setToArray(set3){var index=-1,result2=Array(set3.size);return set3.forEach(function(value){result2[++index]=value}),result2}var setToArray_default,init_setToArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_setToArray.js"(){__name(setToArray,"setToArray");setToArray_default=setToArray}});function equalByTag(object3,other,tag2,bitmask,customizer,equalFunc,stack){switch(tag2){case dataViewTag:if(object3.byteLength!=other.byteLength||object3.byteOffset!=other.byteOffset)return!1;object3=object3.buffer,other=other.buffer;case arrayBufferTag:return!(object3.byteLength!=other.byteLength||!equalFunc(new Uint8Array_default(object3),new Uint8Array_default(other)));case boolTag:case dateTag:case numberTag:return eq_default(+object3,+other);case errorTag:return object3.name==other.name&&object3.message==other.message;case regexpTag:case stringTag:return object3==other+"";case mapTag:var convert=mapToArray_default;case setTag:var isPartial=bitmask&COMPARE_PARTIAL_FLAG2;if(convert||(convert=setToArray_default),object3.size!=other.size&&!isPartial)return!1;var stacked=stack.get(object3);if(stacked)return stacked==other;bitmask|=COMPARE_UNORDERED_FLAG2,stack.set(object3,other);var result2=equalArrays_default(convert(object3),convert(other),bitmask,customizer,equalFunc,stack);return stack.delete(object3),result2;case symbolTag:if(symbolValueOf)return symbolValueOf.call(object3)==symbolValueOf.call(other)}return!1}var COMPARE_PARTIAL_FLAG2,COMPARE_UNORDERED_FLAG2,boolTag,dateTag,errorTag,mapTag,numberTag,regexpTag,setTag,stringTag,symbolTag,arrayBufferTag,dataViewTag,symbolProto,symbolValueOf,equalByTag_default,init_equalByTag=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_equalByTag.js"(){init_Symbol();init_Uint8Array();init_eq();init_equalArrays();init_mapToArray();init_setToArray();COMPARE_PARTIAL_FLAG2=1,COMPARE_UNORDERED_FLAG2=2,boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",mapTag="[object Map]",numberTag="[object Number]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",symbolTag="[object Symbol]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",symbolProto=Symbol_default?Symbol_default.prototype:void 0,symbolValueOf=symbolProto?symbolProto.valueOf:void 0;__name(equalByTag,"equalByTag");equalByTag_default=equalByTag}});function arrayPush(array2,values2){for(var index=-1,length=values2.length,offset=array2.length;++index<length;)array2[offset+index]=values2[index];return array2}var arrayPush_default,init_arrayPush=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arrayPush.js"(){__name(arrayPush,"arrayPush");arrayPush_default=arrayPush}});var isArray,isArray_default,init_isArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isArray.js"(){isArray=Array.isArray,isArray_default=isArray}});function baseGetAllKeys(object3,keysFunc,symbolsFunc){var result2=keysFunc(object3);return isArray_default(object3)?result2:arrayPush_default(result2,symbolsFunc(object3))}var baseGetAllKeys_default,init_baseGetAllKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseGetAllKeys.js"(){init_arrayPush();init_isArray();__name(baseGetAllKeys,"baseGetAllKeys");baseGetAllKeys_default=baseGetAllKeys}});function arrayFilter(array2,predicate){for(var index=-1,length=array2==null?0:array2.length,resIndex=0,result2=[];++index<length;){var value=array2[index];predicate(value,index,array2)&&(result2[resIndex++]=value)}return result2}var arrayFilter_default,init_arrayFilter=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arrayFilter.js"(){__name(arrayFilter,"arrayFilter");arrayFilter_default=arrayFilter}});function stubArray(){return[]}var stubArray_default,init_stubArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/stubArray.js"(){__name(stubArray,"stubArray");stubArray_default=stubArray}});var objectProto6,propertyIsEnumerable,nativeGetSymbols,getSymbols,getSymbols_default,init_getSymbols=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getSymbols.js"(){init_arrayFilter();init_stubArray();objectProto6=Object.prototype,propertyIsEnumerable=objectProto6.propertyIsEnumerable,nativeGetSymbols=Object.getOwnPropertySymbols,getSymbols=nativeGetSymbols?function(object3){return object3==null?[]:(object3=Object(object3),arrayFilter_default(nativeGetSymbols(object3),function(symbol2){return propertyIsEnumerable.call(object3,symbol2)}))}:stubArray_default,getSymbols_default=getSymbols}});function baseTimes(n4,iteratee2){for(var index=-1,result2=Array(n4);++index<n4;)result2[index]=iteratee2(index);return result2}var baseTimes_default,init_baseTimes=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseTimes.js"(){__name(baseTimes,"baseTimes");baseTimes_default=baseTimes}});function isObjectLike(value){return value!=null&&typeof value=="object"}var isObjectLike_default,init_isObjectLike=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isObjectLike.js"(){__name(isObjectLike,"isObjectLike");isObjectLike_default=isObjectLike}});function baseIsArguments(value){return isObjectLike_default(value)&&baseGetTag_default(value)==argsTag}var argsTag,baseIsArguments_default,init_baseIsArguments=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsArguments.js"(){init_baseGetTag();init_isObjectLike();argsTag="[object Arguments]";__name(baseIsArguments,"baseIsArguments");baseIsArguments_default=baseIsArguments}});var objectProto7,hasOwnProperty5,propertyIsEnumerable2,isArguments,isArguments_default,init_isArguments=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isArguments.js"(){init_baseIsArguments();init_isObjectLike();objectProto7=Object.prototype,hasOwnProperty5=objectProto7.hasOwnProperty,propertyIsEnumerable2=objectProto7.propertyIsEnumerable,isArguments=baseIsArguments_default((function(){return arguments})())?baseIsArguments_default:function(value){return isObjectLike_default(value)&&hasOwnProperty5.call(value,"callee")&&!propertyIsEnumerable2.call(value,"callee")},isArguments_default=isArguments}});function stubFalse(){return!1}var stubFalse_default,init_stubFalse=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/stubFalse.js"(){__name(stubFalse,"stubFalse");stubFalse_default=stubFalse}});var freeExports,freeModule,moduleExports,Buffer2,nativeIsBuffer,isBuffer,isBuffer_default,init_isBuffer=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isBuffer.js"(){init_root();init_stubFalse();freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports,freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module,moduleExports=freeModule&&freeModule.exports===freeExports,Buffer2=moduleExports?root_default.Buffer:void 0,nativeIsBuffer=Buffer2?Buffer2.isBuffer:void 0,isBuffer=nativeIsBuffer||stubFalse_default,isBuffer_default=isBuffer}});function isIndex(value,length){var type=typeof value;return length=length??MAX_SAFE_INTEGER,!!length&&(type=="number"||type!="symbol"&&reIsUint.test(value))&&value>-1&&value%1==0&&value<length}var MAX_SAFE_INTEGER,reIsUint,isIndex_default,init_isIndex=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_isIndex.js"(){MAX_SAFE_INTEGER=9007199254740991,reIsUint=/^(?:0|[1-9]\d*)$/;__name(isIndex,"isIndex");isIndex_default=isIndex}});function isLength(value){return typeof value=="number"&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER2}var MAX_SAFE_INTEGER2,isLength_default,init_isLength=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isLength.js"(){MAX_SAFE_INTEGER2=9007199254740991;__name(isLength,"isLength");isLength_default=isLength}});function baseIsTypedArray(value){return isObjectLike_default(value)&&isLength_default(value.length)&&!!typedArrayTags[baseGetTag_default(value)]}var argsTag2,arrayTag,boolTag2,dateTag2,errorTag2,funcTag2,mapTag2,numberTag2,objectTag,regexpTag2,setTag2,stringTag2,weakMapTag,arrayBufferTag2,dataViewTag2,float32Tag,float64Tag,int8Tag,int16Tag,int32Tag,uint8Tag,uint8ClampedTag,uint16Tag,uint32Tag,typedArrayTags,baseIsTypedArray_default,init_baseIsTypedArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsTypedArray.js"(){init_baseGetTag();init_isLength();init_isObjectLike();argsTag2="[object Arguments]",arrayTag="[object Array]",boolTag2="[object Boolean]",dateTag2="[object Date]",errorTag2="[object Error]",funcTag2="[object Function]",mapTag2="[object Map]",numberTag2="[object Number]",objectTag="[object Object]",regexpTag2="[object RegExp]",setTag2="[object Set]",stringTag2="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag2="[object ArrayBuffer]",dataViewTag2="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0;typedArrayTags[argsTag2]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag2]=typedArrayTags[boolTag2]=typedArrayTags[dataViewTag2]=typedArrayTags[dateTag2]=typedArrayTags[errorTag2]=typedArrayTags[funcTag2]=typedArrayTags[mapTag2]=typedArrayTags[numberTag2]=typedArrayTags[objectTag]=typedArrayTags[regexpTag2]=typedArrayTags[setTag2]=typedArrayTags[stringTag2]=typedArrayTags[weakMapTag]=!1;__name(baseIsTypedArray,"baseIsTypedArray");baseIsTypedArray_default=baseIsTypedArray}});function baseUnary(func){return function(value){return func(value)}}var baseUnary_default,init_baseUnary=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseUnary.js"(){__name(baseUnary,"baseUnary");baseUnary_default=baseUnary}});var freeExports2,freeModule2,moduleExports2,freeProcess,nodeUtil,nodeUtil_default,init_nodeUtil=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_nodeUtil.js"(){init_freeGlobal();freeExports2=typeof exports=="object"&&exports&&!exports.nodeType&&exports,freeModule2=freeExports2&&typeof module=="object"&&module&&!module.nodeType&&module,moduleExports2=freeModule2&&freeModule2.exports===freeExports2,freeProcess=moduleExports2&&freeGlobal_default.process,nodeUtil=(function(){try{var types3=freeModule2&&freeModule2.require&&freeModule2.require("util").types;return types3||freeProcess&&freeProcess.binding&&freeProcess.binding("util")}catch{}})(),nodeUtil_default=nodeUtil}});var nodeIsTypedArray,isTypedArray,isTypedArray_default,init_isTypedArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isTypedArray.js"(){init_baseIsTypedArray();init_baseUnary();init_nodeUtil();nodeIsTypedArray=nodeUtil_default&&nodeUtil_default.isTypedArray,isTypedArray=nodeIsTypedArray?baseUnary_default(nodeIsTypedArray):baseIsTypedArray_default,isTypedArray_default=isTypedArray}});function arrayLikeKeys(value,inherited){var isArr=isArray_default(value),isArg=!isArr&&isArguments_default(value),isBuff=!isArr&&!isArg&&isBuffer_default(value),isType=!isArr&&!isArg&&!isBuff&&isTypedArray_default(value),skipIndexes=isArr||isArg||isBuff||isType,result2=skipIndexes?baseTimes_default(value.length,String):[],length=result2.length;for(var key3 in value)(inherited||hasOwnProperty6.call(value,key3))&&!(skipIndexes&&(key3=="length"||isBuff&&(key3=="offset"||key3=="parent")||isType&&(key3=="buffer"||key3=="byteLength"||key3=="byteOffset")||isIndex_default(key3,length)))&&result2.push(key3);return result2}var objectProto8,hasOwnProperty6,arrayLikeKeys_default,init_arrayLikeKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arrayLikeKeys.js"(){init_baseTimes();init_isArguments();init_isArray();init_isBuffer();init_isIndex();init_isTypedArray();objectProto8=Object.prototype,hasOwnProperty6=objectProto8.hasOwnProperty;__name(arrayLikeKeys,"arrayLikeKeys");arrayLikeKeys_default=arrayLikeKeys}});function isPrototype(value){var Ctor=value&&value.constructor,proto2=typeof Ctor=="function"&&Ctor.prototype||objectProto9;return value===proto2}var objectProto9,isPrototype_default,init_isPrototype=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_isPrototype.js"(){objectProto9=Object.prototype;__name(isPrototype,"isPrototype");isPrototype_default=isPrototype}});function overArg(func,transform3){return function(arg){return func(transform3(arg))}}var overArg_default,init_overArg=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_overArg.js"(){__name(overArg,"overArg");overArg_default=overArg}});var nativeKeys,nativeKeys_default,init_nativeKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_nativeKeys.js"(){init_overArg();nativeKeys=overArg_default(Object.keys,Object),nativeKeys_default=nativeKeys}});function baseKeys(object3){if(!isPrototype_default(object3))return nativeKeys_default(object3);var result2=[];for(var key3 in Object(object3))hasOwnProperty7.call(object3,key3)&&key3!="constructor"&&result2.push(key3);return result2}var objectProto10,hasOwnProperty7,baseKeys_default,init_baseKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseKeys.js"(){init_isPrototype();init_nativeKeys();objectProto10=Object.prototype,hasOwnProperty7=objectProto10.hasOwnProperty;__name(baseKeys,"baseKeys");baseKeys_default=baseKeys}});function isArrayLike(value){return value!=null&&isLength_default(value.length)&&!isFunction_default(value)}var isArrayLike_default,init_isArrayLike=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isArrayLike.js"(){init_isFunction();init_isLength();__name(isArrayLike,"isArrayLike");isArrayLike_default=isArrayLike}});function keys(object3){return isArrayLike_default(object3)?arrayLikeKeys_default(object3):baseKeys_default(object3)}var keys_default,init_keys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/keys.js"(){init_arrayLikeKeys();init_baseKeys();init_isArrayLike();__name(keys,"keys");keys_default=keys}});function getAllKeys(object3){return baseGetAllKeys_default(object3,keys_default,getSymbols_default)}var getAllKeys_default,init_getAllKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getAllKeys.js"(){init_baseGetAllKeys();init_getSymbols();init_keys();__name(getAllKeys,"getAllKeys");getAllKeys_default=getAllKeys}});function equalObjects(object3,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG3,objProps=getAllKeys_default(object3),objLength=objProps.length,othProps=getAllKeys_default(other),othLength=othProps.length;if(objLength!=othLength&&!isPartial)return!1;for(var index=objLength;index--;){var key3=objProps[index];if(!(isPartial?key3 in other:hasOwnProperty8.call(other,key3)))return!1}var objStacked=stack.get(object3),othStacked=stack.get(other);if(objStacked&&othStacked)return objStacked==other&&othStacked==object3;var result2=!0;stack.set(object3,other),stack.set(other,object3);for(var skipCtor=isPartial;++index<objLength;){key3=objProps[index];var objValue=object3[key3],othValue=other[key3];if(customizer)var compared=isPartial?customizer(othValue,objValue,key3,other,object3,stack):customizer(objValue,othValue,key3,object3,other,stack);if(!(compared===void 0?objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):compared)){result2=!1;break}skipCtor||(skipCtor=key3=="constructor")}if(result2&&!skipCtor){var objCtor=object3.constructor,othCtor=other.constructor;objCtor!=othCtor&&"constructor"in object3&&"constructor"in other&&!(typeof objCtor=="function"&&objCtor instanceof objCtor&&typeof othCtor=="function"&&othCtor instanceof othCtor)&&(result2=!1)}return stack.delete(object3),stack.delete(other),result2}var COMPARE_PARTIAL_FLAG3,objectProto11,hasOwnProperty8,equalObjects_default,init_equalObjects=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_equalObjects.js"(){init_getAllKeys();COMPARE_PARTIAL_FLAG3=1,objectProto11=Object.prototype,hasOwnProperty8=objectProto11.hasOwnProperty;__name(equalObjects,"equalObjects");equalObjects_default=equalObjects}});var DataView2,DataView_default,init_DataView=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_DataView.js"(){init_getNative();init_root();DataView2=getNative_default(root_default,"DataView"),DataView_default=DataView2}});var Promise2,Promise_default,init_Promise=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_Promise.js"(){init_getNative();init_root();Promise2=getNative_default(root_default,"Promise"),Promise_default=Promise2}});var Set2,Set_default,init_Set=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_Set.js"(){init_getNative();init_root();Set2=getNative_default(root_default,"Set"),Set_default=Set2}});var WeakMap2,WeakMap_default,init_WeakMap=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_WeakMap.js"(){init_getNative();init_root();WeakMap2=getNative_default(root_default,"WeakMap"),WeakMap_default=WeakMap2}});var mapTag3,objectTag2,promiseTag,setTag3,weakMapTag2,dataViewTag3,dataViewCtorString,mapCtorString,promiseCtorString,setCtorString,weakMapCtorString,getTag,getTag_default,init_getTag=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getTag.js"(){init_DataView();init_Map();init_Promise();init_Set();init_WeakMap();init_baseGetTag();init_toSource();mapTag3="[object Map]",objectTag2="[object Object]",promiseTag="[object Promise]",setTag3="[object Set]",weakMapTag2="[object WeakMap]",dataViewTag3="[object DataView]",dataViewCtorString=toSource_default(DataView_default),mapCtorString=toSource_default(Map_default),promiseCtorString=toSource_default(Promise_default),setCtorString=toSource_default(Set_default),weakMapCtorString=toSource_default(WeakMap_default),getTag=baseGetTag_default;(DataView_default&&getTag(new DataView_default(new ArrayBuffer(1)))!=dataViewTag3||Map_default&&getTag(new Map_default)!=mapTag3||Promise_default&&getTag(Promise_default.resolve())!=promiseTag||Set_default&&getTag(new Set_default)!=setTag3||WeakMap_default&&getTag(new WeakMap_default)!=weakMapTag2)&&(getTag=__name(function(value){var result2=baseGetTag_default(value),Ctor=result2==objectTag2?value.constructor:void 0,ctorString=Ctor?toSource_default(Ctor):"";if(ctorString)switch(ctorString){case dataViewCtorString:return dataViewTag3;case mapCtorString:return mapTag3;case promiseCtorString:return promiseTag;case setCtorString:return setTag3;case weakMapCtorString:return weakMapTag2}return result2},"getTag"));getTag_default=getTag}});function baseIsEqualDeep(object3,other,bitmask,customizer,equalFunc,stack){var objIsArr=isArray_default(object3),othIsArr=isArray_default(other),objTag=objIsArr?arrayTag2:getTag_default(object3),othTag=othIsArr?arrayTag2:getTag_default(other);objTag=objTag==argsTag3?objectTag3:objTag,othTag=othTag==argsTag3?objectTag3:othTag;var objIsObj=objTag==objectTag3,othIsObj=othTag==objectTag3,isSameTag=objTag==othTag;if(isSameTag&&isBuffer_default(object3)){if(!isBuffer_default(other))return!1;objIsArr=!0,objIsObj=!1}if(isSameTag&&!objIsObj)return stack||(stack=new Stack_default),objIsArr||isTypedArray_default(object3)?equalArrays_default(object3,other,bitmask,customizer,equalFunc,stack):equalByTag_default(object3,other,objTag,bitmask,customizer,equalFunc,stack);if(!(bitmask&COMPARE_PARTIAL_FLAG4)){var objIsWrapped=objIsObj&&hasOwnProperty9.call(object3,"__wrapped__"),othIsWrapped=othIsObj&&hasOwnProperty9.call(other,"__wrapped__");if(objIsWrapped||othIsWrapped){var objUnwrapped=objIsWrapped?object3.value():object3,othUnwrapped=othIsWrapped?other.value():other;return stack||(stack=new Stack_default),equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack)}}return isSameTag?(stack||(stack=new Stack_default),equalObjects_default(object3,other,bitmask,customizer,equalFunc,stack)):!1}var COMPARE_PARTIAL_FLAG4,argsTag3,arrayTag2,objectTag3,objectProto12,hasOwnProperty9,baseIsEqualDeep_default,init_baseIsEqualDeep=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsEqualDeep.js"(){init_Stack();init_equalArrays();init_equalByTag();init_equalObjects();init_getTag();init_isArray();init_isBuffer();init_isTypedArray();COMPARE_PARTIAL_FLAG4=1,argsTag3="[object Arguments]",arrayTag2="[object Array]",objectTag3="[object Object]",objectProto12=Object.prototype,hasOwnProperty9=objectProto12.hasOwnProperty;__name(baseIsEqualDeep,"baseIsEqualDeep");baseIsEqualDeep_default=baseIsEqualDeep}});function baseIsEqual(value,other,bitmask,customizer,stack){return value===other?!0:value==null||other==null||!isObjectLike_default(value)&&!isObjectLike_default(other)?value!==value&&other!==other:baseIsEqualDeep_default(value,other,bitmask,customizer,baseIsEqual,stack)}var baseIsEqual_default,init_baseIsEqual=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsEqual.js"(){init_baseIsEqualDeep();init_isObjectLike();__name(baseIsEqual,"baseIsEqual");baseIsEqual_default=baseIsEqual}});function baseIsMatch(object3,source,matchData,customizer){var index=matchData.length,length=index,noCustomizer=!customizer;if(object3==null)return!length;for(object3=Object(object3);index--;){var data=matchData[index];if(noCustomizer&&data[2]?data[1]!==object3[data[0]]:!(data[0]in object3))return!1}for(;++index<length;){data=matchData[index];var key3=data[0],objValue=object3[key3],srcValue=data[1];if(noCustomizer&&data[2]){if(objValue===void 0&&!(key3 in object3))return!1}else{var stack=new Stack_default;if(customizer)var result2=customizer(objValue,srcValue,key3,object3,source,stack);if(!(result2===void 0?baseIsEqual_default(srcValue,objValue,COMPARE_PARTIAL_FLAG5|COMPARE_UNORDERED_FLAG3,customizer,stack):result2))return!1}}return!0}var COMPARE_PARTIAL_FLAG5,COMPARE_UNORDERED_FLAG3,baseIsMatch_default,init_baseIsMatch=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsMatch.js"(){init_Stack();init_baseIsEqual();COMPARE_PARTIAL_FLAG5=1,COMPARE_UNORDERED_FLAG3=2;__name(baseIsMatch,"baseIsMatch");baseIsMatch_default=baseIsMatch}});function isStrictComparable(value){return value===value&&!isObject_default(value)}var isStrictComparable_default,init_isStrictComparable=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_isStrictComparable.js"(){init_isObject();__name(isStrictComparable,"isStrictComparable");isStrictComparable_default=isStrictComparable}});function getMatchData(object3){for(var result2=keys_default(object3),length=result2.length;length--;){var key3=result2[length],value=object3[key3];result2[length]=[key3,value,isStrictComparable_default(value)]}return result2}var getMatchData_default,init_getMatchData=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getMatchData.js"(){init_isStrictComparable();init_keys();__name(getMatchData,"getMatchData");getMatchData_default=getMatchData}});function matchesStrictComparable(key3,srcValue){return function(object3){return object3==null?!1:object3[key3]===srcValue&&(srcValue!==void 0||key3 in Object(object3))}}var matchesStrictComparable_default,init_matchesStrictComparable=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_matchesStrictComparable.js"(){__name(matchesStrictComparable,"matchesStrictComparable");matchesStrictComparable_default=matchesStrictComparable}});function baseMatches(source){var matchData=getMatchData_default(source);return matchData.length==1&&matchData[0][2]?matchesStrictComparable_default(matchData[0][0],matchData[0][1]):function(object3){return object3===source||baseIsMatch_default(object3,source,matchData)}}var baseMatches_default,init_baseMatches=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseMatches.js"(){init_baseIsMatch();init_getMatchData();init_matchesStrictComparable();__name(baseMatches,"baseMatches");baseMatches_default=baseMatches}});function isSymbol(value){return typeof value=="symbol"||isObjectLike_default(value)&&baseGetTag_default(value)==symbolTag2}var symbolTag2,isSymbol_default,init_isSymbol=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isSymbol.js"(){init_baseGetTag();init_isObjectLike();symbolTag2="[object Symbol]";__name(isSymbol,"isSymbol");isSymbol_default=isSymbol}});function isKey(value,object3){if(isArray_default(value))return!1;var type=typeof value;return type=="number"||type=="symbol"||type=="boolean"||value==null||isSymbol_default(value)?!0:reIsPlainProp.test(value)||!reIsDeepProp.test(value)||object3!=null&&value in Object(object3)}var reIsDeepProp,reIsPlainProp,isKey_default,init_isKey=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_isKey.js"(){init_isArray();init_isSymbol();reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/;__name(isKey,"isKey");isKey_default=isKey}});function memoizeCapped(func){var result2=memoize_default(func,function(key3){return cache5.size===MAX_MEMOIZE_SIZE&&cache5.clear(),key3}),cache5=result2.cache;return result2}var MAX_MEMOIZE_SIZE,memoizeCapped_default,init_memoizeCapped=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_memoizeCapped.js"(){init_memoize();MAX_MEMOIZE_SIZE=500;__name(memoizeCapped,"memoizeCapped");memoizeCapped_default=memoizeCapped}});var rePropName,reEscapeChar,stringToPath,stringToPath_default,init_stringToPath=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stringToPath.js"(){init_memoizeCapped();rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,reEscapeChar=/\\(\\)?/g,stringToPath=memoizeCapped_default(function(string4){var result2=[];return string4.charCodeAt(0)===46&&result2.push(""),string4.replace(rePropName,function(match,number4,quote2,subString){result2.push(quote2?subString.replace(reEscapeChar,"$1"):number4||match)}),result2}),stringToPath_default=stringToPath}});function baseToString(value){if(typeof value=="string")return value;if(isArray_default(value))return arrayMap_default(value,baseToString)+"";if(isSymbol_default(value))return symbolToString?symbolToString.call(value):"";var result2=value+"";return result2=="0"&&1/value==-INFINITY?"-0":result2}var INFINITY,symbolProto2,symbolToString,baseToString_default,init_baseToString=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseToString.js"(){init_Symbol();init_arrayMap();init_isArray();init_isSymbol();INFINITY=1/0,symbolProto2=Symbol_default?Symbol_default.prototype:void 0,symbolToString=symbolProto2?symbolProto2.toString:void 0;__name(baseToString,"baseToString");baseToString_default=baseToString}});function toString(value){return value==null?"":baseToString_default(value)}var toString_default,init_toString=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/toString.js"(){init_baseToString();__name(toString,"toString");toString_default=toString}});function castPath(value,object3){return isArray_default(value)?value:isKey_default(value,object3)?[value]:stringToPath_default(toString_default(value))}var castPath_default,init_castPath=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_castPath.js"(){init_isArray();init_isKey();init_stringToPath();init_toString();__name(castPath,"castPath");castPath_default=castPath}});function toKey(value){if(typeof value=="string"||isSymbol_default(value))return value;var result2=value+"";return result2=="0"&&1/value==-INFINITY2?"-0":result2}var INFINITY2,toKey_default,init_toKey=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_toKey.js"(){init_isSymbol();INFINITY2=1/0;__name(toKey,"toKey");toKey_default=toKey}});function baseGet(object3,path40){path40=castPath_default(path40,object3);for(var index=0,length=path40.length;object3!=null&&index<length;)object3=object3[toKey_default(path40[index++])];return index&&index==length?object3:void 0}var baseGet_default,init_baseGet=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseGet.js"(){init_castPath();init_toKey();__name(baseGet,"baseGet");baseGet_default=baseGet}});function get(object3,path40,defaultValue){var result2=object3==null?void 0:baseGet_default(object3,path40);return result2===void 0?defaultValue:result2}var get_default,init_get=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/get.js"(){init_baseGet();__name(get,"get");get_default=get}});function baseHasIn(object3,key3){return object3!=null&&key3 in Object(object3)}var baseHasIn_default,init_baseHasIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseHasIn.js"(){__name(baseHasIn,"baseHasIn");baseHasIn_default=baseHasIn}});function hasPath(object3,path40,hasFunc){path40=castPath_default(path40,object3);for(var index=-1,length=path40.length,result2=!1;++index<length;){var key3=toKey_default(path40[index]);if(!(result2=object3!=null&&hasFunc(object3,key3)))break;object3=object3[key3]}return result2||++index!=length?result2:(length=object3==null?0:object3.length,!!length&&isLength_default(length)&&isIndex_default(key3,length)&&(isArray_default(object3)||isArguments_default(object3)))}var hasPath_default,init_hasPath=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_hasPath.js"(){init_castPath();init_isArguments();init_isArray();init_isIndex();init_isLength();init_toKey();__name(hasPath,"hasPath");hasPath_default=hasPath}});function hasIn(object3,path40){return object3!=null&&hasPath_default(object3,path40,baseHasIn_default)}var hasIn_default,init_hasIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/hasIn.js"(){init_baseHasIn();init_hasPath();__name(hasIn,"hasIn");hasIn_default=hasIn}});function baseMatchesProperty(path40,srcValue){return isKey_default(path40)&&isStrictComparable_default(srcValue)?matchesStrictComparable_default(toKey_default(path40),srcValue):function(object3){var objValue=get_default(object3,path40);return objValue===void 0&&objValue===srcValue?hasIn_default(object3,path40):baseIsEqual_default(srcValue,objValue,COMPARE_PARTIAL_FLAG6|COMPARE_UNORDERED_FLAG4)}}var COMPARE_PARTIAL_FLAG6,COMPARE_UNORDERED_FLAG4,baseMatchesProperty_default,init_baseMatchesProperty=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseMatchesProperty.js"(){init_baseIsEqual();init_get();init_hasIn();init_isKey();init_isStrictComparable();init_matchesStrictComparable();init_toKey();COMPARE_PARTIAL_FLAG6=1,COMPARE_UNORDERED_FLAG4=2;__name(baseMatchesProperty,"baseMatchesProperty");baseMatchesProperty_default=baseMatchesProperty}});function identity(value){return value}var identity_default,init_identity=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/identity.js"(){__name(identity,"identity");identity_default=identity}});function baseProperty(key3){return function(object3){return object3?.[key3]}}var baseProperty_default,init_baseProperty=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseProperty.js"(){__name(baseProperty,"baseProperty");baseProperty_default=baseProperty}});function basePropertyDeep(path40){return function(object3){return baseGet_default(object3,path40)}}var basePropertyDeep_default,init_basePropertyDeep=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_basePropertyDeep.js"(){init_baseGet();__name(basePropertyDeep,"basePropertyDeep");basePropertyDeep_default=basePropertyDeep}});function property(path40){return isKey_default(path40)?baseProperty_default(toKey_default(path40)):basePropertyDeep_default(path40)}var property_default,init_property=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/property.js"(){init_baseProperty();init_basePropertyDeep();init_isKey();init_toKey();__name(property,"property");property_default=property}});function baseIteratee(value){return typeof value=="function"?value:value==null?identity_default:typeof value=="object"?isArray_default(value)?baseMatchesProperty_default(value[0],value[1]):baseMatches_default(value):property_default(value)}var baseIteratee_default,init_baseIteratee=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIteratee.js"(){init_baseMatches();init_baseMatchesProperty();init_identity();init_isArray();init_property();__name(baseIteratee,"baseIteratee");baseIteratee_default=baseIteratee}});var defineProperty,defineProperty_default,init_defineProperty=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_defineProperty.js"(){init_getNative();defineProperty=(function(){try{var func=getNative_default(Object,"defineProperty");return func({},"",{}),func}catch{}})(),defineProperty_default=defineProperty}});function baseAssignValue(object3,key3,value){key3=="__proto__"&&defineProperty_default?defineProperty_default(object3,key3,{configurable:!0,enumerable:!0,value,writable:!0}):object3[key3]=value}var baseAssignValue_default,init_baseAssignValue=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseAssignValue.js"(){init_defineProperty();__name(baseAssignValue,"baseAssignValue");baseAssignValue_default=baseAssignValue}});function assignValue(object3,key3,value){var objValue=object3[key3];(!(hasOwnProperty10.call(object3,key3)&&eq_default(objValue,value))||value===void 0&&!(key3 in object3))&&baseAssignValue_default(object3,key3,value)}var objectProto13,hasOwnProperty10,assignValue_default,init_assignValue=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_assignValue.js"(){init_baseAssignValue();init_eq();objectProto13=Object.prototype,hasOwnProperty10=objectProto13.hasOwnProperty;__name(assignValue,"assignValue");assignValue_default=assignValue}});function baseSet(object3,path40,value,customizer){if(!isObject_default(object3))return object3;path40=castPath_default(path40,object3);for(var index=-1,length=path40.length,lastIndex=length-1,nested=object3;nested!=null&&++index<length;){var key3=toKey_default(path40[index]),newValue=value;if(key3==="__proto__"||key3==="constructor"||key3==="prototype")return object3;if(index!=lastIndex){var objValue=nested[key3];newValue=customizer?customizer(objValue,key3,nested):void 0,newValue===void 0&&(newValue=isObject_default(objValue)?objValue:isIndex_default(path40[index+1])?[]:{})}assignValue_default(nested,key3,newValue),nested=nested[key3]}return object3}var baseSet_default,init_baseSet=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseSet.js"(){init_assignValue();init_castPath();init_isIndex();init_isObject();init_toKey();__name(baseSet,"baseSet");baseSet_default=baseSet}});function basePickBy(object3,paths2,predicate){for(var index=-1,length=paths2.length,result2={};++index<length;){var path40=paths2[index],value=baseGet_default(object3,path40);predicate(value,path40)&&baseSet_default(result2,castPath_default(path40,object3),value)}return result2}var basePickBy_default,init_basePickBy=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_basePickBy.js"(){init_baseGet();init_baseSet();init_castPath();__name(basePickBy,"basePickBy");basePickBy_default=basePickBy}});var getPrototype,getPrototype_default,init_getPrototype=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getPrototype.js"(){init_overArg();getPrototype=overArg_default(Object.getPrototypeOf,Object),getPrototype_default=getPrototype}});var nativeGetSymbols2,getSymbolsIn,getSymbolsIn_default,init_getSymbolsIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getSymbolsIn.js"(){init_arrayPush();init_getPrototype();init_getSymbols();init_stubArray();nativeGetSymbols2=Object.getOwnPropertySymbols,getSymbolsIn=nativeGetSymbols2?function(object3){for(var result2=[];object3;)arrayPush_default(result2,getSymbols_default(object3)),object3=getPrototype_default(object3);return result2}:stubArray_default,getSymbolsIn_default=getSymbolsIn}});function nativeKeysIn(object3){var result2=[];if(object3!=null)for(var key3 in Object(object3))result2.push(key3);return result2}var nativeKeysIn_default,init_nativeKeysIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_nativeKeysIn.js"(){__name(nativeKeysIn,"nativeKeysIn");nativeKeysIn_default=nativeKeysIn}});function baseKeysIn(object3){if(!isObject_default(object3))return nativeKeysIn_default(object3);var isProto=isPrototype_default(object3),result2=[];for(var key3 in object3)key3=="constructor"&&(isProto||!hasOwnProperty11.call(object3,key3))||result2.push(key3);return result2}var objectProto14,hasOwnProperty11,baseKeysIn_default,init_baseKeysIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseKeysIn.js"(){init_isObject();init_isPrototype();init_nativeKeysIn();objectProto14=Object.prototype,hasOwnProperty11=objectProto14.hasOwnProperty;__name(baseKeysIn,"baseKeysIn");baseKeysIn_default=baseKeysIn}});function keysIn(object3){return isArrayLike_default(object3)?arrayLikeKeys_default(object3,!0):baseKeysIn_default(object3)}var keysIn_default,init_keysIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/keysIn.js"(){init_arrayLikeKeys();init_baseKeysIn();init_isArrayLike();__name(keysIn,"keysIn");keysIn_default=keysIn}});function getAllKeysIn(object3){return baseGetAllKeys_default(object3,keysIn_default,getSymbolsIn_default)}var getAllKeysIn_default,init_getAllKeysIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getAllKeysIn.js"(){init_baseGetAllKeys();init_getSymbolsIn();init_keysIn();__name(getAllKeysIn,"getAllKeysIn");getAllKeysIn_default=getAllKeysIn}});function pickBy(object3,predicate){if(object3==null)return{};var props=arrayMap_default(getAllKeysIn_default(object3),function(prop){return[prop]});return predicate=baseIteratee_default(predicate),basePickBy_default(object3,props,function(value,path40){return predicate(value,path40[0])})}var pickBy_default,init_pickBy=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/pickBy.js"(){init_arrayMap();init_baseIteratee();init_basePickBy();init_getAllKeysIn();__name(pickBy,"pickBy");pickBy_default=pickBy}});function baseSum(array2,iteratee2){for(var result2,index=-1,length=array2.length;++index<length;){var current=iteratee2(array2[index]);current!==void 0&&(result2=result2===void 0?current:result2+current)}return result2}var baseSum_default,init_baseSum=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseSum.js"(){__name(baseSum,"baseSum");baseSum_default=baseSum}});function sumBy(array2,iteratee2){return array2&&array2.length?baseSum_default(array2,baseIteratee_default(iteratee2,2)):0}var sumBy_default,init_sumBy=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/sumBy.js"(){init_baseIteratee();init_baseSum();__name(sumBy,"sumBy");sumBy_default=sumBy}});function classifyReviewFindings(reviewText,plantedFingerprints=[]){let text3=String(reviewText??"").trim();if(!text3)return{empty:!0,lgtmOnly:!0,findingLineCount:0,namesArtifacts:!1,matchedFingerprints:[],caughtPlantedBug:!1};let lower4=text3.toLowerCase(),lines=text3.split(/\n/).map(l=>l.trim()).filter(Boolean),findingLineCount=0;for(let line of lines)(FINDING_LINE_RE.test(line)||/:\d+/.test(line)||/`[^`]+`/.test(line))&&(findingLineCount+=1);let namesArtifacts=/\b[\w.-]+\.(?:ts|tsx|js|jsx|py|go|rs|java|md)\b/.test(text3)||/\b(src|tests?|lib|pkg)\//.test(text3)||/`[A-Za-z_][\w.]*`/.test(text3),matchedFingerprints=[];for(let fp of plantedFingerprints){let f3=String(fp||"").trim();f3&&lower4.includes(f3.toLowerCase())&&matchedFingerprints.push(f3)}let compact3=text3.replace(/\s+/g," ").trim(),lgtmOnly=LGTM_RE.test(compact3)||PRAISE_ONLY_RE.test(compact3)||findingLineCount===0&&!namesArtifacts&&matchedFingerprints.length===0&&/looks good|lgtm|no issues|ship it|approved|没问题|可以合并|没有问题/i.test(compact3)&&compact3.length<280;return{empty:lgtmOnly||findingLineCount===0&&matchedFingerprints.length===0&&!namesArtifacts&&compact3.length<40,lgtmOnly,findingLineCount,namesArtifacts,matchedFingerprints,caughtPlantedBug:matchedFingerprints.length>0}}function reviewMayAllowKeep(input2){let classification=classifyReviewFindings(input2.reviewText,input2.plantedFingerprints??[]),hasMutation=input2.hasMutation===!0||(input2.mutationFileCount??0)>0,multiFile=(input2.mutationFileCount??0)>=2,verifyFailed=input2.verifyFailed===!0,claimed=input2.claimedComplete===!0;if(verifyFailed&&classification.empty)return{allowKeep:!1,reason:"verify failed and review has no findings",classification};if(hasMutation&&claimed&&classification.empty)return{allowKeep:!1,reason:"completion claim after mutation with empty/LGTM review",classification};if(multiFile&&classification.lgtmOnly&&(input2.plantedFingerprints?.length??0)>0&&!classification.caughtPlantedBug)return{allowKeep:!1,reason:"multi-file review missed planted fingerprints",classification};if((input2.plantedFingerprints?.length??0)>0&&!classification.caughtPlantedBug&&hasMutation)return{allowKeep:!1,reason:"review missed planted bug fingerprints",classification};let citeIds=input2.digestCiteIds??[],digestPaths=input2.digestPaths??[],hasDigestAnchors=citeIds.length>0||digestPaths.length>0,digestPressure=input2.requireDigestCite===!0||hasMutation&&(claimed||multiFile||verifyFailed);if(hasDigestAnchors&&digestPressure&&!classification.caughtPlantedBug){let text3=String(input2.reviewText??"");if(!text3.trim())return{allowKeep:!1,reason:"review missing payload digest cite ids/paths (empty_review)",classification};let hitCite=citeIds.some(id=>text3.includes(id)),hitPath=digestPaths.some(p=>{let base=p.split("/").pop()||p;return text3.includes(p)||base.length>3&&text3.includes(base)});if(!hitCite&&!hitPath)return{allowKeep:!1,reason:"review missing payload digest cite ids/paths (no_cite_or_path_in_review)",classification}}return{allowKeep:!0,reason:classification.caughtPlantedBug?"review caught planted fingerprint(s)":classification.empty?"empty review allowed (no mutation/claim pressure)":"review has substantive findings or no planted bugs",classification}}var LGTM_RE,PRAISE_ONLY_RE,FINDING_LINE_RE,init_reviewFindingsGate=__esm({"src/runtime/reviewFindingsGate.ts"(){LGTM_RE=/^\s*(lgtm|looks good|looks great|ship it|approved|no issues?|no problems?|no bugs?|all good|sgtm|👍)\s*[.!]?\s*$/im,PRAISE_ONLY_RE=/^(?:the code (?:looks|seems) (?:fine|good|correct|solid)|no changes needed|ready to merge)\.?$/im,FINDING_LINE_RE=/^\s*(?:[-*•]|\d+[.)]|FINDINGS?:|BUG\b|ISSUE\b|PROBLEM\b|缺陷|问题|错误)\s+/im;__name(classifyReviewFindings,"classifyReviewFindings");__name(reviewMayAllowKeep,"reviewMayAllowKeep")}});var sessionPayloadDigest_exports={};__export(sessionPayloadDigest_exports,{clearSessionPayloadDigest:()=>clearSessionPayloadDigest,getSessionPayloadDigest:()=>getSessionPayloadDigest,getSessionPayloadDigestAgeMs:()=>getSessionPayloadDigestAgeMs,resetSessionPayloadDigestForTests:()=>resetSessionPayloadDigestForTests,setSessionPayloadDigest:()=>setSessionPayloadDigest});function setSessionPayloadDigest(digest){lastDigest=digest??null,lastSetAtMs=digest?Date.now():0}function getSessionPayloadDigest(){return lastDigest}function clearSessionPayloadDigest(){lastDigest=null,lastSetAtMs=0}function getSessionPayloadDigestAgeMs(now3=Date.now()){return!lastDigest||!lastSetAtMs?null:now3-lastSetAtMs}function resetSessionPayloadDigestForTests(){clearSessionPayloadDigest()}var lastDigest,lastSetAtMs,init_sessionPayloadDigest=__esm({"src/runtime/sessionPayloadDigest.ts"(){lastDigest=null,lastSetAtMs=0;__name(setSessionPayloadDigest,"setSessionPayloadDigest");__name(getSessionPayloadDigest,"getSessionPayloadDigest");__name(clearSessionPayloadDigest,"clearSessionPayloadDigest");__name(getSessionPayloadDigestAgeMs,"getSessionPayloadDigestAgeMs");__name(resetSessionPayloadDigestForTests,"resetSessionPayloadDigestForTests")}});var reviewHardGate_exports={};__export(reviewHardGate_exports,{computeReviewHardGate:()=>computeReviewHardGate,extractRecentReviewText:()=>extractRecentReviewText,extractV1ReviewVerdict:()=>extractV1ReviewVerdict,indexAfterLatestMutation:()=>indexAfterLatestMutation,isReviewHardGateDisabled:()=>isReviewHardGateDisabled,looksLikeIndependentReviewBody:()=>looksLikeIndependentReviewBody,parseReviewShipVerdict:()=>parseReviewShipVerdict,resolveReviewGateTierFields:()=>resolveReviewGateTierFields});function resolveReviewGateTierFields(input2){return input2.pathTierDecision?{pathTier:String(input2.pathTierDecision.tier||"").toUpperCase()||null,allowBlockingReview:input2.pathTierDecision.allowBlockingReview===!0}:{pathTier:input2.pathTier??null,allowBlockingReview:input2.allowBlockingReview}}function parseReviewShipVerdict(reviewText){let text3=String(reviewText??"").trim();if(!text3)return"none";let lower4=text3.toLowerCase(),structured=/\bverdict\s*[::]\s*(ship|fix[_-]?first|fix|rethink|lgtm|approve[d]?)\b/i.exec(text3);if(structured?.[1]){let v2=structured[1].toLowerCase().replace(/-/g,"_");return v2==="ship"||v2==="lgtm"||v2.startsWith("approve")?"ship":v2==="rethink"?"rethink":"fix_first"}if(/\b(rethink|re-?architect|start over|wrong approach|从根本上重来|重新设计)\b/i.test(text3))return"rethink";if(/\b(fix[_-\s]?first|must fix|blocking issue|do not (?:merge|ship)|needs? fix|阻塞|必须先修|不能合并)\b/i.test(text3))return"fix_first";if(/\b(ship(?:\s+it)?|ready to (?:merge|ship)|approved|lgtm|sgtm|可以合并|可以发版|审查通过)\b/i.test(lower4))return"ship";let cls=classifyReviewFindings(text3);return cls.empty||cls.lgtmOnly?"empty":cls.findingLineCount>0?"fix_first":"empty"}function tierRequiresReview(pathTier,allowBlockingReview){let tier=String(pathTier||"").toUpperCase();return tier==="T0"?{required:!1,tier:"T0"}:tier==="T2"?{required:!0,tier:"T2"}:tier==="T1"?allowBlockingReview===!1?{required:!1,tier:"T1"}:{required:!0,tier:"T1"}:allowBlockingReview===!0?{required:!0,tier:tier||"T?"}:{required:!1,tier:tier||""}}function computeReviewHardGate(input2){let fields=resolveReviewGateTierFields(input2),{required:required2,tier}=tierRequiresReview(fields.pathTier,fields.allowBlockingReview);if(!required2)return null;let phrase=findCompletionClaimPhrase(input2.assistantText);if(!phrase||!(input2.hasMutation===!0||(input2.mutationFileCount??0)>0))return null;let verdict2=input2.reviewVerdict??parseReviewShipVerdict(input2.reviewText);if(verdict2==="ship"){let digestCiteIds=input2.digestCiteIds,digestPaths=input2.digestPaths;if(!digestCiteIds?.length&&!digestPaths?.length)try{let{getSessionPayloadDigest:getSessionPayloadDigest2}=(init_sessionPayloadDigest(),__toCommonJS(sessionPayloadDigest_exports)),dig=getSessionPayloadDigest2();dig&&(digestCiteIds=dig.citeIds,digestPaths=dig.paths)}catch{}let keep=reviewMayAllowKeep({reviewText:input2.reviewText,hasMutation:!0,mutationFileCount:input2.mutationFileCount,verifyFailed:input2.verifyFailed,claimedComplete:!0,digestCiteIds,digestPaths});if(!keep.allowKeep){let digestMiss=/digest cite/i.test(keep.reason);return{reason:`Review hard gate (${tier}): completion phrase "${phrase}" but review failed keep gate (${keep.reason}). Independent review must return VERDICT: ship with substantive checks`+(digestMiss?" grounded in payload digest cite ids/paths":"")+" (or fix-first)."+(input2.sameModelReview?" Note: review model equals main \u2014 prefer a distinct review slot for independence.":""),matchedPhrase:phrase,pathTier:tier,reviewVerdict:"empty",line:digestMiss?`review-gate: blocked \xB7 ${tier} \xB7 digest_cite`:`review-gate: blocked \xB7 ${tier} \xB7 empty_ship`,nextStep:digestMiss?"Re-run review citing PAYLOAD DIGEST chunk ids / paths; VERDICT: ship|fix_first|rethink; then restate completion.":"Run review slot (distinct model if possible), return VERDICT: ship|fix_first|rethink with concrete findings, then restate completion."}}return null}return verdict2==="none"?{reason:`Review hard gate (${tier}): completion phrase "${phrase}" with mutations but **no independent review ship**. On T1/T2, delivery requires review-slot VERDICT: ship before honest-done (sol-advisor pattern). Do not claim done until review returns ship (or mark not-applicable with evidence).`+(input2.sameModelReview?" Prefer a review model \u2260 main for independence.":""),matchedPhrase:phrase,pathTier:tier,reviewVerdict:"none",line:`review-gate: blocked \xB7 ${tier} \xB7 no_review`,nextStep:"Invoke independent review (review slot), address findings, obtain VERDICT: ship, then restate completion with evidence."}:verdict2==="fix_first"||verdict2==="rethink"?{reason:`Review hard gate (${tier}): completion phrase "${phrase}" but review returned **${verdict2.replace("_","-")}**. Cannot honest-done until findings are fixed and review returns VERDICT: ship.`,matchedPhrase:phrase,pathTier:tier,reviewVerdict:verdict2,line:`review-gate: blocked \xB7 ${tier} \xB7 ${verdict2}`,nextStep:verdict2==="rethink"?"Revisit approach per review, re-implement, re-review, then claim done only after VERDICT: ship.":"Fix review findings, re-run review for VERDICT: ship, then restate completion."}:{reason:`Review hard gate (${tier}): completion phrase "${phrase}" but review is empty/rubber-stamp. Require substantive independent review with VERDICT: ship.`,matchedPhrase:phrase,pathTier:tier,reviewVerdict:"empty",line:`review-gate: blocked \xB7 ${tier} \xB7 empty`,nextStep:"Re-run review with concrete path:line findings or explicit VERDICT: ship after checks."}}function isReviewHardGateDisabled(env5=process.env){let raw=env5.CLAVUE_REVIEW_HARD_GATE;if(raw===void 0||raw==="")return!1;let v2=String(raw).trim().toLowerCase();return v2==="0"||v2==="false"||v2==="off"||v2==="no"}function assistantTextFromMessage(m3){let content=m3.message?.content;if(typeof content=="string")return content;if(!Array.isArray(content))return"";let parts=[];for(let b3 of content)b3?.type==="text"&&typeof b3.text=="string"&&parts.push(b3.text);return parts.join(`
37
+ `);let stopped=!1;return{socketPath:socketPath3,stop:__name(async()=>{if(!stopped){stopped=!0,await new Promise(resolveClose=>{server2.close(()=>resolveClose())}).catch(()=>{});try{unlinkSync(socketPath3)}catch{}try{readGotoIpcPointer(configDir3)===socketPath3&&unlinkSync(pointer)}catch{}}},"stop")}}var STARTUP_OPEN_FILE,GOTO_IPC_POINTER_FILE,LAST_MUTATION_FILE,LAST_MUTATION_SENTINEL,init_cliGoto=__esm({"src/runtime/cliGoto.ts"(){init_envUtils();init_secretLabelRedact();STARTUP_OPEN_FILE="startup-open.json",GOTO_IPC_POINTER_FILE="ipc",LAST_MUTATION_FILE="last-mutation.json",LAST_MUTATION_SENTINEL="@last";__name(isUnixSocket,"isUnixSocket");__name(defaultExists,"defaultExists");__name(isFilePath,"isFilePath");__name(parseGoto,"parseGoto");__name(takeGotoOptions,"takeGotoOptions");__name(formatGoto,"formatGoto");__name(formatGotoNotice,"formatGotoNotice");__name(formatGotoAtToken,"formatGotoAtToken");__name(startupOpenPath,"startupOpenPath");__name(gotoIpcPointerPath,"gotoIpcPointerPath");__name(asGotoTarget,"asGotoTarget");__name(parseStartupOpen,"parseStartupOpen");__name(lastMutationTarget,"lastMutationTarget");__name(isLastMutationTarget,"isLastMutationTarget");__name(lastMutationPath,"lastMutationPath");__name(writeLastMutation,"writeLastMutation");__name(readLastMutation,"readLastMutation");__name(parseGotoIpcRequest,"parseGotoIpcRequest");__name(parseGotoIpcLine,"parseGotoIpcLine");__name(formatWindowStatus,"formatWindowStatus");__name(writePrivateFile,"writePrivateFile");__name(writeStartupOpen,"writeStartupOpen");__name(consumeStartupOpen,"consumeStartupOpen");__name(readGotoIpcPointer,"readGotoIpcPointer");__name(resolveGotoIpcSocket,"resolveGotoIpcSocket");__name(forgetGotoIpcSocket,"forgetGotoIpcSocket");__name(sendGotoIpc,"sendGotoIpc");__name(sendStatusIpc,"sendStatusIpc");__name(startGotoIpcServer,"startGotoIpcServer")}});var branding_exports={};__export(branding_exports,{APP_BRAND_GLYPH:()=>APP_BRAND_GLYPH,APP_BRAND_LOCKUP:()=>APP_BRAND_LOCKUP,APP_BRAND_SUBTITLE:()=>APP_BRAND_SUBTITLE,APP_BRAND_TAGLINE_SHORT_EN:()=>APP_BRAND_TAGLINE_SHORT_EN,APP_BRAND_TAGLINE_SHORT_ZH:()=>APP_BRAND_TAGLINE_SHORT_ZH,APP_BRAND_TAGLINE_ZH:()=>APP_BRAND_TAGLINE_ZH,APP_NAME:()=>APP_NAME,APP_NAME_ZH:()=>APP_NAME_ZH,APP_VERSION:()=>APP_VERSION,APP_WELCOME_TITLE:()=>APP_WELCOME_TITLE,APP_WORDMARK:()=>APP_WORDMARK,CLI_COMMAND_NAME:()=>CLI_COMMAND_NAME,PRODUCT_CATEGORY:()=>PRODUCT_CATEGORY,PRODUCT_CATEGORY_ZH:()=>PRODUCT_CATEGORY_ZH});var APP_NAME,APP_NAME_ZH,APP_BRAND_GLYPH,CLI_COMMAND_NAME,PRODUCT_CATEGORY,PRODUCT_CATEGORY_ZH,APP_VERSION_FALLBACK,APP_VERSION,APP_WORDMARK,APP_BRAND_SUBTITLE,APP_BRAND_TAGLINE_ZH,APP_BRAND_TAGLINE_SHORT_ZH,APP_BRAND_TAGLINE_SHORT_EN,APP_BRAND_LOCKUP,APP_WELCOME_TITLE,init_branding=__esm({"src/constants/branding.ts"(){APP_NAME="Clavue",APP_NAME_ZH="\u514B\u62C9\u7EF4",APP_BRAND_GLYPH="\u9F8D",CLI_COMMAND_NAME="clavue",PRODUCT_CATEGORY="Clavue Mainline",PRODUCT_CATEGORY_ZH="Clavue \u4E3B\u7EBF",APP_VERSION_FALLBACK="13.9.2",APP_VERSION=typeof MACRO<"u"?"13.9.2":APP_VERSION_FALLBACK,APP_WORDMARK=`/${APP_NAME.toLowerCase()}`,APP_BRAND_SUBTITLE="AI coding CLI",APP_BRAND_TAGLINE_ZH="\u9F8D\u884C\u4EE3\u7801 \xB7 \u6267\u884C\u4F18\u5148\u7684 AI \u7F16\u7801\u63A7\u5236\u53F0",APP_BRAND_TAGLINE_SHORT_ZH="\u9F8D\u884C\u4EE3\u7801 \xB7 \u6267\u884C\u4F18\u5148",APP_BRAND_TAGLINE_SHORT_EN="Dragon code \xB7 execution-first",APP_BRAND_LOCKUP=`\u9F8D ${APP_NAME.toUpperCase()}`,APP_WELCOME_TITLE=APP_WORDMARK}});function arrayMap(array2,iteratee2){for(var index=-1,length=array2==null?0:array2.length,result2=Array(length);++index<length;)result2[index]=iteratee2(array2[index],index,array2);return result2}var arrayMap_default,init_arrayMap=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arrayMap.js"(){__name(arrayMap,"arrayMap");arrayMap_default=arrayMap}});function stackClear(){this.__data__=new ListCache_default,this.size=0}var stackClear_default,init_stackClear=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackClear.js"(){init_ListCache();__name(stackClear,"stackClear");stackClear_default=stackClear}});function stackDelete(key3){var data=this.__data__,result2=data.delete(key3);return this.size=data.size,result2}var stackDelete_default,init_stackDelete=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackDelete.js"(){__name(stackDelete,"stackDelete");stackDelete_default=stackDelete}});function stackGet(key3){return this.__data__.get(key3)}var stackGet_default,init_stackGet=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackGet.js"(){__name(stackGet,"stackGet");stackGet_default=stackGet}});function stackHas(key3){return this.__data__.has(key3)}var stackHas_default,init_stackHas=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackHas.js"(){__name(stackHas,"stackHas");stackHas_default=stackHas}});function stackSet(key3,value){var data=this.__data__;if(data instanceof ListCache_default){var pairs=data.__data__;if(!Map_default||pairs.length<LARGE_ARRAY_SIZE-1)return pairs.push([key3,value]),this.size=++data.size,this;data=this.__data__=new MapCache_default(pairs)}return data.set(key3,value),this.size=data.size,this}var LARGE_ARRAY_SIZE,stackSet_default,init_stackSet=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stackSet.js"(){init_ListCache();init_Map();init_MapCache();LARGE_ARRAY_SIZE=200;__name(stackSet,"stackSet");stackSet_default=stackSet}});function Stack(entries){var data=this.__data__=new ListCache_default(entries);this.size=data.size}var Stack_default,init_Stack=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_Stack.js"(){init_ListCache();init_stackClear();init_stackDelete();init_stackGet();init_stackHas();init_stackSet();__name(Stack,"Stack");Stack.prototype.clear=stackClear_default;Stack.prototype.delete=stackDelete_default;Stack.prototype.get=stackGet_default;Stack.prototype.has=stackHas_default;Stack.prototype.set=stackSet_default;Stack_default=Stack}});function setCacheAdd(value){return this.__data__.set(value,HASH_UNDEFINED3),this}var HASH_UNDEFINED3,setCacheAdd_default,init_setCacheAdd=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_setCacheAdd.js"(){HASH_UNDEFINED3="__lodash_hash_undefined__";__name(setCacheAdd,"setCacheAdd");setCacheAdd_default=setCacheAdd}});function setCacheHas(value){return this.__data__.has(value)}var setCacheHas_default,init_setCacheHas=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_setCacheHas.js"(){__name(setCacheHas,"setCacheHas");setCacheHas_default=setCacheHas}});function SetCache(values2){var index=-1,length=values2==null?0:values2.length;for(this.__data__=new MapCache_default;++index<length;)this.add(values2[index])}var SetCache_default,init_SetCache=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_SetCache.js"(){init_MapCache();init_setCacheAdd();init_setCacheHas();__name(SetCache,"SetCache");SetCache.prototype.add=SetCache.prototype.push=setCacheAdd_default;SetCache.prototype.has=setCacheHas_default;SetCache_default=SetCache}});function arraySome(array2,predicate){for(var index=-1,length=array2==null?0:array2.length;++index<length;)if(predicate(array2[index],index,array2))return!0;return!1}var arraySome_default,init_arraySome=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arraySome.js"(){__name(arraySome,"arraySome");arraySome_default=arraySome}});function cacheHas(cache5,key3){return cache5.has(key3)}var cacheHas_default,init_cacheHas=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_cacheHas.js"(){__name(cacheHas,"cacheHas");cacheHas_default=cacheHas}});function equalArrays(array2,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array2.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength))return!1;var arrStacked=stack.get(array2),othStacked=stack.get(other);if(arrStacked&&othStacked)return arrStacked==other&&othStacked==array2;var index=-1,result2=!0,seen2=bitmask&COMPARE_UNORDERED_FLAG?new SetCache_default:void 0;for(stack.set(array2,other),stack.set(other,array2);++index<arrLength;){var arrValue=array2[index],othValue=other[index];if(customizer)var compared=isPartial?customizer(othValue,arrValue,index,other,array2,stack):customizer(arrValue,othValue,index,array2,other,stack);if(compared!==void 0){if(compared)continue;result2=!1;break}if(seen2){if(!arraySome_default(other,function(othValue2,othIndex){if(!cacheHas_default(seen2,othIndex)&&(arrValue===othValue2||equalFunc(arrValue,othValue2,bitmask,customizer,stack)))return seen2.push(othIndex)})){result2=!1;break}}else if(!(arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){result2=!1;break}}return stack.delete(array2),stack.delete(other),result2}var COMPARE_PARTIAL_FLAG,COMPARE_UNORDERED_FLAG,equalArrays_default,init_equalArrays=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_equalArrays.js"(){init_SetCache();init_arraySome();init_cacheHas();COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2;__name(equalArrays,"equalArrays");equalArrays_default=equalArrays}});var Uint8Array2,Uint8Array_default,init_Uint8Array=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_Uint8Array.js"(){init_root();Uint8Array2=root_default.Uint8Array,Uint8Array_default=Uint8Array2}});function mapToArray(map3){var index=-1,result2=Array(map3.size);return map3.forEach(function(value,key3){result2[++index]=[key3,value]}),result2}var mapToArray_default,init_mapToArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_mapToArray.js"(){__name(mapToArray,"mapToArray");mapToArray_default=mapToArray}});function setToArray(set3){var index=-1,result2=Array(set3.size);return set3.forEach(function(value){result2[++index]=value}),result2}var setToArray_default,init_setToArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_setToArray.js"(){__name(setToArray,"setToArray");setToArray_default=setToArray}});function equalByTag(object3,other,tag2,bitmask,customizer,equalFunc,stack){switch(tag2){case dataViewTag:if(object3.byteLength!=other.byteLength||object3.byteOffset!=other.byteOffset)return!1;object3=object3.buffer,other=other.buffer;case arrayBufferTag:return!(object3.byteLength!=other.byteLength||!equalFunc(new Uint8Array_default(object3),new Uint8Array_default(other)));case boolTag:case dateTag:case numberTag:return eq_default(+object3,+other);case errorTag:return object3.name==other.name&&object3.message==other.message;case regexpTag:case stringTag:return object3==other+"";case mapTag:var convert=mapToArray_default;case setTag:var isPartial=bitmask&COMPARE_PARTIAL_FLAG2;if(convert||(convert=setToArray_default),object3.size!=other.size&&!isPartial)return!1;var stacked=stack.get(object3);if(stacked)return stacked==other;bitmask|=COMPARE_UNORDERED_FLAG2,stack.set(object3,other);var result2=equalArrays_default(convert(object3),convert(other),bitmask,customizer,equalFunc,stack);return stack.delete(object3),result2;case symbolTag:if(symbolValueOf)return symbolValueOf.call(object3)==symbolValueOf.call(other)}return!1}var COMPARE_PARTIAL_FLAG2,COMPARE_UNORDERED_FLAG2,boolTag,dateTag,errorTag,mapTag,numberTag,regexpTag,setTag,stringTag,symbolTag,arrayBufferTag,dataViewTag,symbolProto,symbolValueOf,equalByTag_default,init_equalByTag=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_equalByTag.js"(){init_Symbol();init_Uint8Array();init_eq();init_equalArrays();init_mapToArray();init_setToArray();COMPARE_PARTIAL_FLAG2=1,COMPARE_UNORDERED_FLAG2=2,boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",mapTag="[object Map]",numberTag="[object Number]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",symbolTag="[object Symbol]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",symbolProto=Symbol_default?Symbol_default.prototype:void 0,symbolValueOf=symbolProto?symbolProto.valueOf:void 0;__name(equalByTag,"equalByTag");equalByTag_default=equalByTag}});function arrayPush(array2,values2){for(var index=-1,length=values2.length,offset=array2.length;++index<length;)array2[offset+index]=values2[index];return array2}var arrayPush_default,init_arrayPush=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arrayPush.js"(){__name(arrayPush,"arrayPush");arrayPush_default=arrayPush}});var isArray,isArray_default,init_isArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isArray.js"(){isArray=Array.isArray,isArray_default=isArray}});function baseGetAllKeys(object3,keysFunc,symbolsFunc){var result2=keysFunc(object3);return isArray_default(object3)?result2:arrayPush_default(result2,symbolsFunc(object3))}var baseGetAllKeys_default,init_baseGetAllKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseGetAllKeys.js"(){init_arrayPush();init_isArray();__name(baseGetAllKeys,"baseGetAllKeys");baseGetAllKeys_default=baseGetAllKeys}});function arrayFilter(array2,predicate){for(var index=-1,length=array2==null?0:array2.length,resIndex=0,result2=[];++index<length;){var value=array2[index];predicate(value,index,array2)&&(result2[resIndex++]=value)}return result2}var arrayFilter_default,init_arrayFilter=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arrayFilter.js"(){__name(arrayFilter,"arrayFilter");arrayFilter_default=arrayFilter}});function stubArray(){return[]}var stubArray_default,init_stubArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/stubArray.js"(){__name(stubArray,"stubArray");stubArray_default=stubArray}});var objectProto6,propertyIsEnumerable,nativeGetSymbols,getSymbols,getSymbols_default,init_getSymbols=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getSymbols.js"(){init_arrayFilter();init_stubArray();objectProto6=Object.prototype,propertyIsEnumerable=objectProto6.propertyIsEnumerable,nativeGetSymbols=Object.getOwnPropertySymbols,getSymbols=nativeGetSymbols?function(object3){return object3==null?[]:(object3=Object(object3),arrayFilter_default(nativeGetSymbols(object3),function(symbol2){return propertyIsEnumerable.call(object3,symbol2)}))}:stubArray_default,getSymbols_default=getSymbols}});function baseTimes(n4,iteratee2){for(var index=-1,result2=Array(n4);++index<n4;)result2[index]=iteratee2(index);return result2}var baseTimes_default,init_baseTimes=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseTimes.js"(){__name(baseTimes,"baseTimes");baseTimes_default=baseTimes}});function isObjectLike(value){return value!=null&&typeof value=="object"}var isObjectLike_default,init_isObjectLike=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isObjectLike.js"(){__name(isObjectLike,"isObjectLike");isObjectLike_default=isObjectLike}});function baseIsArguments(value){return isObjectLike_default(value)&&baseGetTag_default(value)==argsTag}var argsTag,baseIsArguments_default,init_baseIsArguments=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsArguments.js"(){init_baseGetTag();init_isObjectLike();argsTag="[object Arguments]";__name(baseIsArguments,"baseIsArguments");baseIsArguments_default=baseIsArguments}});var objectProto7,hasOwnProperty5,propertyIsEnumerable2,isArguments,isArguments_default,init_isArguments=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isArguments.js"(){init_baseIsArguments();init_isObjectLike();objectProto7=Object.prototype,hasOwnProperty5=objectProto7.hasOwnProperty,propertyIsEnumerable2=objectProto7.propertyIsEnumerable,isArguments=baseIsArguments_default((function(){return arguments})())?baseIsArguments_default:function(value){return isObjectLike_default(value)&&hasOwnProperty5.call(value,"callee")&&!propertyIsEnumerable2.call(value,"callee")},isArguments_default=isArguments}});function stubFalse(){return!1}var stubFalse_default,init_stubFalse=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/stubFalse.js"(){__name(stubFalse,"stubFalse");stubFalse_default=stubFalse}});var freeExports,freeModule,moduleExports,Buffer2,nativeIsBuffer,isBuffer,isBuffer_default,init_isBuffer=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isBuffer.js"(){init_root();init_stubFalse();freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports,freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module,moduleExports=freeModule&&freeModule.exports===freeExports,Buffer2=moduleExports?root_default.Buffer:void 0,nativeIsBuffer=Buffer2?Buffer2.isBuffer:void 0,isBuffer=nativeIsBuffer||stubFalse_default,isBuffer_default=isBuffer}});function isIndex(value,length){var type=typeof value;return length=length??MAX_SAFE_INTEGER,!!length&&(type=="number"||type!="symbol"&&reIsUint.test(value))&&value>-1&&value%1==0&&value<length}var MAX_SAFE_INTEGER,reIsUint,isIndex_default,init_isIndex=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_isIndex.js"(){MAX_SAFE_INTEGER=9007199254740991,reIsUint=/^(?:0|[1-9]\d*)$/;__name(isIndex,"isIndex");isIndex_default=isIndex}});function isLength(value){return typeof value=="number"&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER2}var MAX_SAFE_INTEGER2,isLength_default,init_isLength=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isLength.js"(){MAX_SAFE_INTEGER2=9007199254740991;__name(isLength,"isLength");isLength_default=isLength}});function baseIsTypedArray(value){return isObjectLike_default(value)&&isLength_default(value.length)&&!!typedArrayTags[baseGetTag_default(value)]}var argsTag2,arrayTag,boolTag2,dateTag2,errorTag2,funcTag2,mapTag2,numberTag2,objectTag,regexpTag2,setTag2,stringTag2,weakMapTag,arrayBufferTag2,dataViewTag2,float32Tag,float64Tag,int8Tag,int16Tag,int32Tag,uint8Tag,uint8ClampedTag,uint16Tag,uint32Tag,typedArrayTags,baseIsTypedArray_default,init_baseIsTypedArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsTypedArray.js"(){init_baseGetTag();init_isLength();init_isObjectLike();argsTag2="[object Arguments]",arrayTag="[object Array]",boolTag2="[object Boolean]",dateTag2="[object Date]",errorTag2="[object Error]",funcTag2="[object Function]",mapTag2="[object Map]",numberTag2="[object Number]",objectTag="[object Object]",regexpTag2="[object RegExp]",setTag2="[object Set]",stringTag2="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag2="[object ArrayBuffer]",dataViewTag2="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0;typedArrayTags[argsTag2]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag2]=typedArrayTags[boolTag2]=typedArrayTags[dataViewTag2]=typedArrayTags[dateTag2]=typedArrayTags[errorTag2]=typedArrayTags[funcTag2]=typedArrayTags[mapTag2]=typedArrayTags[numberTag2]=typedArrayTags[objectTag]=typedArrayTags[regexpTag2]=typedArrayTags[setTag2]=typedArrayTags[stringTag2]=typedArrayTags[weakMapTag]=!1;__name(baseIsTypedArray,"baseIsTypedArray");baseIsTypedArray_default=baseIsTypedArray}});function baseUnary(func){return function(value){return func(value)}}var baseUnary_default,init_baseUnary=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseUnary.js"(){__name(baseUnary,"baseUnary");baseUnary_default=baseUnary}});var freeExports2,freeModule2,moduleExports2,freeProcess,nodeUtil,nodeUtil_default,init_nodeUtil=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_nodeUtil.js"(){init_freeGlobal();freeExports2=typeof exports=="object"&&exports&&!exports.nodeType&&exports,freeModule2=freeExports2&&typeof module=="object"&&module&&!module.nodeType&&module,moduleExports2=freeModule2&&freeModule2.exports===freeExports2,freeProcess=moduleExports2&&freeGlobal_default.process,nodeUtil=(function(){try{var types3=freeModule2&&freeModule2.require&&freeModule2.require("util").types;return types3||freeProcess&&freeProcess.binding&&freeProcess.binding("util")}catch{}})(),nodeUtil_default=nodeUtil}});var nodeIsTypedArray,isTypedArray,isTypedArray_default,init_isTypedArray=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isTypedArray.js"(){init_baseIsTypedArray();init_baseUnary();init_nodeUtil();nodeIsTypedArray=nodeUtil_default&&nodeUtil_default.isTypedArray,isTypedArray=nodeIsTypedArray?baseUnary_default(nodeIsTypedArray):baseIsTypedArray_default,isTypedArray_default=isTypedArray}});function arrayLikeKeys(value,inherited){var isArr=isArray_default(value),isArg=!isArr&&isArguments_default(value),isBuff=!isArr&&!isArg&&isBuffer_default(value),isType=!isArr&&!isArg&&!isBuff&&isTypedArray_default(value),skipIndexes=isArr||isArg||isBuff||isType,result2=skipIndexes?baseTimes_default(value.length,String):[],length=result2.length;for(var key3 in value)(inherited||hasOwnProperty6.call(value,key3))&&!(skipIndexes&&(key3=="length"||isBuff&&(key3=="offset"||key3=="parent")||isType&&(key3=="buffer"||key3=="byteLength"||key3=="byteOffset")||isIndex_default(key3,length)))&&result2.push(key3);return result2}var objectProto8,hasOwnProperty6,arrayLikeKeys_default,init_arrayLikeKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_arrayLikeKeys.js"(){init_baseTimes();init_isArguments();init_isArray();init_isBuffer();init_isIndex();init_isTypedArray();objectProto8=Object.prototype,hasOwnProperty6=objectProto8.hasOwnProperty;__name(arrayLikeKeys,"arrayLikeKeys");arrayLikeKeys_default=arrayLikeKeys}});function isPrototype(value){var Ctor=value&&value.constructor,proto2=typeof Ctor=="function"&&Ctor.prototype||objectProto9;return value===proto2}var objectProto9,isPrototype_default,init_isPrototype=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_isPrototype.js"(){objectProto9=Object.prototype;__name(isPrototype,"isPrototype");isPrototype_default=isPrototype}});function overArg(func,transform3){return function(arg){return func(transform3(arg))}}var overArg_default,init_overArg=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_overArg.js"(){__name(overArg,"overArg");overArg_default=overArg}});var nativeKeys,nativeKeys_default,init_nativeKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_nativeKeys.js"(){init_overArg();nativeKeys=overArg_default(Object.keys,Object),nativeKeys_default=nativeKeys}});function baseKeys(object3){if(!isPrototype_default(object3))return nativeKeys_default(object3);var result2=[];for(var key3 in Object(object3))hasOwnProperty7.call(object3,key3)&&key3!="constructor"&&result2.push(key3);return result2}var objectProto10,hasOwnProperty7,baseKeys_default,init_baseKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseKeys.js"(){init_isPrototype();init_nativeKeys();objectProto10=Object.prototype,hasOwnProperty7=objectProto10.hasOwnProperty;__name(baseKeys,"baseKeys");baseKeys_default=baseKeys}});function isArrayLike(value){return value!=null&&isLength_default(value.length)&&!isFunction_default(value)}var isArrayLike_default,init_isArrayLike=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isArrayLike.js"(){init_isFunction();init_isLength();__name(isArrayLike,"isArrayLike");isArrayLike_default=isArrayLike}});function keys(object3){return isArrayLike_default(object3)?arrayLikeKeys_default(object3):baseKeys_default(object3)}var keys_default,init_keys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/keys.js"(){init_arrayLikeKeys();init_baseKeys();init_isArrayLike();__name(keys,"keys");keys_default=keys}});function getAllKeys(object3){return baseGetAllKeys_default(object3,keys_default,getSymbols_default)}var getAllKeys_default,init_getAllKeys=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getAllKeys.js"(){init_baseGetAllKeys();init_getSymbols();init_keys();__name(getAllKeys,"getAllKeys");getAllKeys_default=getAllKeys}});function equalObjects(object3,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG3,objProps=getAllKeys_default(object3),objLength=objProps.length,othProps=getAllKeys_default(other),othLength=othProps.length;if(objLength!=othLength&&!isPartial)return!1;for(var index=objLength;index--;){var key3=objProps[index];if(!(isPartial?key3 in other:hasOwnProperty8.call(other,key3)))return!1}var objStacked=stack.get(object3),othStacked=stack.get(other);if(objStacked&&othStacked)return objStacked==other&&othStacked==object3;var result2=!0;stack.set(object3,other),stack.set(other,object3);for(var skipCtor=isPartial;++index<objLength;){key3=objProps[index];var objValue=object3[key3],othValue=other[key3];if(customizer)var compared=isPartial?customizer(othValue,objValue,key3,other,object3,stack):customizer(objValue,othValue,key3,object3,other,stack);if(!(compared===void 0?objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):compared)){result2=!1;break}skipCtor||(skipCtor=key3=="constructor")}if(result2&&!skipCtor){var objCtor=object3.constructor,othCtor=other.constructor;objCtor!=othCtor&&"constructor"in object3&&"constructor"in other&&!(typeof objCtor=="function"&&objCtor instanceof objCtor&&typeof othCtor=="function"&&othCtor instanceof othCtor)&&(result2=!1)}return stack.delete(object3),stack.delete(other),result2}var COMPARE_PARTIAL_FLAG3,objectProto11,hasOwnProperty8,equalObjects_default,init_equalObjects=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_equalObjects.js"(){init_getAllKeys();COMPARE_PARTIAL_FLAG3=1,objectProto11=Object.prototype,hasOwnProperty8=objectProto11.hasOwnProperty;__name(equalObjects,"equalObjects");equalObjects_default=equalObjects}});var DataView2,DataView_default,init_DataView=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_DataView.js"(){init_getNative();init_root();DataView2=getNative_default(root_default,"DataView"),DataView_default=DataView2}});var Promise2,Promise_default,init_Promise=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_Promise.js"(){init_getNative();init_root();Promise2=getNative_default(root_default,"Promise"),Promise_default=Promise2}});var Set2,Set_default,init_Set=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_Set.js"(){init_getNative();init_root();Set2=getNative_default(root_default,"Set"),Set_default=Set2}});var WeakMap2,WeakMap_default,init_WeakMap=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_WeakMap.js"(){init_getNative();init_root();WeakMap2=getNative_default(root_default,"WeakMap"),WeakMap_default=WeakMap2}});var mapTag3,objectTag2,promiseTag,setTag3,weakMapTag2,dataViewTag3,dataViewCtorString,mapCtorString,promiseCtorString,setCtorString,weakMapCtorString,getTag,getTag_default,init_getTag=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getTag.js"(){init_DataView();init_Map();init_Promise();init_Set();init_WeakMap();init_baseGetTag();init_toSource();mapTag3="[object Map]",objectTag2="[object Object]",promiseTag="[object Promise]",setTag3="[object Set]",weakMapTag2="[object WeakMap]",dataViewTag3="[object DataView]",dataViewCtorString=toSource_default(DataView_default),mapCtorString=toSource_default(Map_default),promiseCtorString=toSource_default(Promise_default),setCtorString=toSource_default(Set_default),weakMapCtorString=toSource_default(WeakMap_default),getTag=baseGetTag_default;(DataView_default&&getTag(new DataView_default(new ArrayBuffer(1)))!=dataViewTag3||Map_default&&getTag(new Map_default)!=mapTag3||Promise_default&&getTag(Promise_default.resolve())!=promiseTag||Set_default&&getTag(new Set_default)!=setTag3||WeakMap_default&&getTag(new WeakMap_default)!=weakMapTag2)&&(getTag=__name(function(value){var result2=baseGetTag_default(value),Ctor=result2==objectTag2?value.constructor:void 0,ctorString=Ctor?toSource_default(Ctor):"";if(ctorString)switch(ctorString){case dataViewCtorString:return dataViewTag3;case mapCtorString:return mapTag3;case promiseCtorString:return promiseTag;case setCtorString:return setTag3;case weakMapCtorString:return weakMapTag2}return result2},"getTag"));getTag_default=getTag}});function baseIsEqualDeep(object3,other,bitmask,customizer,equalFunc,stack){var objIsArr=isArray_default(object3),othIsArr=isArray_default(other),objTag=objIsArr?arrayTag2:getTag_default(object3),othTag=othIsArr?arrayTag2:getTag_default(other);objTag=objTag==argsTag3?objectTag3:objTag,othTag=othTag==argsTag3?objectTag3:othTag;var objIsObj=objTag==objectTag3,othIsObj=othTag==objectTag3,isSameTag=objTag==othTag;if(isSameTag&&isBuffer_default(object3)){if(!isBuffer_default(other))return!1;objIsArr=!0,objIsObj=!1}if(isSameTag&&!objIsObj)return stack||(stack=new Stack_default),objIsArr||isTypedArray_default(object3)?equalArrays_default(object3,other,bitmask,customizer,equalFunc,stack):equalByTag_default(object3,other,objTag,bitmask,customizer,equalFunc,stack);if(!(bitmask&COMPARE_PARTIAL_FLAG4)){var objIsWrapped=objIsObj&&hasOwnProperty9.call(object3,"__wrapped__"),othIsWrapped=othIsObj&&hasOwnProperty9.call(other,"__wrapped__");if(objIsWrapped||othIsWrapped){var objUnwrapped=objIsWrapped?object3.value():object3,othUnwrapped=othIsWrapped?other.value():other;return stack||(stack=new Stack_default),equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack)}}return isSameTag?(stack||(stack=new Stack_default),equalObjects_default(object3,other,bitmask,customizer,equalFunc,stack)):!1}var COMPARE_PARTIAL_FLAG4,argsTag3,arrayTag2,objectTag3,objectProto12,hasOwnProperty9,baseIsEqualDeep_default,init_baseIsEqualDeep=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsEqualDeep.js"(){init_Stack();init_equalArrays();init_equalByTag();init_equalObjects();init_getTag();init_isArray();init_isBuffer();init_isTypedArray();COMPARE_PARTIAL_FLAG4=1,argsTag3="[object Arguments]",arrayTag2="[object Array]",objectTag3="[object Object]",objectProto12=Object.prototype,hasOwnProperty9=objectProto12.hasOwnProperty;__name(baseIsEqualDeep,"baseIsEqualDeep");baseIsEqualDeep_default=baseIsEqualDeep}});function baseIsEqual(value,other,bitmask,customizer,stack){return value===other?!0:value==null||other==null||!isObjectLike_default(value)&&!isObjectLike_default(other)?value!==value&&other!==other:baseIsEqualDeep_default(value,other,bitmask,customizer,baseIsEqual,stack)}var baseIsEqual_default,init_baseIsEqual=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsEqual.js"(){init_baseIsEqualDeep();init_isObjectLike();__name(baseIsEqual,"baseIsEqual");baseIsEqual_default=baseIsEqual}});function baseIsMatch(object3,source,matchData,customizer){var index=matchData.length,length=index,noCustomizer=!customizer;if(object3==null)return!length;for(object3=Object(object3);index--;){var data=matchData[index];if(noCustomizer&&data[2]?data[1]!==object3[data[0]]:!(data[0]in object3))return!1}for(;++index<length;){data=matchData[index];var key3=data[0],objValue=object3[key3],srcValue=data[1];if(noCustomizer&&data[2]){if(objValue===void 0&&!(key3 in object3))return!1}else{var stack=new Stack_default;if(customizer)var result2=customizer(objValue,srcValue,key3,object3,source,stack);if(!(result2===void 0?baseIsEqual_default(srcValue,objValue,COMPARE_PARTIAL_FLAG5|COMPARE_UNORDERED_FLAG3,customizer,stack):result2))return!1}}return!0}var COMPARE_PARTIAL_FLAG5,COMPARE_UNORDERED_FLAG3,baseIsMatch_default,init_baseIsMatch=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIsMatch.js"(){init_Stack();init_baseIsEqual();COMPARE_PARTIAL_FLAG5=1,COMPARE_UNORDERED_FLAG3=2;__name(baseIsMatch,"baseIsMatch");baseIsMatch_default=baseIsMatch}});function isStrictComparable(value){return value===value&&!isObject_default(value)}var isStrictComparable_default,init_isStrictComparable=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_isStrictComparable.js"(){init_isObject();__name(isStrictComparable,"isStrictComparable");isStrictComparable_default=isStrictComparable}});function getMatchData(object3){for(var result2=keys_default(object3),length=result2.length;length--;){var key3=result2[length],value=object3[key3];result2[length]=[key3,value,isStrictComparable_default(value)]}return result2}var getMatchData_default,init_getMatchData=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getMatchData.js"(){init_isStrictComparable();init_keys();__name(getMatchData,"getMatchData");getMatchData_default=getMatchData}});function matchesStrictComparable(key3,srcValue){return function(object3){return object3==null?!1:object3[key3]===srcValue&&(srcValue!==void 0||key3 in Object(object3))}}var matchesStrictComparable_default,init_matchesStrictComparable=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_matchesStrictComparable.js"(){__name(matchesStrictComparable,"matchesStrictComparable");matchesStrictComparable_default=matchesStrictComparable}});function baseMatches(source){var matchData=getMatchData_default(source);return matchData.length==1&&matchData[0][2]?matchesStrictComparable_default(matchData[0][0],matchData[0][1]):function(object3){return object3===source||baseIsMatch_default(object3,source,matchData)}}var baseMatches_default,init_baseMatches=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseMatches.js"(){init_baseIsMatch();init_getMatchData();init_matchesStrictComparable();__name(baseMatches,"baseMatches");baseMatches_default=baseMatches}});function isSymbol(value){return typeof value=="symbol"||isObjectLike_default(value)&&baseGetTag_default(value)==symbolTag2}var symbolTag2,isSymbol_default,init_isSymbol=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/isSymbol.js"(){init_baseGetTag();init_isObjectLike();symbolTag2="[object Symbol]";__name(isSymbol,"isSymbol");isSymbol_default=isSymbol}});function isKey(value,object3){if(isArray_default(value))return!1;var type=typeof value;return type=="number"||type=="symbol"||type=="boolean"||value==null||isSymbol_default(value)?!0:reIsPlainProp.test(value)||!reIsDeepProp.test(value)||object3!=null&&value in Object(object3)}var reIsDeepProp,reIsPlainProp,isKey_default,init_isKey=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_isKey.js"(){init_isArray();init_isSymbol();reIsDeepProp=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,reIsPlainProp=/^\w*$/;__name(isKey,"isKey");isKey_default=isKey}});function memoizeCapped(func){var result2=memoize_default(func,function(key3){return cache5.size===MAX_MEMOIZE_SIZE&&cache5.clear(),key3}),cache5=result2.cache;return result2}var MAX_MEMOIZE_SIZE,memoizeCapped_default,init_memoizeCapped=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_memoizeCapped.js"(){init_memoize();MAX_MEMOIZE_SIZE=500;__name(memoizeCapped,"memoizeCapped");memoizeCapped_default=memoizeCapped}});var rePropName,reEscapeChar,stringToPath,stringToPath_default,init_stringToPath=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_stringToPath.js"(){init_memoizeCapped();rePropName=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,reEscapeChar=/\\(\\)?/g,stringToPath=memoizeCapped_default(function(string4){var result2=[];return string4.charCodeAt(0)===46&&result2.push(""),string4.replace(rePropName,function(match,number4,quote2,subString){result2.push(quote2?subString.replace(reEscapeChar,"$1"):number4||match)}),result2}),stringToPath_default=stringToPath}});function baseToString(value){if(typeof value=="string")return value;if(isArray_default(value))return arrayMap_default(value,baseToString)+"";if(isSymbol_default(value))return symbolToString?symbolToString.call(value):"";var result2=value+"";return result2=="0"&&1/value==-INFINITY?"-0":result2}var INFINITY,symbolProto2,symbolToString,baseToString_default,init_baseToString=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseToString.js"(){init_Symbol();init_arrayMap();init_isArray();init_isSymbol();INFINITY=1/0,symbolProto2=Symbol_default?Symbol_default.prototype:void 0,symbolToString=symbolProto2?symbolProto2.toString:void 0;__name(baseToString,"baseToString");baseToString_default=baseToString}});function toString(value){return value==null?"":baseToString_default(value)}var toString_default,init_toString=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/toString.js"(){init_baseToString();__name(toString,"toString");toString_default=toString}});function castPath(value,object3){return isArray_default(value)?value:isKey_default(value,object3)?[value]:stringToPath_default(toString_default(value))}var castPath_default,init_castPath=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_castPath.js"(){init_isArray();init_isKey();init_stringToPath();init_toString();__name(castPath,"castPath");castPath_default=castPath}});function toKey(value){if(typeof value=="string"||isSymbol_default(value))return value;var result2=value+"";return result2=="0"&&1/value==-INFINITY2?"-0":result2}var INFINITY2,toKey_default,init_toKey=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_toKey.js"(){init_isSymbol();INFINITY2=1/0;__name(toKey,"toKey");toKey_default=toKey}});function baseGet(object3,path40){path40=castPath_default(path40,object3);for(var index=0,length=path40.length;object3!=null&&index<length;)object3=object3[toKey_default(path40[index++])];return index&&index==length?object3:void 0}var baseGet_default,init_baseGet=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseGet.js"(){init_castPath();init_toKey();__name(baseGet,"baseGet");baseGet_default=baseGet}});function get(object3,path40,defaultValue){var result2=object3==null?void 0:baseGet_default(object3,path40);return result2===void 0?defaultValue:result2}var get_default,init_get=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/get.js"(){init_baseGet();__name(get,"get");get_default=get}});function baseHasIn(object3,key3){return object3!=null&&key3 in Object(object3)}var baseHasIn_default,init_baseHasIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseHasIn.js"(){__name(baseHasIn,"baseHasIn");baseHasIn_default=baseHasIn}});function hasPath(object3,path40,hasFunc){path40=castPath_default(path40,object3);for(var index=-1,length=path40.length,result2=!1;++index<length;){var key3=toKey_default(path40[index]);if(!(result2=object3!=null&&hasFunc(object3,key3)))break;object3=object3[key3]}return result2||++index!=length?result2:(length=object3==null?0:object3.length,!!length&&isLength_default(length)&&isIndex_default(key3,length)&&(isArray_default(object3)||isArguments_default(object3)))}var hasPath_default,init_hasPath=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_hasPath.js"(){init_castPath();init_isArguments();init_isArray();init_isIndex();init_isLength();init_toKey();__name(hasPath,"hasPath");hasPath_default=hasPath}});function hasIn(object3,path40){return object3!=null&&hasPath_default(object3,path40,baseHasIn_default)}var hasIn_default,init_hasIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/hasIn.js"(){init_baseHasIn();init_hasPath();__name(hasIn,"hasIn");hasIn_default=hasIn}});function baseMatchesProperty(path40,srcValue){return isKey_default(path40)&&isStrictComparable_default(srcValue)?matchesStrictComparable_default(toKey_default(path40),srcValue):function(object3){var objValue=get_default(object3,path40);return objValue===void 0&&objValue===srcValue?hasIn_default(object3,path40):baseIsEqual_default(srcValue,objValue,COMPARE_PARTIAL_FLAG6|COMPARE_UNORDERED_FLAG4)}}var COMPARE_PARTIAL_FLAG6,COMPARE_UNORDERED_FLAG4,baseMatchesProperty_default,init_baseMatchesProperty=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseMatchesProperty.js"(){init_baseIsEqual();init_get();init_hasIn();init_isKey();init_isStrictComparable();init_matchesStrictComparable();init_toKey();COMPARE_PARTIAL_FLAG6=1,COMPARE_UNORDERED_FLAG4=2;__name(baseMatchesProperty,"baseMatchesProperty");baseMatchesProperty_default=baseMatchesProperty}});function identity(value){return value}var identity_default,init_identity=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/identity.js"(){__name(identity,"identity");identity_default=identity}});function baseProperty(key3){return function(object3){return object3?.[key3]}}var baseProperty_default,init_baseProperty=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseProperty.js"(){__name(baseProperty,"baseProperty");baseProperty_default=baseProperty}});function basePropertyDeep(path40){return function(object3){return baseGet_default(object3,path40)}}var basePropertyDeep_default,init_basePropertyDeep=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_basePropertyDeep.js"(){init_baseGet();__name(basePropertyDeep,"basePropertyDeep");basePropertyDeep_default=basePropertyDeep}});function property(path40){return isKey_default(path40)?baseProperty_default(toKey_default(path40)):basePropertyDeep_default(path40)}var property_default,init_property=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/property.js"(){init_baseProperty();init_basePropertyDeep();init_isKey();init_toKey();__name(property,"property");property_default=property}});function baseIteratee(value){return typeof value=="function"?value:value==null?identity_default:typeof value=="object"?isArray_default(value)?baseMatchesProperty_default(value[0],value[1]):baseMatches_default(value):property_default(value)}var baseIteratee_default,init_baseIteratee=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseIteratee.js"(){init_baseMatches();init_baseMatchesProperty();init_identity();init_isArray();init_property();__name(baseIteratee,"baseIteratee");baseIteratee_default=baseIteratee}});var defineProperty,defineProperty_default,init_defineProperty=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_defineProperty.js"(){init_getNative();defineProperty=(function(){try{var func=getNative_default(Object,"defineProperty");return func({},"",{}),func}catch{}})(),defineProperty_default=defineProperty}});function baseAssignValue(object3,key3,value){key3=="__proto__"&&defineProperty_default?defineProperty_default(object3,key3,{configurable:!0,enumerable:!0,value,writable:!0}):object3[key3]=value}var baseAssignValue_default,init_baseAssignValue=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseAssignValue.js"(){init_defineProperty();__name(baseAssignValue,"baseAssignValue");baseAssignValue_default=baseAssignValue}});function assignValue(object3,key3,value){var objValue=object3[key3];(!(hasOwnProperty10.call(object3,key3)&&eq_default(objValue,value))||value===void 0&&!(key3 in object3))&&baseAssignValue_default(object3,key3,value)}var objectProto13,hasOwnProperty10,assignValue_default,init_assignValue=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_assignValue.js"(){init_baseAssignValue();init_eq();objectProto13=Object.prototype,hasOwnProperty10=objectProto13.hasOwnProperty;__name(assignValue,"assignValue");assignValue_default=assignValue}});function baseSet(object3,path40,value,customizer){if(!isObject_default(object3))return object3;path40=castPath_default(path40,object3);for(var index=-1,length=path40.length,lastIndex=length-1,nested=object3;nested!=null&&++index<length;){var key3=toKey_default(path40[index]),newValue=value;if(key3==="__proto__"||key3==="constructor"||key3==="prototype")return object3;if(index!=lastIndex){var objValue=nested[key3];newValue=customizer?customizer(objValue,key3,nested):void 0,newValue===void 0&&(newValue=isObject_default(objValue)?objValue:isIndex_default(path40[index+1])?[]:{})}assignValue_default(nested,key3,newValue),nested=nested[key3]}return object3}var baseSet_default,init_baseSet=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseSet.js"(){init_assignValue();init_castPath();init_isIndex();init_isObject();init_toKey();__name(baseSet,"baseSet");baseSet_default=baseSet}});function basePickBy(object3,paths2,predicate){for(var index=-1,length=paths2.length,result2={};++index<length;){var path40=paths2[index],value=baseGet_default(object3,path40);predicate(value,path40)&&baseSet_default(result2,castPath_default(path40,object3),value)}return result2}var basePickBy_default,init_basePickBy=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_basePickBy.js"(){init_baseGet();init_baseSet();init_castPath();__name(basePickBy,"basePickBy");basePickBy_default=basePickBy}});var getPrototype,getPrototype_default,init_getPrototype=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getPrototype.js"(){init_overArg();getPrototype=overArg_default(Object.getPrototypeOf,Object),getPrototype_default=getPrototype}});var nativeGetSymbols2,getSymbolsIn,getSymbolsIn_default,init_getSymbolsIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getSymbolsIn.js"(){init_arrayPush();init_getPrototype();init_getSymbols();init_stubArray();nativeGetSymbols2=Object.getOwnPropertySymbols,getSymbolsIn=nativeGetSymbols2?function(object3){for(var result2=[];object3;)arrayPush_default(result2,getSymbols_default(object3)),object3=getPrototype_default(object3);return result2}:stubArray_default,getSymbolsIn_default=getSymbolsIn}});function nativeKeysIn(object3){var result2=[];if(object3!=null)for(var key3 in Object(object3))result2.push(key3);return result2}var nativeKeysIn_default,init_nativeKeysIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_nativeKeysIn.js"(){__name(nativeKeysIn,"nativeKeysIn");nativeKeysIn_default=nativeKeysIn}});function baseKeysIn(object3){if(!isObject_default(object3))return nativeKeysIn_default(object3);var isProto=isPrototype_default(object3),result2=[];for(var key3 in object3)key3=="constructor"&&(isProto||!hasOwnProperty11.call(object3,key3))||result2.push(key3);return result2}var objectProto14,hasOwnProperty11,baseKeysIn_default,init_baseKeysIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseKeysIn.js"(){init_isObject();init_isPrototype();init_nativeKeysIn();objectProto14=Object.prototype,hasOwnProperty11=objectProto14.hasOwnProperty;__name(baseKeysIn,"baseKeysIn");baseKeysIn_default=baseKeysIn}});function keysIn(object3){return isArrayLike_default(object3)?arrayLikeKeys_default(object3,!0):baseKeysIn_default(object3)}var keysIn_default,init_keysIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/keysIn.js"(){init_arrayLikeKeys();init_baseKeysIn();init_isArrayLike();__name(keysIn,"keysIn");keysIn_default=keysIn}});function getAllKeysIn(object3){return baseGetAllKeys_default(object3,keysIn_default,getSymbolsIn_default)}var getAllKeysIn_default,init_getAllKeysIn=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_getAllKeysIn.js"(){init_baseGetAllKeys();init_getSymbolsIn();init_keysIn();__name(getAllKeysIn,"getAllKeysIn");getAllKeysIn_default=getAllKeysIn}});function pickBy(object3,predicate){if(object3==null)return{};var props=arrayMap_default(getAllKeysIn_default(object3),function(prop){return[prop]});return predicate=baseIteratee_default(predicate),basePickBy_default(object3,props,function(value,path40){return predicate(value,path40[0])})}var pickBy_default,init_pickBy=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/pickBy.js"(){init_arrayMap();init_baseIteratee();init_basePickBy();init_getAllKeysIn();__name(pickBy,"pickBy");pickBy_default=pickBy}});function baseSum(array2,iteratee2){for(var result2,index=-1,length=array2.length;++index<length;){var current=iteratee2(array2[index]);current!==void 0&&(result2=result2===void 0?current:result2+current)}return result2}var baseSum_default,init_baseSum=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/_baseSum.js"(){__name(baseSum,"baseSum");baseSum_default=baseSum}});function sumBy(array2,iteratee2){return array2&&array2.length?baseSum_default(array2,baseIteratee_default(iteratee2,2)):0}var sumBy_default,init_sumBy=__esm({"../../../rustfleet/wt/rel136/node_modules/lodash-es/sumBy.js"(){init_baseIteratee();init_baseSum();__name(sumBy,"sumBy");sumBy_default=sumBy}});function classifyReviewFindings(reviewText,plantedFingerprints=[]){let text3=String(reviewText??"").trim();if(!text3)return{empty:!0,lgtmOnly:!0,findingLineCount:0,namesArtifacts:!1,matchedFingerprints:[],caughtPlantedBug:!1};let lower4=text3.toLowerCase(),lines=text3.split(/\n/).map(l=>l.trim()).filter(Boolean),findingLineCount=0;for(let line of lines)(FINDING_LINE_RE.test(line)||/:\d+/.test(line)||/`[^`]+`/.test(line))&&(findingLineCount+=1);let namesArtifacts=/\b[\w.-]+\.(?:ts|tsx|js|jsx|py|go|rs|java|md)\b/.test(text3)||/\b(src|tests?|lib|pkg)\//.test(text3)||/`[A-Za-z_][\w.]*`/.test(text3),matchedFingerprints=[];for(let fp of plantedFingerprints){let f3=String(fp||"").trim();f3&&lower4.includes(f3.toLowerCase())&&matchedFingerprints.push(f3)}let compact3=text3.replace(/\s+/g," ").trim(),lgtmOnly=LGTM_RE.test(compact3)||PRAISE_ONLY_RE.test(compact3)||findingLineCount===0&&!namesArtifacts&&matchedFingerprints.length===0&&/looks good|lgtm|no issues|ship it|approved|没问题|可以合并|没有问题/i.test(compact3)&&compact3.length<280;return{empty:lgtmOnly||findingLineCount===0&&matchedFingerprints.length===0&&!namesArtifacts&&compact3.length<40,lgtmOnly,findingLineCount,namesArtifacts,matchedFingerprints,caughtPlantedBug:matchedFingerprints.length>0}}function reviewMayAllowKeep(input2){let classification=classifyReviewFindings(input2.reviewText,input2.plantedFingerprints??[]),hasMutation=input2.hasMutation===!0||(input2.mutationFileCount??0)>0,multiFile=(input2.mutationFileCount??0)>=2,verifyFailed=input2.verifyFailed===!0,claimed=input2.claimedComplete===!0;if(verifyFailed&&classification.empty)return{allowKeep:!1,reason:"verify failed and review has no findings",classification};if(hasMutation&&claimed&&classification.empty)return{allowKeep:!1,reason:"completion claim after mutation with empty/LGTM review",classification};if(multiFile&&classification.lgtmOnly&&(input2.plantedFingerprints?.length??0)>0&&!classification.caughtPlantedBug)return{allowKeep:!1,reason:"multi-file review missed planted fingerprints",classification};if((input2.plantedFingerprints?.length??0)>0&&!classification.caughtPlantedBug&&hasMutation)return{allowKeep:!1,reason:"review missed planted bug fingerprints",classification};let citeIds=input2.digestCiteIds??[],digestPaths=input2.digestPaths??[],hasDigestAnchors=citeIds.length>0||digestPaths.length>0,digestPressure=input2.requireDigestCite===!0||hasMutation&&(claimed||multiFile||verifyFailed);if(hasDigestAnchors&&digestPressure&&!classification.caughtPlantedBug){let text3=String(input2.reviewText??"");if(!text3.trim())return{allowKeep:!1,reason:"review missing payload digest cite ids/paths (empty_review)",classification};let hitCite=citeIds.some(id=>text3.includes(id)),hitPath=digestPaths.some(p=>{let base=p.split("/").pop()||p;return text3.includes(p)||base.length>3&&text3.includes(base)});if(!hitCite&&!hitPath)return{allowKeep:!1,reason:"review missing payload digest cite ids/paths (no_cite_or_path_in_review)",classification}}return{allowKeep:!0,reason:classification.caughtPlantedBug?"review caught planted fingerprint(s)":classification.empty?"empty review allowed (no mutation/claim pressure)":"review has substantive findings or no planted bugs",classification}}var LGTM_RE,PRAISE_ONLY_RE,FINDING_LINE_RE,init_reviewFindingsGate=__esm({"src/runtime/reviewFindingsGate.ts"(){LGTM_RE=/^\s*(lgtm|looks good|looks great|ship it|approved|no issues?|no problems?|no bugs?|all good|sgtm|👍)\s*[.!]?\s*$/im,PRAISE_ONLY_RE=/^(?:the code (?:looks|seems) (?:fine|good|correct|solid)|no changes needed|ready to merge)\.?$/im,FINDING_LINE_RE=/^\s*(?:[-*•]|\d+[.)]|FINDINGS?:|BUG\b|ISSUE\b|PROBLEM\b|缺陷|问题|错误)\s+/im;__name(classifyReviewFindings,"classifyReviewFindings");__name(reviewMayAllowKeep,"reviewMayAllowKeep")}});var sessionPayloadDigest_exports={};__export(sessionPayloadDigest_exports,{clearSessionPayloadDigest:()=>clearSessionPayloadDigest,getSessionPayloadDigest:()=>getSessionPayloadDigest,getSessionPayloadDigestAgeMs:()=>getSessionPayloadDigestAgeMs,resetSessionPayloadDigestForTests:()=>resetSessionPayloadDigestForTests,setSessionPayloadDigest:()=>setSessionPayloadDigest});function setSessionPayloadDigest(digest){lastDigest=digest??null,lastSetAtMs=digest?Date.now():0}function getSessionPayloadDigest(){return lastDigest}function clearSessionPayloadDigest(){lastDigest=null,lastSetAtMs=0}function getSessionPayloadDigestAgeMs(now3=Date.now()){return!lastDigest||!lastSetAtMs?null:now3-lastSetAtMs}function resetSessionPayloadDigestForTests(){clearSessionPayloadDigest()}var lastDigest,lastSetAtMs,init_sessionPayloadDigest=__esm({"src/runtime/sessionPayloadDigest.ts"(){lastDigest=null,lastSetAtMs=0;__name(setSessionPayloadDigest,"setSessionPayloadDigest");__name(getSessionPayloadDigest,"getSessionPayloadDigest");__name(clearSessionPayloadDigest,"clearSessionPayloadDigest");__name(getSessionPayloadDigestAgeMs,"getSessionPayloadDigestAgeMs");__name(resetSessionPayloadDigestForTests,"resetSessionPayloadDigestForTests")}});var reviewHardGate_exports={};__export(reviewHardGate_exports,{computeReviewHardGate:()=>computeReviewHardGate,extractRecentReviewText:()=>extractRecentReviewText,extractV1ReviewVerdict:()=>extractV1ReviewVerdict,indexAfterLatestMutation:()=>indexAfterLatestMutation,isReviewHardGateDisabled:()=>isReviewHardGateDisabled,looksLikeIndependentReviewBody:()=>looksLikeIndependentReviewBody,parseReviewShipVerdict:()=>parseReviewShipVerdict,resolveReviewGateTierFields:()=>resolveReviewGateTierFields});function resolveReviewGateTierFields(input2){return input2.pathTierDecision?{pathTier:String(input2.pathTierDecision.tier||"").toUpperCase()||null,allowBlockingReview:input2.pathTierDecision.allowBlockingReview===!0}:{pathTier:input2.pathTier??null,allowBlockingReview:input2.allowBlockingReview}}function parseReviewShipVerdict(reviewText){let text3=String(reviewText??"").trim();if(!text3)return"none";let lower4=text3.toLowerCase(),structured=/\bverdict\s*[::]\s*(ship|fix[_-]?first|fix|rethink|lgtm|approve[d]?)\b/i.exec(text3);if(structured?.[1]){let v2=structured[1].toLowerCase().replace(/-/g,"_");return v2==="ship"||v2==="lgtm"||v2.startsWith("approve")?"ship":v2==="rethink"?"rethink":"fix_first"}if(/\b(rethink|re-?architect|start over|wrong approach|从根本上重来|重新设计)\b/i.test(text3))return"rethink";if(/\b(fix[_-\s]?first|must fix|blocking issue|do not (?:merge|ship)|needs? fix|阻塞|必须先修|不能合并)\b/i.test(text3))return"fix_first";if(/\b(ship(?:\s+it)?|ready to (?:merge|ship)|approved|lgtm|sgtm|可以合并|可以发版|审查通过)\b/i.test(lower4))return"ship";let cls=classifyReviewFindings(text3);return cls.empty||cls.lgtmOnly?"empty":cls.findingLineCount>0?"fix_first":"empty"}function tierRequiresReview(pathTier,allowBlockingReview){let tier=String(pathTier||"").toUpperCase();return tier==="T0"?{required:!1,tier:"T0"}:tier==="T2"?{required:!0,tier:"T2"}:tier==="T1"?allowBlockingReview===!1?{required:!1,tier:"T1"}:{required:!0,tier:"T1"}:allowBlockingReview===!0?{required:!0,tier:tier||"T?"}:{required:!1,tier:tier||""}}function computeReviewHardGate(input2){let fields=resolveReviewGateTierFields(input2),{required:required2,tier}=tierRequiresReview(fields.pathTier,fields.allowBlockingReview);if(!required2)return null;let phrase=findCompletionClaimPhrase(input2.assistantText);if(!phrase||!(input2.hasMutation===!0||(input2.mutationFileCount??0)>0))return null;let verdict2=input2.reviewVerdict??parseReviewShipVerdict(input2.reviewText);if(verdict2==="ship"){let digestCiteIds=input2.digestCiteIds,digestPaths=input2.digestPaths;if(!digestCiteIds?.length&&!digestPaths?.length)try{let{getSessionPayloadDigest:getSessionPayloadDigest2}=(init_sessionPayloadDigest(),__toCommonJS(sessionPayloadDigest_exports)),dig=getSessionPayloadDigest2();dig&&(digestCiteIds=dig.citeIds,digestPaths=dig.paths)}catch{}let keep=reviewMayAllowKeep({reviewText:input2.reviewText,hasMutation:!0,mutationFileCount:input2.mutationFileCount,verifyFailed:input2.verifyFailed,claimedComplete:!0,digestCiteIds,digestPaths});if(!keep.allowKeep){let digestMiss=/digest cite/i.test(keep.reason);return{reason:`Review hard gate (${tier}): completion phrase "${phrase}" but review failed keep gate (${keep.reason}). Independent review must return VERDICT: ship with substantive checks`+(digestMiss?" grounded in payload digest cite ids/paths":"")+" (or fix-first)."+(input2.sameModelReview?" Note: review model equals main \u2014 prefer a distinct review slot for independence.":""),matchedPhrase:phrase,pathTier:tier,reviewVerdict:"empty",line:digestMiss?`review-gate: blocked \xB7 ${tier} \xB7 digest_cite`:`review-gate: blocked \xB7 ${tier} \xB7 empty_ship`,nextStep:digestMiss?"Re-run review citing PAYLOAD DIGEST chunk ids / paths; VERDICT: ship|fix_first|rethink; then restate completion.":"Run review slot (distinct model if possible), return VERDICT: ship|fix_first|rethink with concrete findings, then restate completion."}}return null}return verdict2==="none"?{reason:`Review hard gate (${tier}): completion phrase "${phrase}" with mutations but **no independent review ship**. On T1/T2, delivery requires review-slot VERDICT: ship before honest-done (sol-advisor pattern). Do not claim done until review returns ship (or mark not-applicable with evidence).`+(input2.sameModelReview?" Prefer a review model \u2260 main for independence.":""),matchedPhrase:phrase,pathTier:tier,reviewVerdict:"none",line:`review-gate: blocked \xB7 ${tier} \xB7 no_review`,nextStep:"Invoke independent review (review slot), address findings, obtain VERDICT: ship, then restate completion with evidence."}:verdict2==="fix_first"||verdict2==="rethink"?{reason:`Review hard gate (${tier}): completion phrase "${phrase}" but review returned **${verdict2.replace("_","-")}**. Cannot honest-done until findings are fixed and review returns VERDICT: ship.`,matchedPhrase:phrase,pathTier:tier,reviewVerdict:verdict2,line:`review-gate: blocked \xB7 ${tier} \xB7 ${verdict2}`,nextStep:verdict2==="rethink"?"Revisit approach per review, re-implement, re-review, then claim done only after VERDICT: ship.":"Fix review findings, re-run review for VERDICT: ship, then restate completion."}:{reason:`Review hard gate (${tier}): completion phrase "${phrase}" but review is empty/rubber-stamp. Require substantive independent review with VERDICT: ship.`,matchedPhrase:phrase,pathTier:tier,reviewVerdict:"empty",line:`review-gate: blocked \xB7 ${tier} \xB7 empty`,nextStep:"Re-run review with concrete path:line findings or explicit VERDICT: ship after checks."}}function isReviewHardGateDisabled(env5=process.env){let raw=env5.CLAVUE_REVIEW_HARD_GATE;if(raw===void 0||raw==="")return!1;let v2=String(raw).trim().toLowerCase();return v2==="0"||v2==="false"||v2==="off"||v2==="no"}function assistantTextFromMessage(m3){let content=m3.message?.content;if(typeof content=="string")return content;if(!Array.isArray(content))return"";let parts=[];for(let b3 of content)b3?.type==="text"&&typeof b3.text=="string"&&parts.push(b3.text);return parts.join(`
38
38
  `)}function looksLikeIndependentReviewBody(text3){let t7=String(text3||"").trim();return t7?!!(/\bverdict\s*[::]/i.test(t7)||/\bFINDINGS?\s*[::]/i.test(t7)||/\bFINDINGS?\b/i.test(t7)&&t7.split(`
39
39
  `).length>=2||/\b(independent review|审查结论|评审意见)\b/i.test(t7)||/^(?:#{1,3}\s*)?(?:code\s+)?review\s*(?:report|result|notes)?\s*[::]?\s*$/im.test(t7)):!1}function indexAfterLatestMutation(messages){if(!messages?.length)return 0;let toolNameById=new Map,after2=0;for(let i3=0;i3<messages.length;i3++){let m3=messages[i3];if(m3?.type==="assistant"&&Array.isArray(m3.message?.content))for(let b3 of m3.message.content)b3?.type==="tool_use"&&b3.id&&b3.name&&toolNameById.set(b3.id,b3.name);if(m3?.type==="user"&&Array.isArray(m3.message?.content))for(let b3 of m3.message.content){if(b3?.type!=="tool_result"||!b3.tool_use_id||b3.is_error===!0)continue;let name=toolNameById.get(b3.tool_use_id);name&&MUTATION_TOOL_NAMES.has(name)&&(after2=i3+1)}}return after2}function extractV1ReviewVerdict(messages){if(!messages?.length)return null;let minIndex=indexAfterLatestMutation(messages);for(let i3=messages.length-1;i3>=minIndex;i3--){let m3=messages[i3];if(m3?.type!=="user")continue;let body=assistantTextFromMessage(m3),match=V1_REVIEW_HEADER_RE.exec(body);if(match)return{model:match[1].trim(),text:body.slice(match[0].length).trim()}}return null}function extractRecentReviewText(messages){if(!messages?.length)return null;let minIndex=indexAfterLatestMutation(messages),v1=extractV1ReviewVerdict(messages);if(v1?.text)return v1.text;for(let i3=messages.length-1;i3>=minIndex;i3--){let m3=messages[i3];if(m3?.type!=="assistant"||m3.isApiErrorMessage)continue;let t7=assistantTextFromMessage(m3).trim();if(t7&&/\bverdict\s*[::]/i.test(t7))return t7}for(let i3=messages.length-1;i3>=minIndex;i3--){let m3=messages[i3];if(m3?.type!=="assistant"||m3.isApiErrorMessage)continue;let t7=assistantTextFromMessage(m3).trim();if(t7&&looksLikeIndependentReviewBody(t7))return t7}return null}var MUTATION_TOOL_NAMES,V1_REVIEW_HEADER_RE,init_reviewHardGate=__esm({"src/runtime/reviewHardGate.ts"(){init_honestCompletion();init_reviewFindingsGate();__name(resolveReviewGateTierFields,"resolveReviewGateTierFields");__name(parseReviewShipVerdict,"parseReviewShipVerdict");__name(tierRequiresReview,"tierRequiresReview");__name(computeReviewHardGate,"computeReviewHardGate");__name(isReviewHardGateDisabled,"isReviewHardGateDisabled");MUTATION_TOOL_NAMES=new Set(["Edit","Write","NotebookEdit","MultiEdit"]);__name(assistantTextFromMessage,"assistantTextFromMessage");__name(looksLikeIndependentReviewBody,"looksLikeIndependentReviewBody");__name(indexAfterLatestMutation,"indexAfterLatestMutation");V1_REVIEW_HEADER_RE=/^\s*\[review by ([^\]\n]+)\]\s*\n?/;__name(extractV1ReviewVerdict,"extractV1ReviewVerdict");__name(extractRecentReviewText,"extractRecentReviewText")}});var imageGenerationIntent_exports={};__export(imageGenerationIntent_exports,{imageIntentReminder:()=>imageIntentReminder,isImageEditIntent:()=>isImageEditIntent,isImageGenerationIntent:()=>isImageGenerationIntent});function isImageGenerationIntent(text3){let t7=String(text3||"").trim();return t7?IMAGE_GEN_INTENT_RE.test(t7):!1}function isImageEditIntent(text3){let t7=String(text3||"").trim();return t7?IMAGE_EDIT_INTENT_RE.test(t7):!1}function imageIntentReminder(text3,opts){let hasGen=opts?.hasImageGen!==!1,hasEdit=opts?.hasImageEdit!==!1;return!hasGen&&!hasEdit?null:isImageEditIntent(text3)&&hasEdit?["MANDATORY IMAGE EDIT: User asked to edit/transform an image.","First tool call this turn MUST be image_edit (path or [Image #N]).","Do not claim done with only Read/Edit of code/XML. Save to images/N.png then wire assets."].join(" "):isImageGenerationIntent(text3)&&hasGen?["MANDATORY IMAGE GEN: User asked for icon/image/UI visual assets.","First tool call this turn MUST be image_gen (or image_edit if a source exists).","Save to images/N.png, then Edit project to reference it.","Forbidden: only describing the image, or only editing XML/resources without image_gen.","If login/BYOK missing, say so after attempting the tool \u2014 do not silently skip."].join(" "):null}var IMAGE_GEN_INTENT_RE,IMAGE_EDIT_INTENT_RE,init_imageGenerationIntent=__esm({"src/utils/imageGenerationIntent.ts"(){IMAGE_GEN_INTENT_RE=/(?:\b(?:draw|generate|create|make|design|paint|render|optimize|improve|refresh|polish)\b.{0,48}\b(?:icon|logo|illustration|poster|wallpaper|sprite|banner|thumbnail|favicon|app\s*icon|launcher)\b)|(?:\b(?:icon|logo|illustration|poster|wallpaper|sprite|banner|thumbnail|favicon)\b.{0,48}\b(?:draw|generate|create|make|design|paint|render|optimize|polish)\b)|(?:画(?:一)?[张个幅]?|生成|做[一]?个?|优化|换|改)(?:一个|张|个)?\s*(?:app\s*)?(?:图标|logo|海报|壁纸|插画|素材)|(?:图标|logo|海报|壁纸).{0,16}(?:生成|优化|换|做|改)|(?:app\s*icon|launcher\s*icon|ic_launcher)|(?:优化图标|改图标|换图标|生成图标|图标优化)|(?:原生).{0,20}(?:图标|菜单)|(?:图标).{0,20}(?:原生|菜单栏)/i,IMAGE_EDIT_INTENT_RE=/(?:\b(?:edit|restyle|remix|transform|vary|inpaint)\b.{0,40}\b(?:image|icon|logo|photo|picture)\b)|(?:改|编辑|重绘|变体).{0,12}(?:图|图标|logo)|\[Image\s*#\d+\]|Image\s*#\d+/i;__name(isImageGenerationIntent,"isImageGenerationIntent");__name(isImageEditIntent,"isImageEditIntent");__name(imageIntentReminder,"imageIntentReminder")}});var turnQualityGates_exports={};__export(turnQualityGates_exports,{evaluateImageAssetCompletionGate:()=>evaluateImageAssetCompletionGate,formatMidCycleReviewPublicNotice:()=>formatMidCycleReviewPublicNotice,imageAssetToolsUsed:()=>imageAssetToolsUsed,recoverCleanTaskGoal:()=>recoverCleanTaskGoal,turnRequiresImageAssetTool:()=>turnRequiresImageAssetTool});function toolUsesInMessages(messages){let names2=[];if(!messages)return names2;for(let msg of messages){if(msg.type!=="assistant"&&msg.message?.role!=="assistant")continue;let content=msg.message?.content??msg.content;if(Array.isArray(content))for(let b3 of content)b3&&typeof b3=="object"&&b3.type==="tool_use"&&names2.push(String(b3.name||""))}return names2}function turnRequiresImageAssetTool(userText){return isImageGenerationIntent(userText)||isImageEditIntent(userText)}function imageAssetToolsUsed(messages){return toolUsesInMessages(messages).some(n4=>n4==="image_gen"||n4==="image_edit"||n4==="ImageGen"||n4==="ImageEdit")}function evaluateImageAssetCompletionGate(input2){return input2.imageToolsMounted===!1?{block:!1,reason:"no_image_tools",line:""}:turnRequiresImageAssetTool(input2.userText)?imageAssetToolsUsed(input2.messages)?{block:!1,reason:"image_tools_used",line:""}:/(?:\b(?:done|complete|finished|ready\s+to\s+ship|all\s+done)\b|已完成|完成了|任务已完成|搞定|修复完成|实现完成|开发完成)/i.test(String(input2.assistantText||""))?{block:!0,reason:"image_asset_missing",line:"honesty: blocked \xB7 icon/image intent requires image_gen or image_edit before completion claim"}:{block:!1,reason:"no_claim",line:"image_gate: intent active \u2014 call image_gen/image_edit before claiming done"}:{block:!1,reason:"no_image_intent",line:""}}function formatMidCycleReviewPublicNotice(input2){let model=String(input2.model||"review").trim()||"review",seam=String(input2.seamLine||"").trim(),preview2=String(input2.findingsPreview||"").replace(/\s+/g," ").trim().slice(0,280),parts=[input2.degraded?`\u{1F441} Mid-cycle review degraded (${model})`:`\u{1F441} Mid-cycle review \xB7 ${model}`];return seam&&parts.push(seam),preview2&&parts.push(preview2),parts.join(`
40
40
  `)}function recoverCleanTaskGoal(texts,isPolluted){let cleaned=texts.map(t7=>String(t7||"").replace(/\s+/g," ").trim()).filter(Boolean).filter(t7=>!isPolluted(t7));for(let i3=cleaned.length-1;i3>=0;i3--){let t7=cleaned[i3];if(!/^#\s*Grok CLI session handoff/i.test(t7)&&t7.length>=6)return t7.slice(0,240)}for(let i3=texts.length-1;i3>=0;i3--){let m3=String(texts[i3]||"").match(/(?:^|\n)#{1,3}\s*Goal\s*\n+([^\n#][^\n]{4,200})/i);if(m3?.[1]&&!isPolluted(m3[1]))return m3[1].trim().slice(0,240)}return cleaned.at(-1)?.slice(0,240)||""}var init_turnQualityGates=__esm({"src/utils/turnQualityGates.ts"(){init_imageGenerationIntent();__name(toolUsesInMessages,"toolUsesInMessages");__name(turnRequiresImageAssetTool,"turnRequiresImageAssetTool");__name(imageAssetToolsUsed,"imageAssetToolsUsed");__name(evaluateImageAssetCompletionGate,"evaluateImageAssetCompletionGate");__name(formatMidCycleReviewPublicNotice,"formatMidCycleReviewPublicNotice");__name(recoverCleanTaskGoal,"recoverCleanTaskGoal")}});function stripWrappers(userTurnText){let text3=String(userTurnText??"");return text3=text3.replace(WRAPPER_RE," "),text3=text3.replace(DISCIPLINE_RE," "),text3=text3.replace(/\s+/g," ").trim(),text3.length>900&&(text3=text3.slice(-900)),text3}function isBareContinueIntent(userTurnText){let t7=stripWrappers(userTurnText);return t7?/^(?:(?:很好|好的|好)[,,!\s]*)?(继续吧|继续做|继续执行|继续|开始执行|开始干|接着干|接着|往下|keep going|continue\.?|go on|go ahead|keep working|start executing)(?:[.。!!…\s]*)$/iu.test(t7)?!0:/^(continue from where you left off|从停下的地方继续)[.。!!…\s]*$/iu.test(t7):!1}var WRAPPER_RE,DISCIPLINE_RE,init_bareContinueIntent=__esm({"src/query/bareContinueIntent.ts"(){WRAPPER_RE=/<system-reminder>[\s\S]*?<\/system-reminder>/gi,DISCIPLINE_RE=/<coding-loop-discipline>[\s\S]*?<\/coding-loop-discipline>/gi;__name(stripWrappers,"stripWrappers");__name(isBareContinueIntent,"isBareContinueIntent")}});function citedPathSource(body,opts){return`${opts?.allowPathCharLead?String.raw`(?:^|[^\w-])`:String.raw`(?:^|[^${PATH_BODY_CHARS}])`}(?:${body})${TRAILING_BOUNDARY}`}function citedPathRegExp(body,flags,opts){return new RegExp(citedPathSource(body,opts),flags)}function dirQualifiedBody(minDepth,maxDepth,extAlternation=String.raw`[\w]{1,12}`){return String.raw`(?:[\w.-]+\/){${minDepth},${maxDepth}}[\w.-]+\.(?:${extAlternation})`}var PATH_BODY_CHARS,TRAILING_BOUNDARY,init_citedPathPattern=__esm({"src/utils/citedPathPattern.ts"(){PATH_BODY_CHARS=String.raw`\w./-`,TRAILING_BOUNDARY=String.raw`(?!\.?[\w/-])`;__name(citedPathSource,"citedPathSource");__name(citedPathRegExp,"citedPathRegExp");__name(dirQualifiedBody,"dirQualifiedBody")}});var require_polyfills=__commonJS({"../../../rustfleet/wt/rel136/node_modules/graceful-fs/polyfills.js"(exports2,module2){var constants5=__require("constants"),origCwd=process.cwd,cwd6=null,platform5=process.env.GRACEFUL_FS_PLATFORM||process.platform;process.cwd=function(){return cwd6||(cwd6=origCwd.call(process)),cwd6};try{process.cwd()}catch{}typeof process.chdir=="function"&&(chdir=process.chdir,process.chdir=function(d){cwd6=null,chdir.call(process,d)},Object.setPrototypeOf&&Object.setPrototypeOf(process.chdir,chdir));var chdir;module2.exports=patch;function patch(fs13){constants5.hasOwnProperty("O_SYMLINK")&&process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)&&patchLchmod(fs13),fs13.lutimes||patchLutimes(fs13),fs13.chown=chownFix(fs13.chown),fs13.fchown=chownFix(fs13.fchown),fs13.lchown=chownFix(fs13.lchown),fs13.chmod=chmodFix(fs13.chmod),fs13.fchmod=chmodFix(fs13.fchmod),fs13.lchmod=chmodFix(fs13.lchmod),fs13.chownSync=chownFixSync(fs13.chownSync),fs13.fchownSync=chownFixSync(fs13.fchownSync),fs13.lchownSync=chownFixSync(fs13.lchownSync),fs13.chmodSync=chmodFixSync(fs13.chmodSync),fs13.fchmodSync=chmodFixSync(fs13.fchmodSync),fs13.lchmodSync=chmodFixSync(fs13.lchmodSync),fs13.stat=statFix(fs13.stat),fs13.fstat=statFix(fs13.fstat),fs13.lstat=statFix(fs13.lstat),fs13.statSync=statFixSync(fs13.statSync),fs13.fstatSync=statFixSync(fs13.fstatSync),fs13.lstatSync=statFixSync(fs13.lstatSync),fs13.chmod&&!fs13.lchmod&&(fs13.lchmod=function(path40,mode2,cb){cb&&process.nextTick(cb)},fs13.lchmodSync=function(){}),fs13.chown&&!fs13.lchown&&(fs13.lchown=function(path40,uid,gid,cb){cb&&process.nextTick(cb)},fs13.lchownSync=function(){}),platform5==="win32"&&(fs13.rename=typeof fs13.rename!="function"?fs13.rename:(function(fs$rename){function rename20(from,to,cb){var start=Date.now(),backoff=0;fs$rename(from,to,__name(function CB(er){if(er&&(er.code==="EACCES"||er.code==="EPERM"||er.code==="EBUSY")&&Date.now()-start<6e4){setTimeout(function(){fs13.stat(to,function(stater,st){stater&&stater.code==="ENOENT"?fs$rename(from,to,CB):cb(er)})},backoff),backoff<100&&(backoff+=10);return}cb&&cb(er)},"CB"))}return __name(rename20,"rename"),Object.setPrototypeOf&&Object.setPrototypeOf(rename20,fs$rename),rename20})(fs13.rename)),fs13.read=typeof fs13.read!="function"?fs13.read:(function(fs$read){function read(fd2,buffer2,offset,length,position,callback_){var callback;if(callback_&&typeof callback_=="function"){var eagCounter=0;callback=__name(function(er,_2,__){if(er&&er.code==="EAGAIN"&&eagCounter<10)return eagCounter++,fs$read.call(fs13,fd2,buffer2,offset,length,position,callback);callback_.apply(this,arguments)},"callback")}return fs$read.call(fs13,fd2,buffer2,offset,length,position,callback)}return __name(read,"read"),Object.setPrototypeOf&&Object.setPrototypeOf(read,fs$read),read})(fs13.read),fs13.readSync=typeof fs13.readSync!="function"?fs13.readSync:(function(fs$readSync){return function(fd2,buffer2,offset,length,position){for(var eagCounter=0;;)try{return fs$readSync.call(fs13,fd2,buffer2,offset,length,position)}catch(er){if(er.code==="EAGAIN"&&eagCounter<10){eagCounter++;continue}throw er}}})(fs13.readSync);function patchLchmod(fs14){fs14.lchmod=function(path40,mode2,callback){fs14.open(path40,constants5.O_WRONLY|constants5.O_SYMLINK,mode2,function(err2,fd2){if(err2){callback&&callback(err2);return}fs14.fchmod(fd2,mode2,function(err3){fs14.close(fd2,function(err22){callback&&callback(err3||err22)})})})},fs14.lchmodSync=function(path40,mode2){var fd2=fs14.openSync(path40,constants5.O_WRONLY|constants5.O_SYMLINK,mode2),threw=!0,ret;try{ret=fs14.fchmodSync(fd2,mode2),threw=!1}finally{if(threw)try{fs14.closeSync(fd2)}catch{}else fs14.closeSync(fd2)}return ret}}__name(patchLchmod,"patchLchmod");function patchLutimes(fs14){constants5.hasOwnProperty("O_SYMLINK")&&fs14.futimes?(fs14.lutimes=function(path40,at2,mt2,cb){fs14.open(path40,constants5.O_SYMLINK,function(er,fd2){if(er){cb&&cb(er);return}fs14.futimes(fd2,at2,mt2,function(er2){fs14.close(fd2,function(er22){cb&&cb(er2||er22)})})})},fs14.lutimesSync=function(path40,at2,mt2){var fd2=fs14.openSync(path40,constants5.O_SYMLINK),ret,threw=!0;try{ret=fs14.futimesSync(fd2,at2,mt2),threw=!1}finally{if(threw)try{fs14.closeSync(fd2)}catch{}else fs14.closeSync(fd2)}return ret}):fs14.futimes&&(fs14.lutimes=function(_a3,_b2,_c,cb){cb&&process.nextTick(cb)},fs14.lutimesSync=function(){})}__name(patchLutimes,"patchLutimes");function chmodFix(orig){return orig&&function(target,mode2,cb){return orig.call(fs13,target,mode2,function(er){chownErOk(er)&&(er=null),cb&&cb.apply(this,arguments)})}}__name(chmodFix,"chmodFix");function chmodFixSync(orig){return orig&&function(target,mode2){try{return orig.call(fs13,target,mode2)}catch(er){if(!chownErOk(er))throw er}}}__name(chmodFixSync,"chmodFixSync");function chownFix(orig){return orig&&function(target,uid,gid,cb){return orig.call(fs13,target,uid,gid,function(er){chownErOk(er)&&(er=null),cb&&cb.apply(this,arguments)})}}__name(chownFix,"chownFix");function chownFixSync(orig){return orig&&function(target,uid,gid){try{return orig.call(fs13,target,uid,gid)}catch(er){if(!chownErOk(er))throw er}}}__name(chownFixSync,"chownFixSync");function statFix(orig){return orig&&function(target,options,cb){typeof options=="function"&&(cb=options,options=null);function callback(er,stats3){stats3&&(stats3.uid<0&&(stats3.uid+=4294967296),stats3.gid<0&&(stats3.gid+=4294967296)),cb&&cb.apply(this,arguments)}return __name(callback,"callback"),options?orig.call(fs13,target,options,callback):orig.call(fs13,target,callback)}}__name(statFix,"statFix");function statFixSync(orig){return orig&&function(target,options){var stats3=options?orig.call(fs13,target,options):orig.call(fs13,target);return stats3&&(stats3.uid<0&&(stats3.uid+=4294967296),stats3.gid<0&&(stats3.gid+=4294967296)),stats3}}__name(statFixSync,"statFixSync");function chownErOk(er){if(!er||er.code==="ENOSYS")return!0;var nonroot=!process.getuid||process.getuid()!==0;return!!(nonroot&&(er.code==="EINVAL"||er.code==="EPERM"))}__name(chownErOk,"chownErOk")}__name(patch,"patch")}});var require_legacy_streams=__commonJS({"../../../rustfleet/wt/rel136/node_modules/graceful-fs/legacy-streams.js"(exports2,module2){var Stream5=__require("stream").Stream;module2.exports=legacy;function legacy(fs13){return{ReadStream:ReadStream2,WriteStream};function ReadStream2(path40,options){if(!(this instanceof ReadStream2))return new ReadStream2(path40,options);Stream5.call(this);var self2=this;this.path=path40,this.fd=null,this.readable=!0,this.paused=!1,this.flags="r",this.mode=438,this.bufferSize=64*1024,options=options||{};for(var keys2=Object.keys(options),index=0,length=keys2.length;index<length;index++){var key3=keys2[index];this[key3]=options[key3]}if(this.encoding&&this.setEncoding(this.encoding),this.start!==void 0){if(typeof this.start!="number")throw TypeError("start must be a Number");if(this.end===void 0)this.end=1/0;else if(typeof this.end!="number")throw TypeError("end must be a Number");if(this.start>this.end)throw new Error("start must be <= end");this.pos=this.start}if(this.fd!==null){process.nextTick(function(){self2._read()});return}fs13.open(this.path,this.flags,this.mode,function(err2,fd2){if(err2){self2.emit("error",err2),self2.readable=!1;return}self2.fd=fd2,self2.emit("open",fd2),self2._read()})}function WriteStream(path40,options){if(!(this instanceof WriteStream))return new WriteStream(path40,options);Stream5.call(this),this.path=path40,this.fd=null,this.writable=!0,this.flags="w",this.encoding="binary",this.mode=438,this.bytesWritten=0,options=options||{};for(var keys2=Object.keys(options),index=0,length=keys2.length;index<length;index++){var key3=keys2[index];this[key3]=options[key3]}if(this.start!==void 0){if(typeof this.start!="number")throw TypeError("start must be a Number");if(this.start<0)throw new Error("start must be >= zero");this.pos=this.start}this.busy=!1,this._queue=[],this.fd===null&&(this._open=fs13.open,this._queue.push([this._open,this.path,this.flags,this.mode,void 0]),this.flush())}}__name(legacy,"legacy")}});var require_clone=__commonJS({"../../../rustfleet/wt/rel136/node_modules/graceful-fs/clone.js"(exports2,module2){"use strict";module2.exports=clone5;var getPrototypeOf2=Object.getPrototypeOf||function(obj){return obj.__proto__};function clone5(obj){if(obj===null||typeof obj!="object")return obj;if(obj instanceof Object)var copy2={__proto__:getPrototypeOf2(obj)};else var copy2=Object.create(null);return Object.getOwnPropertyNames(obj).forEach(function(key3){Object.defineProperty(copy2,key3,Object.getOwnPropertyDescriptor(obj,key3))}),copy2}__name(clone5,"clone")}});var require_graceful_fs=__commonJS({"../../../rustfleet/wt/rel136/node_modules/graceful-fs/graceful-fs.js"(exports2,module2){var fs13=__require("fs"),polyfills3=require_polyfills(),legacy=require_legacy_streams(),clone5=require_clone(),util5=__require("util"),gracefulQueue,previousSymbol;typeof Symbol=="function"&&typeof Symbol.for=="function"?(gracefulQueue=Symbol.for("graceful-fs.queue"),previousSymbol=Symbol.for("graceful-fs.previous")):(gracefulQueue="___graceful-fs.queue",previousSymbol="___graceful-fs.previous");function noop9(){}__name(noop9,"noop");function publishQueue(context3,queue3){Object.defineProperty(context3,gracefulQueue,{get:__name(function(){return queue3},"get")})}__name(publishQueue,"publishQueue");var debug4=noop9;util5.debuglog?debug4=util5.debuglog("gfs4"):/\bgfs4\b/i.test(process.env.NODE_DEBUG||"")&&(debug4=__name(function(){var m3=util5.format.apply(util5,arguments);m3="GFS4: "+m3.split(/\n/).join(`
@@ -2977,7 +2977,7 @@ To update, please run:
2977
2977
  ${APP_UPDATE_COMMAND} update
2978
2978
 
2979
2979
  This will ensure you have access to the latest features and improvements.
2980
- `),gracefulShutdownSync(1))}catch(error40){logError2(error40)}}async function getMaxVersion(){let config3=await getMaxVersionConfig();return process.env.USER_TYPE==="ant"?config3.ant||void 0:config3.external||void 0}async function getMaxVersionMessage(){let config3=await getMaxVersionConfig();return process.env.USER_TYPE==="ant"?config3.ant_message||void 0:config3.external_message||void 0}async function getMaxVersionConfig(){try{return await getDynamicConfig_BLOCKS_ON_INIT("tengu_max_version_config",{})}catch(error40){return logError2(error40),{}}}function shouldSkipVersion(targetVersion){let minimumVersion=getInitialSettings()?.minimumVersion;if(!minimumVersion)return!1;let shouldSkip=!gte2(targetVersion,minimumVersion);return shouldSkip&&logForDebugging(`Skipping update to ${targetVersion} - below minimumVersion ${minimumVersion}`),shouldSkip}function getLockFilePath(){return join86(getClaudeConfigHomeDir(),".update.lock")}async function acquireLock(){let fs13=getFsImplementation(),lockPath2=getLockFilePath();try{let stats3=await fs13.stat(lockPath2);if(Date.now()-stats3.mtimeMs<LOCK_TIMEOUT_MS)return!1;try{let recheck=await fs13.stat(lockPath2);if(Date.now()-recheck.mtimeMs<LOCK_TIMEOUT_MS)return!1;await fs13.unlink(lockPath2)}catch(err2){if(!isENOENT(err2))return logError2(err2),!1}}catch(err2){if(!isENOENT(err2))return logError2(err2),!1}try{return await writeFile20(lockPath2,`${process.pid}`,{encoding:"utf8",flag:"wx"}),!0}catch(err2){let code=getErrnoCode(err2);if(code==="EEXIST")return!1;if(code==="ENOENT")try{return await fs13.mkdir(getClaudeConfigHomeDir()),await writeFile20(lockPath2,`${process.pid}`,{encoding:"utf8",flag:"wx"}),!0}catch(mkdirErr){return getErrnoCode(mkdirErr)==="EEXIST"||logError2(mkdirErr),!1}return logError2(err2),!1}}async function releaseLock(){let fs13=getFsImplementation(),lockPath2=getLockFilePath();try{await fs13.readFile(lockPath2,{encoding:"utf8"})===`${process.pid}`&&await fs13.unlink(lockPath2)}catch(err2){if(isENOENT(err2))return;logError2(err2)}}async function getInstallationPrefix(){let isBun=env4.isRunningWithBun(),prefixResult=null;return isBun?prefixResult=await execFileNoThrowWithCwd("bun",["pm","bin","-g"],{cwd:homedir23()}):prefixResult=await execFileNoThrowWithCwd("npm",["-g","config","get","prefix"],{cwd:homedir23()}),prefixResult.code!==0?(logError2(new Error(`Failed to check ${isBun?"bun":"npm"} permissions`)),null):prefixResult.stdout.trim()}async function checkGlobalInstallPermissions(){try{let prefix=await getInstallationPrefix();if(!prefix)return{hasPermissions:!1,npmPrefix:null};try{return await access4(prefix,fsConstants3.W_OK),{hasPermissions:!0,npmPrefix:prefix}}catch{return logError2(new AutoUpdaterError("Insufficient permissions for global npm install.")),{hasPermissions:!1,npmPrefix:prefix}}}catch(error40){return logError2(error40),{hasPermissions:!1,npmPrefix:null}}}async function getLatestVersion(channel){let result2=await execFileNoThrowWithCwd("npm",["view",`${APP_NPM_PACKAGE_NAME}@${channel==="stable"?"stable":"latest"}`,"version","--prefer-online"],{abortSignal:AbortSignal.timeout(5e3),cwd:homedir23()});return result2.code!==0?(logForDebugging(`npm view failed with code ${result2.code}`),result2.stderr?logForDebugging(`npm stderr: ${result2.stderr.trim()}`):logForDebugging("npm stderr: (empty)"),result2.stdout&&logForDebugging(`npm stdout: ${result2.stdout.trim()}`),null):result2.stdout.trim()}async function getNpmDistTags(){let result2=await execFileNoThrowWithCwd("npm",["view",APP_NPM_PACKAGE_NAME,"dist-tags","--json","--prefer-online"],{abortSignal:AbortSignal.timeout(5e3),cwd:homedir23()});if(result2.code!==0)return logForDebugging(`npm view dist-tags failed with code ${result2.code}`),{latest:null,stable:null};try{let parsed=jsonParse(result2.stdout.trim());return{latest:typeof parsed.latest=="string"?parsed.latest:null,stable:typeof parsed.stable=="string"?parsed.stable:null}}catch(error40){return logForDebugging(`Failed to parse dist-tags: ${error40}`),{latest:null,stable:null}}}async function getLatestVersionFromGcs(channel){return getLatestVersion(channel)}async function getGcsDistTags(){let[latest,stable2]=await Promise.all([getLatestVersionFromGcs("latest"),getLatestVersionFromGcs("stable")]);return{latest,stable:stable2}}async function getVersionHistory(limit){if(process.env.USER_TYPE!=="ant")return[];let result2=await execFileNoThrowWithCwd("npm",["view",APP_NATIVE_NPM_PACKAGE_NAME,"versions","--json","--prefer-online"],{abortSignal:AbortSignal.timeout(3e4),cwd:homedir23()});if(result2.code!==0)return logForDebugging(`npm view versions failed with code ${result2.code}`),result2.stderr&&logForDebugging(`npm stderr: ${result2.stderr.trim()}`),[];try{return jsonParse(result2.stdout.trim()).slice(-limit).reverse()}catch(error40){return logForDebugging(`Failed to parse version history: ${error40}`),[]}}async function installGlobalPackage(specificVersion){if(!await acquireLock())return logError2(new AutoUpdaterError("Another process is currently installing an update")),logEvent("tengu_auto_updater_lock_contention",{pid:process.pid,currentVersion:"13.9.1"}),"in_progress";try{if(await removeClaudeAliasesFromShellConfigs(),!env4.isRunningWithBun()&&env4.isNpmFromWindowsPath())return logError2(new Error("Windows NPM detected in WSL environment")),logEvent("tengu_auto_updater_windows_npm_in_wsl",{currentVersion:"13.9.1"}),console.error(`
2980
+ `),gracefulShutdownSync(1))}catch(error40){logError2(error40)}}async function getMaxVersion(){let config3=await getMaxVersionConfig();return process.env.USER_TYPE==="ant"?config3.ant||void 0:config3.external||void 0}async function getMaxVersionMessage(){let config3=await getMaxVersionConfig();return process.env.USER_TYPE==="ant"?config3.ant_message||void 0:config3.external_message||void 0}async function getMaxVersionConfig(){try{return await getDynamicConfig_BLOCKS_ON_INIT("tengu_max_version_config",{})}catch(error40){return logError2(error40),{}}}function shouldSkipVersion(targetVersion){let minimumVersion=getInitialSettings()?.minimumVersion;if(!minimumVersion)return!1;let shouldSkip=!gte2(targetVersion,minimumVersion);return shouldSkip&&logForDebugging(`Skipping update to ${targetVersion} - below minimumVersion ${minimumVersion}`),shouldSkip}function getLockFilePath(){return join86(getClaudeConfigHomeDir(),".update.lock")}async function acquireLock(){let fs13=getFsImplementation(),lockPath2=getLockFilePath();try{let stats3=await fs13.stat(lockPath2);if(Date.now()-stats3.mtimeMs<LOCK_TIMEOUT_MS)return!1;try{let recheck=await fs13.stat(lockPath2);if(Date.now()-recheck.mtimeMs<LOCK_TIMEOUT_MS)return!1;await fs13.unlink(lockPath2)}catch(err2){if(!isENOENT(err2))return logError2(err2),!1}}catch(err2){if(!isENOENT(err2))return logError2(err2),!1}try{return await writeFile20(lockPath2,`${process.pid}`,{encoding:"utf8",flag:"wx"}),!0}catch(err2){let code=getErrnoCode(err2);if(code==="EEXIST")return!1;if(code==="ENOENT")try{return await fs13.mkdir(getClaudeConfigHomeDir()),await writeFile20(lockPath2,`${process.pid}`,{encoding:"utf8",flag:"wx"}),!0}catch(mkdirErr){return getErrnoCode(mkdirErr)==="EEXIST"||logError2(mkdirErr),!1}return logError2(err2),!1}}async function releaseLock(){let fs13=getFsImplementation(),lockPath2=getLockFilePath();try{await fs13.readFile(lockPath2,{encoding:"utf8"})===`${process.pid}`&&await fs13.unlink(lockPath2)}catch(err2){if(isENOENT(err2))return;logError2(err2)}}async function getInstallationPrefix(){let isBun=env4.isRunningWithBun(),prefixResult=null;return isBun?prefixResult=await execFileNoThrowWithCwd("bun",["pm","bin","-g"],{cwd:homedir23()}):prefixResult=await execFileNoThrowWithCwd("npm",["-g","config","get","prefix"],{cwd:homedir23()}),prefixResult.code!==0?(logError2(new Error(`Failed to check ${isBun?"bun":"npm"} permissions`)),null):prefixResult.stdout.trim()}async function checkGlobalInstallPermissions(){try{let prefix=await getInstallationPrefix();if(!prefix)return{hasPermissions:!1,npmPrefix:null};try{return await access4(prefix,fsConstants3.W_OK),{hasPermissions:!0,npmPrefix:prefix}}catch{return logError2(new AutoUpdaterError("Insufficient permissions for global npm install.")),{hasPermissions:!1,npmPrefix:prefix}}}catch(error40){return logError2(error40),{hasPermissions:!1,npmPrefix:null}}}async function getLatestVersion(channel){let result2=await execFileNoThrowWithCwd("npm",["view",`${APP_NPM_PACKAGE_NAME}@${channel==="stable"?"stable":"latest"}`,"version","--prefer-online"],{abortSignal:AbortSignal.timeout(5e3),cwd:homedir23()});return result2.code!==0?(logForDebugging(`npm view failed with code ${result2.code}`),result2.stderr?logForDebugging(`npm stderr: ${result2.stderr.trim()}`):logForDebugging("npm stderr: (empty)"),result2.stdout&&logForDebugging(`npm stdout: ${result2.stdout.trim()}`),null):result2.stdout.trim()}async function getNpmDistTags(){let result2=await execFileNoThrowWithCwd("npm",["view",APP_NPM_PACKAGE_NAME,"dist-tags","--json","--prefer-online"],{abortSignal:AbortSignal.timeout(5e3),cwd:homedir23()});if(result2.code!==0)return logForDebugging(`npm view dist-tags failed with code ${result2.code}`),{latest:null,stable:null};try{let parsed=jsonParse(result2.stdout.trim());return{latest:typeof parsed.latest=="string"?parsed.latest:null,stable:typeof parsed.stable=="string"?parsed.stable:null}}catch(error40){return logForDebugging(`Failed to parse dist-tags: ${error40}`),{latest:null,stable:null}}}async function getLatestVersionFromGcs(channel){return getLatestVersion(channel)}async function getGcsDistTags(){let[latest,stable2]=await Promise.all([getLatestVersionFromGcs("latest"),getLatestVersionFromGcs("stable")]);return{latest,stable:stable2}}async function getVersionHistory(limit){if(process.env.USER_TYPE!=="ant")return[];let result2=await execFileNoThrowWithCwd("npm",["view",APP_NATIVE_NPM_PACKAGE_NAME,"versions","--json","--prefer-online"],{abortSignal:AbortSignal.timeout(3e4),cwd:homedir23()});if(result2.code!==0)return logForDebugging(`npm view versions failed with code ${result2.code}`),result2.stderr&&logForDebugging(`npm stderr: ${result2.stderr.trim()}`),[];try{return jsonParse(result2.stdout.trim()).slice(-limit).reverse()}catch(error40){return logForDebugging(`Failed to parse version history: ${error40}`),[]}}async function installGlobalPackage(specificVersion){if(!await acquireLock())return logError2(new AutoUpdaterError("Another process is currently installing an update")),logEvent("tengu_auto_updater_lock_contention",{pid:process.pid,currentVersion:"13.9.2"}),"in_progress";try{if(await removeClaudeAliasesFromShellConfigs(),!env4.isRunningWithBun()&&env4.isNpmFromWindowsPath())return logError2(new Error("Windows NPM detected in WSL environment")),logEvent("tengu_auto_updater_windows_npm_in_wsl",{currentVersion:"13.9.2"}),console.error(`
2981
2981
  Error: Windows NPM detected in WSL
2982
2982
 
2983
2983
  You're running ${APP_UPDATE_COMMAND} in WSL but using the Windows NPM installation from /mnt/c/.
@@ -2995,7 +2995,7 @@ Then open a new pane with: clavue`,tmuxConfSnippet:snippet}),warnings)}async fun
2995
2995
  # --- clavue doctor tmux color fix (${new Date().toISOString().slice(0,10)}) ---
2996
2996
  ${snippet}
2997
2997
  `;return await appendFile12(confPath,block2),{ok:!0,message:`Appended truecolor settings to ${confPath} \xB7 run: tmux source-file ${confPath}`}}var init_tmuxColorDiagnostic=__esm({"src/utils/tmuxColorDiagnostic.ts"(){__name(isInsideTmux2,"isInsideTmux");__name(detectTmuxColorReduction,"detectTmuxColorReduction");__name(applyTmuxColorFix,"applyTmuxColorFix")}});var doctorDiagnostic_exports={};__export(doctorDiagnostic_exports,{detectLinuxGlobPatternWarnings:()=>detectLinuxGlobPatternWarnings,getCurrentInstallationType:()=>getCurrentInstallationType,getDoctorDiagnostic:()=>getDoctorDiagnostic,getInvokedBinary:()=>getInvokedBinary});import{readFile as readFile23,realpath as realpath8}from"fs/promises";import{homedir as homedir24}from"os";import{delimiter as delimiter2,join as join87,posix as posix6,win32 as win322}from"path";function getNormalizedPaths(){let invokedPath=process.argv[1]||"",execPath2=process.execPath||process.argv[0]||"";return getPlatform()==="windows"&&(invokedPath=invokedPath.split(win322.sep).join(posix6.sep),execPath2=execPath2.split(win322.sep).join(posix6.sep)),[invokedPath,execPath2]}async function getCurrentInstallationType(){if(process.env.NODE_ENV==="development")return"development";let[invokedPath]=getNormalizedPaths();if(isInBundledMode())return detectHomebrew()||detectWinget()||detectMise()||detectAsdf()||await detectPacman()||await detectDeb()||await detectRpm()||await detectApk()?"package-manager":"native";if(isRunningFromLocalInstallation())return"npm-local";if(["/usr/local/lib/node_modules","/usr/lib/node_modules","/opt/homebrew/lib/node_modules","/opt/homebrew/bin","/usr/local/bin","/.nvm/versions/node/"].some(path40=>invokedPath.includes(path40))||invokedPath.includes("/npm/")||invokedPath.includes("/nvm/"))return"npm-global";let npmConfigResult=await execa("npm config get prefix",{shell:!0,reject:!1}),globalPrefix=npmConfigResult.exitCode===0?npmConfigResult.stdout.trim():null;return globalPrefix&&invokedPath.startsWith(globalPrefix)?"npm-global":"unknown"}async function getInstallationPath(){if(process.env.NODE_ENV==="development")return getCwd();if(isInBundledMode()){try{return await realpath8(process.execPath)}catch{}try{let path40=await which(APP_EXECUTABLE_NAME);if(path40)return path40}catch{}try{return await getFsImplementation().stat(join87(homedir24(),".local/bin",APP_EXECUTABLE_NAME)),join87(homedir24(),".local/bin",APP_EXECUTABLE_NAME)}catch{}return"native"}try{return process.argv[0]||"unknown"}catch{return"unknown"}}function getInvokedBinary(){try{return isInBundledMode()?process.execPath||"unknown":process.argv[1]||"unknown"}catch{return"unknown"}}async function resolvePathConservatively(path40){try{return await realpath8(path40)}catch{return path40}}async function detectStalePathLauncherWarning(){let pathLauncher=null;try{pathLauncher=await which(APP_EXECUTABLE_NAME)}catch{return[]}if(!pathLauncher)return[];let[invokedPath,execPath2]=getNormalizedPaths(),resolvedPathLauncher;try{resolvedPathLauncher=await realpath8(pathLauncher)}catch{return[]}if((await Promise.all([invokedPath,execPath2].filter(Boolean).map(resolvePathConservatively))).includes(resolvedPathLauncher))return[];let pathLauncherVersion=await execFileNoThrow(pathLauncher,["--version"],{timeout:5e3,useCwd:!1});if(pathLauncherVersion.code!==0)return[];let reportedVersion=`${pathLauncherVersion.stdout}
2998
- ${pathLauncherVersion.stderr}`.trim().match(/\d+\.\d+\.\d+(?:[-+][^\s)]+)?/)?.[0];if(!reportedVersion||!lt2(reportedVersion,APP_UPDATE_VERSION))return[];let uninstallCmd=getKnownReleasePackageNames().map(packageName=>`npm -g uninstall ${packageName}`).join(" && ");return[{issue:`PATH launcher is stale: ${pathLauncher} reports ${reportedVersion} but this runtime is ${APP_UPDATE_VERSION}`,fix:`Remove stale npm/global launchers with: ${uninstallCmd}. If you use the native installer, run: ${APP_EXECUTABLE_NAME} install. To reinstall the npm launcher, run: npm i -g ${APP_NPM_PACKAGE_NAME}.`}]}async function detectMultipleInstallations(){let fs13=getFsImplementation(),installations=[],localPath=join87(homedir24(),".clavue","local",APP_EXECUTABLE_NAME);await localInstallationExists()&&installations.push({type:"npm-local",path:localPath});let packagesToCheck=getKnownReleasePackageNames(),npmResult=await execFileNoThrow("npm",["-g","config","get","prefix"]);if(npmResult.code===0&&npmResult.stdout){let npmPrefix=npmResult.stdout.trim(),isWindows2=getPlatform()==="windows",globalBinPath=isWindows2?join87(npmPrefix,APP_EXECUTABLE_NAME):join87(npmPrefix,"bin",APP_EXECUTABLE_NAME),globalBinExists=!1;try{await fs13.stat(globalBinPath),globalBinExists=!0}catch{}if(globalBinExists){let isCurrentHomebrewInstallation=!1;try{(await realpath8(globalBinPath)).includes("/Caskroom/")&&(isCurrentHomebrewInstallation=detectHomebrew())}catch{}isCurrentHomebrewInstallation||installations.push({type:"npm-global",path:globalBinPath})}else for(let packageName of packagesToCheck){let globalPackagePath=isWindows2?join87(npmPrefix,"node_modules",packageName):join87(npmPrefix,"lib","node_modules",packageName);try{await fs13.stat(globalPackagePath),installations.push({type:"npm-global-orphan",path:globalPackagePath})}catch{}}}let nativeBinPath=join87(homedir24(),".local","bin",APP_EXECUTABLE_NAME);try{await fs13.stat(nativeBinPath),installations.push({type:"native",path:nativeBinPath})}catch{}if(getGlobalConfig().installMethod==="native"){let nativeDataPath=join87(homedir24(),".local","share","claude");try{await fs13.stat(nativeDataPath),installations.some(i3=>i3.type==="native")||installations.push({type:"native",path:nativeDataPath})}catch{}}return installations}async function detectConfigurationIssues(type){let warnings=[];try{let raw=await readFile23(join87(getManagedFilePath(),"managed-settings.json"),"utf-8"),parsed=jsonParse(raw),field2=parsed&&typeof parsed=="object"?parsed.strictPluginOnlyCustomization:void 0;if(field2!==void 0&&typeof field2!="boolean")if(!Array.isArray(field2))warnings.push({issue:`managed-settings.json: strictPluginOnlyCustomization has an invalid value (expected true or an array, got ${typeof field2})`,fix:`The field is silently ignored (schema .catch rescues it). Set it to true, or an array of: ${CUSTOMIZATION_SURFACES.join(", ")}.`});else{let unknown2=field2.filter(x3=>typeof x3=="string"&&!CUSTOMIZATION_SURFACES.includes(x3));unknown2.length>0&&warnings.push({issue:`managed-settings.json: strictPluginOnlyCustomization has ${unknown2.length} value(s) this client doesn't recognize: ${unknown2.map(String).join(", ")}`,fix:`These are silently ignored (forwards-compat). Known surfaces for this version: ${CUSTOMIZATION_SURFACES.join(", ")}. Either remove them, or this client is older than the managed-settings intended.`})}}catch{}let config3=getGlobalConfig();if(type==="development")return warnings;if(type==="native"){let pathDirectories=(process.env.PATH||"").split(delimiter2),homeDir=homedir24(),localBinPath=join87(homeDir,".local","bin"),normalizedLocalBinPath=localBinPath;if(getPlatform()==="windows"&&(normalizedLocalBinPath=localBinPath.split(win322.sep).join(posix6.sep)),!pathDirectories.some(dir=>{let normalizedDir=dir;getPlatform()==="windows"&&(normalizedDir=dir.split(win322.sep).join(posix6.sep));let trimmedDir=normalizedDir.replace(/\/+$/,""),trimmedRawDir=dir.replace(/[/\\]+$/,"");return trimmedDir===normalizedLocalBinPath||trimmedRawDir==="~/.local/bin"||trimmedRawDir==="$HOME/.local/bin"}))if(getPlatform()==="windows"){let windowsLocalBinPath=localBinPath.split(posix6.sep).join(win322.sep);warnings.push({issue:`Native installation exists but ${windowsLocalBinPath} is not in your PATH`,fix:"Add it by opening: System Properties \u2192 Environment Variables \u2192 Edit User PATH \u2192 New \u2192 Add the path above. Then restart your terminal."})}else{let shellType=getShellType(),configFile=getShellConfigPaths()[shellType],displayPath=configFile?configFile.replace(homedir24(),"~"):"your shell config file";warnings.push({issue:"Native installation exists but ~/.local/bin is not in your PATH",fix:`Run: echo 'export PATH="$HOME/.local/bin:$PATH"' >> ${displayPath} then open a new terminal or run: source ${displayPath}`})}}isEnvTruthy2(process.env.DISABLE_INSTALLATION_CHECKS)||(type==="npm-local"&&config3.installMethod!=="local"&&warnings.push({issue:`Running from local installation but config install method is '${config3.installMethod}'`,fix:"Consider using native installation: clavue install"}),type==="native"&&config3.installMethod!=="native"&&warnings.push({issue:`Running native installation but config install method is '${config3.installMethod}'`,fix:"Run clavue install to update configuration"})),type==="npm-global"&&await localInstallationExists()&&warnings.push({issue:"Local installation exists but not being used",fix:"Consider using native installation: clavue install"});let existingAlias=await findClaudeAlias(),validAlias=await findValidClaudeAlias();return type==="npm-local"&&!await which(APP_EXECUTABLE_NAME)&&!validAlias&&(existingAlias?warnings.push({issue:"Local installation not accessible",fix:`Alias exists but points to invalid target: ${existingAlias}. Update alias: alias ${APP_EXECUTABLE_NAME}="~/.clavue/local/clavue"`}):warnings.push({issue:"Local installation not accessible",fix:`Create alias: alias ${APP_EXECUTABLE_NAME}="~/.clavue/local/clavue"`})),warnings}function detectLinuxGlobPatternWarnings(){if(getPlatform()!=="linux")return[];let warnings=[],globPatterns=SandboxManager.getLinuxGlobPatternWarnings();if(globPatterns.length>0){let displayPatterns=globPatterns.slice(0,3).join(", "),remaining=globPatterns.length-3,patternList=remaining>0?`${displayPatterns} (${remaining} more)`:displayPatterns;warnings.push({issue:"Glob patterns in sandbox permission rules are not fully supported on Linux",fix:`Found ${globPatterns.length} pattern(s): ${patternList}. On Linux, glob patterns in Edit/Read rules will be ignored.`})}return warnings}async function getDoctorDiagnostic(){let installationType=await getCurrentInstallationType(),version3=typeof MACRO<"u"?"13.9.1":"unknown",installationPath=await getInstallationPath(),invokedBinary=getInvokedBinary(),multipleInstallations=await detectMultipleInstallations(),warnings=await detectConfigurationIssues(installationType);warnings.push(...await detectStalePathLauncherWarning()),warnings.push(...detectLinuxGlobPatternWarnings());try{let{detectTmuxColorReduction:detectTmuxColorReduction2}=await Promise.resolve().then(()=>(init_tmuxColorDiagnostic(),tmuxColorDiagnostic_exports));for(let w2 of detectTmuxColorReduction2())warnings.push({issue:w2.issue,fix:w2.fix})}catch{}if(installationType==="native"){let npmInstalls=multipleInstallations.filter(i3=>i3.type==="npm-global"||i3.type==="npm-global-orphan"||i3.type==="npm-local"),isWindows2=getPlatform()==="windows";for(let install2 of npmInstalls)if(install2.type==="npm-global"){let uninstallCmd=getKnownReleasePackageNames().map(packageName=>`npm -g uninstall ${packageName}`).join(" && ");warnings.push({issue:`Leftover npm global installation at ${install2.path}`,fix:`Run: ${uninstallCmd}`})}else install2.type==="npm-global-orphan"?warnings.push({issue:`Orphaned npm global package at ${install2.path}`,fix:isWindows2?`Run: rmdir /s /q "${install2.path}"`:`Run: rm -rf ${install2.path}`}):install2.type==="npm-local"&&warnings.push({issue:`Leftover npm local installation at ${install2.path}`,fix:isWindows2?`Run: rmdir /s /q "${install2.path}"`:`Run: rm -rf ${install2.path}`})}let configInstallMethod=getGlobalConfig().installMethod||"not set",hasUpdatePermissions=null;installationType==="npm-global"&&(hasUpdatePermissions=(await checkGlobalInstallPermissions()).hasPermissions,!hasUpdatePermissions&&!getAutoUpdaterDisabledReason()&&warnings.push({issue:"Insufficient permissions for auto-updates",fix:"Do one of: (1) Re-install node without sudo, or (2) Use `clavue install` for native installation"}));let ripgrepStatusRaw=getRipgrepStatus(),ripgrepStatus2={working:ripgrepStatusRaw.working??!0,mode:ripgrepStatusRaw.mode,systemPath:ripgrepStatusRaw.mode==="system"?ripgrepStatusRaw.path:null},packageManager=installationType==="package-manager"?await getPackageManager():void 0;return{installationType,version:version3,installationPath,invokedBinary,configInstallMethod,autoUpdates:(()=>{let reason=getAutoUpdaterDisabledReason();return reason?`disabled (${formatAutoUpdaterDisabledReason(reason)})`:"enabled"})(),hasUpdatePermissions,multipleInstallations,warnings,packageManager,ripgrepStatus:ripgrepStatus2}}var init_doctorDiagnostic=__esm({"src/utils/doctorDiagnostic.ts"(){init_execa();init_autoUpdater();init_bundledMode();init_config12();init_cwd2();init_envUtils();init_execFileNoThrow();init_fsOperations();init_localInstaller();init_semver();init_packageManagers();init_platform2();init_ripgrep();init_sandbox_adapter();init_managedPath();init_types2();init_shellConfig();init_slowOperations();init_which();init_update2();__name(getNormalizedPaths,"getNormalizedPaths");__name(getCurrentInstallationType,"getCurrentInstallationType");__name(getInstallationPath,"getInstallationPath");__name(getInvokedBinary,"getInvokedBinary");__name(resolvePathConservatively,"resolvePathConservatively");__name(detectStalePathLauncherWarning,"detectStalePathLauncherWarning");__name(detectMultipleInstallations,"detectMultipleInstallations");__name(detectConfigurationIssues,"detectConfigurationIssues");__name(detectLinuxGlobPatternWarnings,"detectLinuxGlobPatternWarnings");__name(getDoctorDiagnostic,"getDoctorDiagnostic")}});function isStartupAutoIDEInstallError(status2){return!!(status2?.source==="startup-auto"&&status2.error)}var init_ideInstallationStatus=__esm({"src/utils/ideInstallationStatus.ts"(){__name(isStartupAutoIDEInstallError,"isStartupAutoIDEInstallError")}});import{homedir as osHomedir2}from"os";import{join as join88}from"path";function resolveOptions(options){return{env:options?.env??process.env,home:options?.homedir??process.env.HOME??osHomedir2()}}function getXDGStateHome(options){let{env:env5,home}=resolveOptions(options);return env5.XDG_STATE_HOME??join88(home,".local","state")}function getXDGCacheHome(options){let{env:env5,home}=resolveOptions(options);return env5.XDG_CACHE_HOME??join88(home,".cache")}function getXDGDataHome(options){let{env:env5,home}=resolveOptions(options);return env5.XDG_DATA_HOME??join88(home,".local","share")}function getUserBinDir(options){let{home}=resolveOptions(options);return join88(home,".local","bin")}var init_xdg=__esm({"src/utils/xdg.ts"(){__name(resolveOptions,"resolveOptions");__name(getXDGStateHome,"getXDGStateHome");__name(getXDGCacheHome,"getXDGCacheHome");__name(getXDGDataHome,"getXDGDataHome");__name(getUserBinDir,"getUserBinDir")}});import{createHash as createHash29}from"crypto";import{chmod as chmod7,writeFile as writeFile21}from"fs/promises";import{join as join89}from"path";async function getLatestVersionFromArtifactory(tag2="latest"){let startTime=Date.now(),{stdout,code,stderr}=await execFileNoThrowWithCwd("npm",["view",`@anthropic-ai/claude-code@${tag2}`,"version","--prefer-online","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:3e4,preserveOutputOnError:!0}),latencyMs=Date.now()-startTime;if(code!==0){logEvent("tengu_version_check_failure",{latency_ms:latencyMs,source_npm:!0,exit_code:code});let error40=new Error(`npm view failed with code ${code}: ${stderr}`);throw logError2(error40),error40}return logEvent("tengu_version_check_success",{latency_ms:latencyMs,source_npm:!0}),logForDebugging(`npm view @anthropic-ai/claude-code@${tag2} version: ${stdout}`),stdout.trim()}async function getLatestVersionFromBinaryRepo(channel="latest",baseUrl,authConfig){let startTime=Date.now();try{let response=await axios_default.get(`${baseUrl}/${channel}`,{timeout:3e4,responseType:"text",...authConfig}),latencyMs=Date.now()-startTime;return logEvent("tengu_version_check_success",{latency_ms:latencyMs}),response.data.trim()}catch(error40){let latencyMs=Date.now()-startTime,errorMessage5=error40 instanceof Error?error40.message:String(error40),httpStatus;axios_default.isAxiosError(error40)&&error40.response&&(httpStatus=error40.response.status),logEvent("tengu_version_check_failure",{latency_ms:latencyMs,http_status:httpStatus,is_timeout:errorMessage5.includes("timeout")});let fetchError=new Error(`Failed to fetch version from ${baseUrl}/${channel}: ${errorMessage5}`);throw logError2(fetchError),fetchError}}async function getLatestVersion2(channelOrVersion){if(/^v?\d+\.\d+\.\d+(-\S+)?$/.test(channelOrVersion)){let normalized=channelOrVersion.startsWith("v")?channelOrVersion.slice(1):channelOrVersion;if(/^99\.99\./.test(normalized))throw new Error(`Version ${normalized} is not available for installation. Use 'stable' or 'latest'.`);return normalized}let channel=channelOrVersion;if(channel!=="stable"&&channel!=="latest")throw new Error(`Invalid channel: ${channelOrVersion}. Use 'stable' or 'latest'`);return process.env.USER_TYPE==="ant"?getLatestVersionFromArtifactory(channel==="stable"?"stable":"latest"):getLatestVersionFromBinaryRepo(channel,GCS_BUCKET_URL)}async function downloadVersionFromArtifactory(version3,stagingPath){let fs13=getFsImplementation();await fs13.rm(stagingPath,{recursive:!0,force:!0});let platform5=getPlatform2(),platformPackageName=`@anthropic-ai/claude-code-${platform5}`;logForDebugging(`Fetching integrity hash for ${platformPackageName}@${version3}`);let{stdout:integrityOutput,code,stderr}=await execFileNoThrowWithCwd("npm",["view",`${platformPackageName}@${version3}`,"dist.integrity","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:3e4,preserveOutputOnError:!0});if(code!==0)throw new Error(`npm view integrity failed with code ${code}: ${stderr}`);let integrity=integrityOutput.trim();if(!integrity)throw new Error(`Failed to fetch integrity hash for ${platformPackageName}@${version3}`);logForDebugging(`Got integrity hash for ${platform5}: ${integrity}`),await fs13.mkdir(stagingPath);let packageJson={name:"clavue-native-installer",version:"0.0.1",dependencies:{clavue:version3}},packageLock={name:"clavue-native-installer",version:"0.0.1",lockfileVersion:3,requires:!0,packages:{"":{name:"clavue-native-installer",version:"0.0.1",dependencies:{clavue:version3}},"node_modules/clavue":{version:version3,optionalDependencies:{[platformPackageName]:version3}},[`node_modules/${platformPackageName}`]:{version:version3,integrity}}};writeFileSync4(join89(stagingPath,"package.json"),jsonStringify(packageJson,null,2),{encoding:"utf8",flush:!0}),writeFileSync4(join89(stagingPath,"package-lock.json"),jsonStringify(packageLock,null,2),{encoding:"utf8",flush:!0});let result2=await execFileNoThrowWithCwd("npm",["ci","--prefer-online","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:6e4,preserveOutputOnError:!0,cwd:stagingPath});if(result2.code!==0)throw new Error(`npm ci failed with code ${result2.code}: ${result2.stderr}`);logForDebugging(`Successfully downloaded and verified @anthropic-ai/claude-code@${version3}`)}function getManifestBinaryName(platformInfo,platform5){return typeof platformInfo.binary=="string"&&platformInfo.binary?platformInfo.binary:getBinaryName(platform5)}function getStallTimeoutMs(){return Number(process.env.CLAUDE_CODE_STALL_TIMEOUT_MS_FOR_TESTING)||DEFAULT_STALL_TIMEOUT_MS}async function downloadAndVerifyBinary(binaryUrl,expectedChecksum,binaryPath,requestConfig={}){let lastError;for(let attempt2=1;attempt2<=MAX_DOWNLOAD_RETRIES;attempt2++){let controller=new AbortController,stallTimer,clearStallTimer=__name(()=>{stallTimer&&(clearTimeout(stallTimer),stallTimer=void 0)},"clearStallTimer"),resetStallTimer=__name(()=>{clearStallTimer(),stallTimer=setTimeout(c4=>c4.abort(),getStallTimeoutMs(),controller)},"resetStallTimer");try{resetStallTimer();let response=await axios_default.get(binaryUrl,{timeout:5*6e4,responseType:"arraybuffer",signal:controller.signal,onDownloadProgress:__name(()=>{resetStallTimer()},"onDownloadProgress"),...requestConfig});clearStallTimer();let hash2=createHash29("sha256");hash2.update(response.data);let actualChecksum=hash2.digest("hex");if(actualChecksum!==expectedChecksum)throw new Error(`Checksum mismatch: expected ${expectedChecksum}, got ${actualChecksum}`);await writeFile21(binaryPath,Buffer.from(response.data)),await chmod7(binaryPath,493);return}catch(error40){clearStallTimer();let isStallTimeout=axios_default.isCancel(error40);if(isStallTimeout?lastError=new StallTimeoutError:lastError=toError(error40),isStallTimeout&&attempt2<MAX_DOWNLOAD_RETRIES){logForDebugging(`Download stalled on attempt ${attempt2}/${MAX_DOWNLOAD_RETRIES}, retrying...`),await sleep2(1e3);continue}throw lastError}}throw lastError??new Error("Download failed after all retries")}async function downloadVersionFromBinaryRepo(version3,stagingPath,baseUrl,authConfig){let fs13=getFsImplementation();await fs13.rm(stagingPath,{recursive:!0,force:!0});let platform5=getPlatform2(),startTime=Date.now();logEvent("tengu_binary_download_attempt",{});let manifest;try{manifest=(await axios_default.get(`${baseUrl}/${version3}/manifest.json`,{timeout:1e4,responseType:"json",...authConfig})).data}catch(error40){let latencyMs=Date.now()-startTime,errorMessage5=error40 instanceof Error?error40.message:String(error40),httpStatus;throw axios_default.isAxiosError(error40)&&error40.response&&(httpStatus=error40.response.status),logEvent("tengu_binary_manifest_fetch_failure",{latency_ms:latencyMs,http_status:httpStatus,is_timeout:errorMessage5.includes("timeout")}),logError2(new Error(`Failed to fetch manifest from ${baseUrl}/${version3}/manifest.json: ${errorMessage5}`)),error40}let platformInfo=manifest.platforms[platform5];if(!platformInfo)throw logEvent("tengu_binary_platform_not_found",{}),new Error(`Platform ${platform5} not found in manifest for version ${version3}`);let expectedChecksum=platformInfo.checksum,artifactName=getManifestBinaryName(platformInfo,platform5),binaryName=getBinaryName(platform5),binaryUrl=`${baseUrl}/${version3}/${platform5}/${artifactName}`;await fs13.mkdir(stagingPath);let binaryPath=join89(stagingPath,binaryName);try{await downloadAndVerifyBinary(binaryUrl,expectedChecksum,binaryPath,authConfig||{});let latencyMs=Date.now()-startTime;logEvent("tengu_binary_download_success",{latency_ms:latencyMs})}catch(error40){let latencyMs=Date.now()-startTime,errorMessage5=error40 instanceof Error?error40.message:String(error40),httpStatus;throw axios_default.isAxiosError(error40)&&error40.response&&(httpStatus=error40.response.status),logEvent("tengu_binary_download_failure",{latency_ms:latencyMs,http_status:httpStatus,is_timeout:errorMessage5.includes("timeout"),is_checksum_mismatch:errorMessage5.includes("Checksum mismatch")}),logError2(new Error(`Failed to download binary from ${binaryUrl}: ${errorMessage5}`)),error40}}async function downloadVersion(version3,stagingPath){return process.env.USER_TYPE==="ant"?(await downloadVersionFromArtifactory(version3,stagingPath),"npm"):(await downloadVersionFromBinaryRepo(version3,stagingPath,GCS_BUCKET_URL),"binary")}var GCS_BUCKET_URL,ARTIFACTORY_REGISTRY_URL,DEFAULT_STALL_TIMEOUT_MS,MAX_DOWNLOAD_RETRIES,StallTimeoutError,init_download=__esm({"src/utils/nativeInstaller/download.ts"(){init_axios2();init_analytics();init_debug();init_errors2();init_execFileNoThrow();init_fsOperations();init_log3();init_sleep2();init_slowOperations();init_installer();GCS_BUCKET_URL="https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases",ARTIFACTORY_REGISTRY_URL="https://artifactory.infra.ant.dev/artifactory/api/npm/npm-all/";__name(getLatestVersionFromArtifactory,"getLatestVersionFromArtifactory");__name(getLatestVersionFromBinaryRepo,"getLatestVersionFromBinaryRepo");__name(getLatestVersion2,"getLatestVersion");__name(downloadVersionFromArtifactory,"downloadVersionFromArtifactory");DEFAULT_STALL_TIMEOUT_MS=6e4,MAX_DOWNLOAD_RETRIES=3;__name(getManifestBinaryName,"getManifestBinaryName");__name(getStallTimeoutMs,"getStallTimeoutMs");StallTimeoutError=class extends Error{static{__name(this,"StallTimeoutError")}constructor(){super("Download stalled: no data received for 60 seconds"),this.name="StallTimeoutError"}};__name(downloadAndVerifyBinary,"downloadAndVerifyBinary");__name(downloadVersionFromBinaryRepo,"downloadVersionFromBinaryRepo");__name(downloadVersion,"downloadVersion")}});import{basename as basename20,join as join90}from"path";function isPidBasedLockingEnabled(){let envVar=process.env.ENABLE_PID_BASED_VERSION_LOCKING;return isEnvTruthy2(envVar)?!0:isEnvDefinedFalsy(envVar)?!1:getFeatureValue_CACHED_MAY_BE_STALE("tengu_pid_based_version_locking",!1)}function isProcessRunning3(pid){if(pid<=1)return!1;try{return process.kill(pid,0),!0}catch{return!1}}function isClaudeProcess(pid,expectedExecPath){if(!isProcessRunning3(pid))return!1;if(pid===process.pid)return!0;try{let command7=getProcessCommand(pid);if(!command7)return!0;let normalizedCommand=command7.toLowerCase(),normalizedExecPath=expectedExecPath.toLowerCase();return normalizedCommand.includes("claude")||normalizedCommand.includes(normalizedExecPath)}catch{return!0}}function readLockContent(lockFilePath){let fs13=getFsImplementation();try{let content=fs13.readFileSync(lockFilePath,{encoding:"utf8"});if(!content||content.trim()==="")return null;let parsed=jsonParse(content);return typeof parsed.pid!="number"||!parsed.version||!parsed.execPath?null:parsed}catch{return null}}function isLockActive(lockFilePath){let content=readLockContent(lockFilePath);if(!content)return!1;let{pid,execPath:execPath2}=content;if(!isProcessRunning3(pid))return!1;if(!isClaudeProcess(pid,execPath2))return logForDebugging(`Lock PID ${pid} is running but does not appear to be Clavue - treating as stale`),!1;let fs13=getFsImplementation();try{let stats3=fs13.statSync(lockFilePath);if(Date.now()-stats3.mtimeMs>FALLBACK_STALE_MS&&!isProcessRunning3(pid))return!1}catch{}return!0}function writeLockFile(lockFilePath,content){let fs13=getFsImplementation(),tempPath=`${lockFilePath}.tmp.${process.pid}.${Date.now()}`;try{writeFileSync4(tempPath,jsonStringify(content,null,2),{encoding:"utf8",flush:!0}),fs13.renameSync(tempPath,lockFilePath)}catch(error40){try{fs13.unlinkSync(tempPath)}catch{}throw error40}}async function tryAcquireLock(versionPath,lockFilePath){let fs13=getFsImplementation(),versionName=basename20(versionPath);if(isLockActive(lockFilePath)){let existingContent=readLockContent(lockFilePath);return logForDebugging(`Cannot acquire lock for ${versionName} - held by PID ${existingContent?.pid}`),null}let lockContent={pid:process.pid,version:versionName,execPath:process.execPath,acquiredAt:Date.now()};try{return writeLockFile(lockFilePath,lockContent),readLockContent(lockFilePath)?.pid!==process.pid?null:(logForDebugging(`Acquired PID lock for ${versionName} (PID ${process.pid})`),()=>{try{readLockContent(lockFilePath)?.pid===process.pid&&(fs13.unlinkSync(lockFilePath),logForDebugging(`Released PID lock for ${versionName}`))}catch(error40){logForDebugging(`Failed to release lock for ${versionName}: ${error40}`)}})}catch(error40){return logForDebugging(`Failed to acquire lock for ${versionName}: ${error40}`),null}}async function acquireProcessLifetimeLock(versionPath,lockFilePath){let release2=await tryAcquireLock(versionPath,lockFilePath);if(!release2)return!1;let cleanup=__name(()=>{try{release2()}catch{}},"cleanup");return process.on("exit",cleanup),process.on("SIGINT",cleanup),process.on("SIGTERM",cleanup),!0}async function withLock(versionPath,lockFilePath,callback){let release2=await tryAcquireLock(versionPath,lockFilePath);if(!release2)return!1;try{return await callback(),!0}finally{release2()}}function cleanupStaleLocks(locksDir){let fs13=getFsImplementation(),cleanedCount=0;try{let lockEntries=fs13.readdirStringSync(locksDir).filter(f3=>f3.endsWith(".lock"));for(let lockEntry of lockEntries){let lockFilePath=join90(locksDir,lockEntry);try{fs13.lstatSync(lockFilePath).isDirectory()?(fs13.rmSync(lockFilePath,{recursive:!0,force:!0}),cleanedCount++,logForDebugging(`Cleaned up legacy directory lock: ${lockEntry}`)):isLockActive(lockFilePath)||(fs13.unlinkSync(lockFilePath),cleanedCount++,logForDebugging(`Cleaned up stale lock: ${lockEntry}`))}catch{}}}catch(error40){if(isENOENT(error40))return 0;logError2(toError(error40))}return cleanedCount}var FALLBACK_STALE_MS,init_pidLock=__esm({"src/utils/nativeInstaller/pidLock.ts"(){init_growthbook();init_debug();init_envUtils();init_errors2();init_fsOperations();init_genericProcessUtils();init_log3();init_slowOperations();__name(isPidBasedLockingEnabled,"isPidBasedLockingEnabled");FALLBACK_STALE_MS=7200*1e3;__name(isProcessRunning3,"isProcessRunning");__name(isClaudeProcess,"isClaudeProcess");__name(readLockContent,"readLockContent");__name(isLockActive,"isLockActive");__name(writeLockFile,"writeLockFile");__name(tryAcquireLock,"tryAcquireLock");__name(acquireProcessLifetimeLock,"acquireProcessLifetimeLock");__name(withLock,"withLock");__name(cleanupStaleLocks,"cleanupStaleLocks")}});import{constants as fsConstants4}from"fs";import{access as access5,chmod as chmod8,copyFile as copyFile7,lstat as lstat3,mkdir as mkdir21,readdir as readdir13,readlink,realpath as realpath9,rename as rename2,rm as rm4,rmdir,stat as stat26,symlink as symlink4,unlink as unlink11,writeFile as writeFile22}from"fs/promises";import{homedir as homedir25}from"os";import{basename as basename21,delimiter as delimiter3,dirname as dirname38,join as join91,resolve as resolve33}from"path";function getPlatform2(){let os6=env4.platform,arch3=process.arch==="x64"?"x64":process.arch==="arm64"?"arm64":null;if(!arch3){let error40=new Error(`Unsupported architecture: ${process.arch}`);throw logForDebugging(`Native installer does not support architecture: ${process.arch}`,{level:"error"}),error40}return os6==="linux"&&envDynamic.isMuslEnvironment()?`linux-${arch3}-musl`:`${os6}-${arch3}`}function getBinaryName(platform5){return platform5.startsWith("win32")?`${APP_EXECUTABLE_NAME}.exe`:APP_EXECUTABLE_NAME}function getBaseDirectories(){let platform5=getPlatform2(),executableName=getBinaryName(platform5);return{versions:join91(getXDGDataHome(),"clavue","versions"),staging:join91(getXDGCacheHome(),"clavue","staging"),locks:join91(getXDGStateHome(),"clavue","locks"),executable:join91(getUserBinDir(),executableName)}}async function isPossibleClaudeBinary(filePath){try{let stats3=await stat26(filePath);return!stats3.isFile()||stats3.size===0?!1:(await access5(filePath,fsConstants4.X_OK),!0)}catch{return!1}}async function getVersionPaths(version3){let dirs=getBaseDirectories(),dirsToCreate=[dirs.versions,dirs.staging,dirs.locks];await Promise.all(dirsToCreate.map(dir=>mkdir21(dir,{recursive:!0})));let executableParentDir=dirname38(dirs.executable);await mkdir21(executableParentDir,{recursive:!0});let installPath=join91(dirs.versions,version3);try{await stat26(installPath)}catch{await writeFile22(installPath,"",{encoding:"utf8"})}return{stagingPath:join91(dirs.staging,version3),installPath}}async function tryWithVersionLock(versionFilePath,callback,retries=0){let dirs=getBaseDirectories(),lockfilePath=getLockFilePathFromVersionPath(dirs,versionFilePath);if(await mkdir21(dirs.locks,{recursive:!0}),isPidBasedLockingEnabled()){let attempts=0,maxAttempts=retries+1,minTimeout=retries>0?1e3:100,maxTimeout=retries>0?5e3:500;for(;attempts<maxAttempts;){if(await withLock(versionFilePath,lockfilePath,async()=>{try{await callback()}catch(error40){throw logError2(error40),error40}}))return logEvent("tengu_version_lock_acquired",{is_pid_based:!0,is_lifetime_lock:!1,attempts:attempts+1}),!0;if(attempts++,attempts<maxAttempts){let timeout=Math.min(minTimeout*Math.pow(2,attempts-1),maxTimeout);await sleep2(timeout)}}return logEvent("tengu_version_lock_failed",{is_pid_based:!0,is_lifetime_lock:!1,attempts:maxAttempts}),logLockAcquisitionError(versionFilePath,new Error("Lock held by another process")),!1}let release2=null;try{try{release2=await lock(versionFilePath,{stale:LOCK_STALE_MS,retries:{retries,minTimeout:retries>0?1e3:100,maxTimeout:retries>0?5e3:500},lockfilePath,onCompromised:__name(err2=>{logForDebugging(`NON-FATAL: Version lock was compromised during operation: ${err2.message}`,{level:"info"})},"onCompromised")})}catch(lockError){return logEvent("tengu_version_lock_failed",{is_pid_based:!1,is_lifetime_lock:!1}),logLockAcquisitionError(versionFilePath,lockError),!1}try{return await callback(),logEvent("tengu_version_lock_acquired",{is_pid_based:!1,is_lifetime_lock:!1}),!0}catch(error40){throw logError2(error40),error40}}finally{release2&&await release2()}}async function atomicMoveToInstallPath(stagedBinaryPath,installPath){await mkdir21(dirname38(installPath),{recursive:!0});let tempInstallPath=`${installPath}.tmp.${process.pid}.${Date.now()}`;try{await copyFile7(stagedBinaryPath,tempInstallPath),await chmod8(tempInstallPath,493),await rename2(tempInstallPath,installPath),logForDebugging(`Atomically installed binary to ${installPath}`)}catch(error40){try{await unlink11(tempInstallPath)}catch{}throw error40}}async function installVersionFromPackage(stagingPath,installPath){try{let nodeModulesDir=join91(stagingPath,"node_modules","@anthropic-ai"),nativePackage=(await readdir13(nodeModulesDir)).find(entry=>entry.startsWith("claude-cli-native-"));if(!nativePackage)throw logEvent("tengu_native_install_package_failure",{stage_find_package:!0,error_package_not_found:!0}),new Error("Could not find platform-specific native package");let stagedBinaryPath=join91(nodeModulesDir,nativePackage,"cli");try{await stat26(stagedBinaryPath)}catch{throw logEvent("tengu_native_install_package_failure",{stage_binary_exists:!0,error_binary_not_found:!0}),new Error("Native binary not found in staged package")}await atomicMoveToInstallPath(stagedBinaryPath,installPath),await rm4(stagingPath,{recursive:!0,force:!0}),logEvent("tengu_native_install_package_success",{})}catch(error40){let msg=errorMessage2(error40);throw!msg.includes("Could not find platform-specific")&&!msg.includes("Native binary not found")&&logEvent("tengu_native_install_package_failure",{stage_atomic_move:!0,error_move_failed:!0}),logError2(toError(error40)),error40}}async function installVersionFromBinary(stagingPath,installPath){try{let platform5=getPlatform2(),binaryName=getBinaryName(platform5),stagedBinaryPath=join91(stagingPath,binaryName);try{await stat26(stagedBinaryPath)}catch{throw logEvent("tengu_native_install_binary_failure",{stage_binary_exists:!0,error_binary_not_found:!0}),new Error("Staged binary not found")}await atomicMoveToInstallPath(stagedBinaryPath,installPath),await rm4(stagingPath,{recursive:!0,force:!0}),logEvent("tengu_native_install_binary_success",{})}catch(error40){throw errorMessage2(error40).includes("Staged binary not found")||logEvent("tengu_native_install_binary_failure",{stage_atomic_move:!0,error_move_failed:!0}),logError2(toError(error40)),error40}}async function installVersion(stagingPath,installPath,downloadType){downloadType==="npm"?await installVersionFromPackage(stagingPath,installPath):await installVersionFromBinary(stagingPath,installPath)}async function performVersionUpdate(version3,forceReinstall){let{stagingPath:baseStagingPath,installPath}=await getVersionPaths(version3),{executable:executablePath}=getBaseDirectories(),stagingPath=isEnvTruthy2(process.env.ENABLE_LOCKLESS_UPDATES)?`${baseStagingPath}.${process.pid}.${Date.now()}`:baseStagingPath,needsInstall=!await versionIsAvailable(version3)||forceReinstall;if(needsInstall){logForDebugging(forceReinstall?`Force reinstalling native installer version ${version3}`:`Downloading native installer version ${version3}`);let downloadType=await downloadVersion(version3,stagingPath);await installVersion(stagingPath,installPath,downloadType)}else logForDebugging(`Version ${version3} already installed, updating symlink`);if(await removeDirectoryIfEmpty(executablePath),await updateSymlink(executablePath,installPath),!await isPossibleClaudeBinary(executablePath)){let installPathExists=!1;try{await stat26(installPath),installPathExists=!0}catch{}throw new Error(`Failed to create executable at ${executablePath}. Source file exists: ${installPathExists}. Check write permissions to ${executablePath}.`)}return needsInstall}async function versionIsAvailable(version3){let{installPath}=await getVersionPaths(version3);return isPossibleClaudeBinary(installPath)}async function updateLatest(channelOrVersion,forceReinstall=!1){let startTime=Date.now(),version3=await getLatestVersion2(channelOrVersion),{executable:executablePath}=getBaseDirectories();if(logForDebugging(`Checking for native installer update to version ${version3}`),!forceReinstall){let maxVersion=await getMaxVersion();if(maxVersion&&gt2(version3,maxVersion)){if(logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version3} to ${maxVersion}`),gte2("2.1.88",maxVersion))return logForDebugging(`Native installer: current version 2.1.88 is already at or above maxVersion ${maxVersion}, skipping update`),logEvent("tengu_native_update_skipped_max_version",{latency_ms:Date.now()-startTime,max_version:maxVersion,available_version:version3}),{success:!0,latestVersion:version3};version3=maxVersion}}if(!forceReinstall&&version3==="13.9.1"&&await versionIsAvailable(version3)&&await isPossibleClaudeBinary(executablePath))return logForDebugging(`Found ${version3} at ${executablePath}, skipping install`),logEvent("tengu_native_update_complete",{latency_ms:Date.now()-startTime,was_new_install:!1,was_force_reinstall:!1,was_already_running:!0}),{success:!0,latestVersion:version3};if(!forceReinstall&&shouldSkipVersion(version3))return logEvent("tengu_native_update_skipped_minimum_version",{latency_ms:Date.now()-startTime,target_version:version3}),{success:!0,latestVersion:version3};let wasNewInstall=!1,latencyMs;if(isEnvTruthy2(process.env.ENABLE_LOCKLESS_UPDATES))wasNewInstall=await performVersionUpdate(version3,forceReinstall),latencyMs=Date.now()-startTime;else{let{installPath}=await getVersionPaths(version3);forceReinstall&&await forceRemoveLock(installPath);let lockAcquired=await tryWithVersionLock(installPath,async()=>{wasNewInstall=await performVersionUpdate(version3,forceReinstall)},3);if(latencyMs=Date.now()-startTime,!lockAcquired){let dirs=getBaseDirectories(),lockHolderPid;if(isPidBasedLockingEnabled()){let lockfilePath=getLockFilePathFromVersionPath(dirs,installPath);isLockActive(lockfilePath)&&(lockHolderPid=readLockContent(lockfilePath)?.pid)}return logEvent("tengu_native_update_lock_failed",{latency_ms:latencyMs,lock_holder_pid:lockHolderPid}),{success:!1,latestVersion:version3,lockFailed:!0,lockHolderPid}}}return logEvent("tengu_native_update_complete",{latency_ms:latencyMs,was_new_install:wasNewInstall,was_force_reinstall:forceReinstall}),logForDebugging(`Successfully updated to version ${version3}`),{success:!0,latestVersion:version3}}async function removeDirectoryIfEmpty(path40){try{await rmdir(path40),logForDebugging(`Removed empty directory at ${path40}`)}catch(error40){let code=getErrnoCode(error40);code!=="ENOTDIR"&&code!=="ENOENT"&&code!=="ENOTEMPTY"&&logForDebugging(`Could not remove directory at ${path40}: ${error40}`)}}async function updateSymlink(symlinkPath,targetPath){if(getPlatform2().startsWith("win32"))try{let parentDir2=dirname38(symlinkPath);await mkdir21(parentDir2,{recursive:!0});let existingStats;try{existingStats=await stat26(symlinkPath)}catch{}if(existingStats){try{let targetStats=await stat26(targetPath);if(existingStats.size===targetStats.size)return!1}catch{}let oldFileName=`${symlinkPath}.old.${Date.now()}`;await rename2(symlinkPath,oldFileName);try{await copyFile7(targetPath,symlinkPath);try{await unlink11(oldFileName)}catch{}}catch(copyError){try{await rename2(oldFileName,symlinkPath)}catch(restoreError){let errorWithCause=new Error(`Failed to restore old executable: ${restoreError}`,{cause:copyError});throw logError2(errorWithCause),errorWithCause}throw copyError}}else try{await copyFile7(targetPath,symlinkPath)}catch(e2){throw isENOENT(e2)?new Error(`Source file does not exist: ${targetPath}`):e2}return!0}catch(error40){return logError2(new Error(`Failed to copy executable from ${targetPath} to ${symlinkPath}: ${error40}`)),!1}let parentDir=dirname38(symlinkPath);try{await mkdir21(parentDir,{recursive:!0}),logForDebugging(`Created directory ${parentDir} for symlink`)}catch(mkdirError){return logError2(new Error(`Failed to create directory ${parentDir}: ${mkdirError}`)),!1}try{let symlinkExists=!1;try{await stat26(symlinkPath),symlinkExists=!0}catch{}if(symlinkExists){try{let currentTarget=await readlink(symlinkPath),resolvedCurrentTarget=resolve33(dirname38(symlinkPath),currentTarget),resolvedTargetPath=resolve33(targetPath);if(resolvedCurrentTarget===resolvedTargetPath)return!1}catch{}await unlink11(symlinkPath)}}catch(error40){logError2(new Error(`Failed to check/remove existing symlink: ${error40}`))}let tempSymlink=`${symlinkPath}.tmp.${process.pid}.${Date.now()}`;try{return await symlink4(targetPath,tempSymlink),await rename2(tempSymlink,symlinkPath),logForDebugging(`Atomically updated symlink ${symlinkPath} -> ${targetPath}`),!0}catch(error40){try{await unlink11(tempSymlink)}catch{}return logError2(new Error(`Failed to create symlink from ${symlinkPath} to ${targetPath}: ${error40}`)),!1}}async function checkInstall(force=!1){if(isEnvTruthy2(process.env.DISABLE_INSTALLATION_CHECKS))return[];let installationType=await getCurrentInstallationType();if(installationType==="development")return[];let config3=getGlobalConfig();if(!(force||installationType==="native"||config3.installMethod==="native"))return[];let dirs=getBaseDirectories(),messages=[],localBinDir=dirname38(dirs.executable),resolvedLocalBinPath=resolve33(localBinDir),isWindows2=getPlatform2().startsWith("win32");try{await access5(localBinDir)}catch{messages.push({message:`installMethod is native, but directory ${localBinDir} does not exist`,userActionRequired:!0,type:"error"})}if(isWindows2)await isPossibleClaudeBinary(dirs.executable)||messages.push({message:`installMethod is native, but ${APP_EXECUTABLE_NAME} command is missing or invalid at ${dirs.executable}`,userActionRequired:!0,type:"error"});else try{let target=await readlink(dirs.executable),absoluteTarget=resolve33(dirname38(dirs.executable),target);await isPossibleClaudeBinary(absoluteTarget)||messages.push({message:`${APP_EXECUTABLE_NAME} symlink points to missing or invalid binary: ${target}`,userActionRequired:!0,type:"error"})}catch(e2){isENOENT(e2)?messages.push({message:`installMethod is native, but ${APP_EXECUTABLE_NAME} command not found at ${dirs.executable}`,userActionRequired:!0,type:"error"}):await isPossibleClaudeBinary(dirs.executable)||messages.push({message:`${dirs.executable} exists but is not a valid ${APP_EXECUTABLE_NAME} binary`,userActionRequired:!0,type:"error"})}if(!(process.env.PATH||"").split(delimiter3).some(entry=>{try{let resolvedEntry=resolve33(entry);return isWindows2?resolvedEntry.toLowerCase()===resolvedLocalBinPath.toLowerCase():resolvedEntry===resolvedLocalBinPath}catch{return!1}}))if(isWindows2){let windowsBinPath=localBinDir.replace(/\//g,"\\");messages.push({message:`Native installation exists but ${windowsBinPath} is not in your PATH. Add it by opening: System Properties \u2192 Environment Variables \u2192 Edit User PATH \u2192 New \u2192 Add the path above. Then restart your terminal.`,userActionRequired:!0,type:"path"})}else{let shellType=getShellType(),configFile=getShellConfigPaths()[shellType],displayPath=configFile?configFile.replace(homedir25(),"~"):"your shell config file";messages.push({message:`Native installation exists but ~/.local/bin is not in your PATH. Run:
2998
+ ${pathLauncherVersion.stderr}`.trim().match(/\d+\.\d+\.\d+(?:[-+][^\s)]+)?/)?.[0];if(!reportedVersion||!lt2(reportedVersion,APP_UPDATE_VERSION))return[];let uninstallCmd=getKnownReleasePackageNames().map(packageName=>`npm -g uninstall ${packageName}`).join(" && ");return[{issue:`PATH launcher is stale: ${pathLauncher} reports ${reportedVersion} but this runtime is ${APP_UPDATE_VERSION}`,fix:`Remove stale npm/global launchers with: ${uninstallCmd}. If you use the native installer, run: ${APP_EXECUTABLE_NAME} install. To reinstall the npm launcher, run: npm i -g ${APP_NPM_PACKAGE_NAME}.`}]}async function detectMultipleInstallations(){let fs13=getFsImplementation(),installations=[],localPath=join87(homedir24(),".clavue","local",APP_EXECUTABLE_NAME);await localInstallationExists()&&installations.push({type:"npm-local",path:localPath});let packagesToCheck=getKnownReleasePackageNames(),npmResult=await execFileNoThrow("npm",["-g","config","get","prefix"]);if(npmResult.code===0&&npmResult.stdout){let npmPrefix=npmResult.stdout.trim(),isWindows2=getPlatform()==="windows",globalBinPath=isWindows2?join87(npmPrefix,APP_EXECUTABLE_NAME):join87(npmPrefix,"bin",APP_EXECUTABLE_NAME),globalBinExists=!1;try{await fs13.stat(globalBinPath),globalBinExists=!0}catch{}if(globalBinExists){let isCurrentHomebrewInstallation=!1;try{(await realpath8(globalBinPath)).includes("/Caskroom/")&&(isCurrentHomebrewInstallation=detectHomebrew())}catch{}isCurrentHomebrewInstallation||installations.push({type:"npm-global",path:globalBinPath})}else for(let packageName of packagesToCheck){let globalPackagePath=isWindows2?join87(npmPrefix,"node_modules",packageName):join87(npmPrefix,"lib","node_modules",packageName);try{await fs13.stat(globalPackagePath),installations.push({type:"npm-global-orphan",path:globalPackagePath})}catch{}}}let nativeBinPath=join87(homedir24(),".local","bin",APP_EXECUTABLE_NAME);try{await fs13.stat(nativeBinPath),installations.push({type:"native",path:nativeBinPath})}catch{}if(getGlobalConfig().installMethod==="native"){let nativeDataPath=join87(homedir24(),".local","share","claude");try{await fs13.stat(nativeDataPath),installations.some(i3=>i3.type==="native")||installations.push({type:"native",path:nativeDataPath})}catch{}}return installations}async function detectConfigurationIssues(type){let warnings=[];try{let raw=await readFile23(join87(getManagedFilePath(),"managed-settings.json"),"utf-8"),parsed=jsonParse(raw),field2=parsed&&typeof parsed=="object"?parsed.strictPluginOnlyCustomization:void 0;if(field2!==void 0&&typeof field2!="boolean")if(!Array.isArray(field2))warnings.push({issue:`managed-settings.json: strictPluginOnlyCustomization has an invalid value (expected true or an array, got ${typeof field2})`,fix:`The field is silently ignored (schema .catch rescues it). Set it to true, or an array of: ${CUSTOMIZATION_SURFACES.join(", ")}.`});else{let unknown2=field2.filter(x3=>typeof x3=="string"&&!CUSTOMIZATION_SURFACES.includes(x3));unknown2.length>0&&warnings.push({issue:`managed-settings.json: strictPluginOnlyCustomization has ${unknown2.length} value(s) this client doesn't recognize: ${unknown2.map(String).join(", ")}`,fix:`These are silently ignored (forwards-compat). Known surfaces for this version: ${CUSTOMIZATION_SURFACES.join(", ")}. Either remove them, or this client is older than the managed-settings intended.`})}}catch{}let config3=getGlobalConfig();if(type==="development")return warnings;if(type==="native"){let pathDirectories=(process.env.PATH||"").split(delimiter2),homeDir=homedir24(),localBinPath=join87(homeDir,".local","bin"),normalizedLocalBinPath=localBinPath;if(getPlatform()==="windows"&&(normalizedLocalBinPath=localBinPath.split(win322.sep).join(posix6.sep)),!pathDirectories.some(dir=>{let normalizedDir=dir;getPlatform()==="windows"&&(normalizedDir=dir.split(win322.sep).join(posix6.sep));let trimmedDir=normalizedDir.replace(/\/+$/,""),trimmedRawDir=dir.replace(/[/\\]+$/,"");return trimmedDir===normalizedLocalBinPath||trimmedRawDir==="~/.local/bin"||trimmedRawDir==="$HOME/.local/bin"}))if(getPlatform()==="windows"){let windowsLocalBinPath=localBinPath.split(posix6.sep).join(win322.sep);warnings.push({issue:`Native installation exists but ${windowsLocalBinPath} is not in your PATH`,fix:"Add it by opening: System Properties \u2192 Environment Variables \u2192 Edit User PATH \u2192 New \u2192 Add the path above. Then restart your terminal."})}else{let shellType=getShellType(),configFile=getShellConfigPaths()[shellType],displayPath=configFile?configFile.replace(homedir24(),"~"):"your shell config file";warnings.push({issue:"Native installation exists but ~/.local/bin is not in your PATH",fix:`Run: echo 'export PATH="$HOME/.local/bin:$PATH"' >> ${displayPath} then open a new terminal or run: source ${displayPath}`})}}isEnvTruthy2(process.env.DISABLE_INSTALLATION_CHECKS)||(type==="npm-local"&&config3.installMethod!=="local"&&warnings.push({issue:`Running from local installation but config install method is '${config3.installMethod}'`,fix:"Consider using native installation: clavue install"}),type==="native"&&config3.installMethod!=="native"&&warnings.push({issue:`Running native installation but config install method is '${config3.installMethod}'`,fix:"Run clavue install to update configuration"})),type==="npm-global"&&await localInstallationExists()&&warnings.push({issue:"Local installation exists but not being used",fix:"Consider using native installation: clavue install"});let existingAlias=await findClaudeAlias(),validAlias=await findValidClaudeAlias();return type==="npm-local"&&!await which(APP_EXECUTABLE_NAME)&&!validAlias&&(existingAlias?warnings.push({issue:"Local installation not accessible",fix:`Alias exists but points to invalid target: ${existingAlias}. Update alias: alias ${APP_EXECUTABLE_NAME}="~/.clavue/local/clavue"`}):warnings.push({issue:"Local installation not accessible",fix:`Create alias: alias ${APP_EXECUTABLE_NAME}="~/.clavue/local/clavue"`})),warnings}function detectLinuxGlobPatternWarnings(){if(getPlatform()!=="linux")return[];let warnings=[],globPatterns=SandboxManager.getLinuxGlobPatternWarnings();if(globPatterns.length>0){let displayPatterns=globPatterns.slice(0,3).join(", "),remaining=globPatterns.length-3,patternList=remaining>0?`${displayPatterns} (${remaining} more)`:displayPatterns;warnings.push({issue:"Glob patterns in sandbox permission rules are not fully supported on Linux",fix:`Found ${globPatterns.length} pattern(s): ${patternList}. On Linux, glob patterns in Edit/Read rules will be ignored.`})}return warnings}async function getDoctorDiagnostic(){let installationType=await getCurrentInstallationType(),version3=typeof MACRO<"u"?"13.9.2":"unknown",installationPath=await getInstallationPath(),invokedBinary=getInvokedBinary(),multipleInstallations=await detectMultipleInstallations(),warnings=await detectConfigurationIssues(installationType);warnings.push(...await detectStalePathLauncherWarning()),warnings.push(...detectLinuxGlobPatternWarnings());try{let{detectTmuxColorReduction:detectTmuxColorReduction2}=await Promise.resolve().then(()=>(init_tmuxColorDiagnostic(),tmuxColorDiagnostic_exports));for(let w2 of detectTmuxColorReduction2())warnings.push({issue:w2.issue,fix:w2.fix})}catch{}if(installationType==="native"){let npmInstalls=multipleInstallations.filter(i3=>i3.type==="npm-global"||i3.type==="npm-global-orphan"||i3.type==="npm-local"),isWindows2=getPlatform()==="windows";for(let install2 of npmInstalls)if(install2.type==="npm-global"){let uninstallCmd=getKnownReleasePackageNames().map(packageName=>`npm -g uninstall ${packageName}`).join(" && ");warnings.push({issue:`Leftover npm global installation at ${install2.path}`,fix:`Run: ${uninstallCmd}`})}else install2.type==="npm-global-orphan"?warnings.push({issue:`Orphaned npm global package at ${install2.path}`,fix:isWindows2?`Run: rmdir /s /q "${install2.path}"`:`Run: rm -rf ${install2.path}`}):install2.type==="npm-local"&&warnings.push({issue:`Leftover npm local installation at ${install2.path}`,fix:isWindows2?`Run: rmdir /s /q "${install2.path}"`:`Run: rm -rf ${install2.path}`})}let configInstallMethod=getGlobalConfig().installMethod||"not set",hasUpdatePermissions=null;installationType==="npm-global"&&(hasUpdatePermissions=(await checkGlobalInstallPermissions()).hasPermissions,!hasUpdatePermissions&&!getAutoUpdaterDisabledReason()&&warnings.push({issue:"Insufficient permissions for auto-updates",fix:"Do one of: (1) Re-install node without sudo, or (2) Use `clavue install` for native installation"}));let ripgrepStatusRaw=getRipgrepStatus(),ripgrepStatus2={working:ripgrepStatusRaw.working??!0,mode:ripgrepStatusRaw.mode,systemPath:ripgrepStatusRaw.mode==="system"?ripgrepStatusRaw.path:null},packageManager=installationType==="package-manager"?await getPackageManager():void 0;return{installationType,version:version3,installationPath,invokedBinary,configInstallMethod,autoUpdates:(()=>{let reason=getAutoUpdaterDisabledReason();return reason?`disabled (${formatAutoUpdaterDisabledReason(reason)})`:"enabled"})(),hasUpdatePermissions,multipleInstallations,warnings,packageManager,ripgrepStatus:ripgrepStatus2}}var init_doctorDiagnostic=__esm({"src/utils/doctorDiagnostic.ts"(){init_execa();init_autoUpdater();init_bundledMode();init_config12();init_cwd2();init_envUtils();init_execFileNoThrow();init_fsOperations();init_localInstaller();init_semver();init_packageManagers();init_platform2();init_ripgrep();init_sandbox_adapter();init_managedPath();init_types2();init_shellConfig();init_slowOperations();init_which();init_update2();__name(getNormalizedPaths,"getNormalizedPaths");__name(getCurrentInstallationType,"getCurrentInstallationType");__name(getInstallationPath,"getInstallationPath");__name(getInvokedBinary,"getInvokedBinary");__name(resolvePathConservatively,"resolvePathConservatively");__name(detectStalePathLauncherWarning,"detectStalePathLauncherWarning");__name(detectMultipleInstallations,"detectMultipleInstallations");__name(detectConfigurationIssues,"detectConfigurationIssues");__name(detectLinuxGlobPatternWarnings,"detectLinuxGlobPatternWarnings");__name(getDoctorDiagnostic,"getDoctorDiagnostic")}});function isStartupAutoIDEInstallError(status2){return!!(status2?.source==="startup-auto"&&status2.error)}var init_ideInstallationStatus=__esm({"src/utils/ideInstallationStatus.ts"(){__name(isStartupAutoIDEInstallError,"isStartupAutoIDEInstallError")}});import{homedir as osHomedir2}from"os";import{join as join88}from"path";function resolveOptions(options){return{env:options?.env??process.env,home:options?.homedir??process.env.HOME??osHomedir2()}}function getXDGStateHome(options){let{env:env5,home}=resolveOptions(options);return env5.XDG_STATE_HOME??join88(home,".local","state")}function getXDGCacheHome(options){let{env:env5,home}=resolveOptions(options);return env5.XDG_CACHE_HOME??join88(home,".cache")}function getXDGDataHome(options){let{env:env5,home}=resolveOptions(options);return env5.XDG_DATA_HOME??join88(home,".local","share")}function getUserBinDir(options){let{home}=resolveOptions(options);return join88(home,".local","bin")}var init_xdg=__esm({"src/utils/xdg.ts"(){__name(resolveOptions,"resolveOptions");__name(getXDGStateHome,"getXDGStateHome");__name(getXDGCacheHome,"getXDGCacheHome");__name(getXDGDataHome,"getXDGDataHome");__name(getUserBinDir,"getUserBinDir")}});import{createHash as createHash29}from"crypto";import{chmod as chmod7,writeFile as writeFile21}from"fs/promises";import{join as join89}from"path";async function getLatestVersionFromArtifactory(tag2="latest"){let startTime=Date.now(),{stdout,code,stderr}=await execFileNoThrowWithCwd("npm",["view",`@anthropic-ai/claude-code@${tag2}`,"version","--prefer-online","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:3e4,preserveOutputOnError:!0}),latencyMs=Date.now()-startTime;if(code!==0){logEvent("tengu_version_check_failure",{latency_ms:latencyMs,source_npm:!0,exit_code:code});let error40=new Error(`npm view failed with code ${code}: ${stderr}`);throw logError2(error40),error40}return logEvent("tengu_version_check_success",{latency_ms:latencyMs,source_npm:!0}),logForDebugging(`npm view @anthropic-ai/claude-code@${tag2} version: ${stdout}`),stdout.trim()}async function getLatestVersionFromBinaryRepo(channel="latest",baseUrl,authConfig){let startTime=Date.now();try{let response=await axios_default.get(`${baseUrl}/${channel}`,{timeout:3e4,responseType:"text",...authConfig}),latencyMs=Date.now()-startTime;return logEvent("tengu_version_check_success",{latency_ms:latencyMs}),response.data.trim()}catch(error40){let latencyMs=Date.now()-startTime,errorMessage5=error40 instanceof Error?error40.message:String(error40),httpStatus;axios_default.isAxiosError(error40)&&error40.response&&(httpStatus=error40.response.status),logEvent("tengu_version_check_failure",{latency_ms:latencyMs,http_status:httpStatus,is_timeout:errorMessage5.includes("timeout")});let fetchError=new Error(`Failed to fetch version from ${baseUrl}/${channel}: ${errorMessage5}`);throw logError2(fetchError),fetchError}}async function getLatestVersion2(channelOrVersion){if(/^v?\d+\.\d+\.\d+(-\S+)?$/.test(channelOrVersion)){let normalized=channelOrVersion.startsWith("v")?channelOrVersion.slice(1):channelOrVersion;if(/^99\.99\./.test(normalized))throw new Error(`Version ${normalized} is not available for installation. Use 'stable' or 'latest'.`);return normalized}let channel=channelOrVersion;if(channel!=="stable"&&channel!=="latest")throw new Error(`Invalid channel: ${channelOrVersion}. Use 'stable' or 'latest'`);return process.env.USER_TYPE==="ant"?getLatestVersionFromArtifactory(channel==="stable"?"stable":"latest"):getLatestVersionFromBinaryRepo(channel,GCS_BUCKET_URL)}async function downloadVersionFromArtifactory(version3,stagingPath){let fs13=getFsImplementation();await fs13.rm(stagingPath,{recursive:!0,force:!0});let platform5=getPlatform2(),platformPackageName=`@anthropic-ai/claude-code-${platform5}`;logForDebugging(`Fetching integrity hash for ${platformPackageName}@${version3}`);let{stdout:integrityOutput,code,stderr}=await execFileNoThrowWithCwd("npm",["view",`${platformPackageName}@${version3}`,"dist.integrity","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:3e4,preserveOutputOnError:!0});if(code!==0)throw new Error(`npm view integrity failed with code ${code}: ${stderr}`);let integrity=integrityOutput.trim();if(!integrity)throw new Error(`Failed to fetch integrity hash for ${platformPackageName}@${version3}`);logForDebugging(`Got integrity hash for ${platform5}: ${integrity}`),await fs13.mkdir(stagingPath);let packageJson={name:"clavue-native-installer",version:"0.0.1",dependencies:{clavue:version3}},packageLock={name:"clavue-native-installer",version:"0.0.1",lockfileVersion:3,requires:!0,packages:{"":{name:"clavue-native-installer",version:"0.0.1",dependencies:{clavue:version3}},"node_modules/clavue":{version:version3,optionalDependencies:{[platformPackageName]:version3}},[`node_modules/${platformPackageName}`]:{version:version3,integrity}}};writeFileSync4(join89(stagingPath,"package.json"),jsonStringify(packageJson,null,2),{encoding:"utf8",flush:!0}),writeFileSync4(join89(stagingPath,"package-lock.json"),jsonStringify(packageLock,null,2),{encoding:"utf8",flush:!0});let result2=await execFileNoThrowWithCwd("npm",["ci","--prefer-online","--registry",ARTIFACTORY_REGISTRY_URL],{timeout:6e4,preserveOutputOnError:!0,cwd:stagingPath});if(result2.code!==0)throw new Error(`npm ci failed with code ${result2.code}: ${result2.stderr}`);logForDebugging(`Successfully downloaded and verified @anthropic-ai/claude-code@${version3}`)}function getManifestBinaryName(platformInfo,platform5){return typeof platformInfo.binary=="string"&&platformInfo.binary?platformInfo.binary:getBinaryName(platform5)}function getStallTimeoutMs(){return Number(process.env.CLAUDE_CODE_STALL_TIMEOUT_MS_FOR_TESTING)||DEFAULT_STALL_TIMEOUT_MS}async function downloadAndVerifyBinary(binaryUrl,expectedChecksum,binaryPath,requestConfig={}){let lastError;for(let attempt2=1;attempt2<=MAX_DOWNLOAD_RETRIES;attempt2++){let controller=new AbortController,stallTimer,clearStallTimer=__name(()=>{stallTimer&&(clearTimeout(stallTimer),stallTimer=void 0)},"clearStallTimer"),resetStallTimer=__name(()=>{clearStallTimer(),stallTimer=setTimeout(c4=>c4.abort(),getStallTimeoutMs(),controller)},"resetStallTimer");try{resetStallTimer();let response=await axios_default.get(binaryUrl,{timeout:5*6e4,responseType:"arraybuffer",signal:controller.signal,onDownloadProgress:__name(()=>{resetStallTimer()},"onDownloadProgress"),...requestConfig});clearStallTimer();let hash2=createHash29("sha256");hash2.update(response.data);let actualChecksum=hash2.digest("hex");if(actualChecksum!==expectedChecksum)throw new Error(`Checksum mismatch: expected ${expectedChecksum}, got ${actualChecksum}`);await writeFile21(binaryPath,Buffer.from(response.data)),await chmod7(binaryPath,493);return}catch(error40){clearStallTimer();let isStallTimeout=axios_default.isCancel(error40);if(isStallTimeout?lastError=new StallTimeoutError:lastError=toError(error40),isStallTimeout&&attempt2<MAX_DOWNLOAD_RETRIES){logForDebugging(`Download stalled on attempt ${attempt2}/${MAX_DOWNLOAD_RETRIES}, retrying...`),await sleep2(1e3);continue}throw lastError}}throw lastError??new Error("Download failed after all retries")}async function downloadVersionFromBinaryRepo(version3,stagingPath,baseUrl,authConfig){let fs13=getFsImplementation();await fs13.rm(stagingPath,{recursive:!0,force:!0});let platform5=getPlatform2(),startTime=Date.now();logEvent("tengu_binary_download_attempt",{});let manifest;try{manifest=(await axios_default.get(`${baseUrl}/${version3}/manifest.json`,{timeout:1e4,responseType:"json",...authConfig})).data}catch(error40){let latencyMs=Date.now()-startTime,errorMessage5=error40 instanceof Error?error40.message:String(error40),httpStatus;throw axios_default.isAxiosError(error40)&&error40.response&&(httpStatus=error40.response.status),logEvent("tengu_binary_manifest_fetch_failure",{latency_ms:latencyMs,http_status:httpStatus,is_timeout:errorMessage5.includes("timeout")}),logError2(new Error(`Failed to fetch manifest from ${baseUrl}/${version3}/manifest.json: ${errorMessage5}`)),error40}let platformInfo=manifest.platforms[platform5];if(!platformInfo)throw logEvent("tengu_binary_platform_not_found",{}),new Error(`Platform ${platform5} not found in manifest for version ${version3}`);let expectedChecksum=platformInfo.checksum,artifactName=getManifestBinaryName(platformInfo,platform5),binaryName=getBinaryName(platform5),binaryUrl=`${baseUrl}/${version3}/${platform5}/${artifactName}`;await fs13.mkdir(stagingPath);let binaryPath=join89(stagingPath,binaryName);try{await downloadAndVerifyBinary(binaryUrl,expectedChecksum,binaryPath,authConfig||{});let latencyMs=Date.now()-startTime;logEvent("tengu_binary_download_success",{latency_ms:latencyMs})}catch(error40){let latencyMs=Date.now()-startTime,errorMessage5=error40 instanceof Error?error40.message:String(error40),httpStatus;throw axios_default.isAxiosError(error40)&&error40.response&&(httpStatus=error40.response.status),logEvent("tengu_binary_download_failure",{latency_ms:latencyMs,http_status:httpStatus,is_timeout:errorMessage5.includes("timeout"),is_checksum_mismatch:errorMessage5.includes("Checksum mismatch")}),logError2(new Error(`Failed to download binary from ${binaryUrl}: ${errorMessage5}`)),error40}}async function downloadVersion(version3,stagingPath){return process.env.USER_TYPE==="ant"?(await downloadVersionFromArtifactory(version3,stagingPath),"npm"):(await downloadVersionFromBinaryRepo(version3,stagingPath,GCS_BUCKET_URL),"binary")}var GCS_BUCKET_URL,ARTIFACTORY_REGISTRY_URL,DEFAULT_STALL_TIMEOUT_MS,MAX_DOWNLOAD_RETRIES,StallTimeoutError,init_download=__esm({"src/utils/nativeInstaller/download.ts"(){init_axios2();init_analytics();init_debug();init_errors2();init_execFileNoThrow();init_fsOperations();init_log3();init_sleep2();init_slowOperations();init_installer();GCS_BUCKET_URL="https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases",ARTIFACTORY_REGISTRY_URL="https://artifactory.infra.ant.dev/artifactory/api/npm/npm-all/";__name(getLatestVersionFromArtifactory,"getLatestVersionFromArtifactory");__name(getLatestVersionFromBinaryRepo,"getLatestVersionFromBinaryRepo");__name(getLatestVersion2,"getLatestVersion");__name(downloadVersionFromArtifactory,"downloadVersionFromArtifactory");DEFAULT_STALL_TIMEOUT_MS=6e4,MAX_DOWNLOAD_RETRIES=3;__name(getManifestBinaryName,"getManifestBinaryName");__name(getStallTimeoutMs,"getStallTimeoutMs");StallTimeoutError=class extends Error{static{__name(this,"StallTimeoutError")}constructor(){super("Download stalled: no data received for 60 seconds"),this.name="StallTimeoutError"}};__name(downloadAndVerifyBinary,"downloadAndVerifyBinary");__name(downloadVersionFromBinaryRepo,"downloadVersionFromBinaryRepo");__name(downloadVersion,"downloadVersion")}});import{basename as basename20,join as join90}from"path";function isPidBasedLockingEnabled(){let envVar=process.env.ENABLE_PID_BASED_VERSION_LOCKING;return isEnvTruthy2(envVar)?!0:isEnvDefinedFalsy(envVar)?!1:getFeatureValue_CACHED_MAY_BE_STALE("tengu_pid_based_version_locking",!1)}function isProcessRunning3(pid){if(pid<=1)return!1;try{return process.kill(pid,0),!0}catch{return!1}}function isClaudeProcess(pid,expectedExecPath){if(!isProcessRunning3(pid))return!1;if(pid===process.pid)return!0;try{let command7=getProcessCommand(pid);if(!command7)return!0;let normalizedCommand=command7.toLowerCase(),normalizedExecPath=expectedExecPath.toLowerCase();return normalizedCommand.includes("claude")||normalizedCommand.includes(normalizedExecPath)}catch{return!0}}function readLockContent(lockFilePath){let fs13=getFsImplementation();try{let content=fs13.readFileSync(lockFilePath,{encoding:"utf8"});if(!content||content.trim()==="")return null;let parsed=jsonParse(content);return typeof parsed.pid!="number"||!parsed.version||!parsed.execPath?null:parsed}catch{return null}}function isLockActive(lockFilePath){let content=readLockContent(lockFilePath);if(!content)return!1;let{pid,execPath:execPath2}=content;if(!isProcessRunning3(pid))return!1;if(!isClaudeProcess(pid,execPath2))return logForDebugging(`Lock PID ${pid} is running but does not appear to be Clavue - treating as stale`),!1;let fs13=getFsImplementation();try{let stats3=fs13.statSync(lockFilePath);if(Date.now()-stats3.mtimeMs>FALLBACK_STALE_MS&&!isProcessRunning3(pid))return!1}catch{}return!0}function writeLockFile(lockFilePath,content){let fs13=getFsImplementation(),tempPath=`${lockFilePath}.tmp.${process.pid}.${Date.now()}`;try{writeFileSync4(tempPath,jsonStringify(content,null,2),{encoding:"utf8",flush:!0}),fs13.renameSync(tempPath,lockFilePath)}catch(error40){try{fs13.unlinkSync(tempPath)}catch{}throw error40}}async function tryAcquireLock(versionPath,lockFilePath){let fs13=getFsImplementation(),versionName=basename20(versionPath);if(isLockActive(lockFilePath)){let existingContent=readLockContent(lockFilePath);return logForDebugging(`Cannot acquire lock for ${versionName} - held by PID ${existingContent?.pid}`),null}let lockContent={pid:process.pid,version:versionName,execPath:process.execPath,acquiredAt:Date.now()};try{return writeLockFile(lockFilePath,lockContent),readLockContent(lockFilePath)?.pid!==process.pid?null:(logForDebugging(`Acquired PID lock for ${versionName} (PID ${process.pid})`),()=>{try{readLockContent(lockFilePath)?.pid===process.pid&&(fs13.unlinkSync(lockFilePath),logForDebugging(`Released PID lock for ${versionName}`))}catch(error40){logForDebugging(`Failed to release lock for ${versionName}: ${error40}`)}})}catch(error40){return logForDebugging(`Failed to acquire lock for ${versionName}: ${error40}`),null}}async function acquireProcessLifetimeLock(versionPath,lockFilePath){let release2=await tryAcquireLock(versionPath,lockFilePath);if(!release2)return!1;let cleanup=__name(()=>{try{release2()}catch{}},"cleanup");return process.on("exit",cleanup),process.on("SIGINT",cleanup),process.on("SIGTERM",cleanup),!0}async function withLock(versionPath,lockFilePath,callback){let release2=await tryAcquireLock(versionPath,lockFilePath);if(!release2)return!1;try{return await callback(),!0}finally{release2()}}function cleanupStaleLocks(locksDir){let fs13=getFsImplementation(),cleanedCount=0;try{let lockEntries=fs13.readdirStringSync(locksDir).filter(f3=>f3.endsWith(".lock"));for(let lockEntry of lockEntries){let lockFilePath=join90(locksDir,lockEntry);try{fs13.lstatSync(lockFilePath).isDirectory()?(fs13.rmSync(lockFilePath,{recursive:!0,force:!0}),cleanedCount++,logForDebugging(`Cleaned up legacy directory lock: ${lockEntry}`)):isLockActive(lockFilePath)||(fs13.unlinkSync(lockFilePath),cleanedCount++,logForDebugging(`Cleaned up stale lock: ${lockEntry}`))}catch{}}}catch(error40){if(isENOENT(error40))return 0;logError2(toError(error40))}return cleanedCount}var FALLBACK_STALE_MS,init_pidLock=__esm({"src/utils/nativeInstaller/pidLock.ts"(){init_growthbook();init_debug();init_envUtils();init_errors2();init_fsOperations();init_genericProcessUtils();init_log3();init_slowOperations();__name(isPidBasedLockingEnabled,"isPidBasedLockingEnabled");FALLBACK_STALE_MS=7200*1e3;__name(isProcessRunning3,"isProcessRunning");__name(isClaudeProcess,"isClaudeProcess");__name(readLockContent,"readLockContent");__name(isLockActive,"isLockActive");__name(writeLockFile,"writeLockFile");__name(tryAcquireLock,"tryAcquireLock");__name(acquireProcessLifetimeLock,"acquireProcessLifetimeLock");__name(withLock,"withLock");__name(cleanupStaleLocks,"cleanupStaleLocks")}});import{constants as fsConstants4}from"fs";import{access as access5,chmod as chmod8,copyFile as copyFile7,lstat as lstat3,mkdir as mkdir21,readdir as readdir13,readlink,realpath as realpath9,rename as rename2,rm as rm4,rmdir,stat as stat26,symlink as symlink4,unlink as unlink11,writeFile as writeFile22}from"fs/promises";import{homedir as homedir25}from"os";import{basename as basename21,delimiter as delimiter3,dirname as dirname38,join as join91,resolve as resolve33}from"path";function getPlatform2(){let os6=env4.platform,arch3=process.arch==="x64"?"x64":process.arch==="arm64"?"arm64":null;if(!arch3){let error40=new Error(`Unsupported architecture: ${process.arch}`);throw logForDebugging(`Native installer does not support architecture: ${process.arch}`,{level:"error"}),error40}return os6==="linux"&&envDynamic.isMuslEnvironment()?`linux-${arch3}-musl`:`${os6}-${arch3}`}function getBinaryName(platform5){return platform5.startsWith("win32")?`${APP_EXECUTABLE_NAME}.exe`:APP_EXECUTABLE_NAME}function getBaseDirectories(){let platform5=getPlatform2(),executableName=getBinaryName(platform5);return{versions:join91(getXDGDataHome(),"clavue","versions"),staging:join91(getXDGCacheHome(),"clavue","staging"),locks:join91(getXDGStateHome(),"clavue","locks"),executable:join91(getUserBinDir(),executableName)}}async function isPossibleClaudeBinary(filePath){try{let stats3=await stat26(filePath);return!stats3.isFile()||stats3.size===0?!1:(await access5(filePath,fsConstants4.X_OK),!0)}catch{return!1}}async function getVersionPaths(version3){let dirs=getBaseDirectories(),dirsToCreate=[dirs.versions,dirs.staging,dirs.locks];await Promise.all(dirsToCreate.map(dir=>mkdir21(dir,{recursive:!0})));let executableParentDir=dirname38(dirs.executable);await mkdir21(executableParentDir,{recursive:!0});let installPath=join91(dirs.versions,version3);try{await stat26(installPath)}catch{await writeFile22(installPath,"",{encoding:"utf8"})}return{stagingPath:join91(dirs.staging,version3),installPath}}async function tryWithVersionLock(versionFilePath,callback,retries=0){let dirs=getBaseDirectories(),lockfilePath=getLockFilePathFromVersionPath(dirs,versionFilePath);if(await mkdir21(dirs.locks,{recursive:!0}),isPidBasedLockingEnabled()){let attempts=0,maxAttempts=retries+1,minTimeout=retries>0?1e3:100,maxTimeout=retries>0?5e3:500;for(;attempts<maxAttempts;){if(await withLock(versionFilePath,lockfilePath,async()=>{try{await callback()}catch(error40){throw logError2(error40),error40}}))return logEvent("tengu_version_lock_acquired",{is_pid_based:!0,is_lifetime_lock:!1,attempts:attempts+1}),!0;if(attempts++,attempts<maxAttempts){let timeout=Math.min(minTimeout*Math.pow(2,attempts-1),maxTimeout);await sleep2(timeout)}}return logEvent("tengu_version_lock_failed",{is_pid_based:!0,is_lifetime_lock:!1,attempts:maxAttempts}),logLockAcquisitionError(versionFilePath,new Error("Lock held by another process")),!1}let release2=null;try{try{release2=await lock(versionFilePath,{stale:LOCK_STALE_MS,retries:{retries,minTimeout:retries>0?1e3:100,maxTimeout:retries>0?5e3:500},lockfilePath,onCompromised:__name(err2=>{logForDebugging(`NON-FATAL: Version lock was compromised during operation: ${err2.message}`,{level:"info"})},"onCompromised")})}catch(lockError){return logEvent("tengu_version_lock_failed",{is_pid_based:!1,is_lifetime_lock:!1}),logLockAcquisitionError(versionFilePath,lockError),!1}try{return await callback(),logEvent("tengu_version_lock_acquired",{is_pid_based:!1,is_lifetime_lock:!1}),!0}catch(error40){throw logError2(error40),error40}}finally{release2&&await release2()}}async function atomicMoveToInstallPath(stagedBinaryPath,installPath){await mkdir21(dirname38(installPath),{recursive:!0});let tempInstallPath=`${installPath}.tmp.${process.pid}.${Date.now()}`;try{await copyFile7(stagedBinaryPath,tempInstallPath),await chmod8(tempInstallPath,493),await rename2(tempInstallPath,installPath),logForDebugging(`Atomically installed binary to ${installPath}`)}catch(error40){try{await unlink11(tempInstallPath)}catch{}throw error40}}async function installVersionFromPackage(stagingPath,installPath){try{let nodeModulesDir=join91(stagingPath,"node_modules","@anthropic-ai"),nativePackage=(await readdir13(nodeModulesDir)).find(entry=>entry.startsWith("claude-cli-native-"));if(!nativePackage)throw logEvent("tengu_native_install_package_failure",{stage_find_package:!0,error_package_not_found:!0}),new Error("Could not find platform-specific native package");let stagedBinaryPath=join91(nodeModulesDir,nativePackage,"cli");try{await stat26(stagedBinaryPath)}catch{throw logEvent("tengu_native_install_package_failure",{stage_binary_exists:!0,error_binary_not_found:!0}),new Error("Native binary not found in staged package")}await atomicMoveToInstallPath(stagedBinaryPath,installPath),await rm4(stagingPath,{recursive:!0,force:!0}),logEvent("tengu_native_install_package_success",{})}catch(error40){let msg=errorMessage2(error40);throw!msg.includes("Could not find platform-specific")&&!msg.includes("Native binary not found")&&logEvent("tengu_native_install_package_failure",{stage_atomic_move:!0,error_move_failed:!0}),logError2(toError(error40)),error40}}async function installVersionFromBinary(stagingPath,installPath){try{let platform5=getPlatform2(),binaryName=getBinaryName(platform5),stagedBinaryPath=join91(stagingPath,binaryName);try{await stat26(stagedBinaryPath)}catch{throw logEvent("tengu_native_install_binary_failure",{stage_binary_exists:!0,error_binary_not_found:!0}),new Error("Staged binary not found")}await atomicMoveToInstallPath(stagedBinaryPath,installPath),await rm4(stagingPath,{recursive:!0,force:!0}),logEvent("tengu_native_install_binary_success",{})}catch(error40){throw errorMessage2(error40).includes("Staged binary not found")||logEvent("tengu_native_install_binary_failure",{stage_atomic_move:!0,error_move_failed:!0}),logError2(toError(error40)),error40}}async function installVersion(stagingPath,installPath,downloadType){downloadType==="npm"?await installVersionFromPackage(stagingPath,installPath):await installVersionFromBinary(stagingPath,installPath)}async function performVersionUpdate(version3,forceReinstall){let{stagingPath:baseStagingPath,installPath}=await getVersionPaths(version3),{executable:executablePath}=getBaseDirectories(),stagingPath=isEnvTruthy2(process.env.ENABLE_LOCKLESS_UPDATES)?`${baseStagingPath}.${process.pid}.${Date.now()}`:baseStagingPath,needsInstall=!await versionIsAvailable(version3)||forceReinstall;if(needsInstall){logForDebugging(forceReinstall?`Force reinstalling native installer version ${version3}`:`Downloading native installer version ${version3}`);let downloadType=await downloadVersion(version3,stagingPath);await installVersion(stagingPath,installPath,downloadType)}else logForDebugging(`Version ${version3} already installed, updating symlink`);if(await removeDirectoryIfEmpty(executablePath),await updateSymlink(executablePath,installPath),!await isPossibleClaudeBinary(executablePath)){let installPathExists=!1;try{await stat26(installPath),installPathExists=!0}catch{}throw new Error(`Failed to create executable at ${executablePath}. Source file exists: ${installPathExists}. Check write permissions to ${executablePath}.`)}return needsInstall}async function versionIsAvailable(version3){let{installPath}=await getVersionPaths(version3);return isPossibleClaudeBinary(installPath)}async function updateLatest(channelOrVersion,forceReinstall=!1){let startTime=Date.now(),version3=await getLatestVersion2(channelOrVersion),{executable:executablePath}=getBaseDirectories();if(logForDebugging(`Checking for native installer update to version ${version3}`),!forceReinstall){let maxVersion=await getMaxVersion();if(maxVersion&&gt2(version3,maxVersion)){if(logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version3} to ${maxVersion}`),gte2("2.1.88",maxVersion))return logForDebugging(`Native installer: current version 2.1.88 is already at or above maxVersion ${maxVersion}, skipping update`),logEvent("tengu_native_update_skipped_max_version",{latency_ms:Date.now()-startTime,max_version:maxVersion,available_version:version3}),{success:!0,latestVersion:version3};version3=maxVersion}}if(!forceReinstall&&version3==="13.9.2"&&await versionIsAvailable(version3)&&await isPossibleClaudeBinary(executablePath))return logForDebugging(`Found ${version3} at ${executablePath}, skipping install`),logEvent("tengu_native_update_complete",{latency_ms:Date.now()-startTime,was_new_install:!1,was_force_reinstall:!1,was_already_running:!0}),{success:!0,latestVersion:version3};if(!forceReinstall&&shouldSkipVersion(version3))return logEvent("tengu_native_update_skipped_minimum_version",{latency_ms:Date.now()-startTime,target_version:version3}),{success:!0,latestVersion:version3};let wasNewInstall=!1,latencyMs;if(isEnvTruthy2(process.env.ENABLE_LOCKLESS_UPDATES))wasNewInstall=await performVersionUpdate(version3,forceReinstall),latencyMs=Date.now()-startTime;else{let{installPath}=await getVersionPaths(version3);forceReinstall&&await forceRemoveLock(installPath);let lockAcquired=await tryWithVersionLock(installPath,async()=>{wasNewInstall=await performVersionUpdate(version3,forceReinstall)},3);if(latencyMs=Date.now()-startTime,!lockAcquired){let dirs=getBaseDirectories(),lockHolderPid;if(isPidBasedLockingEnabled()){let lockfilePath=getLockFilePathFromVersionPath(dirs,installPath);isLockActive(lockfilePath)&&(lockHolderPid=readLockContent(lockfilePath)?.pid)}return logEvent("tengu_native_update_lock_failed",{latency_ms:latencyMs,lock_holder_pid:lockHolderPid}),{success:!1,latestVersion:version3,lockFailed:!0,lockHolderPid}}}return logEvent("tengu_native_update_complete",{latency_ms:latencyMs,was_new_install:wasNewInstall,was_force_reinstall:forceReinstall}),logForDebugging(`Successfully updated to version ${version3}`),{success:!0,latestVersion:version3}}async function removeDirectoryIfEmpty(path40){try{await rmdir(path40),logForDebugging(`Removed empty directory at ${path40}`)}catch(error40){let code=getErrnoCode(error40);code!=="ENOTDIR"&&code!=="ENOENT"&&code!=="ENOTEMPTY"&&logForDebugging(`Could not remove directory at ${path40}: ${error40}`)}}async function updateSymlink(symlinkPath,targetPath){if(getPlatform2().startsWith("win32"))try{let parentDir2=dirname38(symlinkPath);await mkdir21(parentDir2,{recursive:!0});let existingStats;try{existingStats=await stat26(symlinkPath)}catch{}if(existingStats){try{let targetStats=await stat26(targetPath);if(existingStats.size===targetStats.size)return!1}catch{}let oldFileName=`${symlinkPath}.old.${Date.now()}`;await rename2(symlinkPath,oldFileName);try{await copyFile7(targetPath,symlinkPath);try{await unlink11(oldFileName)}catch{}}catch(copyError){try{await rename2(oldFileName,symlinkPath)}catch(restoreError){let errorWithCause=new Error(`Failed to restore old executable: ${restoreError}`,{cause:copyError});throw logError2(errorWithCause),errorWithCause}throw copyError}}else try{await copyFile7(targetPath,symlinkPath)}catch(e2){throw isENOENT(e2)?new Error(`Source file does not exist: ${targetPath}`):e2}return!0}catch(error40){return logError2(new Error(`Failed to copy executable from ${targetPath} to ${symlinkPath}: ${error40}`)),!1}let parentDir=dirname38(symlinkPath);try{await mkdir21(parentDir,{recursive:!0}),logForDebugging(`Created directory ${parentDir} for symlink`)}catch(mkdirError){return logError2(new Error(`Failed to create directory ${parentDir}: ${mkdirError}`)),!1}try{let symlinkExists=!1;try{await stat26(symlinkPath),symlinkExists=!0}catch{}if(symlinkExists){try{let currentTarget=await readlink(symlinkPath),resolvedCurrentTarget=resolve33(dirname38(symlinkPath),currentTarget),resolvedTargetPath=resolve33(targetPath);if(resolvedCurrentTarget===resolvedTargetPath)return!1}catch{}await unlink11(symlinkPath)}}catch(error40){logError2(new Error(`Failed to check/remove existing symlink: ${error40}`))}let tempSymlink=`${symlinkPath}.tmp.${process.pid}.${Date.now()}`;try{return await symlink4(targetPath,tempSymlink),await rename2(tempSymlink,symlinkPath),logForDebugging(`Atomically updated symlink ${symlinkPath} -> ${targetPath}`),!0}catch(error40){try{await unlink11(tempSymlink)}catch{}return logError2(new Error(`Failed to create symlink from ${symlinkPath} to ${targetPath}: ${error40}`)),!1}}async function checkInstall(force=!1){if(isEnvTruthy2(process.env.DISABLE_INSTALLATION_CHECKS))return[];let installationType=await getCurrentInstallationType();if(installationType==="development")return[];let config3=getGlobalConfig();if(!(force||installationType==="native"||config3.installMethod==="native"))return[];let dirs=getBaseDirectories(),messages=[],localBinDir=dirname38(dirs.executable),resolvedLocalBinPath=resolve33(localBinDir),isWindows2=getPlatform2().startsWith("win32");try{await access5(localBinDir)}catch{messages.push({message:`installMethod is native, but directory ${localBinDir} does not exist`,userActionRequired:!0,type:"error"})}if(isWindows2)await isPossibleClaudeBinary(dirs.executable)||messages.push({message:`installMethod is native, but ${APP_EXECUTABLE_NAME} command is missing or invalid at ${dirs.executable}`,userActionRequired:!0,type:"error"});else try{let target=await readlink(dirs.executable),absoluteTarget=resolve33(dirname38(dirs.executable),target);await isPossibleClaudeBinary(absoluteTarget)||messages.push({message:`${APP_EXECUTABLE_NAME} symlink points to missing or invalid binary: ${target}`,userActionRequired:!0,type:"error"})}catch(e2){isENOENT(e2)?messages.push({message:`installMethod is native, but ${APP_EXECUTABLE_NAME} command not found at ${dirs.executable}`,userActionRequired:!0,type:"error"}):await isPossibleClaudeBinary(dirs.executable)||messages.push({message:`${dirs.executable} exists but is not a valid ${APP_EXECUTABLE_NAME} binary`,userActionRequired:!0,type:"error"})}if(!(process.env.PATH||"").split(delimiter3).some(entry=>{try{let resolvedEntry=resolve33(entry);return isWindows2?resolvedEntry.toLowerCase()===resolvedLocalBinPath.toLowerCase():resolvedEntry===resolvedLocalBinPath}catch{return!1}}))if(isWindows2){let windowsBinPath=localBinDir.replace(/\//g,"\\");messages.push({message:`Native installation exists but ${windowsBinPath} is not in your PATH. Add it by opening: System Properties \u2192 Environment Variables \u2192 Edit User PATH \u2192 New \u2192 Add the path above. Then restart your terminal.`,userActionRequired:!0,type:"path"})}else{let shellType=getShellType(),configFile=getShellConfigPaths()[shellType],displayPath=configFile?configFile.replace(homedir25(),"~"):"your shell config file";messages.push({message:`Native installation exists but ~/.local/bin is not in your PATH. Run:
2999
2999
 
3000
3000
  echo 'export PATH="$HOME/.local/bin:$PATH"' >> ${displayPath} && source ${displayPath}`,userActionRequired:!0,type:"path"})}return messages}function installLatest(channelOrVersion,forceReinstall=!1){if(forceReinstall)return installLatestImpl(channelOrVersion,forceReinstall);if(inFlightInstall)return logForDebugging("installLatest: joining in-flight call"),inFlightInstall;let promise2=installLatestImpl(channelOrVersion,forceReinstall);inFlightInstall=promise2;let clear2=__name(()=>{inFlightInstall=null},"clear");return promise2.then(clear2,clear2),promise2}async function installLatestImpl(channelOrVersion,forceReinstall=!1){let updateResult=await updateLatest(channelOrVersion,forceReinstall);return updateResult.success?(getGlobalConfig().installMethod!=="native"&&(saveGlobalConfig(current=>({...current,installMethod:"native",autoUpdates:!1,autoUpdatesProtectedForNative:!0})),logForDebugging('Native installer: Set installMethod to "native" and disabled legacy auto-updater for protection')),cleanupOldVersions(),{latestVersion:updateResult.latestVersion,wasUpdated:updateResult.success,lockFailed:!1}):{latestVersion:null,wasUpdated:!1,lockFailed:updateResult.lockFailed,lockHolderPid:updateResult.lockHolderPid}}async function getVersionFromSymlink(symlinkPath){try{let target=await readlink(symlinkPath),absoluteTarget=resolve33(dirname38(symlinkPath),target);if(await isPossibleClaudeBinary(absoluteTarget))return absoluteTarget}catch{}return null}function getLockFilePathFromVersionPath(dirs,versionPath){let versionName=basename21(versionPath);return join91(dirs.locks,`${versionName}.lock`)}async function lockCurrentVersion(){let dirs=getBaseDirectories();if(!process.execPath.includes(dirs.versions))return;let versionPath=resolve33(process.execPath);try{let lockfilePath=getLockFilePathFromVersionPath(dirs,versionPath);if(await mkdir21(dirs.locks,{recursive:!0}),isPidBasedLockingEnabled()){if(!await acquireProcessLifetimeLock(versionPath,lockfilePath)){logEvent("tengu_version_lock_failed",{is_pid_based:!0,is_lifetime_lock:!0}),logLockAcquisitionError(versionPath,new Error("Lock already held by another process"));return}logEvent("tengu_version_lock_acquired",{is_pid_based:!0,is_lifetime_lock:!0}),logForDebugging(`Acquired PID lock on running version: ${versionPath}`)}else{let release2;try{release2=await lock(versionPath,{stale:LOCK_STALE_MS,retries:0,lockfilePath,onCompromised:__name(err2=>{logForDebugging(`NON-FATAL: Lock on running version was compromised: ${err2.message}`,{level:"info"})},"onCompromised")}),logEvent("tengu_version_lock_acquired",{is_pid_based:!1,is_lifetime_lock:!0}),logForDebugging(`Acquired mtime-based lock on running version: ${versionPath}`),registerCleanup(async()=>{try{await release2?.()}catch{}})}catch(lockError){if(isENOENT(lockError)){logForDebugging(`Cannot lock current version - file does not exist: ${versionPath}`,{level:"info"});return}logEvent("tengu_version_lock_failed",{is_pid_based:!1,is_lifetime_lock:!0}),logLockAcquisitionError(versionPath,lockError);return}}}catch(error40){if(isENOENT(error40)){logForDebugging(`Cannot lock current version - file does not exist: ${versionPath}`,{level:"info"});return}logForDebugging(`NON-FATAL: Failed to lock current version during execution ${errorMessage2(error40)}`,{level:"info"})}}function logLockAcquisitionError(versionPath,lockError){logError2(new Error(`NON-FATAL: Lock acquisition failed for ${versionPath} (expected in multi-process scenarios)`,{cause:lockError}))}async function forceRemoveLock(versionFilePath){let dirs=getBaseDirectories(),lockfilePath=getLockFilePathFromVersionPath(dirs,versionFilePath);try{await unlink11(lockfilePath),logForDebugging(`Force-removed lock file at ${lockfilePath}`)}catch(error40){logForDebugging(`Failed to force-remove lock file: ${errorMessage2(error40)}`)}}async function cleanupOldVersions(){await Promise.resolve();let dirs=getBaseDirectories(),oneHourAgo=Date.now()-36e5;if(getPlatform2().startsWith("win32")){let executableDir=dirname38(dirs.executable);try{let files3=await readdir13(executableDir),cleanedCount=0;for(let file2 of files3)if(/^claude\.exe\.old\.\d+$/.test(file2))try{await unlink11(join91(executableDir,file2)),cleanedCount++}catch{}cleanedCount>0&&logForDebugging(`Cleaned up ${cleanedCount} old Windows executables on startup`)}catch(error40){isENOENT(error40)||logForDebugging(`Failed to clean up old Windows executables: ${error40}`)}}try{let stagingEntries=await readdir13(dirs.staging),stagingCleanedCount=0;for(let entry of stagingEntries){let stagingPath=join91(dirs.staging,entry);try{(await stat26(stagingPath)).mtime.getTime()<oneHourAgo&&(await rm4(stagingPath,{recursive:!0,force:!0}),stagingCleanedCount++,logForDebugging(`Cleaned up old staging directory: ${entry}`))}catch{}}stagingCleanedCount>0&&(logForDebugging(`Cleaned up ${stagingCleanedCount} orphaned staging directories`),logEvent("tengu_native_staging_cleanup",{cleaned_count:stagingCleanedCount}))}catch(error40){isENOENT(error40)||logForDebugging(`Failed to clean up staging directories: ${error40}`)}if(isPidBasedLockingEnabled()){let staleLocksCleaned=cleanupStaleLocks(dirs.locks);staleLocksCleaned>0&&(logForDebugging(`Cleaned up ${staleLocksCleaned} stale version locks`),logEvent("tengu_native_stale_locks_cleanup",{cleaned_count:staleLocksCleaned}))}let versionEntries;try{versionEntries=await readdir13(dirs.versions)}catch(error40){isENOENT(error40)||logForDebugging(`Failed to readdir versions directory: ${error40}`);return}let versionFiles=[],tempFilesCleanedCount=0;for(let entry of versionEntries){let entryPath=join91(dirs.versions,entry);if(/\.tmp\.\d+\.\d+$/.test(entry)){try{(await stat26(entryPath)).mtime.getTime()<oneHourAgo&&(await unlink11(entryPath),tempFilesCleanedCount++,logForDebugging(`Cleaned up orphaned temp install file: ${entry}`))}catch{}continue}try{let stats3=await stat26(entryPath);if(!stats3.isFile()||process.platform!=="win32"&&stats3.size>0&&(stats3.mode&73)===0)continue;versionFiles.push({name:entry,path:entryPath,resolvedPath:resolve33(entryPath),mtime:stats3.mtime})}catch{}}if(tempFilesCleanedCount>0&&(logForDebugging(`Cleaned up ${tempFilesCleanedCount} orphaned temp install files`),logEvent("tengu_native_temp_files_cleanup",{cleaned_count:tempFilesCleanedCount})),versionFiles.length!==0)try{let currentBinaryPath=process.execPath,protectedVersions=new Set;currentBinaryPath&&currentBinaryPath.includes(dirs.versions)&&protectedVersions.add(resolve33(currentBinaryPath));let currentSymlinkVersion=await getVersionFromSymlink(dirs.executable);currentSymlinkVersion&&protectedVersions.add(currentSymlinkVersion);for(let v2 of versionFiles){if(protectedVersions.has(v2.resolvedPath))continue;let lockFilePath=getLockFilePathFromVersionPath(dirs,v2.resolvedPath),hasActiveLock=!1;if(isPidBasedLockingEnabled())hasActiveLock=isLockActive(lockFilePath);else try{hasActiveLock=await check2(v2.resolvedPath,{stale:LOCK_STALE_MS,lockfilePath:lockFilePath})}catch{hasActiveLock=!1}hasActiveLock&&(protectedVersions.add(v2.resolvedPath),logForDebugging(`Protecting locked version from cleanup: ${v2.name}`))}let versionsToDelete=versionFiles.filter(v2=>!protectedVersions.has(v2.resolvedPath)).sort((a2,b3)=>b3.mtime.getTime()-a2.mtime.getTime()).slice(VERSION_RETENTION_COUNT);if(versionsToDelete.length===0){logEvent("tengu_native_version_cleanup",{total_count:versionFiles.length,deleted_count:0,protected_count:protectedVersions.size,retained_count:VERSION_RETENTION_COUNT,lock_failed_count:0,error_count:0});return}let deletedCount=0,lockFailedCount=0,errorCount=0;await Promise.all(versionsToDelete.map(async version3=>{try{await tryWithVersionLock(version3.path,async()=>{await unlink11(version3.path)})?deletedCount++:(lockFailedCount++,logForDebugging(`Skipping deletion of ${version3.name} - locked by another process`))}catch(error40){errorCount++,logError2(new Error(`Failed to delete version ${version3.name}: ${error40}`))}})),logEvent("tengu_native_version_cleanup",{total_count:versionFiles.length,deleted_count:deletedCount,protected_count:protectedVersions.size,retained_count:VERSION_RETENTION_COUNT,lock_failed_count:lockFailedCount,error_count:errorCount})}catch(error40){isENOENT(error40)||logError2(new Error(`Version cleanup failed: ${error40}`))}}async function isNpmSymlink(executablePath){let targetPath=executablePath;return(await lstat3(executablePath)).isSymbolicLink()&&(targetPath=await realpath9(executablePath)),targetPath.endsWith(".js")||targetPath.includes("node_modules")}async function removeInstalledSymlink(){let dirs=getBaseDirectories();try{if(await isNpmSymlink(dirs.executable)){logForDebugging(`Skipping removal of ${dirs.executable} - appears to be npm-managed`);return}await unlink11(dirs.executable),logForDebugging(`Removed claude symlink at ${dirs.executable}`)}catch(error40){if(isENOENT(error40))return;logError2(new Error(`Failed to remove claude symlink: ${error40}`))}}async function cleanupShellAliases(){let messages=[],configMap=getShellConfigPaths();for(let[shellType,configFile]of Object.entries(configMap))try{let lines=await readFileLines(configFile);if(!lines)continue;let{filtered,hadAlias}=filterClaudeAliases(lines);hadAlias&&(await writeFileLines(configFile,filtered),messages.push({message:`Removed claude alias from ${configFile}. Run: unalias claude`,userActionRequired:!0,type:"alias"}),logForDebugging(`Cleaned up claude alias from ${shellType} config`))}catch(error40){logError2(error40),messages.push({message:`Failed to clean up ${configFile}: ${error40}`,userActionRequired:!1,type:"error"})}return messages}async function manualRemoveNpmPackage(packageName){try{let prefixResult=await execFileNoThrowWithCwd("npm",["config","get","prefix"]);if(prefixResult.code!==0||!prefixResult.stdout)return{success:!1,error:"Failed to get npm global prefix"};let globalPrefix=prefixResult.stdout.trim(),manuallyRemoved=!1;async function tryRemove(filePath,description){try{return await unlink11(filePath),logForDebugging(`Manually removed ${description}: ${filePath}`),!0}catch{return!1}}if(__name(tryRemove,"tryRemove"),getPlatform2().startsWith("win32")){let binCmd=join91(globalPrefix,"claude.cmd"),binPs1=join91(globalPrefix,"claude.ps1"),binExe=join91(globalPrefix,APP_EXECUTABLE_NAME);await tryRemove(binCmd,"bin script")&&(manuallyRemoved=!0),await tryRemove(binPs1,"PowerShell script")&&(manuallyRemoved=!0),await tryRemove(binExe,"bin executable")&&(manuallyRemoved=!0)}else{let binSymlink=join91(globalPrefix,"bin","claude");await tryRemove(binSymlink,"bin symlink")&&(manuallyRemoved=!0)}if(manuallyRemoved){logForDebugging(`Successfully removed ${packageName} manually`);let nodeModulesPath=getPlatform2().startsWith("win32")?join91(globalPrefix,"node_modules",packageName):join91(globalPrefix,"lib","node_modules",packageName);return{success:!0,warning:`${packageName} executables removed, but node_modules directory was left intact for safety. You may manually delete it later at: ${nodeModulesPath}`}}else return{success:!1}}catch(manualError){return logForDebugging(`Manual removal failed: ${manualError}`,{level:"error"}),{success:!1,error:`Manual removal failed: ${manualError}`}}}async function attemptNpmUninstall(packageName){let{code,stderr}=await execFileNoThrowWithCwd("npm",["uninstall","-g",packageName],{cwd:process.cwd()});if(code===0)return logForDebugging(`Removed global npm installation of ${packageName}`),{success:!0};if(stderr&&!stderr.includes("npm ERR! code E404")){if(stderr.includes("npm error code ENOTEMPTY")){logForDebugging(`Failed to uninstall global npm package ${packageName}: ${stderr}`,{level:"error"}),logForDebugging("Attempting manual removal due to ENOTEMPTY error");let manualResult=await manualRemoveNpmPackage(packageName);if(manualResult.success)return{success:!0,warning:manualResult.warning};if(manualResult.error)return{success:!1,error:`Failed to remove global npm installation of ${packageName}: ${stderr}. Manual removal also failed: ${manualResult.error}`}}return logForDebugging(`Failed to uninstall global npm package ${packageName}: ${stderr}`,{level:"error"}),{success:!1,error:`Failed to remove global npm installation of ${packageName}: ${stderr}`}}return{success:!1}}async function cleanupNpmInstallations(){let errors2=[],warnings=[],removed=0,activePackageResult=await attemptNpmUninstall(APP_NPM_PACKAGE_NAME);activePackageResult.success?(removed++,activePackageResult.warning&&warnings.push(activePackageResult.warning)):activePackageResult.error&&errors2.push(activePackageResult.error);for(let packageName of LEGACY_NPM_PACKAGE_NAMES){let packageResult=await attemptNpmUninstall(packageName);packageResult.success?(removed++,packageResult.warning&&warnings.push(packageResult.warning)):packageResult.error&&errors2.push(packageResult.error)}let localInstallDir=join91(homedir25(),".clavue","local");try{await rm4(localInstallDir,{recursive:!0}),removed++,logForDebugging(`Removed local installation at ${localInstallDir}`)}catch(error40){isENOENT(error40)||(errors2.push(`Failed to remove ${localInstallDir}: ${error40}`),logForDebugging(`Failed to remove local installation: ${error40}`,{level:"error"}))}return{removed,errors:errors2,warnings}}var VERSION_RETENTION_COUNT,LOCK_STALE_MS,inFlightInstall,init_installer=__esm({"src/utils/nativeInstaller/installer.ts"(){init_analytics();init_autoUpdater();init_cleanupRegistry();init_config12();init_debug();init_doctorDiagnostic();init_env2();init_envDynamic();init_envUtils();init_errors2();init_execFileNoThrow();init_localInstaller();init_lockfile();init_log3();init_semver();init_shellConfig();init_update2();init_sleep2();init_xdg();init_download();init_pidLock();VERSION_RETENTION_COUNT=2,LOCK_STALE_MS=10080*60*1e3;__name(getPlatform2,"getPlatform");__name(getBinaryName,"getBinaryName");__name(getBaseDirectories,"getBaseDirectories");__name(isPossibleClaudeBinary,"isPossibleClaudeBinary");__name(getVersionPaths,"getVersionPaths");__name(tryWithVersionLock,"tryWithVersionLock");__name(atomicMoveToInstallPath,"atomicMoveToInstallPath");__name(installVersionFromPackage,"installVersionFromPackage");__name(installVersionFromBinary,"installVersionFromBinary");__name(installVersion,"installVersion");__name(performVersionUpdate,"performVersionUpdate");__name(versionIsAvailable,"versionIsAvailable");__name(updateLatest,"updateLatest");__name(removeDirectoryIfEmpty,"removeDirectoryIfEmpty");__name(updateSymlink,"updateSymlink");__name(checkInstall,"checkInstall");inFlightInstall=null;__name(installLatest,"installLatest");__name(installLatestImpl,"installLatestImpl");__name(getVersionFromSymlink,"getVersionFromSymlink");__name(getLockFilePathFromVersionPath,"getLockFilePathFromVersionPath");__name(lockCurrentVersion,"lockCurrentVersion");__name(logLockAcquisitionError,"logLockAcquisitionError");__name(forceRemoveLock,"forceRemoveLock");__name(cleanupOldVersions,"cleanupOldVersions");__name(isNpmSymlink,"isNpmSymlink");__name(removeInstalledSymlink,"removeInstalledSymlink");__name(cleanupShellAliases,"cleanupShellAliases");__name(manualRemoveNpmPackage,"manualRemoveNpmPackage");__name(attemptNpmUninstall,"attemptNpmUninstall");__name(cleanupNpmInstallations,"cleanupNpmInstallations")}});var init_nativeInstaller=__esm({"src/utils/nativeInstaller/index.ts"(){init_installer()}});function getSettingsWithAllErrors(){let result2=getSettingsWithErrors(),mcpErrors=["user","project","local"].flatMap(scope=>getMcpConfigsByScope(scope).errors);return{settings:result2.settings,errors:[...result2.errors,...mcpErrors]}}var init_allErrors=__esm({"src/utils/settings/allErrors.ts"(){init_config9();init_settings2();__name(getSettingsWithAllErrors,"getSettingsWithAllErrors")}});function buildSandboxProperties(){return[]}function buildIDEProperties(mcpClients,ideInstallationStatus=null,theme2){let ideClient=mcpClients?.find(client2=>client2.name==="ide");if(ideInstallationStatus){let ideName=toIDEDisplayName(ideInstallationStatus.ideType),pluginOrExtension=isJetBrainsIde(ideInstallationStatus.ideType)?"plugin":"extension";if(ideInstallationStatus.error){let isStartupAutoInstall=isStartupAutoIDEInstallError(ideInstallationStatus),icon=isStartupAutoInstall?color("warning",theme2)(figures_default.warning):color("error",theme2)(figures_default.cross),summary=isStartupAutoInstall?`Could not auto-install ${ideName} ${pluginOrExtension}`:`Error installing ${ideName} ${pluginOrExtension}`,followUp=isStartupAutoInstall?"Clavue still works normally. To hide this diagnostic, disable auto-install IDE extension in /config, or run /ide after fixing your IDE CLI.":"Please restart your IDE and try again.";return[{label:"IDE",value:(0,import_jsx_runtime20.jsxs)(ThemedText,{children:[icon," ",summary,": ",ideInstallationStatus.error,`
3001
3001
  `,followUp]})}]}if(ideInstallationStatus.installed)return ideClient&&ideClient.type==="connected"?ideInstallationStatus.installedVersion!==ideClient.serverInfo?.version?[{label:"IDE",value:`Connected to ${ideName} ${pluginOrExtension} version ${ideInstallationStatus.installedVersion} (server version: ${ideClient.serverInfo?.version})`}]:[{label:"IDE",value:`Connected to ${ideName} ${pluginOrExtension} version ${ideInstallationStatus.installedVersion}`}]:[{label:"IDE",value:`Installed ${ideName} ${pluginOrExtension}`}]}else if(ideClient){let ideName=getIdeClientName(ideClient)??"IDE";return ideClient.type==="connected"?[{label:"IDE",value:`Connected to ${ideName} extension`}]:[{label:"IDE",value:`${color("error",theme2)(figures_default.cross)} Not connected to ${ideName}`}]}return[]}function buildMcpProperties(clients=[],theme2){let servers=clients.filter(client2=>client2.name!=="ide");if(!servers.length)return[];let byState={connected:0,pending:0,needsAuth:0,failed:0};for(let s2 of servers)s2.type==="connected"?byState.connected++:s2.type==="pending"?byState.pending++:s2.type==="needs-auth"?byState.needsAuth++:byState.failed++;let parts=[];return byState.connected&&parts.push(color("success",theme2)(`${byState.connected} connected`)),byState.needsAuth&&parts.push(color("warning",theme2)(`${byState.needsAuth} need auth`)),byState.pending&&parts.push(color("inactive",theme2)(`${byState.pending} pending`)),byState.failed&&parts.push(color("error",theme2)(`${byState.failed} failed`)),[{label:"MCP servers",value:`${parts.join(", ")} ${color("inactive",theme2)("\xB7 /mcp")}`}]}async function buildMemoryDiagnostics(){let files3=await getMemoryFiles(),largeFiles=getLargeMemoryFiles(files3),diagnostics=[];return largeFiles.forEach(file2=>{let displayPath=getDisplayPath(file2.path);diagnostics.push(`Large ${displayPath} will impact performance (${formatNumber(file2.content.length)} chars > ${formatNumber(MAX_MEMORY_CHARACTER_COUNT)})`)}),diagnostics}function buildSettingSourcesProperties(){return[{label:"Setting sources",value:getEnabledSettingSources().filter(source=>{let settings=getSettingsForSource(source);return settings!==null&&Object.keys(settings).length>0}).map(source=>{if(source==="policySettings"){let origin2=getPolicySettingsOrigin();if(origin2===null)return null;switch(origin2){case"remote":return"Enterprise managed settings (remote)";case"plist":return"Enterprise managed settings (plist)";case"hklm":return"Enterprise managed settings (HKLM)";case"file":{let{hasBase,hasDropIns}=getManagedFileSettingsPresence();return hasBase&&hasDropIns?"Enterprise managed settings (file + drop-ins)":hasDropIns?"Enterprise managed settings (drop-ins)":"Enterprise managed settings (file)"}case"hkcu":return"Enterprise managed settings (HKCU)"}}return getSettingSourceDisplayNameCapitalized(source)}).filter(name=>name!==null)}]}async function buildInstallationDiagnostics(){return(await checkInstall()).map(warning=>warning.message)}async function buildInstallationHealthDiagnostics(){let diagnostic=await getDoctorDiagnostic(),items=[],{errors:validationErrors}=getSettingsWithAllErrors();if(validationErrors.length>0){let fileList=Array.from(new Set(validationErrors.map(error40=>error40.file))).join(", ");items.push(`Found invalid settings files: ${fileList}. They will be ignored.`)}return diagnostic.warnings.forEach(warning=>{items.push(warning.issue)}),diagnostic.hasUpdatePermissions===!1&&items.push("No write permissions for auto-updates (requires sudo)"),items}function buildAccountProperties(){let accountInfo=getAccountInformation();if(!accountInfo)return[];let properties=[];return accountInfo.subscription&&properties.push({label:"Login method",value:`${accountInfo.subscription} Account`}),accountInfo.tokenSource&&properties.push({label:"Auth token",value:accountInfo.tokenSource}),accountInfo.apiKeySource&&properties.push({label:"API key",value:accountInfo.apiKeySource}),accountInfo.organization&&!process.env.IS_DEMO&&properties.push({label:"Organization",value:accountInfo.organization}),accountInfo.email&&!process.env.IS_DEMO&&properties.push({label:"Email",value:accountInfo.email}),properties}function buildAPIProviderProperties(){let apiProvider=getAPIProvider(),properties=[];if(apiProvider!=="firstParty"){let providerLabel={bedrock:"AWS Bedrock",vertex:"Google Vertex AI",foundry:"Microsoft Foundry"}[apiProvider];properties.push({label:"API provider",value:providerLabel})}if(apiProvider==="firstParty"){let anthropicBaseUrl=process.env.ANTHROPIC_BASE_URL;anthropicBaseUrl&&properties.push({label:"Anthropic base URL",value:anthropicBaseUrl})}else if(apiProvider==="bedrock"){let bedrockBaseUrl=process.env.BEDROCK_BASE_URL;bedrockBaseUrl&&properties.push({label:"Bedrock base URL",value:bedrockBaseUrl}),properties.push({label:"AWS region",value:getAWSRegion()}),isEnvTruthy2(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH)&&properties.push({value:"AWS auth skipped"})}else if(apiProvider==="vertex"){let vertexBaseUrl=process.env.VERTEX_BASE_URL;vertexBaseUrl&&properties.push({label:"Vertex base URL",value:vertexBaseUrl});let gcpProject=process.env.ANTHROPIC_VERTEX_PROJECT_ID;gcpProject&&properties.push({label:"GCP project",value:gcpProject}),properties.push({label:"Default region",value:getDefaultVertexRegion()}),isEnvTruthy2(process.env.CLAUDE_CODE_SKIP_VERTEX_AUTH)&&properties.push({value:"GCP auth skipped"})}else if(apiProvider==="foundry"){let foundryBaseUrl=process.env.ANTHROPIC_FOUNDRY_BASE_URL;foundryBaseUrl&&properties.push({label:"Microsoft Foundry base URL",value:foundryBaseUrl});let foundryResource=process.env.ANTHROPIC_FOUNDRY_RESOURCE;foundryResource&&properties.push({label:"Microsoft Foundry resource",value:foundryResource}),isEnvTruthy2(process.env.CLAUDE_CODE_SKIP_FOUNDRY_AUTH)&&properties.push({value:"Microsoft Foundry auth skipped"})}let proxyUrl=getProxyUrl();proxyUrl&&properties.push({label:"Proxy",value:proxyUrl});let mtlsConfig=getMTLSConfig();return process.env.NODE_EXTRA_CA_CERTS&&properties.push({label:"Additional CA cert(s)",value:process.env.NODE_EXTRA_CA_CERTS}),mtlsConfig&&(mtlsConfig.cert&&process.env.CLAUDE_CODE_CLIENT_CERT&&properties.push({label:"mTLS client cert",value:process.env.CLAUDE_CODE_CLIENT_CERT}),mtlsConfig.key&&process.env.CLAUDE_CODE_CLIENT_KEY&&properties.push({label:"mTLS client key",value:process.env.CLAUDE_CODE_CLIENT_KEY})),properties}function getModelDisplayLabel(mainLoopModel){let modelLabel=modelDisplayString(mainLoopModel);if(mainLoopModel===null&&isClaudeAISubscriber()){let description=getClaudeAiUserDefaultModelDescription();modelLabel=`${source_default.bold("Default")} ${description}`}return modelLabel}var import_jsx_runtime20,init_status=__esm({"src/utils/status.tsx"(){init_source();init_figures();init_ink();init_auth();init_claudemd();init_doctorDiagnostic();init_envUtils();init_file();init_format2();init_ide();init_ideInstallationStatus();init_model();init_providers();init_mtls();init_nativeInstaller();init_proxy();init_sandbox_adapter();init_allErrors();init_constants2();init_settings2();import_jsx_runtime20=__toESM(require_jsx_runtime());__name(buildSandboxProperties,"buildSandboxProperties");__name(buildIDEProperties,"buildIDEProperties");__name(buildMcpProperties,"buildMcpProperties");__name(buildMemoryDiagnostics,"buildMemoryDiagnostics");__name(buildSettingSourcesProperties,"buildSettingSourcesProperties");__name(buildInstallationDiagnostics,"buildInstallationDiagnostics");__name(buildInstallationHealthDiagnostics,"buildInstallationHealthDiagnostics");__name(buildAccountProperties,"buildAccountProperties");__name(buildAPIProviderProperties,"buildAPIProviderProperties");__name(getModelDisplayLabel,"getModelDisplayLabel")}});var auth_exports2={};__export(auth_exports2,{authLogin:()=>authLogin,authLogout:()=>authLogout,authStatus:()=>authStatus,installOAuthTokens:()=>installOAuthTokens});async function installOAuthTokens(tokens){await performLogout({clearOnboarding:!1});let profile=tokens.profile??await getOauthProfileFromOauthToken(tokens.accessToken);profile?storeOAuthAccountInfo({accountUuid:profile.account.uuid,emailAddress:profile.account.email,organizationUuid:profile.organization.uuid,displayName:profile.account.display_name||void 0,hasExtraUsageEnabled:profile.organization.has_extra_usage_enabled??void 0,billingType:profile.organization.billing_type??void 0,subscriptionCreatedAt:profile.organization.subscription_created_at??void 0,accountCreatedAt:profile.account.created_at}):tokens.tokenAccount&&storeOAuthAccountInfo({accountUuid:tokens.tokenAccount.uuid,emailAddress:tokens.tokenAccount.emailAddress,organizationUuid:tokens.tokenAccount.organizationUuid});let storageResult=saveOAuthTokensIfNeeded(tokens);if(clearOAuthTokenCache(),storageResult.warning&&logEvent("tengu_oauth_storage_warning",{warning:storageResult.warning}),await fetchAndStoreUserRoles(tokens.accessToken).catch(err2=>logForDebugging(String(err2),{level:"error"})),shouldUseClaudeAIAuth(tokens.scopes))await fetchAndStoreClaudeCodeFirstTokenDate().catch(err2=>logForDebugging(String(err2),{level:"error"}));else if(!await createAndStoreApiKey(tokens.accessToken))throw new Error("Unable to create API key. The server accepted the request but did not return a key.");await clearAuthRelatedCaches()}async function authLogin({email:email3,sso,console:useConsole,claudeai}){useConsole&&claudeai&&(process.stderr.write(`Error: --console and --claudeai cannot be used together.
@@ -5943,10 +5943,10 @@ Once they complete the flow, the server's tools will become available automatica
5943
5943
  [OUTPUT TRUNCATED - exceeded ${getMaxMcpOutputTokens()} token limit]
5944
5944
 
5945
5945
  The tool output was truncated. If this MCP server provides pagination or filtering tools, use them to retrieve specific portions of the data. If pagination is not available, inform the user that you are working with truncated output and results may be incomplete.`}function truncateString(content,maxChars){return content.length<=maxChars?content:content.slice(0,maxChars)}async function truncateContentBlocks(blocks,maxChars){let result2=[],currentChars=0;for(let block2 of blocks)if(isTextBlock(block2)){let remainingChars=maxChars-currentChars;if(remainingChars<=0)break;if(block2.text.length<=remainingChars)result2.push(block2),currentChars+=block2.text.length;else{result2.push({type:"text",text:block2.text.slice(0,remainingChars)});break}}else if(isImageBlock(block2)){let imageChars=IMAGE_TOKEN_ESTIMATE*4;if(currentChars+imageChars<=maxChars)result2.push(block2),currentChars+=imageChars;else{let remainingChars=maxChars-currentChars;if(remainingChars>0){let remainingBytes=Math.floor(remainingChars*.75);try{let compressedBlock=await compressImageBlock(block2,remainingBytes);result2.push(compressedBlock),compressedBlock.source.type==="base64"?currentChars+=compressedBlock.source.data.length:currentChars+=imageChars}catch{}}}}else result2.push(block2);return result2}async function mcpContentNeedsTruncation(content){if(!content||getContentSizeEstimate(content)<=getMaxMcpOutputTokens()*MCP_TOKEN_COUNT_THRESHOLD_FACTOR)return!1;try{let tokenCount=await countMessagesTokensWithAPI(typeof content=="string"?[{role:"user",content}]:[{role:"user",content}],[]);return!!(tokenCount&&tokenCount>getMaxMcpOutputTokens())}catch(error40){return logError2(error40),!1}}async function truncateMcpContent(content){if(!content)return content;let maxChars=getMaxMcpOutputChars(),truncationMsg=getTruncationMessage();if(typeof content=="string")return truncateString(content,maxChars)+truncationMsg;{let truncatedBlocks=await truncateContentBlocks(content,maxChars);return truncatedBlocks.push({type:"text",text:truncationMsg}),truncatedBlocks}}async function truncateMcpContentIfNeeded(content){return await mcpContentNeedsTruncation(content)?await truncateMcpContent(content):content}var MCP_TOKEN_COUNT_THRESHOLD_FACTOR,IMAGE_TOKEN_ESTIMATE,DEFAULT_MAX_MCP_OUTPUT_TOKENS,init_mcpValidation=__esm({"src/utils/mcpValidation.ts"(){init_growthbook();init_tokenEstimation();init_imageResizer();init_log3();MCP_TOKEN_COUNT_THRESHOLD_FACTOR=.5,IMAGE_TOKEN_ESTIMATE=1600,DEFAULT_MAX_MCP_OUTPUT_TOKENS=25e3;__name(getMaxMcpOutputTokens,"getMaxMcpOutputTokens");__name(isTextBlock,"isTextBlock");__name(isImageBlock,"isImageBlock");__name(getContentSizeEstimate,"getContentSizeEstimate");__name(getMaxMcpOutputChars,"getMaxMcpOutputChars");__name(getTruncationMessage,"getTruncationMessage");__name(truncateString,"truncateString");__name(truncateContentBlocks,"truncateContentBlocks");__name(mcpContentNeedsTruncation,"mcpContentNeedsTruncation");__name(truncateMcpContent,"truncateMcpContent");__name(truncateMcpContentIfNeeded,"truncateMcpContentIfNeeded")}});async function transformResultContent(resultContent,serverName){switch(resultContent.type){case"text":return[{type:"text",text:resultContent.text}];case"audio":{let audioData=resultContent;return await persistBlobToTextBlock(Buffer.from(audioData.data,"base64"),audioData.mimeType,serverName,`[Audio from ${serverName}] `)}case"image":return await transformImageContent(String(resultContent.data??""),resultContent.mimeType,serverName);case"resource":{let resource=resultContent.resource,prefix=`[Resource from ${serverName} at ${resource.uri}] `;if("text"in resource)return[{type:"text",text:`${prefix}${resource.text}`}];if("blob"in resource)if(IMAGE_MIME_TYPES.has(resource.mimeType??"")){let imageBlocks=await transformImageContent(String(resource.blob??""),resource.mimeType,serverName);return prefix?[{type:"text",text:prefix},...imageBlocks]:imageBlocks}else return await persistBlobToTextBlock(Buffer.from(resource.blob,"base64"),resource.mimeType,serverName,prefix);return[]}case"resource_link":{let resourceLink=resultContent,text3=`[Resource link: ${resourceLink.name}] ${resourceLink.uri}`;return resourceLink.description&&(text3+=` (${resourceLink.description})`),[{type:"text",text:text3}]}default:return[]}}function normalizeBase64ImagePayload(raw){let s2=String(raw||"").trim();if(!s2)return"";let dataUrl=/^data:image\/[a-z0-9.+-]+;base64,(.+)$/i.exec(s2);dataUrl?.[1]&&(s2=dataUrl[1]),s2=s2.replace(/\s+/g,""),/[-_]/.test(s2)&&!/[+/]/.test(s2.slice(0,80))?s2=s2.replace(/-/g,"+").replace(/_/g,"/"):/[-_]/.test(s2)&&(s2=s2.replace(/-/g,"+").replace(/_/g,"/"));let pad8=s2.length%4;return pad8===2?s2+="==":pad8===3?s2+="=":pad8===1&&(s2+="==="),s2}function looksLikeImageBuffer(buf){return buf.length<8?!1:buf[0]===137&&buf[1]===80&&buf[2]===78&&buf[3]===71||buf[0]===255&&buf[1]===216&&buf[2]===255||buf[0]===71&&buf[1]===73&&buf[2]===70||buf[0]===82&&buf[1]===73&&buf[2]===70&&buf[3]===70&&buf.length>=12&&buf[8]===87&&buf[9]===69&&buf[10]===66&&buf[11]===80}async function transformImageContent(rawData,mimeType,serverName){try{let b64=normalizeBase64ImagePayload(rawData);if(!b64)return[{type:"text",text:`[Image from ${serverName}] empty image payload \u2014 tool returned no data.`}];!/^[A-Za-z0-9+/]+=*$/.test(b64.slice(0,64))&&b64.length>64;let imageBuffer;try{imageBuffer=Buffer.from(b64,"base64")}catch(err2){return[{type:"text",text:`[Image from ${serverName}] invalid base64 (${errorMessage4(err2)}).`}]}if(imageBuffer.length<32)return[{type:"text",text:`[Image from ${serverName}] payload too small (${imageBuffer.length} bytes) \u2014 likely truncated.`}];looksLikeImageBuffer(imageBuffer)||logMCPError(serverName,`image magic bytes unrecognized (len=${imageBuffer.length}); attempting decode anyway`);let ext=mimeType?.split("/")[1]?.split("+")[0]||"png",outBuffer,outMediaType;try{let resized=await maybeResizeAndDownsampleImageBuffer(imageBuffer,imageBuffer.length,ext);outBuffer=resized.buffer,outMediaType=`image/${resized.mediaType}`;let trimmed=await applyTokenBudgetToImage(outBuffer,outMediaType);trimmed&&(outBuffer=trimmed.buffer,outMediaType=trimmed.mediaType)}catch(err2){return logMCPError(serverName,`image resize failed (${errorMessage4(err2)}); persisting blob`),await persistBlobToTextBlock(imageBuffer,mimeType||"image/png",serverName,`[Image from ${serverName}] `)}return!outBuffer||outBuffer.length<32?[{type:"text",text:`[Image from ${serverName}] resize produced empty buffer \u2014 original ${imageBuffer.length} bytes.`}]:[{type:"image",source:{data:outBuffer.toString("base64"),media_type:outMediaType,type:"base64"}}]}catch(err2){return logMCPError(serverName,`transformImageContent fatal: ${errorMessage4(err2)}`),[{type:"text",text:`[Image from ${serverName}] failed to process screenshot: ${errorMessage4(err2)}`}]}}function errorMessage4(err2){return err2 instanceof Error?err2.message:String(err2)}async function persistBlobToTextBlock(bytes,mimeType,serverName,sourceDescription){let persistId=`mcp-${normalizeNameForMCP(serverName)}-blob-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,result2=await persistBinaryContent(bytes,mimeType,persistId);return"error"in result2?[{type:"text",text:`${sourceDescription}Binary content (${mimeType||"unknown type"}, ${bytes.length} bytes) could not be saved to disk: ${result2.error}`}]:[{type:"text",text:getBinaryBlobSavedMessage(result2.filepath,mimeType,result2.size,sourceDescription)}]}function inferCompactSchema(value,depth=2){if(value===null)return"null";if(Array.isArray(value))return value.length===0?"[]":`[${inferCompactSchema(value[0],depth-1)}]`;if(typeof value=="object"){if(depth<=0)return"{...}";let props=Object.entries(value).slice(0,10).map(([k2,v2])=>`${k2}: ${inferCompactSchema(v2,depth-1)}`),suffix=Object.keys(value).length>10?", ...":"";return`{${props.join(", ")}${suffix}}`}return typeof value}async function transformMCPResult(result2,tool,name){if(result2&&typeof result2=="object"){if("toolResult"in result2)return{content:String(result2.toolResult),type:"toolResult"};if("structuredContent"in result2&&result2.structuredContent!==void 0)return{content:jsonStringify(result2.structuredContent),type:"structuredContent",schema:inferCompactSchema(result2.structuredContent)};if("content"in result2&&Array.isArray(result2.content)){let transformedContent=(await Promise.all(result2.content.map(item=>transformResultContent(item,name)))).flat();return{content:transformedContent,type:"contentArray",schema:inferCompactSchema(transformedContent)}}}let errorMessage5=`MCP server "${name}" tool "${tool}": unexpected response format`;throw logMCPError(name,errorMessage5),new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(errorMessage5,"MCP tool unexpected response format")}function contentContainsImages(content){return!content||typeof content=="string"?!1:content.some(block2=>block2.type==="image")}async function processMCPResult(result2,tool,name){let{content,type,schema}=await transformMCPResult(result2,tool,name);if(name==="ide"||!await mcpContentNeedsTruncation(content))return content;let sizeEstimateTokens=getContentSizeEstimate(content);if(isEnvDefinedFalsy(process.env.ENABLE_MCP_LARGE_OUTPUT_FILES))return logEvent("tengu_mcp_large_result_handled",{outcome:"truncated",reason:"env_disabled",sizeEstimateTokens}),await truncateMcpContentIfNeeded(content);if(!content)return content;if(contentContainsImages(content))return logEvent("tengu_mcp_large_result_handled",{outcome:"truncated",reason:"contains_images",sizeEstimateTokens}),await truncateMcpContentIfNeeded(content);let timestamp=Date.now(),persistId=`mcp-${normalizeNameForMCP(name)}-${normalizeNameForMCP(tool)}-${timestamp}`,contentStr=typeof content=="string"?content:jsonStringify(content,null,2),persistResult=await persistToolResult(contentStr,persistId);if(isPersistError(persistResult)){let contentLength=contentStr.length;return logEvent("tengu_mcp_large_result_handled",{outcome:"truncated",reason:"persist_failed",sizeEstimateTokens}),`Error: result (${contentLength.toLocaleString()} characters) exceeds maximum allowed tokens. Failed to save output to file: ${persistResult.error}. If this MCP server provides pagination or filtering tools, use them to retrieve specific portions of the data.`}logEvent("tengu_mcp_large_result_handled",{outcome:"persisted",reason:"file_saved",sizeEstimateTokens,persistedSizeChars:persistResult.originalSize});let formatDescription=getFormatDescription(type,schema);return getLargeOutputInstructions(persistResult.filepath,persistResult.originalSize,formatDescription)}var IMAGE_MIME_TYPES,init_resultTransform=__esm({"src/services/mcp/resultTransform.ts"(){init_envUtils();init_errors2();init_imageResizer();init_log3();init_mcpOutputStorage();init_mcpValidation();init_normalization();init_slowOperations();init_toolResultStorage();init_analytics();IMAGE_MIME_TYPES=new Set(["image/jpeg","image/png","image/gif","image/webp"]);__name(transformResultContent,"transformResultContent");__name(normalizeBase64ImagePayload,"normalizeBase64ImagePayload");__name(looksLikeImageBuffer,"looksLikeImageBuffer");__name(transformImageContent,"transformImageContent");__name(errorMessage4,"errorMessage");__name(persistBlobToTextBlock,"persistBlobToTextBlock");__name(inferCompactSchema,"inferCompactSchema");__name(transformMCPResult,"transformMCPResult");__name(contentContainsImages,"contentContainsImages");__name(processMCPResult,"processMCPResult")}});function isMcpTransientToolCallError(error40){if(!(error40 instanceof Error)||error40.name==="AbortError"||error40 instanceof McpAuthError||error40 instanceof McpSessionExpiredError||error40 instanceof McpToolCallError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS)return!1;let code="code"in error40?error40.code:void 0;return typeof code=="number"&&(code===-32e3||code===-32001)||typeof code=="string"&&TRANSIENT_TOOL_CALL_ERROR_SUBSTRINGS.includes(code)?!0:TRANSIENT_TOOL_CALL_ERROR_SUBSTRINGS.some(fragment=>error40.message.includes(fragment))}async function callMCPTool({client:{client:client2,name,config:config3},tool,args,meta,signal,onProgress},{clearServerCache:clearServerCache2}){let toolStartTime=Date.now(),progressInterval;try{logMCPDebug(name,`Calling MCP tool: ${tool}`),progressInterval=setInterval((startTime,name2,tool2)=>{let elapsed2=Date.now()-startTime,duration4=`${Math.floor(elapsed2/1e3)}s`;logMCPDebug(name2,`Tool '${tool2}' still running (${duration4} elapsed)`)},3e4,toolStartTime,name,tool);let timeoutMs=getMcpToolTimeoutMs(),timeoutId,timeoutPromise=new Promise((_2,reject2)=>{timeoutId=setTimeout((reject3,name2,tool2,timeoutMs2)=>{reject3(new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(`MCP server "${name2}" tool "${tool2}" timed out after ${Math.floor(timeoutMs2/1e3)}s`,"MCP tool timeout"))},timeoutMs,reject2,name,tool,timeoutMs)}),result2=await Promise.race([client2.callTool({name:tool,arguments:args,_meta:meta},CallToolResultSchema,{signal,timeout:timeoutMs,onprogress:onProgress?sdkProgress=>{onProgress({type:"mcp_progress",status:"progress",serverName:name,toolName:tool,progress:sdkProgress.progress,total:sdkProgress.total,progressMessage:sdkProgress.message})}:void 0}),timeoutPromise]).finally(()=>{timeoutId&&clearTimeout(timeoutId)});if("isError"in result2&&result2.isError){let errorDetails="Unknown error";if("content"in result2&&Array.isArray(result2.content)&&result2.content.length>0){let firstContent=result2.content[0];firstContent&&typeof firstContent=="object"&&"text"in firstContent&&(errorDetails=firstContent.text)}else"error"in result2&&(errorDetails=String(result2.error));throw errorDetails=redactMcpErrorText(errorDetails),logMCPError(name,errorDetails),new McpToolCallError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(errorDetails,"MCP tool returned error","_meta"in result2&&result2._meta?{_meta:result2._meta}:void 0)}let elapsed=Date.now()-toolStartTime,duration3=elapsed<1e3?`${elapsed}ms`:elapsed<6e4?`${Math.floor(elapsed/1e3)}s`:`${Math.floor(elapsed/6e4)}m ${Math.floor(elapsed%6e4/1e3)}s`;logMCPDebug(name,`Tool '${tool}' completed successfully in ${duration3}`);let codeIndexingTool=detectCodeIndexingFromMcpServerName(name);return codeIndexingTool&&logEvent("tengu_code_indexing_tool_used",{tool:codeIndexingTool,source:"mcp",success:!0}),{content:await processMCPResult(result2,tool,name),_meta:result2._meta,structuredContent:result2.structuredContent}}catch(e2){progressInterval!==void 0&&clearInterval(progressInterval);let elapsed=Date.now()-toolStartTime;if(e2 instanceof Error&&e2.name!=="AbortError"&&logMCPDebug(name,`Tool '${tool}' failed after ${Math.floor(elapsed/1e3)}s: ${e2.message}`),e2 instanceof Error){if(("code"in e2?e2.code:void 0)===401||e2 instanceof UnauthorizedError)throw logMCPDebug(name,"Tool call returned 401 Unauthorized - token may have expired"),logEvent("tengu_mcp_tool_call_auth_error",{}),new McpAuthError(name,`MCP server "${name}" requires re-authorization (token expired)`);let isSessionExpired=isMcpSessionExpiredError(e2),isConnectionClosedOnHttp="code"in e2&&e2.code===-32e3&&e2.message.includes("Connection closed")&&(config3.type==="http"||config3.type==="claudeai-proxy");if(isSessionExpired||isConnectionClosedOnHttp)throw logMCPDebug(name,`MCP session expired during tool call (${isSessionExpired?"404/-32001":"connection closed"}), clearing connection cache for re-initialization`),logEvent("tengu_mcp_session_expired",{}),await clearServerCache2(name,config3),new McpSessionExpiredError(name)}if(!(e2 instanceof Error)||e2.name!=="AbortError")throw e2;return{content:void 0}}finally{progressInterval!==void 0&&clearInterval(progressInterval)}}var TRANSIENT_TOOL_CALL_ERROR_SUBSTRINGS,init_toolCaller=__esm({"src/services/mcp/toolCaller.ts"(){init_types4();init_auth4();init_analytics();init_codeIndexing();init_errors2();init_log3();init_secretRedact();init_resultTransform();init_utils10();TRANSIENT_TOOL_CALL_ERROR_SUBSTRINGS=["Connection closed","ECONNRESET","ETIMEDOUT","EPIPE","EHOSTUNREACH","ECONNREFUSED","Body Timeout Error","SSE stream disconnected","Failed to reconnect SSE stream","Maximum reconnection attempts"];__name(isMcpTransientToolCallError,"isMcpTransientToolCallError");__name(callMCPTool,"callMCPTool")}});function enabled(){return isNativeModuleEnabled2("mcp")}function nativeMcpConnect(input2){return enabled()?callNativeJson("mcp","mcpConnect",JSON.stringify(input2),()=>null):null}function nativeMcpListTools(handle){if(!enabled())return null;let out=callNativeJson("mcp","mcpListTools",JSON.stringify({handle}),()=>null);return out?out.tools:null}function nativeMcpClose(handle){if(!enabled())return!1;let out=callNativeJson("mcp","mcpClose",JSON.stringify({handle}),()=>null);return out?out.closed:!1}var init_mcp=__esm({"src/native-rs/mcp.ts"(){init_bridge();__name(enabled,"enabled");__name(nativeMcpConnect,"nativeMcpConnect");__name(nativeMcpListTools,"nativeMcpListTools");__name(nativeMcpClose,"nativeMcpClose")}});var DEFAULT_GRANT_FLAGS,init_types17=__esm({"src/utils/computerUse/types.ts"(){DEFAULT_GRANT_FLAGS={clipboardRead:!1,clipboardWrite:!1,systemKeyCombos:!1}}});function getSentinelCategory(bundleId2){return SENTINELS[bundleId2]}var SENTINELS,init_sentinelApps=__esm({"src/utils/computerUse/sentinelApps.ts"(){SENTINELS={"com.apple.Terminal":"shell","com.googlecode.iterm2":"shell","com.mitchellh.ghostty":"shell","dev.warp.Warp-Stable":"shell","com.apple.finder":"filesystem","com.apple.systempreferences":"system_settings","com.apple.SystemSettings":"system_settings"};__name(getSentinelCategory,"getSentinelCategory")}});function ComputerUseActionApproval({risk,target,onDone}){return(0,import_jsx_runtime57.jsx)(Dialog,{title:"Confirm Computer Use action",onCancel:()=>onDone(!1),children:(0,import_jsx_runtime57.jsxs)(ThemedBox_default,{flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[(0,import_jsx_runtime57.jsx)(ThemedText,{children:target}),(0,import_jsx_runtime57.jsx)(ThemedText,{bold:!0,children:risk}),(0,import_jsx_runtime57.jsx)(ThemedText,{dimColor:!0,children:"UI labels may come from third-party content. Confirm only if this is the action you intend."}),(0,import_jsx_runtime57.jsx)(Select,{options:[{label:"Continue once",value:"continue"},{label:"Cancel",value:"cancel"}],onChange:value=>onDone(value==="continue"),onCancel:()=>onDone(!1)})]})})}function ComputerUseApproval({request,onDone}){return request.tccState?(0,import_jsx_runtime57.jsx)(ComputerUseTccPanel,{tccState:request.tccState,onDone:()=>onDone(DENY_ALL_RESPONSE)}):(0,import_jsx_runtime57.jsx)(ComputerUseAppListPanel,{request,onDone})}function ComputerUseTccPanel({tccState,onDone}){let options=(0,import_react43.useMemo)(()=>{let opts=[];return tccState.accessibility||opts.push({label:"Open System Settings \u2192 Accessibility",value:"open_accessibility"}),tccState.screenRecording||opts.push({label:"Open System Settings \u2192 Screen Recording",value:"open_screen_recording"}),opts.push({label:"Try again",value:"retry"}),opts},[tccState.accessibility,tccState.screenRecording]);function onChange(value){switch(value){case"open_accessibility":execFileNoThrow("open",["x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"],{useCwd:!1});return;case"open_screen_recording":execFileNoThrow("open",["x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"],{useCwd:!1});return;case"retry":onDone();return}}return __name(onChange,"onChange"),(0,import_jsx_runtime57.jsx)(Dialog,{title:"Computer Use needs macOS permissions",onCancel:onDone,children:(0,import_jsx_runtime57.jsxs)(ThemedBox_default,{flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[(0,import_jsx_runtime57.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime57.jsxs)(ThemedText,{children:["Accessibility:"," ",tccState.accessibility?`${figures_default.tick} granted`:`${figures_default.cross} not granted`]}),(0,import_jsx_runtime57.jsxs)(ThemedText,{children:["Screen Recording:"," ",tccState.screenRecording?`${figures_default.tick} granted`:`${figures_default.cross} not granted`]})]}),(0,import_jsx_runtime57.jsx)(ThemedText,{dimColor:!0,children:'Grant the missing permissions in System Settings, then select "Try again". macOS may require you to restart Clavue after granting Screen Recording.'}),(0,import_jsx_runtime57.jsx)(Select,{options,onChange,onCancel:onDone})]})})}function ComputerUseAppListPanel({request,onDone}){let[checked]=(0,import_react43.useState)(()=>new Set(request.apps.flatMap(a2=>a2.resolved&&!a2.alreadyGranted?[a2.resolved.bundleId]:[]))),ALL_FLAG_KEYS=["clipboardRead","clipboardWrite","systemKeyCombos"],requestedFlagKeys=(0,import_react43.useMemo)(()=>ALL_FLAG_KEYS.filter(k2=>request.requestedFlags[k2]),[request.requestedFlags]),options=(0,import_react43.useMemo)(()=>[{label:`Allow for this session (${checked.size} ${plural(checked.size,"app")})`,value:"allow_all"},{label:(0,import_jsx_runtime57.jsxs)(ThemedText,{children:["Deny, and tell Clavue what to do differently ",(0,import_jsx_runtime57.jsx)(ThemedText,{bold:!0,children:"(esc)"})]}),value:"deny"}],[checked.size]);function respond(allow){if(!allow){onDone(DENY_ALL_RESPONSE);return}let now3=Date.now(),granted=request.apps.flatMap(a2=>a2.resolved&&checked.has(a2.resolved.bundleId)?[{bundleId:a2.resolved.bundleId,displayName:a2.resolved.displayName,grantedAt:now3}]:[]),denied=request.apps.filter(a2=>!a2.resolved||!checked.has(a2.resolved.bundleId)).map(a2=>({bundleId:a2.resolved?.bundleId??a2.requestedName,reason:a2.resolved?"user_denied":"not_installed"})),flags={...DEFAULT_GRANT_FLAGS,...Object.fromEntries(requestedFlagKeys.map(k2=>[k2,!0]))};onDone({granted,denied,flags})}return __name(respond,"respond"),(0,import_jsx_runtime57.jsx)(Dialog,{title:"Computer Use wants to control these apps",onCancel:()=>respond(!1),children:(0,import_jsx_runtime57.jsxs)(ThemedBox_default,{flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[request.reason?(0,import_jsx_runtime57.jsx)(ThemedText,{dimColor:!0,children:request.reason}):null,(0,import_jsx_runtime57.jsx)(ThemedText,{bold:!0,children:"Screen images and accessibility content from granted apps may be sent to your configured AI model provider for analysis."}),(0,import_jsx_runtime57.jsx)(ThemedBox_default,{flexDirection:"column",children:request.apps.map(a2=>{let resolved=a2.resolved;if(!resolved)return(0,import_jsx_runtime57.jsxs)(ThemedText,{dimColor:!0,children:[" ",figures_default.circle," ",a2.requestedName," ",(0,import_jsx_runtime57.jsx)(ThemedText,{dimColor:!0,children:"(not installed)"})]},a2.requestedName);if(a2.alreadyGranted)return(0,import_jsx_runtime57.jsxs)(ThemedText,{dimColor:!0,children:[" ",figures_default.tick," ",resolved.displayName," ",(0,import_jsx_runtime57.jsx)(ThemedText,{dimColor:!0,children:"(already granted)"})]},resolved.bundleId);let sentinel=getSentinelCategory(resolved.bundleId),isChecked=checked.has(resolved.bundleId);return(0,import_jsx_runtime57.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime57.jsxs)(ThemedText,{children:[" ",isChecked?figures_default.circleFilled:figures_default.circle," ",resolved.displayName]}),sentinel?(0,import_jsx_runtime57.jsxs)(ThemedText,{bold:!0,children:[" ",figures_default.warning," ",SENTINEL_WARNING[sentinel]]}):null]},resolved.bundleId)})}),requestedFlagKeys.length>0?(0,import_jsx_runtime57.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime57.jsx)(ThemedText,{dimColor:!0,children:"Also requested:"}),requestedFlagKeys.map(flag3=>{let flagName2=String(flag3);return(0,import_jsx_runtime57.jsxs)(ThemedText,{dimColor:!0,children:[" ","\xB7 ",flagName2]},flagName2)})]}):null,request.willHide&&request.willHide.length>0?(0,import_jsx_runtime57.jsxs)(ThemedText,{dimColor:!0,children:[request.willHide.length," other"," ",plural(request.willHide.length,"app")," will be hidden while Clavue works."]}):null,(0,import_jsx_runtime57.jsx)(Select,{options,onChange:v2=>respond(v2==="allow_all"),onCancel:()=>respond(!1)})]})})}var import_react43,import_jsx_runtime57,DENY_ALL_RESPONSE,SENTINEL_WARNING,init_ComputerUseApproval=__esm({"src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx"(){init_types17();init_sentinelApps();init_figures();import_react43=__toESM(require_react());init_ink();init_execFileNoThrow();init_stringUtils();init_select();init_Dialog();import_jsx_runtime57=__toESM(require_jsx_runtime());__name(ComputerUseActionApproval,"ComputerUseActionApproval");DENY_ALL_RESPONSE={granted:[],denied:[],flags:DEFAULT_GRANT_FLAGS};__name(ComputerUseApproval,"ComputerUseApproval");__name(ComputerUseTccPanel,"ComputerUseTccPanel");SENTINEL_WARNING={shell:"equivalent to shell access",filesystem:"can read/write any file",system_settings:"can change system settings"};__name(ComputerUseAppListPanel,"ComputerUseAppListPanel")}});import{appendFile as appendFile7,mkdir as mkdir48}from"fs/promises";import{join as join146}from"path";function auditPath(){return join146(getClaudeConfigHomeDir(),"cache","computer-use","audit.jsonl")}async function appendComputerUseAudit(event){try{let dir=join146(getClaudeConfigHomeDir(),"cache","computer-use");await mkdir48(dir,{recursive:!0});let line=jsonStringify({...event,ts:event.ts||new Date().toISOString()})+`
5946
- `;await appendFile7(auditPath(),line,{encoding:"utf-8",mode:384})}catch(error40){logForDebugging(`[computer-use] audit write failed: ${errorMessage2(error40)}`)}}var init_audit=__esm({"src/utils/computerUse/audit.ts"(){init_envUtils();init_debug();init_errors2();init_slowOperations();__name(auditPath,"auditPath");__name(appendComputerUseAudit,"appendComputerUseAudit")}});function fmtCoord(c4){return c4?`(${c4[0]}, ${c4[1]})`:""}function getComputerUseMCPRenderingOverrides(toolName4){return{userFacingName(){return`Computer Use[${toolName4}]`},renderToolUseMessage(input2){switch(toolName4){case"screenshot":case"cursor_position":case"list_granted_applications":case"read_clipboard":case"computer_status":return"";case"left_click":case"right_click":case"double_click":case"triple_click":case"mouse_move":return fmtCoord(input2.coordinate);case"left_click_drag":return input2.start_coordinate?`${fmtCoord(input2.start_coordinate)} \u2192 ${fmtCoord(input2.coordinate)}`:`to ${fmtCoord(input2.coordinate)}`;case"type":return typeof input2.text=="string"?`"${truncateToWidth(input2.text,40)}"`:"";case"key":return typeof input2.text=="string"?input2.text:"";case"scroll":return[input2.direction,input2.amount&&`\xD7${input2.amount}`,input2.coordinate&&`at ${fmtCoord(input2.coordinate)}`].filter(Boolean).join(" ");case"zoom":{let r2=input2.region;return Array.isArray(r2)&&r2.length===4?`[${r2[0]}, ${r2[1]}, ${r2[2]}, ${r2[3]}]`:""}case"wait":return typeof input2.duration=="number"?`${input2.duration}s`:"";case"write_clipboard":return typeof input2.text=="string"?`"${truncateToWidth(input2.text,40)}"`:"";case"open_application":return typeof input2.bundle_id=="string"?String(input2.bundle_id):"";case"inspect_ui":return typeof input2.bundle_id=="string"?String(input2.bundle_id):"";case"find_label":case"click_text":return[typeof input2.bundle_id=="string"?input2.bundle_id:"",typeof input2.query=="string"?`"${truncateToWidth(input2.query,32)}"`:""].filter(Boolean).join(" ");case"ui_action":return[input2.action,input2.path].filter(v2=>typeof v2=="string").join(" ");case"request_access":{let apps=input2.apps;return Array.isArray(apps)?apps.map(a2=>typeof a2?.displayName=="string"?a2.displayName:"").filter(Boolean).join(", "):""}default:return""}},renderToolResultMessage(output2,_progress,{verbose}){if(verbose||typeof output2!="object"||output2===null)return null;let summary=RESULT_SUMMARY[toolName4];return summary?(0,import_jsx_runtime58.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime58.jsx)(ThemedText,{dimColor:!0,children:summary})}):null}}}var import_jsx_runtime58,RESULT_SUMMARY,init_toolRendering=__esm({"src/utils/computerUse/toolRendering.tsx"(){init_MessageResponse();init_ink();init_format2();import_jsx_runtime58=__toESM(require_jsx_runtime());__name(fmtCoord,"fmtCoord");RESULT_SUMMARY={screenshot:"Captured",zoom:"Captured",request_access:"Access updated",left_click:"Clicked",right_click:"Clicked",double_click:"Clicked",triple_click:"Clicked",type:"Typed",key:"Pressed",scroll:"Scrolled",left_click_drag:"Dragged",open_application:"Opened",inspect_ui:"Inspected",ui_action:"Updated",find_label:"Found",click_text:"Clicked",computer_status:"Checked"};__name(getComputerUseMCPRenderingOverrides,"getComputerUseMCPRenderingOverrides")}});function asRecord10(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function asString(value){return typeof value=="string"?value:""}function extractInspectElements(payload){let root2=asRecord10(payload),raw=Array.isArray(payload)?payload:Array.isArray(root2?.elements)?root2.elements:[],out=[];for(let row3 of raw){let r2=asRecord10(row3);if(!r2)continue;let path40=asString(r2.path),role=asString(r2.role).trim()||"AXUnknown";if(!("path"in r2)&&!role)continue;let frameRaw=asRecord10(r2.frame),frame=frameRaw&&typeof frameRaw.x=="number"&&typeof frameRaw.y=="number"&&typeof frameRaw.width=="number"&&typeof frameRaw.height=="number"?{x:frameRaw.x,y:frameRaw.y,width:frameRaw.width,height:frameRaw.height}:void 0,actions=Array.isArray(r2.actions)?r2.actions.filter(a2=>typeof a2=="string"):void 0;out.push({path:asString(r2.path),role,subrole:asString(r2.subrole)||void 0,title:asString(r2.title)||void 0,description:asString(r2.description)||void 0,identifier:asString(r2.identifier)||void 0,value:asString(r2.value)||void 0,enabled:typeof r2.enabled=="boolean"?r2.enabled:void 0,actions,frame})}return out}function elementSearchBlob(el){return[el.title,el.description,el.identifier,el.value,el.role,el.subrole].filter(Boolean).join(" | ")}function matchesLabel(el,query2,exact){let q2=query2.trim();if(!q2)return!1;let fields=[el.title,el.description,el.identifier,el.value].map(f3=>(f3??"").trim()).filter(Boolean);if(fields.length===0)return!1;if(exact){let ql2=q2.toLowerCase();return fields.some(f3=>f3.toLowerCase()===ql2)}let ql=q2.toLowerCase();return fields.some(f3=>f3.toLowerCase().includes(ql))}function isLikelyInteractive(el){let role=el.role;return!!(/AXButton|AXCheckBox|AXRadioButton|AXPopUpButton|AXMenuItem|AXLink|AXTab|AXComboBox|AXTextField|AXTextArea|AXSearchField|AXSlider|AXIncrementor/i.test(role)||el.actions?.some(a2=>/AXPress|AXConfirm|AXShowMenu|AXOpen/i.test(a2)))}function findElementsByLabel(elements,query2,options){let exact=options?.exact===!0,role=options?.role?.trim(),limit=Math.max(1,Math.min(options?.limit??12,50)),q2=query2.trim();if(!q2)return[];let hits=elements.filter(el=>role&&el.role!==role&&el.subrole!==role||el.enabled===!1?!1:matchesLabel(el,q2,exact));return hits=[...hits].sort((a2,b3)=>{let aTitle=(a2.title??"").toLowerCase(),bTitle=(b3.title??"").toLowerCase(),ql=q2.toLowerCase(),aExact=aTitle===ql?0:1,bExact=bTitle===ql?0:1;if(aExact!==bExact)return aExact-bExact;let aIx=isLikelyInteractive(a2)?0:1,bIx=isLikelyInteractive(b3)?0:1;return aIx!==bIx?aIx-bIx:aTitle.length-bTitle.length}),hits.slice(0,limit)}function pickClickAction(el){let actions=el.actions??[];return actions.some(a2=>a2==="AXPress"||/Press/i.test(a2))?"press":actions.some(a2=>a2==="AXConfirm"||/Confirm/i.test(a2))?"confirm":/AXTextField|AXTextArea|AXSearchField|AXComboBox/i.test(el.role)||actions.some(a2=>/AXFocus|Focus/i.test(a2))?"focus":/AXButton|AXCheckBox|AXRadioButton|AXMenuItem|AXLink|AXTab/i.test(el.role)?"press":null}function frameCenter(frame){return{x:Math.round(frame.x+frame.width/2),y:Math.round(frame.y+frame.height/2)}}function summarizeElement(el){return{path:el.path,role:el.role,title:el.title,description:el.description,value:el.value,enabled:el.enabled,actions:el.actions,frame:el.frame,blob:elementSearchBlob(el).slice(0,120)}}var COMPUTER_USE_VERIFY_NUDGE,init_uiFind=__esm({"src/utils/computerUse/uiFind.ts"(){init_efficiencyLaw();__name(asRecord10,"asRecord");__name(asString,"asString");__name(extractInspectElements,"extractInspectElements");__name(elementSearchBlob,"elementSearchBlob");__name(matchesLabel,"matchesLabel");__name(isLikelyInteractive,"isLikelyInteractive");__name(findElementsByLabel,"findElementsByLabel");__name(pickClickAction,"pickClickAction");__name(frameCenter,"frameCenter");__name(summarizeElement,"summarizeElement");COMPUTER_USE_VERIFY_NUDGE=getComputerUseVerifyNudgeText()}});var wrapper_exports2={};__export(wrapper_exports2,{buildSessionContext:()=>buildSessionContext,getComputerUseMCPToolOverrides:()=>getComputerUseMCPToolOverrides});function tuc(){return currentToolUseContext}function formatLockHeld(holder){return`Computer use is in use by another Clavue session (${holder.slice(0,8)}...). Wait for that session to finish or run /exit there.`}function updateComputerUseState(update3){tuc().setAppState(previous2=>({...previous2,computerUseMcpState:update3(previous2.computerUseMcpState??{})}))}function buildSessionContext(){return{getAllowedApps:__name(()=>tuc().getAppState().computerUseMcpState?.allowedApps??[],"getAllowedApps"),getGrantFlags:__name(()=>tuc().getAppState().computerUseMcpState?.grantFlags??DEFAULT_GRANT_FLAGS,"getGrantFlags"),getSelectedDisplayId:__name(()=>tuc().getAppState().computerUseMcpState?.selectedDisplayId,"getSelectedDisplayId"),getLastScreenshotDims:__name(()=>{let dims=tuc().getAppState().computerUseMcpState?.lastScreenshotDims;return dims?{...dims,displayId:dims.displayId??0,originX:dims.originX??0,originY:dims.originY??0}:void 0},"getLastScreenshotDims"),getAbortSignal:__name(()=>tuc().abortController.signal,"getAbortSignal"),onPermissionRequest:__name(request=>runPermissionDialog(request),"onPermissionRequest"),onAllowedAppsChanged:__name((apps,flags)=>updateComputerUseState(state5=>({...state5,allowedApps:apps,grantFlags:flags})),"onAllowedAppsChanged"),onAppsHidden:__name(bundleIds=>{bundleIds.length!==0&&updateComputerUseState(state5=>({...state5,hiddenDuringTurn:new Set([...state5.hiddenDuringTurn??[],...bundleIds])}))},"onAppsHidden"),onScreenshotCaptured:__name(dims=>updateComputerUseState(state5=>({...state5,lastScreenshotDims:dims})),"onScreenshotCaptured"),checkCuLock:__name(async()=>{let result2=await checkComputerUseLock();return result2.kind==="free"?{holder:void 0,isSelf:!1}:result2.kind==="held_by_self"?{holder:getSessionId(),isSelf:!0}:{holder:result2.by,isSelf:!1}},"checkCuLock"),acquireCuLock:__name(async()=>{let result2=await tryAcquireComputerUseLock();if(result2.kind==="blocked")throw new Error(formatLockHeld(result2.by));if(result2.fresh){let escape2=await registerEscHotkey(()=>tuc().abortController.abort());tuc().sendOSNotification?.({message:escape2?"Clavue is using your computer - press Esc to stop":"Clavue is using your computer - press Ctrl+C to stop",notificationType:"computer_use_enter"})}},"acquireCuLock"),formatLockHeldMessage:formatLockHeld}}function text(content,isError2=!1){return{content:[{type:"text",text:content}],...isError2?{isError:isError2}:{}}}function objectText(value){return text(JSON.stringify(value))}function withVerifyNudge(result2,toolName4){if(result2.isError)return result2;let obligation=buildComputerUseVerifyObligation(toolName4),nudge=getComputerUseVerifyNudgeText(),content=result2.content.map(block2=>{if(block2.type!=="text"||typeof block2.text!="string")return block2;let raw=block2.text.trim();if(!raw.startsWith("{")&&!raw.startsWith("["))return block2;try{let parsed=JSON.parse(raw);if(parsed&&typeof parsed=="object"&&!Array.isArray(parsed))return{...block2,text:JSON.stringify({...parsed,verifyObligation:obligation})}}catch{}return block2});return{...result2,content:[...content,{type:"text",text:nudge}]}}async function assertScreenshotNotSensitiveFrontmost(){if(isComputerUseSensitiveAllowed())return;let frontmost=await getComputerUseFrontmostApp();if(frontmost&&isSensitiveComputerUseApp(frontmost.displayName,frontmost.bundleId))throw new Error(`Screenshot blocked: sensitive app frontmost (${frontmost.displayName||frontmost.bundleId}). Hide the vault or set CLAVUE_CU_ALLOW_SENSITIVE=1 only if intentional. A screenshot of a visible password is a leak.`)}async function ensureAppFrontmost(bundleId2){if((await getComputerUseFrontmostApp())?.bundleId===bundleId2)return;await openComputerUseApp(bundleId2),await sleep2(150);let activated=await getComputerUseFrontmostApp();if(activated?.bundleId!==bundleId2)throw new Error(`Could not bring ${bundleId2} to the foreground; ${activated?.displayName??"another application"} remains frontmost.`)}function stringArg(args,name){let value=args[name];if(typeof value!="string")throw new Error(`${name} must be a string`);return value}function numberArg(args,name,fallback){let value=args[name];if(value===void 0&&fallback!==void 0)return fallback;if(typeof value!="number"||!Number.isFinite(value))throw new Error(`${name} must be a finite number`);return value}function coordinateArg(args,name="coordinate"){let value=args[name];if(!Array.isArray(value)||value.length!==2||value.some(item=>typeof item!="number"||!Number.isFinite(item)))throw new Error(`${name} must be [x, y]`);return{x:value[0],y:value[1]}}function appByRequest(installed2,request){let normalized=request.trim().toLocaleLowerCase();return installed2.find(app=>app.bundleId.toLocaleLowerCase()===normalized)??installed2.find(app=>app.displayName.toLocaleLowerCase()===normalized)??installed2.find(app=>app.displayName.toLocaleLowerCase().includes(normalized))}function allowedSet(ctx){return new Set(ctx.getAllowedApps().map(app=>app.bundleId))}function requireAllowedBundle(ctx,bundleId2){if(!allowedSet(ctx).has(bundleId2))throw new Error(`Application ${bundleId2} is not granted. Call request_access first.`)}async function requireInputTarget(ctx){let frontmost=await getComputerUseFrontmostApp();if(!frontmost)throw new Error("No frontmost application is available.");let grant=ctx.getAllowedApps().find(app=>app.bundleId===frontmost.bundleId);if(!grant)throw new Error(`Frontmost application ${frontmost.displayName} (${frontmost.bundleId}) is not granted. Refusing keyboard input.`);return grant}async function requirePointTarget(ctx,point){let app=await getComputerUseAppUnderPoint(point.x,point.y);if(!app)throw new Error("No application window exists under that point.");let grant=ctx.getAllowedApps().find(candidate=>candidate.bundleId===app.bundleId);if(!grant)throw new Error(`Application under the point is ${app.displayName} (${app.bundleId}), which is not granted. Refusing pointer action.`);return grant}async function ensureLock(ctx){let state5=await ctx.checkCuLock();if(state5.holder&&!state5.isSelf)throw new Error(ctx.formatLockHeldMessage(state5.holder));state5.holder||await ctx.acquireCuLock()}async function ensureOsPermissions(){let state5=await getComputerUseCapabilities();if(!state5.accessibility||!state5.screenRecording)throw new Error(`macOS permissions missing: Accessibility=${state5.accessibility}, Screen Recording=${state5.screenRecording}. Call request_access to open the permission flow.`)}async function prepareGrantedApps(ctx){let hidden2=await prepareComputerUseApps([...allowedSet(ctx)]);ctx.onAppsHidden(hidden2)}async function assertScreenshotIsFiltered(ctx){let allowed=allowedSet(ctx),blocked=(await listVisibleComputerUseApps()).filter(app=>!allowed.has(app.bundleId)&&!SAFE_SYSTEM_CHROME.has(app.bundleId.toLowerCase()));if(blocked.length>0)throw new Error(`Screenshot blocked because ungranted windows remain visible: ${blocked.map(app=>`${app.displayName} (${app.bundleId})`).join(", ")}. Resolve or grant those windows, then retry.`)}function screenshotDims(capture,display){return{width:capture.width,height:capture.height,displayWidth:display.width,displayHeight:display.height,displayId:display.id,originX:display.x,originY:display.y}}function scaleFromScreenshot(ctx,point){let dims=ctx.getLastScreenshotDims();return dims?{x:Math.round(dims.originX+point.x*dims.displayWidth/dims.width),y:Math.round(dims.originY+point.y*dims.displayHeight/dims.height)}:point}function classifyRiskyElement(element){if(!element||typeof element!="object")return;let record2=element,target=[record2.title,record2.description,record2.identifier,record2.value].filter(value=>typeof value=="string").join(" | ");if(record2.subrole==="AXCloseButton")return{risk:"This will close a local window or tab and may discard unsaved work.",target:target||"macOS close control"};if(!target)return;let match=RISK_PATTERNS.find(candidate=>candidate.pattern.test(target));return match?{risk:match.risk,target}:void 0}function uiElementFingerprint(element){if(!element||typeof element!="object")return"";let record2=element;return JSON.stringify([record2.path,record2.role,record2.subrole,record2.title,record2.description,record2.identifier,record2.value])}async function confirmRiskyUiAction(element){let risk=classifyRiskyElement(element);if(!risk)return!1;if(!await runActionConfirmation(risk))throw new Error("Risky Computer Use action was cancelled by the user.");return!0}async function confirmDeclaredRisk(args,meta){let risk=stringArg(args,"risk"),intent=stringArg(args,"intent");if(risk==="none")return!1;if(!await runActionConfirmation({target:intent,risk:`The model declared this action as ${risk}.`}))throw isComputerUseConsentRisk(risk)&&appendComputerUseAudit({ts:new Date().toISOString(),tool:meta?.tool??"unknown",risk,intent,bundleId:meta?.bundleId,confirmed:!1,sessionId:getSessionId(),note:"user_cancelled"}),new Error("Declared-risk Computer Use action was cancelled by the user.");return isComputerUseConsentRisk(risk)&&appendComputerUseAudit({ts:new Date().toISOString(),tool:meta?.tool??"unknown",risk,intent,bundleId:meta?.bundleId,confirmed:!0,sessionId:getSessionId()}),!0}async function requestAccess(ctx,args){let requested=args.apps;if(!Array.isArray(requested)||requested.some(item=>typeof item!="string"))throw new Error("apps must be an array of application names or bundle identifiers");let tcc=await getComputerUseCapabilities();if(!tcc.accessibility||!tcc.screenRecording)return await ctx.onPermissionRequest({apps:[],requestedFlags:{},tccState:tcc}),objectText({granted:!1,reason:"macOS permissions are incomplete",...tcc});let installed2=await listComputerUseInstalledApps(),existing=ctx.getAllowedApps(),requestedApps=requested.map(value=>{let resolved=appByRequest(installed2,value);return{requestedName:value,resolved,alreadyGranted:resolved?existing.some(grant=>grant.bundleId===resolved.bundleId):!1}}),requestedFlags={clipboardRead:args.clipboard_read===!0,clipboardWrite:args.clipboard_write===!0,systemKeyCombos:args.system_key_combos===!0},response=await ctx.onPermissionRequest({apps:requestedApps,requestedFlags,reason:typeof args.reason=="string"?args.reason:void 0}),merged=new Map(existing.map(app=>[app.bundleId,app]));for(let grant of response.granted)merged.set(grant.bundleId,grant);let flags={clipboardRead:ctx.getGrantFlags().clipboardRead||response.flags.clipboardRead,clipboardWrite:ctx.getGrantFlags().clipboardWrite||response.flags.clipboardWrite,systemKeyCombos:ctx.getGrantFlags().systemKeyCombos||response.flags.systemKeyCombos};return ctx.onAllowedAppsChanged([...merged.values()],flags),objectText({granted:response.granted,denied:response.denied,flags})}async function dispatch(toolName4,args,ctx){if(toolName4==="computer_status"){let[capabilities,displays,running,frontmost,bridgeWarm]=await Promise.all([getComputerUseCapabilities(),listComputerUseDisplays(),listComputerUseRunningApps(),getComputerUseFrontmostApp(),warmComputerUseBridge()]);return objectText({capabilities,displays,frontmost,runningApps:running,bridgeWarm})}if(toolName4==="request_access")return requestAccess(ctx,args);if(toolName4==="list_granted_applications")return objectText({apps:ctx.getAllowedApps(),flags:ctx.getGrantFlags()});await ensureOsPermissions(),await ensureLock(ctx);let signal=ctx.getAbortSignal();if(signal.aborted)throw new Error("Computer Use action was aborted.");switch(toolName4){case"open_application":{let bundleId2=stringArg(args,"bundle_id");return requireAllowedBundle(ctx,bundleId2),await openComputerUseApp(bundleId2),text(`Opened ${bundleId2}.`)}case"screenshot":{if(ctx.getAllowedApps().length===0)throw new Error("No applications are granted.");await prepareGrantedApps(ctx),await assertScreenshotIsFiltered(ctx),await assertScreenshotNotSensitiveFrontmost();let display=await getComputerUseDisplay(typeof args.display_id=="number"?args.display_id:ctx.getSelectedDisplayId()),capture=await captureComputerUseScreenshot({displayId:display.id,signal});return ctx.onScreenshotCaptured(screenshotDims(capture,display)),{content:[{type:"image",data:capture.base64,mimeType:capture.mediaType},{type:"text",text:`Display ${display.name}: screenshot ${capture.width}x${capture.height}; logical display ${display.width}x${display.height}. Coordinates in this image are scaled automatically for pointer tools. Prefer inspect_ui/find_label for targeting \u2014 full screenshot is last-resort eyes.`}]}}case"zoom":{let region=args.region;if(!Array.isArray(region)||region.length!==4||region.some(v2=>typeof v2!="number"))throw new Error("region must be [x, y, width, height]");await prepareGrantedApps(ctx),await assertScreenshotIsFiltered(ctx),await assertScreenshotNotSensitiveFrontmost();let[x3,y2,width,height]=region,capture=await captureComputerUseScreenshot({region:{x:x3,y:y2,width,height},signal});return{content:[{type:"image",data:capture.base64,mimeType:capture.mediaType}]}}case"inspect_ui":{let bundleId2=stringArg(args,"bundle_id");return requireAllowedBundle(ctx,bundleId2),objectText(await inspectComputerUseUi({bundleId:bundleId2,maxDepth:numberArg(args,"max_depth",6),maxElements:numberArg(args,"max_elements",120),includeMenuBar:args.include_menu_bar===!0}))}case"ui_action":{let bundleId2=stringArg(args,"bundle_id");requireAllowedBundle(ctx,bundleId2),await ensureAppFrontmost(bundleId2);let path40=stringArg(args,"path"),targetBefore=await describeComputerUseUiElement({bundleId:bundleId2,path:path40}),confirmed=await confirmDeclaredRisk(args,{tool:"ui_action",bundleId:bundleId2}),labelConfirmed=confirmed?!1:await confirmRiskyUiAction(targetBefore);if(confirmed||labelConfirmed){let targetAfter=await describeComputerUseUiElement({bundleId:bundleId2,path:path40});if(uiElementFingerprint(targetBefore)!==uiElementFingerprint(targetAfter))throw new Error("The confirmed UI target changed before execution. Inspect the UI again.")}return withVerifyNudge(objectText(await actOnComputerUseUi({bundleId:bundleId2,path:path40,action:stringArg(args,"action"),value:typeof args.value=="string"?args.value:void 0})),"ui_action")}case"find_label":{let bundleId2=stringArg(args,"bundle_id");requireAllowedBundle(ctx,bundleId2);let query2=stringArg(args,"query"),inspected=await inspectComputerUseUi({bundleId:bundleId2,maxDepth:numberArg(args,"max_depth",6),maxElements:numberArg(args,"max_elements",120),includeMenuBar:!1}),elements=extractInspectElements(inspected),matches2=findElementsByLabel(elements,query2,{exact:args.exact===!0,role:typeof args.role=="string"?args.role:void 0,limit:numberArg(args,"limit",12)});return objectText({bundleId:bundleId2,query:query2,exact:args.exact===!0,matchCount:matches2.length,matches:matches2.map(summarizeElement),hint:matches2.length===0?"No matches. Try substring query, broader role, or inspect_ui manually.":matches2.length===1?"One match \u2014 use click_text or ui_action with path.":"Multiple matches \u2014 pass exact=true or role=AXButton, or pick path for ui_action."})}case"click_text":{let bundleId2=stringArg(args,"bundle_id");requireAllowedBundle(ctx,bundleId2),await ensureAppFrontmost(bundleId2);let query2=stringArg(args,"query"),inspected=await inspectComputerUseUi({bundleId:bundleId2,maxDepth:numberArg(args,"max_depth",6),maxElements:numberArg(args,"max_elements",120),includeMenuBar:!1}),elements=extractInspectElements(inspected),matches2=findElementsByLabel(elements,query2,{exact:args.exact===!0,role:typeof args.role=="string"?args.role:void 0,limit:8});if(matches2.length===0)throw new Error(`No UI element matching "${query2}" in ${bundleId2}. Try find_label or inspect_ui.`);if(matches2.length>1&&args.exact!==!0)return objectText({ok:!1,reason:"ambiguous",query:query2,matchCount:matches2.length,matches:matches2.map(summarizeElement),hint:"Pass exact=true, role=\u2026, or call ui_action with a chosen path."});let target=matches2[0],targetBefore=await describeComputerUseUiElement({bundleId:bundleId2,path:target.path}),confirmed=await confirmDeclaredRisk(args,{tool:"click_text",bundleId:bundleId2}),labelConfirmed=confirmed?!1:await confirmRiskyUiAction(targetBefore);if(confirmed||labelConfirmed){let targetAfter=await describeComputerUseUiElement({bundleId:bundleId2,path:target.path});if(uiElementFingerprint(targetBefore)!==uiElementFingerprint(targetAfter))throw new Error("The confirmed UI target changed before execution. Inspect the UI again.")}let axAction=pickClickAction(target);if(axAction){let acted=await actOnComputerUseUi({bundleId:bundleId2,path:target.path,action:axAction});return withVerifyNudge(objectText({ok:!0,method:"ax",action:axAction,target:summarizeElement(target),result:acted}),"click_text")}if(!target.frame)throw new Error(`Matched "${query2}" at path ${target.path} but no AXPress action and no frame for click.`);let point=frameCenter(target.frame);return await requirePointTarget(ctx,point),await clickComputerUseMouse({...point,button:"left",count:1}),withVerifyNudge(objectText({ok:!0,method:"frame_click",coordinate:[point.x,point.y],target:summarizeElement(target)}),"click_text")}case"mouse_move":{let point=scaleFromScreenshot(ctx,coordinateArg(args));return await moveComputerUseMouse(point.x,point.y),text(`Moved to (${point.x}, ${point.y}).`)}case"left_click":case"right_click":case"double_click":case"triple_click":{let point=scaleFromScreenshot(ctx,coordinateArg(args));await requirePointTarget(ctx,point);let targetBefore=await getComputerUseUiElementAtPoint(point.x,point.y),confirmed=await confirmDeclaredRisk(args,{tool:toolName4}),labelConfirmed=confirmed?!1:await confirmRiskyUiAction(targetBefore);if(confirmed||labelConfirmed){let targetAfter=await getComputerUseUiElementAtPoint(point.x,point.y);if(uiElementFingerprint(targetBefore)!==uiElementFingerprint(targetAfter))throw new Error("The confirmed pointer target changed before execution. Take a new screenshot and retry.")}return await clickComputerUseMouse({...point,button:toolName4==="right_click"?"right":"left",count:toolName4==="double_click"?2:toolName4==="triple_click"?3:1}),withVerifyNudge(text(`Clicked (${point.x}, ${point.y}).`),toolName4)}case"left_click_drag":{await confirmDeclaredRisk(args,{tool:"left_click_drag"});let from=scaleFromScreenshot(ctx,coordinateArg(args,"start_coordinate")),to=scaleFromScreenshot(ctx,coordinateArg(args));return await requirePointTarget(ctx,from),await dragComputerUseMouse(from,to),withVerifyNudge(text(`Dragged (${from.x}, ${from.y}) to (${to.x}, ${to.y}).`),"left_click_drag")}case"scroll":{if(args.coordinate){let point=scaleFromScreenshot(ctx,coordinateArg(args));await requirePointTarget(ctx,point),await moveComputerUseMouse(point.x,point.y)}else await requireInputTarget(ctx);let amount=numberArg(args,"amount",3)*120,direction=stringArg(args,"direction");return await scrollComputerUseMouse(direction==="left"?-amount:direction==="right"?amount:0,direction==="up"?amount:direction==="down"?-amount:0),text(`Scrolled ${direction}.`)}case"type":return await requireInputTarget(ctx),await confirmDeclaredRisk(args,{tool:"type"}),await typeComputerUseText(stringArg(args,"text")),withVerifyNudge(text("Typed text."),"type");case"key":{await requireInputTarget(ctx),await confirmDeclaredRisk(args,{tool:"key"});let keys2=stringArg(args,"text").split("+").filter(Boolean);if(keys2.length>1&&!ctx.getGrantFlags().systemKeyCombos)throw new Error("System key combinations were not granted. Call request_access with system_key_combos=true.");let repeat3=numberArg(args,"repeat",1);keys2.length===1&&["escape","esc"].includes(keys2[0].toLowerCase())&&void 0;for(let index=0;index<repeat3;index++)await pressComputerUseKeys(keys2);return withVerifyNudge(text(`Pressed ${keys2.join("+")}.`),"key")}case"wait":return await sleep2(numberArg(args,"duration")*1e3),text("Wait complete.");case"cursor_position":return objectText(await getComputerUseCursorPosition());case"read_clipboard":{if(!ctx.getGrantFlags().clipboardRead)throw new Error("Clipboard read was not granted.");let result2=await execFileNoThrow("/usr/bin/pbpaste",[],{useCwd:!1});if(result2.code!==0)throw new Error("Failed to read clipboard.");return text(result2.stdout)}case"write_clipboard":{if(!ctx.getGrantFlags().clipboardWrite)throw new Error("Clipboard write was not granted.");if((await execFileNoThrow("/usr/bin/pbcopy",[],{useCwd:!1,input:stringArg(args,"text"),stdin:"pipe"})).code!==0)throw new Error("Failed to write clipboard.");return text("Clipboard updated.")}default:throw new Error(`Unsupported Computer Use tool: ${toolName4}`)}}function getComputerUseMCPToolOverrides(toolName4){let call84=__name(async(rawArgs,context3)=>{if(currentToolUseContext=context3,context3.agentId)return{data:[{type:"text",text:"Computer Use is owned by the interactive main session. Ask the main Clavue turn to perform this UI action."}]};try{return{data:(await dispatch(toolName4,rawArgs??{},buildSessionContext())).content.map(item=>item.type==="image"?{type:"image",source:{type:"base64",media_type:item.mimeType,data:item.data}}:{type:"text",text:item.text})}}catch(error40){return{data:[{type:"text",text:`Computer Use failed: ${error40 instanceof Error?error40.message:String(error40)}`}]}}},"call");return{...getComputerUseMCPRenderingOverrides(toolName4),call:call84}}async function runActionConfirmation(risk){let context3=tuc(),setToolJSX=context3.setToolJSX;if(!setToolJSX)return!1;try{return await new Promise((resolve67,reject2)=>{let signal=context3.abortController.signal;if(signal.aborted){reject2(new Error("Computer Use action confirmation aborted"));return}let onAbort=__name(()=>reject2(new Error("Computer Use action confirmation aborted")),"onAbort");signal.addEventListener("abort",onAbort,{once:!0}),setToolJSX({jsx:React24.createElement(ComputerUseActionApproval,{...risk,onDone:__name(approved=>{signal.removeEventListener("abort",onAbort),resolve67(approved)},"onDone")}),shouldHidePromptInput:!0})})}finally{setToolJSX(null)}}async function runPermissionDialog(request){let context3=tuc(),setToolJSX=context3.setToolJSX;if(!setToolJSX)return{granted:[],denied:[],flags:DEFAULT_GRANT_FLAGS};try{return await new Promise((resolve67,reject2)=>{let signal=context3.abortController.signal;if(signal.aborted){reject2(new Error("Computer Use permission dialog aborted"));return}let onAbort=__name(()=>reject2(new Error("Computer Use permission dialog aborted")),"onAbort");signal.addEventListener("abort",onAbort,{once:!0}),setToolJSX({jsx:React24.createElement(ComputerUseApproval,{request,onDone:__name(response=>{signal.removeEventListener("abort",onAbort),resolve67(response)},"onDone")}),shouldHidePromptInput:!0})})}finally{setToolJSX(null)}}var React24,currentToolUseContext,SAFE_SYSTEM_CHROME,RISK_PATTERNS,init_wrapper2=__esm({"src/utils/computerUse/wrapper.tsx"(){React24=__toESM(require_react());init_state();init_ComputerUseApproval();init_sleep2();init_computerUseLock();init_executor();init_execFileNoThrow();init_escHotkey();init_audit();init_efficiencyLaw();init_toolRendering();init_uiFind();init_types17();__name(tuc,"tuc");__name(formatLockHeld,"formatLockHeld");__name(updateComputerUseState,"updateComputerUseState");__name(buildSessionContext,"buildSessionContext");__name(text,"text");__name(objectText,"objectText");__name(withVerifyNudge,"withVerifyNudge");__name(assertScreenshotNotSensitiveFrontmost,"assertScreenshotNotSensitiveFrontmost");__name(ensureAppFrontmost,"ensureAppFrontmost");__name(stringArg,"stringArg");__name(numberArg,"numberArg");__name(coordinateArg,"coordinateArg");__name(appByRequest,"appByRequest");__name(allowedSet,"allowedSet");__name(requireAllowedBundle,"requireAllowedBundle");__name(requireInputTarget,"requireInputTarget");__name(requirePointTarget,"requirePointTarget");__name(ensureLock,"ensureLock");__name(ensureOsPermissions,"ensureOsPermissions");__name(prepareGrantedApps,"prepareGrantedApps");SAFE_SYSTEM_CHROME=new Set(["com.apple.dock","com.apple.systemuiserver","com.apple.controlcenter","com.apple.notificationcenterui"]);__name(assertScreenshotIsFiltered,"assertScreenshotIsFiltered");__name(screenshotDims,"screenshotDims");__name(scaleFromScreenshot,"scaleFromScreenshot");RISK_PATTERNS=[{pattern:/\b(delete|remove|erase|trash|close|cancel subscription|unsubscribe)\b|删除|移除|清除|关闭|取消订阅/i,risk:"This may delete data, remove access, or close local content."},{pattern:/\b(send|submit|publish|post|reply|message|share|upload)\b|发送|提交|发布|回复|分享|上传/i,risk:"This may communicate or transmit data to a third party."},{pattern:/\b(pay|purchase|buy|checkout|subscribe|confirm order)\b|付款|支付|购买|结账|订阅|确认订单/i,risk:"This may create or confirm a financial transaction."},{pattern:/\b(install|extension|allow|grant|permission|security|privacy|system settings)\b|安装|扩展|允许|授权|权限|安全|隐私|系统设置/i,risk:"This may install software or change a permission/system setting."},{pattern:/\b(password|passcode|otp|verification code|api key|credit card)\b|密码|验证码|密钥|信用卡/i,risk:"This may enter or expose sensitive authentication or financial data."}];__name(classifyRiskyElement,"classifyRiskyElement");__name(uiElementFingerprint,"uiElementFingerprint");__name(confirmRiskyUiAction,"confirmRiskyUiAction");__name(confirmDeclaredRisk,"confirmDeclaredRisk");__name(requestAccess,"requestAccess");__name(dispatch,"dispatch");__name(getComputerUseMCPToolOverrides,"getComputerUseMCPToolOverrides");__name(runActionConfirmation,"runActionConfirmation");__name(runPermissionDialog,"runPermissionDialog")}});function crossCheckNativeMcpToolList(client2,jsTools){if(!isNativeModuleEnabled2("mcp")||client2.config.type!=="stdio"&&client2.config.type||!("command"in client2.config))return;let handle=null;try{let connected=nativeMcpConnect({name:client2.name,command:client2.config.command,args:client2.config.args??[],env:client2.config.env});if(!connected)return;handle=connected.handle;let nativeTools=nativeMcpListTools(handle);if(!nativeTools)return;let jsNames=jsTools.map(tool=>tool.name),nativeNames=nativeTools.map(tool=>tool.name);jsNames.length!==nativeNames.length&&logMCPDebug(client2.name,`native mcp tool count differs: js=${jsNames.length} rust=${nativeNames.length}`);for(let i3=0;i3<Math.min(jsNames.length,nativeNames.length);i3++)if(jsNames[i3]!==nativeNames[i3]){logMCPDebug(client2.name,`native mcp tool order differs at ${i3}: js=${jsNames[i3]} rust=${nativeNames[i3]}`);break}for(let jsTool of jsTools){let nativeTool=nativeTools.find(tool=>tool.name===jsTool.name);nativeTool&&JSON.stringify(nativeTool.inputSchema)!==JSON.stringify(jsTool.inputSchema)&&logMCPDebug(client2.name,`native mcp inputSchema differs for '${jsTool.name}'`)}}catch(error40){logMCPDebug(client2.name,`native mcp cross-check skipped: ${errorMessage2(error40)}`)}finally{if(handle)try{nativeMcpClose(handle)}catch{}}}function createFetchToolsForClient({ensureConnectedClient:ensureConnectedClient2,callMCPToolWithUrlElicitationRetry:callMCPToolWithUrlElicitationRetry2}){return memoizeWithLRU(async client2=>{if(client2.type!=="connected")return[];try{if(!client2.capabilities?.tools)return[];let result2=await client2.client.request({method:"tools/list"},ListToolsResultSchema),toolsToProcess=recursivelySanitizeUnicode(result2.tools),skipPrefix=client2.config.type==="sdk"&&isEnvTruthy2(process.env.CLAUDE_AGENT_SDK_MCP_NO_PREFIX);return crossCheckNativeMcpToolList(client2,toolsToProcess),toolsToProcess.filter(tool=>{let name=buildMcpToolName(client2.name,tool.name);return mcpToolNameTooLong(name)?(logMCPError(client2.name,recordMcpToolNameError(name)),!1):!0}).map(tool=>{let fullyQualifiedName=buildMcpToolName(client2.name,tool.name);return{...MCPTool,name:skipPrefix?tool.name:fullyQualifiedName,mcpInfo:{serverName:client2.name,toolName:tool.name},isMcp:!0,searchHint:typeof tool._meta?.["anthropic/searchHint"]=="string"&&tool._meta["anthropic/searchHint"].replace(/\s+/g," ").trim()||void 0,alwaysLoad:tool._meta?.["anthropic/alwaysLoad"]===!0,async description(){return tool.description??""},async prompt(){let desc=tool.description??"";return desc.length>MAX_MCP_DESCRIPTION_LENGTH?desc.slice(0,MAX_MCP_DESCRIPTION_LENGTH)+"\u2026 [truncated]":desc},isConcurrencySafe(){return tool.annotations?.readOnlyHint??!1},isReadOnly(){return tool.annotations?.readOnlyHint??!1},toAutoClassifierInput(input2){return mcpToolInputToAutoClassifierInput(input2,tool.name)},isDestructive(){return tool.annotations?.destructiveHint??!1},isOpenWorld(){return tool.annotations?.openWorldHint??!1},isSearchOrReadCommand(){return classifyMcpToolForCollapse(client2.name,tool.name)},inputJSONSchema:tool.inputSchema,async checkPermissions(){return{behavior:"passthrough",message:"MCPTool requires permission.",suggestions:[{type:"addRules",rules:[{toolName:fullyQualifiedName,ruleContent:void 0}],behavior:"allow",destination:"localSettings"}]}},async call(args,context3,_canUseTool,parentMessage,onProgress){let toolUseId2=extractToolUseId(parentMessage),meta=toolUseId2?{"claudecode/toolUseId":toolUseId2}:{};onProgress&&toolUseId2&&onProgress({toolUseID:toolUseId2,data:{type:"mcp_progress",status:"started",serverName:client2.name,toolName:tool.name}});let startTime=Date.now(),MAX_SESSION_RETRIES=1,MAX_TRANSIENT_RETRIES=tool.annotations?.readOnlyHint?1:0,sessionRetries=0,transientRetries=0;for(;;)try{let connectedClient=await ensureConnectedClient2(client2),mcpResult=await callMCPToolWithUrlElicitationRetry2({client:connectedClient,clientConnection:client2,tool:tool.name,args,meta,signal:context3.abortController.signal,setAppState:context3.setAppState,onProgress:onProgress&&toolUseId2?progressData=>{onProgress({toolUseID:toolUseId2,data:progressData})}:void 0,handleElicitation:context3.handleElicitation});return onProgress&&toolUseId2&&onProgress({toolUseID:toolUseId2,data:{type:"mcp_progress",status:"completed",serverName:client2.name,toolName:tool.name,elapsedTimeMs:Date.now()-startTime}}),{data:mcpResult.content,...(mcpResult._meta||mcpResult.structuredContent)&&{mcpMeta:{...mcpResult._meta&&{_meta:mcpResult._meta},...mcpResult.structuredContent&&{structuredContent:mcpResult.structuredContent}}}}}catch(error40){if(error40 instanceof McpSessionExpiredError&&sessionRetries<MAX_SESSION_RETRIES){sessionRetries++,logMCPDebug(client2.name,`Retrying tool '${tool.name}' after session recovery`);continue}if(transientRetries<MAX_TRANSIENT_RETRIES&&isMcpTransientToolCallError(error40)){transientRetries++,logMCPDebug(client2.name,`Retrying read-only tool '${tool.name}' after transient transport failure`);continue}if(onProgress&&toolUseId2&&onProgress({toolUseID:toolUseId2,data:{type:"mcp_progress",status:"failed",serverName:client2.name,toolName:tool.name,elapsedTimeMs:Date.now()-startTime}}),error40 instanceof Error&&!(error40 instanceof TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS)){let name=error40.constructor.name;if(name==="Error")throw new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(error40.message,error40.message.slice(0,200));if(name==="McpError"&&"code"in error40&&typeof error40.code=="number")throw new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(error40.message,`McpError ${error40.code}`)}throw error40}},userFacingName(){let displayName=tool.annotations?.title||tool.name;return`${client2.name} - ${displayName} (MCP)`},...(client2.config.type==="stdio"||!client2.config.type)&&isComputerUseMCPServer2(client2.name)?computerUseWrapper().getComputerUseMCPToolOverrides(tool.name):{}}}).filter(isIncludedMcpTool)}catch(error40){return logMCPError(client2.name,`Failed to fetch tools: ${errorMessage2(error40)}`),[]}},client2=>client2.name,MCP_FETCH_CACHE_SIZE)}var computerUseWrapper,isComputerUseMCPServer2,init_toolFetcher=__esm({"src/services/mcp/toolFetcher.ts"(){init_types4();init_classifyForCollapse();init_MCPTool();init_envUtils();init_errors2();init_log3();init_memoize2();init_sanitization();init_connectionUtils();init_mcpStringUtils();init_mcpSchemaFallback();init_utils10();init_toolCaller();init_bridge();init_mcp();computerUseWrapper=()=>(init_wrapper2(),__toCommonJS(wrapper_exports2)),isComputerUseMCPServer2=(init_common(),__toCommonJS(common_exports)).isComputerUseMCPServer;__name(crossCheckNativeMcpToolList,"crossCheckNativeMcpToolList");__name(createFetchToolsForClient,"createFetchToolsForClient")}});function getServerNameForElicitation(clientConnection){return clientConnection.type==="connected"?clientConnection.name:"unknown"}function getValidUrlElicitations(errorData){return(errorData!=null&&typeof errorData=="object"&&"elicitations"in errorData&&Array.isArray(errorData.elicitations)?errorData.elicitations:[]).filter(e2=>{if(e2==null||typeof e2!="object")return!1;let obj=e2;return obj.mode==="url"&&typeof obj.url=="string"&&typeof obj.elicitationId=="string"&&typeof obj.message=="string"})}function formatUrlElicitationBlockedMessage(tool,action,actor){return`URL elicitation was ${action==="decline"?"declined":action+"ed"} by ${actor==="hook"?"a hook":"the user"}. The tool "${tool}" could not complete because it requires the user to open a URL.`}async function queueUrlElicitation({serverName,elicitation,signal,setAppState}){let waitingState={actionLabel:"Retry now",showCancel:!0};return new Promise(resolve67=>{let onAbort=__name(()=>{resolve67({action:"cancel"})},"onAbort");if(signal.aborted){onAbort();return}signal.addEventListener("abort",onAbort,{once:!0}),setAppState(prev=>({...prev,elicitation:{queue:[...prev.elicitation.queue,{serverName,requestId:`error-elicit-${elicitation.elicitationId}`,params:elicitation,signal,waitingState,respond:__name(result2=>{result2.action!=="accept"&&(signal.removeEventListener("abort",onAbort),resolve67(result2))},"respond"),onWaitingDismiss:__name(action=>{signal.removeEventListener("abort",onAbort),resolve67(action==="retry"?{action:"accept"}:{action:"cancel"})},"onWaitingDismiss")}]}}))})}var init_urlElicitation=__esm({"src/services/mcp/urlElicitation.ts"(){__name(getServerNameForElicitation,"getServerNameForElicitation");__name(getValidUrlElicitations,"getValidUrlElicitations");__name(formatUrlElicitationBlockedMessage,"formatUrlElicitationBlockedMessage");__name(queueUrlElicitation,"queueUrlElicitation")}});function isMcpServerFromProjectOrLocalSettings(config3){return config3.scope==="project"||config3.scope==="local"}async function getMcpHeadersFromHelper(serverName,config3){if(!config3.headersHelper)return null;if("scope"in config3&&isMcpServerFromProjectOrLocalSettings(config3)&&!getIsNonInteractiveSession()&&!checkHasTrustDialogAccepted()){let error40=new Error(`Security: headersHelper for MCP server '${serverName}' executed before workspace trust is confirmed. If you see this message, post in https://github.com/anthropics/claude-code/issues.`);return logAntError("MCP headersHelper invoked before trust check",error40),logEvent("tengu_mcp_headersHelper_missing_trust",{}),null}try{logMCPDebug(serverName,"Executing headersHelper to get dynamic headers");let execResult=await execFileNoThrowWithCwd(config3.headersHelper,[],{shell:!0,timeout:1e4,env:{...process.env,CLAUDE_CODE_MCP_SERVER_NAME:serverName,CLAUDE_CODE_MCP_SERVER_URL:config3.url}});if(execResult.code!==0||!execResult.stdout)throw new Error(`headersHelper for MCP server '${serverName}' did not return a valid value`);let result2=execResult.stdout.trim(),headers=jsonParse(result2);if(typeof headers!="object"||headers===null||Array.isArray(headers))throw new Error(`headersHelper for MCP server '${serverName}' must return a JSON object with string key-value pairs`);for(let[key3,value]of Object.entries(headers))if(typeof value!="string")throw new Error(`headersHelper for MCP server '${serverName}' returned non-string value for key "${key3}": ${typeof value}`);return logMCPDebug(serverName,`Successfully retrieved ${Object.keys(headers).length} headers from headersHelper`),headers}catch(error40){return logMCPError(serverName,`Error getting headers from headersHelper: ${errorMessage2(error40)}`),logError2(new Error(`Error getting MCP headers from headersHelper for server '${serverName}': ${errorMessage2(error40)}`)),null}}async function getMcpServerHeaders(serverName,config3){let staticHeaders=config3.headers||{},dynamicHeaders=await getMcpHeadersFromHelper(serverName,config3)||{};return{...staticHeaders,...dynamicHeaders}}var init_headersHelper=__esm({"src/services/mcp/headersHelper.ts"(){init_state();init_config12();init_debug();init_errors2();init_execFileNoThrow();init_log3();init_slowOperations();init_analytics();__name(isMcpServerFromProjectOrLocalSettings,"isMcpServerFromProjectOrLocalSettings");__name(getMcpHeadersFromHelper,"getMcpHeadersFromHelper");__name(getMcpServerHeaders,"getMcpServerHeaders")}});var SdkControlClientTransport,init_SdkControlTransport=__esm({"src/services/mcp/SdkControlTransport.ts"(){SdkControlClientTransport=class{constructor(serverName,sendMcpMessage){this.serverName=serverName;this.sendMcpMessage=sendMcpMessage}serverName;sendMcpMessage;static{__name(this,"SdkControlClientTransport")}isClosed=!1;onclose;onerror;onmessage;async start(){}async send(message){if(this.isClosed)throw new Error("Transport is closed");let response=await this.sendMcpMessage(this.serverName,message);this.onmessage&&this.onmessage(response)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}}}});var mcpSkills_exports={};__export(mcpSkills_exports,{fetchMcpSkillsForClient:()=>fetchMcpSkillsForClient,loadMcpSkills:()=>loadMcpSkills});async function loadMcpSkills(..._args){return[]}var fetchMcpSkillsForClient,init_mcpSkills=__esm({"src/skills/mcpSkills.ts"(){init_memoize2();__name(loadMcpSkills,"loadMcpSkills");fetchMcpSkillsForClient=memoizeWithLRU(async(..._args)=>[],(...args)=>String(args[0]??""),16)}});var officialClavueMcp_exports={};__export(officialClavueMcp_exports,{OFFICIAL_CLAVUE_MCP_MARKER_ARG:()=>OFFICIAL_CLAVUE_MCP_MARKER_ARG,OFFICIAL_CLAVUE_MCP_SERVER_NAME:()=>OFFICIAL_CLAVUE_MCP_SERVER_NAME,OFFICIAL_CLAVUE_WEB_SEARCH_FQN:()=>OFFICIAL_CLAVUE_WEB_SEARCH_FQN,OFFICIAL_CLAVUE_WEB_SEARCH_TOOL:()=>OFFICIAL_CLAVUE_WEB_SEARCH_TOOL,OFFICIAL_MCP_SETTING_MODES:()=>OFFICIAL_MCP_SETTING_MODES,assertOfficialMcpNonPollutingConfig:()=>assertOfficialMcpNonPollutingConfig,buildOfficialClavueMcpConfig:()=>buildOfficialClavueMcpConfig,callOfficialClavueWebSearch:()=>callOfficialClavueWebSearch,cycleOfficialMcpSettingMode:()=>cycleOfficialMcpSettingMode,formatOfficialMcpSettingLabel:()=>formatOfficialMcpSettingLabel,formatOfficialWebSearchForAgent:()=>formatOfficialWebSearchForAgent,getOfficialClavueMcpAllowedTools:()=>getOfficialClavueMcpAllowedTools,getOfficialClavueMcpConfigsIfEligible:()=>getOfficialClavueMcpConfigsIfEligible,isOfficialClavueMcpServer:()=>isOfficialClavueMcpServer,normalizeOfficialMcpSettingMode:()=>normalizeOfficialMcpSettingMode,readOfficialMcpChromeSnapshot:()=>readOfficialMcpChromeSnapshot,readOfficialMcpSettingMode:()=>readOfficialMcpSettingMode,resolveOfficialClavueMcpGate:()=>resolveOfficialClavueMcpGate,shouldSkipAutoMcpForExplicitTools:()=>shouldSkipAutoMcpForExplicitTools});function normalizeOfficialMcpSettingMode(raw){if(raw===!0||raw===1)return"on";if(raw===!1||raw===0)return"off";let s2=String(raw??"").trim().toLowerCase();return!s2||s2==="auto"||s2==="default"?"auto":s2==="on"||s2==="true"||s2==="1"||s2==="yes"||s2==="enable"||s2==="enabled"?"on":s2==="off"||s2==="false"||s2==="0"||s2==="no"||s2==="disable"||s2==="disabled"?"off":"auto"}function readOfficialMcpSettingMode(override){if(override!=null)return normalizeOfficialMcpSettingMode(override);try{let settings=getInitialSettings();if(settings?.officialMcp!==void 0&&settings.officialMcp!==null)return normalizeOfficialMcpSettingMode(settings.officialMcp)}catch{}return"auto"}function resolveOfficialClavueMcpGate(options){let settingMode=options?.force!==void 0?normalizeOfficialMcpSettingMode(options.force.settingMode??"auto"):readOfficialMcpSettingMode();if(options?.force?.bare??isBareMode())return{enabled:!1,reason:"disabled_bare",hasToken:!1,officialCloud:!1,settingMode};if(options?.strictMcpConfig)return{enabled:!1,reason:"disabled_strict_mcp",hasToken:!1,officialCloud:!1,settingMode};let envRaw2=options?.force?.env!==void 0?options.force.env:process.env.CLAVUE_OFFICIAL_MCP;if(isEnvDefinedFalsy(envRaw2))return{enabled:!1,reason:"disabled_env",hasToken:!1,officialCloud:!1,settingMode};let hasToken=!!(options?.force?.token!==void 0?options.force.token:getMembershipSessionToken())?.trim(),officialCloud=options?.force?.officialCloud??isMembershipCloudProfileActive(),envOptIn=isEnvTruthy2(envRaw2);return hasToken?envOptIn?{enabled:!0,reason:"enabled_opt_in",hasToken:!0,officialCloud,settingMode}:settingMode==="off"?{enabled:!1,reason:"disabled_settings_off",hasToken:!0,officialCloud,settingMode}:settingMode==="on"?{enabled:!0,reason:"enabled_settings_on",hasToken:!0,officialCloud,settingMode}:officialCloud?{enabled:!0,reason:"enabled_official_cloud",hasToken:!0,officialCloud:!0,settingMode}:{enabled:!1,reason:"disabled_third_party_default",hasToken:!0,officialCloud:!1,settingMode}:{enabled:!1,reason:"disabled_no_token",hasToken:!1,officialCloud,settingMode}}function shouldSkipAutoMcpForExplicitTools(baseToolsCli,parseToolList){if(!Array.isArray(baseToolsCli)||baseToolsCli.length===0)return!1;let parsed=parseToolList([...baseToolsCli]);return parsed.length===0?!0:parsed.every(name=>{let n4=String(name||"").trim().toLowerCase();return n4?!(n4==="default"||n4==="all"||n4==="*"||n4==="mcp"||n4.startsWith("mcp__")||n4.startsWith("mcp:")):!0})}function cycleOfficialMcpSettingMode(current,delta=1){let modes=OFFICIAL_MCP_SETTING_MODES,idx=modes.indexOf(current),next=((idx<0?0:idx)+delta+modes.length)%modes.length;return modes[next]}function formatOfficialMcpSettingLabel(mode2,locale){let zh2=!locale||locale.toLowerCase()==="zh"||locale.toLowerCase().startsWith("zh"),ja=!!locale&&(locale.toLowerCase()==="ja"||locale.toLowerCase().startsWith("ja"));return mode2==="on"?zh2?"\u5F00":ja?"\u30AA\u30F3":"On":mode2==="off"?zh2?"\u5173":ja?"\u30AA\u30D5":"Off":zh2?"\u81EA\u52A8":ja?"\u81EA\u52D5":"Auto"}function readOfficialMcpChromeSnapshot(options){try{let gate=resolveOfficialClavueMcpGate({strictMcpConfig:options?.strictMcpConfig,force:options?.force}),zh2=!!options?.locale&&(options.locale.toLowerCase()==="zh"||options.locale.toLowerCase().startsWith("zh")),modeLabel3=formatOfficialMcpSettingLabel(gate.settingMode,options?.locale),summary=gate.enabled?zh2?`\u5B98\u65B9 MCP \xB7 ${modeLabel3} \xB7 \u751F\u6548 \xB7 soft-fail \u4E0D\u6321\u5F00\u53D1`:`Official MCP \xB7 ${modeLabel3} \xB7 active \xB7 soft-fail never blocks coding`:zh2?`\u5B98\u65B9 MCP \xB7 ${modeLabel3} \xB7 \u672A\u6CE8\u5165 \xB7 ${gate.reason}`:`Official MCP \xB7 ${modeLabel3} \xB7 inactive \xB7 ${gate.reason}`;return{mode:gate.settingMode,active:gate.enabled,reason:gate.reason,chip:gate.enabled?"mcp":"",summary}}catch{return{mode:"auto",active:!1,reason:"disabled_env",chip:"",summary:"Official MCP \xB7 unavailable"}}}function assertOfficialMcpNonPollutingConfig(cfg){let entry=cfg[OFFICIAL_CLAVUE_MCP_SERVER_NAME];return entry?!(entry.scope!=="dynamic"||entry.type!=="stdio"||!(Array.isArray(entry.args)?entry.args:[]).includes(OFFICIAL_CLAVUE_MCP_MARKER_ARG)):!0}function isOfficialClavueMcpServer(name){return name===OFFICIAL_CLAVUE_MCP_SERVER_NAME}function buildOfficialClavueMcpConfig(){return{[OFFICIAL_CLAVUE_MCP_SERVER_NAME]:{type:"stdio",command:process.execPath,args:[OFFICIAL_CLAVUE_MCP_MARKER_ARG],scope:"dynamic"}}}function getOfficialClavueMcpConfigsIfEligible(options){try{let gate=resolveOfficialClavueMcpGate({strictMcpConfig:options?.strictMcpConfig});return logForDebugging(`[official-mcp] gate enabled=${gate.enabled} reason=${gate.reason} mode=${gate.settingMode} cloud=${gate.officialCloud} token=${gate.hasToken} env=${process.env.CLAVUE_OFFICIAL_MCP??"unset"}`),gate.enabled?buildOfficialClavueMcpConfig():{}}catch(error40){return logForDebugging(`[official-mcp] inject skipped (soft-fail): ${errorMessage2(error40)}`,{level:"error"}),{}}}function getOfficialClavueMcpAllowedTools(){return[OFFICIAL_CLAVUE_WEB_SEARCH_FQN]}function resolveApiBase(){return(getMembershipLocalSession()?.apiBaseUrl||MEMBERSHIP_DEFAULT_API_BASE).replace(/\/+$/,"")}function toolsCallUrl(apiBase){return`${apiBase}/v1/mcp/tools/call`}async function callOfficialClavueWebSearch(input2){let query2=String(input2.query??"").trim();if(query2.length<2)return{ok:!1,softFail:!0,query:query2,results:[],count:0,error:"Search query too short"};let token=(input2.sessionToken!==void 0?input2.sessionToken:getMembershipSessionToken())?.trim();if(!token)return{ok:!1,softFail:!0,query:query2,results:[],count:0,error:"Sign in required for official web_search"};let apiBase=(input2.apiBaseUrl||resolveApiBase()).replace(/\/+$/,""),url3=toolsCallUrl(apiBase),timeoutMs=input2.timeoutMs??DEFAULT_TIMEOUT_MS,fetchImpl=input2.fetchImpl??globalThis.fetch.bind(globalThis),controller=new AbortController,onAbort=__name(()=>controller.abort(),"onAbort");input2.signal?.addEventListener("abort",onAbort,{once:!0});let timer2=setTimeout(()=>controller.abort(),timeoutMs);try{let response=await fetchImpl(url3,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${token}`,"User-Agent":`clavue-cli/${typeof MACRO<"u"?"13.9.1":process.env.npm_package_version||"dev"} official-mcp`,"X-Imux-Kind":"cli_official_mcp_web_search"},body:JSON.stringify({name:OFFICIAL_CLAVUE_WEB_SEARCH_TOOL,arguments:{query:query2},protocol:PROTOCOL}),signal:controller.signal}),text3=await response.text().catch(()=>""),json2=null;try{json2=text3?JSON.parse(text3):null}catch{json2=null}if(!response.ok){let msg=typeof json2?.message=="string"&&json2.message||typeof json2?.error=="string"&&json2.error||json2?.error&&typeof json2.error=="object"&&typeof json2.error.message=="string"&&json2.error.message||`Official web_search HTTP ${response.status}`;return logForDebugging(`[official-mcp] tools/call soft-fail status=${response.status}: ${msg}`),{ok:!1,softFail:!0,query:query2,results:[],count:0,requestId:typeof json2?.requestId=="string"?json2.requestId:void 0,error:String(msg),raw:json2}}let resultPayload=json2?.result??json2;return normalizeSearchResult(query2,resultPayload,json2)}catch(error40){let msg=errorMessage2(error40);return logForDebugging(`[official-mcp] tools/call soft-fail: ${msg}`),{ok:!1,softFail:!0,query:query2,results:[],count:0,error:msg.includes("abort")?"Official web_search timed out or was aborted":msg}}finally{clearTimeout(timer2),input2.signal?.removeEventListener("abort",onAbort)}}function normalizeSearchResult(query2,resultPayload,envelope){let rec=resultPayload&&typeof resultPayload=="object"?resultPayload:null,results=extractHits(rec),summary=typeof rec?.summary=="string"&&rec.summary||typeof rec?.text=="string"&&rec.text||void 0,count4=typeof rec?.count=="number"?rec.count:results.length,productModel=typeof envelope?.productModel=="string"&&envelope.productModel||typeof rec?.productModel=="string"&&rec.productModel||void 0,requestId=typeof envelope?.requestId=="string"?envelope.requestId:void 0;return!(rec?.ok!==!1)&&results.length===0&&!summary?{ok:!1,softFail:!0,query:query2,results:[],count:0,productModel,requestId,error:typeof rec?.error=="string"&&rec.error||"Official web_search returned no usable results",raw:resultPayload}:{ok:!0,softFail:!1,query:typeof rec?.query=="string"&&rec.query||query2,summary,results,count:count4,productModel,requestId,raw:resultPayload}}function extractHits(rec){if(!rec)return[];let hits=[],pushItem=__name(item=>{if(!item||typeof item!="object")return;let r2=item,title=String(r2.title??r2.name??"").trim(),url3=String(r2.url??r2.link??"").trim();if(!title&&!url3)return;let snippet=String(r2.snippet??r2.description??"").trim();hits.push({title:title||url3,url:url3||"",...snippet?{snippet}:{}})},"pushItem");if(Array.isArray(rec.results))for(let item of rec.results)pushItem(item);if(hits.length===0&&Array.isArray(rec.sources))for(let item of rec.sources)pushItem(item);return hits.slice(0,12)}function formatOfficialWebSearchForAgent(result2){if(result2.softFail||!result2.ok)return["Official Clavue web_search is temporarily unavailable.",result2.error?`Reason: ${result2.error}`:null,"Continue coding with repo tools (Read/Grep/Bash). Do not invent web facts.","The session is healthy \u2014 search failure must not block development."].filter(Boolean).join(`
5946
+ `;await appendFile7(auditPath(),line,{encoding:"utf-8",mode:384})}catch(error40){logForDebugging(`[computer-use] audit write failed: ${errorMessage2(error40)}`)}}var init_audit=__esm({"src/utils/computerUse/audit.ts"(){init_envUtils();init_debug();init_errors2();init_slowOperations();__name(auditPath,"auditPath");__name(appendComputerUseAudit,"appendComputerUseAudit")}});function fmtCoord(c4){return c4?`(${c4[0]}, ${c4[1]})`:""}function getComputerUseMCPRenderingOverrides(toolName4){return{userFacingName(){return`Computer Use[${toolName4}]`},renderToolUseMessage(input2){switch(toolName4){case"screenshot":case"cursor_position":case"list_granted_applications":case"read_clipboard":case"computer_status":return"";case"left_click":case"right_click":case"double_click":case"triple_click":case"mouse_move":return fmtCoord(input2.coordinate);case"left_click_drag":return input2.start_coordinate?`${fmtCoord(input2.start_coordinate)} \u2192 ${fmtCoord(input2.coordinate)}`:`to ${fmtCoord(input2.coordinate)}`;case"type":return typeof input2.text=="string"?`"${truncateToWidth(input2.text,40)}"`:"";case"key":return typeof input2.text=="string"?input2.text:"";case"scroll":return[input2.direction,input2.amount&&`\xD7${input2.amount}`,input2.coordinate&&`at ${fmtCoord(input2.coordinate)}`].filter(Boolean).join(" ");case"zoom":{let r2=input2.region;return Array.isArray(r2)&&r2.length===4?`[${r2[0]}, ${r2[1]}, ${r2[2]}, ${r2[3]}]`:""}case"wait":return typeof input2.duration=="number"?`${input2.duration}s`:"";case"write_clipboard":return typeof input2.text=="string"?`"${truncateToWidth(input2.text,40)}"`:"";case"open_application":return typeof input2.bundle_id=="string"?String(input2.bundle_id):"";case"inspect_ui":return typeof input2.bundle_id=="string"?String(input2.bundle_id):"";case"find_label":case"click_text":return[typeof input2.bundle_id=="string"?input2.bundle_id:"",typeof input2.query=="string"?`"${truncateToWidth(input2.query,32)}"`:""].filter(Boolean).join(" ");case"ui_action":return[input2.action,input2.path].filter(v2=>typeof v2=="string").join(" ");case"request_access":{let apps=input2.apps;return Array.isArray(apps)?apps.map(a2=>typeof a2?.displayName=="string"?a2.displayName:"").filter(Boolean).join(", "):""}default:return""}},renderToolResultMessage(output2,_progress,{verbose}){if(verbose||typeof output2!="object"||output2===null)return null;let summary=RESULT_SUMMARY[toolName4];return summary?(0,import_jsx_runtime58.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime58.jsx)(ThemedText,{dimColor:!0,children:summary})}):null}}}var import_jsx_runtime58,RESULT_SUMMARY,init_toolRendering=__esm({"src/utils/computerUse/toolRendering.tsx"(){init_MessageResponse();init_ink();init_format2();import_jsx_runtime58=__toESM(require_jsx_runtime());__name(fmtCoord,"fmtCoord");RESULT_SUMMARY={screenshot:"Captured",zoom:"Captured",request_access:"Access updated",left_click:"Clicked",right_click:"Clicked",double_click:"Clicked",triple_click:"Clicked",type:"Typed",key:"Pressed",scroll:"Scrolled",left_click_drag:"Dragged",open_application:"Opened",inspect_ui:"Inspected",ui_action:"Updated",find_label:"Found",click_text:"Clicked",computer_status:"Checked"};__name(getComputerUseMCPRenderingOverrides,"getComputerUseMCPRenderingOverrides")}});function asRecord10(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function asString(value){return typeof value=="string"?value:""}function extractInspectElements(payload){let root2=asRecord10(payload),raw=Array.isArray(payload)?payload:Array.isArray(root2?.elements)?root2.elements:[],out=[];for(let row3 of raw){let r2=asRecord10(row3);if(!r2)continue;let path40=asString(r2.path),role=asString(r2.role).trim()||"AXUnknown";if(!("path"in r2)&&!role)continue;let frameRaw=asRecord10(r2.frame),frame=frameRaw&&typeof frameRaw.x=="number"&&typeof frameRaw.y=="number"&&typeof frameRaw.width=="number"&&typeof frameRaw.height=="number"?{x:frameRaw.x,y:frameRaw.y,width:frameRaw.width,height:frameRaw.height}:void 0,actions=Array.isArray(r2.actions)?r2.actions.filter(a2=>typeof a2=="string"):void 0;out.push({path:asString(r2.path),role,subrole:asString(r2.subrole)||void 0,title:asString(r2.title)||void 0,description:asString(r2.description)||void 0,identifier:asString(r2.identifier)||void 0,value:asString(r2.value)||void 0,enabled:typeof r2.enabled=="boolean"?r2.enabled:void 0,actions,frame})}return out}function elementSearchBlob(el){return[el.title,el.description,el.identifier,el.value,el.role,el.subrole].filter(Boolean).join(" | ")}function matchesLabel(el,query2,exact){let q2=query2.trim();if(!q2)return!1;let fields=[el.title,el.description,el.identifier,el.value].map(f3=>(f3??"").trim()).filter(Boolean);if(fields.length===0)return!1;if(exact){let ql2=q2.toLowerCase();return fields.some(f3=>f3.toLowerCase()===ql2)}let ql=q2.toLowerCase();return fields.some(f3=>f3.toLowerCase().includes(ql))}function isLikelyInteractive(el){let role=el.role;return!!(/AXButton|AXCheckBox|AXRadioButton|AXPopUpButton|AXMenuItem|AXLink|AXTab|AXComboBox|AXTextField|AXTextArea|AXSearchField|AXSlider|AXIncrementor/i.test(role)||el.actions?.some(a2=>/AXPress|AXConfirm|AXShowMenu|AXOpen/i.test(a2)))}function findElementsByLabel(elements,query2,options){let exact=options?.exact===!0,role=options?.role?.trim(),limit=Math.max(1,Math.min(options?.limit??12,50)),q2=query2.trim();if(!q2)return[];let hits=elements.filter(el=>role&&el.role!==role&&el.subrole!==role||el.enabled===!1?!1:matchesLabel(el,q2,exact));return hits=[...hits].sort((a2,b3)=>{let aTitle=(a2.title??"").toLowerCase(),bTitle=(b3.title??"").toLowerCase(),ql=q2.toLowerCase(),aExact=aTitle===ql?0:1,bExact=bTitle===ql?0:1;if(aExact!==bExact)return aExact-bExact;let aIx=isLikelyInteractive(a2)?0:1,bIx=isLikelyInteractive(b3)?0:1;return aIx!==bIx?aIx-bIx:aTitle.length-bTitle.length}),hits.slice(0,limit)}function pickClickAction(el){let actions=el.actions??[];return actions.some(a2=>a2==="AXPress"||/Press/i.test(a2))?"press":actions.some(a2=>a2==="AXConfirm"||/Confirm/i.test(a2))?"confirm":/AXTextField|AXTextArea|AXSearchField|AXComboBox/i.test(el.role)||actions.some(a2=>/AXFocus|Focus/i.test(a2))?"focus":/AXButton|AXCheckBox|AXRadioButton|AXMenuItem|AXLink|AXTab/i.test(el.role)?"press":null}function frameCenter(frame){return{x:Math.round(frame.x+frame.width/2),y:Math.round(frame.y+frame.height/2)}}function summarizeElement(el){return{path:el.path,role:el.role,title:el.title,description:el.description,value:el.value,enabled:el.enabled,actions:el.actions,frame:el.frame,blob:elementSearchBlob(el).slice(0,120)}}var COMPUTER_USE_VERIFY_NUDGE,init_uiFind=__esm({"src/utils/computerUse/uiFind.ts"(){init_efficiencyLaw();__name(asRecord10,"asRecord");__name(asString,"asString");__name(extractInspectElements,"extractInspectElements");__name(elementSearchBlob,"elementSearchBlob");__name(matchesLabel,"matchesLabel");__name(isLikelyInteractive,"isLikelyInteractive");__name(findElementsByLabel,"findElementsByLabel");__name(pickClickAction,"pickClickAction");__name(frameCenter,"frameCenter");__name(summarizeElement,"summarizeElement");COMPUTER_USE_VERIFY_NUDGE=getComputerUseVerifyNudgeText()}});var wrapper_exports2={};__export(wrapper_exports2,{buildSessionContext:()=>buildSessionContext,getComputerUseMCPToolOverrides:()=>getComputerUseMCPToolOverrides});function tuc(){return currentToolUseContext}function formatLockHeld(holder){return`Computer use is in use by another Clavue session (${holder.slice(0,8)}...). Wait for that session to finish or run /exit there.`}function updateComputerUseState(update3){tuc().setAppState(previous2=>({...previous2,computerUseMcpState:update3(previous2.computerUseMcpState??{})}))}function buildSessionContext(){return{getAllowedApps:__name(()=>tuc().getAppState().computerUseMcpState?.allowedApps??[],"getAllowedApps"),getGrantFlags:__name(()=>tuc().getAppState().computerUseMcpState?.grantFlags??DEFAULT_GRANT_FLAGS,"getGrantFlags"),getSelectedDisplayId:__name(()=>tuc().getAppState().computerUseMcpState?.selectedDisplayId,"getSelectedDisplayId"),getLastScreenshotDims:__name(()=>{let dims=tuc().getAppState().computerUseMcpState?.lastScreenshotDims;return dims?{...dims,displayId:dims.displayId??0,originX:dims.originX??0,originY:dims.originY??0}:void 0},"getLastScreenshotDims"),getAbortSignal:__name(()=>tuc().abortController.signal,"getAbortSignal"),onPermissionRequest:__name(request=>runPermissionDialog(request),"onPermissionRequest"),onAllowedAppsChanged:__name((apps,flags)=>updateComputerUseState(state5=>({...state5,allowedApps:apps,grantFlags:flags})),"onAllowedAppsChanged"),onAppsHidden:__name(bundleIds=>{bundleIds.length!==0&&updateComputerUseState(state5=>({...state5,hiddenDuringTurn:new Set([...state5.hiddenDuringTurn??[],...bundleIds])}))},"onAppsHidden"),onScreenshotCaptured:__name(dims=>updateComputerUseState(state5=>({...state5,lastScreenshotDims:dims})),"onScreenshotCaptured"),checkCuLock:__name(async()=>{let result2=await checkComputerUseLock();return result2.kind==="free"?{holder:void 0,isSelf:!1}:result2.kind==="held_by_self"?{holder:getSessionId(),isSelf:!0}:{holder:result2.by,isSelf:!1}},"checkCuLock"),acquireCuLock:__name(async()=>{let result2=await tryAcquireComputerUseLock();if(result2.kind==="blocked")throw new Error(formatLockHeld(result2.by));if(result2.fresh){let escape2=await registerEscHotkey(()=>tuc().abortController.abort());tuc().sendOSNotification?.({message:escape2?"Clavue is using your computer - press Esc to stop":"Clavue is using your computer - press Ctrl+C to stop",notificationType:"computer_use_enter"})}},"acquireCuLock"),formatLockHeldMessage:formatLockHeld}}function text(content,isError2=!1){return{content:[{type:"text",text:content}],...isError2?{isError:isError2}:{}}}function objectText(value){return text(JSON.stringify(value))}function withVerifyNudge(result2,toolName4){if(result2.isError)return result2;let obligation=buildComputerUseVerifyObligation(toolName4),nudge=getComputerUseVerifyNudgeText(),content=result2.content.map(block2=>{if(block2.type!=="text"||typeof block2.text!="string")return block2;let raw=block2.text.trim();if(!raw.startsWith("{")&&!raw.startsWith("["))return block2;try{let parsed=JSON.parse(raw);if(parsed&&typeof parsed=="object"&&!Array.isArray(parsed))return{...block2,text:JSON.stringify({...parsed,verifyObligation:obligation})}}catch{}return block2});return{...result2,content:[...content,{type:"text",text:nudge}]}}async function assertScreenshotNotSensitiveFrontmost(){if(isComputerUseSensitiveAllowed())return;let frontmost=await getComputerUseFrontmostApp();if(frontmost&&isSensitiveComputerUseApp(frontmost.displayName,frontmost.bundleId))throw new Error(`Screenshot blocked: sensitive app frontmost (${frontmost.displayName||frontmost.bundleId}). Hide the vault or set CLAVUE_CU_ALLOW_SENSITIVE=1 only if intentional. A screenshot of a visible password is a leak.`)}async function ensureAppFrontmost(bundleId2){if((await getComputerUseFrontmostApp())?.bundleId===bundleId2)return;await openComputerUseApp(bundleId2),await sleep2(150);let activated=await getComputerUseFrontmostApp();if(activated?.bundleId!==bundleId2)throw new Error(`Could not bring ${bundleId2} to the foreground; ${activated?.displayName??"another application"} remains frontmost.`)}function stringArg(args,name){let value=args[name];if(typeof value!="string")throw new Error(`${name} must be a string`);return value}function numberArg(args,name,fallback){let value=args[name];if(value===void 0&&fallback!==void 0)return fallback;if(typeof value!="number"||!Number.isFinite(value))throw new Error(`${name} must be a finite number`);return value}function coordinateArg(args,name="coordinate"){let value=args[name];if(!Array.isArray(value)||value.length!==2||value.some(item=>typeof item!="number"||!Number.isFinite(item)))throw new Error(`${name} must be [x, y]`);return{x:value[0],y:value[1]}}function appByRequest(installed2,request){let normalized=request.trim().toLocaleLowerCase();return installed2.find(app=>app.bundleId.toLocaleLowerCase()===normalized)??installed2.find(app=>app.displayName.toLocaleLowerCase()===normalized)??installed2.find(app=>app.displayName.toLocaleLowerCase().includes(normalized))}function allowedSet(ctx){return new Set(ctx.getAllowedApps().map(app=>app.bundleId))}function requireAllowedBundle(ctx,bundleId2){if(!allowedSet(ctx).has(bundleId2))throw new Error(`Application ${bundleId2} is not granted. Call request_access first.`)}async function requireInputTarget(ctx){let frontmost=await getComputerUseFrontmostApp();if(!frontmost)throw new Error("No frontmost application is available.");let grant=ctx.getAllowedApps().find(app=>app.bundleId===frontmost.bundleId);if(!grant)throw new Error(`Frontmost application ${frontmost.displayName} (${frontmost.bundleId}) is not granted. Refusing keyboard input.`);return grant}async function requirePointTarget(ctx,point){let app=await getComputerUseAppUnderPoint(point.x,point.y);if(!app)throw new Error("No application window exists under that point.");let grant=ctx.getAllowedApps().find(candidate=>candidate.bundleId===app.bundleId);if(!grant)throw new Error(`Application under the point is ${app.displayName} (${app.bundleId}), which is not granted. Refusing pointer action.`);return grant}async function ensureLock(ctx){let state5=await ctx.checkCuLock();if(state5.holder&&!state5.isSelf)throw new Error(ctx.formatLockHeldMessage(state5.holder));state5.holder||await ctx.acquireCuLock()}async function ensureOsPermissions(){let state5=await getComputerUseCapabilities();if(!state5.accessibility||!state5.screenRecording)throw new Error(`macOS permissions missing: Accessibility=${state5.accessibility}, Screen Recording=${state5.screenRecording}. Call request_access to open the permission flow.`)}async function prepareGrantedApps(ctx){let hidden2=await prepareComputerUseApps([...allowedSet(ctx)]);ctx.onAppsHidden(hidden2)}async function assertScreenshotIsFiltered(ctx){let allowed=allowedSet(ctx),blocked=(await listVisibleComputerUseApps()).filter(app=>!allowed.has(app.bundleId)&&!SAFE_SYSTEM_CHROME.has(app.bundleId.toLowerCase()));if(blocked.length>0)throw new Error(`Screenshot blocked because ungranted windows remain visible: ${blocked.map(app=>`${app.displayName} (${app.bundleId})`).join(", ")}. Resolve or grant those windows, then retry.`)}function screenshotDims(capture,display){return{width:capture.width,height:capture.height,displayWidth:display.width,displayHeight:display.height,displayId:display.id,originX:display.x,originY:display.y}}function scaleFromScreenshot(ctx,point){let dims=ctx.getLastScreenshotDims();return dims?{x:Math.round(dims.originX+point.x*dims.displayWidth/dims.width),y:Math.round(dims.originY+point.y*dims.displayHeight/dims.height)}:point}function classifyRiskyElement(element){if(!element||typeof element!="object")return;let record2=element,target=[record2.title,record2.description,record2.identifier,record2.value].filter(value=>typeof value=="string").join(" | ");if(record2.subrole==="AXCloseButton")return{risk:"This will close a local window or tab and may discard unsaved work.",target:target||"macOS close control"};if(!target)return;let match=RISK_PATTERNS.find(candidate=>candidate.pattern.test(target));return match?{risk:match.risk,target}:void 0}function uiElementFingerprint(element){if(!element||typeof element!="object")return"";let record2=element;return JSON.stringify([record2.path,record2.role,record2.subrole,record2.title,record2.description,record2.identifier,record2.value])}async function confirmRiskyUiAction(element){let risk=classifyRiskyElement(element);if(!risk)return!1;if(!await runActionConfirmation(risk))throw new Error("Risky Computer Use action was cancelled by the user.");return!0}async function confirmDeclaredRisk(args,meta){let risk=stringArg(args,"risk"),intent=stringArg(args,"intent");if(risk==="none")return!1;if(!await runActionConfirmation({target:intent,risk:`The model declared this action as ${risk}.`}))throw isComputerUseConsentRisk(risk)&&appendComputerUseAudit({ts:new Date().toISOString(),tool:meta?.tool??"unknown",risk,intent,bundleId:meta?.bundleId,confirmed:!1,sessionId:getSessionId(),note:"user_cancelled"}),new Error("Declared-risk Computer Use action was cancelled by the user.");return isComputerUseConsentRisk(risk)&&appendComputerUseAudit({ts:new Date().toISOString(),tool:meta?.tool??"unknown",risk,intent,bundleId:meta?.bundleId,confirmed:!0,sessionId:getSessionId()}),!0}async function requestAccess(ctx,args){let requested=args.apps;if(!Array.isArray(requested)||requested.some(item=>typeof item!="string"))throw new Error("apps must be an array of application names or bundle identifiers");let tcc=await getComputerUseCapabilities();if(!tcc.accessibility||!tcc.screenRecording)return await ctx.onPermissionRequest({apps:[],requestedFlags:{},tccState:tcc}),objectText({granted:!1,reason:"macOS permissions are incomplete",...tcc});let installed2=await listComputerUseInstalledApps(),existing=ctx.getAllowedApps(),requestedApps=requested.map(value=>{let resolved=appByRequest(installed2,value);return{requestedName:value,resolved,alreadyGranted:resolved?existing.some(grant=>grant.bundleId===resolved.bundleId):!1}}),requestedFlags={clipboardRead:args.clipboard_read===!0,clipboardWrite:args.clipboard_write===!0,systemKeyCombos:args.system_key_combos===!0},response=await ctx.onPermissionRequest({apps:requestedApps,requestedFlags,reason:typeof args.reason=="string"?args.reason:void 0}),merged=new Map(existing.map(app=>[app.bundleId,app]));for(let grant of response.granted)merged.set(grant.bundleId,grant);let flags={clipboardRead:ctx.getGrantFlags().clipboardRead||response.flags.clipboardRead,clipboardWrite:ctx.getGrantFlags().clipboardWrite||response.flags.clipboardWrite,systemKeyCombos:ctx.getGrantFlags().systemKeyCombos||response.flags.systemKeyCombos};return ctx.onAllowedAppsChanged([...merged.values()],flags),objectText({granted:response.granted,denied:response.denied,flags})}async function dispatch(toolName4,args,ctx){if(toolName4==="computer_status"){let[capabilities,displays,running,frontmost,bridgeWarm]=await Promise.all([getComputerUseCapabilities(),listComputerUseDisplays(),listComputerUseRunningApps(),getComputerUseFrontmostApp(),warmComputerUseBridge()]);return objectText({capabilities,displays,frontmost,runningApps:running,bridgeWarm})}if(toolName4==="request_access")return requestAccess(ctx,args);if(toolName4==="list_granted_applications")return objectText({apps:ctx.getAllowedApps(),flags:ctx.getGrantFlags()});await ensureOsPermissions(),await ensureLock(ctx);let signal=ctx.getAbortSignal();if(signal.aborted)throw new Error("Computer Use action was aborted.");switch(toolName4){case"open_application":{let bundleId2=stringArg(args,"bundle_id");return requireAllowedBundle(ctx,bundleId2),await openComputerUseApp(bundleId2),text(`Opened ${bundleId2}.`)}case"screenshot":{if(ctx.getAllowedApps().length===0)throw new Error("No applications are granted.");await prepareGrantedApps(ctx),await assertScreenshotIsFiltered(ctx),await assertScreenshotNotSensitiveFrontmost();let display=await getComputerUseDisplay(typeof args.display_id=="number"?args.display_id:ctx.getSelectedDisplayId()),capture=await captureComputerUseScreenshot({displayId:display.id,signal});return ctx.onScreenshotCaptured(screenshotDims(capture,display)),{content:[{type:"image",data:capture.base64,mimeType:capture.mediaType},{type:"text",text:`Display ${display.name}: screenshot ${capture.width}x${capture.height}; logical display ${display.width}x${display.height}. Coordinates in this image are scaled automatically for pointer tools. Prefer inspect_ui/find_label for targeting \u2014 full screenshot is last-resort eyes.`}]}}case"zoom":{let region=args.region;if(!Array.isArray(region)||region.length!==4||region.some(v2=>typeof v2!="number"))throw new Error("region must be [x, y, width, height]");await prepareGrantedApps(ctx),await assertScreenshotIsFiltered(ctx),await assertScreenshotNotSensitiveFrontmost();let[x3,y2,width,height]=region,capture=await captureComputerUseScreenshot({region:{x:x3,y:y2,width,height},signal});return{content:[{type:"image",data:capture.base64,mimeType:capture.mediaType}]}}case"inspect_ui":{let bundleId2=stringArg(args,"bundle_id");return requireAllowedBundle(ctx,bundleId2),objectText(await inspectComputerUseUi({bundleId:bundleId2,maxDepth:numberArg(args,"max_depth",6),maxElements:numberArg(args,"max_elements",120),includeMenuBar:args.include_menu_bar===!0}))}case"ui_action":{let bundleId2=stringArg(args,"bundle_id");requireAllowedBundle(ctx,bundleId2),await ensureAppFrontmost(bundleId2);let path40=stringArg(args,"path"),targetBefore=await describeComputerUseUiElement({bundleId:bundleId2,path:path40}),confirmed=await confirmDeclaredRisk(args,{tool:"ui_action",bundleId:bundleId2}),labelConfirmed=confirmed?!1:await confirmRiskyUiAction(targetBefore);if(confirmed||labelConfirmed){let targetAfter=await describeComputerUseUiElement({bundleId:bundleId2,path:path40});if(uiElementFingerprint(targetBefore)!==uiElementFingerprint(targetAfter))throw new Error("The confirmed UI target changed before execution. Inspect the UI again.")}return withVerifyNudge(objectText(await actOnComputerUseUi({bundleId:bundleId2,path:path40,action:stringArg(args,"action"),value:typeof args.value=="string"?args.value:void 0})),"ui_action")}case"find_label":{let bundleId2=stringArg(args,"bundle_id");requireAllowedBundle(ctx,bundleId2);let query2=stringArg(args,"query"),inspected=await inspectComputerUseUi({bundleId:bundleId2,maxDepth:numberArg(args,"max_depth",6),maxElements:numberArg(args,"max_elements",120),includeMenuBar:!1}),elements=extractInspectElements(inspected),matches2=findElementsByLabel(elements,query2,{exact:args.exact===!0,role:typeof args.role=="string"?args.role:void 0,limit:numberArg(args,"limit",12)});return objectText({bundleId:bundleId2,query:query2,exact:args.exact===!0,matchCount:matches2.length,matches:matches2.map(summarizeElement),hint:matches2.length===0?"No matches. Try substring query, broader role, or inspect_ui manually.":matches2.length===1?"One match \u2014 use click_text or ui_action with path.":"Multiple matches \u2014 pass exact=true or role=AXButton, or pick path for ui_action."})}case"click_text":{let bundleId2=stringArg(args,"bundle_id");requireAllowedBundle(ctx,bundleId2),await ensureAppFrontmost(bundleId2);let query2=stringArg(args,"query"),inspected=await inspectComputerUseUi({bundleId:bundleId2,maxDepth:numberArg(args,"max_depth",6),maxElements:numberArg(args,"max_elements",120),includeMenuBar:!1}),elements=extractInspectElements(inspected),matches2=findElementsByLabel(elements,query2,{exact:args.exact===!0,role:typeof args.role=="string"?args.role:void 0,limit:8});if(matches2.length===0)throw new Error(`No UI element matching "${query2}" in ${bundleId2}. Try find_label or inspect_ui.`);if(matches2.length>1&&args.exact!==!0)return objectText({ok:!1,reason:"ambiguous",query:query2,matchCount:matches2.length,matches:matches2.map(summarizeElement),hint:"Pass exact=true, role=\u2026, or call ui_action with a chosen path."});let target=matches2[0],targetBefore=await describeComputerUseUiElement({bundleId:bundleId2,path:target.path}),confirmed=await confirmDeclaredRisk(args,{tool:"click_text",bundleId:bundleId2}),labelConfirmed=confirmed?!1:await confirmRiskyUiAction(targetBefore);if(confirmed||labelConfirmed){let targetAfter=await describeComputerUseUiElement({bundleId:bundleId2,path:target.path});if(uiElementFingerprint(targetBefore)!==uiElementFingerprint(targetAfter))throw new Error("The confirmed UI target changed before execution. Inspect the UI again.")}let axAction=pickClickAction(target);if(axAction){let acted=await actOnComputerUseUi({bundleId:bundleId2,path:target.path,action:axAction});return withVerifyNudge(objectText({ok:!0,method:"ax",action:axAction,target:summarizeElement(target),result:acted}),"click_text")}if(!target.frame)throw new Error(`Matched "${query2}" at path ${target.path} but no AXPress action and no frame for click.`);let point=frameCenter(target.frame);return await requirePointTarget(ctx,point),await clickComputerUseMouse({...point,button:"left",count:1}),withVerifyNudge(objectText({ok:!0,method:"frame_click",coordinate:[point.x,point.y],target:summarizeElement(target)}),"click_text")}case"mouse_move":{let point=scaleFromScreenshot(ctx,coordinateArg(args));return await moveComputerUseMouse(point.x,point.y),text(`Moved to (${point.x}, ${point.y}).`)}case"left_click":case"right_click":case"double_click":case"triple_click":{let point=scaleFromScreenshot(ctx,coordinateArg(args));await requirePointTarget(ctx,point);let targetBefore=await getComputerUseUiElementAtPoint(point.x,point.y),confirmed=await confirmDeclaredRisk(args,{tool:toolName4}),labelConfirmed=confirmed?!1:await confirmRiskyUiAction(targetBefore);if(confirmed||labelConfirmed){let targetAfter=await getComputerUseUiElementAtPoint(point.x,point.y);if(uiElementFingerprint(targetBefore)!==uiElementFingerprint(targetAfter))throw new Error("The confirmed pointer target changed before execution. Take a new screenshot and retry.")}return await clickComputerUseMouse({...point,button:toolName4==="right_click"?"right":"left",count:toolName4==="double_click"?2:toolName4==="triple_click"?3:1}),withVerifyNudge(text(`Clicked (${point.x}, ${point.y}).`),toolName4)}case"left_click_drag":{await confirmDeclaredRisk(args,{tool:"left_click_drag"});let from=scaleFromScreenshot(ctx,coordinateArg(args,"start_coordinate")),to=scaleFromScreenshot(ctx,coordinateArg(args));return await requirePointTarget(ctx,from),await dragComputerUseMouse(from,to),withVerifyNudge(text(`Dragged (${from.x}, ${from.y}) to (${to.x}, ${to.y}).`),"left_click_drag")}case"scroll":{if(args.coordinate){let point=scaleFromScreenshot(ctx,coordinateArg(args));await requirePointTarget(ctx,point),await moveComputerUseMouse(point.x,point.y)}else await requireInputTarget(ctx);let amount=numberArg(args,"amount",3)*120,direction=stringArg(args,"direction");return await scrollComputerUseMouse(direction==="left"?-amount:direction==="right"?amount:0,direction==="up"?amount:direction==="down"?-amount:0),text(`Scrolled ${direction}.`)}case"type":return await requireInputTarget(ctx),await confirmDeclaredRisk(args,{tool:"type"}),await typeComputerUseText(stringArg(args,"text")),withVerifyNudge(text("Typed text."),"type");case"key":{await requireInputTarget(ctx),await confirmDeclaredRisk(args,{tool:"key"});let keys2=stringArg(args,"text").split("+").filter(Boolean);if(keys2.length>1&&!ctx.getGrantFlags().systemKeyCombos)throw new Error("System key combinations were not granted. Call request_access with system_key_combos=true.");let repeat3=numberArg(args,"repeat",1);keys2.length===1&&["escape","esc"].includes(keys2[0].toLowerCase())&&void 0;for(let index=0;index<repeat3;index++)await pressComputerUseKeys(keys2);return withVerifyNudge(text(`Pressed ${keys2.join("+")}.`),"key")}case"wait":return await sleep2(numberArg(args,"duration")*1e3),text("Wait complete.");case"cursor_position":return objectText(await getComputerUseCursorPosition());case"read_clipboard":{if(!ctx.getGrantFlags().clipboardRead)throw new Error("Clipboard read was not granted.");let result2=await execFileNoThrow("/usr/bin/pbpaste",[],{useCwd:!1});if(result2.code!==0)throw new Error("Failed to read clipboard.");return text(result2.stdout)}case"write_clipboard":{if(!ctx.getGrantFlags().clipboardWrite)throw new Error("Clipboard write was not granted.");if((await execFileNoThrow("/usr/bin/pbcopy",[],{useCwd:!1,input:stringArg(args,"text"),stdin:"pipe"})).code!==0)throw new Error("Failed to write clipboard.");return text("Clipboard updated.")}default:throw new Error(`Unsupported Computer Use tool: ${toolName4}`)}}function getComputerUseMCPToolOverrides(toolName4){let call84=__name(async(rawArgs,context3)=>{if(currentToolUseContext=context3,context3.agentId)return{data:[{type:"text",text:"Computer Use is owned by the interactive main session. Ask the main Clavue turn to perform this UI action."}]};try{return{data:(await dispatch(toolName4,rawArgs??{},buildSessionContext())).content.map(item=>item.type==="image"?{type:"image",source:{type:"base64",media_type:item.mimeType,data:item.data}}:{type:"text",text:item.text})}}catch(error40){return{data:[{type:"text",text:`Computer Use failed: ${error40 instanceof Error?error40.message:String(error40)}`}]}}},"call");return{...getComputerUseMCPRenderingOverrides(toolName4),call:call84}}async function runActionConfirmation(risk){let context3=tuc(),setToolJSX=context3.setToolJSX;if(!setToolJSX)return!1;try{return await new Promise((resolve67,reject2)=>{let signal=context3.abortController.signal;if(signal.aborted){reject2(new Error("Computer Use action confirmation aborted"));return}let onAbort=__name(()=>reject2(new Error("Computer Use action confirmation aborted")),"onAbort");signal.addEventListener("abort",onAbort,{once:!0}),setToolJSX({jsx:React24.createElement(ComputerUseActionApproval,{...risk,onDone:__name(approved=>{signal.removeEventListener("abort",onAbort),resolve67(approved)},"onDone")}),shouldHidePromptInput:!0})})}finally{setToolJSX(null)}}async function runPermissionDialog(request){let context3=tuc(),setToolJSX=context3.setToolJSX;if(!setToolJSX)return{granted:[],denied:[],flags:DEFAULT_GRANT_FLAGS};try{return await new Promise((resolve67,reject2)=>{let signal=context3.abortController.signal;if(signal.aborted){reject2(new Error("Computer Use permission dialog aborted"));return}let onAbort=__name(()=>reject2(new Error("Computer Use permission dialog aborted")),"onAbort");signal.addEventListener("abort",onAbort,{once:!0}),setToolJSX({jsx:React24.createElement(ComputerUseApproval,{request,onDone:__name(response=>{signal.removeEventListener("abort",onAbort),resolve67(response)},"onDone")}),shouldHidePromptInput:!0})})}finally{setToolJSX(null)}}var React24,currentToolUseContext,SAFE_SYSTEM_CHROME,RISK_PATTERNS,init_wrapper2=__esm({"src/utils/computerUse/wrapper.tsx"(){React24=__toESM(require_react());init_state();init_ComputerUseApproval();init_sleep2();init_computerUseLock();init_executor();init_execFileNoThrow();init_escHotkey();init_audit();init_efficiencyLaw();init_toolRendering();init_uiFind();init_types17();__name(tuc,"tuc");__name(formatLockHeld,"formatLockHeld");__name(updateComputerUseState,"updateComputerUseState");__name(buildSessionContext,"buildSessionContext");__name(text,"text");__name(objectText,"objectText");__name(withVerifyNudge,"withVerifyNudge");__name(assertScreenshotNotSensitiveFrontmost,"assertScreenshotNotSensitiveFrontmost");__name(ensureAppFrontmost,"ensureAppFrontmost");__name(stringArg,"stringArg");__name(numberArg,"numberArg");__name(coordinateArg,"coordinateArg");__name(appByRequest,"appByRequest");__name(allowedSet,"allowedSet");__name(requireAllowedBundle,"requireAllowedBundle");__name(requireInputTarget,"requireInputTarget");__name(requirePointTarget,"requirePointTarget");__name(ensureLock,"ensureLock");__name(ensureOsPermissions,"ensureOsPermissions");__name(prepareGrantedApps,"prepareGrantedApps");SAFE_SYSTEM_CHROME=new Set(["com.apple.dock","com.apple.systemuiserver","com.apple.controlcenter","com.apple.notificationcenterui"]);__name(assertScreenshotIsFiltered,"assertScreenshotIsFiltered");__name(screenshotDims,"screenshotDims");__name(scaleFromScreenshot,"scaleFromScreenshot");RISK_PATTERNS=[{pattern:/\b(delete|remove|erase|trash|close|cancel subscription|unsubscribe)\b|删除|移除|清除|关闭|取消订阅/i,risk:"This may delete data, remove access, or close local content."},{pattern:/\b(send|submit|publish|post|reply|message|share|upload)\b|发送|提交|发布|回复|分享|上传/i,risk:"This may communicate or transmit data to a third party."},{pattern:/\b(pay|purchase|buy|checkout|subscribe|confirm order)\b|付款|支付|购买|结账|订阅|确认订单/i,risk:"This may create or confirm a financial transaction."},{pattern:/\b(install|extension|allow|grant|permission|security|privacy|system settings)\b|安装|扩展|允许|授权|权限|安全|隐私|系统设置/i,risk:"This may install software or change a permission/system setting."},{pattern:/\b(password|passcode|otp|verification code|api key|credit card)\b|密码|验证码|密钥|信用卡/i,risk:"This may enter or expose sensitive authentication or financial data."}];__name(classifyRiskyElement,"classifyRiskyElement");__name(uiElementFingerprint,"uiElementFingerprint");__name(confirmRiskyUiAction,"confirmRiskyUiAction");__name(confirmDeclaredRisk,"confirmDeclaredRisk");__name(requestAccess,"requestAccess");__name(dispatch,"dispatch");__name(getComputerUseMCPToolOverrides,"getComputerUseMCPToolOverrides");__name(runActionConfirmation,"runActionConfirmation");__name(runPermissionDialog,"runPermissionDialog")}});function crossCheckNativeMcpToolList(client2,jsTools){if(!isNativeModuleEnabled2("mcp")||client2.config.type!=="stdio"&&client2.config.type||!("command"in client2.config))return;let handle=null;try{let connected=nativeMcpConnect({name:client2.name,command:client2.config.command,args:client2.config.args??[],env:client2.config.env});if(!connected)return;handle=connected.handle;let nativeTools=nativeMcpListTools(handle);if(!nativeTools)return;let jsNames=jsTools.map(tool=>tool.name),nativeNames=nativeTools.map(tool=>tool.name);jsNames.length!==nativeNames.length&&logMCPDebug(client2.name,`native mcp tool count differs: js=${jsNames.length} rust=${nativeNames.length}`);for(let i3=0;i3<Math.min(jsNames.length,nativeNames.length);i3++)if(jsNames[i3]!==nativeNames[i3]){logMCPDebug(client2.name,`native mcp tool order differs at ${i3}: js=${jsNames[i3]} rust=${nativeNames[i3]}`);break}for(let jsTool of jsTools){let nativeTool=nativeTools.find(tool=>tool.name===jsTool.name);nativeTool&&JSON.stringify(nativeTool.inputSchema)!==JSON.stringify(jsTool.inputSchema)&&logMCPDebug(client2.name,`native mcp inputSchema differs for '${jsTool.name}'`)}}catch(error40){logMCPDebug(client2.name,`native mcp cross-check skipped: ${errorMessage2(error40)}`)}finally{if(handle)try{nativeMcpClose(handle)}catch{}}}function createFetchToolsForClient({ensureConnectedClient:ensureConnectedClient2,callMCPToolWithUrlElicitationRetry:callMCPToolWithUrlElicitationRetry2}){return memoizeWithLRU(async client2=>{if(client2.type!=="connected")return[];try{if(!client2.capabilities?.tools)return[];let result2=await client2.client.request({method:"tools/list"},ListToolsResultSchema),toolsToProcess=recursivelySanitizeUnicode(result2.tools),skipPrefix=client2.config.type==="sdk"&&isEnvTruthy2(process.env.CLAUDE_AGENT_SDK_MCP_NO_PREFIX);return crossCheckNativeMcpToolList(client2,toolsToProcess),toolsToProcess.filter(tool=>{let name=buildMcpToolName(client2.name,tool.name);return mcpToolNameTooLong(name)?(logMCPError(client2.name,recordMcpToolNameError(name)),!1):!0}).map(tool=>{let fullyQualifiedName=buildMcpToolName(client2.name,tool.name);return{...MCPTool,name:skipPrefix?tool.name:fullyQualifiedName,mcpInfo:{serverName:client2.name,toolName:tool.name},isMcp:!0,searchHint:typeof tool._meta?.["anthropic/searchHint"]=="string"&&tool._meta["anthropic/searchHint"].replace(/\s+/g," ").trim()||void 0,alwaysLoad:tool._meta?.["anthropic/alwaysLoad"]===!0,async description(){return tool.description??""},async prompt(){let desc=tool.description??"";return desc.length>MAX_MCP_DESCRIPTION_LENGTH?desc.slice(0,MAX_MCP_DESCRIPTION_LENGTH)+"\u2026 [truncated]":desc},isConcurrencySafe(){return tool.annotations?.readOnlyHint??!1},isReadOnly(){return tool.annotations?.readOnlyHint??!1},toAutoClassifierInput(input2){return mcpToolInputToAutoClassifierInput(input2,tool.name)},isDestructive(){return tool.annotations?.destructiveHint??!1},isOpenWorld(){return tool.annotations?.openWorldHint??!1},isSearchOrReadCommand(){return classifyMcpToolForCollapse(client2.name,tool.name)},inputJSONSchema:tool.inputSchema,async checkPermissions(){return{behavior:"passthrough",message:"MCPTool requires permission.",suggestions:[{type:"addRules",rules:[{toolName:fullyQualifiedName,ruleContent:void 0}],behavior:"allow",destination:"localSettings"}]}},async call(args,context3,_canUseTool,parentMessage,onProgress){let toolUseId2=extractToolUseId(parentMessage),meta=toolUseId2?{"claudecode/toolUseId":toolUseId2}:{};onProgress&&toolUseId2&&onProgress({toolUseID:toolUseId2,data:{type:"mcp_progress",status:"started",serverName:client2.name,toolName:tool.name}});let startTime=Date.now(),MAX_SESSION_RETRIES=1,MAX_TRANSIENT_RETRIES=tool.annotations?.readOnlyHint?1:0,sessionRetries=0,transientRetries=0;for(;;)try{let connectedClient=await ensureConnectedClient2(client2),mcpResult=await callMCPToolWithUrlElicitationRetry2({client:connectedClient,clientConnection:client2,tool:tool.name,args,meta,signal:context3.abortController.signal,setAppState:context3.setAppState,onProgress:onProgress&&toolUseId2?progressData=>{onProgress({toolUseID:toolUseId2,data:progressData})}:void 0,handleElicitation:context3.handleElicitation});return onProgress&&toolUseId2&&onProgress({toolUseID:toolUseId2,data:{type:"mcp_progress",status:"completed",serverName:client2.name,toolName:tool.name,elapsedTimeMs:Date.now()-startTime}}),{data:mcpResult.content,...(mcpResult._meta||mcpResult.structuredContent)&&{mcpMeta:{...mcpResult._meta&&{_meta:mcpResult._meta},...mcpResult.structuredContent&&{structuredContent:mcpResult.structuredContent}}}}}catch(error40){if(error40 instanceof McpSessionExpiredError&&sessionRetries<MAX_SESSION_RETRIES){sessionRetries++,logMCPDebug(client2.name,`Retrying tool '${tool.name}' after session recovery`);continue}if(transientRetries<MAX_TRANSIENT_RETRIES&&isMcpTransientToolCallError(error40)){transientRetries++,logMCPDebug(client2.name,`Retrying read-only tool '${tool.name}' after transient transport failure`);continue}if(onProgress&&toolUseId2&&onProgress({toolUseID:toolUseId2,data:{type:"mcp_progress",status:"failed",serverName:client2.name,toolName:tool.name,elapsedTimeMs:Date.now()-startTime}}),error40 instanceof Error&&!(error40 instanceof TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS)){let name=error40.constructor.name;if(name==="Error")throw new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(error40.message,error40.message.slice(0,200));if(name==="McpError"&&"code"in error40&&typeof error40.code=="number")throw new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(error40.message,`McpError ${error40.code}`)}throw error40}},userFacingName(){let displayName=tool.annotations?.title||tool.name;return`${client2.name} - ${displayName} (MCP)`},...(client2.config.type==="stdio"||!client2.config.type)&&isComputerUseMCPServer2(client2.name)?computerUseWrapper().getComputerUseMCPToolOverrides(tool.name):{}}}).filter(isIncludedMcpTool)}catch(error40){return logMCPError(client2.name,`Failed to fetch tools: ${errorMessage2(error40)}`),[]}},client2=>client2.name,MCP_FETCH_CACHE_SIZE)}var computerUseWrapper,isComputerUseMCPServer2,init_toolFetcher=__esm({"src/services/mcp/toolFetcher.ts"(){init_types4();init_classifyForCollapse();init_MCPTool();init_envUtils();init_errors2();init_log3();init_memoize2();init_sanitization();init_connectionUtils();init_mcpStringUtils();init_mcpSchemaFallback();init_utils10();init_toolCaller();init_bridge();init_mcp();computerUseWrapper=()=>(init_wrapper2(),__toCommonJS(wrapper_exports2)),isComputerUseMCPServer2=(init_common(),__toCommonJS(common_exports)).isComputerUseMCPServer;__name(crossCheckNativeMcpToolList,"crossCheckNativeMcpToolList");__name(createFetchToolsForClient,"createFetchToolsForClient")}});function getServerNameForElicitation(clientConnection){return clientConnection.type==="connected"?clientConnection.name:"unknown"}function getValidUrlElicitations(errorData){return(errorData!=null&&typeof errorData=="object"&&"elicitations"in errorData&&Array.isArray(errorData.elicitations)?errorData.elicitations:[]).filter(e2=>{if(e2==null||typeof e2!="object")return!1;let obj=e2;return obj.mode==="url"&&typeof obj.url=="string"&&typeof obj.elicitationId=="string"&&typeof obj.message=="string"})}function formatUrlElicitationBlockedMessage(tool,action,actor){return`URL elicitation was ${action==="decline"?"declined":action+"ed"} by ${actor==="hook"?"a hook":"the user"}. The tool "${tool}" could not complete because it requires the user to open a URL.`}async function queueUrlElicitation({serverName,elicitation,signal,setAppState}){let waitingState={actionLabel:"Retry now",showCancel:!0};return new Promise(resolve67=>{let onAbort=__name(()=>{resolve67({action:"cancel"})},"onAbort");if(signal.aborted){onAbort();return}signal.addEventListener("abort",onAbort,{once:!0}),setAppState(prev=>({...prev,elicitation:{queue:[...prev.elicitation.queue,{serverName,requestId:`error-elicit-${elicitation.elicitationId}`,params:elicitation,signal,waitingState,respond:__name(result2=>{result2.action!=="accept"&&(signal.removeEventListener("abort",onAbort),resolve67(result2))},"respond"),onWaitingDismiss:__name(action=>{signal.removeEventListener("abort",onAbort),resolve67(action==="retry"?{action:"accept"}:{action:"cancel"})},"onWaitingDismiss")}]}}))})}var init_urlElicitation=__esm({"src/services/mcp/urlElicitation.ts"(){__name(getServerNameForElicitation,"getServerNameForElicitation");__name(getValidUrlElicitations,"getValidUrlElicitations");__name(formatUrlElicitationBlockedMessage,"formatUrlElicitationBlockedMessage");__name(queueUrlElicitation,"queueUrlElicitation")}});function isMcpServerFromProjectOrLocalSettings(config3){return config3.scope==="project"||config3.scope==="local"}async function getMcpHeadersFromHelper(serverName,config3){if(!config3.headersHelper)return null;if("scope"in config3&&isMcpServerFromProjectOrLocalSettings(config3)&&!getIsNonInteractiveSession()&&!checkHasTrustDialogAccepted()){let error40=new Error(`Security: headersHelper for MCP server '${serverName}' executed before workspace trust is confirmed. If you see this message, post in https://github.com/anthropics/claude-code/issues.`);return logAntError("MCP headersHelper invoked before trust check",error40),logEvent("tengu_mcp_headersHelper_missing_trust",{}),null}try{logMCPDebug(serverName,"Executing headersHelper to get dynamic headers");let execResult=await execFileNoThrowWithCwd(config3.headersHelper,[],{shell:!0,timeout:1e4,env:{...process.env,CLAUDE_CODE_MCP_SERVER_NAME:serverName,CLAUDE_CODE_MCP_SERVER_URL:config3.url}});if(execResult.code!==0||!execResult.stdout)throw new Error(`headersHelper for MCP server '${serverName}' did not return a valid value`);let result2=execResult.stdout.trim(),headers=jsonParse(result2);if(typeof headers!="object"||headers===null||Array.isArray(headers))throw new Error(`headersHelper for MCP server '${serverName}' must return a JSON object with string key-value pairs`);for(let[key3,value]of Object.entries(headers))if(typeof value!="string")throw new Error(`headersHelper for MCP server '${serverName}' returned non-string value for key "${key3}": ${typeof value}`);return logMCPDebug(serverName,`Successfully retrieved ${Object.keys(headers).length} headers from headersHelper`),headers}catch(error40){return logMCPError(serverName,`Error getting headers from headersHelper: ${errorMessage2(error40)}`),logError2(new Error(`Error getting MCP headers from headersHelper for server '${serverName}': ${errorMessage2(error40)}`)),null}}async function getMcpServerHeaders(serverName,config3){let staticHeaders=config3.headers||{},dynamicHeaders=await getMcpHeadersFromHelper(serverName,config3)||{};return{...staticHeaders,...dynamicHeaders}}var init_headersHelper=__esm({"src/services/mcp/headersHelper.ts"(){init_state();init_config12();init_debug();init_errors2();init_execFileNoThrow();init_log3();init_slowOperations();init_analytics();__name(isMcpServerFromProjectOrLocalSettings,"isMcpServerFromProjectOrLocalSettings");__name(getMcpHeadersFromHelper,"getMcpHeadersFromHelper");__name(getMcpServerHeaders,"getMcpServerHeaders")}});var SdkControlClientTransport,init_SdkControlTransport=__esm({"src/services/mcp/SdkControlTransport.ts"(){SdkControlClientTransport=class{constructor(serverName,sendMcpMessage){this.serverName=serverName;this.sendMcpMessage=sendMcpMessage}serverName;sendMcpMessage;static{__name(this,"SdkControlClientTransport")}isClosed=!1;onclose;onerror;onmessage;async start(){}async send(message){if(this.isClosed)throw new Error("Transport is closed");let response=await this.sendMcpMessage(this.serverName,message);this.onmessage&&this.onmessage(response)}async close(){this.isClosed||(this.isClosed=!0,this.onclose?.())}}}});var mcpSkills_exports={};__export(mcpSkills_exports,{fetchMcpSkillsForClient:()=>fetchMcpSkillsForClient,loadMcpSkills:()=>loadMcpSkills});async function loadMcpSkills(..._args){return[]}var fetchMcpSkillsForClient,init_mcpSkills=__esm({"src/skills/mcpSkills.ts"(){init_memoize2();__name(loadMcpSkills,"loadMcpSkills");fetchMcpSkillsForClient=memoizeWithLRU(async(..._args)=>[],(...args)=>String(args[0]??""),16)}});var officialClavueMcp_exports={};__export(officialClavueMcp_exports,{OFFICIAL_CLAVUE_MCP_MARKER_ARG:()=>OFFICIAL_CLAVUE_MCP_MARKER_ARG,OFFICIAL_CLAVUE_MCP_SERVER_NAME:()=>OFFICIAL_CLAVUE_MCP_SERVER_NAME,OFFICIAL_CLAVUE_WEB_SEARCH_FQN:()=>OFFICIAL_CLAVUE_WEB_SEARCH_FQN,OFFICIAL_CLAVUE_WEB_SEARCH_TOOL:()=>OFFICIAL_CLAVUE_WEB_SEARCH_TOOL,OFFICIAL_MCP_SETTING_MODES:()=>OFFICIAL_MCP_SETTING_MODES,assertOfficialMcpNonPollutingConfig:()=>assertOfficialMcpNonPollutingConfig,buildOfficialClavueMcpConfig:()=>buildOfficialClavueMcpConfig,callOfficialClavueWebSearch:()=>callOfficialClavueWebSearch,cycleOfficialMcpSettingMode:()=>cycleOfficialMcpSettingMode,formatOfficialMcpSettingLabel:()=>formatOfficialMcpSettingLabel,formatOfficialWebSearchForAgent:()=>formatOfficialWebSearchForAgent,getOfficialClavueMcpAllowedTools:()=>getOfficialClavueMcpAllowedTools,getOfficialClavueMcpConfigsIfEligible:()=>getOfficialClavueMcpConfigsIfEligible,isOfficialClavueMcpServer:()=>isOfficialClavueMcpServer,normalizeOfficialMcpSettingMode:()=>normalizeOfficialMcpSettingMode,readOfficialMcpChromeSnapshot:()=>readOfficialMcpChromeSnapshot,readOfficialMcpSettingMode:()=>readOfficialMcpSettingMode,resolveOfficialClavueMcpGate:()=>resolveOfficialClavueMcpGate,shouldSkipAutoMcpForExplicitTools:()=>shouldSkipAutoMcpForExplicitTools});function normalizeOfficialMcpSettingMode(raw){if(raw===!0||raw===1)return"on";if(raw===!1||raw===0)return"off";let s2=String(raw??"").trim().toLowerCase();return!s2||s2==="auto"||s2==="default"?"auto":s2==="on"||s2==="true"||s2==="1"||s2==="yes"||s2==="enable"||s2==="enabled"?"on":s2==="off"||s2==="false"||s2==="0"||s2==="no"||s2==="disable"||s2==="disabled"?"off":"auto"}function readOfficialMcpSettingMode(override){if(override!=null)return normalizeOfficialMcpSettingMode(override);try{let settings=getInitialSettings();if(settings?.officialMcp!==void 0&&settings.officialMcp!==null)return normalizeOfficialMcpSettingMode(settings.officialMcp)}catch{}return"auto"}function resolveOfficialClavueMcpGate(options){let settingMode=options?.force!==void 0?normalizeOfficialMcpSettingMode(options.force.settingMode??"auto"):readOfficialMcpSettingMode();if(options?.force?.bare??isBareMode())return{enabled:!1,reason:"disabled_bare",hasToken:!1,officialCloud:!1,settingMode};if(options?.strictMcpConfig)return{enabled:!1,reason:"disabled_strict_mcp",hasToken:!1,officialCloud:!1,settingMode};let envRaw2=options?.force?.env!==void 0?options.force.env:process.env.CLAVUE_OFFICIAL_MCP;if(isEnvDefinedFalsy(envRaw2))return{enabled:!1,reason:"disabled_env",hasToken:!1,officialCloud:!1,settingMode};let hasToken=!!(options?.force?.token!==void 0?options.force.token:getMembershipSessionToken())?.trim(),officialCloud=options?.force?.officialCloud??isMembershipCloudProfileActive(),envOptIn=isEnvTruthy2(envRaw2);return hasToken?envOptIn?{enabled:!0,reason:"enabled_opt_in",hasToken:!0,officialCloud,settingMode}:settingMode==="off"?{enabled:!1,reason:"disabled_settings_off",hasToken:!0,officialCloud,settingMode}:settingMode==="on"?{enabled:!0,reason:"enabled_settings_on",hasToken:!0,officialCloud,settingMode}:officialCloud?{enabled:!0,reason:"enabled_official_cloud",hasToken:!0,officialCloud:!0,settingMode}:{enabled:!1,reason:"disabled_third_party_default",hasToken:!0,officialCloud:!1,settingMode}:{enabled:!1,reason:"disabled_no_token",hasToken:!1,officialCloud,settingMode}}function shouldSkipAutoMcpForExplicitTools(baseToolsCli,parseToolList){if(!Array.isArray(baseToolsCli)||baseToolsCli.length===0)return!1;let parsed=parseToolList([...baseToolsCli]);return parsed.length===0?!0:parsed.every(name=>{let n4=String(name||"").trim().toLowerCase();return n4?!(n4==="default"||n4==="all"||n4==="*"||n4==="mcp"||n4.startsWith("mcp__")||n4.startsWith("mcp:")):!0})}function cycleOfficialMcpSettingMode(current,delta=1){let modes=OFFICIAL_MCP_SETTING_MODES,idx=modes.indexOf(current),next=((idx<0?0:idx)+delta+modes.length)%modes.length;return modes[next]}function formatOfficialMcpSettingLabel(mode2,locale){let zh2=!locale||locale.toLowerCase()==="zh"||locale.toLowerCase().startsWith("zh"),ja=!!locale&&(locale.toLowerCase()==="ja"||locale.toLowerCase().startsWith("ja"));return mode2==="on"?zh2?"\u5F00":ja?"\u30AA\u30F3":"On":mode2==="off"?zh2?"\u5173":ja?"\u30AA\u30D5":"Off":zh2?"\u81EA\u52A8":ja?"\u81EA\u52D5":"Auto"}function readOfficialMcpChromeSnapshot(options){try{let gate=resolveOfficialClavueMcpGate({strictMcpConfig:options?.strictMcpConfig,force:options?.force}),zh2=!!options?.locale&&(options.locale.toLowerCase()==="zh"||options.locale.toLowerCase().startsWith("zh")),modeLabel3=formatOfficialMcpSettingLabel(gate.settingMode,options?.locale),summary=gate.enabled?zh2?`\u5B98\u65B9 MCP \xB7 ${modeLabel3} \xB7 \u751F\u6548 \xB7 soft-fail \u4E0D\u6321\u5F00\u53D1`:`Official MCP \xB7 ${modeLabel3} \xB7 active \xB7 soft-fail never blocks coding`:zh2?`\u5B98\u65B9 MCP \xB7 ${modeLabel3} \xB7 \u672A\u6CE8\u5165 \xB7 ${gate.reason}`:`Official MCP \xB7 ${modeLabel3} \xB7 inactive \xB7 ${gate.reason}`;return{mode:gate.settingMode,active:gate.enabled,reason:gate.reason,chip:gate.enabled?"mcp":"",summary}}catch{return{mode:"auto",active:!1,reason:"disabled_env",chip:"",summary:"Official MCP \xB7 unavailable"}}}function assertOfficialMcpNonPollutingConfig(cfg){let entry=cfg[OFFICIAL_CLAVUE_MCP_SERVER_NAME];return entry?!(entry.scope!=="dynamic"||entry.type!=="stdio"||!(Array.isArray(entry.args)?entry.args:[]).includes(OFFICIAL_CLAVUE_MCP_MARKER_ARG)):!0}function isOfficialClavueMcpServer(name){return name===OFFICIAL_CLAVUE_MCP_SERVER_NAME}function buildOfficialClavueMcpConfig(){return{[OFFICIAL_CLAVUE_MCP_SERVER_NAME]:{type:"stdio",command:process.execPath,args:[OFFICIAL_CLAVUE_MCP_MARKER_ARG],scope:"dynamic"}}}function getOfficialClavueMcpConfigsIfEligible(options){try{let gate=resolveOfficialClavueMcpGate({strictMcpConfig:options?.strictMcpConfig});return logForDebugging(`[official-mcp] gate enabled=${gate.enabled} reason=${gate.reason} mode=${gate.settingMode} cloud=${gate.officialCloud} token=${gate.hasToken} env=${process.env.CLAVUE_OFFICIAL_MCP??"unset"}`),gate.enabled?buildOfficialClavueMcpConfig():{}}catch(error40){return logForDebugging(`[official-mcp] inject skipped (soft-fail): ${errorMessage2(error40)}`,{level:"error"}),{}}}function getOfficialClavueMcpAllowedTools(){return[OFFICIAL_CLAVUE_WEB_SEARCH_FQN]}function resolveApiBase(){return(getMembershipLocalSession()?.apiBaseUrl||MEMBERSHIP_DEFAULT_API_BASE).replace(/\/+$/,"")}function toolsCallUrl(apiBase){return`${apiBase}/v1/mcp/tools/call`}async function callOfficialClavueWebSearch(input2){let query2=String(input2.query??"").trim();if(query2.length<2)return{ok:!1,softFail:!0,query:query2,results:[],count:0,error:"Search query too short"};let token=(input2.sessionToken!==void 0?input2.sessionToken:getMembershipSessionToken())?.trim();if(!token)return{ok:!1,softFail:!0,query:query2,results:[],count:0,error:"Sign in required for official web_search"};let apiBase=(input2.apiBaseUrl||resolveApiBase()).replace(/\/+$/,""),url3=toolsCallUrl(apiBase),timeoutMs=input2.timeoutMs??DEFAULT_TIMEOUT_MS,fetchImpl=input2.fetchImpl??globalThis.fetch.bind(globalThis),controller=new AbortController,onAbort=__name(()=>controller.abort(),"onAbort");input2.signal?.addEventListener("abort",onAbort,{once:!0});let timer2=setTimeout(()=>controller.abort(),timeoutMs);try{let response=await fetchImpl(url3,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",Authorization:`Bearer ${token}`,"User-Agent":`clavue-cli/${typeof MACRO<"u"?"13.9.2":process.env.npm_package_version||"dev"} official-mcp`,"X-Imux-Kind":"cli_official_mcp_web_search"},body:JSON.stringify({name:OFFICIAL_CLAVUE_WEB_SEARCH_TOOL,arguments:{query:query2},protocol:PROTOCOL}),signal:controller.signal}),text3=await response.text().catch(()=>""),json2=null;try{json2=text3?JSON.parse(text3):null}catch{json2=null}if(!response.ok){let msg=typeof json2?.message=="string"&&json2.message||typeof json2?.error=="string"&&json2.error||json2?.error&&typeof json2.error=="object"&&typeof json2.error.message=="string"&&json2.error.message||`Official web_search HTTP ${response.status}`;return logForDebugging(`[official-mcp] tools/call soft-fail status=${response.status}: ${msg}`),{ok:!1,softFail:!0,query:query2,results:[],count:0,requestId:typeof json2?.requestId=="string"?json2.requestId:void 0,error:String(msg),raw:json2}}let resultPayload=json2?.result??json2;return normalizeSearchResult(query2,resultPayload,json2)}catch(error40){let msg=errorMessage2(error40);return logForDebugging(`[official-mcp] tools/call soft-fail: ${msg}`),{ok:!1,softFail:!0,query:query2,results:[],count:0,error:msg.includes("abort")?"Official web_search timed out or was aborted":msg}}finally{clearTimeout(timer2),input2.signal?.removeEventListener("abort",onAbort)}}function normalizeSearchResult(query2,resultPayload,envelope){let rec=resultPayload&&typeof resultPayload=="object"?resultPayload:null,results=extractHits(rec),summary=typeof rec?.summary=="string"&&rec.summary||typeof rec?.text=="string"&&rec.text||void 0,count4=typeof rec?.count=="number"?rec.count:results.length,productModel=typeof envelope?.productModel=="string"&&envelope.productModel||typeof rec?.productModel=="string"&&rec.productModel||void 0,requestId=typeof envelope?.requestId=="string"?envelope.requestId:void 0;return!(rec?.ok!==!1)&&results.length===0&&!summary?{ok:!1,softFail:!0,query:query2,results:[],count:0,productModel,requestId,error:typeof rec?.error=="string"&&rec.error||"Official web_search returned no usable results",raw:resultPayload}:{ok:!0,softFail:!1,query:typeof rec?.query=="string"&&rec.query||query2,summary,results,count:count4,productModel,requestId,raw:resultPayload}}function extractHits(rec){if(!rec)return[];let hits=[],pushItem=__name(item=>{if(!item||typeof item!="object")return;let r2=item,title=String(r2.title??r2.name??"").trim(),url3=String(r2.url??r2.link??"").trim();if(!title&&!url3)return;let snippet=String(r2.snippet??r2.description??"").trim();hits.push({title:title||url3,url:url3||"",...snippet?{snippet}:{}})},"pushItem");if(Array.isArray(rec.results))for(let item of rec.results)pushItem(item);if(hits.length===0&&Array.isArray(rec.sources))for(let item of rec.sources)pushItem(item);return hits.slice(0,12)}function formatOfficialWebSearchForAgent(result2){if(result2.softFail||!result2.ok)return["Official Clavue web_search is temporarily unavailable.",result2.error?`Reason: ${result2.error}`:null,"Continue coding with repo tools (Read/Grep/Bash). Do not invent web facts.","The session is healthy \u2014 search failure must not block development."].filter(Boolean).join(`
5947
5947
  `);let lines=[`Query: ${result2.query}`,result2.productModel?`Product: ${result2.productModel}`:null,result2.summary?`Summary:
5948
5948
  ${result2.summary}`:null].filter(Boolean);if(result2.results.length>0?(lines.push("Results:"),result2.results.forEach((hit,i3)=>{lines.push(`${i3+1}. ${hit.title}`),hit.url&&lines.push(` ${hit.url}`),hit.snippet&&lines.push(` ${hit.snippet}`)})):result2.summary||lines.push("(No structured hits; empty result set.)"),result2.raw&&typeof result2.raw=="object")try{let compact3=JSON.stringify(result2.raw);compact3.length<12e3&&lines.push("","--- clavue.search.v1 ---",compact3)}catch{}return lines.join(`
5949
- `)}var OFFICIAL_CLAVUE_MCP_SERVER_NAME,OFFICIAL_CLAVUE_MCP_MARKER_ARG,OFFICIAL_CLAVUE_WEB_SEARCH_TOOL,OFFICIAL_CLAVUE_WEB_SEARCH_FQN,OFFICIAL_MCP_SETTING_MODES,DEFAULT_TIMEOUT_MS,PROTOCOL,init_officialClavueMcp=__esm({"src/services/mcp/officialClavueMcp.ts"(){init_debug();init_envUtils();init_errors2();init_settings2();init_config3();init_sessionStore();OFFICIAL_CLAVUE_MCP_SERVER_NAME="clavue",OFFICIAL_CLAVUE_MCP_MARKER_ARG="--clavue-official-mcp",OFFICIAL_CLAVUE_WEB_SEARCH_TOOL="web_search",OFFICIAL_CLAVUE_WEB_SEARCH_FQN=`mcp__${OFFICIAL_CLAVUE_MCP_SERVER_NAME}__${OFFICIAL_CLAVUE_WEB_SEARCH_TOOL}`,OFFICIAL_MCP_SETTING_MODES=["auto","on","off"],DEFAULT_TIMEOUT_MS=45e3,PROTOCOL="clavue.mcp.v1";__name(normalizeOfficialMcpSettingMode,"normalizeOfficialMcpSettingMode");__name(readOfficialMcpSettingMode,"readOfficialMcpSettingMode");__name(resolveOfficialClavueMcpGate,"resolveOfficialClavueMcpGate");__name(shouldSkipAutoMcpForExplicitTools,"shouldSkipAutoMcpForExplicitTools");__name(cycleOfficialMcpSettingMode,"cycleOfficialMcpSettingMode");__name(formatOfficialMcpSettingLabel,"formatOfficialMcpSettingLabel");__name(readOfficialMcpChromeSnapshot,"readOfficialMcpChromeSnapshot");__name(assertOfficialMcpNonPollutingConfig,"assertOfficialMcpNonPollutingConfig");__name(isOfficialClavueMcpServer,"isOfficialClavueMcpServer");__name(buildOfficialClavueMcpConfig,"buildOfficialClavueMcpConfig");__name(getOfficialClavueMcpConfigsIfEligible,"getOfficialClavueMcpConfigsIfEligible");__name(getOfficialClavueMcpAllowedTools,"getOfficialClavueMcpAllowedTools");__name(resolveApiBase,"resolveApiBase");__name(toolsCallUrl,"toolsCallUrl");__name(callOfficialClavueWebSearch,"callOfficialClavueWebSearch");__name(normalizeSearchResult,"normalizeSearchResult");__name(extractHits,"extractHits");__name(formatOfficialWebSearchForAgent,"formatOfficialWebSearchForAgent")}});var ExperimentalServerTasks,init_server=__esm({"../../../rustfleet/wt/rel136/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js"(){init_types4();ExperimentalServerTasks=class{static{__name(this,"ExperimentalServerTasks")}constructor(_server){this._server=_server}requestStream(request,resultSchema,options){return this._server.requestStream(request,resultSchema,options)}createMessageStream(params,options){let clientCapabilities=this._server.getClientCapabilities();if((params.tools||params.toolChoice)&&!clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(params.messages.length>0){let lastMessage=params.messages[params.messages.length-1],lastContent=Array.isArray(lastMessage.content)?lastMessage.content:[lastMessage.content],hasToolResults=lastContent.some(c4=>c4.type==="tool_result"),previousMessage=params.messages.length>1?params.messages[params.messages.length-2]:void 0,previousContent=previousMessage?Array.isArray(previousMessage.content)?previousMessage.content:[previousMessage.content]:[],hasPreviousToolUse=previousContent.some(c4=>c4.type==="tool_use");if(hasToolResults){if(lastContent.some(c4=>c4.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!hasPreviousToolUse)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(hasPreviousToolUse){let toolUseIds=new Set(previousContent.filter(c4=>c4.type==="tool_use").map(c4=>c4.id)),toolResultIds=new Set(lastContent.filter(c4=>c4.type==="tool_result").map(c4=>c4.toolUseId));if(toolUseIds.size!==toolResultIds.size||![...toolUseIds].every(id=>toolResultIds.has(id)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params},CreateMessageResultSchema,options)}elicitInputStream(params,options){let clientCapabilities=this._server.getClientCapabilities(),mode2=params.mode??"form";switch(mode2){case"url":{if(!clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case"form":{if(!clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let normalizedParams=mode2==="form"&&params.mode===void 0?{...params,mode:"form"}:params;return this.requestStream({method:"elicitation/create",params:normalizedParams},ElicitResultSchema,options)}async getTask(taskId,options){return this._server.getTask({taskId},options)}async getTaskResult(taskId,resultSchema,options){return this._server.getTaskResult({taskId},resultSchema,options)}async listTasks(cursor,options){return this._server.listTasks(cursor?{cursor}:void 0,options)}async cancelTask(taskId,options){return this._server.cancelTask({taskId},options)}}}});var Server,init_server2=__esm({"../../../rustfleet/wt/rel136/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js"(){init_protocol();init_types4();init_ajv_provider();init_zod_compat();init_server();init_helpers3();Server=class extends Protocol{static{__name(this,"Server")}constructor(_serverInfo,options){super(options),this._serverInfo=_serverInfo,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(LoggingLevelSchema.options.map((level,index)=>[level,index])),this.isMessageIgnored=(level,sessionId)=>{let currentLevel=this._loggingLevels.get(sessionId);return currentLevel?this.LOG_LEVEL_SEVERITY.get(level)<this.LOG_LEVEL_SEVERITY.get(currentLevel):!1},this._capabilities=options?.capabilities??{},this._instructions=options?.instructions,this._jsonSchemaValidator=options?.jsonSchemaValidator??new AjvJsonSchemaValidator,this.setRequestHandler(InitializeRequestSchema,request=>this._oninitialize(request)),this.setNotificationHandler(InitializedNotificationSchema,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(SetLevelRequestSchema,async(request,extra)=>{let transportSessionId=extra.sessionId||extra.requestInfo?.headers["mcp-session-id"]||void 0,{level}=request.params,parseResult=LoggingLevelSchema.safeParse(level);return parseResult.success&&this._loggingLevels.set(transportSessionId,parseResult.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new ExperimentalServerTasks(this)}),this._experimental}registerCapabilities(capabilities){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=mergeCapabilities(this._capabilities,capabilities)}setRequestHandler(requestSchema,handler){let methodSchema=getObjectShape(requestSchema)?.method;if(!methodSchema)throw new Error("Schema is missing a method literal");let methodValue;if(isZ4Schema(methodSchema)){let v4Schema=methodSchema;methodValue=v4Schema._zod?.def?.value??v4Schema.value}else{let v3Schema=methodSchema;methodValue=v3Schema._def?.value??v3Schema.value}if(typeof methodValue!="string")throw new Error("Schema method literal must be a string");if(methodValue==="tools/call"){let wrappedHandler=__name(async(request,extra)=>{let validatedRequest=safeParse3(CallToolRequestSchema,request);if(!validatedRequest.success){let errorMessage5=validatedRequest.error instanceof Error?validatedRequest.error.message:String(validatedRequest.error);throw new McpError(ErrorCode.InvalidParams,`Invalid tools/call request: ${errorMessage5}`)}let{params}=validatedRequest.data,result2=await Promise.resolve(handler(request,extra));if(params.task){let taskValidationResult=safeParse3(CreateTaskResultSchema,result2);if(!taskValidationResult.success){let errorMessage5=taskValidationResult.error instanceof Error?taskValidationResult.error.message:String(taskValidationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid task creation result: ${errorMessage5}`)}return taskValidationResult.data}let validationResult=safeParse3(CallToolResultSchema,result2);if(!validationResult.success){let errorMessage5=validationResult.error instanceof Error?validationResult.error.message:String(validationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid tools/call result: ${errorMessage5}`)}return validationResult.data},"wrappedHandler");return super.setRequestHandler(requestSchema,wrappedHandler)}return super.setRequestHandler(requestSchema,handler)}assertCapabilityForMethod(method2){switch(method2){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${method2})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${method2})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${method2})`);break;case"ping":break}}assertNotificationCapability(method2){switch(method2){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${method2})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${method2})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${method2})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${method2})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${method2})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(method2){if(this._capabilities)switch(method2){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${method2})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${method2})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${method2})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${method2})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${method2})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${method2})`);break;case"ping":case"initialize":break}}assertTaskCapability(method2){assertClientRequestTaskCapability(this._clientCapabilities?.tasks?.requests,method2,"Client")}assertTaskHandlerCapability(method2){this._capabilities&&assertToolsCallTaskCapability(this._capabilities.tasks?.requests,method2,"Server")}async _oninitialize(request){let requestedVersion=request.params.protocolVersion;return this._clientCapabilities=request.params.capabilities,this._clientVersion=request.params.clientInfo,{protocolVersion:SUPPORTED_PROTOCOL_VERSIONS.includes(requestedVersion)?requestedVersion:LATEST_PROTOCOL_VERSION,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},EmptyResultSchema)}async createMessage(params,options){if((params.tools||params.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(params.messages.length>0){let lastMessage=params.messages[params.messages.length-1],lastContent=Array.isArray(lastMessage.content)?lastMessage.content:[lastMessage.content],hasToolResults=lastContent.some(c4=>c4.type==="tool_result"),previousMessage=params.messages.length>1?params.messages[params.messages.length-2]:void 0,previousContent=previousMessage?Array.isArray(previousMessage.content)?previousMessage.content:[previousMessage.content]:[],hasPreviousToolUse=previousContent.some(c4=>c4.type==="tool_use");if(hasToolResults){if(lastContent.some(c4=>c4.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!hasPreviousToolUse)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(hasPreviousToolUse){let toolUseIds=new Set(previousContent.filter(c4=>c4.type==="tool_use").map(c4=>c4.id)),toolResultIds=new Set(lastContent.filter(c4=>c4.type==="tool_result").map(c4=>c4.toolUseId));if(toolUseIds.size!==toolResultIds.size||![...toolUseIds].every(id=>toolResultIds.has(id)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return params.tools?this.request({method:"sampling/createMessage",params},CreateMessageResultWithToolsSchema,options):this.request({method:"sampling/createMessage",params},CreateMessageResultSchema,options)}async elicitInput(params,options){switch(params.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let urlParams=params;return this.request({method:"elicitation/create",params:urlParams},ElicitResultSchema,options)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let formParams=params.mode==="form"?params:{...params,mode:"form"},result2=await this.request({method:"elicitation/create",params:formParams},ElicitResultSchema,options);if(result2.action==="accept"&&result2.content&&formParams.requestedSchema)try{let validationResult=this._jsonSchemaValidator.getValidator(formParams.requestedSchema)(result2.content);if(!validationResult.valid)throw new McpError(ErrorCode.InvalidParams,`Elicitation response content does not match requested schema: ${validationResult.errorMessage}`)}catch(error40){throw error40 instanceof McpError?error40:new McpError(ErrorCode.InternalError,`Error validating elicitation response: ${error40 instanceof Error?error40.message:String(error40)}`)}return result2}}}createElicitationCompletionNotifier(elicitationId,options){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId}},options)}async listRoots(params,options){return this.request({method:"roots/list",params},ListRootsResultSchema,options)}async sendLoggingMessage(params,sessionId){if(this._capabilities.logging&&!this.isMessageIgnored(params.level,sessionId))return this.notification({method:"notifications/message",params})}async sendResourceUpdated(params){return this.notification({method:"notifications/resources/updated",params})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}}}});var officialClavueMcpServer_exports={};__export(officialClavueMcpServer_exports,{createOfficialClavueMcpServer:()=>createOfficialClavueMcpServer});function createOfficialClavueMcpServer(){let server2=new Server({name:OFFICIAL_CLAVUE_MCP_SERVER_NAME,version:typeof MACRO<"u"?"13.9.1":"1.0.0"},{capabilities:{tools:{}},instructions:"Clavue Official MCP. Prefer web_search for current public facts. If web_search soft-fails, continue coding with repo tools \u2014 do not invent facts."});return server2.setRequestHandler(ListToolsRequestSchema,async()=>({tools:[{name:OFFICIAL_CLAVUE_WEB_SEARCH_TOOL,description:"Search the public web via Clavue Official Search (compliance gateway + agent JSON). Prefer this over inventing facts. Soft-fails on outage \u2014 continue coding without blocking.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (natural language)"}},required:["query"]},annotations:{readOnlyHint:!0,openWorldHint:!0,destructiveHint:!1}}]})),server2.setRequestHandler(CallToolRequestSchema,async request=>{let toolName4=String(request.params.name||"").replace(/^mcp__clavue__/,"").replace(/^mcp__/,"");if(toolName4!==OFFICIAL_CLAVUE_WEB_SEARCH_TOOL&&toolName4!=="search")return{isError:!0,content:[{type:"text",text:`Unknown official MCP tool: ${request.params.name}. Supported: web_search.`}]};let args=request.params.arguments??{},query2=String(args.query??args.q??"").trim();try{let result2=await callOfficialClavueWebSearch({query:query2}),text3=formatOfficialWebSearchForAgent(result2);return{isError:result2.softFail||!result2.ok,content:[{type:"text",text:text3}]}}catch(error40){return logForDebugging(`[official-mcp] unexpected CallTool error (soft-fail): ${error40 instanceof Error?error40.message:String(error40)}`,{level:"error"}),{isError:!0,content:[{type:"text",text:formatOfficialWebSearchForAgent({ok:!1,softFail:!0,query:query2,results:[],count:0,error:error40 instanceof Error?error40.message:"Unexpected search error"})}]}}}),server2}var init_officialClavueMcpServer=__esm({"src/services/mcp/officialClavueMcpServer.ts"(){init_server2();init_types4();init_debug();init_officialClavueMcp();__name(createOfficialClavueMcpServer,"createOfficialClavueMcpServer")}});var InProcessTransport_exports={};__export(InProcessTransport_exports,{createLinkedTransportPair:()=>createLinkedTransportPair});function createLinkedTransportPair(){let a2=new InProcessTransport,b3=new InProcessTransport;return a2._setPeer(b3),b3._setPeer(a2),[a2,b3]}var InProcessTransport,init_InProcessTransport=__esm({"src/services/mcp/InProcessTransport.ts"(){InProcessTransport=class{static{__name(this,"InProcessTransport")}peer;closed=!1;onclose;onerror;onmessage;_setPeer(peer){this.peer=peer}async start(){}async send(message){if(this.closed)throw new Error("Transport is closed");queueMicrotask(()=>{this.peer?.onmessage?.(message)})}async close(){this.closed||(this.closed=!0,this.onclose?.(),this.peer&&!this.peer.closed&&(this.peer.closed=!0,this.peer.onclose?.()))}};__name(createLinkedTransportPair,"createLinkedTransportPair")}});var officialBrowserMcp_exports={};__export(officialBrowserMcp_exports,{OFFICIAL_BROWSER_MCP_SERVER_NAME:()=>OFFICIAL_BROWSER_MCP_SERVER_NAME,OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG:()=>OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG,PLAYWRIGHT_MCP_PACKAGE:()=>PLAYWRIGHT_MCP_PACKAGE,buildBrowserRuntimeMcpConfig:()=>buildBrowserRuntimeMcpConfig,buildOfficialBrowserMcpConfig:()=>buildOfficialBrowserMcpConfig,getOfficialBrowserMcpConfigsIfEligible:()=>getOfficialBrowserMcpConfigsIfEligible,isBrowserRuntimeInProcessConfig:()=>isBrowserRuntimeInProcessConfig,isOfficialBrowserMcpServer:()=>isOfficialBrowserMcpServer,parseBrowserRuntimeKindFromArgs:()=>parseBrowserRuntimeKindFromArgs,resolveOfficialBrowserMcpGate:()=>resolveOfficialBrowserMcpGate});function readAllowBrowser(){try{return getInitialSettings()?.allowBrowser===!0}catch{return!1}}function resolveOfficialBrowserMcpGate(options){if(options?.force?.bare??isBareMode())return{enabled:!1,reason:"disabled_bare",allowBrowser:!1};if(options?.strictMcpConfig)return{enabled:!1,reason:"disabled_strict_mcp",allowBrowser:!1};if(options?.chromeFlagOverride===!1)return{enabled:!1,reason:"disabled_no_chrome",allowBrowser:!1};if(String(process.env.CLAVUE_BROWSER_BACKEND||"").trim().toLowerCase()==="off")return{enabled:!1,reason:"disabled_backend_off",allowBrowser:readAllowBrowser()};let envRaw2=options?.force?.env!==void 0?options.force.env:process.env.CLAVUE_BROWSER_MCP;if(isEnvDefinedFalsy(envRaw2))return{enabled:!1,reason:"disabled_env",allowBrowser:!1};if(!(options?.force?.allowBrowser!==void 0?options.force.allowBrowser:readAllowBrowser()))return{enabled:!1,reason:"allow_browser_false",allowBrowser:!1};let nonInteractive=options?.isNonInteractive??(process.argv.includes("-p")||process.argv.includes("--print")),headlessForce=isEnvTruthy2(envRaw2)||isEnvTruthy2(process.env.CLAVUE_HEADLESS_BROWSER_MCP)||isEnvTruthy2(process.env.CLAVUE_HEADLESS_BROWSER_RUNTIME);return nonInteractive&&!headlessForce?{enabled:!1,reason:"disabled_headless_default",allowBrowser:!0}:{enabled:!0,reason:isEnvTruthy2(envRaw2)?"enabled_env":"enabled_allow_browser",allowBrowser:!0}}function isOfficialBrowserMcpServer(name){return name===OFFICIAL_BROWSER_MCP_SERVER_NAME}function isBrowserRuntimeInProcessConfig(cfg){return!cfg||cfg.type!=="stdio"||!("args"in cfg)||!Array.isArray(cfg.args)?!1:cfg.args.map(String).includes(OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG)}function parseBrowserRuntimeKindFromArgs(args){let list2=Array.isArray(args)?args.map(String):[],idx=list2.indexOf(OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG);return(idx>=0?list2[idx+1]:void 0)==="native_runtime"?"native_runtime":"attach_cdp"}function buildBrowserRuntimeMcpConfig(kind){return{[OFFICIAL_BROWSER_MCP_SERVER_NAME]:{type:"stdio",command:process.execPath,args:[OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG,kind],scope:"dynamic"}}}function defaultPlaywrightArgs(){let raw=String(process.env.CLAVUE_BROWSER_MCP_ARGS||"").trim();if(raw){if(raw.startsWith("["))try{let parsed=JSON.parse(raw);if(Array.isArray(parsed))return parsed.map(String)}catch{}return raw.split(/\s+/).filter(Boolean)}return["-y",PLAYWRIGHT_MCP_PACKAGE]}function buildOfficialBrowserMcpConfig(){let command7=String(process.env.CLAVUE_BROWSER_MCP_CMD||"").trim()||"npx",args=defaultPlaywrightArgs();return{[OFFICIAL_BROWSER_MCP_SERVER_NAME]:{type:"stdio",command:command7,args,scope:"dynamic",env:{...process.env.PLAYWRIGHT_MCP_HEADED?{PLAYWRIGHT_MCP_HEADED:process.env.PLAYWRIGHT_MCP_HEADED}:{}}}}}function getOfficialBrowserMcpConfigsIfEligible(options){try{let gate=resolveOfficialBrowserMcpGate({strictMcpConfig:options?.strictMcpConfig,chromeFlagOverride:options?.chromeFlagOverride,isNonInteractive:options?.isNonInteractive});return logForDebugging(`[browser-mcp] Path A gate enabled=${gate.enabled} reason=${gate.reason} allowBrowser=${gate.allowBrowser}`),gate.enabled?buildOfficialBrowserMcpConfig():{}}catch(error40){return logForDebugging(`[browser-mcp] inject skipped (soft-fail): ${errorMessage2(error40)}`,{level:"error"}),{}}}var OFFICIAL_BROWSER_MCP_SERVER_NAME,OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG,PLAYWRIGHT_MCP_PACKAGE,init_officialBrowserMcp=__esm({"src/services/mcp/officialBrowserMcp.ts"(){init_debug();init_envUtils();init_errors2();init_settings2();OFFICIAL_BROWSER_MCP_SERVER_NAME="clavue-browser",OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG="--clavue-browser-runtime-mcp",PLAYWRIGHT_MCP_PACKAGE="@playwright/mcp@latest";__name(readAllowBrowser,"readAllowBrowser");__name(resolveOfficialBrowserMcpGate,"resolveOfficialBrowserMcpGate");__name(isOfficialBrowserMcpServer,"isOfficialBrowserMcpServer");__name(isBrowserRuntimeInProcessConfig,"isBrowserRuntimeInProcessConfig");__name(parseBrowserRuntimeKindFromArgs,"parseBrowserRuntimeKindFromArgs");__name(buildBrowserRuntimeMcpConfig,"buildBrowserRuntimeMcpConfig");__name(defaultPlaywrightArgs,"defaultPlaywrightArgs");__name(buildOfficialBrowserMcpConfig,"buildOfficialBrowserMcpConfig");__name(getOfficialBrowserMcpConfigsIfEligible,"getOfficialBrowserMcpConfigsIfEligible")}});function allowBrowserNavigateUrl(raw,env5=process.env){let input2=String(raw||"").trim();if(!input2)return{ok:!1,reason:"empty_url"};let url3;try{url3=new URL(input2)}catch{return{ok:!1,reason:"invalid_url"}}let scheme=url3.protocol.replace(/:$/,"").toLowerCase();return scheme==="about"?url3.pathname==="blank"||input2.toLowerCase()==="about:blank"?{ok:!0,url:"about:blank"}:{ok:!1,reason:"about_not_blank"}:scheme==="http"||scheme==="https"?url3.username||url3.password?{ok:!1,reason:"credentials_in_url"}:{ok:!0,url:url3.toString()}:scheme==="file"?env5.CLAVUE_BROWSER_ALLOW_FILE==="1"||String(env5.CLAVUE_BROWSER_ALLOW_FILE||"").toLowerCase()==="true"?{ok:!0,url:url3.toString()}:{ok:!1,reason:"file_scheme_denied (set CLAVUE_BROWSER_ALLOW_FILE=1)"}:{ok:!1,reason:`scheme_denied:${scheme}`}}var init_navigateAllowlist=__esm({"src/services/browser/navigateAllowlist.ts"(){__name(allowBrowserNavigateUrl,"allowBrowserNavigateUrl")}});function createEmptyRefTable(generation=0){return{generation,byId:new Map}}function normalizeRefId(ref){let s2=String(ref||"").trim();return s2?s2.startsWith("@")?s2:`@${s2}`:""}function resolveRef2(table,ref){if(!table||table.generation<=0||table.byId.size===0)return{ok:!1,error:"ref_no_snapshot: call browser_snapshot first (semantic_v1)"};let id=normalizeRefId(ref);if(!id)return{ok:!1,error:"ref_invalid: empty ref"};let entry=table.byId.get(id);return entry?{ok:!0,entry,generation:table.generation}:{ok:!1,error:`ref_expired_resnapshot: ${id} not in generation=${table.generation}. Call browser_snapshot again.`}}function buildRefTable(generation,refs){let byId=new Map;for(let r2 of refs)byId.set(normalizeRefId(r2.id),r2);return{generation,byId}}var init_refs=__esm({"src/services/browser/snapshot/refs.ts"(){__name(createEmptyRefTable,"createEmptyRefTable");__name(normalizeRefId,"normalizeRefId");__name(resolveRef2,"resolveRef");__name(buildRefTable,"buildRefTable")}});function roleOf(n4){return String(n4.role?.value||"generic").toLowerCase()}function nameOf(n4){return String(n4.name?.value||n4.description?.value||"").trim()}function isInteresting(n4){if(n4.ignored)return!1;let role=roleOf(n4);return INTERACTIVE_ROLES.has(role)?!0:role==="heading"||role==="main"||role==="navigation"||role==="banner"||role==="contentinfo"||role==="form"||role==="dialog"||role==="alertdialog"||role==="document"||role==="region"||role==="list"||role==="listitem"||role==="article"||role==="img"||role==="statictext"?!!nameOf(n4)||role!=="statictext":!1}function shouldAssignRef(n4){return n4.ignored||n4.backendDOMNodeId==null?!1:INTERACTIVE_ROLES.has(roleOf(n4))}async function captureSemanticSnapshot(opts){let generation=(opts.previousGeneration??0)+1;await opts.client.send("Accessibility.enable",{},{sessionId:opts.cdpSessionId}).catch(()=>{}),await opts.client.send("DOM.enable",{},{sessionId:opts.cdpSessionId}).catch(()=>{});let nodes=[];try{nodes=(await opts.client.send("Accessibility.getFullAXTree",{},{sessionId:opts.cdpSessionId,timeoutMs:12e3})).nodes||[]}catch{return fallbackDomSnapshot(opts,generation)}let byId=new Map(nodes.map(n4=>[n4.nodeId,n4])),roots=nodes.filter(n4=>!n4.parentId||!byId.has(n4.parentId)),refs=[],refCounter=0,refByNodeId=new Map;function assignRef(n4){if(!shouldAssignRef(n4)||refCounter>=MAX_REFS)return;refCounter+=1;let id=`@e${refCounter}`,entry={id,role:roleOf(n4),name:nameOf(n4)||void 0,interactive:!0,backendDOMNodeId:n4.backendDOMNodeId,axNodeId:n4.nodeId};return refs.push(entry),refByNodeId.set(n4.nodeId,id),id}__name(assignRef,"assignRef");let lines=[];function walk(n4,depth){if(n4.ignored&&!n4.childIds?.length)return;let interesting=isInteresting(n4),role=roleOf(n4),name=nameOf(n4),refId=interesting?assignRef(n4):void 0;if(interesting||depth===0){let indent=" ".repeat(Math.min(depth,12)),label2=name?` ${truncate4(name,80)}`:"",refSuffix=refId?` ${refId}`:"";lines.push(`${indent}[${role}]${label2}${refSuffix}`)}for(let cid of n4.childIds||[]){let child=byId.get(cid);child&&walk(child,depth+1)}}if(__name(walk,"walk"),roots.length===0&&nodes.length>0)walk(nodes[0],0);else for(let r2 of roots.slice(0,20))walk(r2,0);let meta=await opts.client.evaluate(opts.cdpSessionId,"(() => ({ url: location.href, title: document.title || '' }))()").catch(()=>({url:"",title:""})),tree=lines.join(`
5949
+ `)}var OFFICIAL_CLAVUE_MCP_SERVER_NAME,OFFICIAL_CLAVUE_MCP_MARKER_ARG,OFFICIAL_CLAVUE_WEB_SEARCH_TOOL,OFFICIAL_CLAVUE_WEB_SEARCH_FQN,OFFICIAL_MCP_SETTING_MODES,DEFAULT_TIMEOUT_MS,PROTOCOL,init_officialClavueMcp=__esm({"src/services/mcp/officialClavueMcp.ts"(){init_debug();init_envUtils();init_errors2();init_settings2();init_config3();init_sessionStore();OFFICIAL_CLAVUE_MCP_SERVER_NAME="clavue",OFFICIAL_CLAVUE_MCP_MARKER_ARG="--clavue-official-mcp",OFFICIAL_CLAVUE_WEB_SEARCH_TOOL="web_search",OFFICIAL_CLAVUE_WEB_SEARCH_FQN=`mcp__${OFFICIAL_CLAVUE_MCP_SERVER_NAME}__${OFFICIAL_CLAVUE_WEB_SEARCH_TOOL}`,OFFICIAL_MCP_SETTING_MODES=["auto","on","off"],DEFAULT_TIMEOUT_MS=45e3,PROTOCOL="clavue.mcp.v1";__name(normalizeOfficialMcpSettingMode,"normalizeOfficialMcpSettingMode");__name(readOfficialMcpSettingMode,"readOfficialMcpSettingMode");__name(resolveOfficialClavueMcpGate,"resolveOfficialClavueMcpGate");__name(shouldSkipAutoMcpForExplicitTools,"shouldSkipAutoMcpForExplicitTools");__name(cycleOfficialMcpSettingMode,"cycleOfficialMcpSettingMode");__name(formatOfficialMcpSettingLabel,"formatOfficialMcpSettingLabel");__name(readOfficialMcpChromeSnapshot,"readOfficialMcpChromeSnapshot");__name(assertOfficialMcpNonPollutingConfig,"assertOfficialMcpNonPollutingConfig");__name(isOfficialClavueMcpServer,"isOfficialClavueMcpServer");__name(buildOfficialClavueMcpConfig,"buildOfficialClavueMcpConfig");__name(getOfficialClavueMcpConfigsIfEligible,"getOfficialClavueMcpConfigsIfEligible");__name(getOfficialClavueMcpAllowedTools,"getOfficialClavueMcpAllowedTools");__name(resolveApiBase,"resolveApiBase");__name(toolsCallUrl,"toolsCallUrl");__name(callOfficialClavueWebSearch,"callOfficialClavueWebSearch");__name(normalizeSearchResult,"normalizeSearchResult");__name(extractHits,"extractHits");__name(formatOfficialWebSearchForAgent,"formatOfficialWebSearchForAgent")}});var ExperimentalServerTasks,init_server=__esm({"../../../rustfleet/wt/rel136/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js"(){init_types4();ExperimentalServerTasks=class{static{__name(this,"ExperimentalServerTasks")}constructor(_server){this._server=_server}requestStream(request,resultSchema,options){return this._server.requestStream(request,resultSchema,options)}createMessageStream(params,options){let clientCapabilities=this._server.getClientCapabilities();if((params.tools||params.toolChoice)&&!clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(params.messages.length>0){let lastMessage=params.messages[params.messages.length-1],lastContent=Array.isArray(lastMessage.content)?lastMessage.content:[lastMessage.content],hasToolResults=lastContent.some(c4=>c4.type==="tool_result"),previousMessage=params.messages.length>1?params.messages[params.messages.length-2]:void 0,previousContent=previousMessage?Array.isArray(previousMessage.content)?previousMessage.content:[previousMessage.content]:[],hasPreviousToolUse=previousContent.some(c4=>c4.type==="tool_use");if(hasToolResults){if(lastContent.some(c4=>c4.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!hasPreviousToolUse)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(hasPreviousToolUse){let toolUseIds=new Set(previousContent.filter(c4=>c4.type==="tool_use").map(c4=>c4.id)),toolResultIds=new Set(lastContent.filter(c4=>c4.type==="tool_result").map(c4=>c4.toolUseId));if(toolUseIds.size!==toolResultIds.size||![...toolUseIds].every(id=>toolResultIds.has(id)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params},CreateMessageResultSchema,options)}elicitInputStream(params,options){let clientCapabilities=this._server.getClientCapabilities(),mode2=params.mode??"form";switch(mode2){case"url":{if(!clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");break}case"form":{if(!clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");break}}let normalizedParams=mode2==="form"&&params.mode===void 0?{...params,mode:"form"}:params;return this.requestStream({method:"elicitation/create",params:normalizedParams},ElicitResultSchema,options)}async getTask(taskId,options){return this._server.getTask({taskId},options)}async getTaskResult(taskId,resultSchema,options){return this._server.getTaskResult({taskId},resultSchema,options)}async listTasks(cursor,options){return this._server.listTasks(cursor?{cursor}:void 0,options)}async cancelTask(taskId,options){return this._server.cancelTask({taskId},options)}}}});var Server,init_server2=__esm({"../../../rustfleet/wt/rel136/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js"(){init_protocol();init_types4();init_ajv_provider();init_zod_compat();init_server();init_helpers3();Server=class extends Protocol{static{__name(this,"Server")}constructor(_serverInfo,options){super(options),this._serverInfo=_serverInfo,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(LoggingLevelSchema.options.map((level,index)=>[level,index])),this.isMessageIgnored=(level,sessionId)=>{let currentLevel=this._loggingLevels.get(sessionId);return currentLevel?this.LOG_LEVEL_SEVERITY.get(level)<this.LOG_LEVEL_SEVERITY.get(currentLevel):!1},this._capabilities=options?.capabilities??{},this._instructions=options?.instructions,this._jsonSchemaValidator=options?.jsonSchemaValidator??new AjvJsonSchemaValidator,this.setRequestHandler(InitializeRequestSchema,request=>this._oninitialize(request)),this.setNotificationHandler(InitializedNotificationSchema,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(SetLevelRequestSchema,async(request,extra)=>{let transportSessionId=extra.sessionId||extra.requestInfo?.headers["mcp-session-id"]||void 0,{level}=request.params,parseResult=LoggingLevelSchema.safeParse(level);return parseResult.success&&this._loggingLevels.set(transportSessionId,parseResult.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new ExperimentalServerTasks(this)}),this._experimental}registerCapabilities(capabilities){if(this.transport)throw new Error("Cannot register capabilities after connecting to transport");this._capabilities=mergeCapabilities(this._capabilities,capabilities)}setRequestHandler(requestSchema,handler){let methodSchema=getObjectShape(requestSchema)?.method;if(!methodSchema)throw new Error("Schema is missing a method literal");let methodValue;if(isZ4Schema(methodSchema)){let v4Schema=methodSchema;methodValue=v4Schema._zod?.def?.value??v4Schema.value}else{let v3Schema=methodSchema;methodValue=v3Schema._def?.value??v3Schema.value}if(typeof methodValue!="string")throw new Error("Schema method literal must be a string");if(methodValue==="tools/call"){let wrappedHandler=__name(async(request,extra)=>{let validatedRequest=safeParse3(CallToolRequestSchema,request);if(!validatedRequest.success){let errorMessage5=validatedRequest.error instanceof Error?validatedRequest.error.message:String(validatedRequest.error);throw new McpError(ErrorCode.InvalidParams,`Invalid tools/call request: ${errorMessage5}`)}let{params}=validatedRequest.data,result2=await Promise.resolve(handler(request,extra));if(params.task){let taskValidationResult=safeParse3(CreateTaskResultSchema,result2);if(!taskValidationResult.success){let errorMessage5=taskValidationResult.error instanceof Error?taskValidationResult.error.message:String(taskValidationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid task creation result: ${errorMessage5}`)}return taskValidationResult.data}let validationResult=safeParse3(CallToolResultSchema,result2);if(!validationResult.success){let errorMessage5=validationResult.error instanceof Error?validationResult.error.message:String(validationResult.error);throw new McpError(ErrorCode.InvalidParams,`Invalid tools/call result: ${errorMessage5}`)}return validationResult.data},"wrappedHandler");return super.setRequestHandler(requestSchema,wrappedHandler)}return super.setRequestHandler(requestSchema,handler)}assertCapabilityForMethod(method2){switch(method2){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw new Error(`Client does not support sampling (required for ${method2})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw new Error(`Client does not support elicitation (required for ${method2})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw new Error(`Client does not support listing roots (required for ${method2})`);break;case"ping":break}}assertNotificationCapability(method2){switch(method2){case"notifications/message":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${method2})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw new Error(`Server does not support notifying about resources (required for ${method2})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw new Error(`Server does not support notifying of tool list changes (required for ${method2})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw new Error(`Server does not support notifying of prompt list changes (required for ${method2})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw new Error(`Client does not support URL elicitation (required for ${method2})`);break;case"notifications/cancelled":break;case"notifications/progress":break}}assertRequestHandlerCapability(method2){if(this._capabilities)switch(method2){case"completion/complete":if(!this._capabilities.completions)throw new Error(`Server does not support completions (required for ${method2})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw new Error(`Server does not support logging (required for ${method2})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw new Error(`Server does not support prompts (required for ${method2})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw new Error(`Server does not support resources (required for ${method2})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw new Error(`Server does not support tools (required for ${method2})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw new Error(`Server does not support tasks capability (required for ${method2})`);break;case"ping":case"initialize":break}}assertTaskCapability(method2){assertClientRequestTaskCapability(this._clientCapabilities?.tasks?.requests,method2,"Client")}assertTaskHandlerCapability(method2){this._capabilities&&assertToolsCallTaskCapability(this._capabilities.tasks?.requests,method2,"Server")}async _oninitialize(request){let requestedVersion=request.params.protocolVersion;return this._clientCapabilities=request.params.capabilities,this._clientVersion=request.params.clientInfo,{protocolVersion:SUPPORTED_PROTOCOL_VERSIONS.includes(requestedVersion)?requestedVersion:LATEST_PROTOCOL_VERSION,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},EmptyResultSchema)}async createMessage(params,options){if((params.tools||params.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw new Error("Client does not support sampling tools capability.");if(params.messages.length>0){let lastMessage=params.messages[params.messages.length-1],lastContent=Array.isArray(lastMessage.content)?lastMessage.content:[lastMessage.content],hasToolResults=lastContent.some(c4=>c4.type==="tool_result"),previousMessage=params.messages.length>1?params.messages[params.messages.length-2]:void 0,previousContent=previousMessage?Array.isArray(previousMessage.content)?previousMessage.content:[previousMessage.content]:[],hasPreviousToolUse=previousContent.some(c4=>c4.type==="tool_use");if(hasToolResults){if(lastContent.some(c4=>c4.type!=="tool_result"))throw new Error("The last message must contain only tool_result content if any is present");if(!hasPreviousToolUse)throw new Error("tool_result blocks are not matching any tool_use from the previous message")}if(hasPreviousToolUse){let toolUseIds=new Set(previousContent.filter(c4=>c4.type==="tool_use").map(c4=>c4.id)),toolResultIds=new Set(lastContent.filter(c4=>c4.type==="tool_result").map(c4=>c4.toolUseId));if(toolUseIds.size!==toolResultIds.size||![...toolUseIds].every(id=>toolResultIds.has(id)))throw new Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return params.tools?this.request({method:"sampling/createMessage",params},CreateMessageResultWithToolsSchema,options):this.request({method:"sampling/createMessage",params},CreateMessageResultSchema,options)}async elicitInput(params,options){switch(params.mode??"form"){case"url":{if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support url elicitation.");let urlParams=params;return this.request({method:"elicitation/create",params:urlParams},ElicitResultSchema,options)}case"form":{if(!this._clientCapabilities?.elicitation?.form)throw new Error("Client does not support form elicitation.");let formParams=params.mode==="form"?params:{...params,mode:"form"},result2=await this.request({method:"elicitation/create",params:formParams},ElicitResultSchema,options);if(result2.action==="accept"&&result2.content&&formParams.requestedSchema)try{let validationResult=this._jsonSchemaValidator.getValidator(formParams.requestedSchema)(result2.content);if(!validationResult.valid)throw new McpError(ErrorCode.InvalidParams,`Elicitation response content does not match requested schema: ${validationResult.errorMessage}`)}catch(error40){throw error40 instanceof McpError?error40:new McpError(ErrorCode.InternalError,`Error validating elicitation response: ${error40 instanceof Error?error40.message:String(error40)}`)}return result2}}}createElicitationCompletionNotifier(elicitationId,options){if(!this._clientCapabilities?.elicitation?.url)throw new Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId}},options)}async listRoots(params,options){return this.request({method:"roots/list",params},ListRootsResultSchema,options)}async sendLoggingMessage(params,sessionId){if(this._capabilities.logging&&!this.isMessageIgnored(params.level,sessionId))return this.notification({method:"notifications/message",params})}async sendResourceUpdated(params){return this.notification({method:"notifications/resources/updated",params})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}}}});var officialClavueMcpServer_exports={};__export(officialClavueMcpServer_exports,{createOfficialClavueMcpServer:()=>createOfficialClavueMcpServer});function createOfficialClavueMcpServer(){let server2=new Server({name:OFFICIAL_CLAVUE_MCP_SERVER_NAME,version:typeof MACRO<"u"?"13.9.2":"1.0.0"},{capabilities:{tools:{}},instructions:"Clavue Official MCP. Prefer web_search for current public facts. If web_search soft-fails, continue coding with repo tools \u2014 do not invent facts."});return server2.setRequestHandler(ListToolsRequestSchema,async()=>({tools:[{name:OFFICIAL_CLAVUE_WEB_SEARCH_TOOL,description:"Search the public web via Clavue Official Search (compliance gateway + agent JSON). Prefer this over inventing facts. Soft-fails on outage \u2014 continue coding without blocking.",inputSchema:{type:"object",properties:{query:{type:"string",description:"Search query (natural language)"}},required:["query"]},annotations:{readOnlyHint:!0,openWorldHint:!0,destructiveHint:!1}}]})),server2.setRequestHandler(CallToolRequestSchema,async request=>{let toolName4=String(request.params.name||"").replace(/^mcp__clavue__/,"").replace(/^mcp__/,"");if(toolName4!==OFFICIAL_CLAVUE_WEB_SEARCH_TOOL&&toolName4!=="search")return{isError:!0,content:[{type:"text",text:`Unknown official MCP tool: ${request.params.name}. Supported: web_search.`}]};let args=request.params.arguments??{},query2=String(args.query??args.q??"").trim();try{let result2=await callOfficialClavueWebSearch({query:query2}),text3=formatOfficialWebSearchForAgent(result2);return{isError:result2.softFail||!result2.ok,content:[{type:"text",text:text3}]}}catch(error40){return logForDebugging(`[official-mcp] unexpected CallTool error (soft-fail): ${error40 instanceof Error?error40.message:String(error40)}`,{level:"error"}),{isError:!0,content:[{type:"text",text:formatOfficialWebSearchForAgent({ok:!1,softFail:!0,query:query2,results:[],count:0,error:error40 instanceof Error?error40.message:"Unexpected search error"})}]}}}),server2}var init_officialClavueMcpServer=__esm({"src/services/mcp/officialClavueMcpServer.ts"(){init_server2();init_types4();init_debug();init_officialClavueMcp();__name(createOfficialClavueMcpServer,"createOfficialClavueMcpServer")}});var InProcessTransport_exports={};__export(InProcessTransport_exports,{createLinkedTransportPair:()=>createLinkedTransportPair});function createLinkedTransportPair(){let a2=new InProcessTransport,b3=new InProcessTransport;return a2._setPeer(b3),b3._setPeer(a2),[a2,b3]}var InProcessTransport,init_InProcessTransport=__esm({"src/services/mcp/InProcessTransport.ts"(){InProcessTransport=class{static{__name(this,"InProcessTransport")}peer;closed=!1;onclose;onerror;onmessage;_setPeer(peer){this.peer=peer}async start(){}async send(message){if(this.closed)throw new Error("Transport is closed");queueMicrotask(()=>{this.peer?.onmessage?.(message)})}async close(){this.closed||(this.closed=!0,this.onclose?.(),this.peer&&!this.peer.closed&&(this.peer.closed=!0,this.peer.onclose?.()))}};__name(createLinkedTransportPair,"createLinkedTransportPair")}});var officialBrowserMcp_exports={};__export(officialBrowserMcp_exports,{OFFICIAL_BROWSER_MCP_SERVER_NAME:()=>OFFICIAL_BROWSER_MCP_SERVER_NAME,OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG:()=>OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG,PLAYWRIGHT_MCP_PACKAGE:()=>PLAYWRIGHT_MCP_PACKAGE,buildBrowserRuntimeMcpConfig:()=>buildBrowserRuntimeMcpConfig,buildOfficialBrowserMcpConfig:()=>buildOfficialBrowserMcpConfig,getOfficialBrowserMcpConfigsIfEligible:()=>getOfficialBrowserMcpConfigsIfEligible,isBrowserRuntimeInProcessConfig:()=>isBrowserRuntimeInProcessConfig,isOfficialBrowserMcpServer:()=>isOfficialBrowserMcpServer,parseBrowserRuntimeKindFromArgs:()=>parseBrowserRuntimeKindFromArgs,resolveOfficialBrowserMcpGate:()=>resolveOfficialBrowserMcpGate});function readAllowBrowser(){try{return getInitialSettings()?.allowBrowser===!0}catch{return!1}}function resolveOfficialBrowserMcpGate(options){if(options?.force?.bare??isBareMode())return{enabled:!1,reason:"disabled_bare",allowBrowser:!1};if(options?.strictMcpConfig)return{enabled:!1,reason:"disabled_strict_mcp",allowBrowser:!1};if(options?.chromeFlagOverride===!1)return{enabled:!1,reason:"disabled_no_chrome",allowBrowser:!1};if(String(process.env.CLAVUE_BROWSER_BACKEND||"").trim().toLowerCase()==="off")return{enabled:!1,reason:"disabled_backend_off",allowBrowser:readAllowBrowser()};let envRaw2=options?.force?.env!==void 0?options.force.env:process.env.CLAVUE_BROWSER_MCP;if(isEnvDefinedFalsy(envRaw2))return{enabled:!1,reason:"disabled_env",allowBrowser:!1};if(!(options?.force?.allowBrowser!==void 0?options.force.allowBrowser:readAllowBrowser()))return{enabled:!1,reason:"allow_browser_false",allowBrowser:!1};let nonInteractive=options?.isNonInteractive??(process.argv.includes("-p")||process.argv.includes("--print")),headlessForce=isEnvTruthy2(envRaw2)||isEnvTruthy2(process.env.CLAVUE_HEADLESS_BROWSER_MCP)||isEnvTruthy2(process.env.CLAVUE_HEADLESS_BROWSER_RUNTIME);return nonInteractive&&!headlessForce?{enabled:!1,reason:"disabled_headless_default",allowBrowser:!0}:{enabled:!0,reason:isEnvTruthy2(envRaw2)?"enabled_env":"enabled_allow_browser",allowBrowser:!0}}function isOfficialBrowserMcpServer(name){return name===OFFICIAL_BROWSER_MCP_SERVER_NAME}function isBrowserRuntimeInProcessConfig(cfg){return!cfg||cfg.type!=="stdio"||!("args"in cfg)||!Array.isArray(cfg.args)?!1:cfg.args.map(String).includes(OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG)}function parseBrowserRuntimeKindFromArgs(args){let list2=Array.isArray(args)?args.map(String):[],idx=list2.indexOf(OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG);return(idx>=0?list2[idx+1]:void 0)==="native_runtime"?"native_runtime":"attach_cdp"}function buildBrowserRuntimeMcpConfig(kind){return{[OFFICIAL_BROWSER_MCP_SERVER_NAME]:{type:"stdio",command:process.execPath,args:[OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG,kind],scope:"dynamic"}}}function defaultPlaywrightArgs(){let raw=String(process.env.CLAVUE_BROWSER_MCP_ARGS||"").trim();if(raw){if(raw.startsWith("["))try{let parsed=JSON.parse(raw);if(Array.isArray(parsed))return parsed.map(String)}catch{}return raw.split(/\s+/).filter(Boolean)}return["-y",PLAYWRIGHT_MCP_PACKAGE]}function buildOfficialBrowserMcpConfig(){let command7=String(process.env.CLAVUE_BROWSER_MCP_CMD||"").trim()||"npx",args=defaultPlaywrightArgs();return{[OFFICIAL_BROWSER_MCP_SERVER_NAME]:{type:"stdio",command:command7,args,scope:"dynamic",env:{...process.env.PLAYWRIGHT_MCP_HEADED?{PLAYWRIGHT_MCP_HEADED:process.env.PLAYWRIGHT_MCP_HEADED}:{}}}}}function getOfficialBrowserMcpConfigsIfEligible(options){try{let gate=resolveOfficialBrowserMcpGate({strictMcpConfig:options?.strictMcpConfig,chromeFlagOverride:options?.chromeFlagOverride,isNonInteractive:options?.isNonInteractive});return logForDebugging(`[browser-mcp] Path A gate enabled=${gate.enabled} reason=${gate.reason} allowBrowser=${gate.allowBrowser}`),gate.enabled?buildOfficialBrowserMcpConfig():{}}catch(error40){return logForDebugging(`[browser-mcp] inject skipped (soft-fail): ${errorMessage2(error40)}`,{level:"error"}),{}}}var OFFICIAL_BROWSER_MCP_SERVER_NAME,OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG,PLAYWRIGHT_MCP_PACKAGE,init_officialBrowserMcp=__esm({"src/services/mcp/officialBrowserMcp.ts"(){init_debug();init_envUtils();init_errors2();init_settings2();OFFICIAL_BROWSER_MCP_SERVER_NAME="clavue-browser",OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG="--clavue-browser-runtime-mcp",PLAYWRIGHT_MCP_PACKAGE="@playwright/mcp@latest";__name(readAllowBrowser,"readAllowBrowser");__name(resolveOfficialBrowserMcpGate,"resolveOfficialBrowserMcpGate");__name(isOfficialBrowserMcpServer,"isOfficialBrowserMcpServer");__name(isBrowserRuntimeInProcessConfig,"isBrowserRuntimeInProcessConfig");__name(parseBrowserRuntimeKindFromArgs,"parseBrowserRuntimeKindFromArgs");__name(buildBrowserRuntimeMcpConfig,"buildBrowserRuntimeMcpConfig");__name(defaultPlaywrightArgs,"defaultPlaywrightArgs");__name(buildOfficialBrowserMcpConfig,"buildOfficialBrowserMcpConfig");__name(getOfficialBrowserMcpConfigsIfEligible,"getOfficialBrowserMcpConfigsIfEligible")}});function allowBrowserNavigateUrl(raw,env5=process.env){let input2=String(raw||"").trim();if(!input2)return{ok:!1,reason:"empty_url"};let url3;try{url3=new URL(input2)}catch{return{ok:!1,reason:"invalid_url"}}let scheme=url3.protocol.replace(/:$/,"").toLowerCase();return scheme==="about"?url3.pathname==="blank"||input2.toLowerCase()==="about:blank"?{ok:!0,url:"about:blank"}:{ok:!1,reason:"about_not_blank"}:scheme==="http"||scheme==="https"?url3.username||url3.password?{ok:!1,reason:"credentials_in_url"}:{ok:!0,url:url3.toString()}:scheme==="file"?env5.CLAVUE_BROWSER_ALLOW_FILE==="1"||String(env5.CLAVUE_BROWSER_ALLOW_FILE||"").toLowerCase()==="true"?{ok:!0,url:url3.toString()}:{ok:!1,reason:"file_scheme_denied (set CLAVUE_BROWSER_ALLOW_FILE=1)"}:{ok:!1,reason:`scheme_denied:${scheme}`}}var init_navigateAllowlist=__esm({"src/services/browser/navigateAllowlist.ts"(){__name(allowBrowserNavigateUrl,"allowBrowserNavigateUrl")}});function createEmptyRefTable(generation=0){return{generation,byId:new Map}}function normalizeRefId(ref){let s2=String(ref||"").trim();return s2?s2.startsWith("@")?s2:`@${s2}`:""}function resolveRef2(table,ref){if(!table||table.generation<=0||table.byId.size===0)return{ok:!1,error:"ref_no_snapshot: call browser_snapshot first (semantic_v1)"};let id=normalizeRefId(ref);if(!id)return{ok:!1,error:"ref_invalid: empty ref"};let entry=table.byId.get(id);return entry?{ok:!0,entry,generation:table.generation}:{ok:!1,error:`ref_expired_resnapshot: ${id} not in generation=${table.generation}. Call browser_snapshot again.`}}function buildRefTable(generation,refs){let byId=new Map;for(let r2 of refs)byId.set(normalizeRefId(r2.id),r2);return{generation,byId}}var init_refs=__esm({"src/services/browser/snapshot/refs.ts"(){__name(createEmptyRefTable,"createEmptyRefTable");__name(normalizeRefId,"normalizeRefId");__name(resolveRef2,"resolveRef");__name(buildRefTable,"buildRefTable")}});function roleOf(n4){return String(n4.role?.value||"generic").toLowerCase()}function nameOf(n4){return String(n4.name?.value||n4.description?.value||"").trim()}function isInteresting(n4){if(n4.ignored)return!1;let role=roleOf(n4);return INTERACTIVE_ROLES.has(role)?!0:role==="heading"||role==="main"||role==="navigation"||role==="banner"||role==="contentinfo"||role==="form"||role==="dialog"||role==="alertdialog"||role==="document"||role==="region"||role==="list"||role==="listitem"||role==="article"||role==="img"||role==="statictext"?!!nameOf(n4)||role!=="statictext":!1}function shouldAssignRef(n4){return n4.ignored||n4.backendDOMNodeId==null?!1:INTERACTIVE_ROLES.has(roleOf(n4))}async function captureSemanticSnapshot(opts){let generation=(opts.previousGeneration??0)+1;await opts.client.send("Accessibility.enable",{},{sessionId:opts.cdpSessionId}).catch(()=>{}),await opts.client.send("DOM.enable",{},{sessionId:opts.cdpSessionId}).catch(()=>{});let nodes=[];try{nodes=(await opts.client.send("Accessibility.getFullAXTree",{},{sessionId:opts.cdpSessionId,timeoutMs:12e3})).nodes||[]}catch{return fallbackDomSnapshot(opts,generation)}let byId=new Map(nodes.map(n4=>[n4.nodeId,n4])),roots=nodes.filter(n4=>!n4.parentId||!byId.has(n4.parentId)),refs=[],refCounter=0,refByNodeId=new Map;function assignRef(n4){if(!shouldAssignRef(n4)||refCounter>=MAX_REFS)return;refCounter+=1;let id=`@e${refCounter}`,entry={id,role:roleOf(n4),name:nameOf(n4)||void 0,interactive:!0,backendDOMNodeId:n4.backendDOMNodeId,axNodeId:n4.nodeId};return refs.push(entry),refByNodeId.set(n4.nodeId,id),id}__name(assignRef,"assignRef");let lines=[];function walk(n4,depth){if(n4.ignored&&!n4.childIds?.length)return;let interesting=isInteresting(n4),role=roleOf(n4),name=nameOf(n4),refId=interesting?assignRef(n4):void 0;if(interesting||depth===0){let indent=" ".repeat(Math.min(depth,12)),label2=name?` ${truncate4(name,80)}`:"",refSuffix=refId?` ${refId}`:"";lines.push(`${indent}[${role}]${label2}${refSuffix}`)}for(let cid of n4.childIds||[]){let child=byId.get(cid);child&&walk(child,depth+1)}}if(__name(walk,"walk"),roots.length===0&&nodes.length>0)walk(nodes[0],0);else for(let r2 of roots.slice(0,20))walk(r2,0);let meta=await opts.client.evaluate(opts.cdpSessionId,"(() => ({ url: location.href, title: document.title || '' }))()").catch(()=>({url:"",title:""})),tree=lines.join(`
5950
5950
  `),truncated=!1;return tree.length>MAX_TREE_CHARS&&(tree=tree.slice(0,MAX_TREE_CHARS),truncated=!0),refCounter>=MAX_REFS&&(truncated=!0),{snapshot:{spaceId:opts.spaceId,url:String(meta?.url||""),title:String(meta?.title||""),generation,refs:refs.map(r2=>({id:r2.id,role:r2.role,name:r2.name,interactive:r2.interactive})),tree,truncated,protocol:"semantic_v1"},refTable:buildRefTable(generation,refs)}}async function fallbackDomSnapshot(opts,generation){let data=await opts.client.evaluate(opts.cdpSessionId,`(() => {
5951
5951
  const interactive = ['a','button','input','textarea','select','summary','[role=button]','[role=link]','[role=textbox]','[contenteditable=true]'];
5952
5952
  const els = [];
@@ -5973,9 +5973,9 @@ ${result2.summary}`:null].filter(Boolean);if(result2.results.length>0?(lines.pus
5973
5973
  url: location.href,
5974
5974
  title: document.title || '',
5975
5975
  text: (document.body && (document.body.innerText || document.body.textContent)) || ''
5976
- }))()`),text3=String(meta?.text||""),truncated=!1;return text3.length>24e3&&(text3=text3.slice(0,24e3),truncated=!0),{spaceId:opts.spaceId,url:String(meta?.url||""),title:String(meta?.title||""),text:text3,truncated,protocol:"raw_v0"}}var init_raw=__esm({"src/services/browser/snapshot/raw.ts"(){__name(captureRawSnapshot,"captureRawSnapshot")}});var PHASE0_BROWSER_TOOLS,PHASE1_ACT_TOOLS,PHASE1_BATCH_TOOLS,BROWSER_RUNTIME_TOOLS,init_toolDefs=__esm({"src/services/browser/mcp/toolDefs.ts"(){PHASE0_BROWSER_TOOLS=[{name:"browser_navigate",description:"Navigate the agent-owned browser tab to a URL (Clavue Browser Runtime attach/native). Creates an agent tab if none exists. Invalidates @ref table \u2014 call browser_snapshot after navigate.",inputSchema:{type:"object",properties:{url:{type:"string",description:"Absolute URL to open"}},required:["url"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}},{name:"browser_tabs",description:"List agent-owned browser tabs (default). Pre-existing user tabs are omitted unless includeUserTabs is true.",inputSchema:{type:"object",properties:{action:{type:"string",enum:["list"],description:'Only "list" is supported in Phase 0\u20131'},includeUserTabs:{type:"boolean",description:"If true, attempt to include user tabs (may be denied)"}},required:["action"]},annotations:{readOnlyHint:!0,openWorldHint:!0,destructiveHint:!1}},{name:"browser_snapshot",description:'Capture semantic_v1 accessibility snapshot with generation-scoped @eN refs. Use @eN with browser_click / browser_type. After navigate or DOM change, snapshot again (stale refs return ref_expired_resnapshot). protocol is "semantic_v1".',inputSchema:{type:"object",properties:{mode:{type:"string",enum:["semantic","raw"],description:"semantic (default) = semantic_v1 + @ref; raw = raw_v0 text only (no refs)"}}},annotations:{readOnlyHint:!0,openWorldHint:!0,destructiveHint:!1}},{name:"browser_take_screenshot",description:"Capture a PNG screenshot of the active agent tab. Returns base64 PNG.",inputSchema:{type:"object",properties:{fullPage:{type:"boolean",description:"Reserved; viewport only for now"}}},annotations:{readOnlyHint:!0,openWorldHint:!0,destructiveHint:!1}},{name:"browser_status",description:"Return Clavue browser backend status (kind, endpoint host:port only, isolation, ref generation). Never includes cookies.",inputSchema:{type:"object",properties:{}},annotations:{readOnlyHint:!0,openWorldHint:!1,destructiveHint:!1}}],PHASE1_ACT_TOOLS=[{name:"browser_click",description:'Click element by @ref from the latest browser_snapshot (semantic_v1). Example: { "ref": "@e6" }. Stale refs fail with ref_expired_resnapshot.',inputSchema:{type:"object",properties:{ref:{type:"string",description:"Ref id like @e6 from latest snapshot"}},required:["ref"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}},{name:"browser_type",description:"Focus element by @ref and type text. Optional submit=true presses Enter after typing.",inputSchema:{type:"object",properties:{ref:{type:"string",description:"Ref id like @e4"},text:{type:"string",description:"Text to type (max 8KiB)"},submit:{type:"boolean",description:"If true, press Enter after typing"}},required:["ref","text"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}},{name:"browser_press",description:"Press a key in the active page (Enter, Tab, Escape, Arrow*, or single char). Does not require a ref.",inputSchema:{type:"object",properties:{key:{type:"string",description:"Key name: Enter, Tab, Escape, Backspace, ArrowDown, \u2026"}},required:["key"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}}],PHASE1_BATCH_TOOLS=[{name:"browser_act",description:"Run multiple browser steps in one call (structured steps only \u2014 no freeform JS). Ops: navigate, click, type, press, wait, scroll, select, screenshot. After navigate, runtime resnapshots so subsequent @ref steps use a fresh generation. Max 20 steps, ~30s wall. Prefer this over many atomic click/type tool round-trips.",inputSchema:{type:"object",properties:{steps:{type:"array",description:"Ordered ActStep objects",items:{type:"object",properties:{op:{type:"string",enum:["navigate","click","type","press","wait","scroll","select","screenshot"]},url:{type:"string"},ref:{type:"string"},text:{type:"string"},submit:{type:"boolean"},key:{type:"string"},ms:{type:"number"},urlIncludes:{type:"string"},dy:{type:"number"},values:{type:"array",items:{type:"string"}},fullPage:{type:"boolean"}},required:["op"]}},stopOnError:{type:"boolean",description:"Default true \u2014 stop at first failed step"},returnSnapshot:{type:"boolean",description:"Default true \u2014 return final semantic_v1 snapshot"},spaceId:{type:"string"}},required:["steps"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}}],BROWSER_RUNTIME_TOOLS=[...PHASE0_BROWSER_TOOLS,...PHASE1_ACT_TOOLS,...PHASE1_BATCH_TOOLS]}});var server_exports={};__export(server_exports,{createBrowserRuntimeMcpServer:()=>createBrowserRuntimeMcpServer});function textResult(text3,isError2=!1){return{isError:isError2,content:[{type:"text",text:text3}]}}function createBrowserRuntimeMcpServer(kind="attach_cdp"){let server2=new Server({name:OFFICIAL_BROWSER_MCP_SERVER_NAME,version:typeof MACRO<"u"?"13.9.1":"1.0.0"},{capabilities:{tools:{}},instructions:"Clavue Browser Runtime (attach/native). Prefer browser_act for multi-step flows (navigate/click/type/press/wait in one call). Or: browser_snapshot \u2192 @eN refs \u2192 browser_click/type/press. After navigate outside act, resnapshot before refs. Agent-owned tabs only by default. Never invent page content on tool errors."});return server2.setRequestHandler(ListToolsRequestSchema,async()=>({tools:BROWSER_RUNTIME_TOOLS.map(t7=>({name:t7.name,description:t7.description,inputSchema:t7.inputSchema,annotations:t7.annotations}))})),server2.setRequestHandler(CallToolRequestSchema,async request=>{let toolName4=String(request.params.name||"").replace(/^mcp__clavue-browser__/,"").replace(/^mcp__/,""),args=request.params.arguments??{};try{switch(toolName4){case"browser_status":return handleStatus();case"browser_tabs":return await handleTabs(args,kind);case"browser_navigate":return await handleNavigate(args,kind);case"browser_snapshot":return await handleSnapshot(args,kind);case"browser_take_screenshot":return await handleScreenshot(kind);case"browser_click":return await handleClick(args,kind);case"browser_type":return await handleType(args,kind);case"browser_press":return await handlePress(args,kind);case"browser_act":return await handleAct(args,kind);default:return textResult(`Unknown browser tool: ${request.params.name}. Supported: ${BROWSER_RUNTIME_TOOLS.map(t7=>t7.name).join(", ")}.`,!0)}}catch(err2){return logForDebugging(`[browser-runtime] CallTool error: ${errorMessage2(err2)}`,{level:"error"}),textResult(`Browser runtime error: ${errorMessage2(err2)}`,!0)}}),server2}function handleStatus(){let status2=getBrowserBackendStatus(),sticky2=getStickySession();return textResult(JSON.stringify({kind:status2.kind,enabled:status2.enabled,reason:status2.reason,endpoint:status2.endpoint,isolation:status2.isolation,spaces:status2.spaces,activeSpaceId:status2.activeSpaceId,cookieIsolationGuaranteed:status2.cookieIsolationGuaranteed,protocol:"semantic_v1",refGeneration:sticky2?.refTable?.generation??0,refCount:sticky2?.refTable?.byId.size??0},null,2))}async function ensureClient(kind){let status2=await ensureBrowserBackend({force:kind==="native_runtime"?"native_runtime":kind==="attach_cdp"?"attach_cdp":void 0});if(!status2.enabled||status2.kind==="none")throw new Error(`browser_backend_unavailable:${status2.reason}. Try: clavue browser start \xB7 CLAVUE_CDP_URL=http://127.0.0.1:9222 \xB7 allowBrowser=true \xB7 or Path A playwright.`);let sticky2=getStickySession();if(!sticky2?.client)throw new Error("browser_cdp_client_missing");return sticky2}async function ensureActiveSession(kind){let sticky2=await ensureClient(kind),targetId=sticky2.activeTargetId;targetId||(targetId=(await sticky2.client.listPageTargets()).find(p=>sticky2.agentTargetIds.has(p.targetId))?.targetId||await sticky2.client.createTarget("about:blank"),sticky2.agentTargetIds.add(targetId),sticky2.activeTargetId=targetId);let cdpSessionId=await sticky2.client.attachToTarget(targetId);return sticky2.activeCdpSessionId=cdpSessionId,setStickySession(void 0,sticky2),await sticky2.client.send("Page.enable",{},{sessionId:cdpSessionId}).catch(()=>{}),await sticky2.client.send("Runtime.enable",{},{sessionId:cdpSessionId}).catch(()=>{}),{sticky:sticky2,cdpSessionId,targetId}}async function handleTabs(args,kind){let action=String(args.action||"list");if(action!=="list")return textResult(`Unsupported tabs action: ${action}`,!0);let includeUser=args.includeUserTabs===!0,sticky2=await ensureClient(kind),pages=await sticky2.client.listPageTargets(),agentIds=sticky2.agentTargetIds,tabs=pages.filter(p=>includeUser||agentIds.has(p.targetId)).map(p=>({targetId:p.targetId,title:p.title,url:p.url,ownedByAgent:agentIds.has(p.targetId)}));return textResult(JSON.stringify({tabs,includeUserTabs:includeUser,note:includeUser?"User tabs included (attach shares profile \u2014 cookie isolation not guaranteed).":"Default list is agent-owned targets only."},null,2))}async function handleNavigate(args,kind){let rawUrl=String(args.url||"").trim();if(!rawUrl)return textResult("url is required",!0);let allowed=allowBrowserNavigateUrl(rawUrl);if(allowed.ok===!1)return textResult(`Navigate denied: ${allowed.reason}. Allowed: http(s)://, about:blank`+(process.env.CLAVUE_BROWSER_ALLOW_FILE==="1"?", file:":""),!0);let url3=allowed.url,sticky2=await ensureClient(kind),targetId=sticky2.activeTargetId;(!targetId||!sticky2.agentTargetIds.has(targetId))&&(targetId=await sticky2.client.createTarget(url3),sticky2.agentTargetIds.add(targetId),sticky2.activeTargetId=targetId);let cdpSessionId=await sticky2.client.attachToTarget(targetId);return sticky2.activeCdpSessionId=cdpSessionId,await sticky2.client.send("Page.enable",{},{sessionId:cdpSessionId}),await sticky2.client.navigate(cdpSessionId,url3),invalidateRefTable(),setStickySession(void 0,getStickySession()??sticky2),await new Promise(r2=>setTimeout(r2,300)),textResult(JSON.stringify({ok:!0,targetId,url:url3,spaceId:"agent:default",note:"Refs invalidated \u2014 call browser_snapshot before click/type."}))}async function handleSnapshot(args,kind){let mode2=String(args.mode||"semantic").toLowerCase(),{sticky:sticky2,cdpSessionId}=await ensureActiveSession(kind);if(mode2==="raw"){let snap=await captureRawSnapshot({client:sticky2.client,sessionId:cdpSessionId,spaceId:"agent:default"});return textResult(JSON.stringify(snap,null,2))}let{snapshot:snapshot2,refTable}=await captureSemanticSnapshot({client:sticky2.client,cdpSessionId,spaceId:"agent:default",previousGeneration:sticky2.refTable?.generation??0});sticky2.refTable=refTable,setStickySession(void 0,sticky2);let body=[snapshot2.tree,"","---",JSON.stringify({protocol:snapshot2.protocol,spaceId:snapshot2.spaceId,generation:snapshot2.generation,url:snapshot2.url,title:snapshot2.title,refCount:snapshot2.refs.length,refs:snapshot2.refs.map(r2=>r2.id),truncated:snapshot2.truncated})].join(`
5976
+ }))()`),text3=String(meta?.text||""),truncated=!1;return text3.length>24e3&&(text3=text3.slice(0,24e3),truncated=!0),{spaceId:opts.spaceId,url:String(meta?.url||""),title:String(meta?.title||""),text:text3,truncated,protocol:"raw_v0"}}var init_raw=__esm({"src/services/browser/snapshot/raw.ts"(){__name(captureRawSnapshot,"captureRawSnapshot")}});var PHASE0_BROWSER_TOOLS,PHASE1_ACT_TOOLS,PHASE1_BATCH_TOOLS,BROWSER_RUNTIME_TOOLS,init_toolDefs=__esm({"src/services/browser/mcp/toolDefs.ts"(){PHASE0_BROWSER_TOOLS=[{name:"browser_navigate",description:"Navigate the agent-owned browser tab to a URL (Clavue Browser Runtime attach/native). Creates an agent tab if none exists. Invalidates @ref table \u2014 call browser_snapshot after navigate.",inputSchema:{type:"object",properties:{url:{type:"string",description:"Absolute URL to open"}},required:["url"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}},{name:"browser_tabs",description:"List agent-owned browser tabs (default). Pre-existing user tabs are omitted unless includeUserTabs is true.",inputSchema:{type:"object",properties:{action:{type:"string",enum:["list"],description:'Only "list" is supported in Phase 0\u20131'},includeUserTabs:{type:"boolean",description:"If true, attempt to include user tabs (may be denied)"}},required:["action"]},annotations:{readOnlyHint:!0,openWorldHint:!0,destructiveHint:!1}},{name:"browser_snapshot",description:'Capture semantic_v1 accessibility snapshot with generation-scoped @eN refs. Use @eN with browser_click / browser_type. After navigate or DOM change, snapshot again (stale refs return ref_expired_resnapshot). protocol is "semantic_v1".',inputSchema:{type:"object",properties:{mode:{type:"string",enum:["semantic","raw"],description:"semantic (default) = semantic_v1 + @ref; raw = raw_v0 text only (no refs)"}}},annotations:{readOnlyHint:!0,openWorldHint:!0,destructiveHint:!1}},{name:"browser_take_screenshot",description:"Capture a PNG screenshot of the active agent tab. Returns base64 PNG.",inputSchema:{type:"object",properties:{fullPage:{type:"boolean",description:"Reserved; viewport only for now"}}},annotations:{readOnlyHint:!0,openWorldHint:!0,destructiveHint:!1}},{name:"browser_status",description:"Return Clavue browser backend status (kind, endpoint host:port only, isolation, ref generation). Never includes cookies.",inputSchema:{type:"object",properties:{}},annotations:{readOnlyHint:!0,openWorldHint:!1,destructiveHint:!1}}],PHASE1_ACT_TOOLS=[{name:"browser_click",description:'Click element by @ref from the latest browser_snapshot (semantic_v1). Example: { "ref": "@e6" }. Stale refs fail with ref_expired_resnapshot.',inputSchema:{type:"object",properties:{ref:{type:"string",description:"Ref id like @e6 from latest snapshot"}},required:["ref"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}},{name:"browser_type",description:"Focus element by @ref and type text. Optional submit=true presses Enter after typing.",inputSchema:{type:"object",properties:{ref:{type:"string",description:"Ref id like @e4"},text:{type:"string",description:"Text to type (max 8KiB)"},submit:{type:"boolean",description:"If true, press Enter after typing"}},required:["ref","text"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}},{name:"browser_press",description:"Press a key in the active page (Enter, Tab, Escape, Arrow*, or single char). Does not require a ref.",inputSchema:{type:"object",properties:{key:{type:"string",description:"Key name: Enter, Tab, Escape, Backspace, ArrowDown, \u2026"}},required:["key"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}}],PHASE1_BATCH_TOOLS=[{name:"browser_act",description:"Run multiple browser steps in one call (structured steps only \u2014 no freeform JS). Ops: navigate, click, type, press, wait, scroll, select, screenshot. After navigate, runtime resnapshots so subsequent @ref steps use a fresh generation. Max 20 steps, ~30s wall. Prefer this over many atomic click/type tool round-trips.",inputSchema:{type:"object",properties:{steps:{type:"array",description:"Ordered ActStep objects",items:{type:"object",properties:{op:{type:"string",enum:["navigate","click","type","press","wait","scroll","select","screenshot"]},url:{type:"string"},ref:{type:"string"},text:{type:"string"},submit:{type:"boolean"},key:{type:"string"},ms:{type:"number"},urlIncludes:{type:"string"},dy:{type:"number"},values:{type:"array",items:{type:"string"}},fullPage:{type:"boolean"}},required:["op"]}},stopOnError:{type:"boolean",description:"Default true \u2014 stop at first failed step"},returnSnapshot:{type:"boolean",description:"Default true \u2014 return final semantic_v1 snapshot"},spaceId:{type:"string"}},required:["steps"]},annotations:{readOnlyHint:!1,openWorldHint:!0,destructiveHint:!1}}],BROWSER_RUNTIME_TOOLS=[...PHASE0_BROWSER_TOOLS,...PHASE1_ACT_TOOLS,...PHASE1_BATCH_TOOLS]}});var server_exports={};__export(server_exports,{createBrowserRuntimeMcpServer:()=>createBrowserRuntimeMcpServer});function textResult(text3,isError2=!1){return{isError:isError2,content:[{type:"text",text:text3}]}}function createBrowserRuntimeMcpServer(kind="attach_cdp"){let server2=new Server({name:OFFICIAL_BROWSER_MCP_SERVER_NAME,version:typeof MACRO<"u"?"13.9.2":"1.0.0"},{capabilities:{tools:{}},instructions:"Clavue Browser Runtime (attach/native). Prefer browser_act for multi-step flows (navigate/click/type/press/wait in one call). Or: browser_snapshot \u2192 @eN refs \u2192 browser_click/type/press. After navigate outside act, resnapshot before refs. Agent-owned tabs only by default. Never invent page content on tool errors."});return server2.setRequestHandler(ListToolsRequestSchema,async()=>({tools:BROWSER_RUNTIME_TOOLS.map(t7=>({name:t7.name,description:t7.description,inputSchema:t7.inputSchema,annotations:t7.annotations}))})),server2.setRequestHandler(CallToolRequestSchema,async request=>{let toolName4=String(request.params.name||"").replace(/^mcp__clavue-browser__/,"").replace(/^mcp__/,""),args=request.params.arguments??{};try{switch(toolName4){case"browser_status":return handleStatus();case"browser_tabs":return await handleTabs(args,kind);case"browser_navigate":return await handleNavigate(args,kind);case"browser_snapshot":return await handleSnapshot(args,kind);case"browser_take_screenshot":return await handleScreenshot(kind);case"browser_click":return await handleClick(args,kind);case"browser_type":return await handleType(args,kind);case"browser_press":return await handlePress(args,kind);case"browser_act":return await handleAct(args,kind);default:return textResult(`Unknown browser tool: ${request.params.name}. Supported: ${BROWSER_RUNTIME_TOOLS.map(t7=>t7.name).join(", ")}.`,!0)}}catch(err2){return logForDebugging(`[browser-runtime] CallTool error: ${errorMessage2(err2)}`,{level:"error"}),textResult(`Browser runtime error: ${errorMessage2(err2)}`,!0)}}),server2}function handleStatus(){let status2=getBrowserBackendStatus(),sticky2=getStickySession();return textResult(JSON.stringify({kind:status2.kind,enabled:status2.enabled,reason:status2.reason,endpoint:status2.endpoint,isolation:status2.isolation,spaces:status2.spaces,activeSpaceId:status2.activeSpaceId,cookieIsolationGuaranteed:status2.cookieIsolationGuaranteed,protocol:"semantic_v1",refGeneration:sticky2?.refTable?.generation??0,refCount:sticky2?.refTable?.byId.size??0},null,2))}async function ensureClient(kind){let status2=await ensureBrowserBackend({force:kind==="native_runtime"?"native_runtime":kind==="attach_cdp"?"attach_cdp":void 0});if(!status2.enabled||status2.kind==="none")throw new Error(`browser_backend_unavailable:${status2.reason}. Try: clavue browser start \xB7 CLAVUE_CDP_URL=http://127.0.0.1:9222 \xB7 allowBrowser=true \xB7 or Path A playwright.`);let sticky2=getStickySession();if(!sticky2?.client)throw new Error("browser_cdp_client_missing");return sticky2}async function ensureActiveSession(kind){let sticky2=await ensureClient(kind),targetId=sticky2.activeTargetId;targetId||(targetId=(await sticky2.client.listPageTargets()).find(p=>sticky2.agentTargetIds.has(p.targetId))?.targetId||await sticky2.client.createTarget("about:blank"),sticky2.agentTargetIds.add(targetId),sticky2.activeTargetId=targetId);let cdpSessionId=await sticky2.client.attachToTarget(targetId);return sticky2.activeCdpSessionId=cdpSessionId,setStickySession(void 0,sticky2),await sticky2.client.send("Page.enable",{},{sessionId:cdpSessionId}).catch(()=>{}),await sticky2.client.send("Runtime.enable",{},{sessionId:cdpSessionId}).catch(()=>{}),{sticky:sticky2,cdpSessionId,targetId}}async function handleTabs(args,kind){let action=String(args.action||"list");if(action!=="list")return textResult(`Unsupported tabs action: ${action}`,!0);let includeUser=args.includeUserTabs===!0,sticky2=await ensureClient(kind),pages=await sticky2.client.listPageTargets(),agentIds=sticky2.agentTargetIds,tabs=pages.filter(p=>includeUser||agentIds.has(p.targetId)).map(p=>({targetId:p.targetId,title:p.title,url:p.url,ownedByAgent:agentIds.has(p.targetId)}));return textResult(JSON.stringify({tabs,includeUserTabs:includeUser,note:includeUser?"User tabs included (attach shares profile \u2014 cookie isolation not guaranteed).":"Default list is agent-owned targets only."},null,2))}async function handleNavigate(args,kind){let rawUrl=String(args.url||"").trim();if(!rawUrl)return textResult("url is required",!0);let allowed=allowBrowserNavigateUrl(rawUrl);if(allowed.ok===!1)return textResult(`Navigate denied: ${allowed.reason}. Allowed: http(s)://, about:blank`+(process.env.CLAVUE_BROWSER_ALLOW_FILE==="1"?", file:":""),!0);let url3=allowed.url,sticky2=await ensureClient(kind),targetId=sticky2.activeTargetId;(!targetId||!sticky2.agentTargetIds.has(targetId))&&(targetId=await sticky2.client.createTarget(url3),sticky2.agentTargetIds.add(targetId),sticky2.activeTargetId=targetId);let cdpSessionId=await sticky2.client.attachToTarget(targetId);return sticky2.activeCdpSessionId=cdpSessionId,await sticky2.client.send("Page.enable",{},{sessionId:cdpSessionId}),await sticky2.client.navigate(cdpSessionId,url3),invalidateRefTable(),setStickySession(void 0,getStickySession()??sticky2),await new Promise(r2=>setTimeout(r2,300)),textResult(JSON.stringify({ok:!0,targetId,url:url3,spaceId:"agent:default",note:"Refs invalidated \u2014 call browser_snapshot before click/type."}))}async function handleSnapshot(args,kind){let mode2=String(args.mode||"semantic").toLowerCase(),{sticky:sticky2,cdpSessionId}=await ensureActiveSession(kind);if(mode2==="raw"){let snap=await captureRawSnapshot({client:sticky2.client,sessionId:cdpSessionId,spaceId:"agent:default"});return textResult(JSON.stringify(snap,null,2))}let{snapshot:snapshot2,refTable}=await captureSemanticSnapshot({client:sticky2.client,cdpSessionId,spaceId:"agent:default",previousGeneration:sticky2.refTable?.generation??0});sticky2.refTable=refTable,setStickySession(void 0,sticky2);let body=[snapshot2.tree,"","---",JSON.stringify({protocol:snapshot2.protocol,spaceId:snapshot2.spaceId,generation:snapshot2.generation,url:snapshot2.url,title:snapshot2.title,refCount:snapshot2.refs.length,refs:snapshot2.refs.map(r2=>r2.id),truncated:snapshot2.truncated})].join(`
5977
5977
  `);return textResult(body)}async function handleScreenshot(kind){let{sticky:sticky2,cdpSessionId,targetId}=await ensureActiveSession(kind),b64=await sticky2.client.captureScreenshotPng(cdpSessionId);return!b64||b64.length<32?textResult(JSON.stringify({ok:!1,targetId,error:"screenshot_empty_or_truncated"}),!0):{isError:!1,content:[{type:"text",text:JSON.stringify({ok:!0,targetId,format:"png",encoding:"base64",bytes:Math.floor(b64.length*3/4)})},{type:"image",data:b64,mimeType:"image/png"}]}}async function handleClick(args,kind){let ref=String(args.ref||""),{sticky:sticky2,cdpSessionId}=await ensureActiveSession(kind),result2=await clickByRef({client:sticky2.client,cdpSessionId,refTable:sticky2.refTable,ref});return result2.ok===!1?textResult(result2.error,!0):textResult(JSON.stringify({ok:!0,...result2}))}async function handleType(args,kind){let ref=String(args.ref||""),text3=String(args.text??""),submit=args.submit===!0,{sticky:sticky2,cdpSessionId}=await ensureActiveSession(kind),result2=await typeByRef({client:sticky2.client,cdpSessionId,refTable:sticky2.refTable,ref,text:text3,submit});return result2.ok===!1?textResult(result2.error,!0):textResult(JSON.stringify({ok:!0,...result2,submit}))}async function handlePress(args,kind){let key3=String(args.key||""),{sticky:sticky2,cdpSessionId}=await ensureActiveSession(kind),result2=await pressKey({client:sticky2.client,cdpSessionId,key:key3});return result2.ok===!1?textResult(result2.error,!0):textResult(JSON.stringify({ok:!0,...result2}))}async function handleAct(args,kind){let script=parseActScript(args),{sticky:sticky2,cdpSessionId,targetId}=await ensureActiveSession(kind),result2=await runActScript(script,{client:sticky2.client,cdpSessionId,spaceId:script.spaceId||"agent:default",refTable:sticky2.refTable,onRefTable:__name(table=>{let s2=getStickySession();s2&&(s2.refTable=table,setStickySession(void 0,s2))},"onRefTable"),ensureSession:__name(async()=>({cdpSessionId:(await ensureActiveSession(kind)).cdpSessionId}),"ensureSession"),navigate:__name(async url3=>{let s2=getStickySession(),tid=s2.activeTargetId;(!tid||!s2.agentTargetIds.has(tid))&&(tid=await s2.client.createTarget(url3),s2.agentTargetIds.add(tid),s2.activeTargetId=tid);let sid=await s2.client.attachToTarget(tid);return s2.activeCdpSessionId=sid,await s2.client.send("Page.enable",{},{sessionId:sid}),await s2.client.navigate(sid,url3),invalidateRefTable(),setStickySession(void 0,s2),await new Promise(r2=>setTimeout(r2,200)),{targetId:tid}},"navigate"),screenshot:__name(async()=>{let ens=await ensureActiveSession(kind);return ens.sticky.client.captureScreenshotPng(ens.cdpSessionId)},"screenshot")}),summary={ok:result2.ok,reason:result2.reason,generation:result2.generation,targetId,stepCount:result2.results.length,results:result2.results.map(r2=>r2.ok?{i:r2.index,op:r2.op,ok:!0}:{i:r2.index,op:r2.op,ok:!1,error:r2.error})},parts=[JSON.stringify(summary,null,2)];return result2.snapshot&&(parts.push(""),parts.push(result2.snapshot.tree),parts.push("---"),parts.push(JSON.stringify({protocol:result2.snapshot.protocol,generation:result2.snapshot.generation,url:result2.snapshot.url,title:result2.snapshot.title,refs:result2.snapshot.refs.map(r2=>r2.id),truncated:result2.snapshot.truncated}))),textResult(parts.join(`
5978
- `),!result2.ok)}var init_server3=__esm({"src/services/browser/mcp/server.ts"(){init_server2();init_types4();init_debug();init_errors2();init_officialBrowserMcp();init_batch();init_byRef();init_backendSelector();init_raw();init_semantic();init_sessionState();init_navigateAllowlist();init_toolDefs();__name(textResult,"textResult");__name(createBrowserRuntimeMcpServer,"createBrowserRuntimeMcpServer");__name(handleStatus,"handleStatus");__name(ensureClient,"ensureClient");__name(ensureActiveSession,"ensureActiveSession");__name(handleTabs,"handleTabs");__name(handleNavigate,"handleNavigate");__name(handleSnapshot,"handleSnapshot");__name(handleScreenshot,"handleScreenshot");__name(handleClick,"handleClick");__name(handleType,"handleType");__name(handlePress,"handlePress");__name(handleAct,"handleAct")}});import process16 from"node:process";var StdioServerTransport,init_stdio4=__esm({"../../../rustfleet/wt/rel136/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js"(){init_stdio2();StdioServerTransport=class{static{__name(this,"StdioServerTransport")}constructor(_stdin=process16.stdin,_stdout=process16.stdout){this._stdin=_stdin,this._stdout=_stdout,this._readBuffer=new ReadBuffer,this._started=!1,this._ondata=chunk3=>{this._readBuffer.append(chunk3),this.processReadBuffer()},this._onerror=error40=>{this.onerror?.(error40)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let message=this._readBuffer.readMessage();if(message===null)break;this.onmessage?.(message)}catch(error40){this.onerror?.(error40)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(message){return new Promise(resolve67=>{let json2=serializeMessage(message);this._stdout.write(json2)?resolve67():this._stdout.once("drain",resolve67)})}}}});function shouldTrackDatadog(){if(isSinkKilled("datadog"))return!1;if(isDatadogGateEnabled!==void 0)return isDatadogGateEnabled;try{return checkStatsigFeatureGate_CACHED_MAY_BE_STALE(DATADOG_GATE_NAME)}catch{return!1}}function logEventImpl(eventName,metadata){let sampleResult=shouldSampleEvent(eventName);if(sampleResult===0)return;let metadataWithSampleRate=sampleResult!==null?{...metadata,sample_rate:sampleResult}:metadata;shouldTrackDatadog()&&trackDatadogEvent(eventName,stripProtoFields(metadataWithSampleRate)),logEventTo1P(eventName,metadataWithSampleRate)}function logEventAsyncImpl(eventName,metadata){return logEventImpl(eventName,metadata),Promise.resolve()}function initializeAnalyticsGates(){isDatadogGateEnabled=checkStatsigFeatureGate_CACHED_MAY_BE_STALE(DATADOG_GATE_NAME)}function initializeAnalyticsSink(){attachAnalyticsSink({logEvent:logEventImpl,logEventAsync:logEventAsyncImpl})}var DATADOG_GATE_NAME,isDatadogGateEnabled,init_sink=__esm({"src/services/analytics/sink.ts"(){init_datadog();init_firstPartyEventLogger();init_growthbook();init_analytics();init_sinkKillswitch();DATADOG_GATE_NAME="tengu_log_datadog_events";__name(shouldTrackDatadog,"shouldTrackDatadog");__name(logEventImpl,"logEventImpl");__name(logEventAsyncImpl,"logEventAsyncImpl");__name(initializeAnalyticsGates,"initializeAnalyticsGates");__name(initializeAnalyticsSink,"initializeAnalyticsSink")}});function isUserFacingPath(path40,homeDir){if(PATH_ALLOWLIST.some(root2=>path40.startsWith(root2)))return!0;if(homeDir){let userApps=homeDir.endsWith("/")?`${homeDir}Applications/`:`${homeDir}/Applications/`;if(path40.startsWith(userApps))return!0}return!1}function isNoisyName(name){return NAME_PATTERN_BLOCKLIST.some(re2=>re2.test(name))}function sanitizeCore(raw,applyCharFilter){let seen2=new Set;return raw.map(name=>name.trim()).filter(trimmed=>!trimmed||trimmed.length>APP_NAME_MAX_LEN||applyCharFilter&&!APP_NAME_ALLOWED.test(trimmed)||seen2.has(trimmed)?!1:(seen2.add(trimmed),!0)).sort((a2,b3)=>a2.localeCompare(b3))}function sanitizeAppNames(raw){let filtered=sanitizeCore(raw,!0);return filtered.length<=APP_NAME_MAX_COUNT?filtered:[...filtered.slice(0,APP_NAME_MAX_COUNT),`\u2026 and ${filtered.length-APP_NAME_MAX_COUNT} more`]}function sanitizeTrustedNames(raw){return sanitizeCore(raw,!1)}function filterAppsForDescription(installed2,homeDir){let{alwaysKept,rest:rest2}=installed2.reduce((acc,app)=>(ALWAYS_KEEP_BUNDLE_IDS.has(app.bundleId)?acc.alwaysKept.push(app.displayName):isUserFacingPath(app.path,homeDir)&&!isNoisyName(app.displayName)&&acc.rest.push(app.displayName),acc),{alwaysKept:[],rest:[]}),sanitizedAlways=sanitizeTrustedNames(alwaysKept),alwaysSet=new Set(sanitizedAlways);return[...sanitizedAlways,...sanitizeAppNames(rest2).filter(n4=>!alwaysSet.has(n4))]}var PATH_ALLOWLIST,NAME_PATTERN_BLOCKLIST,ALWAYS_KEEP_BUNDLE_IDS,APP_NAME_ALLOWED,APP_NAME_MAX_LEN,APP_NAME_MAX_COUNT,init_appNames=__esm({"src/utils/computerUse/appNames.ts"(){PATH_ALLOWLIST=["/Applications/","/System/Applications/"],NAME_PATTERN_BLOCKLIST=[/Helper(?:$|\s\()/,/Agent(?:$|\s\()/,/Service(?:$|\s\()/,/Uninstaller(?:$|\s\()/,/Updater(?:$|\s\()/,/^\./],ALWAYS_KEEP_BUNDLE_IDS=new Set(["com.apple.Safari","com.google.Chrome","com.microsoft.edgemac","org.mozilla.firefox","company.thebrowser.Browser","com.tinyspeck.slackmacgap","us.zoom.xos","com.microsoft.teams2","com.microsoft.teams","com.apple.MobileSMS","com.apple.mail","com.microsoft.Word","com.microsoft.Excel","com.microsoft.Powerpoint","com.microsoft.Outlook","com.apple.iWork.Pages","com.apple.iWork.Numbers","com.apple.iWork.Keynote","com.google.GoogleDocs","notion.id","com.apple.Notes","md.obsidian","com.linear","com.figma.Desktop","com.microsoft.VSCode","com.apple.Terminal","com.googlecode.iterm2","com.github.GitHubDesktop","com.apple.finder","com.apple.iCal","com.apple.systempreferences"]),APP_NAME_ALLOWED=/^[\p{L}\p{M}\p{N}_ .&'()+-]+$/u,APP_NAME_MAX_LEN=40,APP_NAME_MAX_COUNT=50;__name(isUserFacingPath,"isUserFacingPath");__name(isNoisyName,"isNoisyName");__name(sanitizeCore,"sanitizeCore");__name(sanitizeAppNames,"sanitizeAppNames");__name(sanitizeTrustedNames,"sanitizeTrustedNames");__name(filterAppsForDescription,"filterAppsForDescription")}});function buildComputerUseTools(installedAppNames2){let appsHint=installedAppNames2?.length?` Installed applications include: ${installedAppNames2.join(", ")}.`:"";return[{name:"computer_status",description:"Diagnose local Computer Use readiness: macOS Accessibility, Screen Recording, displays, running apps, and frontmost app. Read-only and does not require app access. Call first when starting desktop control.",inputSchema:objectSchema({}),annotations:{readOnlyHint:!0}},{name:"request_access",description:"Request session-scoped permission to inspect and control named Mac applications. Required before screenshots, UI inspection, launch, click, typing, or key actions. Prefer shell/APIs when the task is not GUI."+appsHint,inputSchema:objectSchema({apps:{type:"array",minItems:1,maxItems:20,items:{type:"string"},description:"Application display names or bundle identifiers."},reason:{type:"string",maxLength:300},clipboard_read:{type:"boolean"},clipboard_write:{type:"boolean"},system_key_combos:{type:"boolean"}},["apps"])},{name:"list_granted_applications",description:"List applications and optional capabilities granted for this session.",inputSchema:objectSchema({}),annotations:{readOnlyHint:!0}},{name:"open_application",description:"Launch or activate a previously granted Mac application by bundle ID. Then inspect_ui before clicking.",inputSchema:objectSchema({bundle_id:bundleId},["bundle_id"])},{name:"screenshot",description:`Capture the full target display after hiding ungranted applications. Returns a thrift JPEG (long edge ~${1280}px; override CLAVUE_CU_SCREENSHOT_MAX). Last-resort eyes \u2014 prefer zoom (window/region) for visual verify, and inspect_ui/find_label for targeting. Not the default control path. Blocked while a password-manager-like app is frontmost unless CLAVUE_CU_ALLOW_SENSITIVE=1 (pixel leak).`,inputSchema:objectSchema({display_id:{type:"number"}}),annotations:{readOnlyHint:!0}},{name:"zoom",description:`Capture a rectangular screen region as a thrift JPEG (long edge cap ~${1280}px). Prefer zoom of the active window/control over full-display screenshot. Prefer inspect_ui/find_label for labeled controls.`,inputSchema:objectSchema({region:{type:"array",items:{type:"number"},minItems:4,maxItems:4,description:"[x, y, width, height] in logical screen pixels."}},["region"]),annotations:{readOnlyHint:!0}},{name:"inspect_ui",description:COMPUTER_USE_AX_PRIMARY_HINT+" Returns compact elements with paths, roles, labels, values, frames and actions. Re-inspect after UI changes because paths may become stale. Prefer over screenshot for targeting.",inputSchema:objectSchema({bundle_id:bundleId,max_depth:{type:"number",minimum:1,maximum:12,default:6},max_elements:{type:"number",minimum:1,maximum:500,default:120},include_menu_bar:{type:"boolean",default:!1,description:"Include the usually large macOS menu tree only when needed."}},["bundle_id"]),annotations:{readOnlyHint:!0}},{name:"ui_action",description:COMPUTER_USE_AX_PRIMARY_HINT+" Act on an element from the latest inspect_ui (press/focus/set_value). Prefer over pixel clicks. After success, re-inspect_ui (or screenshot) before claiming the UI changed. risk other than none requires user confirmation.",inputSchema:objectSchema({bundle_id:bundleId,path:{type:"string",description:"Element path from the latest inspect_ui result."},action:{type:"string",enum:["press","confirm","focus","set_value","increment","decrement"]},value:{type:"string"},intent:{type:"string",maxLength:200,description:"What this action is expected to do in the application."},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"],description:"User-visible side-effect category. Use none only when side-effect free. delete/communicate/financial/install_or_settings/sensitive_data require confirmation."}},["bundle_id","path","action","intent","risk"])},{name:"find_label",description:COMPUTER_USE_AX_PRIMARY_HINT+" Find UI elements by visible label (title/description/identifier/value) via Accessibility. Read-only. Prefer this or click_text before coordinate clicks.",inputSchema:objectSchema({bundle_id:bundleId,query:{type:"string",minLength:1,maxLength:200,description:"Label text to search (substring match unless exact=true)."},exact:{type:"boolean",default:!1,description:"Require full-string match on a label field."},role:{type:"string",description:"Optional AX role filter (e.g. AXButton)."},max_depth:{type:"number",minimum:1,maximum:12,default:6},max_elements:{type:"number",minimum:1,maximum:500,default:120},limit:{type:"number",minimum:1,maximum:50,default:12}},["bundle_id","query"]),annotations:{readOnlyHint:!0}},{name:"click_text",description:COMPUTER_USE_AX_PRIMARY_HINT+" Find by label then press (AXPress) or click frame center. Prefer over left_click. After success, re-inspect or screenshot before claiming the UI changed. risk other than none requires confirmation.",inputSchema:objectSchema({bundle_id:bundleId,query:{type:"string",minLength:1,maxLength:200,description:"Label text to click (e.g. Save, \u597D, Format)."},exact:{type:"boolean",default:!1,description:"Require full-string match on a label field."},role:{type:"string",description:"Optional AX role filter (e.g. AXButton)."},intent:{type:"string",maxLength:200,description:"What this click is expected to do."},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"],description:"User-visible side-effect category. none only when side-effect free."},max_depth:{type:"number",minimum:1,maximum:12,default:6},max_elements:{type:"number",minimum:1,maximum:500,default:120}},["bundle_id","query","intent","risk"])},{name:"left_click",description:"Left-click a point after verifying the frontmost/under-point app is granted. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["coordinate","intent","risk"])},{name:"right_click",description:"Right-click a point after verifying the target app is granted. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["coordinate","intent","risk"])},{name:"double_click",description:"Double-click a point after verifying the target app is granted. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["coordinate","intent","risk"])},{name:"triple_click",description:"Triple-click a point after verifying the target app is granted. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["coordinate","intent","risk"])},{name:"mouse_move",description:"Move the pointer without clicking. Prefer inspect_ui/ui_action for real control changes.",inputSchema:objectSchema({coordinate},["coordinate"])},{name:"left_click_drag",description:"Drag from start_coordinate to coordinate. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({start_coordinate:coordinate,coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["start_coordinate","coordinate","intent","risk"])},{name:"scroll",description:"Scroll at the current pointer or an optional coordinate. Prefer ui_action on scrollable AX elements when available.",inputSchema:objectSchema({direction:{type:"string",enum:["up","down","left","right"]},amount:{type:"number",minimum:1,maximum:20,default:3},coordinate},["direction"])},{name:"type",description:"Type Unicode text into the granted frontmost application. Prefer focus/set_value via ui_action when a field path exists. Re-inspect after typing if the UI should change. risk other than none requires confirmation.",inputSchema:objectSchema({text:{type:"string",maxLength:1e5},intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["text","intent","risk"])},{name:"key",description:COMPUTER_USE_KEYBOARD_FIRST_HINT+" Press a key or chord such as return, escape, command+s, command+a, control+tab. Prefer shortcuts over pixel clicks when possible. System-wide chords require the system_key_combos grant. Do not spam Space/media keys as a retry loop. risk other than none requires confirmation.",inputSchema:objectSchema({text:{type:"string"},repeat:{type:"number",minimum:1,maximum:100,default:1},intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["text","intent","risk"])},{name:"wait",description:"Wait briefly for an app/UI transition, then continue diagnosis.",inputSchema:objectSchema({duration:{type:"number",minimum:0,maximum:30}},["duration"]),annotations:{readOnlyHint:!0}},{name:"cursor_position",description:"Read the current pointer position.",inputSchema:objectSchema({}),annotations:{readOnlyHint:!0}},{name:"read_clipboard",description:"Read plain text from the clipboard when clipboard_read was granted.",inputSchema:objectSchema({}),annotations:{readOnlyHint:!0}},{name:"write_clipboard",description:"Write plain text to the clipboard when clipboard_write was granted.",inputSchema:objectSchema({text:{type:"string",maxLength:1e5}},["text"])}]}var objectSchema,coordinate,bundleId,init_tools4=__esm({"src/utils/computerUse/tools.ts"(){init_efficiencyLaw();objectSchema=__name((properties,required2=[])=>({type:"object",properties,...required2.length>0?{required:required2}:{},additionalProperties:!1}),"objectSchema"),coordinate={type:"array",items:{type:"number"},minItems:2,maxItems:2,description:"[x, y] in logical screen pixels from the global top-left."},bundleId={type:"string",description:"Exact macOS application bundle identifier."};__name(buildComputerUseTools,"buildComputerUseTools")}});var mcpServer_exports={};__export(mcpServer_exports,{createComputerUseMcpServerForCli:()=>createComputerUseMcpServerForCli,runComputerUseMcpServer:()=>runComputerUseMcpServer});import{homedir as homedir31}from"os";async function installedAppNames(){let timer2,timeout=new Promise(resolve67=>{timer2=globalThis.setTimeout(resolve67,APP_ENUM_TIMEOUT_MS)}),apps=await Promise.race([listComputerUseInstalledApps().catch(()=>{}),timeout]).finally(()=>globalThis.clearTimeout(timer2));return apps?filterAppsForDescription(apps,homedir31()):void 0}async function createComputerUseMcpServerForCli(){let server2=new Server({name:"clavue-computer-use",version:"1.0.0"},{capabilities:{tools:{}},instructions:getComputerUseEfficiencyPolicyText()}),tools=buildComputerUseTools(await installedAppNames());return server2.setRequestHandler(ListToolsRequestSchema,async()=>({tools})),server2.setRequestHandler(CallToolRequestSchema,async()=>({isError:!0,content:[{type:"text",text:"Computer Use actions require an interactive Clavue session."}]})),server2}async function runComputerUseMcpServer(){enableConfigs(),initializeAnalyticsSink();let server2=await createComputerUseMcpServerForCli(),transport=new StdioServerTransport,exiting=!1,shutdownAndExit=__name(async()=>{exiting||(exiting=!0,await Promise.all([shutdown1PEventLogging(),shutdownDatadog()]),process.exit(0))},"shutdownAndExit");process.stdin.on("end",()=>{shutdownAndExit()}),process.stdin.on("error",()=>{shutdownAndExit()}),await server2.connect(transport)}var APP_ENUM_TIMEOUT_MS,init_mcpServer=__esm({"src/utils/computerUse/mcpServer.ts"(){init_server2();init_stdio4();init_types4();init_datadog();init_firstPartyEventLogger();init_sink();init_config12();init_appNames();init_efficiencyLaw();init_executor();init_tools4();APP_ENUM_TIMEOUT_MS=1e3;__name(installedAppNames,"installedAppNames");__name(createComputerUseMcpServerForCli,"createComputerUseMcpServerForCli");__name(runComputerUseMcpServer,"runComputerUseMcpServer")}});var client_exports3={};__export(client_exports3,{MAX_MCP_DESCRIPTION_LENGTH:()=>MAX_MCP_DESCRIPTION_LENGTH,MCP_FETCH_CACHE_SIZE:()=>MCP_FETCH_CACHE_SIZE,MCP_REQUEST_TIMEOUT_MS:()=>MCP_REQUEST_TIMEOUT_MS,McpAuthError:()=>McpAuthError,McpSessionExpiredError:()=>McpSessionExpiredError,McpToolCallError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS:()=>McpToolCallError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,areMcpConfigsEqual:()=>areMcpConfigsEqual,callIdeRpc:()=>callIdeRpc,callMCPToolWithUrlElicitationRetry:()=>callMCPToolWithUrlElicitationRetry,clearMcpAuthCache:()=>clearMcpAuthCache,clearServerCache:()=>clearServerCache,connectToServer:()=>connectToServer,createClaudeAiProxyFetch:()=>createClaudeAiProxyFetch,createFetchCommandsForClient:()=>createFetchCommandsForClient,createNodeWsClient:()=>createNodeWsClient,ensureConnectedClient:()=>ensureConnectedClient,fetchCommandsForClient:()=>fetchCommandsForClient,fetchResourceTemplatesForClient:()=>fetchResourceTemplatesForClient,fetchResourcesAndTemplatesForClient:()=>fetchResourcesAndTemplatesForClient,fetchResourcesForClient:()=>fetchResourcesForClient,fetchToolsForClient:()=>fetchToolsForClient,getConnectionTimeoutMs:()=>getConnectionTimeoutMs,getMcpServerConnectionBatchSize:()=>getMcpServerConnectionBatchSize,getMcpToolTimeoutMs:()=>getMcpToolTimeoutMs,getMcpToolsCommandsAndResources:()=>getMcpToolsCommandsAndResources,getServerCacheKey:()=>getServerCacheKey,inferCompactSchema:()=>inferCompactSchema,isMcpSessionExpiredError:()=>isMcpSessionExpiredError,mcpToolInputToAutoClassifierInput:()=>mcpToolInputToAutoClassifierInput,prefetchAllMcpResources:()=>prefetchAllMcpResources,processBatched:()=>processBatched,processMCPResult:()=>processMCPResult,reconnectMcpServerImpl:()=>reconnectMcpServerImpl,setupSdkMcpClients:()=>setupSdkMcpClients,transformMCPResult:()=>transformMCPResult,transformResultContent:()=>transformResultContent,wrapFetchWithTimeout:()=>wrapFetchWithTimeout});async function clearServerCache(name,serverRef){let key3=getServerCacheKey(name,serverRef);try{let wrappedClient=await connectToServer(name,serverRef);wrappedClient.type==="connected"&&await wrappedClient.cleanup()}catch{}connectToServer.cache.delete(key3),clearMcpFetchCaches(name,{tools:fetchToolsForClient,resources:fetchResourcesForClient,resourceTemplates:fetchResourceTemplatesForClient,commands:fetchCommandsForClient,skills:null})}async function ensureConnectedClient(client2){if(client2.config.type==="sdk")return client2;let connectedClient=await connectToServer(client2.name,client2.config);if(connectedClient.type!=="connected")throw new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(`MCP server "${client2.name}" is not connected`,"MCP server not connected");return connectedClient}async function callIdeRpc(toolName4,args,client2){return(await callMCPTool2({client:client2,tool:toolName4,args,signal:createAbortController().signal})).content}async function reconnectMcpServerImpl(name,config3){try{clearKeychainCache(),await clearServerCache(name,config3);let client2=await connectToServer(name,config3);if(client2.type!=="connected")return{client:client2,tools:[],commands:[]};let{supportsResources,tools,commands,resources}=await fetchConnectedClientState(client2,{fetchToolsForClient,fetchCommandsForClient,fetchResourcesForClient,fetchMcpSkillsForClient:fetchMcpSkillsForClient2}),resourceTools=[];return supportsResources&&([ListMcpResourcesTool,ReadMcpResourceTool].some(tool=>tools.some(t7=>toolMatchesName(t7,tool.name)))||resourceTools.push(ListMcpResourcesTool,ReadMcpResourceTool)),{client:client2,tools:[...tools,...resourceTools],commands,resources:resources.length>0?resources:void 0}}catch(error40){return logMCPError(name,`Error during reconnection: ${errorMessage2(error40)}`),{client:{name,type:"failed",config:config3},tools:[],commands:[]}}}async function getMcpToolsCommandsAndResources(onConnectionAttempt,mcpConfigs){let resourceToolsAdded=!1,allConfigEntries=Object.entries(mcpConfigs??(await getAllMcpConfigs()).servers),configEntries=[];for(let entry of allConfigEntries)isMcpServerDisabled(entry[0])?onConnectionAttempt({client:{name:entry[0],type:"disabled",config:entry[1]},tools:[],commands:[]}):configEntries.push(entry);let totalServers=configEntries.length,stdioCount=count2(configEntries,([_2,c4])=>c4.type==="stdio"),sseCount=count2(configEntries,([_2,c4])=>c4.type==="sse"),httpCount=count2(configEntries,([_2,c4])=>c4.type==="http"),sseIdeCount=count2(configEntries,([_2,c4])=>c4.type==="sse-ide"),wsIdeCount=count2(configEntries,([_2,c4])=>c4.type==="ws-ide"),localServers=configEntries.filter(([_2,config3])=>isLocalMcpServer(config3)),remoteServers=configEntries.filter(([_2,config3])=>!isLocalMcpServer(config3)),serverStats={totalServers,stdioCount,sseCount,httpCount,sseIdeCount,wsIdeCount},processServer=__name(async([name,config3])=>{try{if(isMcpServerDisabled(name)){onConnectionAttempt({client:{name,type:"disabled",config:config3},tools:[],commands:[]});return}let knownConfigIssue="command"in config3?getKnownMcpConfigIssue(config3):null;if(knownConfigIssue){let issueMessage=`${knownConfigIssue.message} ${knownConfigIssue.suggestion}`;logMCPError(name,issueMessage),onConnectionAttempt({client:{name,type:"failed",config:config3,error:issueMessage},tools:[],commands:[]});return}if((config3.type==="claudeai-proxy"||config3.type==="http"||config3.type==="sse")&&(await isMcpAuthCached(name)||(config3.type==="http"||config3.type==="sse")&&hasMcpDiscoveryButNoToken(name,config3))){logMCPDebug(name,"Skipping connection (cached needs-auth)"),onConnectionAttempt({client:{name,type:"needs-auth",config:config3},tools:[createMcpAuthTool(name,config3)],commands:[]});return}let client2=await connectToServer(name,config3,serverStats);if(client2.type!=="connected"){onConnectionAttempt({client:client2,tools:client2.type==="needs-auth"?[createMcpAuthTool(name,config3)]:[],commands:[]});return}let{supportsResources,tools,commands,resources}=await fetchConnectedClientState(client2,{fetchToolsForClient,fetchCommandsForClient,fetchResourcesForClient,fetchMcpSkillsForClient:fetchMcpSkillsForClient2}),resourceTools=[];supportsResources&&!resourceToolsAdded&&(resourceToolsAdded=!0,resourceTools.push(ListMcpResourcesTool,ReadMcpResourceTool)),onConnectionAttempt({client:client2,tools:[...tools,...resourceTools],commands,resources:resources.length>0?resources:void 0})}catch(error40){logMCPError(name,`Error fetching tools/commands/resources: ${errorMessage2(error40)}`),onConnectionAttempt({client:{name,type:"failed",config:config3},tools:[],commands:[]})}},"processServer");await Promise.all([processBatched(localServers,getMcpServerConnectionBatchSize(),processServer),processBatched(remoteServers,getRemoteMcpServerConnectionBatchSize(),processServer)])}async function callMCPToolWithUrlElicitationRetry({client:connectedClient,clientConnection,tool,args,meta,signal,setAppState,onProgress,callToolFn=callMCPTool2,handleElicitation}){for(let attempt2=0;;attempt2++)try{return await callToolFn({client:connectedClient,tool,args,meta,signal,onProgress})}catch(error40){if(!(error40 instanceof McpError)||error40.code!==ErrorCode.UrlElicitationRequired||attempt2>=3)throw error40;let elicitations=getValidUrlElicitations(error40.data),serverName=getServerNameForElicitation(clientConnection);if(elicitations.length===0)throw logMCPDebug(serverName,`Tool '${tool}' returned -32042 but no valid elicitations in error data`),error40;logMCPDebug(serverName,`Tool '${tool}' requires URL elicitation (error -32042, attempt ${attempt2+1}), processing ${elicitations.length} elicitation(s)`);for(let elicitation of elicitations){let{elicitationId}=elicitation,hookResponse=await runElicitationHooks(serverName,elicitation,signal);if(hookResponse){if(logMCPDebug(serverName,`URL elicitation ${elicitationId} resolved by hook: ${jsonStringify(hookResponse)}`),hookResponse.action!=="accept")return{content:formatUrlElicitationBlockedMessage(tool,hookResponse.action,"hook")};continue}let userResult;handleElicitation?userResult=await handleElicitation(serverName,elicitation,signal):userResult=await queueUrlElicitation({serverName,elicitation,signal,setAppState});let finalResult=await runElicitationResultHooks(serverName,userResult,signal,"url",elicitationId);if(finalResult.action!=="accept")return logMCPDebug(serverName,`User ${finalResult.action==="decline"?"declined":finalResult.action+"ed"} URL elicitation ${elicitationId}`),{content:formatUrlElicitationBlockedMessage(tool,finalResult.action,"user")};logMCPDebug(serverName,`Elicitation ${elicitationId} completed, retrying tool call`)}}}function callMCPTool2(args){return callMCPTool(args,{clearServerCache})}async function setupSdkMcpClients(sdkMcpConfigs,sendMcpMessage){let clients=[],tools=[],results=await Promise.allSettled(Object.entries(sdkMcpConfigs).map(async([name,config3])=>{let transport=new SdkControlClientTransport(name,sendMcpMessage),client2=new Client({name:"clavue",title:"Clavue",version:typeof MACRO<"u"?"13.9.1":"unknown",description:"Clavue coding assistant",websiteUrl:PRODUCT_URL},{capabilities:{}});try{await client2.connect(transport);let capabilities=client2.getServerCapabilities(),connectedClient={type:"connected",name,capabilities:capabilities||{},client:client2,config:{...config3,scope:"dynamic"},cleanup:__name(async()=>{await client2.close()},"cleanup")},serverTools=[];if(capabilities?.tools){let sdkTools=await fetchToolsForClient(connectedClient);serverTools.push(...sdkTools)}return{client:connectedClient,tools:serverTools}}catch(error40){return logMCPError(name,`Failed to connect SDK MCP server: ${error40}`),{client:{type:"failed",name,config:{...config3,scope:"user"}},tools:[]}}}));for(let result2 of results)result2.status==="fulfilled"&&(clients.push(result2.value.client),tools.push(...result2.value.tools));return{clients,tools}}var fetchMcpSkillsForClient2,isComputerUseMCPServer3,connectToServer,fetchToolsForClient,fetchCommandsForClient,prefetchAllMcpResources,init_client9=__esm({"src/services/mcp/client.ts"(){init_featureFlags();init_auth();init_auth4();init_client7();init_sse2();init_stdio3();init_streamableHttp();init_transport();init_types4();init_mapValues();init_memoize();init_zipObject();init_state();init_oauth();init_product();init_Tool();init_ListMcpResourcesTool();init_McpAuthTool();init_ReadMcpResourceTool();init_abortController();init_array4();init_cleanupRegistry();init_debug();init_errors2();init_http2();init_ide();init_log3();init_mcpWebSocketTransport();init_mtls();init_proxy();init_sessionIngressAuth();init_subprocessEnv();init_analytics();init_elicitationHandler();init_utils10();init_macOsKeychainHelpers();init_sleep2();init_authCache();init_connectionUtils();init_remoteAuth();init_commandFetcher();init_connectedClientState();init_prefetchResources();init_resourceFetcher();init_toolFetcher();init_resultTransform();init_toolCaller();init_urlElicitation();init_authCache();init_connectionUtils();init_remoteAuth();init_commandFetcher();init_resourceFetcher();init_utils10();init_resultTransform();init_auth6();init_config9();init_headersHelper();init_runtimeHealth();init_SdkControlTransport();init_slowOperations();fetchMcpSkillsForClient2=feature("MCP_SKILLS")?(init_mcpSkills(),__toCommonJS(mcpSkills_exports)).fetchMcpSkillsForClient??null:null,isComputerUseMCPServer3=(init_common(),__toCommonJS(common_exports)).isComputerUseMCPServer,connectToServer=memoize_default(async(name,serverRef,serverStats)=>{let connectStartTime=Date.now(),connectionTimeoutMs=getConnectionTimeoutMs(serverRef),inProcessServer;try{let transport,sessionIngressToken=getSessionIngressAuthToken();if(serverRef.type==="sse"){let authProvider=new ClaudeAuthProvider(name,serverRef),combinedHeaders=await getMcpServerHeaders(name,serverRef),transportOptions={authProvider,fetch:wrapFetchWithTimeout(wrapFetchWithStepUpDetection(createFetchWithInit(),authProvider)),requestInit:{headers:{"User-Agent":getMCPUserAgent(),...combinedHeaders}}};transportOptions.eventSourceInit={fetch:__name(async(url3,init2)=>{let authHeaders2={},tokens=await authProvider.tokens();tokens&&(authHeaders2.Authorization=`Bearer ${tokens.access_token}`);let proxyOptions=getProxyFetchOptions();return fetch(url3,{...init2,...proxyOptions,headers:{"User-Agent":getMCPUserAgent(),...authHeaders2,...init2?.headers,...combinedHeaders,Accept:"text/event-stream"}})},"fetch")},transport=new SSEClientTransport(new URL(serverRef.url),transportOptions),logMCPDebug(name,"SSE transport initialized, awaiting connection")}else if(serverRef.type==="sse-ide"){logMCPDebug(name,`Setting up SSE-IDE transport to ${serverRef.url}`);let proxyOptions=getProxyFetchOptions(),transportOptions=proxyOptions.dispatcher?{eventSourceInit:{fetch:__name(async(url3,init2)=>fetch(url3,{...init2,...proxyOptions,headers:{"User-Agent":getMCPUserAgent(),...init2?.headers}}),"fetch")}}:{};transport=new SSEClientTransport(new URL(serverRef.url),Object.keys(transportOptions).length>0?transportOptions:void 0)}else if(serverRef.type==="ws-ide"){let tlsOptions=getWebSocketTLSOptions(),wsHeaders={"User-Agent":getMCPUserAgent(),...serverRef.authToken&&{"X-Claude-Code-Ide-Authorization":serverRef.authToken}},wsClient;typeof Bun<"u"?wsClient=new globalThis.WebSocket(serverRef.url,{protocols:["mcp"],headers:wsHeaders,proxy:getWebSocketProxyUrl(serverRef.url),tls:tlsOptions||void 0}):wsClient=await createNodeWsClient(serverRef.url,{headers:wsHeaders,agent:getWebSocketProxyAgent(serverRef.url),...tlsOptions||{}}),transport=new WebSocketTransport(wsClient)}else if(serverRef.type==="ws"){logMCPDebug(name,`Initializing WebSocket transport to ${serverRef.url}`);let combinedHeaders=await getMcpServerHeaders(name,serverRef),tlsOptions=getWebSocketTLSOptions(),wsHeaders={"User-Agent":getMCPUserAgent(),...sessionIngressToken&&{Authorization:`Bearer ${sessionIngressToken}`},...combinedHeaders},wsHeadersForLogging=mapValues_default(wsHeaders,(value,key3)=>key3.toLowerCase()==="authorization"?"[REDACTED]":value);logMCPDebug(name,`WebSocket transport options: ${jsonStringify({url:serverRef.url,headers:wsHeadersForLogging,hasSessionAuth:!!sessionIngressToken})}`);let wsClient;typeof Bun<"u"?wsClient=new globalThis.WebSocket(serverRef.url,{protocols:["mcp"],headers:wsHeaders,proxy:getWebSocketProxyUrl(serverRef.url),tls:tlsOptions||void 0}):wsClient=await createNodeWsClient(serverRef.url,{headers:wsHeaders,agent:getWebSocketProxyAgent(serverRef.url),...tlsOptions||{}}),transport=new WebSocketTransport(wsClient)}else if(serverRef.type==="http"){logMCPDebug(name,`Initializing HTTP transport to ${serverRef.url}`),logMCPDebug(name,`Node version: ${process.version}, Platform: ${process.platform}`),logMCPDebug(name,`Environment: ${jsonStringify({NODE_OPTIONS:process.env.NODE_OPTIONS||"not set",UV_THREADPOOL_SIZE:process.env.UV_THREADPOOL_SIZE||"default",HTTP_PROXY:process.env.HTTP_PROXY||"not set",HTTPS_PROXY:process.env.HTTPS_PROXY||"not set",NO_PROXY:process.env.NO_PROXY||"not set"})}`);let authProvider=new ClaudeAuthProvider(name,serverRef),combinedHeaders=await getMcpServerHeaders(name,serverRef),hasOAuthTokens=!!await authProvider.tokens(),proxyOptions=getProxyFetchOptions();logMCPDebug(name,`Proxy options: ${proxyOptions.dispatcher?"custom dispatcher":"default"}`);let transportOptions={authProvider,fetch:wrapFetchWithTimeout(wrapFetchWithStepUpDetection(createFetchWithInit(),authProvider)),requestInit:{...proxyOptions,headers:{"User-Agent":getMCPUserAgent(),...sessionIngressToken&&!hasOAuthTokens&&{Authorization:`Bearer ${sessionIngressToken}`},...combinedHeaders}}},headersForLogging=transportOptions.requestInit?.headers?mapValues_default(transportOptions.requestInit.headers,(value,key3)=>key3.toLowerCase()==="authorization"?"[REDACTED]":value):void 0;logMCPDebug(name,`HTTP transport options: ${jsonStringify({url:serverRef.url,headers:headersForLogging,hasAuthProvider:!!authProvider,timeoutMs:MCP_REQUEST_TIMEOUT_MS})}`),transport=new StreamableHTTPClientTransport(new URL(serverRef.url),transportOptions),logMCPDebug(name,"HTTP transport created successfully")}else{if(serverRef.type==="sdk")throw new Error("SDK servers should be handled in print.js");if(serverRef.type==="claudeai-proxy"){if(logMCPDebug(name,`Initializing claude.ai proxy transport for server ${serverRef.id}`),!getClaudeAIOAuthTokens())throw new Error("No claude.ai OAuth token found");let oauthConfig=getOauthConfig(),proxyUrl=`${oauthConfig.MCP_PROXY_URL}${oauthConfig.MCP_PROXY_PATH.replace("{server_id}",serverRef.id)}`;logMCPDebug(name,`Using claude.ai proxy at ${proxyUrl}`);let fetchWithAuth=createClaudeAiProxyFetch(globalThis.fetch),proxyOptions=getProxyFetchOptions(),transportOptions={fetch:wrapFetchWithTimeout(fetchWithAuth),requestInit:{...proxyOptions,headers:{"User-Agent":getMCPUserAgent(),"X-Mcp-Client-Session-Id":getSessionId()}}};transport=new StreamableHTTPClientTransport(new URL(proxyUrl),transportOptions),logMCPDebug(name,"claude.ai proxy transport created successfully")}else if("command"in serverRef&&(await Promise.resolve().then(()=>(init_officialClavueMcp(),officialClavueMcp_exports))).isOfficialClavueMcpServer(name)){let{createOfficialClavueMcpServer:createOfficialClavueMcpServer2}=await Promise.resolve().then(()=>(init_officialClavueMcpServer(),officialClavueMcpServer_exports)),{createLinkedTransportPair:createLinkedTransportPair2}=await Promise.resolve().then(()=>(init_InProcessTransport(),InProcessTransport_exports));inProcessServer=createOfficialClavueMcpServer2();let[clientTransport,serverTransport]=createLinkedTransportPair2();await inProcessServer.connect(serverTransport),transport=clientTransport,logMCPDebug(name,"In-process official Clavue MCP server started")}else if("command"in serverRef&&(await Promise.resolve().then(()=>(init_officialBrowserMcp(),officialBrowserMcp_exports))).isOfficialBrowserMcpServer(name)&&Array.isArray(serverRef.args)&&serverRef.args.map(String).includes((await Promise.resolve().then(()=>(init_officialBrowserMcp(),officialBrowserMcp_exports))).OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG)){let{createBrowserRuntimeMcpServer:createBrowserRuntimeMcpServer2}=await Promise.resolve().then(()=>(init_server3(),server_exports)),{parseBrowserRuntimeKindFromArgs:parseBrowserRuntimeKindFromArgs2}=await Promise.resolve().then(()=>(init_officialBrowserMcp(),officialBrowserMcp_exports)),{createLinkedTransportPair:createLinkedTransportPair2}=await Promise.resolve().then(()=>(init_InProcessTransport(),InProcessTransport_exports)),runtimeKind=parseBrowserRuntimeKindFromArgs2(serverRef.args);inProcessServer=createBrowserRuntimeMcpServer2(runtimeKind);let[clientTransport,serverTransport]=createLinkedTransportPair2();await inProcessServer.connect(serverTransport),transport=clientTransport,logMCPDebug(name,`In-process Browser Runtime MCP server started (${runtimeKind})`)}else if("command"in serverRef&&isComputerUseMCPServer3(name)){let{createComputerUseMcpServerForCli:createComputerUseMcpServerForCli2}=await Promise.resolve().then(()=>(init_mcpServer(),mcpServer_exports)),{createLinkedTransportPair:createLinkedTransportPair2}=await Promise.resolve().then(()=>(init_InProcessTransport(),InProcessTransport_exports));inProcessServer=await createComputerUseMcpServerForCli2();let[clientTransport,serverTransport]=createLinkedTransportPair2();await inProcessServer.connect(serverTransport),transport=clientTransport,logMCPDebug(name,"In-process Computer Use MCP server started")}else if("command"in serverRef){let finalCommand=process.env.CLAUDE_CODE_SHELL_PREFIX||serverRef.command,finalArgs=process.env.CLAUDE_CODE_SHELL_PREFIX?[[serverRef.command,...serverRef.args].join(" ")]:serverRef.args;transport=new StdioClientTransport({command:finalCommand,args:finalArgs,env:buildStdioMcpEnv({base:subprocessEnv(),projectDir:getProjectRoot(),serverEnv:serverRef.env}),stderr:"pipe"})}else throw new Error("Unsupported MCP server configuration")}let stderrHandler,stderrOutput="";if("command"in serverRef){let stdioTransport=transport;stdioTransport.stderr&&(stderrHandler=__name(data=>{if(stderrOutput.length<64*1024*1024)try{stderrOutput+=data.toString()}catch{}},"stderrHandler"),stdioTransport.stderr.on("data",stderrHandler));let NON_PROTOCOL_BYTE_CAP=(()=>{let raw=parseInt(process.env.CLAVUE_MCP_STDIO_NON_PROTOCOL_CAP_MB||"",10);return(Number.isFinite(raw)&&raw>0?raw:16)*1024*1024})();if(NON_PROTOCOL_BYTE_CAP>0){let nonProtocolBytes=0,childStdout=stdioTransport._process?.stdout;if(childStdout){let onStdout=__name(chunk3=>{if(nonProtocolBytes+=typeof chunk3=="string"?Buffer.byteLength(chunk3):chunk3.length,nonProtocolBytes>NON_PROTOCOL_BYTE_CAP){logMCPDebug(name,`stdio stdout exceeded ${NON_PROTOCOL_BYTE_CAP} bytes \u2014 terminating to prevent unbounded memory growth`);try{childStdout.removeListener("data",onStdout)}catch{}transport.close?.()}},"onStdout");childStdout.on("data",onStdout)}}}let client2=new Client({name:"clavue",title:"Clavue",version:typeof MACRO<"u"?"13.9.1":"unknown",description:"Clavue coding assistant",websiteUrl:PRODUCT_URL},{capabilities:{roots:{},elicitation:{}}});if(serverRef.type==="http"&&logMCPDebug(name,"Client created, setting up request handler"),client2.setRequestHandler(ListRootsRequestSchema,async()=>(logMCPDebug(name,"Received ListRoots request from server"),{roots:[{uri:`file://${getOriginalCwd()}`}]})),connectionTimeoutMs!==getConnectionTimeoutMs()&&logMCPDebug(name,`Applying extended stdio startup timeout of ${connectionTimeoutMs}ms for package-manager-backed command`),logMCPDebug(name,`Starting connection with timeout of ${connectionTimeoutMs}ms`),serverRef.type==="http"){logMCPDebug(name,`Testing basic HTTP connectivity to ${serverRef.url}`);try{let testUrl=new URL(serverRef.url);logMCPDebug(name,`Parsed URL: host=${testUrl.hostname}, port=${testUrl.port||"default"}, protocol=${testUrl.protocol}`),(testUrl.hostname==="127.0.0.1"||testUrl.hostname==="localhost")&&logMCPDebug(name,`Using loopback address: ${testUrl.hostname}`)}catch(urlError){logMCPDebug(name,`Failed to parse URL: ${urlError}`)}}let connectPromise=client2.connect(transport),timeoutPromise=new Promise((_2,reject2)=>{let timeoutId=setTimeout(()=>{let elapsed=Date.now()-connectStartTime;logMCPDebug(name,`Connection timeout triggered after ${elapsed}ms (limit: ${connectionTimeoutMs}ms)`),inProcessServer&&inProcessServer.close?.().catch(()=>{}),transport.close().catch(()=>{}),reject2(new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(`MCP server "${name}" connection timed out after ${connectionTimeoutMs}ms`,"MCP connection timeout"))},connectionTimeoutMs);connectPromise.then(()=>{clearTimeout(timeoutId)},_error=>{clearTimeout(timeoutId)})});try{await Promise.race([connectPromise,timeoutPromise]),stderrOutput&&(logMCPError(name,`Server stderr: ${stderrOutput}`),stderrOutput="");let elapsed=Date.now()-connectStartTime;logMCPDebug(name,`Successfully connected (transport: ${serverRef.type||"stdio"}) in ${elapsed}ms`)}catch(error40){let elapsed=Date.now()-connectStartTime;if(serverRef.type==="sse"&&error40 instanceof Error){if(logMCPDebug(name,`SSE Connection failed after ${elapsed}ms: ${jsonStringify({url:serverRef.url,error:error40.message,errorType:error40.constructor.name,stack:error40.stack})}`),logMCPError(name,error40),error40 instanceof UnauthorizedError)return handleRemoteAuthFailure(name,serverRef,"sse")}else if(serverRef.type==="http"&&error40 instanceof Error){let errorObj=error40;if(logMCPDebug(name,`HTTP Connection failed after ${elapsed}ms: ${error40.message} (code: ${errorObj.code||"none"}, errno: ${errorObj.errno||"none"})`),logMCPError(name,error40),error40 instanceof UnauthorizedError)return handleRemoteAuthFailure(name,serverRef,"http")}else if(serverRef.type==="claudeai-proxy"&&error40 instanceof Error){if(logMCPDebug(name,`claude.ai proxy connection failed after ${elapsed}ms: ${error40.message}`),logMCPError(name,error40),error40.code===401)return handleRemoteAuthFailure(name,serverRef,"claudeai-proxy")}else(serverRef.type==="sse-ide"||serverRef.type==="ws-ide")&&logEvent("tengu_mcp_ide_server_connection_failed",{connectionDurationMs:elapsed});throw inProcessServer&&inProcessServer.close?.().catch(()=>{}),transport.close().catch(()=>{}),stderrOutput&&logMCPError(name,`Server stderr: ${stderrOutput}`),error40}let capabilities=client2.getServerCapabilities(),serverVersion=client2.getServerVersion(),rawInstructions=client2.getInstructions(),instructions=rawInstructions;if(rawInstructions&&rawInstructions.length>MAX_MCP_DESCRIPTION_LENGTH&&(instructions=rawInstructions.slice(0,MAX_MCP_DESCRIPTION_LENGTH)+"\u2026 [truncated]",logMCPDebug(name,`Server instructions truncated from ${rawInstructions.length} to ${MAX_MCP_DESCRIPTION_LENGTH} chars`)),logMCPDebug(name,`Connection established with capabilities: ${jsonStringify({hasTools:!!capabilities?.tools,hasPrompts:!!capabilities?.prompts,hasResources:!!capabilities?.resources,hasResourceSubscribe:!!capabilities?.resources?.subscribe,serverVersion:serverVersion||"unknown"})}`),logForDebugging(`[MCP] Server "${name}" connected with subscribe=${!!capabilities?.resources?.subscribe}`),client2.setRequestHandler(ElicitRequestSchema,async request=>(logMCPDebug(name,`Elicitation request received during initialization: ${jsonStringify(request)}`),{action:"cancel"})),serverRef.type==="sse-ide"||serverRef.type==="ws-ide"){let ideConnectionDurationMs=Date.now()-connectStartTime;logEvent("tengu_mcp_ide_server_connection_succeeded",{connectionDurationMs:ideConnectionDurationMs,serverVersion});try{maybeNotifyIDEConnected(client2)}catch(error40){logMCPError(name,`Failed to send ide_connected notification: ${error40}`)}}let connectionStartTime=Date.now(),hasErrorOccurred=!1,originalOnerror=client2.onerror,originalOnclose=client2.onclose,consecutiveConnectionErrors=0,MAX_ERRORS_BEFORE_RECONNECT=3,hasTriggeredClose=!1,closeTransportAndRejectPending=__name(reason=>{hasTriggeredClose||(hasTriggeredClose=!0,logMCPDebug(name,`Closing transport (${reason})`),client2.close().catch(e2=>{logMCPDebug(name,`Error during close: ${errorMessage2(e2)}`)}))},"closeTransportAndRejectPending"),isTerminalConnectionError=__name(msg=>msg.includes("ECONNRESET")||msg.includes("ETIMEDOUT")||msg.includes("EPIPE")||msg.includes("EHOSTUNREACH")||msg.includes("ECONNREFUSED")||msg.includes("Body Timeout Error")||msg.includes("terminated")||msg.includes("SSE stream disconnected")||msg.includes("Failed to reconnect SSE stream"),"isTerminalConnectionError");client2.onerror=error40=>{let uptime=Date.now()-connectionStartTime;hasErrorOccurred=!0;let transportType=serverRef.type||"stdio";if(logMCPDebug(name,`${transportType.toUpperCase()} connection dropped after ${Math.floor(uptime/1e3)}s uptime`),error40.message&&(error40.message.includes("ECONNRESET")?logMCPDebug(name,"Connection reset - server may have crashed or restarted"):error40.message.includes("ETIMEDOUT")?logMCPDebug(name,"Connection timeout - network issue or server unresponsive"):error40.message.includes("ECONNREFUSED")?logMCPDebug(name,"Connection refused - server may be down"):error40.message.includes("EPIPE")?logMCPDebug(name,"Broken pipe - server closed connection unexpectedly"):error40.message.includes("EHOSTUNREACH")?logMCPDebug(name,"Host unreachable - network connectivity issue"):error40.message.includes("ESRCH")?logMCPDebug(name,"Process not found - stdio server process terminated"):error40.message.includes("spawn")?logMCPDebug(name,"Failed to spawn process - check command and permissions"):logMCPDebug(name,`Connection error: ${error40.message}`)),(transportType==="http"||transportType==="claudeai-proxy")&&isMcpSessionExpiredError(error40)){logMCPDebug(name,"MCP session expired (server returned 404 with session-not-found), triggering reconnection"),closeTransportAndRejectPending("session expired"),originalOnerror&&originalOnerror(error40);return}if(transportType==="sse"||transportType==="http"||transportType==="claudeai-proxy"){if(error40.message.includes("Maximum reconnection attempts")){closeTransportAndRejectPending("SSE reconnection exhausted"),originalOnerror&&originalOnerror(error40);return}isTerminalConnectionError(error40.message)?(consecutiveConnectionErrors++,logMCPDebug(name,`Terminal connection error ${consecutiveConnectionErrors}/${MAX_ERRORS_BEFORE_RECONNECT}`),consecutiveConnectionErrors>=MAX_ERRORS_BEFORE_RECONNECT&&(consecutiveConnectionErrors=0,closeTransportAndRejectPending("max consecutive terminal errors"))):consecutiveConnectionErrors=0}originalOnerror&&originalOnerror(error40)},client2.onclose=()=>{let uptime=Date.now()-connectionStartTime,transportType=serverRef.type??"unknown";logMCPDebug(name,`${transportType.toUpperCase()} connection closed after ${Math.floor(uptime/1e3)}s (${hasErrorOccurred?"with errors":"cleanly"})`);let key3=getServerCacheKey(name,serverRef);clearMcpFetchCaches(name,{tools:fetchToolsForClient,resources:fetchResourcesForClient,resourceTemplates:fetchResourceTemplatesForClient,commands:fetchCommandsForClient,skills:null}),connectToServer.cache.delete(key3),logMCPDebug(name,"Cleared connection cache for reconnection"),originalOnclose&&originalOnclose()};let cleanup=__name(async()=>{if(inProcessServer){try{await inProcessServer.close?.()}catch(error40){logMCPDebug(name,`Error closing in-process server: ${error40}`)}try{await client2.close()}catch(error40){logMCPDebug(name,`Error closing client: ${error40}`)}return}if(stderrHandler&&(serverRef.type==="stdio"||!serverRef.type)&&transport.stderr?.off("data",stderrHandler),serverRef.type==="stdio")try{let childPid=transport.pid;if(childPid){logMCPDebug(name,"Sending SIGINT to MCP server process");try{process.kill(childPid,"SIGINT")}catch(error40){logMCPDebug(name,`Error sending SIGINT: ${error40}`);return}await new Promise(async resolve67=>{let resolved=!1,checkInterval=setInterval(()=>{try{process.kill(childPid,0)}catch{resolved||(resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),logMCPDebug(name,"MCP server process exited cleanly"),resolve67())}},50),failsafeTimeout=setTimeout(()=>{resolved||(resolved=!0,clearInterval(checkInterval),logMCPDebug(name,"Cleanup timeout reached, stopping process monitoring"),resolve67())},600);try{if(await sleep2(100),!resolved){try{process.kill(childPid,0),logMCPDebug(name,"SIGINT failed, sending SIGTERM to MCP server process");try{process.kill(childPid,"SIGTERM")}catch(termError){logMCPDebug(name,`Error sending SIGTERM: ${termError}`),resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67();return}}catch{resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67();return}if(await sleep2(400),!resolved)try{process.kill(childPid,0),logMCPDebug(name,"SIGTERM failed, sending SIGKILL to MCP server process");try{process.kill(childPid,"SIGKILL")}catch(killError){logMCPDebug(name,`Error sending SIGKILL: ${killError}`)}}catch{resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67()}}resolved||(resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67())}catch{resolved||(resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67())}})}}catch(processError){logMCPDebug(name,`Error terminating process: ${processError}`)}try{await client2.close()}catch(error40){logMCPDebug(name,`Error closing client: ${error40}`)}},"cleanup"),cleanupUnregister=registerCleanup(cleanup),wrappedCleanup=__name(async()=>{cleanupUnregister?.(),await cleanup()},"wrappedCleanup"),connectionDurationMs=Date.now()-connectStartTime;return logEvent("tengu_mcp_server_connection_succeeded",{connectionDurationMs,transportType:serverRef.type??"stdio",totalServers:serverStats?.totalServers,stdioCount:serverStats?.stdioCount,sseCount:serverStats?.sseCount,httpCount:serverStats?.httpCount,sseIdeCount:serverStats?.sseIdeCount,wsIdeCount:serverStats?.wsIdeCount,...mcpBaseUrlAnalytics(serverRef)}),{name,client:client2,type:"connected",capabilities:capabilities??{},serverInfo:serverVersion,instructions,config:serverRef,cleanup:wrappedCleanup}}catch(error40){let connectionDurationMs=Date.now()-connectStartTime;return logEvent("tengu_mcp_server_connection_failed",{connectionDurationMs,totalServers:serverStats?.totalServers||1,stdioCount:serverStats?.stdioCount||(serverRef.type==="stdio"?1:0),sseCount:serverStats?.sseCount||(serverRef.type==="sse"?1:0),httpCount:serverStats?.httpCount||(serverRef.type==="http"?1:0),sseIdeCount:serverStats?.sseIdeCount||(serverRef.type==="sse-ide"?1:0),wsIdeCount:serverStats?.wsIdeCount||(serverRef.type==="ws-ide"?1:0),transportType:serverRef.type??"stdio",...mcpBaseUrlAnalytics(serverRef)}),logMCPDebug(name,`Connection failed after ${connectionDurationMs}ms: ${errorMessage2(error40)}`),logMCPError(name,`Connection failed: ${errorMessage2(error40)}`),inProcessServer&&inProcessServer.close?.().catch(()=>{}),{name,type:"failed",config:serverRef,error:errorMessage2(error40)}}},getServerCacheKey);__name(clearServerCache,"clearServerCache");__name(ensureConnectedClient,"ensureConnectedClient");fetchToolsForClient=createFetchToolsForClient({ensureConnectedClient,callMCPToolWithUrlElicitationRetry}),fetchCommandsForClient=createFetchCommandsForClient({ensureConnectedClient,transformResultContent,zipObject:zipObject_default});__name(callIdeRpc,"callIdeRpc");__name(reconnectMcpServerImpl,"reconnectMcpServerImpl");__name(getMcpToolsCommandsAndResources,"getMcpToolsCommandsAndResources");prefetchAllMcpResources=createPrefetchAllMcpResources(getMcpToolsCommandsAndResources);__name(callMCPToolWithUrlElicitationRetry,"callMCPToolWithUrlElicitationRetry");__name(callMCPTool2,"callMCPTool");__name(setupSdkMcpClients,"setupSdkMcpClients")}});import{createHash as createHash38}from"crypto";function filterSwarmFieldsFromSchema(toolName4,schema){let fieldsToRemove=SWARM_FIELDS_BY_TOOL[toolName4];if(!fieldsToRemove||fieldsToRemove.length===0)return schema;let filtered={...schema},props=filtered.properties;if(props&&typeof props=="object"){let filteredProps={...props};for(let field2 of fieldsToRemove)delete filteredProps[field2];filtered.properties=filteredProps}return filtered}async function toolToAPISchema(tool,options){let cacheKey="inputJSONSchema"in tool&&tool.inputJSONSchema?`${tool.name}:${jsonStringify(tool.inputJSONSchema)}`:tool.name,cache5=getToolSchemaCache(),strictToolsEnabled=checkStatsigFeatureGate_CACHED_MAY_BE_STALE("tengu_tool_pear"),base=cache5.get(cacheKey);if(!base){let schemaDrop=tool.isMcp?mcpSchemaDropFor(tool.name):void 0,input_schema=normalizeToolInputJsonSchema(schemaDrop?emptyMcpInputSchema():"inputJSONSchema"in tool&&tool.inputJSONSchema?tool.inputJSONSchema:zodToJsonSchema2(tool.inputSchema));isAgentSwarmsEnabled()||(input_schema=filterSwarmFieldsFromSchema(tool.name,input_schema)),base={name:tool.name,description:await tool.prompt({getToolPermissionContext:options.getToolPermissionContext,tools:options.tools,agents:options.agents,allowedAgentTypes:options.allowedAgentTypes}),input_schema},cache5.set(cacheKey,base)}let useStrict=strictToolsEnabled&&tool.strict===!0&&options.model!==void 0&&modelSupportsStructuredOutputs(options.model),useEagerInputStreaming=getAPIProvider()==="firstParty"&&isFirstPartyAnthropicBaseUrl()&&(getFeatureValue_CACHED_MAY_BE_STALE("tengu_fgts",!1)||isEnvTruthy2(process.env.CLAUDE_CODE_ENABLE_FINE_GRAINED_TOOL_STREAMING)),schema={name:base.name,description:base.description,input_schema:base.input_schema,...useStrict&&{strict:!0},...useEagerInputStreaming&&{eager_input_streaming:!0}};if(options.deferLoading&&(schema.defer_loading=!0),options.cacheControl&&(schema.cache_control=options.cacheControl),isEnvTruthy2(process.env.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS)){let allowed=new Set(["name","description","input_schema","cache_control"]),stripped=Object.keys(schema).filter(k2=>!allowed.has(k2));if(stripped.length>0)return logStripOnce(stripped),{name:schema.name,description:schema.description,input_schema:schema.input_schema,...schema.cache_control&&{cache_control:schema.cache_control}}}return schema}function logStripOnce(stripped){loggedStrip||(loggedStrip=!0,logForDebugging(`[betas] Stripped from tool schemas: [${stripped.join(", ")}] (CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1)`))}function logAPIPrefix(systemPrompt){let[firstSyspromptBlock]=splitSysPromptPrefix(systemPrompt),firstSystemPrompt=firstSyspromptBlock?.text;logEvent("tengu_sysprompt_block",{snippet:firstSystemPrompt?.slice(0,20),length:firstSystemPrompt?.length??0,hash:firstSystemPrompt?createHash38("sha256").update(firstSystemPrompt).digest("hex"):""})}function splitSysPromptPrefix(systemPrompt,options){let useGlobalCacheFeature=shouldUseGlobalCacheScope();if(useGlobalCacheFeature&&options?.skipGlobalCacheForSystemPrompt){logEvent("tengu_sysprompt_using_tool_based_cache",{promptBlockCount:systemPrompt.length});let systemPromptPrefix2,rest3=[];for(let prompt of systemPrompt)prompt&&prompt!==SYSTEM_PROMPT_DYNAMIC_BOUNDARY&&(CLI_SYSPROMPT_PREFIXES.has(prompt)?systemPromptPrefix2=prompt:rest3.push(prompt));let result3=[];systemPromptPrefix2&&result3.push({text:systemPromptPrefix2,cacheScope:"org"});let restJoined2=rest3.join(`
5978
+ `),!result2.ok)}var init_server3=__esm({"src/services/browser/mcp/server.ts"(){init_server2();init_types4();init_debug();init_errors2();init_officialBrowserMcp();init_batch();init_byRef();init_backendSelector();init_raw();init_semantic();init_sessionState();init_navigateAllowlist();init_toolDefs();__name(textResult,"textResult");__name(createBrowserRuntimeMcpServer,"createBrowserRuntimeMcpServer");__name(handleStatus,"handleStatus");__name(ensureClient,"ensureClient");__name(ensureActiveSession,"ensureActiveSession");__name(handleTabs,"handleTabs");__name(handleNavigate,"handleNavigate");__name(handleSnapshot,"handleSnapshot");__name(handleScreenshot,"handleScreenshot");__name(handleClick,"handleClick");__name(handleType,"handleType");__name(handlePress,"handlePress");__name(handleAct,"handleAct")}});import process16 from"node:process";var StdioServerTransport,init_stdio4=__esm({"../../../rustfleet/wt/rel136/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js"(){init_stdio2();StdioServerTransport=class{static{__name(this,"StdioServerTransport")}constructor(_stdin=process16.stdin,_stdout=process16.stdout){this._stdin=_stdin,this._stdout=_stdout,this._readBuffer=new ReadBuffer,this._started=!1,this._ondata=chunk3=>{this._readBuffer.append(chunk3),this.processReadBuffer()},this._onerror=error40=>{this.onerror?.(error40)}}async start(){if(this._started)throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");this._started=!0,this._stdin.on("data",this._ondata),this._stdin.on("error",this._onerror)}processReadBuffer(){for(;;)try{let message=this._readBuffer.readMessage();if(message===null)break;this.onmessage?.(message)}catch(error40){this.onerror?.(error40)}}async close(){this._stdin.off("data",this._ondata),this._stdin.off("error",this._onerror),this._stdin.listenerCount("data")===0&&this._stdin.pause(),this._readBuffer.clear(),this.onclose?.()}send(message){return new Promise(resolve67=>{let json2=serializeMessage(message);this._stdout.write(json2)?resolve67():this._stdout.once("drain",resolve67)})}}}});function shouldTrackDatadog(){if(isSinkKilled("datadog"))return!1;if(isDatadogGateEnabled!==void 0)return isDatadogGateEnabled;try{return checkStatsigFeatureGate_CACHED_MAY_BE_STALE(DATADOG_GATE_NAME)}catch{return!1}}function logEventImpl(eventName,metadata){let sampleResult=shouldSampleEvent(eventName);if(sampleResult===0)return;let metadataWithSampleRate=sampleResult!==null?{...metadata,sample_rate:sampleResult}:metadata;shouldTrackDatadog()&&trackDatadogEvent(eventName,stripProtoFields(metadataWithSampleRate)),logEventTo1P(eventName,metadataWithSampleRate)}function logEventAsyncImpl(eventName,metadata){return logEventImpl(eventName,metadata),Promise.resolve()}function initializeAnalyticsGates(){isDatadogGateEnabled=checkStatsigFeatureGate_CACHED_MAY_BE_STALE(DATADOG_GATE_NAME)}function initializeAnalyticsSink(){attachAnalyticsSink({logEvent:logEventImpl,logEventAsync:logEventAsyncImpl})}var DATADOG_GATE_NAME,isDatadogGateEnabled,init_sink=__esm({"src/services/analytics/sink.ts"(){init_datadog();init_firstPartyEventLogger();init_growthbook();init_analytics();init_sinkKillswitch();DATADOG_GATE_NAME="tengu_log_datadog_events";__name(shouldTrackDatadog,"shouldTrackDatadog");__name(logEventImpl,"logEventImpl");__name(logEventAsyncImpl,"logEventAsyncImpl");__name(initializeAnalyticsGates,"initializeAnalyticsGates");__name(initializeAnalyticsSink,"initializeAnalyticsSink")}});function isUserFacingPath(path40,homeDir){if(PATH_ALLOWLIST.some(root2=>path40.startsWith(root2)))return!0;if(homeDir){let userApps=homeDir.endsWith("/")?`${homeDir}Applications/`:`${homeDir}/Applications/`;if(path40.startsWith(userApps))return!0}return!1}function isNoisyName(name){return NAME_PATTERN_BLOCKLIST.some(re2=>re2.test(name))}function sanitizeCore(raw,applyCharFilter){let seen2=new Set;return raw.map(name=>name.trim()).filter(trimmed=>!trimmed||trimmed.length>APP_NAME_MAX_LEN||applyCharFilter&&!APP_NAME_ALLOWED.test(trimmed)||seen2.has(trimmed)?!1:(seen2.add(trimmed),!0)).sort((a2,b3)=>a2.localeCompare(b3))}function sanitizeAppNames(raw){let filtered=sanitizeCore(raw,!0);return filtered.length<=APP_NAME_MAX_COUNT?filtered:[...filtered.slice(0,APP_NAME_MAX_COUNT),`\u2026 and ${filtered.length-APP_NAME_MAX_COUNT} more`]}function sanitizeTrustedNames(raw){return sanitizeCore(raw,!1)}function filterAppsForDescription(installed2,homeDir){let{alwaysKept,rest:rest2}=installed2.reduce((acc,app)=>(ALWAYS_KEEP_BUNDLE_IDS.has(app.bundleId)?acc.alwaysKept.push(app.displayName):isUserFacingPath(app.path,homeDir)&&!isNoisyName(app.displayName)&&acc.rest.push(app.displayName),acc),{alwaysKept:[],rest:[]}),sanitizedAlways=sanitizeTrustedNames(alwaysKept),alwaysSet=new Set(sanitizedAlways);return[...sanitizedAlways,...sanitizeAppNames(rest2).filter(n4=>!alwaysSet.has(n4))]}var PATH_ALLOWLIST,NAME_PATTERN_BLOCKLIST,ALWAYS_KEEP_BUNDLE_IDS,APP_NAME_ALLOWED,APP_NAME_MAX_LEN,APP_NAME_MAX_COUNT,init_appNames=__esm({"src/utils/computerUse/appNames.ts"(){PATH_ALLOWLIST=["/Applications/","/System/Applications/"],NAME_PATTERN_BLOCKLIST=[/Helper(?:$|\s\()/,/Agent(?:$|\s\()/,/Service(?:$|\s\()/,/Uninstaller(?:$|\s\()/,/Updater(?:$|\s\()/,/^\./],ALWAYS_KEEP_BUNDLE_IDS=new Set(["com.apple.Safari","com.google.Chrome","com.microsoft.edgemac","org.mozilla.firefox","company.thebrowser.Browser","com.tinyspeck.slackmacgap","us.zoom.xos","com.microsoft.teams2","com.microsoft.teams","com.apple.MobileSMS","com.apple.mail","com.microsoft.Word","com.microsoft.Excel","com.microsoft.Powerpoint","com.microsoft.Outlook","com.apple.iWork.Pages","com.apple.iWork.Numbers","com.apple.iWork.Keynote","com.google.GoogleDocs","notion.id","com.apple.Notes","md.obsidian","com.linear","com.figma.Desktop","com.microsoft.VSCode","com.apple.Terminal","com.googlecode.iterm2","com.github.GitHubDesktop","com.apple.finder","com.apple.iCal","com.apple.systempreferences"]),APP_NAME_ALLOWED=/^[\p{L}\p{M}\p{N}_ .&'()+-]+$/u,APP_NAME_MAX_LEN=40,APP_NAME_MAX_COUNT=50;__name(isUserFacingPath,"isUserFacingPath");__name(isNoisyName,"isNoisyName");__name(sanitizeCore,"sanitizeCore");__name(sanitizeAppNames,"sanitizeAppNames");__name(sanitizeTrustedNames,"sanitizeTrustedNames");__name(filterAppsForDescription,"filterAppsForDescription")}});function buildComputerUseTools(installedAppNames2){let appsHint=installedAppNames2?.length?` Installed applications include: ${installedAppNames2.join(", ")}.`:"";return[{name:"computer_status",description:"Diagnose local Computer Use readiness: macOS Accessibility, Screen Recording, displays, running apps, and frontmost app. Read-only and does not require app access. Call first when starting desktop control.",inputSchema:objectSchema({}),annotations:{readOnlyHint:!0}},{name:"request_access",description:"Request session-scoped permission to inspect and control named Mac applications. Required before screenshots, UI inspection, launch, click, typing, or key actions. Prefer shell/APIs when the task is not GUI."+appsHint,inputSchema:objectSchema({apps:{type:"array",minItems:1,maxItems:20,items:{type:"string"},description:"Application display names or bundle identifiers."},reason:{type:"string",maxLength:300},clipboard_read:{type:"boolean"},clipboard_write:{type:"boolean"},system_key_combos:{type:"boolean"}},["apps"])},{name:"list_granted_applications",description:"List applications and optional capabilities granted for this session.",inputSchema:objectSchema({}),annotations:{readOnlyHint:!0}},{name:"open_application",description:"Launch or activate a previously granted Mac application by bundle ID. Then inspect_ui before clicking.",inputSchema:objectSchema({bundle_id:bundleId},["bundle_id"])},{name:"screenshot",description:`Capture the full target display after hiding ungranted applications. Returns a thrift JPEG (long edge ~${1280}px; override CLAVUE_CU_SCREENSHOT_MAX). Last-resort eyes \u2014 prefer zoom (window/region) for visual verify, and inspect_ui/find_label for targeting. Not the default control path. Blocked while a password-manager-like app is frontmost unless CLAVUE_CU_ALLOW_SENSITIVE=1 (pixel leak).`,inputSchema:objectSchema({display_id:{type:"number"}}),annotations:{readOnlyHint:!0}},{name:"zoom",description:`Capture a rectangular screen region as a thrift JPEG (long edge cap ~${1280}px). Prefer zoom of the active window/control over full-display screenshot. Prefer inspect_ui/find_label for labeled controls.`,inputSchema:objectSchema({region:{type:"array",items:{type:"number"},minItems:4,maxItems:4,description:"[x, y, width, height] in logical screen pixels."}},["region"]),annotations:{readOnlyHint:!0}},{name:"inspect_ui",description:COMPUTER_USE_AX_PRIMARY_HINT+" Returns compact elements with paths, roles, labels, values, frames and actions. Re-inspect after UI changes because paths may become stale. Prefer over screenshot for targeting.",inputSchema:objectSchema({bundle_id:bundleId,max_depth:{type:"number",minimum:1,maximum:12,default:6},max_elements:{type:"number",minimum:1,maximum:500,default:120},include_menu_bar:{type:"boolean",default:!1,description:"Include the usually large macOS menu tree only when needed."}},["bundle_id"]),annotations:{readOnlyHint:!0}},{name:"ui_action",description:COMPUTER_USE_AX_PRIMARY_HINT+" Act on an element from the latest inspect_ui (press/focus/set_value). Prefer over pixel clicks. After success, re-inspect_ui (or screenshot) before claiming the UI changed. risk other than none requires user confirmation.",inputSchema:objectSchema({bundle_id:bundleId,path:{type:"string",description:"Element path from the latest inspect_ui result."},action:{type:"string",enum:["press","confirm","focus","set_value","increment","decrement"]},value:{type:"string"},intent:{type:"string",maxLength:200,description:"What this action is expected to do in the application."},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"],description:"User-visible side-effect category. Use none only when side-effect free. delete/communicate/financial/install_or_settings/sensitive_data require confirmation."}},["bundle_id","path","action","intent","risk"])},{name:"find_label",description:COMPUTER_USE_AX_PRIMARY_HINT+" Find UI elements by visible label (title/description/identifier/value) via Accessibility. Read-only. Prefer this or click_text before coordinate clicks.",inputSchema:objectSchema({bundle_id:bundleId,query:{type:"string",minLength:1,maxLength:200,description:"Label text to search (substring match unless exact=true)."},exact:{type:"boolean",default:!1,description:"Require full-string match on a label field."},role:{type:"string",description:"Optional AX role filter (e.g. AXButton)."},max_depth:{type:"number",minimum:1,maximum:12,default:6},max_elements:{type:"number",minimum:1,maximum:500,default:120},limit:{type:"number",minimum:1,maximum:50,default:12}},["bundle_id","query"]),annotations:{readOnlyHint:!0}},{name:"click_text",description:COMPUTER_USE_AX_PRIMARY_HINT+" Find by label then press (AXPress) or click frame center. Prefer over left_click. After success, re-inspect or screenshot before claiming the UI changed. risk other than none requires confirmation.",inputSchema:objectSchema({bundle_id:bundleId,query:{type:"string",minLength:1,maxLength:200,description:"Label text to click (e.g. Save, \u597D, Format)."},exact:{type:"boolean",default:!1,description:"Require full-string match on a label field."},role:{type:"string",description:"Optional AX role filter (e.g. AXButton)."},intent:{type:"string",maxLength:200,description:"What this click is expected to do."},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"],description:"User-visible side-effect category. none only when side-effect free."},max_depth:{type:"number",minimum:1,maximum:12,default:6},max_elements:{type:"number",minimum:1,maximum:500,default:120}},["bundle_id","query","intent","risk"])},{name:"left_click",description:"Left-click a point after verifying the frontmost/under-point app is granted. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["coordinate","intent","risk"])},{name:"right_click",description:"Right-click a point after verifying the target app is granted. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["coordinate","intent","risk"])},{name:"double_click",description:"Double-click a point after verifying the target app is granted. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["coordinate","intent","risk"])},{name:"triple_click",description:"Triple-click a point after verifying the target app is granted. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["coordinate","intent","risk"])},{name:"mouse_move",description:"Move the pointer without clicking. Prefer inspect_ui/ui_action for real control changes.",inputSchema:objectSchema({coordinate},["coordinate"])},{name:"left_click_drag",description:"Drag from start_coordinate to coordinate. "+COMPUTER_USE_PIXEL_FALLBACK_HINT,inputSchema:objectSchema({start_coordinate:coordinate,coordinate,intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["start_coordinate","coordinate","intent","risk"])},{name:"scroll",description:"Scroll at the current pointer or an optional coordinate. Prefer ui_action on scrollable AX elements when available.",inputSchema:objectSchema({direction:{type:"string",enum:["up","down","left","right"]},amount:{type:"number",minimum:1,maximum:20,default:3},coordinate},["direction"])},{name:"type",description:"Type Unicode text into the granted frontmost application. Prefer focus/set_value via ui_action when a field path exists. Re-inspect after typing if the UI should change. risk other than none requires confirmation.",inputSchema:objectSchema({text:{type:"string",maxLength:1e5},intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["text","intent","risk"])},{name:"key",description:COMPUTER_USE_KEYBOARD_FIRST_HINT+" Press a key or chord such as return, escape, command+s, command+a, control+tab. Prefer shortcuts over pixel clicks when possible. System-wide chords require the system_key_combos grant. Do not spam Space/media keys as a retry loop. risk other than none requires confirmation.",inputSchema:objectSchema({text:{type:"string"},repeat:{type:"number",minimum:1,maximum:100,default:1},intent:{type:"string",maxLength:200},risk:{type:"string",enum:["none","delete","communicate","financial","install_or_settings","sensitive_data","other"]}},["text","intent","risk"])},{name:"wait",description:"Wait briefly for an app/UI transition, then continue diagnosis.",inputSchema:objectSchema({duration:{type:"number",minimum:0,maximum:30}},["duration"]),annotations:{readOnlyHint:!0}},{name:"cursor_position",description:"Read the current pointer position.",inputSchema:objectSchema({}),annotations:{readOnlyHint:!0}},{name:"read_clipboard",description:"Read plain text from the clipboard when clipboard_read was granted.",inputSchema:objectSchema({}),annotations:{readOnlyHint:!0}},{name:"write_clipboard",description:"Write plain text to the clipboard when clipboard_write was granted.",inputSchema:objectSchema({text:{type:"string",maxLength:1e5}},["text"])}]}var objectSchema,coordinate,bundleId,init_tools4=__esm({"src/utils/computerUse/tools.ts"(){init_efficiencyLaw();objectSchema=__name((properties,required2=[])=>({type:"object",properties,...required2.length>0?{required:required2}:{},additionalProperties:!1}),"objectSchema"),coordinate={type:"array",items:{type:"number"},minItems:2,maxItems:2,description:"[x, y] in logical screen pixels from the global top-left."},bundleId={type:"string",description:"Exact macOS application bundle identifier."};__name(buildComputerUseTools,"buildComputerUseTools")}});var mcpServer_exports={};__export(mcpServer_exports,{createComputerUseMcpServerForCli:()=>createComputerUseMcpServerForCli,runComputerUseMcpServer:()=>runComputerUseMcpServer});import{homedir as homedir31}from"os";async function installedAppNames(){let timer2,timeout=new Promise(resolve67=>{timer2=globalThis.setTimeout(resolve67,APP_ENUM_TIMEOUT_MS)}),apps=await Promise.race([listComputerUseInstalledApps().catch(()=>{}),timeout]).finally(()=>globalThis.clearTimeout(timer2));return apps?filterAppsForDescription(apps,homedir31()):void 0}async function createComputerUseMcpServerForCli(){let server2=new Server({name:"clavue-computer-use",version:"1.0.0"},{capabilities:{tools:{}},instructions:getComputerUseEfficiencyPolicyText()}),tools=buildComputerUseTools(await installedAppNames());return server2.setRequestHandler(ListToolsRequestSchema,async()=>({tools})),server2.setRequestHandler(CallToolRequestSchema,async()=>({isError:!0,content:[{type:"text",text:"Computer Use actions require an interactive Clavue session."}]})),server2}async function runComputerUseMcpServer(){enableConfigs(),initializeAnalyticsSink();let server2=await createComputerUseMcpServerForCli(),transport=new StdioServerTransport,exiting=!1,shutdownAndExit=__name(async()=>{exiting||(exiting=!0,await Promise.all([shutdown1PEventLogging(),shutdownDatadog()]),process.exit(0))},"shutdownAndExit");process.stdin.on("end",()=>{shutdownAndExit()}),process.stdin.on("error",()=>{shutdownAndExit()}),await server2.connect(transport)}var APP_ENUM_TIMEOUT_MS,init_mcpServer=__esm({"src/utils/computerUse/mcpServer.ts"(){init_server2();init_stdio4();init_types4();init_datadog();init_firstPartyEventLogger();init_sink();init_config12();init_appNames();init_efficiencyLaw();init_executor();init_tools4();APP_ENUM_TIMEOUT_MS=1e3;__name(installedAppNames,"installedAppNames");__name(createComputerUseMcpServerForCli,"createComputerUseMcpServerForCli");__name(runComputerUseMcpServer,"runComputerUseMcpServer")}});var client_exports3={};__export(client_exports3,{MAX_MCP_DESCRIPTION_LENGTH:()=>MAX_MCP_DESCRIPTION_LENGTH,MCP_FETCH_CACHE_SIZE:()=>MCP_FETCH_CACHE_SIZE,MCP_REQUEST_TIMEOUT_MS:()=>MCP_REQUEST_TIMEOUT_MS,McpAuthError:()=>McpAuthError,McpSessionExpiredError:()=>McpSessionExpiredError,McpToolCallError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS:()=>McpToolCallError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,areMcpConfigsEqual:()=>areMcpConfigsEqual,callIdeRpc:()=>callIdeRpc,callMCPToolWithUrlElicitationRetry:()=>callMCPToolWithUrlElicitationRetry,clearMcpAuthCache:()=>clearMcpAuthCache,clearServerCache:()=>clearServerCache,connectToServer:()=>connectToServer,createClaudeAiProxyFetch:()=>createClaudeAiProxyFetch,createFetchCommandsForClient:()=>createFetchCommandsForClient,createNodeWsClient:()=>createNodeWsClient,ensureConnectedClient:()=>ensureConnectedClient,fetchCommandsForClient:()=>fetchCommandsForClient,fetchResourceTemplatesForClient:()=>fetchResourceTemplatesForClient,fetchResourcesAndTemplatesForClient:()=>fetchResourcesAndTemplatesForClient,fetchResourcesForClient:()=>fetchResourcesForClient,fetchToolsForClient:()=>fetchToolsForClient,getConnectionTimeoutMs:()=>getConnectionTimeoutMs,getMcpServerConnectionBatchSize:()=>getMcpServerConnectionBatchSize,getMcpToolTimeoutMs:()=>getMcpToolTimeoutMs,getMcpToolsCommandsAndResources:()=>getMcpToolsCommandsAndResources,getServerCacheKey:()=>getServerCacheKey,inferCompactSchema:()=>inferCompactSchema,isMcpSessionExpiredError:()=>isMcpSessionExpiredError,mcpToolInputToAutoClassifierInput:()=>mcpToolInputToAutoClassifierInput,prefetchAllMcpResources:()=>prefetchAllMcpResources,processBatched:()=>processBatched,processMCPResult:()=>processMCPResult,reconnectMcpServerImpl:()=>reconnectMcpServerImpl,setupSdkMcpClients:()=>setupSdkMcpClients,transformMCPResult:()=>transformMCPResult,transformResultContent:()=>transformResultContent,wrapFetchWithTimeout:()=>wrapFetchWithTimeout});async function clearServerCache(name,serverRef){let key3=getServerCacheKey(name,serverRef);try{let wrappedClient=await connectToServer(name,serverRef);wrappedClient.type==="connected"&&await wrappedClient.cleanup()}catch{}connectToServer.cache.delete(key3),clearMcpFetchCaches(name,{tools:fetchToolsForClient,resources:fetchResourcesForClient,resourceTemplates:fetchResourceTemplatesForClient,commands:fetchCommandsForClient,skills:null})}async function ensureConnectedClient(client2){if(client2.config.type==="sdk")return client2;let connectedClient=await connectToServer(client2.name,client2.config);if(connectedClient.type!=="connected")throw new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(`MCP server "${client2.name}" is not connected`,"MCP server not connected");return connectedClient}async function callIdeRpc(toolName4,args,client2){return(await callMCPTool2({client:client2,tool:toolName4,args,signal:createAbortController().signal})).content}async function reconnectMcpServerImpl(name,config3){try{clearKeychainCache(),await clearServerCache(name,config3);let client2=await connectToServer(name,config3);if(client2.type!=="connected")return{client:client2,tools:[],commands:[]};let{supportsResources,tools,commands,resources}=await fetchConnectedClientState(client2,{fetchToolsForClient,fetchCommandsForClient,fetchResourcesForClient,fetchMcpSkillsForClient:fetchMcpSkillsForClient2}),resourceTools=[];return supportsResources&&([ListMcpResourcesTool,ReadMcpResourceTool].some(tool=>tools.some(t7=>toolMatchesName(t7,tool.name)))||resourceTools.push(ListMcpResourcesTool,ReadMcpResourceTool)),{client:client2,tools:[...tools,...resourceTools],commands,resources:resources.length>0?resources:void 0}}catch(error40){return logMCPError(name,`Error during reconnection: ${errorMessage2(error40)}`),{client:{name,type:"failed",config:config3},tools:[],commands:[]}}}async function getMcpToolsCommandsAndResources(onConnectionAttempt,mcpConfigs){let resourceToolsAdded=!1,allConfigEntries=Object.entries(mcpConfigs??(await getAllMcpConfigs()).servers),configEntries=[];for(let entry of allConfigEntries)isMcpServerDisabled(entry[0])?onConnectionAttempt({client:{name:entry[0],type:"disabled",config:entry[1]},tools:[],commands:[]}):configEntries.push(entry);let totalServers=configEntries.length,stdioCount=count2(configEntries,([_2,c4])=>c4.type==="stdio"),sseCount=count2(configEntries,([_2,c4])=>c4.type==="sse"),httpCount=count2(configEntries,([_2,c4])=>c4.type==="http"),sseIdeCount=count2(configEntries,([_2,c4])=>c4.type==="sse-ide"),wsIdeCount=count2(configEntries,([_2,c4])=>c4.type==="ws-ide"),localServers=configEntries.filter(([_2,config3])=>isLocalMcpServer(config3)),remoteServers=configEntries.filter(([_2,config3])=>!isLocalMcpServer(config3)),serverStats={totalServers,stdioCount,sseCount,httpCount,sseIdeCount,wsIdeCount},processServer=__name(async([name,config3])=>{try{if(isMcpServerDisabled(name)){onConnectionAttempt({client:{name,type:"disabled",config:config3},tools:[],commands:[]});return}let knownConfigIssue="command"in config3?getKnownMcpConfigIssue(config3):null;if(knownConfigIssue){let issueMessage=`${knownConfigIssue.message} ${knownConfigIssue.suggestion}`;logMCPError(name,issueMessage),onConnectionAttempt({client:{name,type:"failed",config:config3,error:issueMessage},tools:[],commands:[]});return}if((config3.type==="claudeai-proxy"||config3.type==="http"||config3.type==="sse")&&(await isMcpAuthCached(name)||(config3.type==="http"||config3.type==="sse")&&hasMcpDiscoveryButNoToken(name,config3))){logMCPDebug(name,"Skipping connection (cached needs-auth)"),onConnectionAttempt({client:{name,type:"needs-auth",config:config3},tools:[createMcpAuthTool(name,config3)],commands:[]});return}let client2=await connectToServer(name,config3,serverStats);if(client2.type!=="connected"){onConnectionAttempt({client:client2,tools:client2.type==="needs-auth"?[createMcpAuthTool(name,config3)]:[],commands:[]});return}let{supportsResources,tools,commands,resources}=await fetchConnectedClientState(client2,{fetchToolsForClient,fetchCommandsForClient,fetchResourcesForClient,fetchMcpSkillsForClient:fetchMcpSkillsForClient2}),resourceTools=[];supportsResources&&!resourceToolsAdded&&(resourceToolsAdded=!0,resourceTools.push(ListMcpResourcesTool,ReadMcpResourceTool)),onConnectionAttempt({client:client2,tools:[...tools,...resourceTools],commands,resources:resources.length>0?resources:void 0})}catch(error40){logMCPError(name,`Error fetching tools/commands/resources: ${errorMessage2(error40)}`),onConnectionAttempt({client:{name,type:"failed",config:config3},tools:[],commands:[]})}},"processServer");await Promise.all([processBatched(localServers,getMcpServerConnectionBatchSize(),processServer),processBatched(remoteServers,getRemoteMcpServerConnectionBatchSize(),processServer)])}async function callMCPToolWithUrlElicitationRetry({client:connectedClient,clientConnection,tool,args,meta,signal,setAppState,onProgress,callToolFn=callMCPTool2,handleElicitation}){for(let attempt2=0;;attempt2++)try{return await callToolFn({client:connectedClient,tool,args,meta,signal,onProgress})}catch(error40){if(!(error40 instanceof McpError)||error40.code!==ErrorCode.UrlElicitationRequired||attempt2>=3)throw error40;let elicitations=getValidUrlElicitations(error40.data),serverName=getServerNameForElicitation(clientConnection);if(elicitations.length===0)throw logMCPDebug(serverName,`Tool '${tool}' returned -32042 but no valid elicitations in error data`),error40;logMCPDebug(serverName,`Tool '${tool}' requires URL elicitation (error -32042, attempt ${attempt2+1}), processing ${elicitations.length} elicitation(s)`);for(let elicitation of elicitations){let{elicitationId}=elicitation,hookResponse=await runElicitationHooks(serverName,elicitation,signal);if(hookResponse){if(logMCPDebug(serverName,`URL elicitation ${elicitationId} resolved by hook: ${jsonStringify(hookResponse)}`),hookResponse.action!=="accept")return{content:formatUrlElicitationBlockedMessage(tool,hookResponse.action,"hook")};continue}let userResult;handleElicitation?userResult=await handleElicitation(serverName,elicitation,signal):userResult=await queueUrlElicitation({serverName,elicitation,signal,setAppState});let finalResult=await runElicitationResultHooks(serverName,userResult,signal,"url",elicitationId);if(finalResult.action!=="accept")return logMCPDebug(serverName,`User ${finalResult.action==="decline"?"declined":finalResult.action+"ed"} URL elicitation ${elicitationId}`),{content:formatUrlElicitationBlockedMessage(tool,finalResult.action,"user")};logMCPDebug(serverName,`Elicitation ${elicitationId} completed, retrying tool call`)}}}function callMCPTool2(args){return callMCPTool(args,{clearServerCache})}async function setupSdkMcpClients(sdkMcpConfigs,sendMcpMessage){let clients=[],tools=[],results=await Promise.allSettled(Object.entries(sdkMcpConfigs).map(async([name,config3])=>{let transport=new SdkControlClientTransport(name,sendMcpMessage),client2=new Client({name:"clavue",title:"Clavue",version:typeof MACRO<"u"?"13.9.2":"unknown",description:"Clavue coding assistant",websiteUrl:PRODUCT_URL},{capabilities:{}});try{await client2.connect(transport);let capabilities=client2.getServerCapabilities(),connectedClient={type:"connected",name,capabilities:capabilities||{},client:client2,config:{...config3,scope:"dynamic"},cleanup:__name(async()=>{await client2.close()},"cleanup")},serverTools=[];if(capabilities?.tools){let sdkTools=await fetchToolsForClient(connectedClient);serverTools.push(...sdkTools)}return{client:connectedClient,tools:serverTools}}catch(error40){return logMCPError(name,`Failed to connect SDK MCP server: ${error40}`),{client:{type:"failed",name,config:{...config3,scope:"user"}},tools:[]}}}));for(let result2 of results)result2.status==="fulfilled"&&(clients.push(result2.value.client),tools.push(...result2.value.tools));return{clients,tools}}var fetchMcpSkillsForClient2,isComputerUseMCPServer3,connectToServer,fetchToolsForClient,fetchCommandsForClient,prefetchAllMcpResources,init_client9=__esm({"src/services/mcp/client.ts"(){init_featureFlags();init_auth();init_auth4();init_client7();init_sse2();init_stdio3();init_streamableHttp();init_transport();init_types4();init_mapValues();init_memoize();init_zipObject();init_state();init_oauth();init_product();init_Tool();init_ListMcpResourcesTool();init_McpAuthTool();init_ReadMcpResourceTool();init_abortController();init_array4();init_cleanupRegistry();init_debug();init_errors2();init_http2();init_ide();init_log3();init_mcpWebSocketTransport();init_mtls();init_proxy();init_sessionIngressAuth();init_subprocessEnv();init_analytics();init_elicitationHandler();init_utils10();init_macOsKeychainHelpers();init_sleep2();init_authCache();init_connectionUtils();init_remoteAuth();init_commandFetcher();init_connectedClientState();init_prefetchResources();init_resourceFetcher();init_toolFetcher();init_resultTransform();init_toolCaller();init_urlElicitation();init_authCache();init_connectionUtils();init_remoteAuth();init_commandFetcher();init_resourceFetcher();init_utils10();init_resultTransform();init_auth6();init_config9();init_headersHelper();init_runtimeHealth();init_SdkControlTransport();init_slowOperations();fetchMcpSkillsForClient2=feature("MCP_SKILLS")?(init_mcpSkills(),__toCommonJS(mcpSkills_exports)).fetchMcpSkillsForClient??null:null,isComputerUseMCPServer3=(init_common(),__toCommonJS(common_exports)).isComputerUseMCPServer,connectToServer=memoize_default(async(name,serverRef,serverStats)=>{let connectStartTime=Date.now(),connectionTimeoutMs=getConnectionTimeoutMs(serverRef),inProcessServer;try{let transport,sessionIngressToken=getSessionIngressAuthToken();if(serverRef.type==="sse"){let authProvider=new ClaudeAuthProvider(name,serverRef),combinedHeaders=await getMcpServerHeaders(name,serverRef),transportOptions={authProvider,fetch:wrapFetchWithTimeout(wrapFetchWithStepUpDetection(createFetchWithInit(),authProvider)),requestInit:{headers:{"User-Agent":getMCPUserAgent(),...combinedHeaders}}};transportOptions.eventSourceInit={fetch:__name(async(url3,init2)=>{let authHeaders2={},tokens=await authProvider.tokens();tokens&&(authHeaders2.Authorization=`Bearer ${tokens.access_token}`);let proxyOptions=getProxyFetchOptions();return fetch(url3,{...init2,...proxyOptions,headers:{"User-Agent":getMCPUserAgent(),...authHeaders2,...init2?.headers,...combinedHeaders,Accept:"text/event-stream"}})},"fetch")},transport=new SSEClientTransport(new URL(serverRef.url),transportOptions),logMCPDebug(name,"SSE transport initialized, awaiting connection")}else if(serverRef.type==="sse-ide"){logMCPDebug(name,`Setting up SSE-IDE transport to ${serverRef.url}`);let proxyOptions=getProxyFetchOptions(),transportOptions=proxyOptions.dispatcher?{eventSourceInit:{fetch:__name(async(url3,init2)=>fetch(url3,{...init2,...proxyOptions,headers:{"User-Agent":getMCPUserAgent(),...init2?.headers}}),"fetch")}}:{};transport=new SSEClientTransport(new URL(serverRef.url),Object.keys(transportOptions).length>0?transportOptions:void 0)}else if(serverRef.type==="ws-ide"){let tlsOptions=getWebSocketTLSOptions(),wsHeaders={"User-Agent":getMCPUserAgent(),...serverRef.authToken&&{"X-Claude-Code-Ide-Authorization":serverRef.authToken}},wsClient;typeof Bun<"u"?wsClient=new globalThis.WebSocket(serverRef.url,{protocols:["mcp"],headers:wsHeaders,proxy:getWebSocketProxyUrl(serverRef.url),tls:tlsOptions||void 0}):wsClient=await createNodeWsClient(serverRef.url,{headers:wsHeaders,agent:getWebSocketProxyAgent(serverRef.url),...tlsOptions||{}}),transport=new WebSocketTransport(wsClient)}else if(serverRef.type==="ws"){logMCPDebug(name,`Initializing WebSocket transport to ${serverRef.url}`);let combinedHeaders=await getMcpServerHeaders(name,serverRef),tlsOptions=getWebSocketTLSOptions(),wsHeaders={"User-Agent":getMCPUserAgent(),...sessionIngressToken&&{Authorization:`Bearer ${sessionIngressToken}`},...combinedHeaders},wsHeadersForLogging=mapValues_default(wsHeaders,(value,key3)=>key3.toLowerCase()==="authorization"?"[REDACTED]":value);logMCPDebug(name,`WebSocket transport options: ${jsonStringify({url:serverRef.url,headers:wsHeadersForLogging,hasSessionAuth:!!sessionIngressToken})}`);let wsClient;typeof Bun<"u"?wsClient=new globalThis.WebSocket(serverRef.url,{protocols:["mcp"],headers:wsHeaders,proxy:getWebSocketProxyUrl(serverRef.url),tls:tlsOptions||void 0}):wsClient=await createNodeWsClient(serverRef.url,{headers:wsHeaders,agent:getWebSocketProxyAgent(serverRef.url),...tlsOptions||{}}),transport=new WebSocketTransport(wsClient)}else if(serverRef.type==="http"){logMCPDebug(name,`Initializing HTTP transport to ${serverRef.url}`),logMCPDebug(name,`Node version: ${process.version}, Platform: ${process.platform}`),logMCPDebug(name,`Environment: ${jsonStringify({NODE_OPTIONS:process.env.NODE_OPTIONS||"not set",UV_THREADPOOL_SIZE:process.env.UV_THREADPOOL_SIZE||"default",HTTP_PROXY:process.env.HTTP_PROXY||"not set",HTTPS_PROXY:process.env.HTTPS_PROXY||"not set",NO_PROXY:process.env.NO_PROXY||"not set"})}`);let authProvider=new ClaudeAuthProvider(name,serverRef),combinedHeaders=await getMcpServerHeaders(name,serverRef),hasOAuthTokens=!!await authProvider.tokens(),proxyOptions=getProxyFetchOptions();logMCPDebug(name,`Proxy options: ${proxyOptions.dispatcher?"custom dispatcher":"default"}`);let transportOptions={authProvider,fetch:wrapFetchWithTimeout(wrapFetchWithStepUpDetection(createFetchWithInit(),authProvider)),requestInit:{...proxyOptions,headers:{"User-Agent":getMCPUserAgent(),...sessionIngressToken&&!hasOAuthTokens&&{Authorization:`Bearer ${sessionIngressToken}`},...combinedHeaders}}},headersForLogging=transportOptions.requestInit?.headers?mapValues_default(transportOptions.requestInit.headers,(value,key3)=>key3.toLowerCase()==="authorization"?"[REDACTED]":value):void 0;logMCPDebug(name,`HTTP transport options: ${jsonStringify({url:serverRef.url,headers:headersForLogging,hasAuthProvider:!!authProvider,timeoutMs:MCP_REQUEST_TIMEOUT_MS})}`),transport=new StreamableHTTPClientTransport(new URL(serverRef.url),transportOptions),logMCPDebug(name,"HTTP transport created successfully")}else{if(serverRef.type==="sdk")throw new Error("SDK servers should be handled in print.js");if(serverRef.type==="claudeai-proxy"){if(logMCPDebug(name,`Initializing claude.ai proxy transport for server ${serverRef.id}`),!getClaudeAIOAuthTokens())throw new Error("No claude.ai OAuth token found");let oauthConfig=getOauthConfig(),proxyUrl=`${oauthConfig.MCP_PROXY_URL}${oauthConfig.MCP_PROXY_PATH.replace("{server_id}",serverRef.id)}`;logMCPDebug(name,`Using claude.ai proxy at ${proxyUrl}`);let fetchWithAuth=createClaudeAiProxyFetch(globalThis.fetch),proxyOptions=getProxyFetchOptions(),transportOptions={fetch:wrapFetchWithTimeout(fetchWithAuth),requestInit:{...proxyOptions,headers:{"User-Agent":getMCPUserAgent(),"X-Mcp-Client-Session-Id":getSessionId()}}};transport=new StreamableHTTPClientTransport(new URL(proxyUrl),transportOptions),logMCPDebug(name,"claude.ai proxy transport created successfully")}else if("command"in serverRef&&(await Promise.resolve().then(()=>(init_officialClavueMcp(),officialClavueMcp_exports))).isOfficialClavueMcpServer(name)){let{createOfficialClavueMcpServer:createOfficialClavueMcpServer2}=await Promise.resolve().then(()=>(init_officialClavueMcpServer(),officialClavueMcpServer_exports)),{createLinkedTransportPair:createLinkedTransportPair2}=await Promise.resolve().then(()=>(init_InProcessTransport(),InProcessTransport_exports));inProcessServer=createOfficialClavueMcpServer2();let[clientTransport,serverTransport]=createLinkedTransportPair2();await inProcessServer.connect(serverTransport),transport=clientTransport,logMCPDebug(name,"In-process official Clavue MCP server started")}else if("command"in serverRef&&(await Promise.resolve().then(()=>(init_officialBrowserMcp(),officialBrowserMcp_exports))).isOfficialBrowserMcpServer(name)&&Array.isArray(serverRef.args)&&serverRef.args.map(String).includes((await Promise.resolve().then(()=>(init_officialBrowserMcp(),officialBrowserMcp_exports))).OFFICIAL_BROWSER_RUNTIME_MCP_MARKER_ARG)){let{createBrowserRuntimeMcpServer:createBrowserRuntimeMcpServer2}=await Promise.resolve().then(()=>(init_server3(),server_exports)),{parseBrowserRuntimeKindFromArgs:parseBrowserRuntimeKindFromArgs2}=await Promise.resolve().then(()=>(init_officialBrowserMcp(),officialBrowserMcp_exports)),{createLinkedTransportPair:createLinkedTransportPair2}=await Promise.resolve().then(()=>(init_InProcessTransport(),InProcessTransport_exports)),runtimeKind=parseBrowserRuntimeKindFromArgs2(serverRef.args);inProcessServer=createBrowserRuntimeMcpServer2(runtimeKind);let[clientTransport,serverTransport]=createLinkedTransportPair2();await inProcessServer.connect(serverTransport),transport=clientTransport,logMCPDebug(name,`In-process Browser Runtime MCP server started (${runtimeKind})`)}else if("command"in serverRef&&isComputerUseMCPServer3(name)){let{createComputerUseMcpServerForCli:createComputerUseMcpServerForCli2}=await Promise.resolve().then(()=>(init_mcpServer(),mcpServer_exports)),{createLinkedTransportPair:createLinkedTransportPair2}=await Promise.resolve().then(()=>(init_InProcessTransport(),InProcessTransport_exports));inProcessServer=await createComputerUseMcpServerForCli2();let[clientTransport,serverTransport]=createLinkedTransportPair2();await inProcessServer.connect(serverTransport),transport=clientTransport,logMCPDebug(name,"In-process Computer Use MCP server started")}else if("command"in serverRef){let finalCommand=process.env.CLAUDE_CODE_SHELL_PREFIX||serverRef.command,finalArgs=process.env.CLAUDE_CODE_SHELL_PREFIX?[[serverRef.command,...serverRef.args].join(" ")]:serverRef.args;transport=new StdioClientTransport({command:finalCommand,args:finalArgs,env:buildStdioMcpEnv({base:subprocessEnv(),projectDir:getProjectRoot(),serverEnv:serverRef.env}),stderr:"pipe"})}else throw new Error("Unsupported MCP server configuration")}let stderrHandler,stderrOutput="";if("command"in serverRef){let stdioTransport=transport;stdioTransport.stderr&&(stderrHandler=__name(data=>{if(stderrOutput.length<64*1024*1024)try{stderrOutput+=data.toString()}catch{}},"stderrHandler"),stdioTransport.stderr.on("data",stderrHandler));let NON_PROTOCOL_BYTE_CAP=(()=>{let raw=parseInt(process.env.CLAVUE_MCP_STDIO_NON_PROTOCOL_CAP_MB||"",10);return(Number.isFinite(raw)&&raw>0?raw:16)*1024*1024})();if(NON_PROTOCOL_BYTE_CAP>0){let nonProtocolBytes=0,childStdout=stdioTransport._process?.stdout;if(childStdout){let onStdout=__name(chunk3=>{if(nonProtocolBytes+=typeof chunk3=="string"?Buffer.byteLength(chunk3):chunk3.length,nonProtocolBytes>NON_PROTOCOL_BYTE_CAP){logMCPDebug(name,`stdio stdout exceeded ${NON_PROTOCOL_BYTE_CAP} bytes \u2014 terminating to prevent unbounded memory growth`);try{childStdout.removeListener("data",onStdout)}catch{}transport.close?.()}},"onStdout");childStdout.on("data",onStdout)}}}let client2=new Client({name:"clavue",title:"Clavue",version:typeof MACRO<"u"?"13.9.2":"unknown",description:"Clavue coding assistant",websiteUrl:PRODUCT_URL},{capabilities:{roots:{},elicitation:{}}});if(serverRef.type==="http"&&logMCPDebug(name,"Client created, setting up request handler"),client2.setRequestHandler(ListRootsRequestSchema,async()=>(logMCPDebug(name,"Received ListRoots request from server"),{roots:[{uri:`file://${getOriginalCwd()}`}]})),connectionTimeoutMs!==getConnectionTimeoutMs()&&logMCPDebug(name,`Applying extended stdio startup timeout of ${connectionTimeoutMs}ms for package-manager-backed command`),logMCPDebug(name,`Starting connection with timeout of ${connectionTimeoutMs}ms`),serverRef.type==="http"){logMCPDebug(name,`Testing basic HTTP connectivity to ${serverRef.url}`);try{let testUrl=new URL(serverRef.url);logMCPDebug(name,`Parsed URL: host=${testUrl.hostname}, port=${testUrl.port||"default"}, protocol=${testUrl.protocol}`),(testUrl.hostname==="127.0.0.1"||testUrl.hostname==="localhost")&&logMCPDebug(name,`Using loopback address: ${testUrl.hostname}`)}catch(urlError){logMCPDebug(name,`Failed to parse URL: ${urlError}`)}}let connectPromise=client2.connect(transport),timeoutPromise=new Promise((_2,reject2)=>{let timeoutId=setTimeout(()=>{let elapsed=Date.now()-connectStartTime;logMCPDebug(name,`Connection timeout triggered after ${elapsed}ms (limit: ${connectionTimeoutMs}ms)`),inProcessServer&&inProcessServer.close?.().catch(()=>{}),transport.close().catch(()=>{}),reject2(new TelemetrySafeError_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS(`MCP server "${name}" connection timed out after ${connectionTimeoutMs}ms`,"MCP connection timeout"))},connectionTimeoutMs);connectPromise.then(()=>{clearTimeout(timeoutId)},_error=>{clearTimeout(timeoutId)})});try{await Promise.race([connectPromise,timeoutPromise]),stderrOutput&&(logMCPError(name,`Server stderr: ${stderrOutput}`),stderrOutput="");let elapsed=Date.now()-connectStartTime;logMCPDebug(name,`Successfully connected (transport: ${serverRef.type||"stdio"}) in ${elapsed}ms`)}catch(error40){let elapsed=Date.now()-connectStartTime;if(serverRef.type==="sse"&&error40 instanceof Error){if(logMCPDebug(name,`SSE Connection failed after ${elapsed}ms: ${jsonStringify({url:serverRef.url,error:error40.message,errorType:error40.constructor.name,stack:error40.stack})}`),logMCPError(name,error40),error40 instanceof UnauthorizedError)return handleRemoteAuthFailure(name,serverRef,"sse")}else if(serverRef.type==="http"&&error40 instanceof Error){let errorObj=error40;if(logMCPDebug(name,`HTTP Connection failed after ${elapsed}ms: ${error40.message} (code: ${errorObj.code||"none"}, errno: ${errorObj.errno||"none"})`),logMCPError(name,error40),error40 instanceof UnauthorizedError)return handleRemoteAuthFailure(name,serverRef,"http")}else if(serverRef.type==="claudeai-proxy"&&error40 instanceof Error){if(logMCPDebug(name,`claude.ai proxy connection failed after ${elapsed}ms: ${error40.message}`),logMCPError(name,error40),error40.code===401)return handleRemoteAuthFailure(name,serverRef,"claudeai-proxy")}else(serverRef.type==="sse-ide"||serverRef.type==="ws-ide")&&logEvent("tengu_mcp_ide_server_connection_failed",{connectionDurationMs:elapsed});throw inProcessServer&&inProcessServer.close?.().catch(()=>{}),transport.close().catch(()=>{}),stderrOutput&&logMCPError(name,`Server stderr: ${stderrOutput}`),error40}let capabilities=client2.getServerCapabilities(),serverVersion=client2.getServerVersion(),rawInstructions=client2.getInstructions(),instructions=rawInstructions;if(rawInstructions&&rawInstructions.length>MAX_MCP_DESCRIPTION_LENGTH&&(instructions=rawInstructions.slice(0,MAX_MCP_DESCRIPTION_LENGTH)+"\u2026 [truncated]",logMCPDebug(name,`Server instructions truncated from ${rawInstructions.length} to ${MAX_MCP_DESCRIPTION_LENGTH} chars`)),logMCPDebug(name,`Connection established with capabilities: ${jsonStringify({hasTools:!!capabilities?.tools,hasPrompts:!!capabilities?.prompts,hasResources:!!capabilities?.resources,hasResourceSubscribe:!!capabilities?.resources?.subscribe,serverVersion:serverVersion||"unknown"})}`),logForDebugging(`[MCP] Server "${name}" connected with subscribe=${!!capabilities?.resources?.subscribe}`),client2.setRequestHandler(ElicitRequestSchema,async request=>(logMCPDebug(name,`Elicitation request received during initialization: ${jsonStringify(request)}`),{action:"cancel"})),serverRef.type==="sse-ide"||serverRef.type==="ws-ide"){let ideConnectionDurationMs=Date.now()-connectStartTime;logEvent("tengu_mcp_ide_server_connection_succeeded",{connectionDurationMs:ideConnectionDurationMs,serverVersion});try{maybeNotifyIDEConnected(client2)}catch(error40){logMCPError(name,`Failed to send ide_connected notification: ${error40}`)}}let connectionStartTime=Date.now(),hasErrorOccurred=!1,originalOnerror=client2.onerror,originalOnclose=client2.onclose,consecutiveConnectionErrors=0,MAX_ERRORS_BEFORE_RECONNECT=3,hasTriggeredClose=!1,closeTransportAndRejectPending=__name(reason=>{hasTriggeredClose||(hasTriggeredClose=!0,logMCPDebug(name,`Closing transport (${reason})`),client2.close().catch(e2=>{logMCPDebug(name,`Error during close: ${errorMessage2(e2)}`)}))},"closeTransportAndRejectPending"),isTerminalConnectionError=__name(msg=>msg.includes("ECONNRESET")||msg.includes("ETIMEDOUT")||msg.includes("EPIPE")||msg.includes("EHOSTUNREACH")||msg.includes("ECONNREFUSED")||msg.includes("Body Timeout Error")||msg.includes("terminated")||msg.includes("SSE stream disconnected")||msg.includes("Failed to reconnect SSE stream"),"isTerminalConnectionError");client2.onerror=error40=>{let uptime=Date.now()-connectionStartTime;hasErrorOccurred=!0;let transportType=serverRef.type||"stdio";if(logMCPDebug(name,`${transportType.toUpperCase()} connection dropped after ${Math.floor(uptime/1e3)}s uptime`),error40.message&&(error40.message.includes("ECONNRESET")?logMCPDebug(name,"Connection reset - server may have crashed or restarted"):error40.message.includes("ETIMEDOUT")?logMCPDebug(name,"Connection timeout - network issue or server unresponsive"):error40.message.includes("ECONNREFUSED")?logMCPDebug(name,"Connection refused - server may be down"):error40.message.includes("EPIPE")?logMCPDebug(name,"Broken pipe - server closed connection unexpectedly"):error40.message.includes("EHOSTUNREACH")?logMCPDebug(name,"Host unreachable - network connectivity issue"):error40.message.includes("ESRCH")?logMCPDebug(name,"Process not found - stdio server process terminated"):error40.message.includes("spawn")?logMCPDebug(name,"Failed to spawn process - check command and permissions"):logMCPDebug(name,`Connection error: ${error40.message}`)),(transportType==="http"||transportType==="claudeai-proxy")&&isMcpSessionExpiredError(error40)){logMCPDebug(name,"MCP session expired (server returned 404 with session-not-found), triggering reconnection"),closeTransportAndRejectPending("session expired"),originalOnerror&&originalOnerror(error40);return}if(transportType==="sse"||transportType==="http"||transportType==="claudeai-proxy"){if(error40.message.includes("Maximum reconnection attempts")){closeTransportAndRejectPending("SSE reconnection exhausted"),originalOnerror&&originalOnerror(error40);return}isTerminalConnectionError(error40.message)?(consecutiveConnectionErrors++,logMCPDebug(name,`Terminal connection error ${consecutiveConnectionErrors}/${MAX_ERRORS_BEFORE_RECONNECT}`),consecutiveConnectionErrors>=MAX_ERRORS_BEFORE_RECONNECT&&(consecutiveConnectionErrors=0,closeTransportAndRejectPending("max consecutive terminal errors"))):consecutiveConnectionErrors=0}originalOnerror&&originalOnerror(error40)},client2.onclose=()=>{let uptime=Date.now()-connectionStartTime,transportType=serverRef.type??"unknown";logMCPDebug(name,`${transportType.toUpperCase()} connection closed after ${Math.floor(uptime/1e3)}s (${hasErrorOccurred?"with errors":"cleanly"})`);let key3=getServerCacheKey(name,serverRef);clearMcpFetchCaches(name,{tools:fetchToolsForClient,resources:fetchResourcesForClient,resourceTemplates:fetchResourceTemplatesForClient,commands:fetchCommandsForClient,skills:null}),connectToServer.cache.delete(key3),logMCPDebug(name,"Cleared connection cache for reconnection"),originalOnclose&&originalOnclose()};let cleanup=__name(async()=>{if(inProcessServer){try{await inProcessServer.close?.()}catch(error40){logMCPDebug(name,`Error closing in-process server: ${error40}`)}try{await client2.close()}catch(error40){logMCPDebug(name,`Error closing client: ${error40}`)}return}if(stderrHandler&&(serverRef.type==="stdio"||!serverRef.type)&&transport.stderr?.off("data",stderrHandler),serverRef.type==="stdio")try{let childPid=transport.pid;if(childPid){logMCPDebug(name,"Sending SIGINT to MCP server process");try{process.kill(childPid,"SIGINT")}catch(error40){logMCPDebug(name,`Error sending SIGINT: ${error40}`);return}await new Promise(async resolve67=>{let resolved=!1,checkInterval=setInterval(()=>{try{process.kill(childPid,0)}catch{resolved||(resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),logMCPDebug(name,"MCP server process exited cleanly"),resolve67())}},50),failsafeTimeout=setTimeout(()=>{resolved||(resolved=!0,clearInterval(checkInterval),logMCPDebug(name,"Cleanup timeout reached, stopping process monitoring"),resolve67())},600);try{if(await sleep2(100),!resolved){try{process.kill(childPid,0),logMCPDebug(name,"SIGINT failed, sending SIGTERM to MCP server process");try{process.kill(childPid,"SIGTERM")}catch(termError){logMCPDebug(name,`Error sending SIGTERM: ${termError}`),resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67();return}}catch{resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67();return}if(await sleep2(400),!resolved)try{process.kill(childPid,0),logMCPDebug(name,"SIGTERM failed, sending SIGKILL to MCP server process");try{process.kill(childPid,"SIGKILL")}catch(killError){logMCPDebug(name,`Error sending SIGKILL: ${killError}`)}}catch{resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67()}}resolved||(resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67())}catch{resolved||(resolved=!0,clearInterval(checkInterval),clearTimeout(failsafeTimeout),resolve67())}})}}catch(processError){logMCPDebug(name,`Error terminating process: ${processError}`)}try{await client2.close()}catch(error40){logMCPDebug(name,`Error closing client: ${error40}`)}},"cleanup"),cleanupUnregister=registerCleanup(cleanup),wrappedCleanup=__name(async()=>{cleanupUnregister?.(),await cleanup()},"wrappedCleanup"),connectionDurationMs=Date.now()-connectStartTime;return logEvent("tengu_mcp_server_connection_succeeded",{connectionDurationMs,transportType:serverRef.type??"stdio",totalServers:serverStats?.totalServers,stdioCount:serverStats?.stdioCount,sseCount:serverStats?.sseCount,httpCount:serverStats?.httpCount,sseIdeCount:serverStats?.sseIdeCount,wsIdeCount:serverStats?.wsIdeCount,...mcpBaseUrlAnalytics(serverRef)}),{name,client:client2,type:"connected",capabilities:capabilities??{},serverInfo:serverVersion,instructions,config:serverRef,cleanup:wrappedCleanup}}catch(error40){let connectionDurationMs=Date.now()-connectStartTime;return logEvent("tengu_mcp_server_connection_failed",{connectionDurationMs,totalServers:serverStats?.totalServers||1,stdioCount:serverStats?.stdioCount||(serverRef.type==="stdio"?1:0),sseCount:serverStats?.sseCount||(serverRef.type==="sse"?1:0),httpCount:serverStats?.httpCount||(serverRef.type==="http"?1:0),sseIdeCount:serverStats?.sseIdeCount||(serverRef.type==="sse-ide"?1:0),wsIdeCount:serverStats?.wsIdeCount||(serverRef.type==="ws-ide"?1:0),transportType:serverRef.type??"stdio",...mcpBaseUrlAnalytics(serverRef)}),logMCPDebug(name,`Connection failed after ${connectionDurationMs}ms: ${errorMessage2(error40)}`),logMCPError(name,`Connection failed: ${errorMessage2(error40)}`),inProcessServer&&inProcessServer.close?.().catch(()=>{}),{name,type:"failed",config:serverRef,error:errorMessage2(error40)}}},getServerCacheKey);__name(clearServerCache,"clearServerCache");__name(ensureConnectedClient,"ensureConnectedClient");fetchToolsForClient=createFetchToolsForClient({ensureConnectedClient,callMCPToolWithUrlElicitationRetry}),fetchCommandsForClient=createFetchCommandsForClient({ensureConnectedClient,transformResultContent,zipObject:zipObject_default});__name(callIdeRpc,"callIdeRpc");__name(reconnectMcpServerImpl,"reconnectMcpServerImpl");__name(getMcpToolsCommandsAndResources,"getMcpToolsCommandsAndResources");prefetchAllMcpResources=createPrefetchAllMcpResources(getMcpToolsCommandsAndResources);__name(callMCPToolWithUrlElicitationRetry,"callMCPToolWithUrlElicitationRetry");__name(callMCPTool2,"callMCPTool");__name(setupSdkMcpClients,"setupSdkMcpClients")}});import{createHash as createHash38}from"crypto";function filterSwarmFieldsFromSchema(toolName4,schema){let fieldsToRemove=SWARM_FIELDS_BY_TOOL[toolName4];if(!fieldsToRemove||fieldsToRemove.length===0)return schema;let filtered={...schema},props=filtered.properties;if(props&&typeof props=="object"){let filteredProps={...props};for(let field2 of fieldsToRemove)delete filteredProps[field2];filtered.properties=filteredProps}return filtered}async function toolToAPISchema(tool,options){let cacheKey="inputJSONSchema"in tool&&tool.inputJSONSchema?`${tool.name}:${jsonStringify(tool.inputJSONSchema)}`:tool.name,cache5=getToolSchemaCache(),strictToolsEnabled=checkStatsigFeatureGate_CACHED_MAY_BE_STALE("tengu_tool_pear"),base=cache5.get(cacheKey);if(!base){let schemaDrop=tool.isMcp?mcpSchemaDropFor(tool.name):void 0,input_schema=normalizeToolInputJsonSchema(schemaDrop?emptyMcpInputSchema():"inputJSONSchema"in tool&&tool.inputJSONSchema?tool.inputJSONSchema:zodToJsonSchema2(tool.inputSchema));isAgentSwarmsEnabled()||(input_schema=filterSwarmFieldsFromSchema(tool.name,input_schema)),base={name:tool.name,description:await tool.prompt({getToolPermissionContext:options.getToolPermissionContext,tools:options.tools,agents:options.agents,allowedAgentTypes:options.allowedAgentTypes}),input_schema},cache5.set(cacheKey,base)}let useStrict=strictToolsEnabled&&tool.strict===!0&&options.model!==void 0&&modelSupportsStructuredOutputs(options.model),useEagerInputStreaming=getAPIProvider()==="firstParty"&&isFirstPartyAnthropicBaseUrl()&&(getFeatureValue_CACHED_MAY_BE_STALE("tengu_fgts",!1)||isEnvTruthy2(process.env.CLAUDE_CODE_ENABLE_FINE_GRAINED_TOOL_STREAMING)),schema={name:base.name,description:base.description,input_schema:base.input_schema,...useStrict&&{strict:!0},...useEagerInputStreaming&&{eager_input_streaming:!0}};if(options.deferLoading&&(schema.defer_loading=!0),options.cacheControl&&(schema.cache_control=options.cacheControl),isEnvTruthy2(process.env.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS)){let allowed=new Set(["name","description","input_schema","cache_control"]),stripped=Object.keys(schema).filter(k2=>!allowed.has(k2));if(stripped.length>0)return logStripOnce(stripped),{name:schema.name,description:schema.description,input_schema:schema.input_schema,...schema.cache_control&&{cache_control:schema.cache_control}}}return schema}function logStripOnce(stripped){loggedStrip||(loggedStrip=!0,logForDebugging(`[betas] Stripped from tool schemas: [${stripped.join(", ")}] (CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1)`))}function logAPIPrefix(systemPrompt){let[firstSyspromptBlock]=splitSysPromptPrefix(systemPrompt),firstSystemPrompt=firstSyspromptBlock?.text;logEvent("tengu_sysprompt_block",{snippet:firstSystemPrompt?.slice(0,20),length:firstSystemPrompt?.length??0,hash:firstSystemPrompt?createHash38("sha256").update(firstSystemPrompt).digest("hex"):""})}function splitSysPromptPrefix(systemPrompt,options){let useGlobalCacheFeature=shouldUseGlobalCacheScope();if(useGlobalCacheFeature&&options?.skipGlobalCacheForSystemPrompt){logEvent("tengu_sysprompt_using_tool_based_cache",{promptBlockCount:systemPrompt.length});let systemPromptPrefix2,rest3=[];for(let prompt of systemPrompt)prompt&&prompt!==SYSTEM_PROMPT_DYNAMIC_BOUNDARY&&(CLI_SYSPROMPT_PREFIXES.has(prompt)?systemPromptPrefix2=prompt:rest3.push(prompt));let result3=[];systemPromptPrefix2&&result3.push({text:systemPromptPrefix2,cacheScope:"org"});let restJoined2=rest3.join(`
5979
5979
 
5980
5980
  `);return restJoined2&&result3.push({text:restJoined2,cacheScope:"org"}),result3}if(useGlobalCacheFeature){let boundaryIndex2=systemPrompt.findIndex(s2=>s2===SYSTEM_PROMPT_DYNAMIC_BOUNDARY);if(boundaryIndex2!==-1){let systemPromptPrefix2,staticBlocks=[],dynamicBlocks=[];for(let i3=0;i3<systemPrompt.length;i3++){let block2=systemPrompt[i3];!block2||block2===SYSTEM_PROMPT_DYNAMIC_BOUNDARY||(CLI_SYSPROMPT_PREFIXES.has(block2)?systemPromptPrefix2=block2:i3<boundaryIndex2?staticBlocks.push(block2):dynamicBlocks.push(block2))}let result3=[];systemPromptPrefix2&&result3.push({text:systemPromptPrefix2,cacheScope:null});let staticJoined=staticBlocks.join(`
5981
5981
 
@@ -6622,13 +6622,13 @@ Example: /workflow run ${def.name} {"target":"origin/main...HEAD"}`);!args.targe
6622
6622
  `+usage())}async function handleWorkflowsCommand(rawArgs,options={}){let cwd6=options.cwd||process.cwd(),t7=String(rawArgs||"").trim().toLowerCase();if(t7==="help"||t7==="-h"||t7==="--help")return text2(usage());let index=await readWorkflowIndex(cwd6),runs=[];for(let e2 of index.runs){if(t7&&e2.status!==t7&&e2.displayName!==t7&&e2.definitionName!==t7)continue;let run3=await loadWorkflowRun(cwd6,e2.runId);run3&&runs.push(run3)}if(runs.length===0&&index.runs.length>0&&t7)return text2(`No runs match "${rawArgs}".
6623
6623
 
6624
6624
  `+formatRunDashboard((await Promise.all(index.runs.map(e2=>loadWorkflowRun(cwd6,e2.runId)))).filter(r2=>!!r2)));if(runs.length===0){let all4=(await Promise.all(index.runs.map(e2=>loadWorkflowRun(cwd6,e2.runId)))).filter(r2=>!!r2);return text2(formatRunDashboard(all4))}return text2(formatRunDashboard(runs))}var init_runtime6=__esm({"src/services/workflow/runtime.ts"(){init_catalog();init_engine();init_suppress();__name(text2,"text");__name(usage,"usage");__name(splitArgs2,"splitArgs");__name(parseRunInvocation,"parseRunInvocation");__name(handleWorkflowCommand,"handleWorkflowCommand");__name(handleWorkflowsCommand,"handleWorkflowsCommand")}});var workflow_exports={};__export(workflow_exports,{call:()=>call10});var call10,init_workflow=__esm({"src/commands/workflow/workflow.ts"(){init_cwd2();init_runtime6();call10=__name(async args=>await handleWorkflowCommand(args,{cwd:getCwd()}),"call")}});var workflow,workflow_default,init_workflow2=__esm({"src/commands/workflow/index.ts"(){workflow={type:"local",name:"workflow",aliases:["wf"],description:"Run multi-agent workflows (phased parallel fan-out + budget + dashboard)",argumentHint:"[list|run|status|pause|resume|stop|complete|report|help] \u2026",supportsNonInteractive:!0,load:__name(()=>Promise.resolve().then(()=>(init_workflow(),workflow_exports)),"load")},workflow_default=workflow}});var workflows_exports={};__export(workflows_exports,{call:()=>call11});var call11,init_workflows=__esm({"src/commands/workflows/workflows.ts"(){init_cwd2();init_runtime6();call11=__name(async args=>await handleWorkflowsCommand(args,{cwd:getCwd()}),"call")}});var workflows_exports2={};__export(workflows_exports2,{default:()=>workflows_default});var workflows,workflows_default,init_workflows2=__esm({"src/commands/workflows/index.ts"(){workflows={type:"local",name:"workflows",aliases:["wfs"],description:"Live workflow run dashboard (active and retained runs, not definition catalog)",argumentHint:"[status-filter|help]",supportsNonInteractive:!0,load:__name(()=>Promise.resolve().then(()=>(init_workflows(),workflows_exports)),"load")},workflows_default=workflows}});function resolveFeedbackCommandNameFromFlags(flags){return flags.useBedrock||flags.useVertex||flags.useFoundry||flags.disableFeedbackCommand||flags.disableBugCommand||flags.essentialTrafficOnly||flags.userType==="ant"||!flags.allowProductFeedback?null:"/feedback"}function formatIncorrectDecisionPrompt(commandName){return commandName?`${commandName} if incorrect`:"report it in GitHub issues if incorrect"}var FEEDBACK_GITHUB_ISSUES_URL,init_feedbackChannelsCore=__esm({"src/utils/feedbackChannelsCore.ts"(){FEEDBACK_GITHUB_ISSUES_URL="https://github.com/mycode699/clavue-code/issues/new/choose";__name(resolveFeedbackCommandNameFromFlags,"resolveFeedbackCommandNameFromFlags");__name(formatIncorrectDecisionPrompt,"formatIncorrectDecisionPrompt")}});function getFeedbackCommandName(){return resolveFeedbackCommandNameFromFlags({useBedrock:isEnvTruthy2(process.env.CLAUDE_CODE_USE_BEDROCK),useVertex:isEnvTruthy2(process.env.CLAUDE_CODE_USE_VERTEX),useFoundry:isEnvTruthy2(process.env.CLAUDE_CODE_USE_FOUNDRY),disableFeedbackCommand:isEnvTruthy2(process.env.DISABLE_FEEDBACK_COMMAND),disableBugCommand:isEnvTruthy2(process.env.DISABLE_BUG_COMMAND),essentialTrafficOnly:isEssentialTrafficOnly(),userType:process.env.USER_TYPE,allowProductFeedback:isPolicyAllowedForCommandFiltering("allow_product_feedback")})}function isFeedbackCommandAvailable(){return getFeedbackCommandName()!==null}function getIncorrectDecisionPrompt(){return formatIncorrectDecisionPrompt(getFeedbackCommandName())}var init_feedbackChannels=__esm({"src/utils/feedbackChannels.ts"(){init_policyLimits();init_envUtils();init_feedbackChannelsCore();init_privacyLevel();init_feedbackChannelsCore();__name(getFeedbackCommandName,"getFeedbackCommandName");__name(isFeedbackCommandAvailable,"isFeedbackCommandAvailable");__name(getIncorrectDecisionPrompt,"getIncorrectDecisionPrompt")}});import{mkdir as mkdir50,writeFile as writeFile53}from"node:fs/promises";import{homedir as homedir33}from"node:os";import{join as join153}from"node:path";function getFeedbackReportDir(){return join153(process.env.CLAVUE_CONFIG_DIR??join153(homedir33(),".clavue"),"feedback")}async function submitFeedbackReport(report,options={}){if(options.signal?.aborted)return{success:!1};let dir=options.dir??getFeedbackReportDir(),savedPath=join153(dir,`feedback-${new Date().toISOString().replace(/[:.]/g,"-")}.json`);try{return await mkdir50(dir,{recursive:!0}),await writeFile53(savedPath,`${JSON.stringify(report,null,2)}
6625
- `,"utf8"),{success:!0,savedPath}}catch{return{success:!1}}}var FEEDBACK_ISSUE_DRAFT_BASE_URL,init_feedbackLocalSubmit=__esm({"src/utils/feedbackLocalSubmit.ts"(){init_feedbackChannelsCore();FEEDBACK_ISSUE_DRAFT_BASE_URL=`${FEEDBACK_GITHUB_ISSUES_URL.replace(/\/new\/choose$/,"")}/new`;__name(getFeedbackReportDir,"getFeedbackReportDir");__name(submitFeedbackReport,"submitFeedbackReport")}});var QuerySource,init_querySource=__esm({"src/constants/querySource.ts"(){QuerySource={CLI:"cli",SDK:"sdk",UI:"ui",Agent:"agent",Background:"background",Unknown:"unknown"}}});import{readFile as readFile55,stat as stat43}from"fs/promises";function redactSensitiveInfo(text3){let redacted=text3;return redacted=redacted.replace(/"(sk-ant[^\s"']{24,})"/g,'"[REDACTED_API_KEY]"'),redacted=redacted.replace(/(?<![A-Za-z0-9"'])(sk-ant-?[A-Za-z0-9_-]{10,})(?![A-Za-z0-9"'])/g,"[REDACTED_API_KEY]"),redacted=redacted.replace(/AWS key: "(AWS[A-Z0-9]{20,})"/g,'AWS key: "[REDACTED_AWS_KEY]"'),redacted=redacted.replace(/(AKIA[A-Z0-9]{16})/g,"[REDACTED_AWS_KEY]"),redacted=redacted.replace(/(?<![A-Za-z0-9])(AIza[A-Za-z0-9_-]{35})(?![A-Za-z0-9])/g,"[REDACTED_GCP_KEY]"),redacted=redacted.replace(/(?<![A-Za-z0-9])([a-z0-9-]+@[a-z0-9-]+\.iam\.gserviceaccount\.com)(?![A-Za-z0-9])/g,"[REDACTED_GCP_SERVICE_ACCOUNT]"),redacted=redacted.replace(/(["']?x-api-key["']?\s*[:=]\s*["']?)[^"',\s)}\]]+/gi,"$1[REDACTED_API_KEY]"),redacted=redacted.replace(/(["']?authorization["']?\s*[:=]\s*["']?(bearer\s+)?)[^"',\s)}\]]+/gi,"$1[REDACTED_TOKEN]"),redacted=redacted.replace(/(AWS[_-][A-Za-z0-9_]+\s*[=:]\s*)["']?[^"',\s)}\]]+["']?/gi,"$1[REDACTED_AWS_VALUE]"),redacted=redacted.replace(/(GOOGLE[_-][A-Za-z0-9_]+\s*[=:]\s*)["']?[^"',\s)}\]]+["']?/gi,"$1[REDACTED_GCP_VALUE]"),redacted=redacted.replace(/((API[-_]?KEY|TOKEN|SECRET|PASSWORD)\s*[=:]\s*)["']?[^"',\s)}\]]+["']?/gi,"$1[REDACTED]"),redacted}function getSanitizedErrorLogs(){return getInMemoryErrors().map(errorInfo=>{let errorCopy={...errorInfo};return errorCopy&&typeof errorCopy.error=="string"&&(errorCopy.error=redactSensitiveInfo(errorCopy.error)),errorCopy})}async function loadRawTranscriptJsonl(){try{let transcriptPath=getTranscriptPath(),{size:size2}=await stat43(transcriptPath);return size2>MAX_TRANSCRIPT_READ_BYTES2?(logForDebugging(`Skipping raw transcript read: file too large (${size2} bytes)`,{level:"warn"}),null):await readFile55(transcriptPath,"utf-8")}catch{return null}}function Feedback({abortSignal,messages,initialDescription,onDone,backgroundTasks={}}){let[step2,setStep]=(0,import_react64.useState)("userInput"),[cursorOffset,setCursorOffset]=(0,import_react64.useState)(0),[description,setDescription]=(0,import_react64.useState)(initialDescription??""),[savedPath,setSavedPath]=(0,import_react64.useState)(null),[error40,setError]=(0,import_react64.useState)(null),[envInfo,setEnvInfo]=(0,import_react64.useState)({isGit:!1,gitState:null}),[title,setTitle]=(0,import_react64.useState)(null),textInputColumns=useTerminalSize().columns-4;(0,import_react64.useEffect)(()=>{async function loadEnvInfo(){let isGit=await getIsGit(),gitState=null;isGit&&(gitState=await getGitState()),setEnvInfo({isGit,gitState})}__name(loadEnvInfo,"loadEnvInfo"),loadEnvInfo()},[]);let submitReport=(0,import_react64.useCallback)(async()=>{setStep("submitting"),setError(null),setSavedPath(null);let sanitizedErrors=getSanitizedErrorLogs(),lastAssistantMessageId=getLastAssistantMessage(messages)?.requestId??null,[diskTranscripts,rawTranscriptJsonl,fieldEvidenceDigest]=await Promise.all([loadAllSubagentTranscriptsFromDisk(),loadRawTranscriptJsonl(),loadFieldEvidenceDigest()]),teammateTranscripts=extractTeammateTranscriptsFromTasks(backgroundTasks),subagentTranscripts={...diskTranscripts,...teammateTranscripts},reportData={latestAssistantMessageId:lastAssistantMessageId,message_count:messages.length,datetime:new Date().toISOString(),description,platform:env4.platform,gitRepo:envInfo.isGit,terminal:env4.terminal,version:"13.9.1",transcript:normalizeMessagesForAPI(messages),errors:sanitizedErrors,lastApiRequest:getLastAPIRequest(),...Object.keys(subagentTranscripts).length>0&&{subagentTranscripts},...rawTranscriptJsonl&&{rawTranscriptJsonl},...fieldEvidenceDigest&&{fieldEvidenceDigest}},[result2,t7]=await Promise.all([submitFeedback(reportData,abortSignal),generateTitle(description,abortSignal)]);setTitle(t7),result2.success?(result2.savedPath&&(setSavedPath(result2.savedPath),logForDebugging(`[feedback] report saved locally: ${result2.savedPath}`)),setStep("done")):(setError("\u65E0\u6CD5\u5728\u672C\u5730\u4FDD\u5B58\u62A5\u544A\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5 / Could not save the report locally."),setStep("userInput"))},[description,envInfo.isGit,messages]),handleCancel=(0,import_react64.useCallback)(()=>{if(step2==="done"){error40?onDone("Error submitting feedback / bug report",{display:"system"}):onDone("Feedback / bug report submitted",{display:"system"});return}onDone("Feedback / bug report cancelled",{display:"system"})},[step2,error40,onDone]);useKeybinding("confirm:no",handleCancel,{context:"Settings",isActive:step2==="userInput"}),useInput((input2,key3)=>{if(step2==="done"){if(key3.return&&title){let issueUrl=createGitHubIssueUrl(title,description,getSanitizedErrorLogs());openBrowser(issueUrl)}error40?onDone("Error submitting feedback / bug report",{display:"system"}):onDone("Feedback / bug report submitted",{display:"system"});return}if(error40&&step2!=="userInput"){onDone(resolveUiLocale()==="zh-CN"?"\u63D0\u4EA4\u53CD\u9988 / Bug \u62A5\u544A\u65F6\u51FA\u9519":"Error submitting feedback / bug report",{display:"system"});return}step2==="consent"&&(key3.return||input2===" ")&&submitReport()});let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime81.jsxs)(Dialog,{title:isZh7?"\u63D0\u4EA4\u53CD\u9988 / Bug \u62A5\u544A":"Submit Feedback / Bug Report",onCancel:handleCancel,isCancelActive:step2!=="userInput",inputGuide:exitState=>exitState.pending?(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?`\u518D\u6B21\u6309 ${exitState.keyName} \u9000\u51FA`:`Press ${exitState.keyName} again to exit`}):step2==="userInput"?(0,import_jsx_runtime81.jsxs)(Byline,{children:[(0,import_jsx_runtime81.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"continue"}),(0,import_jsx_runtime81.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]}):step2==="consent"?(0,import_jsx_runtime81.jsxs)(Byline,{children:[(0,import_jsx_runtime81.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"submit"}),(0,import_jsx_runtime81.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]}):null,children:[step2==="userInput"&&(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u8BF7\u63CF\u8FF0\u4F60\u9047\u5230\u7684\u95EE\u9898:":"Describe the issue below:"}),(0,import_jsx_runtime81.jsx)(TextInput,{value:description,onChange:value=>{setDescription(value),error40&&setError(null)},columns:textInputColumns,onSubmit:()=>setStep("consent"),onExitMessage:()=>onDone(isZh7?"\u5DF2\u53D6\u6D88\u53CD\u9988":"Feedback cancelled",{display:"system"}),disableEscapeDoublePress:!0,disableCtrlCDoublePress:!0,cursorOffset,onChangeCursorOffset:setCursorOffset,showCursor:!0}),error40&&(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime81.jsx)(ThemedText,{color:"error",children:error40}),(0,import_jsx_runtime81.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u4FEE\u6539\u5185\u5BB9\u540E\u6309\u56DE\u8F66\u91CD\u8BD5,\u6216\u6309 Esc \u53D6\u6D88":"Edit and press Enter to retry, or Esc to cancel"})]})]}),step2==="consent"&&(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u672C\u6B21\u62A5\u544A\u5C06\u5305\u542B:":"This report will include:"}),(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{marginLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime81.jsxs)(ThemedText,{children:[isZh7?"- \u4F60\u7684\u53CD\u9988 / Bug \u63CF\u8FF0: ":"- Your feedback / bug description: ",(0,import_jsx_runtime81.jsx)(ThemedText,{dimColor:!0,children:description})]}),(0,import_jsx_runtime81.jsxs)(ThemedText,{children:[isZh7?"- \u73AF\u5883\u4FE1\u606F: ":"- Environment info: ",(0,import_jsx_runtime81.jsxs)(ThemedText,{dimColor:!0,children:[env4.platform,", ",env4.terminal,", v","13.9.1"]})]}),envInfo.gitState&&(0,import_jsx_runtime81.jsxs)(ThemedText,{children:[isZh7?"- Git \u4ED3\u5E93\u5143\u4FE1\u606F: ":"- Git repo metadata: ",(0,import_jsx_runtime81.jsxs)(ThemedText,{dimColor:!0,children:[envInfo.gitState.branchName,envInfo.gitState.commitHash?`, ${envInfo.gitState.commitHash.slice(0,7)}`:"",envInfo.gitState.remoteUrl?` @ ${envInfo.gitState.remoteUrl}`:"",!envInfo.gitState.isHeadOnRemote&&(isZh7?",\u672A\u540C\u6B65":", not synced"),!envInfo.gitState.isClean&&(isZh7?",\u6709\u672A\u63D0\u4EA4\u53D8\u66F4":", has local changes")]})]}),(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"- \u5F53\u524D\u4F1A\u8BDD\u8BB0\u5F55":"- Current session transcript"}),(0,import_jsx_runtime81.jsxs)(ThemedText,{children:[isZh7?"- \u7ED3\u6784\u5316\u73B0\u573A\u8BC1\u636E\u6458\u8981(\u5982\u6709): ":"- Structured field evidence digest (if present): ",(0,import_jsx_runtime81.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u8FDE\u63A5\u3001\u8FDC\u7A0B\u3001SSH\u3001\u79FB\u52A8\u7AEF\u76F8\u5173\u75C7\u72B6":"connection, remote, SSH, and mobile-related symptoms"})]})]}),(0,import_jsx_runtime81.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime81.jsx)(ThemedText,{wrap:"wrap",dimColor:!0,children:isZh7?"\u6211\u4EEC\u4F1A\u7528\u4F60\u7684\u53CD\u9988\u6765\u8C03\u8BD5\u76F8\u5173\u95EE\u9898,\u6216\u6539\u8FDB\u514B\u62C9\u7EF4\u7684\u529F\u80FD(\u4F8B\u5982\u964D\u4F4E\u672A\u6765\u51FA\u73B0 Bug \u7684\u98CE\u9669)\u3002":"We will use your feedback to debug related issues or to improve Clavue's functionality (eg. to reduce the risk of bugs occurring in the future)."})}),(0,import_jsx_runtime81.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?(0,import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment,{children:["\u6309 ",(0,import_jsx_runtime81.jsx)(ThemedText,{bold:!0,children:"\u56DE\u8F66"})," \u786E\u8BA4\u5E76\u63D0\u4EA4\u3002"]}):(0,import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment,{children:["Press ",(0,import_jsx_runtime81.jsx)(ThemedText,{bold:!0,children:"Enter"})," to confirm and submit."]})})})]}),step2==="submitting"&&(0,import_jsx_runtime81.jsx)(ThemedBox_default,{flexDirection:"row",gap:1,children:(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u6B63\u5728\u63D0\u4EA4\u62A5\u544A\u2026":"Submitting report\u2026"})}),step2==="done"&&(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{flexDirection:"column",children:[error40?(0,import_jsx_runtime81.jsx)(ThemedText,{color:"error",children:error40}):(0,import_jsx_runtime81.jsx)(ThemedText,{color:"success",children:isZh7?"\u611F\u8C22\u4F60\u7684\u53CD\u9988!":"Thank you for your report!"}),(0,import_jsx_runtime81.jsx)(ThemedText,{dimColor:!0,children:isZh7?`\u62A5\u544A\u5DF2\u4FDD\u5B58\u5230\u672C\u5730\uFF08\u4E0D\u4E0A\u4F20\uFF09${savedPath?`:${savedPath}`:""}`:`Saved locally (not uploaded)${savedPath?`: ${savedPath}`:""}`}),(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{marginTop:1,children:[(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u6309 ":"Press "}),(0,import_jsx_runtime81.jsx)(ThemedText,{bold:!0,children:isZh7?"\u56DE\u8F66 ":"Enter "}),(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u53EF\u6253\u5F00\u6D4F\u89C8\u5668\u8D77\u8349 GitHub Issue,\u6309\u5176\u4ED6\u4EFB\u610F\u952E\u5173\u95ED\u3002":"to open your browser and draft a GitHub issue, or any other key to close."})]})]})]})}function createGitHubIssueUrl(title,description,errors2){let sanitizedTitle=redactSensitiveInfo(title),bodyPrefix=`**Bug Description**
6625
+ `,"utf8"),{success:!0,savedPath}}catch{return{success:!1}}}var FEEDBACK_ISSUE_DRAFT_BASE_URL,init_feedbackLocalSubmit=__esm({"src/utils/feedbackLocalSubmit.ts"(){init_feedbackChannelsCore();FEEDBACK_ISSUE_DRAFT_BASE_URL=`${FEEDBACK_GITHUB_ISSUES_URL.replace(/\/new\/choose$/,"")}/new`;__name(getFeedbackReportDir,"getFeedbackReportDir");__name(submitFeedbackReport,"submitFeedbackReport")}});var QuerySource,init_querySource=__esm({"src/constants/querySource.ts"(){QuerySource={CLI:"cli",SDK:"sdk",UI:"ui",Agent:"agent",Background:"background",Unknown:"unknown"}}});import{readFile as readFile55,stat as stat43}from"fs/promises";function redactSensitiveInfo(text3){let redacted=text3;return redacted=redacted.replace(/"(sk-ant[^\s"']{24,})"/g,'"[REDACTED_API_KEY]"'),redacted=redacted.replace(/(?<![A-Za-z0-9"'])(sk-ant-?[A-Za-z0-9_-]{10,})(?![A-Za-z0-9"'])/g,"[REDACTED_API_KEY]"),redacted=redacted.replace(/AWS key: "(AWS[A-Z0-9]{20,})"/g,'AWS key: "[REDACTED_AWS_KEY]"'),redacted=redacted.replace(/(AKIA[A-Z0-9]{16})/g,"[REDACTED_AWS_KEY]"),redacted=redacted.replace(/(?<![A-Za-z0-9])(AIza[A-Za-z0-9_-]{35})(?![A-Za-z0-9])/g,"[REDACTED_GCP_KEY]"),redacted=redacted.replace(/(?<![A-Za-z0-9])([a-z0-9-]+@[a-z0-9-]+\.iam\.gserviceaccount\.com)(?![A-Za-z0-9])/g,"[REDACTED_GCP_SERVICE_ACCOUNT]"),redacted=redacted.replace(/(["']?x-api-key["']?\s*[:=]\s*["']?)[^"',\s)}\]]+/gi,"$1[REDACTED_API_KEY]"),redacted=redacted.replace(/(["']?authorization["']?\s*[:=]\s*["']?(bearer\s+)?)[^"',\s)}\]]+/gi,"$1[REDACTED_TOKEN]"),redacted=redacted.replace(/(AWS[_-][A-Za-z0-9_]+\s*[=:]\s*)["']?[^"',\s)}\]]+["']?/gi,"$1[REDACTED_AWS_VALUE]"),redacted=redacted.replace(/(GOOGLE[_-][A-Za-z0-9_]+\s*[=:]\s*)["']?[^"',\s)}\]]+["']?/gi,"$1[REDACTED_GCP_VALUE]"),redacted=redacted.replace(/((API[-_]?KEY|TOKEN|SECRET|PASSWORD)\s*[=:]\s*)["']?[^"',\s)}\]]+["']?/gi,"$1[REDACTED]"),redacted}function getSanitizedErrorLogs(){return getInMemoryErrors().map(errorInfo=>{let errorCopy={...errorInfo};return errorCopy&&typeof errorCopy.error=="string"&&(errorCopy.error=redactSensitiveInfo(errorCopy.error)),errorCopy})}async function loadRawTranscriptJsonl(){try{let transcriptPath=getTranscriptPath(),{size:size2}=await stat43(transcriptPath);return size2>MAX_TRANSCRIPT_READ_BYTES2?(logForDebugging(`Skipping raw transcript read: file too large (${size2} bytes)`,{level:"warn"}),null):await readFile55(transcriptPath,"utf-8")}catch{return null}}function Feedback({abortSignal,messages,initialDescription,onDone,backgroundTasks={}}){let[step2,setStep]=(0,import_react64.useState)("userInput"),[cursorOffset,setCursorOffset]=(0,import_react64.useState)(0),[description,setDescription]=(0,import_react64.useState)(initialDescription??""),[savedPath,setSavedPath]=(0,import_react64.useState)(null),[error40,setError]=(0,import_react64.useState)(null),[envInfo,setEnvInfo]=(0,import_react64.useState)({isGit:!1,gitState:null}),[title,setTitle]=(0,import_react64.useState)(null),textInputColumns=useTerminalSize().columns-4;(0,import_react64.useEffect)(()=>{async function loadEnvInfo(){let isGit=await getIsGit(),gitState=null;isGit&&(gitState=await getGitState()),setEnvInfo({isGit,gitState})}__name(loadEnvInfo,"loadEnvInfo"),loadEnvInfo()},[]);let submitReport=(0,import_react64.useCallback)(async()=>{setStep("submitting"),setError(null),setSavedPath(null);let sanitizedErrors=getSanitizedErrorLogs(),lastAssistantMessageId=getLastAssistantMessage(messages)?.requestId??null,[diskTranscripts,rawTranscriptJsonl,fieldEvidenceDigest]=await Promise.all([loadAllSubagentTranscriptsFromDisk(),loadRawTranscriptJsonl(),loadFieldEvidenceDigest()]),teammateTranscripts=extractTeammateTranscriptsFromTasks(backgroundTasks),subagentTranscripts={...diskTranscripts,...teammateTranscripts},reportData={latestAssistantMessageId:lastAssistantMessageId,message_count:messages.length,datetime:new Date().toISOString(),description,platform:env4.platform,gitRepo:envInfo.isGit,terminal:env4.terminal,version:"13.9.2",transcript:normalizeMessagesForAPI(messages),errors:sanitizedErrors,lastApiRequest:getLastAPIRequest(),...Object.keys(subagentTranscripts).length>0&&{subagentTranscripts},...rawTranscriptJsonl&&{rawTranscriptJsonl},...fieldEvidenceDigest&&{fieldEvidenceDigest}},[result2,t7]=await Promise.all([submitFeedback(reportData,abortSignal),generateTitle(description,abortSignal)]);setTitle(t7),result2.success?(result2.savedPath&&(setSavedPath(result2.savedPath),logForDebugging(`[feedback] report saved locally: ${result2.savedPath}`)),setStep("done")):(setError("\u65E0\u6CD5\u5728\u672C\u5730\u4FDD\u5B58\u62A5\u544A\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5 / Could not save the report locally."),setStep("userInput"))},[description,envInfo.isGit,messages]),handleCancel=(0,import_react64.useCallback)(()=>{if(step2==="done"){error40?onDone("Error submitting feedback / bug report",{display:"system"}):onDone("Feedback / bug report submitted",{display:"system"});return}onDone("Feedback / bug report cancelled",{display:"system"})},[step2,error40,onDone]);useKeybinding("confirm:no",handleCancel,{context:"Settings",isActive:step2==="userInput"}),useInput((input2,key3)=>{if(step2==="done"){if(key3.return&&title){let issueUrl=createGitHubIssueUrl(title,description,getSanitizedErrorLogs());openBrowser(issueUrl)}error40?onDone("Error submitting feedback / bug report",{display:"system"}):onDone("Feedback / bug report submitted",{display:"system"});return}if(error40&&step2!=="userInput"){onDone(resolveUiLocale()==="zh-CN"?"\u63D0\u4EA4\u53CD\u9988 / Bug \u62A5\u544A\u65F6\u51FA\u9519":"Error submitting feedback / bug report",{display:"system"});return}step2==="consent"&&(key3.return||input2===" ")&&submitReport()});let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime81.jsxs)(Dialog,{title:isZh7?"\u63D0\u4EA4\u53CD\u9988 / Bug \u62A5\u544A":"Submit Feedback / Bug Report",onCancel:handleCancel,isCancelActive:step2!=="userInput",inputGuide:exitState=>exitState.pending?(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?`\u518D\u6B21\u6309 ${exitState.keyName} \u9000\u51FA`:`Press ${exitState.keyName} again to exit`}):step2==="userInput"?(0,import_jsx_runtime81.jsxs)(Byline,{children:[(0,import_jsx_runtime81.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"continue"}),(0,import_jsx_runtime81.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]}):step2==="consent"?(0,import_jsx_runtime81.jsxs)(Byline,{children:[(0,import_jsx_runtime81.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"submit"}),(0,import_jsx_runtime81.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]}):null,children:[step2==="userInput"&&(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u8BF7\u63CF\u8FF0\u4F60\u9047\u5230\u7684\u95EE\u9898:":"Describe the issue below:"}),(0,import_jsx_runtime81.jsx)(TextInput,{value:description,onChange:value=>{setDescription(value),error40&&setError(null)},columns:textInputColumns,onSubmit:()=>setStep("consent"),onExitMessage:()=>onDone(isZh7?"\u5DF2\u53D6\u6D88\u53CD\u9988":"Feedback cancelled",{display:"system"}),disableEscapeDoublePress:!0,disableCtrlCDoublePress:!0,cursorOffset,onChangeCursorOffset:setCursorOffset,showCursor:!0}),error40&&(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime81.jsx)(ThemedText,{color:"error",children:error40}),(0,import_jsx_runtime81.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u4FEE\u6539\u5185\u5BB9\u540E\u6309\u56DE\u8F66\u91CD\u8BD5,\u6216\u6309 Esc \u53D6\u6D88":"Edit and press Enter to retry, or Esc to cancel"})]})]}),step2==="consent"&&(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u672C\u6B21\u62A5\u544A\u5C06\u5305\u542B:":"This report will include:"}),(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{marginLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime81.jsxs)(ThemedText,{children:[isZh7?"- \u4F60\u7684\u53CD\u9988 / Bug \u63CF\u8FF0: ":"- Your feedback / bug description: ",(0,import_jsx_runtime81.jsx)(ThemedText,{dimColor:!0,children:description})]}),(0,import_jsx_runtime81.jsxs)(ThemedText,{children:[isZh7?"- \u73AF\u5883\u4FE1\u606F: ":"- Environment info: ",(0,import_jsx_runtime81.jsxs)(ThemedText,{dimColor:!0,children:[env4.platform,", ",env4.terminal,", v","13.9.2"]})]}),envInfo.gitState&&(0,import_jsx_runtime81.jsxs)(ThemedText,{children:[isZh7?"- Git \u4ED3\u5E93\u5143\u4FE1\u606F: ":"- Git repo metadata: ",(0,import_jsx_runtime81.jsxs)(ThemedText,{dimColor:!0,children:[envInfo.gitState.branchName,envInfo.gitState.commitHash?`, ${envInfo.gitState.commitHash.slice(0,7)}`:"",envInfo.gitState.remoteUrl?` @ ${envInfo.gitState.remoteUrl}`:"",!envInfo.gitState.isHeadOnRemote&&(isZh7?",\u672A\u540C\u6B65":", not synced"),!envInfo.gitState.isClean&&(isZh7?",\u6709\u672A\u63D0\u4EA4\u53D8\u66F4":", has local changes")]})]}),(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"- \u5F53\u524D\u4F1A\u8BDD\u8BB0\u5F55":"- Current session transcript"}),(0,import_jsx_runtime81.jsxs)(ThemedText,{children:[isZh7?"- \u7ED3\u6784\u5316\u73B0\u573A\u8BC1\u636E\u6458\u8981(\u5982\u6709): ":"- Structured field evidence digest (if present): ",(0,import_jsx_runtime81.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u8FDE\u63A5\u3001\u8FDC\u7A0B\u3001SSH\u3001\u79FB\u52A8\u7AEF\u76F8\u5173\u75C7\u72B6":"connection, remote, SSH, and mobile-related symptoms"})]})]}),(0,import_jsx_runtime81.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime81.jsx)(ThemedText,{wrap:"wrap",dimColor:!0,children:isZh7?"\u6211\u4EEC\u4F1A\u7528\u4F60\u7684\u53CD\u9988\u6765\u8C03\u8BD5\u76F8\u5173\u95EE\u9898,\u6216\u6539\u8FDB\u514B\u62C9\u7EF4\u7684\u529F\u80FD(\u4F8B\u5982\u964D\u4F4E\u672A\u6765\u51FA\u73B0 Bug \u7684\u98CE\u9669)\u3002":"We will use your feedback to debug related issues or to improve Clavue's functionality (eg. to reduce the risk of bugs occurring in the future)."})}),(0,import_jsx_runtime81.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?(0,import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment,{children:["\u6309 ",(0,import_jsx_runtime81.jsx)(ThemedText,{bold:!0,children:"\u56DE\u8F66"})," \u786E\u8BA4\u5E76\u63D0\u4EA4\u3002"]}):(0,import_jsx_runtime81.jsxs)(import_jsx_runtime81.Fragment,{children:["Press ",(0,import_jsx_runtime81.jsx)(ThemedText,{bold:!0,children:"Enter"})," to confirm and submit."]})})})]}),step2==="submitting"&&(0,import_jsx_runtime81.jsx)(ThemedBox_default,{flexDirection:"row",gap:1,children:(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u6B63\u5728\u63D0\u4EA4\u62A5\u544A\u2026":"Submitting report\u2026"})}),step2==="done"&&(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{flexDirection:"column",children:[error40?(0,import_jsx_runtime81.jsx)(ThemedText,{color:"error",children:error40}):(0,import_jsx_runtime81.jsx)(ThemedText,{color:"success",children:isZh7?"\u611F\u8C22\u4F60\u7684\u53CD\u9988!":"Thank you for your report!"}),(0,import_jsx_runtime81.jsx)(ThemedText,{dimColor:!0,children:isZh7?`\u62A5\u544A\u5DF2\u4FDD\u5B58\u5230\u672C\u5730\uFF08\u4E0D\u4E0A\u4F20\uFF09${savedPath?`:${savedPath}`:""}`:`Saved locally (not uploaded)${savedPath?`: ${savedPath}`:""}`}),(0,import_jsx_runtime81.jsxs)(ThemedBox_default,{marginTop:1,children:[(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u6309 ":"Press "}),(0,import_jsx_runtime81.jsx)(ThemedText,{bold:!0,children:isZh7?"\u56DE\u8F66 ":"Enter "}),(0,import_jsx_runtime81.jsx)(ThemedText,{children:isZh7?"\u53EF\u6253\u5F00\u6D4F\u89C8\u5668\u8D77\u8349 GitHub Issue,\u6309\u5176\u4ED6\u4EFB\u610F\u952E\u5173\u95ED\u3002":"to open your browser and draft a GitHub issue, or any other key to close."})]})]})]})}function createGitHubIssueUrl(title,description,errors2){let sanitizedTitle=redactSensitiveInfo(title),bodyPrefix=`**Bug Description**
6626
6626
  ${redactSensitiveInfo(description)}
6627
6627
 
6628
6628
  **Environment Info**
6629
6629
  - Platform: ${env4.platform}
6630
6630
  - Terminal: ${env4.terminal}
6631
- - Version: 13.9.1
6631
+ - Version: 13.9.2
6632
6632
 
6633
6633
  **Errors**
6634
6634
  \`\`\`json
@@ -6840,7 +6840,7 @@ Segments mode: summary structured as multi-section archive (goals \xB7 decisions
6840
6840
  `).filter(p=>p.length>0).map(p=>[style,p])))}function charWidth(ch2){return stringWidth(ch2)}function wrapText5(h3,width,theme2){let newLines=[];for(let line of h3.lines){let queue2=line.slice(),cur=[],curW=0;for(;queue2.length>0;){let[style,text3]=queue2.shift(),tw=stringWidth(text3);if(curW+tw<=width)cur.push([style,text3]),curW+=tw;else{let remaining=width-curW,bytePos=0,accW=0;for(let ch2 of text3){let cw=charWidth(ch2);if(accW+cw>remaining)break;accW+=cw,bytePos+=ch2.length}if(bytePos===0)if(curW===0)bytePos=text3.codePointAt(0)>65535?2:1;else{newLines.push(cur),queue2.unshift([style,text3]),cur=[],curW=0;continue}cur.push([style,text3.slice(0,bytePos)]),newLines.push(cur),queue2.unshift([style,text3.slice(bytePos)]),cur=[],curW=0}}newLines.push(cur)}if(h3.lines=newLines,h3.marker&&h3.marker!==" "){let bg=lineBackground(h3.marker,theme2),padStyle={foreground:theme2.foreground,background:bg};for(let line of h3.lines){let curW=line.reduce((s2,[,t7])=>s2+stringWidth(t7),0);curW<width&&line.push([padStyle," ".repeat(width-curW)])}}}function addLineNumber(h3,theme2,maxDigits,fullDim){let style={foreground:h3.marker?decorationColor(h3.marker,theme2):theme2.foreground,background:h3.marker?lineBackground(h3.marker,theme2):theme2.background},shouldDim=h3.marker===null||h3.marker===" ";for(let i3=0;i3<h3.lines.length;i3++){let prefix=i3===0?` ${String(h3.lineNumber).padStart(maxDigits)} `:" ".repeat(maxDigits+2),wrapped=shouldDim&&!fullDim?`${DIM}${prefix}${UNDIM}`:prefix;h3.lines[i3].unshift([style,wrapped])}}function addMarker(h3,theme2){if(!h3.marker)return;let style={foreground:decorationColor(h3.marker,theme2),background:lineBackground(h3.marker,theme2)};for(let line of h3.lines)line.unshift([style,h3.marker])}function dimContent(h3){for(let line of h3.lines)if(line.length>0){line[0][1]=DIM+line[0][1];let last2=line.length-1;line[last2][1]=line[last2][1]+UNDIM}}function applyBackground(h3,theme2,ranges){if(!h3.marker)return;let lineBg=lineBackground(h3.marker,theme2),wordBg=wordBackground(h3.marker,theme2),rangeIdx=0,byteOff=0;for(let li=0;li<h3.lines.length;li++){let newLine=[];for(let[style,text3]of h3.lines[li]){let textStart=byteOff,textEnd=byteOff+text3.length;for(;rangeIdx<ranges.length&&ranges[rangeIdx].end<=textStart;)rangeIdx++;if(rangeIdx>=ranges.length){newLine.push([{...style,background:lineBg},text3]),byteOff=textEnd;continue}let remaining=text3,pos=textStart;for(;remaining.length>0&&rangeIdx<ranges.length;){let r2=ranges[rangeIdx],inRange3=pos>=r2.start&&pos<r2.end,next;inRange3?next=Math.min(r2.end,textEnd):r2.start>pos&&r2.start<textEnd?next=r2.start:next=textEnd;let segLen=next-pos,seg=remaining.slice(0,segLen);newLine.push([{...style,background:inRange3?wordBg:lineBg},seg]),remaining=remaining.slice(segLen),pos=next,pos>=r2.end&&rangeIdx++}remaining.length>0&&newLine.push([{...style,background:lineBg},remaining]),byteOff=textEnd}h3.lines[li]=newLine}}function intoLines(h3,dim2,skipBg,mode2){return h3.lines.map(line=>asTerminalEscaped(line,mode2,skipBg,dim2))}function maxLineNumber(hunk){let oldEnd=Math.max(0,hunk.oldStart+hunk.oldLines-1),newEnd=Math.max(0,hunk.newStart+hunk.newLines-1);return Math.max(oldEnd,newEnd)}function parseMarker(s2){return s2==="+"||s2==="-"?s2:" "}function getSyntaxTheme(themeName){let envTheme=process.env.CLAUDE_CODE_SYNTAX_HIGHLIGHT??process.env.BAT_THEME;return{theme:defaultSyntaxThemeName(themeName),source:null}}var cachedHljs,RESET,DIM,UNDIM,DEFAULT_BG,CUBE_LEVELS,MONOKAI_SCOPES,GITHUB_SCOPES,STORAGE_KEYWORDS,ANSI_SCOPES,FILENAME_LANGS,loggedEmitterShapeError,CHANGE_THRESHOLD,ColorDiff,init_color_diff=__esm({"src/native-ts/color-diff/index.ts"(){init_libesm();init_stringWidth();init_log3();cachedHljs=null;__name(hljs,"hljs");RESET="\x1B[0m",DIM="\x1B[2m",UNDIM="\x1B[22m";__name(rgb,"rgb");__name(ansiIdx,"ansiIdx");DEFAULT_BG={r:0,g:0,b:0,a:1};__name(detectColorMode,"detectColorMode");CUBE_LEVELS=[0,95,135,175,215,255];__name(ansi256FromRgb,"ansi256FromRgb");__name(colorToEscape,"colorToEscape");__name(asTerminalEscaped,"asTerminalEscaped");__name(defaultSyntaxThemeName,"defaultSyntaxThemeName");MONOKAI_SCOPES={keyword:rgb(249,38,114),_storage:rgb(102,217,239),built_in:rgb(166,226,46),type:rgb(166,226,46),literal:rgb(190,132,255),number:rgb(190,132,255),string:rgb(230,219,116),title:rgb(166,226,46),"title.function":rgb(166,226,46),"title.class":rgb(166,226,46),"title.class.inherited":rgb(166,226,46),params:rgb(253,151,31),comment:rgb(117,113,94),meta:rgb(117,113,94),attr:rgb(166,226,46),attribute:rgb(166,226,46),variable:rgb(255,255,255),"variable.language":rgb(255,255,255),property:rgb(255,255,255),operator:rgb(249,38,114),punctuation:rgb(248,248,242),symbol:rgb(190,132,255),regexp:rgb(230,219,116),subst:rgb(248,248,242)},GITHUB_SCOPES={keyword:rgb(167,29,93),_storage:rgb(167,29,93),built_in:rgb(0,134,179),type:rgb(0,134,179),literal:rgb(0,134,179),number:rgb(0,134,179),string:rgb(24,54,145),title:rgb(121,93,163),"title.function":rgb(121,93,163),"title.class":rgb(0,0,0),"title.class.inherited":rgb(0,0,0),params:rgb(0,134,179),comment:rgb(150,152,150),meta:rgb(150,152,150),attr:rgb(0,134,179),attribute:rgb(0,134,179),variable:rgb(0,134,179),"variable.language":rgb(0,134,179),property:rgb(0,134,179),operator:rgb(167,29,93),punctuation:rgb(51,51,51),symbol:rgb(0,134,179),regexp:rgb(24,54,145),subst:rgb(51,51,51)},STORAGE_KEYWORDS=new Set(["const","let","var","function","class","type","interface","enum","namespace","module","def","fn","func","struct","trait","impl"]),ANSI_SCOPES={keyword:ansiIdx(13),_storage:ansiIdx(14),built_in:ansiIdx(14),type:ansiIdx(14),literal:ansiIdx(12),number:ansiIdx(12),string:ansiIdx(10),title:ansiIdx(11),"title.function":ansiIdx(11),"title.class":ansiIdx(11),comment:ansiIdx(8),meta:ansiIdx(8)};__name(buildTheme,"buildTheme");__name(defaultStyle,"defaultStyle");__name(lineBackground,"lineBackground");__name(wordBackground,"wordBackground");__name(decorationColor,"decorationColor");FILENAME_LANGS={Dockerfile:"dockerfile",Makefile:"makefile",Rakefile:"ruby",Gemfile:"ruby",CMakeLists:"cmake"};__name(detectLanguage,"detectLanguage");__name(scopeColor,"scopeColor");__name(flattenHljs,"flattenHljs");__name(hasRootNode,"hasRootNode");loggedEmitterShapeError=!1;__name(highlightLine,"highlightLine");CHANGE_THRESHOLD=.4;__name(tokenize5,"tokenize");__name(findAdjacentPairs,"findAdjacentPairs");__name(wordDiffStrings,"wordDiffStrings");__name(removeNewlines,"removeNewlines");__name(charWidth,"charWidth");__name(wrapText5,"wrapText");__name(addLineNumber,"addLineNumber");__name(addMarker,"addMarker");__name(dimContent,"dimContent");__name(applyBackground,"applyBackground");__name(intoLines,"intoLines");__name(maxLineNumber,"maxLineNumber");__name(parseMarker,"parseMarker");ColorDiff=class{static{__name(this,"ColorDiff")}hunk;filePath;firstLine;prefixContent;constructor(hunk,firstLine3,filePath,prefixContent){this.hunk=hunk,this.filePath=filePath,this.firstLine=firstLine3,this.prefixContent=prefixContent??null}render(themeName,width,dim2){let mode2=detectColorMode(themeName),theme2=buildTheme(themeName,mode2),hlState={lang:detectLanguage(this.filePath,this.firstLine),stack:null};this.prefixContent;let maxDigits=String(maxLineNumber(this.hunk)).length,oldLine=this.hunk.oldStart,newLine=this.hunk.newStart,effectiveWidth=Math.max(1,width-maxDigits-2-1),entries=this.hunk.lines.map(rawLine=>{let marker=parseMarker(rawLine.slice(0,1)),code=rawLine.slice(1),lineNumber;switch(marker){case"+":lineNumber=newLine++;break;case"-":lineNumber=oldLine++;break;case" ":lineNumber=newLine,oldLine++,newLine++;break}return{lineNumber,marker,code}}),ranges=entries.map(()=>[]);if(!dim2){let markers=entries.map(e2=>e2.marker);for(let[delIdx,addIdx]of findAdjacentPairs(markers)){let[delR,addR]=wordDiffStrings(entries[delIdx].code,entries[addIdx].code);ranges[delIdx]=delR,ranges[addIdx]=addR}}let out=[];for(let i3=0;i3<entries.length;i3++){let{lineNumber,marker,code}=entries[i3],tokens=marker==="-"?[[defaultStyle(theme2),code]]:highlightLine(hlState,code,theme2),h3={marker,lineNumber,lines:[tokens]};removeNewlines(h3),applyBackground(h3,theme2,ranges[i3]),wrapText5(h3,effectiveWidth,theme2),mode2==="ansi"&&marker==="-"&&dimContent(h3),addMarker(h3,theme2),addLineNumber(h3,theme2,maxDigits,dim2),out.push(...intoLines(h3,dim2,!1,mode2))}return out}};__name(getSyntaxTheme,"getSyntaxTheme")}});function getColorModuleUnavailableReason(){return isEnvDefinedFalsy(process.env.CLAUDE_CODE_SYNTAX_HIGHLIGHT)?"env":null}function expectColorDiff(){return getColorModuleUnavailableReason()===null?ColorDiff:null}function getSyntaxTheme2(themeName){return getColorModuleUnavailableReason()===null?getSyntaxTheme(themeName):null}var init_colorDiff=__esm({"src/components/StructuredDiff/colorDiff.ts"(){init_color_diff();init_envUtils();__name(getColorModuleUnavailableReason,"getColorModuleUnavailableReason");__name(expectColorDiff,"expectColorDiff");__name(getSyntaxTheme2,"getSyntaxTheme")}});function StructuredDiffFallback({patch,dim:dim2,width}){let[theme2]=useTheme(),diff=(0,import_react67.useMemo)(()=>formatDiff(patch.lines,patch.oldStart,width,dim2,theme2),[patch.lines,patch.oldStart,width,dim2,theme2]);return(0,import_jsx_runtime86.jsx)(ThemedBox_default,{flexDirection:"column",flexGrow:1,children:diff.map((node,i3)=>(0,import_jsx_runtime86.jsx)(ThemedBox_default,{children:node},i3))})}function transformLinesToObjects(lines){return lines.map(code=>code.startsWith("+")?{code:code.slice(1),i:0,type:"add",originalCode:code.slice(1)}:code.startsWith("-")?{code:code.slice(1),i:0,type:"remove",originalCode:code.slice(1)}:{code:code.slice(1),i:0,type:"nochange",originalCode:code.slice(1)})}function processAdjacentLines(lineObjects){let processedLines=[],i3=0;for(;i3<lineObjects.length;){let current=lineObjects[i3];if(!current){i3++;continue}if(current.type==="remove"){let removeLines=[current],j2=i3+1;for(;j2<lineObjects.length&&lineObjects[j2]?.type==="remove";){let line=lineObjects[j2];line&&removeLines.push(line),j2++}let addLines=[];for(;j2<lineObjects.length&&lineObjects[j2]?.type==="add";){let line=lineObjects[j2];line&&addLines.push(line),j2++}if(removeLines.length>0&&addLines.length>0){let pairCount=Math.min(removeLines.length,addLines.length);for(let k2=0;k2<pairCount;k2++){let removeLine=removeLines[k2],addLine=addLines[k2];removeLine&&addLine&&(removeLine.wordDiff=!0,addLine.wordDiff=!0,removeLine.matchedLine=addLine,addLine.matchedLine=removeLine)}processedLines.push(...removeLines.filter(Boolean)),processedLines.push(...addLines.filter(Boolean)),i3=j2}else processedLines.push(current),i3++}else processedLines.push(current),i3++}return processedLines}function calculateWordDiffs(oldText,newText){return diffWordsWithSpace(oldText,newText,{ignoreCase:!1})}function generateWordDiffElements(item,width,maxWidth,dim2,overrideTheme){let{type,i:i3,wordDiff:wordDiff2,matchedLine,originalCode}=item;if(!wordDiff2||!matchedLine)return null;let removedLineText=type==="remove"?originalCode:matchedLine.originalCode,addedLineText=type==="remove"?matchedLine.originalCode:originalCode,wordDiffs=calculateWordDiffs(removedLineText,addedLineText),totalLength=removedLineText.length+addedLineText.length;if(wordDiffs.filter(part=>part.added||part.removed).reduce((sum2,part)=>sum2+part.value.length,0)/totalLength>CHANGE_THRESHOLD2||dim2)return null;let diffPrefix=type==="add"?"+":"-",diffPrefixWidth=diffPrefix.length,availableContentWidth=Math.max(1,width-maxWidth-1-diffPrefixWidth),wrappedLines=[],currentLine=[],currentLineWidth=0;return wordDiffs.forEach((part,partIndex)=>{let shouldShow=!1,partBgColor;if(type==="add"?part.added?(shouldShow=!0,partBgColor="diffAddedWord"):part.removed||(shouldShow=!0):type==="remove"&&(part.removed?(shouldShow=!0,partBgColor="diffRemovedWord"):part.added||(shouldShow=!0)),!shouldShow)return;wrapText2(part.value,availableContentWidth,"wrap").split(`
6841
6841
  `).forEach((partLine,lineIdx)=>{partLine&&((lineIdx>0||currentLineWidth+stringWidth(partLine)>availableContentWidth)&&currentLine.length>0&&(wrappedLines.push({content:[...currentLine],contentWidth:currentLineWidth}),currentLine=[],currentLineWidth=0),currentLine.push((0,import_jsx_runtime86.jsx)(ThemedText,{backgroundColor:partBgColor,children:partLine},`part-${partIndex}-${lineIdx}`)),currentLineWidth+=stringWidth(partLine))})}),currentLine.length>0&&wrappedLines.push({content:currentLine,contentWidth:currentLineWidth}),wrappedLines.map(({content,contentWidth},lineIndex)=>{let key3=`${type}-${i3}-${lineIndex}`,lineBgColor=type==="add"?dim2?"diffAddedDimmed":"diffAdded":dim2?"diffRemovedDimmed":"diffRemoved",lineNum=lineIndex===0?i3:void 0,lineNumStr=(lineNum!==void 0?lineNum.toString().padStart(maxWidth):" ".repeat(maxWidth))+" ",usedWidth=lineNumStr.length+diffPrefixWidth+contentWidth,padding=Math.max(0,width-usedWidth);return(0,import_jsx_runtime86.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime86.jsx)(NoSelect,{fromLeftEdge:!0,children:(0,import_jsx_runtime86.jsxs)(ThemedText,{color:overrideTheme?"text":void 0,backgroundColor:lineBgColor,dimColor:dim2,children:[lineNumStr,diffPrefix]})}),(0,import_jsx_runtime86.jsxs)(ThemedText,{color:overrideTheme?"text":void 0,backgroundColor:lineBgColor,dimColor:dim2,children:[content," ".repeat(padding)]})]},key3)})}function formatDiff(lines,startingLineNumber,width,dim2,overrideTheme){let safeWidth=Math.max(1,Math.floor(width)),lineObjects=transformLinesToObjects(lines),processedLines=processAdjacentLines(lineObjects),ls=numberDiffLines(processedLines,startingLineNumber),maxLineNumber2=Math.max(...ls.map(({i:i3})=>i3),0),maxWidth=Math.max(maxLineNumber2.toString().length+1,0);return ls.flatMap(item=>{let{type,code,i:i3,wordDiff:wordDiff2,matchedLine}=item;if(wordDiff2&&matchedLine){let wordDiffElements=generateWordDiffElements(item,safeWidth,maxWidth,dim2,overrideTheme);if(wordDiffElements!==null)return wordDiffElements}let availableContentWidth=Math.max(1,safeWidth-maxWidth-1-2);return wrapText2(code,availableContentWidth,"wrap").split(`
6842
6842
  `).map((line,lineIndex)=>{let key3=`${type}-${i3}-${lineIndex}`,lineNum=lineIndex===0?i3:void 0,lineNumStr=(lineNum!==void 0?lineNum.toString().padStart(maxWidth):" ".repeat(maxWidth))+" ",sigil=type==="add"?"+":type==="remove"?"-":" ",contentWidth=lineNumStr.length+1+stringWidth(line),padding=Math.max(0,safeWidth-contentWidth),bgColor=type==="add"?dim2?"diffAddedDimmed":"diffAdded":type==="remove"?dim2?"diffRemovedDimmed":"diffRemoved":void 0;return(0,import_jsx_runtime86.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime86.jsx)(NoSelect,{fromLeftEdge:!0,children:(0,import_jsx_runtime86.jsxs)(ThemedText,{color:overrideTheme?"text":void 0,backgroundColor:bgColor,dimColor:dim2||type==="nochange",children:[lineNumStr,sigil]})}),(0,import_jsx_runtime86.jsxs)(ThemedText,{color:overrideTheme?"text":void 0,backgroundColor:bgColor,dimColor:dim2,children:[line," ".repeat(padding)]})]},key3)})})}function numberDiffLines(diff,startLine){let i3=startLine,result2=[],queue2=[...diff];for(;queue2.length>0;){let current=queue2.shift(),{code,type,originalCode,wordDiff:wordDiff2,matchedLine}=current,line={code,type,i:i3,originalCode,wordDiff:wordDiff2,matchedLine};switch(type){case"nochange":i3++,result2.push(line);break;case"add":i3++,result2.push(line);break;case"remove":{result2.push(line);let numRemoved=0;for(;queue2[0]?.type==="remove";){i3++;let current2=queue2.shift(),{code:code2,type:type2,originalCode:originalCode2,wordDiff:wordDiff3,matchedLine:matchedLine2}=current2,line2={code:code2,type:type2,i:i3,originalCode:originalCode2,wordDiff:wordDiff3,matchedLine:matchedLine2};result2.push(line2),numRemoved++}i3-=numRemoved;break}}}return result2}var import_react67,import_jsx_runtime86,CHANGE_THRESHOLD2,init_Fallback=__esm({"src/components/StructuredDiff/Fallback.tsx"(){init_libesm();import_react67=__toESM(require_react());init_stringWidth2();init_ink();import_jsx_runtime86=__toESM(require_jsx_runtime()),CHANGE_THRESHOLD2=.4;__name(StructuredDiffFallback,"StructuredDiffFallback");__name(transformLinesToObjects,"transformLinesToObjects");__name(processAdjacentLines,"processAdjacentLines");__name(calculateWordDiffs,"calculateWordDiffs");__name(generateWordDiffElements,"generateWordDiffElements");__name(formatDiff,"formatDiff");__name(numberDiffLines,"numberDiffLines")}});function computeGutterWidth(patch){return Math.max(patch.oldStart+patch.oldLines-1,patch.newStart+patch.newLines-1,1).toString().length+3}function renderColorDiff(patch,firstLine3,filePath,fileContent,theme2,width,dim2,splitGutter){let ColorDiff2=expectColorDiff();if(!ColorDiff2)return null;let rawGutterWidth=splitGutter?computeGutterWidth(patch):0,gutterWidth=rawGutterWidth>0&&rawGutterWidth<width?rawGutterWidth:0,key3=`${theme2}|${width}|${dim2?1:0}|${gutterWidth}|${firstLine3??""}|${filePath}`,perHunk=RENDER_CACHE.get(patch),hit=perHunk?.get(key3);if(hit)return hit;let lines=new ColorDiff2(patch,firstLine3,filePath,fileContent).render(theme2,width,dim2);if(lines===null)return null;let gutters=null,contents=null;gutterWidth>0&&(gutters=lines.map(l=>sliceAnsi(l,0,gutterWidth)),contents=lines.map(l=>sliceAnsi(l,gutterWidth)));let entry={lines,gutterWidth,gutters,contents};return perHunk||(perHunk=new Map,RENDER_CACHE.set(patch,perHunk)),perHunk.size>=4&&perHunk.clear(),perHunk.set(key3,entry),entry}var import_react68,import_jsx_runtime87,RENDER_CACHE,StructuredDiff,init_StructuredDiff=__esm({"src/components/StructuredDiff.tsx"(){import_react68=__toESM(require_react());init_useSettings();init_ink();init_fullscreen();init_sliceAnsi();init_colorDiff();init_Fallback();import_jsx_runtime87=__toESM(require_jsx_runtime()),RENDER_CACHE=new WeakMap;__name(computeGutterWidth,"computeGutterWidth");__name(renderColorDiff,"renderColorDiff");StructuredDiff=(0,import_react68.memo)(__name(function({patch,dim:dim2,filePath,firstLine:firstLine3,fileContent,width,skipHighlighting=!1}){let[theme2]=useTheme(),syntaxHighlightingDisabled=useSettings().syntaxHighlightingDisabled??!1,safeWidth=Math.max(1,Math.floor(width)),splitGutter=isFullscreenEnvEnabled(),cached6=skipHighlighting||syntaxHighlightingDisabled?null:renderColorDiff(patch,firstLine3,filePath,fileContent??null,theme2,safeWidth,dim2,splitGutter);if(!cached6)return(0,import_jsx_runtime87.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime87.jsx)(StructuredDiffFallback,{patch,dim:dim2,width})});let{lines,gutterWidth,gutters,contents}=cached6;return gutterWidth>0&&gutters&&contents?(0,import_jsx_runtime87.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime87.jsx)(NoSelect,{fromLeftEdge:!0,children:(0,import_jsx_runtime87.jsx)(RawAnsi,{lines:gutters,width:gutterWidth})}),(0,import_jsx_runtime87.jsx)(RawAnsi,{lines:contents,width:safeWidth-gutterWidth})]}):(0,import_jsx_runtime87.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime87.jsx)(RawAnsi,{lines,width:safeWidth})})},"StructuredDiff"))}});function ThemePicker({onThemeSelect,showIntroText=!1,helpText:helpText4="",showHelpTextBelow=!1,hideEscToCancel=!1,skipExitHandling=!1,onCancel:onCancelProp}){let[theme2]=useTheme(),themeSetting=useThemeSetting(),{columns}=useTerminalSize(),colorModuleUnavailableReason=getColorModuleUnavailableReason(),syntaxTheme=colorModuleUnavailableReason===null?getSyntaxTheme2(theme2):null,{setPreviewTheme,savePreview,cancelPreview}=usePreviewTheme(),syntaxHighlightingDisabled=useAppState(s2=>s2.settings.syntaxHighlightingDisabled)??!1,setAppState=useSetAppState();useRegisterKeybindingContext("ThemePicker");let syntaxToggleShortcut=useShortcutDisplay("theme:toggleSyntaxHighlighting","ThemePicker","ctrl+t");useKeybinding("theme:toggleSyntaxHighlighting",()=>{if(colorModuleUnavailableReason===null){let newValue=!syntaxHighlightingDisabled;updateSettingsForSource("userSettings",{syntaxHighlightingDisabled:newValue}),setAppState(prev=>({...prev,settings:{...prev.settings,syntaxHighlightingDisabled:newValue}}))}},{context:"ThemePicker"});let exitState=useExitOnCtrlCDWithKeybindings(skipExitHandling?()=>{}:void 0),themeOptions=[{label:"Dark mode",value:"dark"},{label:"Light mode",value:"light"},{label:"Dark mode (colorblind-friendly)",value:"dark-daltonized"},{label:"Light mode (colorblind-friendly)",value:"light-daltonized"},{label:"Dark mode (ANSI colors only)",value:"dark-ansi"},{label:"Light mode (ANSI colors only)",value:"light-ansi"}],content=(0,import_jsx_runtime88.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime88.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[showIntroText?(0,import_jsx_runtime88.jsx)(ThemedText,{children:"Let's get started."}):(0,import_jsx_runtime88.jsx)(ThemedText,{bold:!0,color:"permission",children:"Theme"}),(0,import_jsx_runtime88.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime88.jsx)(ThemedText,{bold:!0,children:"Choose the text style that looks best with your terminal"}),helpText4&&!showHelpTextBelow&&(0,import_jsx_runtime88.jsx)(ThemedText,{dimColor:!0,children:helpText4})]}),(0,import_jsx_runtime88.jsx)(Select,{options:themeOptions,onFocus:setting=>{setPreviewTheme(setting)},onChange:setting=>{savePreview(),onThemeSelect(setting)},onCancel:skipExitHandling?()=>{cancelPreview(),onCancelProp?.()}:async()=>{cancelPreview(),await gracefulShutdown(0)},visibleOptionCount:themeOptions.length,defaultValue:themeSetting,defaultFocusValue:themeSetting})]}),(0,import_jsx_runtime88.jsxs)(ThemedBox_default,{flexDirection:"column",width:"100%",children:[(0,import_jsx_runtime88.jsx)(ThemedBox_default,{flexDirection:"column",borderTop:!0,borderBottom:!0,borderLeft:!1,borderRight:!1,borderStyle:"dashed",borderColor:"subtle",children:(0,import_jsx_runtime88.jsx)(StructuredDiff,{patch:{oldStart:1,newStart:1,oldLines:3,newLines:3,lines:[" function greet() {",'- console.log("Hello, World!");','+ console.log("Hello, Clavue!");'," }"]},dim:!1,filePath:"demo.js",firstLine:null,width:columns})}),(0,import_jsx_runtime88.jsxs)(ThemedText,{dimColor:!0,children:[" ",colorModuleUnavailableReason==="env"?`Syntax highlighting disabled (via CLAUDE_CODE_SYNTAX_HIGHLIGHT=${process.env.CLAUDE_CODE_SYNTAX_HIGHLIGHT})`:syntaxHighlightingDisabled?`Syntax highlighting disabled (${syntaxToggleShortcut} to enable)`:syntaxTheme?`Syntax theme: ${syntaxTheme.theme}${syntaxTheme.source?` (from ${syntaxTheme.source})`:""} (${syntaxToggleShortcut} to disable)`:`Syntax highlighting enabled (${syntaxToggleShortcut} to disable)`]})]})]});return showIntroText?content:(0,import_jsx_runtime88.jsxs)(import_jsx_runtime88.Fragment,{children:[(0,import_jsx_runtime88.jsx)(ThemedBox_default,{flexDirection:"column",children:content}),(0,import_jsx_runtime88.jsxs)(ThemedBox_default,{marginTop:1,children:[showHelpTextBelow&&helpText4&&(0,import_jsx_runtime88.jsx)(ThemedBox_default,{marginLeft:3,children:(0,import_jsx_runtime88.jsx)(ThemedText,{dimColor:!0,children:helpText4})}),!hideEscToCancel&&(0,import_jsx_runtime88.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime88.jsx)(ThemedText,{dimColor:!0,italic:!0,children:exitState.pending?(0,import_jsx_runtime88.jsxs)(import_jsx_runtime88.Fragment,{children:["Press ",exitState.keyName," again to exit"]}):(0,import_jsx_runtime88.jsxs)(Byline,{children:[(0,import_jsx_runtime88.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"select"}),(0,import_jsx_runtime88.jsx)(KeyboardShortcutHint,{shortcut:"Esc",action:"cancel"})]})})})]})]})}var import_jsx_runtime88,init_ThemePicker=__esm({"src/components/ThemePicker.tsx"(){init_useExitOnCtrlCDWithKeybindings();init_useTerminalSize();init_ink();init_KeybindingContext();init_useKeybinding();init_useShortcutDisplay();init_AppState();init_gracefulShutdown();init_settings2();init_CustomSelect();init_Byline();init_KeyboardShortcutHint();init_colorDiff();init_StructuredDiff();import_jsx_runtime88=__toESM(require_jsx_runtime());__name(ThemePicker,"ThemePicker")}});function modelValuesEqual(a2,b3){return a2===null&&b3===null?!0:a2===null||b3===null?!1:a2.trim().toLowerCase()===b3.trim().toLowerCase()}function dedupeModelOptions(options){let seen2=new Set,out=[];for(let opt of options){let key3=opt.value===null?"__null__":opt.value.trim().toLowerCase();seen2.has(key3)||(seen2.add(key3),out.push(opt))}return out}function findOptionValueIgnoreCase(options,target){return target===null?options.some(o2=>o2.value===null)?null:void 0:options.find(o2=>modelValuesEqual(o2.value,target))?.value}function focusedDisplayName(option){if(!option)return"";let trimmed=option.label?.trim()??"";return trimmed!==""?trimmed:option.value===null?"Default":option.value}var init_modelPickerHelpers=__esm({"src/utils/model/modelPickerHelpers.ts"(){__name(modelValuesEqual,"modelValuesEqual");__name(dedupeModelOptions,"dedupeModelOptions");__name(findOptionValueIgnoreCase,"findOptionValueIgnoreCase");__name(focusedDisplayName,"focusedDisplayName")}});function effortLevelToSymbol(level){switch(level){case"low":return EFFORT_LOW;case"medium":return EFFORT_MEDIUM;case"high":case"xhigh":case"ultra":return EFFORT_HIGH;case"max":return EFFORT_MAX}}var init_EffortIndicator=__esm({"src/components/EffortIndicator.ts"(){init_figures2();init_effort();__name(effortLevelToSymbol,"effortLevelToSymbol")}});function ModelPicker({initial:initial2,sessionModel,onSelect,onCancel,isStandaloneCommand,showFastModeNotice,headerText,skipSettingsWrite}){let setAppState=useSetAppState(),exitState=useExitOnCtrlCDWithKeybindings(),maxVisible=10,isFastMode=useAppState(s2=>isFastModeEnabled()?s2.fastMode:!1),[hasToggledEffort,setHasToggledEffort]=(0,import_react69.useState)(!1),effortValue=useAppState(s2=>s2.effortValue),[effort,setEffort]=(0,import_react69.useState)(effortValue!==void 0?convertEffortValueToLevel(effortValue):void 0),modelOptions=(0,import_react69.useMemo)(()=>getModelOptions(isFastMode??!1),[isFastMode]),optionsWithInitial=(0,import_react69.useMemo)(()=>{let deduped=dedupeModelOptions(modelOptions);return initial2!==null&&findOptionValueIgnoreCase(deduped,initial2)===void 0?[...deduped,{value:initial2,label:modelDisplayString(initial2),description:resolveUiLocale()==="zh-CN"?"\u5F53\u524D\u6A21\u578B":"Current model"}]:deduped},[modelOptions,initial2]),initialValue=(0,import_react69.useMemo)(()=>initial2===null?NO_PREFERENCE:findOptionValueIgnoreCase(optionsWithInitial,initial2)??initial2,[initial2,optionsWithInitial]),[focusedValue,setFocusedValue]=(0,import_react69.useState)(initialValue),selectOptions=(0,import_react69.useMemo)(()=>optionsWithInitial.map(opt=>({...opt,value:opt.value===null?NO_PREFERENCE:opt.value})),[optionsWithInitial]),initialFocusValue=(0,import_react69.useMemo)(()=>selectOptions.some(_2=>_2.value===initialValue)?initialValue:selectOptions[0]?.value??void 0,[selectOptions,initialValue]),visibleCount=Math.min(maxVisible,selectOptions.length),hiddenCount=Math.max(0,selectOptions.length-visibleCount),focusedOption=selectOptions.find(opt=>opt.value===focusedValue),focusedModelName=focusedDisplayName(focusedOption?{value:focusedOption.value===NO_PREFERENCE?null:focusedOption.value,label:focusedOption.label,description:focusedOption.description}:void 0),focusedModel=resolveOptionModel(focusedValue),focusedSupportsEffort=focusedModel?modelSupportsEffort(focusedModel):!1,focusedEffortLevels=focusedModel?getSupportedEffortLevels(focusedModel):[],focusedDefaultEffort=getDefaultEffortLevelForOption(focusedValue),displayEffort=effort&&!focusedEffortLevels.includes(effort)?"high":effort,handleFocus=(0,import_react69.useCallback)(value=>{setFocusedValue(value),!hasToggledEffort&&effortValue===void 0&&setEffort(getDefaultEffortLevelForOption(value))},[hasToggledEffort,effortValue]),handleCycleEffort=(0,import_react69.useCallback)(direction=>{focusedSupportsEffort&&(setEffort(prev=>cycleEffortLevel(prev??focusedDefaultEffort,direction,focusedEffortLevels)),setHasToggledEffort(!0))},[focusedSupportsEffort,focusedEffortLevels,focusedDefaultEffort]);useKeybindings({"modelPicker:decreaseEffort":__name(()=>handleCycleEffort("left"),"modelPicker:decreaseEffort"),"modelPicker:increaseEffort":__name(()=>handleCycleEffort("right"),"modelPicker:increaseEffort")},{context:"ModelPicker"});function handleSelect(value){if(logEvent("tengu_model_command_menu_effort",{effort}),!skipSettingsWrite){let effortLevel=resolvePickerEffortPersistence(effort,getDefaultEffortLevelForOption(value),getSettingsForSource("userSettings")?.effortLevel,hasToggledEffort),persistable=toPersistableEffort(effortLevel);persistable!==void 0&&updateSettingsForSource("userSettings",{effortLevel:persistable}),setAppState(prev=>({...prev,effortValue:effortLevel}))}let selectedModel=resolveOptionModel(value),selectedEffort=hasToggledEffort&&selectedModel&&modelSupportsEffort(selectedModel)?effort:void 0;if(value===NO_PREFERENCE){onSelect(null,selectedEffort);return}onSelect(value,selectedEffort)}__name(handleSelect,"handleSelect");let isZh7=resolveUiLocale()==="zh-CN",content=(0,import_jsx_runtime89.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime89.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime89.jsxs)(ThemedBox_default,{marginBottom:1,flexDirection:"column",children:[(0,import_jsx_runtime89.jsx)(ThemedText,{color:"remember",bold:!0,children:isZh7?"\u9009\u62E9\u6A21\u578B":"Select model"}),(0,import_jsx_runtime89.jsx)(ThemedText,{dimColor:!0,children:headerText??(isZh7?"\u8BBE\u7F6E\u4E3B\u4F1A\u8BDD\u6A21\u578B\u3002\u53EF\u4F7F\u7528 /provider \u914D\u7F6E\u5404\u670D\u52A1\u5546\u7684 Primary\u3001Sonnet\u3001Haiku\u3001Opus \u69FD\u4F4D\u3002":"Set the main session model. Use /provider to configure provider-specific Primary, Sonnet, Haiku, and Opus slots.")}),sessionModel&&(0,import_jsx_runtime89.jsx)(ThemedText,{dimColor:!0,children:isZh7?`\u672C\u4F1A\u8BDD\u5F53\u524D\u4F7F\u7528 ${modelDisplayString(sessionModel)}(\u7531\u8BA1\u5212\u6A21\u5F0F\u8BBE\u7F6E)\u3002\u91CD\u65B0\u9009\u62E9\u6A21\u578B\u5C06\u53D6\u6D88\u8BE5\u8BBE\u7F6E\u3002`:`Currently using ${modelDisplayString(sessionModel)} for this session (set by plan mode). Selecting a model will undo this.`})]}),(0,import_jsx_runtime89.jsxs)(ThemedBox_default,{flexDirection:"column",marginBottom:1,children:[(0,import_jsx_runtime89.jsx)(ThemedBox_default,{flexDirection:"column",children:(0,import_jsx_runtime89.jsx)(Select,{defaultValue:initialValue,defaultFocusValue:initialFocusValue,options:selectOptions,onChange:handleSelect,onFocus:handleFocus,onCancel:onCancel??(()=>{}),visibleOptionCount:visibleCount})}),hiddenCount>0&&(0,import_jsx_runtime89.jsx)(ThemedBox_default,{paddingLeft:3,children:(0,import_jsx_runtime89.jsx)(ThemedText,{dimColor:!0,children:isZh7?`\u8FD8\u6709 ${hiddenCount} \u9879\u2026`:`and ${hiddenCount} more\u2026`})})]}),(0,import_jsx_runtime89.jsx)(ThemedBox_default,{marginBottom:1,flexDirection:"column",children:focusedSupportsEffort?(0,import_jsx_runtime89.jsxs)(ThemedText,{dimColor:!0,children:[(0,import_jsx_runtime89.jsx)(EffortLevelIndicator,{effort:displayEffort})," ",isZh7?`${effortLevelLabelZh(displayEffort)} \u6295\u5165`:`${capitalize_default(displayEffort)} effort`,displayEffort===focusedDefaultEffort?isZh7?"(\u9ED8\u8BA4)":" (default)":""," ",(0,import_jsx_runtime89.jsx)(ThemedText,{color:"subtle",children:isZh7?"\u2190 \u2192 \u8C03\u6574":"\u2190 \u2192 to adjust"})]}):(0,import_jsx_runtime89.jsxs)(ThemedText,{color:"subtle",children:[(0,import_jsx_runtime89.jsx)(EffortLevelIndicator,{effort:void 0}),isZh7?` \u4E0D\u652F\u6301\u6295\u5165\u6863\u4F4D${focusedModelName?`(${focusedModelName})`:""}`:` Effort not supported${focusedModelName?` for ${focusedModelName}`:""}`]})}),isFastModeEnabled()?showFastModeNotice?(0,import_jsx_runtime89.jsx)(ThemedBox_default,{marginBottom:1,children:(0,import_jsx_runtime89.jsx)(ThemedText,{dimColor:!0,children:isZh7?(0,import_jsx_runtime89.jsxs)(import_jsx_runtime89.Fragment,{children:["\u6781\u901F\u6A21\u5F0F ",(0,import_jsx_runtime89.jsx)(ThemedText,{bold:!0,children:"\u5DF2\u5F00\u542F"}),",\u4E14\u4EC5\u5728"," ",FAST_MODE_MODEL_DISPLAY," \u4E0A\u53EF\u7528(/fast)\u3002\u5207\u6362\u5230\u5176\u4ED6\u6A21\u578B\u4F1A\u81EA\u52A8\u5173\u95ED\u6781\u901F\u6A21\u5F0F\u3002"]}):(0,import_jsx_runtime89.jsxs)(import_jsx_runtime89.Fragment,{children:["Fast mode is ",(0,import_jsx_runtime89.jsx)(ThemedText,{bold:!0,children:"ON"})," and available with"," ",FAST_MODE_MODEL_DISPLAY," only (/fast). Switching to other models turns off fast mode."]})})}):isFastModeAvailable()&&!isFastModeCooldown()?(0,import_jsx_runtime89.jsx)(ThemedBox_default,{marginBottom:1,children:(0,import_jsx_runtime89.jsx)(ThemedText,{dimColor:!0,children:isZh7?(0,import_jsx_runtime89.jsxs)(import_jsx_runtime89.Fragment,{children:["\u4F7F\u7528 ",(0,import_jsx_runtime89.jsx)(ThemedText,{bold:!0,children:"/fast"})," \u5F00\u542F\u6781\u901F\u6A21\u5F0F(\u4EC5 ",FAST_MODE_MODEL_DISPLAY,")\u3002"]}):(0,import_jsx_runtime89.jsxs)(import_jsx_runtime89.Fragment,{children:["Use ",(0,import_jsx_runtime89.jsx)(ThemedText,{bold:!0,children:"/fast"})," to turn on Fast mode (",FAST_MODE_MODEL_DISPLAY," only)."]})})}):null:null]}),isStandaloneCommand&&(0,import_jsx_runtime89.jsx)(ThemedText,{dimColor:!0,italic:!0,children:exitState.pending?(0,import_jsx_runtime89.jsx)(import_jsx_runtime89.Fragment,{children:isZh7?`\u518D\u6B21\u6309 ${exitState.keyName} \u9000\u51FA`:(0,import_jsx_runtime89.jsxs)(import_jsx_runtime89.Fragment,{children:["Press ",exitState.keyName," again to exit"]})}):(0,import_jsx_runtime89.jsxs)(Byline,{children:[(0,import_jsx_runtime89.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime89.jsx)(ConfigurableShortcutHint,{action:"select:cancel",context:"Select",fallback:"Esc",description:"exit"})]})})]});return isStandaloneCommand?(0,import_jsx_runtime89.jsx)(Pane,{color:"permission",children:content}):content}function effortLevelLabelZh(level){switch(level){case"low":return"\u4F4E";case"medium":return"\u4E2D";case"high":return"\u9AD8";case"xhigh":return"\u8D85\u9AD8";case"max":return"\u6700\u9AD8";case"ultra":return"\u6781\u9650"}}function resolveOptionModel(value){if(value)return value===NO_PREFERENCE?getDefaultMainLoopModel():parseUserSpecifiedModel(value)}function EffortLevelIndicator({effort}){return(0,import_jsx_runtime89.jsx)(ThemedText,{color:effort?"claude":"subtle",children:effortLevelToSymbol(effort??"low")})}function cycleEffortLevel(current,direction,levels){let supported=levels.length>0?levels:["low","medium","high"],idx=supported.indexOf(current),currentIndex=idx!==-1?idx:supported.indexOf("high");return direction==="right"?supported[(currentIndex+1)%supported.length]:supported[(currentIndex-1+supported.length)%supported.length]}function getDefaultEffortLevelForOption(value){let resolved=resolveOptionModel(value)??getDefaultMainLoopModel(),defaultValue=getDefaultEffortForModel(resolved);return defaultValue!==void 0?convertEffortValueToLevel(defaultValue):"high"}var import_react69,import_jsx_runtime89,NO_PREFERENCE,init_ModelPicker=__esm({"src/components/ModelPicker.tsx"(){init_capitalize();import_react69=__toESM(require_react());init_useExitOnCtrlCDWithKeybindings();init_analytics();init_fastMode();init_ink();init_useKeybinding();init_AppState();init_effort();init_model();init_modelOptions();init_modelPickerHelpers();init_settings2();init_uiLocale();init_ConfigurableShortcutHint();init_CustomSelect();init_Byline();init_KeyboardShortcutHint();init_Pane();init_EffortIndicator();import_jsx_runtime89=__toESM(require_jsx_runtime()),NO_PREFERENCE="__NO_PREFERENCE__";__name(ModelPicker,"ModelPicker");__name(effortLevelLabelZh,"effortLevelLabelZh");__name(resolveOptionModel,"resolveOptionModel");__name(EffortLevelIndicator,"EffortLevelIndicator");__name(cycleEffortLevel,"cycleEffortLevel");__name(getDefaultEffortLevelForOption,"getDefaultEffortLevelForOption")}});function isBilledAsExtraUsage(model,isFastMode,isOpus1mMerged){if(!isClaudeAISubscriber())return!1;if(isFastMode)return!0;if(model===null||!has1mContext(model))return!1;let m3=model.toLowerCase().replace(/\[1m\]$/,"").trim(),isOpus46=m3==="opus"||m3.includes("opus-4-6"),isSonnet46=m3==="sonnet"||m3.includes("sonnet-4-6");return isOpus46&&isOpus1mMerged?!1:isOpus46||isSonnet46}var init_extraUsage=__esm({"src/utils/extraUsage.ts"(){init_auth();init_context();__name(isBilledAsExtraUsage,"isBilledAsExtraUsage")}});var ClaudeMdExternalIncludesDialog_exports={};__export(ClaudeMdExternalIncludesDialog_exports,{ClaudeMdExternalIncludesDialog:()=>ClaudeMdExternalIncludesDialog});function ClaudeMdExternalIncludesDialog({onDone,isStandaloneDialog,externalIncludes}){import_react70.default.useEffect(()=>{logEvent("tengu_claude_md_includes_dialog_shown",{})},[]);let handleSelection=(0,import_react70.useCallback)(value=>{value==="no"?(logEvent("tengu_claude_md_external_includes_dialog_declined",{}),saveCurrentProjectConfig(current=>({...current,hasClaudeMdExternalIncludesApproved:!1,hasClaudeMdExternalIncludesWarningShown:!0}))):(logEvent("tengu_claude_md_external_includes_dialog_accepted",{}),saveCurrentProjectConfig(current=>({...current,hasClaudeMdExternalIncludesApproved:!0,hasClaudeMdExternalIncludesWarningShown:!0}))),onDone()},[onDone]),handleEscape=(0,import_react70.useCallback)(()=>{handleSelection("no")},[handleSelection]);return(0,import_jsx_runtime90.jsxs)(Dialog,{title:"Allow external \u0043LAUDE.md file imports?",color:"warning",onCancel:handleEscape,hideBorder:!isStandaloneDialog,hideInputGuide:!isStandaloneDialog,children:[(0,import_jsx_runtime90.jsx)(ThemedText,{children:"This project's clavue.md imports files outside the current working directory. Never allow this for third-party repositories."}),externalIncludes&&externalIncludes.length>0&&(0,import_jsx_runtime90.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime90.jsx)(ThemedText,{dimColor:!0,children:"External imports:"}),externalIncludes.map((include,i3)=>(0,import_jsx_runtime90.jsxs)(ThemedText,{dimColor:!0,children:[" ",include.path]},i3))]}),(0,import_jsx_runtime90.jsxs)(ThemedText,{dimColor:!0,children:["Important: Only use Clavue with files you trust. Accessing untrusted files may pose security risks"," ",(0,import_jsx_runtime90.jsx)(Link,{url:"https://www.clavue.com"})," "]}),(0,import_jsx_runtime90.jsx)(Select,{options:[{label:"Yes, allow external imports",value:"yes"},{label:"No, disable external imports",value:"no"}],onChange:value=>handleSelection(value)})]})}var import_react70,import_jsx_runtime90,init_ClaudeMdExternalIncludesDialog=__esm({"src/components/ClaudeMdExternalIncludesDialog.tsx"(){import_react70=__toESM(require_react());init_analytics();init_ink();init_config12();init_CustomSelect();init_Dialog();import_jsx_runtime90=__toESM(require_jsx_runtime());__name(ClaudeMdExternalIncludesDialog,"ClaudeMdExternalIncludesDialog")}});function ChannelDowngradeDialog({currentVersion,onChoice}){function handleSelect(value){onChoice(value)}__name(handleSelect,"handleSelect");function handleCancel(){onChoice("cancel")}__name(handleCancel,"handleCancel");let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime91.jsxs)(Dialog,{title:isZh7?"\u5207\u6362\u5230\u7A33\u5B9A\u901A\u9053":"Switch to Stable Channel",onCancel:handleCancel,color:"permission",hideBorder:!0,hideInputGuide:!0,children:[(0,import_jsx_runtime91.jsx)(ThemedText,{children:isZh7?`\u7A33\u5B9A\u901A\u9053\u7684\u7248\u672C\u53EF\u80FD\u4F4E\u4E8E\u5F53\u524D\u8FD0\u884C\u7248\u672C(${currentVersion})\u3002`:`The stable channel may have an older version than what you're currently running (${currentVersion}).`}),(0,import_jsx_runtime91.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u4F60\u5E0C\u671B\u5982\u4F55\u5904\u7406?":"How would you like to handle this?"}),(0,import_jsx_runtime91.jsx)(Select,{options:[{label:isZh7?"\u5141\u8BB8\u964D\u7EA7\u5230\u7A33\u5B9A\u7248\u672C":"Allow possible downgrade to stable version",value:"downgrade"},{label:isZh7?`\u4FDD\u7559\u5F53\u524D\u7248\u672C (${currentVersion}) \u76F4\u5230\u7A33\u5B9A\u901A\u9053\u8FFD\u4E0A`:`Stay on current version (${currentVersion}) until stable catches up`,value:"stay"}],onChange:handleSelect})]})}var import_jsx_runtime91,init_ChannelDowngradeDialog=__esm({"src/components/ChannelDowngradeDialog.tsx"(){init_ink();init_uiLocale();init_CustomSelect();init_Dialog();import_jsx_runtime91=__toESM(require_jsx_runtime());__name(ChannelDowngradeDialog,"ChannelDowngradeDialog")}});function mapConfigsToOptions(styles4){return Object.entries(styles4).map(([style,config3])=>({label:config3?.name??DEFAULT_OUTPUT_STYLE_LABEL,value:style,description:config3?.description??DEFAULT_OUTPUT_STYLE_DESCRIPTION}))}function OutputStylePicker({initialStyle,onComplete,onCancel,isStandaloneCommand}){let[styleOptions,setStyleOptions]=(0,import_react71.useState)([]),[isLoading,setIsLoading]=(0,import_react71.useState)(!0);(0,import_react71.useEffect)(()=>{getAllOutputStyles(getCwd()).then(allStyles=>{let options=mapConfigsToOptions(allStyles);setStyleOptions(options),setIsLoading(!1)}).catch(()=>{let builtInOptions=mapConfigsToOptions(OUTPUT_STYLE_CONFIG);setStyleOptions(builtInOptions),setIsLoading(!1)})},[]);let handleStyleSelect=(0,import_react71.useCallback)(style=>{onComplete(style)},[onComplete]);return(0,import_jsx_runtime92.jsx)(Dialog,{title:"Preferred output style",onCancel,hideInputGuide:!isStandaloneCommand,hideBorder:!isStandaloneCommand,children:(0,import_jsx_runtime92.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime92.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime92.jsx)(ThemedText,{dimColor:!0,children:"This changes how Clavue communicates with you"})}),isLoading?(0,import_jsx_runtime92.jsx)(ThemedText,{dimColor:!0,children:"Loading output styles\u2026"}):(0,import_jsx_runtime92.jsx)(Select,{options:styleOptions,onChange:handleStyleSelect,visibleOptionCount:10,defaultValue:initialStyle})]})})}var import_react71,import_jsx_runtime92,DEFAULT_OUTPUT_STYLE_LABEL,DEFAULT_OUTPUT_STYLE_DESCRIPTION,init_OutputStylePicker=__esm({"src/components/OutputStylePicker.tsx"(){import_react71=__toESM(require_react());init_outputStyles();init_ink();init_cwd2();init_select();init_Dialog();import_jsx_runtime92=__toESM(require_jsx_runtime()),DEFAULT_OUTPUT_STYLE_LABEL="Default",DEFAULT_OUTPUT_STYLE_DESCRIPTION="Clavue completes coding tasks efficiently and provides concise responses";__name(mapConfigsToOptions,"mapConfigsToOptions");__name(OutputStylePicker,"OutputStylePicker")}});function LanguagePicker({initialLanguage,onComplete,onCancel,primaryOnly=!1}){let locale=resolveUiLocale(),isZh7=locale==="zh-CN",isJa2=locale==="ja-JP",options=primaryOnly?PRIMARY:[...PRIMARY,...EXTENDED],[selectedIndex,setSelectedIndex]=(0,import_react72.useState)(Math.max(0,options.findIndex(l=>l.locale===initialLanguage||initialLanguage==="en-US"&&l.locale==="en"||initialLanguage==="ja"&&l.locale==="ja-JP")));useKeybinding("confirm:no",onCancel,{context:"Settings"}),useInput((_input,key3)=>{key3.upArrow||_input==="k"?setSelectedIndex(i3=>(i3-1+options.length)%options.length):key3.downArrow||_input==="j"?setSelectedIndex(i3=>(i3+1)%options.length):key3.return&&onComplete(options[selectedIndex]?.locale)});let title=isZh7?"\u9009\u62E9\u8BED\u8A00 / Choose Language / \u8A00\u8A9E":isJa2?"\u8A00\u8A9E\u3092\u9078\u629E / Choose Language / \u9009\u62E9\u8BED\u8A00":"Choose Language / \u9009\u62E9\u8BED\u8A00 / \u8A00\u8A9E",hint=isZh7?`${figures_default.arrowUp}${figures_default.arrowDown} \u9009\u62E9 Enter \u786E\u8BA4 Esc \u53D6\u6D88`:isJa2?`${figures_default.arrowUp}${figures_default.arrowDown} \u9078\u629E Enter \u6C7A\u5B9A Esc \u30AD\u30E3\u30F3\u30BB\u30EB`:`${figures_default.arrowUp}${figures_default.arrowDown} navigate Enter confirm Esc cancel`;return(0,import_jsx_runtime93.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime93.jsx)(ThemedText,{bold:!0,children:title}),(0,import_jsx_runtime93.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u754C\u9762\u6587\u6848\u4E0E\u6A21\u578B\u5BF9\u8BDD\u90FD\u4F1A\u6309\u6240\u9009\u8BED\u8A00\u6DF1\u5EA6\u9002\u914D\uFF08\u4E2D / \u82F1 / \u65E5\u4F18\u5148\uFF09":isJa2?"UI \u3068\u30E2\u30C7\u30EB\u5BFE\u8A71\u306E\u4E21\u65B9\u3092\u9078\u629E\u8A00\u8A9E\u306B\u5408\u308F\u305B\u3066\u6700\u9069\u5316\u3057\u307E\u3059\uFF08\u4E2D/\u82F1/\u65E5\uFF09":"UI chrome and model interaction adapt to your language (zh / en / ja first)"}),(0,import_jsx_runtime93.jsx)(ThemedBox_default,{flexDirection:"column",gap:0,children:options.map((lang,i3)=>{let isSelected=i3===selectedIndex;return(0,import_jsx_runtime93.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime93.jsxs)(ThemedText,{color:isSelected?"warning":void 0,bold:isSelected,children:[isSelected?figures_default.pointer:" "," ",lang.flag," ",lang.name,PRIMARY.some(p=>p.locale===lang.locale)?(0,import_jsx_runtime93.jsx)(ThemedText,{dimColor:!0,children:isZh7?" \xB7 \u5B8C\u6574\u9002\u914D":isJa2?" \xB7 \u30D5\u30EB\u5BFE\u5FDC":" \xB7 full profile"}):null]})},lang.locale)})}),(0,import_jsx_runtime93.jsx)(ThemedText,{dimColor:!0,children:hint})]})}var import_react72,import_jsx_runtime93,PRIMARY,EXTENDED,init_LanguagePicker=__esm({"src/components/LanguagePicker.tsx"(){init_figures();import_react72=__toESM(require_react());init_ink();init_useKeybinding();init_localeProfiles();init_uiLocale();import_jsx_runtime93=__toESM(require_jsx_runtime()),PRIMARY=PRIMARY_LOCALES.map(locale=>{let p=resolveLocaleProfile(locale);return{flag:p.flag,name:p.nativeName,locale:p.tag}}),EXTENDED=[{flag:"\u{1F1F0}\u{1F1F7}",name:"\uD55C\uAD6D\uC5B4",locale:"ko-KR"},{flag:"\u{1F1EB}\u{1F1F7}",name:"Fran\xE7ais",locale:"fr-FR"},{flag:"\u{1F1E9}\u{1F1EA}",name:"Deutsch",locale:"de-DE"},{flag:"\u{1F1EA}\u{1F1F8}",name:"Espa\xF1ol",locale:"es-ES"},{flag:"\u{1F1F5}\u{1F1F9}",name:"Portugu\xEAs",locale:"pt-PT"},{flag:"\u{1F1EE}\u{1F1F9}",name:"Italiano",locale:"it-IT"},{flag:"\u{1F1F7}\u{1F1FA}",name:"\u0420\u0443\u0441\u0441\u043A\u0438\u0439",locale:"ru-RU"},{flag:"\u{1F1F8}\u{1F1E6}",name:"\u0627\u0644\u0639\u0631\u0628\u064A\u0629",locale:"ar-SA"},{flag:"\u{1F1EE}\u{1F1F3}",name:"\u0939\u093F\u0928\u094D\u0926\u0940",locale:"hi-IN"},{flag:"\u{1F1F9}\u{1F1ED}",name:"\u0E44\u0E17\u0E22",locale:"th-TH"},{flag:"\u{1F1FB}\u{1F1F3}",name:"Ti\u1EBFng Vi\u1EC7t",locale:"vi-VN"},{flag:"\u{1F1EE}\u{1F1E9}",name:"Bahasa Indonesia",locale:"id-ID"},{flag:"\u{1F1F3}\u{1F1F1}",name:"Nederlands",locale:"nl-NL"},{flag:"\u{1F1F5}\u{1F1F1}",name:"Polski",locale:"pl-PL"},{flag:"\u{1F1F9}\u{1F1F7}",name:"T\xFCrk\xE7e",locale:"tr-TR"},{flag:"\u{1F1FA}\u{1F1E6}",name:"\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430",locale:"uk-UA"}];__name(LanguagePicker,"LanguagePicker")}});function Config({onClose,context:context3,setTabsHidden,onIsSearchModeChange,contentHeight}){let{headerFocused,focusHeader}=useTabHeaderFocus(),insideModal=useIsInsideModal(),[,setTheme]=useTheme(),themeSetting=useThemeSetting(),[globalConfig2,setGlobalConfig]=(0,import_react73.useState)(getGlobalConfig()),initialConfig=React39.useRef(getGlobalConfig()),[settingsData,setSettingsData]=(0,import_react73.useState)(getInitialSettings()),initialSettingsData=React39.useRef(getInitialSettings()),[currentOutputStyle,setCurrentOutputStyle]=(0,import_react73.useState)(settingsData?.outputStyle||DEFAULT_OUTPUT_STYLE_NAME),initialOutputStyle=React39.useRef(currentOutputStyle),[currentLanguage,setCurrentLanguage]=(0,import_react73.useState)(settingsData?.language),initialLanguage=React39.useRef(currentLanguage),[selectedIndex,setSelectedIndex]=(0,import_react73.useState)(0),[scrollOffset,setScrollOffset]=(0,import_react73.useState)(0),[isSearchMode,setIsSearchMode]=(0,import_react73.useState)(!0),isTerminalFocused=useTerminalFocus(),{rows}=useTerminalSize(),paneCap=contentHeight??Math.min(Math.floor(rows*.8),30),maxVisible=Math.max(5,paneCap-10),mainLoopModel=useAppState(s2=>s2.mainLoopModel),verbose=useAppState(s2=>s2.verbose),thinkingEnabled=useAppState(s2=>s2.thinkingEnabled),isFastMode=useAppState(s2=>isFastModeEnabled()?s2.fastMode:!1),promptSuggestionEnabled=useAppState(s2=>s2.promptSuggestionEnabled),showAutoInDefaultModePicker=hasAutoModeOptInAnySource()||getAutoModeEnabledState()==="enabled",showDefaultViewPicker=!1,setAppState=useSetAppState(),[changes,setChanges]=(0,import_react73.useState)({}),initialThinkingEnabled=React39.useRef(thinkingEnabled),[initialLocalSettings]=(0,import_react73.useState)(()=>getSettingsForSource("localSettings")),[initialUserSettings]=(0,import_react73.useState)(()=>getSettingsForSource("userSettings")),initialThemeSetting=React39.useRef(themeSetting),store=useAppStateStore(),[initialAppState]=(0,import_react73.useState)(()=>{let s2=store.getState();return{mainLoopModel:s2.mainLoopModel,mainLoopModelForSession:s2.mainLoopModelForSession,verbose:s2.verbose,thinkingEnabled:s2.thinkingEnabled,fastMode:s2.fastMode,promptSuggestionEnabled:s2.promptSuggestionEnabled,isBriefOnly:s2.isBriefOnly,replBridgeEnabled:s2.replBridgeEnabled,replBridgeOutboundOnly:s2.replBridgeOutboundOnly,settings:s2.settings}}),[initialUserMsgOptIn]=(0,import_react73.useState)(()=>getUserMsgOptIn3()),isDirty2=React39.useRef(!1),[showThinkingWarning,setShowThinkingWarning]=(0,import_react73.useState)(!1),[showSubmenu,setShowSubmenu]=(0,import_react73.useState)(null),{query:searchQuery,setQuery:setSearchQuery,cursorOffset:searchCursorOffset}=useSearchInput({isActive:isSearchMode&&showSubmenu===null&&!headerFocused,onExit:__name(()=>setIsSearchMode(!1),"onExit"),onExitUp:focusHeader,passthroughCtrlKeys:["c","d"]}),ownsEsc=isSearchMode&&!headerFocused;React39.useEffect(()=>{onIsSearchModeChange?.(ownsEsc)},[ownsEsc,onIsSearchModeChange]);let isConnectedToIde=hasAccessToIDEExtensionDiffFeature(context3.options.mcpClients),isFileCheckpointingAvailable=!isEnvTruthy2(process.env.CLAUDE_CODE_DISABLE_FILE_CHECKPOINTING),memoryFiles=React39.use(getMemoryFiles(!0)),shouldShowExternalIncludesToggle=hasExternalClaudeMdIncludes(memoryFiles),autoUpdaterDisabledReason=getAutoUpdaterDisabledReason();function onChangeMainModelConfig(value){logEvent("tengu_config_model_changed",{from_model:mainLoopModel,to_model:value}),setAppState(prev=>({...prev,mainLoopModel:value,mainLoopModelForSession:null})),setChanges(prev=>{let valStr=modelDisplayString(value)+(isBilledAsExtraUsage(value,!1,isOpus1mMergeEnabled())?" \xB7 Billed as extra usage":"");if("model"in prev){let{model,...rest2}=prev;return{...rest2,model:valStr}}return{...prev,model:valStr}})}__name(onChangeMainModelConfig,"onChangeMainModelConfig");function onChangeVerbose(value){saveGlobalConfig(current=>({...current,verbose:value})),setGlobalConfig({...getGlobalConfig(),verbose:value}),setAppState(prev=>({...prev,verbose:value})),setChanges(prev=>{if("verbose"in prev){let{verbose:verbose2,...rest2}=prev;return rest2}return{...prev,verbose:value}})}__name(onChangeVerbose,"onChangeVerbose");let settingsItems=[{id:"autoCompactEnabled",label:"Auto-compact",value:globalConfig2.autoCompactEnabled,type:"boolean",onChange(autoCompactEnabled){saveGlobalConfig(current=>({...current,autoCompactEnabled})),setGlobalConfig({...getGlobalConfig(),autoCompactEnabled}),logEvent("tengu_auto_compact_setting_changed",{enabled:autoCompactEnabled})}},{id:"spinnerTipsEnabled",label:"Show tips",value:settingsData?.spinnerTipsEnabled??!0,type:"boolean",onChange(spinnerTipsEnabled){updateSettingsForSource("localSettings",{spinnerTipsEnabled}),setSettingsData(prev=>({...prev,spinnerTipsEnabled})),logEvent("tengu_tips_setting_changed",{enabled:spinnerTipsEnabled})}},{id:"prefersReducedMotion",label:"Reduce motion",value:settingsData?.prefersReducedMotion??!1,type:"boolean",onChange(prefersReducedMotion){updateSettingsForSource("localSettings",{prefersReducedMotion}),setSettingsData(prev=>({...prev,prefersReducedMotion})),setAppState(prev=>({...prev,settings:{...prev.settings,prefersReducedMotion}})),logEvent("tengu_reduce_motion_setting_changed",{enabled:prefersReducedMotion})}},{id:"thinkingEnabled",label:"Thinking mode",value:thinkingEnabled??!1,type:"boolean",onChange(enabled5){setAppState(prev=>({...prev,thinkingEnabled:enabled5})),updateSettingsForSource("userSettings",{alwaysThinkingEnabled:enabled5?void 0:!1}),logEvent("tengu_thinking_toggled",{enabled:enabled5})}},...isFastModeEnabled()&&isFastModeAvailable()?[{id:"fastMode",label:`Fast mode (${FAST_MODE_MODEL_DISPLAY} only)`,value:!!isFastMode,type:"boolean",onChange(enabled5){clearFastModeCooldown(),updateSettingsForSource("userSettings",{fastMode:enabled5?!0:void 0}),enabled5?(setAppState(prev=>({...prev,mainLoopModel:getFastModeModel(),mainLoopModelForSession:null,fastMode:!0})),setChanges(prev=>({...prev,model:getFastModeModel(),"Fast mode":"ON"}))):(setAppState(prev=>({...prev,fastMode:!1})),setChanges(prev=>({...prev,"Fast mode":"OFF"})))}}]:[],...getFeatureValue_CACHED_MAY_BE_STALE("tengu_chomp_inflection",!1)?[{id:"promptSuggestionEnabled",label:"Prompt suggestions",value:promptSuggestionEnabled,type:"boolean",onChange(enabled5){setAppState(prev=>({...prev,promptSuggestionEnabled:enabled5})),updateSettingsForSource("userSettings",{promptSuggestionEnabled:enabled5?void 0:!1})}}]:[],...isFileCheckpointingAvailable?[{id:"fileCheckpointingEnabled",label:"Rewind code (checkpoints)",value:globalConfig2.fileCheckpointingEnabled,type:"boolean",onChange(enabled5){saveGlobalConfig(current=>({...current,fileCheckpointingEnabled:enabled5})),setGlobalConfig({...getGlobalConfig(),fileCheckpointingEnabled:enabled5}),logEvent("tengu_file_history_snapshots_setting_changed",{enabled:enabled5})}}]:[],{id:"verbose",label:"Verbose output",value:verbose,type:"boolean",onChange:onChangeVerbose},{id:"terminalProgressBarEnabled",label:"Terminal progress bar",value:globalConfig2.terminalProgressBarEnabled,type:"boolean",onChange(terminalProgressBarEnabled){saveGlobalConfig(current=>({...current,terminalProgressBarEnabled})),setGlobalConfig({...getGlobalConfig(),terminalProgressBarEnabled}),logEvent("tengu_terminal_progress_bar_setting_changed",{enabled:terminalProgressBarEnabled})}},...getFeatureValue_CACHED_MAY_BE_STALE("tengu_terminal_sidebar",!1)?[{id:"showStatusInTerminalTab",label:"Show status in terminal tab",value:globalConfig2.showStatusInTerminalTab??!1,type:"boolean",onChange(showStatusInTerminalTab){saveGlobalConfig(current=>({...current,showStatusInTerminalTab})),setGlobalConfig({...getGlobalConfig(),showStatusInTerminalTab}),logEvent("tengu_terminal_tab_status_setting_changed",{enabled:showStatusInTerminalTab})}}]:[],{id:"showTurnDuration",label:"Show turn duration",value:globalConfig2.showTurnDuration,type:"boolean",onChange(showTurnDuration){saveGlobalConfig(current=>({...current,showTurnDuration})),setGlobalConfig({...getGlobalConfig(),showTurnDuration}),logEvent("tengu_show_turn_duration_setting_changed",{enabled:showTurnDuration})}},{id:"showOverviewSidebar",label:"Overview sidebar (wide terminals)",value:globalConfig2.showOverviewSidebar??!0,type:"boolean",onChange(showOverviewSidebar){saveGlobalConfig(current=>({...current,showOverviewSidebar})),setGlobalConfig({...getGlobalConfig(),showOverviewSidebar}),logEvent("tengu_show_overview_sidebar_setting_changed",{enabled:showOverviewSidebar})}},{id:"defaultPermissionMode",label:"Default permission mode",value:settingsData?.permissions?.defaultMode||"default",options:(()=>{let priorityOrder=["default","plan"],allModes=feature("TRANSCRIPT_CLASSIFIER")?PERMISSION_MODES:EXTERNAL_PERMISSION_MODES,excluded=["bypassPermissions","dontAsk"];return showAutoInDefaultModePicker||excluded.push("auto"),[...priorityOrder,...allModes.filter(m3=>!priorityOrder.includes(m3)&&!excluded.includes(m3))]})(),type:"enum",onChange(mode2){let parsedMode=permissionModeFromString(mode2),validatedMode=isExternalPermissionMode(parsedMode)?toExternalPermissionMode(parsedMode):parsedMode,result2=updateSettingsForSource("userSettings",{permissions:{...settingsData?.permissions,defaultMode:validatedMode}});if(result2.error){logError2(result2.error);return}setSettingsData(prev=>({...prev,permissions:{...prev?.permissions,defaultMode:validatedMode}})),setChanges(prev=>({...prev,defaultPermissionMode:mode2})),logEvent("tengu_config_changed",{setting:"defaultPermissionMode",value:mode2})}},...showAutoInDefaultModePicker?[{id:"useAutoModeDuringPlan",label:"Use auto mode during plan",value:settingsData?.useAutoModeDuringPlan??!0,type:"boolean",onChange(useAutoModeDuringPlan){updateSettingsForSource("userSettings",{useAutoModeDuringPlan}),setSettingsData(prev=>({...prev,useAutoModeDuringPlan})),setAppState(prev=>{let next=transitionPlanAutoMode(prev.toolPermissionContext);return next===prev.toolPermissionContext?prev:{...prev,toolPermissionContext:next}}),setChanges(prev=>({...prev,"Use auto mode during plan":useAutoModeDuringPlan}))}}]:[],{id:"respectGitignore",label:"Respect .gitignore in file picker",value:globalConfig2.respectGitignore,type:"boolean",onChange(respectGitignore){saveGlobalConfig(current=>({...current,respectGitignore})),setGlobalConfig({...getGlobalConfig(),respectGitignore}),logEvent("tengu_respect_gitignore_setting_changed",{enabled:respectGitignore})}},{id:"copyFullResponse",label:"Always copy full response (skip /copy picker)",value:globalConfig2.copyFullResponse,type:"boolean",onChange(copyFullResponse){saveGlobalConfig(current=>({...current,copyFullResponse})),setGlobalConfig({...getGlobalConfig(),copyFullResponse}),logEvent("tengu_config_changed",{setting:"copyFullResponse",value:String(copyFullResponse)})}},...isFullscreenEnvEnabled()?[{id:"copyOnSelect",label:"Copy on select",value:globalConfig2.copyOnSelect??!0,type:"boolean",onChange(copyOnSelect){saveGlobalConfig(current=>({...current,copyOnSelect})),setGlobalConfig({...getGlobalConfig(),copyOnSelect}),logEvent("tengu_config_changed",{setting:"copyOnSelect",value:String(copyOnSelect)})}}]:[],autoUpdaterDisabledReason?{id:"autoUpdatesChannel",label:"Auto-update channel",value:"disabled",type:"managedEnum",onChange(){}}:{id:"autoUpdatesChannel",label:"Auto-update channel",value:settingsData?.autoUpdatesChannel??"latest",type:"managedEnum",onChange(){}},{id:"theme",label:"Theme",value:themeSetting,type:"managedEnum",onChange:setTheme},{id:"notifChannel",label:"Notifications",value:globalConfig2.preferredNotifChannel,options:["auto","iterm2","terminal_bell","iterm2_with_bell","kitty","ghostty","notifications_disabled"],type:"enum",onChange(notifChannel){saveGlobalConfig(current=>({...current,preferredNotifChannel:notifChannel})),setGlobalConfig({...getGlobalConfig(),preferredNotifChannel:notifChannel})}},{id:"outputStyle",label:"Output style",value:currentOutputStyle,type:"managedEnum",onChange:__name(()=>{},"onChange")},...showDefaultViewPicker?[{id:"defaultView",label:"What you see by default",value:settingsData?.defaultView===void 0?"default":String(settingsData.defaultView),options:["transcript","chat","default"],type:"enum",onChange(selected){let defaultView=selected==="default"?void 0:selected;updateSettingsForSource("localSettings",{defaultView}),setSettingsData(prev=>({...prev,defaultView}));let nextBrief=defaultView==="chat";setAppState(prev=>prev.isBriefOnly===nextBrief?prev:{...prev,isBriefOnly:nextBrief}),setUserMsgOptIn(nextBrief),setChanges(prev=>({...prev,"Default view":selected})),logEvent("tengu_default_view_setting_changed",{value:defaultView??"unset"})}}]:[],{id:"language",label:"Language",value:currentLanguage??"Default (English)",type:"managedEnum",onChange:__name(()=>{},"onChange")},{id:"editorMode",label:"Editor mode",value:globalConfig2.editorMode==="emacs"?"normal":globalConfig2.editorMode||"normal",options:["normal","vim"],type:"enum",onChange(value){saveGlobalConfig(current=>({...current,editorMode:value})),setGlobalConfig({...getGlobalConfig(),editorMode:value}),logEvent("tengu_editor_mode_changed",{mode:value,source:"config_panel"})}},{id:"prStatusFooterEnabled",label:"Show PR status footer",value:globalConfig2.prStatusFooterEnabled??!0,type:"boolean",onChange(enabled5){saveGlobalConfig(current=>current.prStatusFooterEnabled===enabled5?current:{...current,prStatusFooterEnabled:enabled5}),setGlobalConfig({...getGlobalConfig(),prStatusFooterEnabled:enabled5}),logEvent("tengu_pr_status_footer_setting_changed",{enabled:enabled5})}},{id:"model",label:"Model",value:mainLoopModel===null?"Default (recommended)":mainLoopModel,type:"managedEnum",onChange:onChangeMainModelConfig},...isConnectedToIde?[{id:"diffTool",label:"Diff tool",value:globalConfig2.diffTool??"auto",options:["terminal","auto"],type:"enum",onChange(diffTool){saveGlobalConfig(current=>({...current,diffTool})),setGlobalConfig({...getGlobalConfig(),diffTool}),logEvent("tengu_diff_tool_changed",{tool:diffTool,source:"config_panel"})}}]:[],...isSupportedTerminal()?[]:[{id:"autoConnectIde",label:"Auto-connect to IDE (external terminal)",value:globalConfig2.autoConnectIde??!1,type:"boolean",onChange(autoConnectIde){saveGlobalConfig(current=>({...current,autoConnectIde})),setGlobalConfig({...getGlobalConfig(),autoConnectIde}),logEvent("tengu_auto_connect_ide_changed",{enabled:autoConnectIde,source:"config_panel"})}}],...isSupportedTerminal()?[{id:"autoInstallIdeExtension",label:"Auto-install IDE extension",value:globalConfig2.autoInstallIdeExtension??!0,type:"boolean",onChange(autoInstallIdeExtension){saveGlobalConfig(current=>({...current,autoInstallIdeExtension})),setGlobalConfig({...getGlobalConfig(),autoInstallIdeExtension}),logEvent("tengu_auto_install_ide_extension_changed",{enabled:autoInstallIdeExtension,source:"config_panel"})}}]:[],...isAgentSwarmsEnabled()?(()=>{let cliOverride=getCliTeammateModeOverride();return[{id:"teammateMode",label:cliOverride?`Teammate mode [overridden: ${cliOverride}]`:"Teammate mode",value:globalConfig2.teammateMode??"auto",options:["auto","tmux","in-process"],type:"enum",onChange(mode2){mode2!=="auto"&&mode2!=="tmux"&&mode2!=="in-process"||(clearCliTeammateModeOverride(mode2),saveGlobalConfig(current=>({...current,teammateMode:mode2})),setGlobalConfig({...getGlobalConfig(),teammateMode:mode2}),logEvent("tengu_teammate_mode_changed",{mode:mode2}))}},{id:"teammateDefaultModel",label:"Default teammate model",value:teammateModelDisplayString(globalConfig2.teammateDefaultModel),type:"managedEnum",onChange(){}}]})():[],...shouldShowExternalIncludesToggle?[{id:"showExternalIncludesDialog",label:"External \u0043LAUDE.md includes",value:getCurrentProjectConfig().hasClaudeMdExternalIncludesApproved?"true":"false",type:"managedEnum",onChange(){}}]:[],...process.env.ANTHROPIC_API_KEY&&!isRunningOnHomespace()?[{id:"apiKey",label:(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["Use custom API key:"," ",(0,import_jsx_runtime94.jsx)(ThemedText,{bold:!0,children:normalizeApiKeyForConfig(process.env.ANTHROPIC_API_KEY)})]}),searchText:"Use custom API key",value:!!(process.env.ANTHROPIC_API_KEY&&globalConfig2.customApiKeyResponses?.approved?.includes(normalizeApiKeyForConfig(process.env.ANTHROPIC_API_KEY))),type:"boolean",onChange(useCustomKey){saveGlobalConfig(current=>{let updated={...current};if(updated.customApiKeyResponses||(updated.customApiKeyResponses={approved:[],rejected:[]}),updated.customApiKeyResponses.approved||(updated.customApiKeyResponses={...updated.customApiKeyResponses,approved:[]}),updated.customApiKeyResponses.rejected||(updated.customApiKeyResponses={...updated.customApiKeyResponses,rejected:[]}),process.env.ANTHROPIC_API_KEY){let truncatedKey=normalizeApiKeyForConfig(process.env.ANTHROPIC_API_KEY);useCustomKey?updated.customApiKeyResponses={...updated.customApiKeyResponses,approved:[...(updated.customApiKeyResponses.approved??[]).filter(k2=>k2!==truncatedKey),truncatedKey],rejected:(updated.customApiKeyResponses.rejected??[]).filter(k2=>k2!==truncatedKey)}:updated.customApiKeyResponses={...updated.customApiKeyResponses,approved:(updated.customApiKeyResponses.approved??[]).filter(k2=>k2!==truncatedKey),rejected:[...(updated.customApiKeyResponses.rejected??[]).filter(k2=>k2!==truncatedKey),truncatedKey]}}return updated}),setGlobalConfig(getGlobalConfig())}}]:[]],filteredSettingsItems=React39.useMemo(()=>{if(!searchQuery)return settingsItems;let lowerQuery=searchQuery.toLowerCase();return settingsItems.filter(setting=>setting.id.toLowerCase().includes(lowerQuery)?!0:("searchText"in setting?setting.searchText:setting.label).toLowerCase().includes(lowerQuery))},[settingsItems,searchQuery]);React39.useEffect(()=>{if(selectedIndex>=filteredSettingsItems.length){let newIndex=Math.max(0,filteredSettingsItems.length-1);setSelectedIndex(newIndex),setScrollOffset(Math.max(0,newIndex-maxVisible+1));return}setScrollOffset(prev=>selectedIndex<prev?selectedIndex:selectedIndex>=prev+maxVisible?selectedIndex-maxVisible+1:prev)},[filteredSettingsItems.length,selectedIndex,maxVisible]);let adjustScrollOffset=(0,import_react73.useCallback)(newIndex=>{setScrollOffset(prev=>newIndex<prev?newIndex:newIndex>=prev+maxVisible?newIndex-maxVisible+1:prev)},[maxVisible]),handleSaveAndClose=(0,import_react73.useCallback)(()=>{if(showSubmenu!==null)return;let formattedChanges=Object.entries(changes).map(([key3,value])=>(logEvent("tengu_config_changed",{key:key3,value}),`Set ${key3} to ${source_default.bold(value)}`)),effectiveApiKey=isRunningOnHomespace()?void 0:process.env.ANTHROPIC_API_KEY,initialUsingCustomKey=!!(effectiveApiKey&&initialConfig.current.customApiKeyResponses?.approved?.includes(normalizeApiKeyForConfig(effectiveApiKey))),currentUsingCustomKey=!!(effectiveApiKey&&globalConfig2.customApiKeyResponses?.approved?.includes(normalizeApiKeyForConfig(effectiveApiKey)));if(initialUsingCustomKey!==currentUsingCustomKey&&(formattedChanges.push(`${currentUsingCustomKey?"Enabled":"Disabled"} custom API key`),logEvent("tengu_config_changed",{key:"env.ANTHROPIC_API_KEY",value:currentUsingCustomKey})),globalConfig2.theme!==initialConfig.current.theme&&formattedChanges.push(`Set theme to ${source_default.bold(globalConfig2.theme)}`),globalConfig2.preferredNotifChannel!==initialConfig.current.preferredNotifChannel&&formattedChanges.push(`Set notifications to ${source_default.bold(globalConfig2.preferredNotifChannel)}`),currentOutputStyle!==initialOutputStyle.current&&formattedChanges.push(`Set output style to ${source_default.bold(currentOutputStyle)}`),currentLanguage!==initialLanguage.current&&formattedChanges.push(`Set response language to ${source_default.bold(currentLanguage??"Default (English)")}`),globalConfig2.editorMode!==initialConfig.current.editorMode&&formattedChanges.push(`Set editor mode to ${source_default.bold(globalConfig2.editorMode||"emacs")}`),globalConfig2.diffTool!==initialConfig.current.diffTool&&formattedChanges.push(`Set diff tool to ${source_default.bold(globalConfig2.diffTool)}`),globalConfig2.autoConnectIde!==initialConfig.current.autoConnectIde&&formattedChanges.push(`${globalConfig2.autoConnectIde?"Enabled":"Disabled"} auto-connect to IDE`),globalConfig2.autoInstallIdeExtension!==initialConfig.current.autoInstallIdeExtension&&formattedChanges.push(`${globalConfig2.autoInstallIdeExtension?"Enabled":"Disabled"} auto-install IDE extension`),globalConfig2.autoCompactEnabled!==initialConfig.current.autoCompactEnabled&&formattedChanges.push(`${globalConfig2.autoCompactEnabled?"Enabled":"Disabled"} auto-compact`),globalConfig2.respectGitignore!==initialConfig.current.respectGitignore&&formattedChanges.push(`${globalConfig2.respectGitignore?"Enabled":"Disabled"} respect .gitignore in file picker`),globalConfig2.copyFullResponse!==initialConfig.current.copyFullResponse&&formattedChanges.push(`${globalConfig2.copyFullResponse?"Enabled":"Disabled"} always copy full response`),globalConfig2.copyOnSelect!==initialConfig.current.copyOnSelect&&formattedChanges.push(`${globalConfig2.copyOnSelect?"Enabled":"Disabled"} copy on select`),globalConfig2.terminalProgressBarEnabled!==initialConfig.current.terminalProgressBarEnabled&&formattedChanges.push(`${globalConfig2.terminalProgressBarEnabled?"Enabled":"Disabled"} terminal progress bar`),globalConfig2.showStatusInTerminalTab!==initialConfig.current.showStatusInTerminalTab&&formattedChanges.push(`${globalConfig2.showStatusInTerminalTab?"Enabled":"Disabled"} terminal tab status`),globalConfig2.showTurnDuration!==initialConfig.current.showTurnDuration&&formattedChanges.push(`${globalConfig2.showTurnDuration?"Enabled":"Disabled"} turn duration`),globalConfig2.remoteControlAtStartup!==initialConfig.current.remoteControlAtStartup){let remoteLabel=globalConfig2.remoteControlAtStartup===void 0?"Reset Remote Control to default":`${globalConfig2.remoteControlAtStartup?"Enabled":"Disabled"} Remote Control for all sessions`;formattedChanges.push(remoteLabel)}settingsData?.autoUpdatesChannel!==initialSettingsData.current?.autoUpdatesChannel&&formattedChanges.push(`Set auto-update channel to ${source_default.bold(settingsData?.autoUpdatesChannel??"latest")}`),formattedChanges.length>0?onClose(formattedChanges.join(`
6843
- `)):onClose("Config dialog dismissed",{display:"system"})},[showSubmenu,changes,globalConfig2,mainLoopModel,currentOutputStyle,currentLanguage,settingsData?.autoUpdatesChannel,isFastModeEnabled()?settingsData?.fastMode:void 0,onClose]),revertChanges=(0,import_react73.useCallback)(()=>{themeSetting!==initialThemeSetting.current&&setTheme(initialThemeSetting.current),saveGlobalConfig(()=>initialConfig.current);let il=initialLocalSettings;updateSettingsForSource("localSettings",{spinnerTipsEnabled:il?.spinnerTipsEnabled,prefersReducedMotion:il?.prefersReducedMotion,defaultView:il?.defaultView,outputStyle:il?.outputStyle});let iu=initialUserSettings;updateSettingsForSource("userSettings",{alwaysThinkingEnabled:iu?.alwaysThinkingEnabled,fastMode:iu?.fastMode,promptSuggestionEnabled:iu?.promptSuggestionEnabled,autoUpdatesChannel:iu?.autoUpdatesChannel,minimumVersion:iu?.minimumVersion,language:iu?.language,useAutoModeDuringPlan:iu?.useAutoModeDuringPlan,syntaxHighlightingDisabled:iu?.syntaxHighlightingDisabled,permissions:iu?.permissions===void 0?void 0:{...iu.permissions,defaultMode:iu.permissions.defaultMode}});let ia=initialAppState;setAppState(prev=>({...prev,mainLoopModel:ia.mainLoopModel,mainLoopModelForSession:ia.mainLoopModelForSession,verbose:ia.verbose,thinkingEnabled:ia.thinkingEnabled,fastMode:ia.fastMode,promptSuggestionEnabled:ia.promptSuggestionEnabled,isBriefOnly:ia.isBriefOnly,replBridgeEnabled:ia.replBridgeEnabled,replBridgeOutboundOnly:ia.replBridgeOutboundOnly,settings:ia.settings,toolPermissionContext:transitionPlanAutoMode(prev.toolPermissionContext)})),getUserMsgOptIn3()!==initialUserMsgOptIn&&setUserMsgOptIn(initialUserMsgOptIn)},[themeSetting,setTheme,initialLocalSettings,initialUserSettings,initialAppState,initialUserMsgOptIn,setAppState]),handleEscape=(0,import_react73.useCallback)(()=>{showSubmenu===null&&(isDirty2.current&&revertChanges(),onClose("Config dialog dismissed",{display:"system"}))},[showSubmenu,revertChanges,onClose]);useKeybinding("confirm:no",handleEscape,{context:"Settings",isActive:showSubmenu===null&&!isSearchMode&&!headerFocused}),useKeybinding("settings:close",handleSaveAndClose,{context:"Settings",isActive:showSubmenu===null&&!isSearchMode&&!headerFocused});let toggleSetting=(0,import_react73.useCallback)(()=>{let setting=filteredSettingsItems[selectedIndex];if(!(!setting||!setting.onChange)){if(setting.type==="boolean"){isDirty2.current=!0,setting.onChange(!setting.value),setting.id==="thinkingEnabled"&&(!setting.value===initialThinkingEnabled.current?setShowThinkingWarning(!1):context3.messages.some(m3=>m3.type==="assistant")&&setShowThinkingWarning(!0));return}if(setting.id==="theme"||setting.id==="model"||setting.id==="teammateDefaultModel"||setting.id==="showExternalIncludesDialog"||setting.id==="outputStyle"||setting.id==="language")switch(setting.id){case"theme":setShowSubmenu("Theme"),setTabsHidden(!0);return;case"model":setShowSubmenu("Model"),setTabsHidden(!0);return;case"teammateDefaultModel":setShowSubmenu("TeammateModel"),setTabsHidden(!0);return;case"showExternalIncludesDialog":setShowSubmenu("ExternalIncludes"),setTabsHidden(!0);return;case"outputStyle":setShowSubmenu("OutputStyle"),setTabsHidden(!0);return;case"language":setShowSubmenu("Language"),setTabsHidden(!0);return}if(setting.id==="autoUpdatesChannel"){if(autoUpdaterDisabledReason){setShowSubmenu("EnableAutoUpdates"),setTabsHidden(!0);return}(settingsData?.autoUpdatesChannel??"latest")==="latest"?(setShowSubmenu("ChannelDowngrade"),setTabsHidden(!0)):(isDirty2.current=!0,updateSettingsForSource("userSettings",{autoUpdatesChannel:"latest",minimumVersion:void 0}),setSettingsData(prev=>({...prev,autoUpdatesChannel:"latest",minimumVersion:void 0})),logEvent("tengu_autoupdate_channel_changed",{channel:"latest"}));return}if(setting.type==="enum"){isDirty2.current=!0;let nextIndex=(setting.options.indexOf(setting.value)+1)%setting.options.length;setting.onChange(setting.options[nextIndex]);return}}},[autoUpdaterDisabledReason,filteredSettingsItems,selectedIndex,settingsData?.autoUpdatesChannel,setTabsHidden]),moveSelection=__name(delta=>{setShowThinkingWarning(!1);let newIndex=Math.max(0,Math.min(filteredSettingsItems.length-1,selectedIndex+delta));setSelectedIndex(newIndex),adjustScrollOffset(newIndex)},"moveSelection");useKeybindings({"select:previous":__name(()=>{selectedIndex===0?(setShowThinkingWarning(!1),setIsSearchMode(!0),setScrollOffset(0)):moveSelection(-1)},"select:previous"),"select:next":__name(()=>moveSelection(1),"select:next"),"scroll:lineUp":__name(()=>moveSelection(-1),"scroll:lineUp"),"scroll:lineDown":__name(()=>moveSelection(1),"scroll:lineDown"),"select:accept":toggleSetting,"settings:search":__name(()=>{setIsSearchMode(!0),setSearchQuery("")},"settings:search")},{context:"Settings",isActive:showSubmenu===null&&!isSearchMode&&!headerFocused});let handleKeyDown=(0,import_react73.useCallback)(e2=>{if(showSubmenu===null&&!headerFocused){if(isSearchMode){if(e2.key==="escape"){e2.preventDefault(),searchQuery.length>0?setSearchQuery(""):setIsSearchMode(!1);return}(e2.key==="return"||e2.key==="down"||e2.key==="wheeldown")&&(e2.preventDefault(),setIsSearchMode(!1),setSelectedIndex(0),setScrollOffset(0));return}if(e2.key==="left"||e2.key==="right"||e2.key==="tab"){e2.preventDefault(),toggleSetting();return}e2.ctrl||e2.meta||e2.key==="j"||e2.key==="k"||e2.key==="/"||e2.key.length===1&&e2.key!==" "&&(e2.preventDefault(),setIsSearchMode(!0),setSearchQuery(e2.key))}},[showSubmenu,headerFocused,isSearchMode,searchQuery,setSearchQuery,toggleSetting]);return(0,import_jsx_runtime94.jsx)(ThemedBox_default,{flexDirection:"column",width:"100%",tabIndex:0,autoFocus:!0,onKeyDown:handleKeyDown,children:showSubmenu==="Theme"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ThemePicker,{onThemeSelect:setting=>{isDirty2.current=!0,setTheme(setting),setShowSubmenu(null),setTabsHidden(!1)},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)},hideEscToCancel:!0,skipExitHandling:!0}),(0,import_jsx_runtime94.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,italic:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"select"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]})})})]}):showSubmenu==="Model"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ModelPicker,{initial:mainLoopModel,onSelect:(model,_effort)=>{isDirty2.current=!0,onChangeMainModelConfig(model),setShowSubmenu(null),setTabsHidden(!1)},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)},showFastModeNotice:isFastModeEnabled()?isFastMode&&isFastModeSupportedByModel(mainLoopModel)&&isFastModeAvailable():!1}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]})})]}):showSubmenu==="TeammateModel"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ModelPicker,{initial:globalConfig2.teammateDefaultModel??null,skipSettingsWrite:!0,headerText:"Default model for newly spawned teammates. The leader can override via the tool call's model parameter.",onSelect:(model,_effort)=>{setShowSubmenu(null),setTabsHidden(!1),!(globalConfig2.teammateDefaultModel===void 0&&model===null)&&(isDirty2.current=!0,saveGlobalConfig(current=>current.teammateDefaultModel===model?current:{...current,teammateDefaultModel:model}),setGlobalConfig({...getGlobalConfig(),teammateDefaultModel:model}),setChanges(prev=>({...prev,teammateDefaultModel:teammateModelDisplayString(model)})),logEvent("tengu_teammate_default_model_changed",{model}))},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)}}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]})})]}):showSubmenu==="ExternalIncludes"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ClaudeMdExternalIncludesDialog,{onDone:()=>{setShowSubmenu(null),setTabsHidden(!1)},externalIncludes:getExternalClaudeMdIncludes(memoryFiles)}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"disable external includes"})]})})]}):showSubmenu==="OutputStyle"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(OutputStylePicker,{initialStyle:currentOutputStyle,onComplete:style=>{isDirty2.current=!0,setCurrentOutputStyle(style??DEFAULT_OUTPUT_STYLE_NAME),setShowSubmenu(null),setTabsHidden(!1),updateSettingsForSource("localSettings",{outputStyle:style}),logEvent("tengu_output_style_changed",{style:style??DEFAULT_OUTPUT_STYLE_NAME,source:"config_panel",settings_source:"localSettings"})},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)}}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]})})]}):showSubmenu==="Language"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(LanguagePicker,{initialLanguage:currentLanguage,onComplete:language=>{isDirty2.current=!0,setCurrentLanguage(language),setShowSubmenu(null),setTabsHidden(!1),updateSettingsForSource("userSettings",{language}),logEvent("tengu_language_changed",{language:language??"default",source:"config_panel"})},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)}}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})]})})]}):showSubmenu==="EnableAutoUpdates"?(0,import_jsx_runtime94.jsx)(Dialog,{title:"Enable Auto-Updates",onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)},hideBorder:!0,hideInputGuide:!0,children:autoUpdaterDisabledReason?.type!=="config"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ThemedText,{children:autoUpdaterDisabledReason?.type==="env"?"Auto-updates are controlled by an environment variable and cannot be changed here.":"Auto-updates are disabled in development builds."}),autoUpdaterDisabledReason?.type==="env"&&(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,children:["Unset ",autoUpdaterDisabledReason.envVar," to re-enable auto-updates."]})]}):(0,import_jsx_runtime94.jsx)(Select,{options:[{label:"Enable with latest channel",value:"latest"},{label:"Enable with stable channel",value:"stable"}],onChange:channel=>{isDirty2.current=!0,setShowSubmenu(null),setTabsHidden(!1),saveGlobalConfig(current=>({...current,autoUpdates:!0})),setGlobalConfig({...getGlobalConfig(),autoUpdates:!0}),updateSettingsForSource("userSettings",{autoUpdatesChannel:channel,minimumVersion:void 0}),setSettingsData(prev=>({...prev,autoUpdatesChannel:channel,minimumVersion:void 0})),logEvent("tengu_autoupdate_enabled",{channel})}})}):showSubmenu==="ChannelDowngrade"?(0,import_jsx_runtime94.jsx)(ChannelDowngradeDialog,{currentVersion:"13.9.1",onChoice:choice=>{if(setShowSubmenu(null),setTabsHidden(!1),choice==="cancel")return;isDirty2.current=!0;let newSettings={autoUpdatesChannel:"stable"};choice==="stay"&&(newSettings.minimumVersion="13.9.1"),updateSettingsForSource("userSettings",newSettings),setSettingsData(prev=>({...prev,...newSettings})),logEvent("tengu_autoupdate_channel_changed",{channel:"stable",minimum_version_set:choice==="stay"})}}):(0,import_jsx_runtime94.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,marginY:insideModal?void 0:1,children:[(0,import_jsx_runtime94.jsx)(SearchBox,{query:searchQuery,isFocused:isSearchMode&&!headerFocused,isTerminalFocused,cursorOffset:searchCursorOffset,placeholder:"Search settings\u2026"}),(0,import_jsx_runtime94.jsx)(ThemedBox_default,{flexDirection:"column",children:filteredSettingsItems.length===0?(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,italic:!0,children:['No settings match "',searchQuery,'"']}):(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[scrollOffset>0&&(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,children:[figures_default.arrowUp," ",scrollOffset," more above"]}),filteredSettingsItems.slice(scrollOffset,scrollOffset+maxVisible).map((setting,i3)=>{let isSelected=scrollOffset+i3===selectedIndex&&!headerFocused&&!isSearchMode;return(0,import_jsx_runtime94.jsx)(React39.Fragment,{children:(0,import_jsx_runtime94.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime94.jsx)(ThemedBox_default,{width:44,children:(0,import_jsx_runtime94.jsxs)(ThemedText,{color:isSelected?"suggestion":void 0,children:[isSelected?figures_default.pointer:" "," ",setting.label]})}),(0,import_jsx_runtime94.jsx)(ThemedBox_default,{children:setting.type==="boolean"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:setting.value.toString()}),showThinkingWarning&&setting.id==="thinkingEnabled"&&(0,import_jsx_runtime94.jsxs)(ThemedText,{color:"warning",children:[" ","Changing thinking mode mid-conversation will increase latency and may reduce quality."]})]}):setting.id==="theme"?(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:THEME_LABELS[setting.value.toString()]??setting.value.toString()}):setting.id==="notifChannel"?(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:(0,import_jsx_runtime94.jsx)(NotifChannelLabel,{value:setting.value.toString()})}):setting.id==="defaultPermissionMode"?(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:permissionModeTitle(setting.value)}):setting.id==="autoUpdatesChannel"&&autoUpdaterDisabledReason?(0,import_jsx_runtime94.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:"disabled"}),(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,children:["(",formatAutoUpdaterDisabledReason(autoUpdaterDisabledReason),")"]})]}):(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:setting.value.toString()})},isSelected?"selected":"unselected")]})},setting.id)}),scrollOffset+maxVisible<filteredSettingsItems.length&&(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,children:[figures_default.arrowDown," ",filteredSettingsItems.length-scrollOffset-maxVisible," ","more below"]})]})}),headerFocused?(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"\u2190/\u2192 tab",action:"switch"}),(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"\u2193",action:"return"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"close"})]})}):isSearchMode?(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(ThemedText,{children:"Type to filter"}),(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter/\u2193",action:"select"}),(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"\u2191",action:"tabs"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"clear"})]})}):(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"select:accept",context:"Settings",fallback:"Space",description:"change"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"settings:close",context:"Settings",fallback:"Enter",description:"save"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"settings:search",context:"Settings",fallback:"/",description:"search"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})]})})]})})}function teammateModelDisplayString(value){return value===void 0?modelDisplayString(getHardcodedTeammateModelFallback()):value===null?"Default (leader's model)":modelDisplayString(value)}function NotifChannelLabel({value}){switch(value){case"auto":return"Auto";case"iterm2":return(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["iTerm2 ",(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:"(OSC 9)"})]});case"terminal_bell":return(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["Terminal Bell ",(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:"(\\a)"})]});case"kitty":return(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["Kitty ",(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:"(OSC 99)"})]});case"ghostty":return(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["Ghostty ",(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:"(OSC 777)"})]});case"iterm2_with_bell":return"iTerm2 w/ Bell";case"notifications_disabled":return"Disabled";default:return value}}var React39,import_react73,import_jsx_runtime94,THEME_LABELS,init_Config=__esm({"src/components/Settings/Config.tsx"(){init_featureFlags();init_ink();React39=__toESM(require_react()),import_react73=__toESM(require_react());init_useKeybinding();init_figures();init_config12();init_authPortable();init_config12();init_source();init_PermissionMode();init_permissionSetup();init_log3();init_analytics();init_bridgeEnabled();init_ThemePicker();init_AppState();init_ModelPicker();init_model();init_extraUsage();init_ClaudeMdExternalIncludesDialog();init_ChannelDowngradeDialog();init_Dialog();init_CustomSelect();init_OutputStylePicker();init_LanguagePicker();init_claudemd();init_KeyboardShortcutHint();init_ConfigurableShortcutHint();init_Byline();init_Tabs();init_modalContext();init_SearchBox();init_ide();init_settings2();init_state();init_outputStyles();init_envUtils();init_growthbook();init_agentSwarmsEnabled();init_teammateModeSnapshot();init_teammateModel();init_useSearchInput();init_useTerminalSize();init_fastMode();init_fullscreen();import_jsx_runtime94=__toESM(require_jsx_runtime());__name(Config,"Config");__name(teammateModelDisplayString,"teammateModelDisplayString");THEME_LABELS={auto:"Auto (match terminal)",dark:"Dark mode",light:"Light mode","dark-daltonized":"Dark mode (colorblind-friendly)","light-daltonized":"Light mode (colorblind-friendly)","dark-ansi":"Dark mode (ANSI colors only)","light-ansi":"Light mode (ANSI colors only)"};__name(NotifChannelLabel,"NotifChannelLabel")}});async function fetchUtilization(){if(!isClaudeAISubscriber()||!hasProfileScope())return{};let tokens=getClaudeAIOAuthTokens();if(tokens&&isOAuthTokenExpired(tokens.expiresAt))return null;let authResult=getAuthHeaders();if(authResult.error)throw new Error(`Auth error: ${authResult.error}`);let headers={"Content-Type":"application/json","User-Agent":getClaudeCodeUserAgent(),...authResult.headers},url3=`${getOauthConfig().BASE_API_URL}/api/oauth/usage`;return(await axios_default.get(url3,{headers,timeout:5e3})).data}var init_usage=__esm({"src/services/api/usage.ts"(){init_axios2();init_oauth();init_auth();init_http2();init_userAgent();init_client2();__name(fetchUtilization,"fetchUtilization")}});function ProgressBar({ratio:inputRatio,width,fillColor,emptyColor}){let ratio=Math.min(1,Math.max(0,inputRatio)),whole=Math.floor(ratio*width),segments=[BLOCKS[BLOCKS.length-1].repeat(whole)];if(whole<width){let remainder=ratio*width-whole,middle=Math.floor(remainder*BLOCKS.length);segments.push(BLOCKS[middle]);let empty=width-whole-1;empty>0&&segments.push(BLOCKS[0].repeat(empty))}return(0,import_jsx_runtime95.jsx)(ThemedText,{color:fillColor,backgroundColor:emptyColor,children:segments.join("")})}var import_jsx_runtime95,BLOCKS,init_ProgressBar=__esm({"src/components/design-system/ProgressBar.tsx"(){init_ink();import_jsx_runtime95=__toESM(require_jsx_runtime()),BLOCKS=[" ","\u258F","\u258E","\u258D","\u258C","\u258B","\u258A","\u2589","\u2588"];__name(ProgressBar,"ProgressBar")}});function LimitBar({title,limit,maxWidth,showTimeInReset=!0,extraSubtext}){let{utilization,resets_at}=limit;if(utilization===null)return null;let usedText=`${Math.floor(utilization)}% used`,subtext;resets_at&&(subtext=`Resets ${formatResetText(resets_at,!0,showTimeInReset)}`),extraSubtext&&(subtext?subtext=`${extraSubtext} \xB7 ${subtext}`:subtext=extraSubtext);let maxBarWidth=50;return maxWidth>=maxBarWidth+12?(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:title}),(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"row",gap:1,children:[(0,import_jsx_runtime96.jsx)(ProgressBar,{ratio:utilization/100,width:maxBarWidth,fillColor:"rate_limit_fill",emptyColor:"rate_limit_empty"}),(0,import_jsx_runtime96.jsx)(ThemedText,{children:usedText})]}),subtext&&(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:subtext})]}):(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsxs)(ThemedText,{children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:title}),subtext&&(0,import_jsx_runtime96.jsxs)(import_jsx_runtime96.Fragment,{children:[(0,import_jsx_runtime96.jsx)(ThemedText,{children:" "}),(0,import_jsx_runtime96.jsxs)(ThemedText,{dimColor:!0,children:["\xB7 ",subtext]})]})]}),(0,import_jsx_runtime96.jsx)(ProgressBar,{ratio:utilization/100,width:maxWidth,fillColor:"rate_limit_fill",emptyColor:"rate_limit_empty"}),(0,import_jsx_runtime96.jsx)(ThemedText,{children:usedText})]})}function Usage(){let[utilization,setUtilization]=(0,import_react74.useState)(null),[efficiencySummary,setEfficiencySummary]=(0,import_react74.useState)(null),[skillSelectionSummary,setSkillSelectionSummary]=(0,import_react74.useState)(null),[error40,setError]=(0,import_react74.useState)(null),[isLoading,setIsLoading]=(0,import_react74.useState)(!0),{columns}=useTerminalSize(),availableWidth=columns-2,maxWidth=Math.min(availableWidth,80),loadUtilization=React40.useCallback(async()=>{setIsLoading(!0),setError(null);try{let data=await fetchUtilization();setUtilization(data),setEfficiencySummary(getRecentEfficiencyLedgerSummary()),setSkillSelectionSummary(getRecentSkillSelectionSummary())}catch(err2){logError2(err2);let axiosError=err2,responseBody=axiosError.response?.data?jsonStringify(axiosError.response.data):void 0;setError(responseBody?`Failed to load usage data: ${responseBody}`:"Failed to load usage data")}finally{setIsLoading(!1)}},[]);if((0,import_react74.useEffect)(()=>{loadUtilization()},[loadUtilization]),useKeybinding("settings:retry",()=>{loadUtilization()},{context:"Settings",isActive:!!error40&&!isLoading}),error40)return(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime96.jsxs)(ThemedText,{color:"error",children:["Error: ",error40]}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime96.jsxs)(Byline,{children:[(0,import_jsx_runtime96.jsx)(ConfigurableShortcutHint,{action:"settings:retry",context:"Settings",fallback:"r",description:"retry"}),(0,import_jsx_runtime96.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})]})})]});if(!utilization)return(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:"Loading usage data\u2026"}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime96.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})})]});let subscriptionType=getSubscriptionType(),showSonnetBar=subscriptionType==="max"||subscriptionType==="team"||subscriptionType===null,limits=[{title:"Current session",limit:utilization.five_hour},{title:"Current week (all models)",limit:utilization.seven_day},...showSonnetBar?[{title:"Current week (Sonnet only)",limit:utilization.seven_day_sonnet}]:[]];return(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,width:"100%",children:[limits.some(({limit})=>limit)||(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:"/usage is only available for subscription plans."}),limits.map(({title,limit})=>limit&&(0,import_jsx_runtime96.jsx)(LimitBar,{title,limit,maxWidth},title)),utilization.extra_usage&&(0,import_jsx_runtime96.jsx)(ExtraUsageSection,{extraUsage:utilization.extra_usage,maxWidth}),efficiencySummary&&(0,import_jsx_runtime96.jsx)(LightweightShareSection,{summary:efficiencySummary}),skillSelectionSummary&&(0,import_jsx_runtime96.jsx)(SkillSelectionSection,{summary:skillSelectionSummary}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime96.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})})]})}function formatLightweightShare(summary){let{routeSlotBreakdown}=summary,trackedSamples=Object.values(routeSlotBreakdown).reduce((total,count4)=>total+count4,0);if(trackedSamples===0)return null;let smallFastSamples=routeSlotBreakdown.smallFast,helperSamples=smallFastSamples+routeSlotBreakdown.general,smallFastShare=Math.round(smallFastSamples/trackedSamples*100),helperShare=Math.round(helperSamples/trackedSamples*100),lightweightStats=summary.routeSlotStats.smallFast,lightweightConcurrency=summary.routeSlotConcurrency?.smallFast,statsText=lightweightStats.sampleCount>0?` \xB7 smallFast cache hit ${Math.round(lightweightStats.avgCacheHitRate*100)}% \xB7 avg latency ${lightweightStats.avgDurationMs}ms`:"",concurrencyText=lightweightConcurrency&&lightweightConcurrency.sampleCount>0?` \xB7 avg in-flight ${lightweightConcurrency.avgInFlightAtStart} \xB7 max in-flight ${lightweightConcurrency.maxInFlightAtStart}`:"";return`Lightweight helper routes: ${helperShare}% (${helperSamples}/${trackedSamples} recent calls) \xB7 smallFast ${smallFastShare}% (${smallFastSamples}/${trackedSamples})${statsText}${concurrencyText}`}function LightweightShareSection({summary}){let formatted=formatLightweightShare(summary);return formatted?(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:"Model routing efficiency"}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:formatted})]}):null}function formatSkillSelectionSummary(summary){if(summary.recent.length===0)return null;let latest=summary.recent[0];if(!latest)return null;let modelCountText=Object.entries(summary.modelBreakdown).map(([model,count4])=>`${model} ${count4}`).join(", "),visibilityText=`${summary.skillToolVisibleCount}/${summary.recent.length} visible`,missingText=summary.missingCommandCount>0?` \xB7 ${summary.missingCommandCount} missing command`:"";return`Skill selections: ${summary.recent.length} recent \xB7 latest /${latest.skillName} on ${latest.mainLoopModel} \xB7 Skill tool ${visibilityText}${missingText}${modelCountText?` \xB7 models ${modelCountText}`:""}`}function SkillSelectionSection({summary}){let formatted=formatSkillSelectionSummary(summary);return formatted?(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:"Skill selection diagnostics"}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:formatted})]}):null}function ExtraUsageSection({extraUsage,maxWidth}){let subscriptionType=getSubscriptionType();if(!(subscriptionType==="pro"||subscriptionType==="max"))return!1;if(!extraUsage.is_enabled)return isOverageProvisioningAllowedForCommandFiltering()?(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:EXTRA_USAGE_SECTION_TITLE}),(0,import_jsx_runtime96.jsxs)(ThemedText,{dimColor:!0,children:["\u989D\u5916\u7528\u91CF\u672A\u5F00\u542F \xB7 ",PROVIDER_SWITCH_HINT]})]}):null;if(extraUsage.monthly_limit===null)return(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:EXTRA_USAGE_SECTION_TITLE}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:"Unlimited"})]});if(typeof extraUsage.used_credits!="number"||typeof extraUsage.utilization!="number")return null;let formattedUsedCredits=formatCost(extraUsage.used_credits/100,2),formattedMonthlyLimit=formatCost(extraUsage.monthly_limit/100,2),now3=new Date,oneMonthReset=new Date(now3.getFullYear(),now3.getMonth()+1,1);return(0,import_jsx_runtime96.jsx)(LimitBar,{title:EXTRA_USAGE_SECTION_TITLE,limit:{utilization:extraUsage.utilization,resets_at:oneMonthReset.toISOString()},showTimeInReset:!1,extraSubtext:`${formattedUsedCredits} / ${formattedMonthlyLimit} spent`,maxWidth})}var React40,import_react74,import_jsx_runtime96,EXTRA_USAGE_SECTION_TITLE,init_Usage=__esm({"src/components/Settings/Usage.tsx"(){React40=__toESM(require_react()),import_react74=__toESM(require_react());init_cost_tracker();init_auth();init_useTerminalSize();init_ink();init_useKeybinding();init_efficiencyLedger();init_skillSelectionTelemetry();init_usage();init_format2();init_log3();init_slowOperations();init_ConfigurableShortcutHint();init_Byline();init_ProgressBar();init_product();import_jsx_runtime96=__toESM(require_jsx_runtime());__name(LimitBar,"LimitBar");__name(Usage,"Usage");__name(formatLightweightShare,"formatLightweightShare");__name(LightweightShareSection,"LightweightShareSection");__name(formatSkillSelectionSummary,"formatSkillSelectionSummary");__name(SkillSelectionSection,"SkillSelectionSection");EXTRA_USAGE_SECTION_TITLE="Extra usage";__name(ExtraUsageSection,"ExtraUsageSection")}});function Settings({onClose,context:context3,defaultTab}){let[selectedTab,setSelectedTab]=(0,import_react75.useState)(defaultTab),[tabsHidden,setTabsHidden]=(0,import_react75.useState)(!1),[configOwnsEsc,setConfigOwnsEsc]=(0,import_react75.useState)(!1),[gatesOwnsEsc,setGatesOwnsEsc]=(0,import_react75.useState)(!1),insideModal=useIsInsideModal(),{rows}=useModalOrTerminalSize(useTerminalSize()),contentHeight=insideModal?rows+1:Math.max(15,Math.min(Math.floor(rows*.8),30)),[diagnosticsPromise]=(0,import_react75.useState)(()=>buildDiagnostics().catch(()=>[]));useExitOnCtrlCDWithKeybindings(),useKeybinding("confirm:no",__name(()=>{tabsHidden||onClose("Status dialog dismissed",{display:"system"})},"handleEscape"),{context:"Settings",isActive:!tabsHidden&&!(selectedTab==="Config"&&configOwnsEsc)&&!(selectedTab==="Gates"&&gatesOwnsEsc)});let Gates=__name(_props=>null,"Gates");return(0,import_jsx_runtime97.jsx)(Pane,{color:"permission",children:(0,import_jsx_runtime97.jsx)(Tabs,{color:"permission",selectedTab,onTabChange:setSelectedTab,hidden:tabsHidden,initialHeaderFocused:defaultTab!=="Config"&&defaultTab!=="Gates",contentHeight:tabsHidden||insideModal?void 0:contentHeight,children:[(0,import_jsx_runtime97.jsx)(Tab,{title:"Status",children:(0,import_jsx_runtime97.jsx)(Status,{context:context3,diagnosticsPromise})},"status"),(0,import_jsx_runtime97.jsx)(Tab,{title:"Config",children:(0,import_jsx_runtime97.jsx)(import_react75.Suspense,{fallback:null,children:(0,import_jsx_runtime97.jsx)(Config,{context:context3,onClose,setTabsHidden,onIsSearchModeChange:setConfigOwnsEsc,contentHeight})})},"config"),(0,import_jsx_runtime97.jsx)(Tab,{title:"Usage",children:(0,import_jsx_runtime97.jsx)(Usage,{})},"usage")]})})}var import_react75,import_jsx_runtime97,init_Settings=__esm({"src/components/Settings/Settings.tsx"(){import_react75=__toESM(require_react());init_useKeybinding();init_useExitOnCtrlCDWithKeybindings();init_useTerminalSize();init_modalContext();init_Pane();init_Tabs();init_Status();init_Config();init_Usage();import_jsx_runtime97=__toESM(require_jsx_runtime());__name(Settings,"Settings")}});var config_exports3={};__export(config_exports3,{call:()=>call22});var import_jsx_runtime98,call22,init_config10=__esm({"src/commands/config/config.tsx"(){init_Settings();import_jsx_runtime98=__toESM(require_jsx_runtime()),call22=__name(async(onDone,context3)=>(0,import_jsx_runtime98.jsx)(Settings,{onClose:onDone,context:context3,defaultTab:"Config"}),"call")}});var config2,config_default,init_config11=__esm({"src/commands/config/index.ts"(){config2={aliases:["settings"],type:"local-jsx",name:"config",description:"Open config panel",load:__name(()=>Promise.resolve().then(()=>(init_config10(),config_exports3)),"load")},config_default=config2}});function generateContextSuggestions(data){let suggestions=[];return checkNearCapacity(data,suggestions),checkLargeToolResults(data,suggestions),checkReadResultBloat(data,suggestions),checkMemoryBloat(data,suggestions),checkAutoCompactDisabled(data,suggestions),suggestions.sort((a2,b3)=>a2.severity!==b3.severity?a2.severity==="warning"?-1:1:(b3.savingsTokens??0)-(a2.savingsTokens??0)),suggestions}function checkNearCapacity(data,suggestions){let isZh7=resolveUiLocale()==="zh-CN";data.percentage>=NEAR_CAPACITY_PERCENT&&suggestions.push({severity:"warning",title:isZh7?`\u4E0A\u4E0B\u6587\u5DF2\u7528 ${data.percentage}%`:`Context is ${data.percentage}% full`,detail:data.isAutoCompactEnabled?isZh7?"\u5373\u5C06\u81EA\u52A8\u538B\u7F29(\u4F1A\u4E22\u5F03\u8F83\u65E9\u7684\u6D88\u606F)\u3002\u53EF\u7ACB\u5373\u8FD0\u884C /compact \u81EA\u884C\u9009\u62E9\u4FDD\u7559\u5185\u5BB9\u3002":"Autocompact will trigger soon, which discards older messages. Use /compact now to control what gets kept.":isZh7?"\u81EA\u52A8\u538B\u7F29\u5DF2\u5173\u95ED\u3002\u8FD0\u884C /compact \u91CA\u653E\u7A7A\u95F4,\u6216\u5728 /config \u4E2D\u5F00\u542F\u81EA\u52A8\u538B\u7F29\u3002":"Autocompact is disabled. Use /compact to free space, or enable autocompact in /config."})}function checkLargeToolResults(data,suggestions){if(data.messageBreakdown)for(let tool of data.messageBreakdown.toolCallsByType){let totalToolTokens=tool.callTokens+tool.resultTokens,percent=totalToolTokens/data.rawMaxTokens*100;if(percent<LARGE_TOOL_RESULT_PERCENT||totalToolTokens<LARGE_TOOL_RESULT_TOKENS)continue;let suggestion=getLargeToolSuggestion(tool.name,totalToolTokens,percent);suggestion&&suggestions.push(suggestion)}}function getLargeToolSuggestion(toolName4,tokens,percent){let isZh7=resolveUiLocale()==="zh-CN",tokenStr=formatTokens(tokens),tokenWord=isZh7?"\u8BCD\u5143":"tokens";switch(toolName4){case BASH_TOOL_NAME:return{severity:"warning",title:isZh7?`Bash \u7ED3\u679C\u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`Bash results using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u628A\u8F93\u51FA\u901A\u8FC7 head/tail/grep \u622A\u53D6\u4EE5\u7F29\u5C0F\u7ED3\u679C\u3002\u8BFB\u5927\u6587\u4EF6\u8BF7\u7528 Read \u52A0 offset/limit,\u522B cat \u6574\u4E2A\u6587\u4EF6\u3002":"Pipe output through head, tail, or grep to reduce result size. Avoid cat on large files \u2014 use Read with offset/limit instead.",savingsTokens:Math.floor(tokens*.5)};case FILE_READ_TOOL_NAME:return{severity:"info",title:isZh7?`Read \u7ED3\u679C\u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`Read results using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u4F7F\u7528 offset \u548C limit \u53EA\u8BFB\u53D6\u9700\u8981\u7684\u7247\u6BB5\u3002\u53EA\u770B\u51E0\u884C\u65F6\u4E0D\u8981\u91CD\u590D\u8BFB\u6574\u6587\u4EF6\u3002":"Use offset and limit parameters to read only the sections you need. Avoid re-reading entire files when you only need a few lines.",savingsTokens:Math.floor(tokens*.3)};case GREP_TOOL_NAME:return{severity:"info",title:isZh7?`Grep \u7ED3\u679C\u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`Grep results using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u6536\u7D27\u5339\u914D\u6A21\u5F0F,\u6216\u7528 glob/type \u9650\u5B9A\u6587\u4EF6\u7C7B\u578B\u3002\u5982\u679C\u53EA\u662F\u627E\u6587\u4EF6,Glob \u901A\u5E38\u6BD4 Grep \u66F4\u7701\u3002":"Add more specific patterns or use the glob or type parameter to narrow file types. Consider Glob for file discovery instead of Grep.",savingsTokens:Math.floor(tokens*.3)};case WEB_FETCH_TOOL_NAME:return{severity:"info",title:isZh7?`WebFetch \u7ED3\u679C\u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`WebFetch results using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u7F51\u9875\u5185\u5BB9\u5F80\u5F80\u5F88\u5927,\u53EA\u62BD\u53D6\u771F\u6B63\u9700\u8981\u7684\u5B57\u6BB5\u5373\u53EF\u3002":"Web page content can be very large. Consider extracting only the specific information needed.",savingsTokens:Math.floor(tokens*.4)};default:return percent>=20?{severity:"info",title:isZh7?`${toolName4} \u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`${toolName4} using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u8BE5\u5DE5\u5177\u6D88\u8017\u4E86\u8F83\u5927\u6BD4\u4F8B\u7684\u4E0A\u4E0B\u6587\u3002":"This tool is consuming a significant portion of context.",savingsTokens:Math.floor(tokens*.2)}:null}}function checkReadResultBloat(data,suggestions){let isZh7=resolveUiLocale()==="zh-CN",tokenWord=isZh7?"\u8BCD\u5143":"tokens";if(!data.messageBreakdown)return;let readTool=data.messageBreakdown.toolCallsByType.find(t7=>t7.name===FILE_READ_TOOL_NAME);if(!readTool)return;let totalReadTokens=readTool.callTokens+readTool.resultTokens,totalReadPercent=totalReadTokens/data.rawMaxTokens*100,readPercent=readTool.resultTokens/data.rawMaxTokens*100;totalReadPercent>=LARGE_TOOL_RESULT_PERCENT&&totalReadTokens>=LARGE_TOOL_RESULT_TOKENS||readPercent>=READ_BLOAT_PERCENT&&readTool.resultTokens>=LARGE_TOOL_RESULT_TOKENS&&suggestions.push({severity:"info",title:isZh7?`\u6587\u4EF6\u8BFB\u53D6\u5360\u7528 ${formatTokens(readTool.resultTokens)} ${tokenWord} (${readPercent.toFixed(0)}%)`:`File reads using ${formatTokens(readTool.resultTokens)} tokens (${readPercent.toFixed(0)}%)`,detail:isZh7?"\u5982\u679C\u5728\u91CD\u590D\u8BFB\u540C\u4E00\u6587\u4EF6,\u53EF\u5F15\u7528\u4E4B\u524D\u7684\u7ED3\u679C\u3002\u8BFB\u5927\u6587\u4EF6\u7528 offset/limit\u3002":"If you are re-reading files, consider referencing earlier reads. Use offset/limit for large files.",savingsTokens:Math.floor(readTool.resultTokens*.3)})}function checkMemoryBloat(data,suggestions){let isZh7=resolveUiLocale()==="zh-CN",tokenWord=isZh7?"\u8BCD\u5143":"tokens",totalMemoryTokens=data.memoryFiles.reduce((sum2,f3)=>sum2+f3.tokens,0),memoryPercent=totalMemoryTokens/data.rawMaxTokens*100;if(memoryPercent>=MEMORY_HIGH_PERCENT&&totalMemoryTokens>=MEMORY_HIGH_TOKENS){let largestFiles=[...data.memoryFiles].sort((a2,b3)=>b3.tokens-a2.tokens).slice(0,3).map(f3=>`${getDisplayPath(f3.path)} (${formatTokens(f3.tokens)})`).join(", ");suggestions.push({severity:"info",title:isZh7?`\u8BB0\u5FC6\u6587\u4EF6\u5360\u7528 ${formatTokens(totalMemoryTokens)} ${tokenWord} (${memoryPercent.toFixed(0)}%)`:`Memory files using ${formatTokens(totalMemoryTokens)} tokens (${memoryPercent.toFixed(0)}%)`,detail:isZh7?`\u6700\u5927\u51E0\u4E2A:${largestFiles}\u3002\u8FD0\u884C /memory \u68C0\u67E5\u5E76\u6E05\u7406\u8FC7\u671F\u6761\u76EE\u3002`:`Largest: ${largestFiles}. Use /memory to review and prune stale entries.`,savingsTokens:Math.floor(totalMemoryTokens*.3)})}}function checkAutoCompactDisabled(data,suggestions){let isZh7=resolveUiLocale()==="zh-CN";!data.isAutoCompactEnabled&&data.percentage>=50&&data.percentage<NEAR_CAPACITY_PERCENT&&suggestions.push({severity:"info",title:isZh7?"\u81EA\u52A8\u538B\u7F29\u5DF2\u5173\u95ED":"Autocompact is disabled",detail:isZh7?"\u4E0D\u5F00\u81EA\u52A8\u538B\u7F29\u4F1A\u649E\u4E0A\u4E0B\u6587\u4E0A\u9650,\u5BFC\u81F4\u5BF9\u8BDD\u4E22\u5931\u3002\u5728 /config \u542F\u7528,\u6216\u624B\u52A8 /compact\u3002":"Without autocompact, you will hit context limits and lose the conversation. Enable it in /config or use /compact manually."})}var LARGE_TOOL_RESULT_PERCENT,LARGE_TOOL_RESULT_TOKENS,READ_BLOAT_PERCENT,NEAR_CAPACITY_PERCENT,MEMORY_HIGH_PERCENT,MEMORY_HIGH_TOKENS,init_contextSuggestions=__esm({"src/utils/contextSuggestions.ts"(){init_toolName();init_prompt3();init_prompt2();init_prompt6();init_file();init_format2();init_uiLocale();LARGE_TOOL_RESULT_PERCENT=15,LARGE_TOOL_RESULT_TOKENS=1e4,READ_BLOAT_PERCENT=5,NEAR_CAPACITY_PERCENT=80,MEMORY_HIGH_PERCENT=5,MEMORY_HIGH_TOKENS=5e3;__name(generateContextSuggestions,"generateContextSuggestions");__name(checkNearCapacity,"checkNearCapacity");__name(checkLargeToolResults,"checkLargeToolResults");__name(getLargeToolSuggestion,"getLargeToolSuggestion");__name(checkReadResultBloat,"checkReadResultBloat");__name(checkMemoryBloat,"checkMemoryBloat");__name(checkAutoCompactDisabled,"checkAutoCompactDisabled")}});function ContextSuggestions({suggestions}){let isZh7=resolveUiLocale()==="zh-CN";return suggestions.length===0?null:(0,import_jsx_runtime99.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime99.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5EFA\u8BAE":"Suggestions"}),suggestions.map((suggestion,i3)=>(0,import_jsx_runtime99.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:i3===0?0:1,children:[(0,import_jsx_runtime99.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime99.jsx)(StatusIcon,{status:suggestion.severity,withSpace:!0}),(0,import_jsx_runtime99.jsx)(ThemedText,{bold:!0,children:suggestion.title}),suggestion.savingsTokens?(0,import_jsx_runtime99.jsxs)(ThemedText,{dimColor:!0,children:[" ",figures_default.arrowRight," ",isZh7?"\u53EF\u7701\u7EA6 ":"save ~",formatTokens(suggestion.savingsTokens)]}):null]}),(0,import_jsx_runtime99.jsx)(ThemedBox_default,{marginLeft:2,children:(0,import_jsx_runtime99.jsx)(ThemedText,{dimColor:!0,children:suggestion.detail})})]},i3))]})}var import_jsx_runtime99,init_ContextSuggestions=__esm({"src/components/ContextSuggestions.tsx"(){init_figures();init_ink();init_format2();init_uiLocale();init_StatusIcon();import_jsx_runtime99=__toESM(require_jsx_runtime());__name(ContextSuggestions,"ContextSuggestions")}});function CollapseStatus(){return null}function groupBySource(items){let groups2=new Map;for(let item of items){let key3=getSourceDisplayName(item.source),existing=groups2.get(key3)||[];existing.push(item),groups2.set(key3,existing)}for(let[key3,group]of groups2.entries())groups2.set(key3,group.sort((a2,b3)=>b3.tokens-a2.tokens));let orderedGroups=new Map;for(let source of SOURCE_DISPLAY_ORDER){let group=groups2.get(source);group&&orderedGroups.set(source,group)}return orderedGroups}function localizeCategoryName(name){return CATEGORY_ZH_MAP[name]??name}function ContextVisualization({data}){let isZh7=resolveUiLocale()==="zh-CN",tokenWord=isZh7?"\u8BCD\u5143":"tokens",{categories,totalTokens,rawMaxTokens,percentage,gridRows,model,memoryFiles,mcpTools,deferredBuiltinTools=[],systemTools,systemPromptSections,agents:agents2,skills:skills2,messageBreakdown}=data,visibleCategories=categories.filter(cat2=>cat2.tokens>0&&cat2.name!=="Free space"&&cat2.name!==RESERVED_CATEGORY_NAME2&&!cat2.isDeferred),hasDeferredMcpTools=categories.some(cat2=>cat2.isDeferred&&cat2.name.includes("MCP")),hasDeferredBuiltinTools=deferredBuiltinTools.length>0,autocompactCategory=categories.find(cat2=>cat2.name===RESERVED_CATEGORY_NAME2);return(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",paddingLeft:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"\u4E0A\u4E0B\u6587\u7528\u91CF":"Context Usage"}),(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"row",gap:2,children:[(0,import_jsx_runtime100.jsx)(ThemedBox_default,{flexDirection:"column",flexShrink:0,children:gridRows.map((row3,rowIndex)=>(0,import_jsx_runtime100.jsx)(ThemedBox_default,{flexDirection:"row",marginLeft:-1,children:row3.map((square,colIndex)=>square.categoryName==="Free space"?(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:"\u26F6 "},colIndex):square.categoryName===RESERVED_CATEGORY_NAME2?(0,import_jsx_runtime100.jsx)(ThemedText,{color:square.color,children:"\u26DD "},colIndex):(0,import_jsx_runtime100.jsx)(ThemedText,{color:square.color,children:square.squareFullness>=.7?"\u26C1 ":"\u26C0 "},colIndex))},rowIndex))}),(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",gap:0,flexShrink:0,children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[model," \xB7 ",formatTokens(totalTokens),"/",formatTokens(rawMaxTokens)," ",tokenWord," (",percentage,"%)"]}),(0,import_jsx_runtime100.jsx)(CollapseStatus,{}),(0,import_jsx_runtime100.jsx)(ThemedText,{children:" "}),(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,italic:!0,children:isZh7?"\u6309\u7C7B\u522B\u4F30\u7B97\u7684\u7528\u91CF":"Estimated usage by category"}),visibleCategories.map((cat2,index)=>{let tokenDisplay=formatTokens(cat2.tokens),percentDisplay=cat2.isDeferred?"N/A":`${(cat2.tokens/rawMaxTokens*100).toFixed(1)}%`,isReserved=cat2.name===RESERVED_CATEGORY_NAME2,displayName=isZh7?localizeCategoryName(cat2.name):cat2.name,symbol2=cat2.isDeferred?" ":isReserved?"\u26DD":"\u26C1";return(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{color:cat2.color,children:symbol2}),(0,import_jsx_runtime100.jsxs)(ThemedText,{children:[" ",displayName,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[tokenDisplay," ",tokenWord," (",percentDisplay,")"]})]},index)}),(categories.find(c4=>c4.name==="Free space")?.tokens??0)>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:"\u26F6"}),(0,import_jsx_runtime100.jsxs)(ThemedText,{children:[" ",isZh7?"\u7A7A\u95F2\u7A7A\u95F4":"Free space",": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(categories.find(c4=>c4.name==="Free space")?.tokens||0)," ","(",((categories.find(c4=>c4.name==="Free space")?.tokens||0)/rawMaxTokens*100).toFixed(1),"%)"]})]}),autocompactCategory&&autocompactCategory.tokens>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{color:autocompactCategory.color,children:"\u26DD"}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[" ",isZh7?"\u81EA\u52A8\u538B\u7F29\u7F13\u51B2":autocompactCategory.name,":"," "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(autocompactCategory.tokens)," ",tokenWord," (",(autocompactCategory.tokens/rawMaxTokens*100).toFixed(1),"%)"]})]})]})]}),(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginLeft:-1,children:[mcpTools.length>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"MCP \u5DE5\u5177":"MCP tools"}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[" ","\xB7 /mcp",hasDeferredMcpTools?isZh7?"(\u6309\u9700\u52A0\u8F7D)":" (loaded on-demand)":""]})]}),mcpTools.some(t7=>t7.isLoaded)&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u5DF2\u52A0\u8F7D":"Loaded"}),mcpTools.filter(t7=>t7.isLoaded).map((tool,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",tool.name,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(tool.tokens)," ",tokenWord]})]},i3))]}),hasDeferredMcpTools&&mcpTools.some(t7=>!t7.isLoaded)&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u53EF\u7528":"Available"}),mcpTools.filter(t7=>!t7.isLoaded).map((tool,i3)=>(0,import_jsx_runtime100.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:["\u2514 ",tool.name]})},i3))]}),!hasDeferredMcpTools&&mcpTools.map((tool,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",tool.name,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(tool.tokens)," ",tokenWord]})]},i3))]}),(systemTools&&systemTools.length>0||hasDeferredBuiltinTools)&&!1,systemPromptSections&&systemPromptSections.length>0&&!1,agents2.length>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"\u81EA\u5B9A\u4E49 Agent":"Custom agents"}),(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:" \xB7 /agents"})]}),Array.from(groupBySource(agents2).entries()).map(([sourceDisplay,sourceAgents])=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:sourceDisplay}),sourceAgents.map((agent,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",agent.agentType,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(agent.tokens)," ",tokenWord]})]},i3))]},sourceDisplay))]}),memoryFiles.length>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8BB0\u5FC6\u6587\u4EF6":"Memory files"}),(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:" \xB7 /memory"})]}),memoryFiles.map((file2,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",getDisplayPath(file2.path),": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(file2.tokens)," ",tokenWord]})]},i3))]}),skills2&&skills2.tokens>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6280\u80FD":"Skills"}),(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:" \xB7 /skills"})]}),Array.from(groupBySource(skills2.skillFrontmatter).entries()).map(([sourceDisplay,sourceSkills])=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:sourceDisplay}),sourceSkills.map((skill,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",skill.name,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(skill.tokens)," ",tokenWord]})]},i3))]},sourceDisplay))]}),messageBreakdown&&!1]}),(0,import_jsx_runtime100.jsx)(ContextSuggestions,{suggestions:generateContextSuggestions(data)})]})}var import_jsx_runtime100,RESERVED_CATEGORY_NAME2,SOURCE_DISPLAY_ORDER,CATEGORY_ZH_MAP,init_ContextVisualization=__esm({"src/components/ContextVisualization.tsx"(){init_ink();init_contextSuggestions();init_file();init_format2();init_constants2();init_stringUtils();init_uiLocale();init_ContextSuggestions();import_jsx_runtime100=__toESM(require_jsx_runtime()),RESERVED_CATEGORY_NAME2="Autocompact buffer";__name(CollapseStatus,"CollapseStatus");SOURCE_DISPLAY_ORDER=["Project","User","Managed","Plugin","Built-in"];__name(groupBySource,"groupBySource");CATEGORY_ZH_MAP={"System prompt":"\u7CFB\u7EDF\u63D0\u793A","System tools":"\u7CFB\u7EDF\u5DE5\u5177","MCP tools":"MCP \u5DE5\u5177","Custom agents":"\u81EA\u5B9A\u4E49 Agent","Memory files":"\u8BB0\u5FC6\u6587\u4EF6",Messages:"\u6D88\u606F\u5386\u53F2","Tool results":"\u5DE5\u5177\u7ED3\u679C",Attachments:"\u9644\u4EF6",Skills:"\u6280\u80FD","Free space":"\u7A7A\u95F2\u7A7A\u95F4","Autocompact buffer":"\u81EA\u52A8\u538B\u7F29\u7F13\u51B2"};__name(localizeCategoryName,"localizeCategoryName");__name(ContextVisualization,"ContextVisualization")}});function reactNodeToPlainText(node){if(node==null||typeof node=="boolean")return"";if(typeof node=="string"||typeof node=="number")return String(node);if(Array.isArray(node))return node.map(reactNodeToPlainText).join("");if(React41.isValidElement(node)){let props=node.props;return reactNodeToPlainText(props?.children)}return""}function renderToAnsiString(node,_columns){return Promise.resolve(reactNodeToPlainText(node))}async function renderToString(node,columns){let output2=await renderToAnsiString(node,columns);return stripAnsi(output2)}var React41,init_staticRender=__esm({"src/utils/staticRender.tsx"(){React41=__toESM(require_react());init_strip_ansi();__name(reactNodeToPlainText,"reactNodeToPlainText");__name(renderToAnsiString,"renderToAnsiString");__name(renderToString,"renderToString")}});var context_exports={};__export(context_exports,{call:()=>call23});function toApiView(messages){return getMessagesAfterCompactBoundary(messages)}async function call23(onDone,context3){let{messages,getAppState,options:{mainLoopModel,tools}}=context3,apiView=toApiView(messages),{messages:compactedMessages}=await microcompactMessages(apiView),terminalWidth=process.stdout.columns||80,appState=getAppState(),data=await analyzeContextUsage(compactedMessages,mainLoopModel,async()=>appState.toolPermissionContext,tools,appState.agentDefinitions,terminalWidth,context3,void 0,apiView),output2=await renderToAnsiString((0,import_jsx_runtime101.jsx)(ContextVisualization,{data}));return onDone(output2),null}var import_jsx_runtime101,init_context3=__esm({"src/commands/context/context.tsx"(){init_ContextVisualization();init_microCompact();init_analyzeContext();init_messages4();init_staticRender();import_jsx_runtime101=__toESM(require_jsx_runtime());__name(toApiView,"toApiView");__name(call23,"call")}});var context_noninteractive_exports={};__export(context_noninteractive_exports,{call:()=>call24,collectContextData:()=>collectContextData});async function collectContextData(context3){let{messages,getAppState,options:{mainLoopModel,tools,agentDefinitions,customSystemPrompt,appendSystemPrompt}}=context3,apiView=getMessagesAfterCompactBoundary(messages),{messages:compactedMessages}=await microcompactMessages(apiView),appState=getAppState();return analyzeContextUsage(compactedMessages,mainLoopModel,async()=>appState.toolPermissionContext,tools,agentDefinitions,void 0,{options:{customSystemPrompt,appendSystemPrompt}},void 0,apiView)}async function call24(_args,context3){let data=await collectContextData(context3);return{type:"text",value:formatContextAsMarkdownTable(data)}}function formatContextAsMarkdownTable(data){let{categories,totalTokens,rawMaxTokens,percentage,model,memoryFiles,mcpTools,agents:agents2,skills:skills2,messageBreakdown,systemTools,systemPromptSections}=data,output2=`## Context Usage
6843
+ `)):onClose("Config dialog dismissed",{display:"system"})},[showSubmenu,changes,globalConfig2,mainLoopModel,currentOutputStyle,currentLanguage,settingsData?.autoUpdatesChannel,isFastModeEnabled()?settingsData?.fastMode:void 0,onClose]),revertChanges=(0,import_react73.useCallback)(()=>{themeSetting!==initialThemeSetting.current&&setTheme(initialThemeSetting.current),saveGlobalConfig(()=>initialConfig.current);let il=initialLocalSettings;updateSettingsForSource("localSettings",{spinnerTipsEnabled:il?.spinnerTipsEnabled,prefersReducedMotion:il?.prefersReducedMotion,defaultView:il?.defaultView,outputStyle:il?.outputStyle});let iu=initialUserSettings;updateSettingsForSource("userSettings",{alwaysThinkingEnabled:iu?.alwaysThinkingEnabled,fastMode:iu?.fastMode,promptSuggestionEnabled:iu?.promptSuggestionEnabled,autoUpdatesChannel:iu?.autoUpdatesChannel,minimumVersion:iu?.minimumVersion,language:iu?.language,useAutoModeDuringPlan:iu?.useAutoModeDuringPlan,syntaxHighlightingDisabled:iu?.syntaxHighlightingDisabled,permissions:iu?.permissions===void 0?void 0:{...iu.permissions,defaultMode:iu.permissions.defaultMode}});let ia=initialAppState;setAppState(prev=>({...prev,mainLoopModel:ia.mainLoopModel,mainLoopModelForSession:ia.mainLoopModelForSession,verbose:ia.verbose,thinkingEnabled:ia.thinkingEnabled,fastMode:ia.fastMode,promptSuggestionEnabled:ia.promptSuggestionEnabled,isBriefOnly:ia.isBriefOnly,replBridgeEnabled:ia.replBridgeEnabled,replBridgeOutboundOnly:ia.replBridgeOutboundOnly,settings:ia.settings,toolPermissionContext:transitionPlanAutoMode(prev.toolPermissionContext)})),getUserMsgOptIn3()!==initialUserMsgOptIn&&setUserMsgOptIn(initialUserMsgOptIn)},[themeSetting,setTheme,initialLocalSettings,initialUserSettings,initialAppState,initialUserMsgOptIn,setAppState]),handleEscape=(0,import_react73.useCallback)(()=>{showSubmenu===null&&(isDirty2.current&&revertChanges(),onClose("Config dialog dismissed",{display:"system"}))},[showSubmenu,revertChanges,onClose]);useKeybinding("confirm:no",handleEscape,{context:"Settings",isActive:showSubmenu===null&&!isSearchMode&&!headerFocused}),useKeybinding("settings:close",handleSaveAndClose,{context:"Settings",isActive:showSubmenu===null&&!isSearchMode&&!headerFocused});let toggleSetting=(0,import_react73.useCallback)(()=>{let setting=filteredSettingsItems[selectedIndex];if(!(!setting||!setting.onChange)){if(setting.type==="boolean"){isDirty2.current=!0,setting.onChange(!setting.value),setting.id==="thinkingEnabled"&&(!setting.value===initialThinkingEnabled.current?setShowThinkingWarning(!1):context3.messages.some(m3=>m3.type==="assistant")&&setShowThinkingWarning(!0));return}if(setting.id==="theme"||setting.id==="model"||setting.id==="teammateDefaultModel"||setting.id==="showExternalIncludesDialog"||setting.id==="outputStyle"||setting.id==="language")switch(setting.id){case"theme":setShowSubmenu("Theme"),setTabsHidden(!0);return;case"model":setShowSubmenu("Model"),setTabsHidden(!0);return;case"teammateDefaultModel":setShowSubmenu("TeammateModel"),setTabsHidden(!0);return;case"showExternalIncludesDialog":setShowSubmenu("ExternalIncludes"),setTabsHidden(!0);return;case"outputStyle":setShowSubmenu("OutputStyle"),setTabsHidden(!0);return;case"language":setShowSubmenu("Language"),setTabsHidden(!0);return}if(setting.id==="autoUpdatesChannel"){if(autoUpdaterDisabledReason){setShowSubmenu("EnableAutoUpdates"),setTabsHidden(!0);return}(settingsData?.autoUpdatesChannel??"latest")==="latest"?(setShowSubmenu("ChannelDowngrade"),setTabsHidden(!0)):(isDirty2.current=!0,updateSettingsForSource("userSettings",{autoUpdatesChannel:"latest",minimumVersion:void 0}),setSettingsData(prev=>({...prev,autoUpdatesChannel:"latest",minimumVersion:void 0})),logEvent("tengu_autoupdate_channel_changed",{channel:"latest"}));return}if(setting.type==="enum"){isDirty2.current=!0;let nextIndex=(setting.options.indexOf(setting.value)+1)%setting.options.length;setting.onChange(setting.options[nextIndex]);return}}},[autoUpdaterDisabledReason,filteredSettingsItems,selectedIndex,settingsData?.autoUpdatesChannel,setTabsHidden]),moveSelection=__name(delta=>{setShowThinkingWarning(!1);let newIndex=Math.max(0,Math.min(filteredSettingsItems.length-1,selectedIndex+delta));setSelectedIndex(newIndex),adjustScrollOffset(newIndex)},"moveSelection");useKeybindings({"select:previous":__name(()=>{selectedIndex===0?(setShowThinkingWarning(!1),setIsSearchMode(!0),setScrollOffset(0)):moveSelection(-1)},"select:previous"),"select:next":__name(()=>moveSelection(1),"select:next"),"scroll:lineUp":__name(()=>moveSelection(-1),"scroll:lineUp"),"scroll:lineDown":__name(()=>moveSelection(1),"scroll:lineDown"),"select:accept":toggleSetting,"settings:search":__name(()=>{setIsSearchMode(!0),setSearchQuery("")},"settings:search")},{context:"Settings",isActive:showSubmenu===null&&!isSearchMode&&!headerFocused});let handleKeyDown=(0,import_react73.useCallback)(e2=>{if(showSubmenu===null&&!headerFocused){if(isSearchMode){if(e2.key==="escape"){e2.preventDefault(),searchQuery.length>0?setSearchQuery(""):setIsSearchMode(!1);return}(e2.key==="return"||e2.key==="down"||e2.key==="wheeldown")&&(e2.preventDefault(),setIsSearchMode(!1),setSelectedIndex(0),setScrollOffset(0));return}if(e2.key==="left"||e2.key==="right"||e2.key==="tab"){e2.preventDefault(),toggleSetting();return}e2.ctrl||e2.meta||e2.key==="j"||e2.key==="k"||e2.key==="/"||e2.key.length===1&&e2.key!==" "&&(e2.preventDefault(),setIsSearchMode(!0),setSearchQuery(e2.key))}},[showSubmenu,headerFocused,isSearchMode,searchQuery,setSearchQuery,toggleSetting]);return(0,import_jsx_runtime94.jsx)(ThemedBox_default,{flexDirection:"column",width:"100%",tabIndex:0,autoFocus:!0,onKeyDown:handleKeyDown,children:showSubmenu==="Theme"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ThemePicker,{onThemeSelect:setting=>{isDirty2.current=!0,setTheme(setting),setShowSubmenu(null),setTabsHidden(!1)},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)},hideEscToCancel:!0,skipExitHandling:!0}),(0,import_jsx_runtime94.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,italic:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"select"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]})})})]}):showSubmenu==="Model"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ModelPicker,{initial:mainLoopModel,onSelect:(model,_effort)=>{isDirty2.current=!0,onChangeMainModelConfig(model),setShowSubmenu(null),setTabsHidden(!1)},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)},showFastModeNotice:isFastModeEnabled()?isFastMode&&isFastModeSupportedByModel(mainLoopModel)&&isFastModeAvailable():!1}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]})})]}):showSubmenu==="TeammateModel"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ModelPicker,{initial:globalConfig2.teammateDefaultModel??null,skipSettingsWrite:!0,headerText:"Default model for newly spawned teammates. The leader can override via the tool call's model parameter.",onSelect:(model,_effort)=>{setShowSubmenu(null),setTabsHidden(!1),!(globalConfig2.teammateDefaultModel===void 0&&model===null)&&(isDirty2.current=!0,saveGlobalConfig(current=>current.teammateDefaultModel===model?current:{...current,teammateDefaultModel:model}),setGlobalConfig({...getGlobalConfig(),teammateDefaultModel:model}),setChanges(prev=>({...prev,teammateDefaultModel:teammateModelDisplayString(model)})),logEvent("tengu_teammate_default_model_changed",{model}))},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)}}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]})})]}):showSubmenu==="ExternalIncludes"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ClaudeMdExternalIncludesDialog,{onDone:()=>{setShowSubmenu(null),setTabsHidden(!1)},externalIncludes:getExternalClaudeMdIncludes(memoryFiles)}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"disable external includes"})]})})]}):showSubmenu==="OutputStyle"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(OutputStylePicker,{initialStyle:currentOutputStyle,onComplete:style=>{isDirty2.current=!0,setCurrentOutputStyle(style??DEFAULT_OUTPUT_STYLE_NAME),setShowSubmenu(null),setTabsHidden(!1),updateSettingsForSource("localSettings",{outputStyle:style}),logEvent("tengu_output_style_changed",{style:style??DEFAULT_OUTPUT_STYLE_NAME,source:"config_panel",settings_source:"localSettings"})},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)}}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancel"})]})})]}):showSubmenu==="Language"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(LanguagePicker,{initialLanguage:currentLanguage,onComplete:language=>{isDirty2.current=!0,setCurrentLanguage(language),setShowSubmenu(null),setTabsHidden(!1),updateSettingsForSource("userSettings",{language}),logEvent("tengu_language_changed",{language:language??"default",source:"config_panel"})},onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)}}),(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter",action:"confirm"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})]})})]}):showSubmenu==="EnableAutoUpdates"?(0,import_jsx_runtime94.jsx)(Dialog,{title:"Enable Auto-Updates",onCancel:()=>{setShowSubmenu(null),setTabsHidden(!1)},hideBorder:!0,hideInputGuide:!0,children:autoUpdaterDisabledReason?.type!=="config"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ThemedText,{children:autoUpdaterDisabledReason?.type==="env"?"Auto-updates are controlled by an environment variable and cannot be changed here.":"Auto-updates are disabled in development builds."}),autoUpdaterDisabledReason?.type==="env"&&(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,children:["Unset ",autoUpdaterDisabledReason.envVar," to re-enable auto-updates."]})]}):(0,import_jsx_runtime94.jsx)(Select,{options:[{label:"Enable with latest channel",value:"latest"},{label:"Enable with stable channel",value:"stable"}],onChange:channel=>{isDirty2.current=!0,setShowSubmenu(null),setTabsHidden(!1),saveGlobalConfig(current=>({...current,autoUpdates:!0})),setGlobalConfig({...getGlobalConfig(),autoUpdates:!0}),updateSettingsForSource("userSettings",{autoUpdatesChannel:channel,minimumVersion:void 0}),setSettingsData(prev=>({...prev,autoUpdatesChannel:channel,minimumVersion:void 0})),logEvent("tengu_autoupdate_enabled",{channel})}})}):showSubmenu==="ChannelDowngrade"?(0,import_jsx_runtime94.jsx)(ChannelDowngradeDialog,{currentVersion:"13.9.2",onChoice:choice=>{if(setShowSubmenu(null),setTabsHidden(!1),choice==="cancel")return;isDirty2.current=!0;let newSettings={autoUpdatesChannel:"stable"};choice==="stay"&&(newSettings.minimumVersion="13.9.2"),updateSettingsForSource("userSettings",newSettings),setSettingsData(prev=>({...prev,...newSettings})),logEvent("tengu_autoupdate_channel_changed",{channel:"stable",minimum_version_set:choice==="stay"})}}):(0,import_jsx_runtime94.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,marginY:insideModal?void 0:1,children:[(0,import_jsx_runtime94.jsx)(SearchBox,{query:searchQuery,isFocused:isSearchMode&&!headerFocused,isTerminalFocused,cursorOffset:searchCursorOffset,placeholder:"Search settings\u2026"}),(0,import_jsx_runtime94.jsx)(ThemedBox_default,{flexDirection:"column",children:filteredSettingsItems.length===0?(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,italic:!0,children:['No settings match "',searchQuery,'"']}):(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[scrollOffset>0&&(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,children:[figures_default.arrowUp," ",scrollOffset," more above"]}),filteredSettingsItems.slice(scrollOffset,scrollOffset+maxVisible).map((setting,i3)=>{let isSelected=scrollOffset+i3===selectedIndex&&!headerFocused&&!isSearchMode;return(0,import_jsx_runtime94.jsx)(React39.Fragment,{children:(0,import_jsx_runtime94.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime94.jsx)(ThemedBox_default,{width:44,children:(0,import_jsx_runtime94.jsxs)(ThemedText,{color:isSelected?"suggestion":void 0,children:[isSelected?figures_default.pointer:" "," ",setting.label]})}),(0,import_jsx_runtime94.jsx)(ThemedBox_default,{children:setting.type==="boolean"?(0,import_jsx_runtime94.jsxs)(import_jsx_runtime94.Fragment,{children:[(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:setting.value.toString()}),showThinkingWarning&&setting.id==="thinkingEnabled"&&(0,import_jsx_runtime94.jsxs)(ThemedText,{color:"warning",children:[" ","Changing thinking mode mid-conversation will increase latency and may reduce quality."]})]}):setting.id==="theme"?(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:THEME_LABELS[setting.value.toString()]??setting.value.toString()}):setting.id==="notifChannel"?(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:(0,import_jsx_runtime94.jsx)(NotifChannelLabel,{value:setting.value.toString()})}):setting.id==="defaultPermissionMode"?(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:permissionModeTitle(setting.value)}):setting.id==="autoUpdatesChannel"&&autoUpdaterDisabledReason?(0,import_jsx_runtime94.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:"disabled"}),(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,children:["(",formatAutoUpdaterDisabledReason(autoUpdaterDisabledReason),")"]})]}):(0,import_jsx_runtime94.jsx)(ThemedText,{color:isSelected?"suggestion":void 0,children:setting.value.toString()})},isSelected?"selected":"unselected")]})},setting.id)}),scrollOffset+maxVisible<filteredSettingsItems.length&&(0,import_jsx_runtime94.jsxs)(ThemedText,{dimColor:!0,children:[figures_default.arrowDown," ",filteredSettingsItems.length-scrollOffset-maxVisible," ","more below"]})]})}),headerFocused?(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"\u2190/\u2192 tab",action:"switch"}),(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"\u2193",action:"return"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"close"})]})}):isSearchMode?(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(ThemedText,{children:"Type to filter"}),(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"Enter/\u2193",action:"select"}),(0,import_jsx_runtime94.jsx)(KeyboardShortcutHint,{shortcut:"\u2191",action:"tabs"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"clear"})]})}):(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime94.jsxs)(Byline,{children:[(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"select:accept",context:"Settings",fallback:"Space",description:"change"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"settings:close",context:"Settings",fallback:"Enter",description:"save"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"settings:search",context:"Settings",fallback:"/",description:"search"}),(0,import_jsx_runtime94.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})]})})]})})}function teammateModelDisplayString(value){return value===void 0?modelDisplayString(getHardcodedTeammateModelFallback()):value===null?"Default (leader's model)":modelDisplayString(value)}function NotifChannelLabel({value}){switch(value){case"auto":return"Auto";case"iterm2":return(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["iTerm2 ",(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:"(OSC 9)"})]});case"terminal_bell":return(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["Terminal Bell ",(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:"(\\a)"})]});case"kitty":return(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["Kitty ",(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:"(OSC 99)"})]});case"ghostty":return(0,import_jsx_runtime94.jsxs)(ThemedText,{children:["Ghostty ",(0,import_jsx_runtime94.jsx)(ThemedText,{dimColor:!0,children:"(OSC 777)"})]});case"iterm2_with_bell":return"iTerm2 w/ Bell";case"notifications_disabled":return"Disabled";default:return value}}var React39,import_react73,import_jsx_runtime94,THEME_LABELS,init_Config=__esm({"src/components/Settings/Config.tsx"(){init_featureFlags();init_ink();React39=__toESM(require_react()),import_react73=__toESM(require_react());init_useKeybinding();init_figures();init_config12();init_authPortable();init_config12();init_source();init_PermissionMode();init_permissionSetup();init_log3();init_analytics();init_bridgeEnabled();init_ThemePicker();init_AppState();init_ModelPicker();init_model();init_extraUsage();init_ClaudeMdExternalIncludesDialog();init_ChannelDowngradeDialog();init_Dialog();init_CustomSelect();init_OutputStylePicker();init_LanguagePicker();init_claudemd();init_KeyboardShortcutHint();init_ConfigurableShortcutHint();init_Byline();init_Tabs();init_modalContext();init_SearchBox();init_ide();init_settings2();init_state();init_outputStyles();init_envUtils();init_growthbook();init_agentSwarmsEnabled();init_teammateModeSnapshot();init_teammateModel();init_useSearchInput();init_useTerminalSize();init_fastMode();init_fullscreen();import_jsx_runtime94=__toESM(require_jsx_runtime());__name(Config,"Config");__name(teammateModelDisplayString,"teammateModelDisplayString");THEME_LABELS={auto:"Auto (match terminal)",dark:"Dark mode",light:"Light mode","dark-daltonized":"Dark mode (colorblind-friendly)","light-daltonized":"Light mode (colorblind-friendly)","dark-ansi":"Dark mode (ANSI colors only)","light-ansi":"Light mode (ANSI colors only)"};__name(NotifChannelLabel,"NotifChannelLabel")}});async function fetchUtilization(){if(!isClaudeAISubscriber()||!hasProfileScope())return{};let tokens=getClaudeAIOAuthTokens();if(tokens&&isOAuthTokenExpired(tokens.expiresAt))return null;let authResult=getAuthHeaders();if(authResult.error)throw new Error(`Auth error: ${authResult.error}`);let headers={"Content-Type":"application/json","User-Agent":getClaudeCodeUserAgent(),...authResult.headers},url3=`${getOauthConfig().BASE_API_URL}/api/oauth/usage`;return(await axios_default.get(url3,{headers,timeout:5e3})).data}var init_usage=__esm({"src/services/api/usage.ts"(){init_axios2();init_oauth();init_auth();init_http2();init_userAgent();init_client2();__name(fetchUtilization,"fetchUtilization")}});function ProgressBar({ratio:inputRatio,width,fillColor,emptyColor}){let ratio=Math.min(1,Math.max(0,inputRatio)),whole=Math.floor(ratio*width),segments=[BLOCKS[BLOCKS.length-1].repeat(whole)];if(whole<width){let remainder=ratio*width-whole,middle=Math.floor(remainder*BLOCKS.length);segments.push(BLOCKS[middle]);let empty=width-whole-1;empty>0&&segments.push(BLOCKS[0].repeat(empty))}return(0,import_jsx_runtime95.jsx)(ThemedText,{color:fillColor,backgroundColor:emptyColor,children:segments.join("")})}var import_jsx_runtime95,BLOCKS,init_ProgressBar=__esm({"src/components/design-system/ProgressBar.tsx"(){init_ink();import_jsx_runtime95=__toESM(require_jsx_runtime()),BLOCKS=[" ","\u258F","\u258E","\u258D","\u258C","\u258B","\u258A","\u2589","\u2588"];__name(ProgressBar,"ProgressBar")}});function LimitBar({title,limit,maxWidth,showTimeInReset=!0,extraSubtext}){let{utilization,resets_at}=limit;if(utilization===null)return null;let usedText=`${Math.floor(utilization)}% used`,subtext;resets_at&&(subtext=`Resets ${formatResetText(resets_at,!0,showTimeInReset)}`),extraSubtext&&(subtext?subtext=`${extraSubtext} \xB7 ${subtext}`:subtext=extraSubtext);let maxBarWidth=50;return maxWidth>=maxBarWidth+12?(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:title}),(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"row",gap:1,children:[(0,import_jsx_runtime96.jsx)(ProgressBar,{ratio:utilization/100,width:maxBarWidth,fillColor:"rate_limit_fill",emptyColor:"rate_limit_empty"}),(0,import_jsx_runtime96.jsx)(ThemedText,{children:usedText})]}),subtext&&(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:subtext})]}):(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsxs)(ThemedText,{children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:title}),subtext&&(0,import_jsx_runtime96.jsxs)(import_jsx_runtime96.Fragment,{children:[(0,import_jsx_runtime96.jsx)(ThemedText,{children:" "}),(0,import_jsx_runtime96.jsxs)(ThemedText,{dimColor:!0,children:["\xB7 ",subtext]})]})]}),(0,import_jsx_runtime96.jsx)(ProgressBar,{ratio:utilization/100,width:maxWidth,fillColor:"rate_limit_fill",emptyColor:"rate_limit_empty"}),(0,import_jsx_runtime96.jsx)(ThemedText,{children:usedText})]})}function Usage(){let[utilization,setUtilization]=(0,import_react74.useState)(null),[efficiencySummary,setEfficiencySummary]=(0,import_react74.useState)(null),[skillSelectionSummary,setSkillSelectionSummary]=(0,import_react74.useState)(null),[error40,setError]=(0,import_react74.useState)(null),[isLoading,setIsLoading]=(0,import_react74.useState)(!0),{columns}=useTerminalSize(),availableWidth=columns-2,maxWidth=Math.min(availableWidth,80),loadUtilization=React40.useCallback(async()=>{setIsLoading(!0),setError(null);try{let data=await fetchUtilization();setUtilization(data),setEfficiencySummary(getRecentEfficiencyLedgerSummary()),setSkillSelectionSummary(getRecentSkillSelectionSummary())}catch(err2){logError2(err2);let axiosError=err2,responseBody=axiosError.response?.data?jsonStringify(axiosError.response.data):void 0;setError(responseBody?`Failed to load usage data: ${responseBody}`:"Failed to load usage data")}finally{setIsLoading(!1)}},[]);if((0,import_react74.useEffect)(()=>{loadUtilization()},[loadUtilization]),useKeybinding("settings:retry",()=>{loadUtilization()},{context:"Settings",isActive:!!error40&&!isLoading}),error40)return(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime96.jsxs)(ThemedText,{color:"error",children:["Error: ",error40]}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime96.jsxs)(Byline,{children:[(0,import_jsx_runtime96.jsx)(ConfigurableShortcutHint,{action:"settings:retry",context:"Settings",fallback:"r",description:"retry"}),(0,import_jsx_runtime96.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})]})})]});if(!utilization)return(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:"Loading usage data\u2026"}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime96.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})})]});let subscriptionType=getSubscriptionType(),showSonnetBar=subscriptionType==="max"||subscriptionType==="team"||subscriptionType===null,limits=[{title:"Current session",limit:utilization.five_hour},{title:"Current week (all models)",limit:utilization.seven_day},...showSonnetBar?[{title:"Current week (Sonnet only)",limit:utilization.seven_day_sonnet}]:[]];return(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,width:"100%",children:[limits.some(({limit})=>limit)||(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:"/usage is only available for subscription plans."}),limits.map(({title,limit})=>limit&&(0,import_jsx_runtime96.jsx)(LimitBar,{title,limit,maxWidth},title)),utilization.extra_usage&&(0,import_jsx_runtime96.jsx)(ExtraUsageSection,{extraUsage:utilization.extra_usage,maxWidth}),efficiencySummary&&(0,import_jsx_runtime96.jsx)(LightweightShareSection,{summary:efficiencySummary}),skillSelectionSummary&&(0,import_jsx_runtime96.jsx)(SkillSelectionSection,{summary:skillSelectionSummary}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime96.jsx)(ConfigurableShortcutHint,{action:"confirm:no",context:"Settings",fallback:"Esc",description:"cancel"})})]})}function formatLightweightShare(summary){let{routeSlotBreakdown}=summary,trackedSamples=Object.values(routeSlotBreakdown).reduce((total,count4)=>total+count4,0);if(trackedSamples===0)return null;let smallFastSamples=routeSlotBreakdown.smallFast,helperSamples=smallFastSamples+routeSlotBreakdown.general,smallFastShare=Math.round(smallFastSamples/trackedSamples*100),helperShare=Math.round(helperSamples/trackedSamples*100),lightweightStats=summary.routeSlotStats.smallFast,lightweightConcurrency=summary.routeSlotConcurrency?.smallFast,statsText=lightweightStats.sampleCount>0?` \xB7 smallFast cache hit ${Math.round(lightweightStats.avgCacheHitRate*100)}% \xB7 avg latency ${lightweightStats.avgDurationMs}ms`:"",concurrencyText=lightweightConcurrency&&lightweightConcurrency.sampleCount>0?` \xB7 avg in-flight ${lightweightConcurrency.avgInFlightAtStart} \xB7 max in-flight ${lightweightConcurrency.maxInFlightAtStart}`:"";return`Lightweight helper routes: ${helperShare}% (${helperSamples}/${trackedSamples} recent calls) \xB7 smallFast ${smallFastShare}% (${smallFastSamples}/${trackedSamples})${statsText}${concurrencyText}`}function LightweightShareSection({summary}){let formatted=formatLightweightShare(summary);return formatted?(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:"Model routing efficiency"}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:formatted})]}):null}function formatSkillSelectionSummary(summary){if(summary.recent.length===0)return null;let latest=summary.recent[0];if(!latest)return null;let modelCountText=Object.entries(summary.modelBreakdown).map(([model,count4])=>`${model} ${count4}`).join(", "),visibilityText=`${summary.skillToolVisibleCount}/${summary.recent.length} visible`,missingText=summary.missingCommandCount>0?` \xB7 ${summary.missingCommandCount} missing command`:"";return`Skill selections: ${summary.recent.length} recent \xB7 latest /${latest.skillName} on ${latest.mainLoopModel} \xB7 Skill tool ${visibilityText}${missingText}${modelCountText?` \xB7 models ${modelCountText}`:""}`}function SkillSelectionSection({summary}){let formatted=formatSkillSelectionSummary(summary);return formatted?(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:"Skill selection diagnostics"}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:formatted})]}):null}function ExtraUsageSection({extraUsage,maxWidth}){let subscriptionType=getSubscriptionType();if(!(subscriptionType==="pro"||subscriptionType==="max"))return!1;if(!extraUsage.is_enabled)return isOverageProvisioningAllowedForCommandFiltering()?(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:EXTRA_USAGE_SECTION_TITLE}),(0,import_jsx_runtime96.jsxs)(ThemedText,{dimColor:!0,children:["\u989D\u5916\u7528\u91CF\u672A\u5F00\u542F \xB7 ",PROVIDER_SWITCH_HINT]})]}):null;if(extraUsage.monthly_limit===null)return(0,import_jsx_runtime96.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime96.jsx)(ThemedText,{bold:!0,children:EXTRA_USAGE_SECTION_TITLE}),(0,import_jsx_runtime96.jsx)(ThemedText,{dimColor:!0,children:"Unlimited"})]});if(typeof extraUsage.used_credits!="number"||typeof extraUsage.utilization!="number")return null;let formattedUsedCredits=formatCost(extraUsage.used_credits/100,2),formattedMonthlyLimit=formatCost(extraUsage.monthly_limit/100,2),now3=new Date,oneMonthReset=new Date(now3.getFullYear(),now3.getMonth()+1,1);return(0,import_jsx_runtime96.jsx)(LimitBar,{title:EXTRA_USAGE_SECTION_TITLE,limit:{utilization:extraUsage.utilization,resets_at:oneMonthReset.toISOString()},showTimeInReset:!1,extraSubtext:`${formattedUsedCredits} / ${formattedMonthlyLimit} spent`,maxWidth})}var React40,import_react74,import_jsx_runtime96,EXTRA_USAGE_SECTION_TITLE,init_Usage=__esm({"src/components/Settings/Usage.tsx"(){React40=__toESM(require_react()),import_react74=__toESM(require_react());init_cost_tracker();init_auth();init_useTerminalSize();init_ink();init_useKeybinding();init_efficiencyLedger();init_skillSelectionTelemetry();init_usage();init_format2();init_log3();init_slowOperations();init_ConfigurableShortcutHint();init_Byline();init_ProgressBar();init_product();import_jsx_runtime96=__toESM(require_jsx_runtime());__name(LimitBar,"LimitBar");__name(Usage,"Usage");__name(formatLightweightShare,"formatLightweightShare");__name(LightweightShareSection,"LightweightShareSection");__name(formatSkillSelectionSummary,"formatSkillSelectionSummary");__name(SkillSelectionSection,"SkillSelectionSection");EXTRA_USAGE_SECTION_TITLE="Extra usage";__name(ExtraUsageSection,"ExtraUsageSection")}});function Settings({onClose,context:context3,defaultTab}){let[selectedTab,setSelectedTab]=(0,import_react75.useState)(defaultTab),[tabsHidden,setTabsHidden]=(0,import_react75.useState)(!1),[configOwnsEsc,setConfigOwnsEsc]=(0,import_react75.useState)(!1),[gatesOwnsEsc,setGatesOwnsEsc]=(0,import_react75.useState)(!1),insideModal=useIsInsideModal(),{rows}=useModalOrTerminalSize(useTerminalSize()),contentHeight=insideModal?rows+1:Math.max(15,Math.min(Math.floor(rows*.8),30)),[diagnosticsPromise]=(0,import_react75.useState)(()=>buildDiagnostics().catch(()=>[]));useExitOnCtrlCDWithKeybindings(),useKeybinding("confirm:no",__name(()=>{tabsHidden||onClose("Status dialog dismissed",{display:"system"})},"handleEscape"),{context:"Settings",isActive:!tabsHidden&&!(selectedTab==="Config"&&configOwnsEsc)&&!(selectedTab==="Gates"&&gatesOwnsEsc)});let Gates=__name(_props=>null,"Gates");return(0,import_jsx_runtime97.jsx)(Pane,{color:"permission",children:(0,import_jsx_runtime97.jsx)(Tabs,{color:"permission",selectedTab,onTabChange:setSelectedTab,hidden:tabsHidden,initialHeaderFocused:defaultTab!=="Config"&&defaultTab!=="Gates",contentHeight:tabsHidden||insideModal?void 0:contentHeight,children:[(0,import_jsx_runtime97.jsx)(Tab,{title:"Status",children:(0,import_jsx_runtime97.jsx)(Status,{context:context3,diagnosticsPromise})},"status"),(0,import_jsx_runtime97.jsx)(Tab,{title:"Config",children:(0,import_jsx_runtime97.jsx)(import_react75.Suspense,{fallback:null,children:(0,import_jsx_runtime97.jsx)(Config,{context:context3,onClose,setTabsHidden,onIsSearchModeChange:setConfigOwnsEsc,contentHeight})})},"config"),(0,import_jsx_runtime97.jsx)(Tab,{title:"Usage",children:(0,import_jsx_runtime97.jsx)(Usage,{})},"usage")]})})}var import_react75,import_jsx_runtime97,init_Settings=__esm({"src/components/Settings/Settings.tsx"(){import_react75=__toESM(require_react());init_useKeybinding();init_useExitOnCtrlCDWithKeybindings();init_useTerminalSize();init_modalContext();init_Pane();init_Tabs();init_Status();init_Config();init_Usage();import_jsx_runtime97=__toESM(require_jsx_runtime());__name(Settings,"Settings")}});var config_exports3={};__export(config_exports3,{call:()=>call22});var import_jsx_runtime98,call22,init_config10=__esm({"src/commands/config/config.tsx"(){init_Settings();import_jsx_runtime98=__toESM(require_jsx_runtime()),call22=__name(async(onDone,context3)=>(0,import_jsx_runtime98.jsx)(Settings,{onClose:onDone,context:context3,defaultTab:"Config"}),"call")}});var config2,config_default,init_config11=__esm({"src/commands/config/index.ts"(){config2={aliases:["settings"],type:"local-jsx",name:"config",description:"Open config panel",load:__name(()=>Promise.resolve().then(()=>(init_config10(),config_exports3)),"load")},config_default=config2}});function generateContextSuggestions(data){let suggestions=[];return checkNearCapacity(data,suggestions),checkLargeToolResults(data,suggestions),checkReadResultBloat(data,suggestions),checkMemoryBloat(data,suggestions),checkAutoCompactDisabled(data,suggestions),suggestions.sort((a2,b3)=>a2.severity!==b3.severity?a2.severity==="warning"?-1:1:(b3.savingsTokens??0)-(a2.savingsTokens??0)),suggestions}function checkNearCapacity(data,suggestions){let isZh7=resolveUiLocale()==="zh-CN";data.percentage>=NEAR_CAPACITY_PERCENT&&suggestions.push({severity:"warning",title:isZh7?`\u4E0A\u4E0B\u6587\u5DF2\u7528 ${data.percentage}%`:`Context is ${data.percentage}% full`,detail:data.isAutoCompactEnabled?isZh7?"\u5373\u5C06\u81EA\u52A8\u538B\u7F29(\u4F1A\u4E22\u5F03\u8F83\u65E9\u7684\u6D88\u606F)\u3002\u53EF\u7ACB\u5373\u8FD0\u884C /compact \u81EA\u884C\u9009\u62E9\u4FDD\u7559\u5185\u5BB9\u3002":"Autocompact will trigger soon, which discards older messages. Use /compact now to control what gets kept.":isZh7?"\u81EA\u52A8\u538B\u7F29\u5DF2\u5173\u95ED\u3002\u8FD0\u884C /compact \u91CA\u653E\u7A7A\u95F4,\u6216\u5728 /config \u4E2D\u5F00\u542F\u81EA\u52A8\u538B\u7F29\u3002":"Autocompact is disabled. Use /compact to free space, or enable autocompact in /config."})}function checkLargeToolResults(data,suggestions){if(data.messageBreakdown)for(let tool of data.messageBreakdown.toolCallsByType){let totalToolTokens=tool.callTokens+tool.resultTokens,percent=totalToolTokens/data.rawMaxTokens*100;if(percent<LARGE_TOOL_RESULT_PERCENT||totalToolTokens<LARGE_TOOL_RESULT_TOKENS)continue;let suggestion=getLargeToolSuggestion(tool.name,totalToolTokens,percent);suggestion&&suggestions.push(suggestion)}}function getLargeToolSuggestion(toolName4,tokens,percent){let isZh7=resolveUiLocale()==="zh-CN",tokenStr=formatTokens(tokens),tokenWord=isZh7?"\u8BCD\u5143":"tokens";switch(toolName4){case BASH_TOOL_NAME:return{severity:"warning",title:isZh7?`Bash \u7ED3\u679C\u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`Bash results using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u628A\u8F93\u51FA\u901A\u8FC7 head/tail/grep \u622A\u53D6\u4EE5\u7F29\u5C0F\u7ED3\u679C\u3002\u8BFB\u5927\u6587\u4EF6\u8BF7\u7528 Read \u52A0 offset/limit,\u522B cat \u6574\u4E2A\u6587\u4EF6\u3002":"Pipe output through head, tail, or grep to reduce result size. Avoid cat on large files \u2014 use Read with offset/limit instead.",savingsTokens:Math.floor(tokens*.5)};case FILE_READ_TOOL_NAME:return{severity:"info",title:isZh7?`Read \u7ED3\u679C\u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`Read results using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u4F7F\u7528 offset \u548C limit \u53EA\u8BFB\u53D6\u9700\u8981\u7684\u7247\u6BB5\u3002\u53EA\u770B\u51E0\u884C\u65F6\u4E0D\u8981\u91CD\u590D\u8BFB\u6574\u6587\u4EF6\u3002":"Use offset and limit parameters to read only the sections you need. Avoid re-reading entire files when you only need a few lines.",savingsTokens:Math.floor(tokens*.3)};case GREP_TOOL_NAME:return{severity:"info",title:isZh7?`Grep \u7ED3\u679C\u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`Grep results using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u6536\u7D27\u5339\u914D\u6A21\u5F0F,\u6216\u7528 glob/type \u9650\u5B9A\u6587\u4EF6\u7C7B\u578B\u3002\u5982\u679C\u53EA\u662F\u627E\u6587\u4EF6,Glob \u901A\u5E38\u6BD4 Grep \u66F4\u7701\u3002":"Add more specific patterns or use the glob or type parameter to narrow file types. Consider Glob for file discovery instead of Grep.",savingsTokens:Math.floor(tokens*.3)};case WEB_FETCH_TOOL_NAME:return{severity:"info",title:isZh7?`WebFetch \u7ED3\u679C\u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`WebFetch results using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u7F51\u9875\u5185\u5BB9\u5F80\u5F80\u5F88\u5927,\u53EA\u62BD\u53D6\u771F\u6B63\u9700\u8981\u7684\u5B57\u6BB5\u5373\u53EF\u3002":"Web page content can be very large. Consider extracting only the specific information needed.",savingsTokens:Math.floor(tokens*.4)};default:return percent>=20?{severity:"info",title:isZh7?`${toolName4} \u5360\u7528 ${tokenStr} ${tokenWord} (${percent.toFixed(0)}%)`:`${toolName4} using ${tokenStr} tokens (${percent.toFixed(0)}%)`,detail:isZh7?"\u8BE5\u5DE5\u5177\u6D88\u8017\u4E86\u8F83\u5927\u6BD4\u4F8B\u7684\u4E0A\u4E0B\u6587\u3002":"This tool is consuming a significant portion of context.",savingsTokens:Math.floor(tokens*.2)}:null}}function checkReadResultBloat(data,suggestions){let isZh7=resolveUiLocale()==="zh-CN",tokenWord=isZh7?"\u8BCD\u5143":"tokens";if(!data.messageBreakdown)return;let readTool=data.messageBreakdown.toolCallsByType.find(t7=>t7.name===FILE_READ_TOOL_NAME);if(!readTool)return;let totalReadTokens=readTool.callTokens+readTool.resultTokens,totalReadPercent=totalReadTokens/data.rawMaxTokens*100,readPercent=readTool.resultTokens/data.rawMaxTokens*100;totalReadPercent>=LARGE_TOOL_RESULT_PERCENT&&totalReadTokens>=LARGE_TOOL_RESULT_TOKENS||readPercent>=READ_BLOAT_PERCENT&&readTool.resultTokens>=LARGE_TOOL_RESULT_TOKENS&&suggestions.push({severity:"info",title:isZh7?`\u6587\u4EF6\u8BFB\u53D6\u5360\u7528 ${formatTokens(readTool.resultTokens)} ${tokenWord} (${readPercent.toFixed(0)}%)`:`File reads using ${formatTokens(readTool.resultTokens)} tokens (${readPercent.toFixed(0)}%)`,detail:isZh7?"\u5982\u679C\u5728\u91CD\u590D\u8BFB\u540C\u4E00\u6587\u4EF6,\u53EF\u5F15\u7528\u4E4B\u524D\u7684\u7ED3\u679C\u3002\u8BFB\u5927\u6587\u4EF6\u7528 offset/limit\u3002":"If you are re-reading files, consider referencing earlier reads. Use offset/limit for large files.",savingsTokens:Math.floor(readTool.resultTokens*.3)})}function checkMemoryBloat(data,suggestions){let isZh7=resolveUiLocale()==="zh-CN",tokenWord=isZh7?"\u8BCD\u5143":"tokens",totalMemoryTokens=data.memoryFiles.reduce((sum2,f3)=>sum2+f3.tokens,0),memoryPercent=totalMemoryTokens/data.rawMaxTokens*100;if(memoryPercent>=MEMORY_HIGH_PERCENT&&totalMemoryTokens>=MEMORY_HIGH_TOKENS){let largestFiles=[...data.memoryFiles].sort((a2,b3)=>b3.tokens-a2.tokens).slice(0,3).map(f3=>`${getDisplayPath(f3.path)} (${formatTokens(f3.tokens)})`).join(", ");suggestions.push({severity:"info",title:isZh7?`\u8BB0\u5FC6\u6587\u4EF6\u5360\u7528 ${formatTokens(totalMemoryTokens)} ${tokenWord} (${memoryPercent.toFixed(0)}%)`:`Memory files using ${formatTokens(totalMemoryTokens)} tokens (${memoryPercent.toFixed(0)}%)`,detail:isZh7?`\u6700\u5927\u51E0\u4E2A:${largestFiles}\u3002\u8FD0\u884C /memory \u68C0\u67E5\u5E76\u6E05\u7406\u8FC7\u671F\u6761\u76EE\u3002`:`Largest: ${largestFiles}. Use /memory to review and prune stale entries.`,savingsTokens:Math.floor(totalMemoryTokens*.3)})}}function checkAutoCompactDisabled(data,suggestions){let isZh7=resolveUiLocale()==="zh-CN";!data.isAutoCompactEnabled&&data.percentage>=50&&data.percentage<NEAR_CAPACITY_PERCENT&&suggestions.push({severity:"info",title:isZh7?"\u81EA\u52A8\u538B\u7F29\u5DF2\u5173\u95ED":"Autocompact is disabled",detail:isZh7?"\u4E0D\u5F00\u81EA\u52A8\u538B\u7F29\u4F1A\u649E\u4E0A\u4E0B\u6587\u4E0A\u9650,\u5BFC\u81F4\u5BF9\u8BDD\u4E22\u5931\u3002\u5728 /config \u542F\u7528,\u6216\u624B\u52A8 /compact\u3002":"Without autocompact, you will hit context limits and lose the conversation. Enable it in /config or use /compact manually."})}var LARGE_TOOL_RESULT_PERCENT,LARGE_TOOL_RESULT_TOKENS,READ_BLOAT_PERCENT,NEAR_CAPACITY_PERCENT,MEMORY_HIGH_PERCENT,MEMORY_HIGH_TOKENS,init_contextSuggestions=__esm({"src/utils/contextSuggestions.ts"(){init_toolName();init_prompt3();init_prompt2();init_prompt6();init_file();init_format2();init_uiLocale();LARGE_TOOL_RESULT_PERCENT=15,LARGE_TOOL_RESULT_TOKENS=1e4,READ_BLOAT_PERCENT=5,NEAR_CAPACITY_PERCENT=80,MEMORY_HIGH_PERCENT=5,MEMORY_HIGH_TOKENS=5e3;__name(generateContextSuggestions,"generateContextSuggestions");__name(checkNearCapacity,"checkNearCapacity");__name(checkLargeToolResults,"checkLargeToolResults");__name(getLargeToolSuggestion,"getLargeToolSuggestion");__name(checkReadResultBloat,"checkReadResultBloat");__name(checkMemoryBloat,"checkMemoryBloat");__name(checkAutoCompactDisabled,"checkAutoCompactDisabled")}});function ContextSuggestions({suggestions}){let isZh7=resolveUiLocale()==="zh-CN";return suggestions.length===0?null:(0,import_jsx_runtime99.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime99.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5EFA\u8BAE":"Suggestions"}),suggestions.map((suggestion,i3)=>(0,import_jsx_runtime99.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:i3===0?0:1,children:[(0,import_jsx_runtime99.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime99.jsx)(StatusIcon,{status:suggestion.severity,withSpace:!0}),(0,import_jsx_runtime99.jsx)(ThemedText,{bold:!0,children:suggestion.title}),suggestion.savingsTokens?(0,import_jsx_runtime99.jsxs)(ThemedText,{dimColor:!0,children:[" ",figures_default.arrowRight," ",isZh7?"\u53EF\u7701\u7EA6 ":"save ~",formatTokens(suggestion.savingsTokens)]}):null]}),(0,import_jsx_runtime99.jsx)(ThemedBox_default,{marginLeft:2,children:(0,import_jsx_runtime99.jsx)(ThemedText,{dimColor:!0,children:suggestion.detail})})]},i3))]})}var import_jsx_runtime99,init_ContextSuggestions=__esm({"src/components/ContextSuggestions.tsx"(){init_figures();init_ink();init_format2();init_uiLocale();init_StatusIcon();import_jsx_runtime99=__toESM(require_jsx_runtime());__name(ContextSuggestions,"ContextSuggestions")}});function CollapseStatus(){return null}function groupBySource(items){let groups2=new Map;for(let item of items){let key3=getSourceDisplayName(item.source),existing=groups2.get(key3)||[];existing.push(item),groups2.set(key3,existing)}for(let[key3,group]of groups2.entries())groups2.set(key3,group.sort((a2,b3)=>b3.tokens-a2.tokens));let orderedGroups=new Map;for(let source of SOURCE_DISPLAY_ORDER){let group=groups2.get(source);group&&orderedGroups.set(source,group)}return orderedGroups}function localizeCategoryName(name){return CATEGORY_ZH_MAP[name]??name}function ContextVisualization({data}){let isZh7=resolveUiLocale()==="zh-CN",tokenWord=isZh7?"\u8BCD\u5143":"tokens",{categories,totalTokens,rawMaxTokens,percentage,gridRows,model,memoryFiles,mcpTools,deferredBuiltinTools=[],systemTools,systemPromptSections,agents:agents2,skills:skills2,messageBreakdown}=data,visibleCategories=categories.filter(cat2=>cat2.tokens>0&&cat2.name!=="Free space"&&cat2.name!==RESERVED_CATEGORY_NAME2&&!cat2.isDeferred),hasDeferredMcpTools=categories.some(cat2=>cat2.isDeferred&&cat2.name.includes("MCP")),hasDeferredBuiltinTools=deferredBuiltinTools.length>0,autocompactCategory=categories.find(cat2=>cat2.name===RESERVED_CATEGORY_NAME2);return(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",paddingLeft:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"\u4E0A\u4E0B\u6587\u7528\u91CF":"Context Usage"}),(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"row",gap:2,children:[(0,import_jsx_runtime100.jsx)(ThemedBox_default,{flexDirection:"column",flexShrink:0,children:gridRows.map((row3,rowIndex)=>(0,import_jsx_runtime100.jsx)(ThemedBox_default,{flexDirection:"row",marginLeft:-1,children:row3.map((square,colIndex)=>square.categoryName==="Free space"?(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:"\u26F6 "},colIndex):square.categoryName===RESERVED_CATEGORY_NAME2?(0,import_jsx_runtime100.jsx)(ThemedText,{color:square.color,children:"\u26DD "},colIndex):(0,import_jsx_runtime100.jsx)(ThemedText,{color:square.color,children:square.squareFullness>=.7?"\u26C1 ":"\u26C0 "},colIndex))},rowIndex))}),(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",gap:0,flexShrink:0,children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[model," \xB7 ",formatTokens(totalTokens),"/",formatTokens(rawMaxTokens)," ",tokenWord," (",percentage,"%)"]}),(0,import_jsx_runtime100.jsx)(CollapseStatus,{}),(0,import_jsx_runtime100.jsx)(ThemedText,{children:" "}),(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,italic:!0,children:isZh7?"\u6309\u7C7B\u522B\u4F30\u7B97\u7684\u7528\u91CF":"Estimated usage by category"}),visibleCategories.map((cat2,index)=>{let tokenDisplay=formatTokens(cat2.tokens),percentDisplay=cat2.isDeferred?"N/A":`${(cat2.tokens/rawMaxTokens*100).toFixed(1)}%`,isReserved=cat2.name===RESERVED_CATEGORY_NAME2,displayName=isZh7?localizeCategoryName(cat2.name):cat2.name,symbol2=cat2.isDeferred?" ":isReserved?"\u26DD":"\u26C1";return(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{color:cat2.color,children:symbol2}),(0,import_jsx_runtime100.jsxs)(ThemedText,{children:[" ",displayName,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[tokenDisplay," ",tokenWord," (",percentDisplay,")"]})]},index)}),(categories.find(c4=>c4.name==="Free space")?.tokens??0)>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:"\u26F6"}),(0,import_jsx_runtime100.jsxs)(ThemedText,{children:[" ",isZh7?"\u7A7A\u95F2\u7A7A\u95F4":"Free space",": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(categories.find(c4=>c4.name==="Free space")?.tokens||0)," ","(",((categories.find(c4=>c4.name==="Free space")?.tokens||0)/rawMaxTokens*100).toFixed(1),"%)"]})]}),autocompactCategory&&autocompactCategory.tokens>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{color:autocompactCategory.color,children:"\u26DD"}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[" ",isZh7?"\u81EA\u52A8\u538B\u7F29\u7F13\u51B2":autocompactCategory.name,":"," "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(autocompactCategory.tokens)," ",tokenWord," (",(autocompactCategory.tokens/rawMaxTokens*100).toFixed(1),"%)"]})]})]})]}),(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginLeft:-1,children:[mcpTools.length>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"MCP \u5DE5\u5177":"MCP tools"}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[" ","\xB7 /mcp",hasDeferredMcpTools?isZh7?"(\u6309\u9700\u52A0\u8F7D)":" (loaded on-demand)":""]})]}),mcpTools.some(t7=>t7.isLoaded)&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u5DF2\u52A0\u8F7D":"Loaded"}),mcpTools.filter(t7=>t7.isLoaded).map((tool,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",tool.name,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(tool.tokens)," ",tokenWord]})]},i3))]}),hasDeferredMcpTools&&mcpTools.some(t7=>!t7.isLoaded)&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u53EF\u7528":"Available"}),mcpTools.filter(t7=>!t7.isLoaded).map((tool,i3)=>(0,import_jsx_runtime100.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:["\u2514 ",tool.name]})},i3))]}),!hasDeferredMcpTools&&mcpTools.map((tool,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",tool.name,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(tool.tokens)," ",tokenWord]})]},i3))]}),(systemTools&&systemTools.length>0||hasDeferredBuiltinTools)&&!1,systemPromptSections&&systemPromptSections.length>0&&!1,agents2.length>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"\u81EA\u5B9A\u4E49 Agent":"Custom agents"}),(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:" \xB7 /agents"})]}),Array.from(groupBySource(agents2).entries()).map(([sourceDisplay,sourceAgents])=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:sourceDisplay}),sourceAgents.map((agent,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",agent.agentType,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(agent.tokens)," ",tokenWord]})]},i3))]},sourceDisplay))]}),memoryFiles.length>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8BB0\u5FC6\u6587\u4EF6":"Memory files"}),(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:" \xB7 /memory"})]}),memoryFiles.map((file2,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",getDisplayPath(file2.path),": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(file2.tokens)," ",tokenWord]})]},i3))]}),skills2&&skills2.tokens>0&&(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6280\u80FD":"Skills"}),(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:" \xB7 /skills"})]}),Array.from(groupBySource(skills2.skillFrontmatter).entries()).map(([sourceDisplay,sourceSkills])=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime100.jsx)(ThemedText,{dimColor:!0,children:sourceDisplay}),sourceSkills.map((skill,i3)=>(0,import_jsx_runtime100.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime100.jsxs)(ThemedText,{children:["\u2514 ",skill.name,": "]}),(0,import_jsx_runtime100.jsxs)(ThemedText,{dimColor:!0,children:[formatTokens(skill.tokens)," ",tokenWord]})]},i3))]},sourceDisplay))]}),messageBreakdown&&!1]}),(0,import_jsx_runtime100.jsx)(ContextSuggestions,{suggestions:generateContextSuggestions(data)})]})}var import_jsx_runtime100,RESERVED_CATEGORY_NAME2,SOURCE_DISPLAY_ORDER,CATEGORY_ZH_MAP,init_ContextVisualization=__esm({"src/components/ContextVisualization.tsx"(){init_ink();init_contextSuggestions();init_file();init_format2();init_constants2();init_stringUtils();init_uiLocale();init_ContextSuggestions();import_jsx_runtime100=__toESM(require_jsx_runtime()),RESERVED_CATEGORY_NAME2="Autocompact buffer";__name(CollapseStatus,"CollapseStatus");SOURCE_DISPLAY_ORDER=["Project","User","Managed","Plugin","Built-in"];__name(groupBySource,"groupBySource");CATEGORY_ZH_MAP={"System prompt":"\u7CFB\u7EDF\u63D0\u793A","System tools":"\u7CFB\u7EDF\u5DE5\u5177","MCP tools":"MCP \u5DE5\u5177","Custom agents":"\u81EA\u5B9A\u4E49 Agent","Memory files":"\u8BB0\u5FC6\u6587\u4EF6",Messages:"\u6D88\u606F\u5386\u53F2","Tool results":"\u5DE5\u5177\u7ED3\u679C",Attachments:"\u9644\u4EF6",Skills:"\u6280\u80FD","Free space":"\u7A7A\u95F2\u7A7A\u95F4","Autocompact buffer":"\u81EA\u52A8\u538B\u7F29\u7F13\u51B2"};__name(localizeCategoryName,"localizeCategoryName");__name(ContextVisualization,"ContextVisualization")}});function reactNodeToPlainText(node){if(node==null||typeof node=="boolean")return"";if(typeof node=="string"||typeof node=="number")return String(node);if(Array.isArray(node))return node.map(reactNodeToPlainText).join("");if(React41.isValidElement(node)){let props=node.props;return reactNodeToPlainText(props?.children)}return""}function renderToAnsiString(node,_columns){return Promise.resolve(reactNodeToPlainText(node))}async function renderToString(node,columns){let output2=await renderToAnsiString(node,columns);return stripAnsi(output2)}var React41,init_staticRender=__esm({"src/utils/staticRender.tsx"(){React41=__toESM(require_react());init_strip_ansi();__name(reactNodeToPlainText,"reactNodeToPlainText");__name(renderToAnsiString,"renderToAnsiString");__name(renderToString,"renderToString")}});var context_exports={};__export(context_exports,{call:()=>call23});function toApiView(messages){return getMessagesAfterCompactBoundary(messages)}async function call23(onDone,context3){let{messages,getAppState,options:{mainLoopModel,tools}}=context3,apiView=toApiView(messages),{messages:compactedMessages}=await microcompactMessages(apiView),terminalWidth=process.stdout.columns||80,appState=getAppState(),data=await analyzeContextUsage(compactedMessages,mainLoopModel,async()=>appState.toolPermissionContext,tools,appState.agentDefinitions,terminalWidth,context3,void 0,apiView),output2=await renderToAnsiString((0,import_jsx_runtime101.jsx)(ContextVisualization,{data}));return onDone(output2),null}var import_jsx_runtime101,init_context3=__esm({"src/commands/context/context.tsx"(){init_ContextVisualization();init_microCompact();init_analyzeContext();init_messages4();init_staticRender();import_jsx_runtime101=__toESM(require_jsx_runtime());__name(toApiView,"toApiView");__name(call23,"call")}});var context_noninteractive_exports={};__export(context_noninteractive_exports,{call:()=>call24,collectContextData:()=>collectContextData});async function collectContextData(context3){let{messages,getAppState,options:{mainLoopModel,tools,agentDefinitions,customSystemPrompt,appendSystemPrompt}}=context3,apiView=getMessagesAfterCompactBoundary(messages),{messages:compactedMessages}=await microcompactMessages(apiView),appState=getAppState();return analyzeContextUsage(compactedMessages,mainLoopModel,async()=>appState.toolPermissionContext,tools,agentDefinitions,void 0,{options:{customSystemPrompt,appendSystemPrompt}},void 0,apiView)}async function call24(_args,context3){let data=await collectContextData(context3);return{type:"text",value:formatContextAsMarkdownTable(data)}}function formatContextAsMarkdownTable(data){let{categories,totalTokens,rawMaxTokens,percentage,model,memoryFiles,mcpTools,agents:agents2,skills:skills2,messageBreakdown,systemTools,systemPromptSections}=data,output2=`## Context Usage
6844
6844
 
6845
6845
  `;output2+=`**Model:** ${model}
6846
6846
  `,output2+=`**Tokens:** ${formatTokens(totalTokens)} / ${formatTokens(rawMaxTokens)} (${percentage}%)`;let windowSnapshotAge=getProviderWindowSnapshotAge(model);windowSnapshotAge!=null&&(output2+=windowSnapshotAge>=36e5?` \u2014 window snapshot ${(windowSnapshotAge/36e5).toFixed(1)}h old`:` \u2014 window snapshot ${Math.round(windowSnapshotAge/6e4)}m old`),output2+=`
@@ -7116,7 +7116,7 @@ ${editorHint}`,{display:"system"})}catch(error40){logError2(error40),onDone(`Err
7116
7116
  4. Report saved image/video paths and a one-line caption. Do not claim you cannot generate media.
7117
7117
 
7118
7118
  Description:
7119
- ${prompt.trim()}`}var imagineVideo,imagine_video_default,init_imagine_video=__esm({"src/commands/imagine-video/index.ts"(){init_prompt10();__name(imagineVideoInstruction,"imagineVideoInstruction");imagineVideo={type:"prompt",name:"imagine-video",description:"Generate a short video from a description (Grok /imagine-video)",aliases:["imagine_video","imaginevideo"],progressMessage:"planning video",contentLength:280,argNames:["description"],allowedTools:[IMAGE_GEN_TOOL_NAME],source:"builtin",argumentHint:"<description>",async getPromptForCommand(args){let prompt=args.trim();return prompt?[{type:"text",text:imagineVideoInstruction(prompt)}]:[{type:"text",text:"Usage: /imagine-video <description> \u2014 e.g. /imagine-video a cat playing piano in a jazz club"}]}},imagine_video_default=imagineVideo}});function Commands({commands,maxHeight,columns,title,onCancel,emptyMessage}){let{headerFocused,focusHeader}=useTabHeaderFocus(),maxWidth=Math.max(1,columns-10),visibleCount=Math.max(1,Math.floor((maxHeight-10)/2)),options=(0,import_react82.useMemo)(()=>{let seen2=new Set;return commands.filter(cmd=>seen2.has(cmd.name)?!1:(seen2.add(cmd.name),!0)).sort((a2,b3)=>a2.name.localeCompare(b3.name)).map(cmd=>({label:`/${cmd.name}`,value:cmd.name,description:truncate2(formatDescriptionWithSource(cmd),maxWidth,!0)}))},[commands,maxWidth]);return(0,import_jsx_runtime109.jsx)(ThemedBox_default,{flexDirection:"column",paddingY:1,children:commands.length===0&&emptyMessage?(0,import_jsx_runtime109.jsx)(ThemedText,{dimColor:!0,children:emptyMessage}):(0,import_jsx_runtime109.jsxs)(import_jsx_runtime109.Fragment,{children:[(0,import_jsx_runtime109.jsx)(ThemedText,{children:title}),(0,import_jsx_runtime109.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime109.jsx)(Select,{options,visibleOptionCount:visibleCount,onCancel,disableSelection:!0,hideIndexes:!0,layout:"compact-vertical",onUpFromFirstItem:focusHeader,isDisabled:headerFocused})})]})})}var import_react82,import_jsx_runtime109,init_Commands=__esm({"src/components/HelpV2/Commands.tsx"(){import_react82=__toESM(require_react());init_commands2();init_ink();init_format2();init_select();init_Tabs();import_jsx_runtime109=__toESM(require_jsx_runtime());__name(Commands,"Commands")}});function getNewlineInstructions(){return env4.terminal==="Apple_Terminal"&&process.platform==="darwin"||isShiftEnterKeyBindingInstalled()?"shift + \u23CE for newline":hasUsedBackslashReturn()?"\\\u23CE for newline":"backslash (\\) + return (\u23CE) for newline"}var init_utils11=__esm({"src/components/PromptInput/utils.ts"(){init_terminalSetup();init_config12();init_env2();__name(getNewlineInstructions,"getNewlineInstructions")}});function formatShortcut(shortcut){return shortcut.replace(/\+/g," + ")}function PromptInputHelpMenu(props){let{dimColor,fixedWidth,gap,paddingX}=props,isZh7=resolveUiLocale()==="zh-CN",transcriptShortcut=formatShortcut(useShortcutDisplay("app:toggleTranscript","Global","ctrl+o")),todosShortcut=formatShortcut(useShortcutDisplay("app:toggleTodos","Global","ctrl+t")),undoShortcut=formatShortcut(useShortcutDisplay("chat:undo","Chat","ctrl+_")),stashShortcut=formatShortcut(useShortcutDisplay("chat:stash","Chat","ctrl+s")),cycleModeShortcut=formatShortcut(useShortcutDisplay("chat:cycleMode","Chat","shift+tab")),modelPickerShortcut=formatShortcut(useShortcutDisplay("chat:modelPicker","Chat","alt+p")),fastModeShortcut=formatShortcut(useShortcutDisplay("chat:fastMode","Chat","alt+o")),externalEditorShortcut=formatShortcut(useShortcutDisplay("chat:externalEditor","Chat","ctrl+g")),terminalShortcut=formatShortcut(useShortcutDisplay("app:toggleTerminal","Global","meta+j")),imagePasteShortcut=formatShortcut(useShortcutDisplay("chat:imagePaste","Chat","ctrl+v"));return(0,import_jsx_runtime110.jsxs)(ThemedBox_default,{paddingX,flexDirection:"row",gap,children:[(0,import_jsx_runtime110.jsxs)(ThemedBox_default,{flexDirection:"column",width:fixedWidth?24:void 0,children:[(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["! ",isZh7?"\u8FDB\u5165 bash \u6A21\u5F0F":"for bash mode"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["/ ",isZh7?"\u89E6\u53D1\u547D\u4EE4":"for commands"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["@ ",isZh7?"\u63D2\u5165\u6587\u4EF6\u8DEF\u5F84":"for file paths"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["& ",isZh7?"\u540E\u53F0\u8FD0\u884C":"for background"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["/btw ",isZh7?"\u63D2\u5165\u5C0F\u95EE\u9898":"for side question"]})})]}),(0,import_jsx_runtime110.jsxs)(ThemedBox_default,{flexDirection:"column",width:fixedWidth?35:void 0,children:[(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsx)(ThemedText,{dimColor,children:isZh7?"\u8FDE\u6309\u4E24\u6B21 esc \u6E05\u7A7A\u8F93\u5165":"double tap esc to clear input"})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[cycleModeShortcut," ",isZh7?"\u81EA\u52A8\u63A5\u53D7\u7F16\u8F91":"to auto-accept edits"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[transcriptShortcut," ",isZh7?"\u663E\u793A\u8BE6\u7EC6\u8F93\u51FA":"for verbose output"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[todosShortcut," ",isZh7?"\u5C55\u5F00/\u6298\u53E0\u4EFB\u52A1":"to toggle tasks"]})}),null,(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsx)(ThemedText,{dimColor,children:getNewlineInstructions()})})]}),(0,import_jsx_runtime110.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[undoShortcut," ",isZh7?"\u64A4\u9500":"to undo"]})}),getPlatform()!=="windows"&&(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["ctrl + z ",isZh7?"\u6302\u8D77\u8FDB\u7A0B":"to suspend"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[imagePasteShortcut," ",isZh7?"\u7C98\u8D34\u56FE\u7247":"to paste images"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[modelPickerShortcut," ",isZh7?"\u5207\u6362\u6A21\u578B":"to switch model"]})}),isFastModeEnabled()&&isFastModeAvailable()&&(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[fastModeShortcut," ",isZh7?"\u5207\u6362\u6781\u901F\u6A21\u5F0F":"to toggle fast mode"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[stashShortcut," ",isZh7?"\u6682\u5B58\u63D0\u793A\u8BCD":"to stash prompt"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[externalEditorShortcut," ",isZh7?"\u7528 $EDITOR \u7F16\u8F91":"to edit in $EDITOR"]})}),isKeybindingCustomizationEnabled()&&(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["/keybindings ",isZh7?"\u81EA\u5B9A\u4E49\u5FEB\u6377\u952E":"to customize"]})})]})]})}var import_jsx_runtime110,init_PromptInputHelpMenu=__esm({"src/components/PromptInput/PromptInputHelpMenu.tsx"(){init_ink();init_platform2();init_loadUserBindings();init_useShortcutDisplay();init_growthbook();init_fastMode();init_uiLocale();init_utils11();import_jsx_runtime110=__toESM(require_jsx_runtime());__name(formatShortcut,"formatShortcut");__name(PromptInputHelpMenu,"PromptInputHelpMenu")}});function General(){let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime111.jsxs)(ThemedBox_default,{flexDirection:"column",paddingY:1,gap:1,children:[(0,import_jsx_runtime111.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime111.jsx)(ThemedText,{children:isZh7?HELP_GENERAL_ZH:HELP_GENERAL_EN})}),(0,import_jsx_runtime111.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime111.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime111.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5FEB\u6377\u952E":"Shortcuts"})}),(0,import_jsx_runtime111.jsx)(PromptInputHelpMenu,{gap:2,fixedWidth:!0})]})]})}var import_jsx_runtime111,HELP_GENERAL_EN,HELP_GENERAL_ZH,init_General=__esm({"src/components/HelpV2/General.tsx"(){init_ink();init_uiLocale();init_PromptInputHelpMenu();import_jsx_runtime111=__toESM(require_jsx_runtime()),HELP_GENERAL_EN="Clavue understands your codebase, makes edits with your permission, and executes commands \u2014 right from your terminal.",HELP_GENERAL_ZH="\u514B\u62C9\u7EF4 \u7406\u89E3\u4F60\u7684\u4EE3\u7801\u5E93,\u5728\u4F60\u6388\u6743\u540E\u4FEE\u6539\u6587\u4EF6,\u5E76\u76F4\u63A5\u5728\u7EC8\u7AEF\u4E2D\u6267\u884C\u547D\u4EE4\u3002";__name(General,"General")}});function HelpV2({onClose,commands}){let{rows,columns}=useTerminalSize(),maxHeight=Math.floor(rows/2),isZh7=resolveUiLocale()==="zh-CN",insideModal=useIsInsideModal(),close2=__name(()=>onClose("Help dialog dismissed",{display:"system"}),"close");useKeybinding("help:dismiss",close2,{context:"Help"});let exitState=useExitOnCtrlCDWithKeybindings(close2),dismissShortcut=useShortcutDisplay("help:dismiss","Help","esc"),builtinNames=builtInCommandNames(),builtinCommands=commands.filter(cmd=>{let classification=getCommandSurfaceClassification(cmd.name);return builtinNames.has(cmd.name)&&!cmd.isHidden&&isPublicCommandSurface(classification)}),antOnlyCommands=[],customCommands=commands.filter(cmd=>!builtinNames.has(cmd.name)&&!cmd.isHidden),tabs=[(0,import_jsx_runtime112.jsx)(Tab,{title:"general",children:(0,import_jsx_runtime112.jsx)(General,{})},"general")],builtinCommandsTitle=isZh7?"\u6D4F\u89C8\u516C\u5F00\u9ED8\u8BA4\u547D\u4EE4:":"Browse public default commands:";return tabs.push((0,import_jsx_runtime112.jsx)(Tab,{title:"commands",children:(0,import_jsx_runtime112.jsx)(Commands,{commands:builtinCommands,maxHeight,columns,title:builtinCommandsTitle,onCancel:close2})},"commands")),tabs.push((0,import_jsx_runtime112.jsx)(Tab,{title:"custom-commands",children:(0,import_jsx_runtime112.jsx)(Commands,{commands:customCommands,maxHeight,columns,title:isZh7?"\u6D4F\u89C8\u81EA\u5B9A\u4E49\u547D\u4EE4:":"Browse custom commands:",emptyMessage:isZh7?"\u6682\u65E0\u81EA\u5B9A\u4E49\u547D\u4EE4":"No custom commands found",onCancel:close2})},"custom")),(0,import_jsx_runtime112.jsx)(ThemedBox_default,{flexDirection:"column",height:insideModal?void 0:maxHeight,children:(0,import_jsx_runtime112.jsxs)(Pane,{color:"professionalBlue",children:[(0,import_jsx_runtime112.jsx)(Tabs,{title:"Clavue v13.9.1",color:"professionalBlue",defaultTab:"general",children:tabs}),(0,import_jsx_runtime112.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime112.jsxs)(ThemedText,{children:[isZh7?"\u66F4\u591A\u5E2E\u52A9: ":"For more help: ",(0,import_jsx_runtime112.jsx)(Link,{url:"https://www.clavue.com"})]})}),(0,import_jsx_runtime112.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime112.jsx)(ThemedText,{dimColor:!0,children:exitState.pending?(0,import_jsx_runtime112.jsx)(import_jsx_runtime112.Fragment,{children:isZh7?`\u518D\u6309\u4E00\u6B21 ${exitState.keyName} \u9000\u51FA`:`Press ${exitState.keyName} again to exit`}):(0,import_jsx_runtime112.jsx)(ThemedText,{italic:!0,children:isZh7?`${dismissShortcut} \u53D6\u6D88`:`${dismissShortcut} to cancel`})})})]})})}var import_jsx_runtime112,init_HelpV2=__esm({"src/components/HelpV2/HelpV2.tsx"(){init_useExitOnCtrlCDWithKeybindings();init_useShortcutDisplay();init_commands2();init_modalContext();init_useTerminalSize();init_ink();init_useKeybinding();init_uiLocale();init_Pane();init_Tabs();init_Commands();init_General();import_jsx_runtime112=__toESM(require_jsx_runtime());__name(HelpV2,"HelpV2")}});var help_exports={};__export(help_exports,{call:()=>call34});var import_jsx_runtime113,call34,init_help=__esm({"src/commands/help/help.tsx"(){init_HelpV2();import_jsx_runtime113=__toESM(require_jsx_runtime()),call34=__name(async(onDone,{options:{commands}})=>(0,import_jsx_runtime113.jsx)(HelpV2,{commands,onClose:onDone}),"call")}});var help,help_default,init_help2=__esm({"src/commands/help/index.ts"(){help={type:"local-jsx",name:"help",description:"Show help and available commands",load:__name(()=>Promise.resolve().then(()=>(init_help(),help_exports)),"load")},help_default=help}});function IdeAutoConnectDialog({onComplete}){let handleSelect=(0,import_react83.useCallback)(async value=>{let autoConnect=value==="yes";saveGlobalConfig(current=>({...current,autoConnectIde:autoConnect,hasIdeAutoConnectDialogBeenShown:!0})),onComplete()},[onComplete]),isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime114.jsxs)(Dialog,{title:isZh7?"\u662F\u5426\u542F\u7528 IDE \u81EA\u52A8\u8FDE\u63A5?":"Do you wish to enable auto-connect to IDE?",color:"ide",onCancel:onComplete,children:[(0,import_jsx_runtime114.jsx)(Select,{options:[{label:isZh7?"\u662F":"Yes",value:"yes"},{label:isZh7?"\u5426":"No",value:"no"}],onChange:handleSelect,defaultValue:"yes"}),(0,import_jsx_runtime114.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u4E5F\u53EF\u4EE5\u5728 /config \u4E2D\u914D\u7F6E,\u6216\u4F7F\u7528 --ide \u9009\u9879":"You can also configure this in /config or with the --ide flag"})]})}function shouldShowAutoConnectDialog(){let config3=getGlobalConfig();return!isSupportedTerminal()&&config3.autoConnectIde!==!0&&config3.hasIdeAutoConnectDialogBeenShown!==!0}function IdeDisableAutoConnectDialog({onComplete}){let handleSelect=(0,import_react83.useCallback)(value=>{let disableAutoConnect=value==="yes";disableAutoConnect&&saveGlobalConfig(current=>({...current,autoConnectIde:!1})),onComplete(disableAutoConnect)},[onComplete]),handleCancel=(0,import_react83.useCallback)(()=>{onComplete(!1)},[onComplete]),isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime114.jsx)(Dialog,{title:isZh7?"\u662F\u5426\u7981\u7528 IDE \u81EA\u52A8\u8FDE\u63A5?":"Do you wish to disable auto-connect to IDE?",subtitle:isZh7?"\u4E5F\u53EF\u4EE5\u5728 /config \u4E2D\u914D\u7F6E":"You can also configure this in /config",onCancel:handleCancel,color:"ide",children:(0,import_jsx_runtime114.jsx)(Select,{options:[{label:isZh7?"\u5426":"No",value:"no"},{label:isZh7?"\u662F":"Yes",value:"yes"}],onChange:handleSelect,defaultValue:"no"})})}function shouldShowDisableAutoConnectDialog(){let config3=getGlobalConfig();return!isSupportedTerminal()&&config3.autoConnectIde===!0}var import_react83,import_jsx_runtime114,init_IdeAutoConnectDialog=__esm({"src/components/IdeAutoConnectDialog.tsx"(){import_react83=__toESM(require_react());init_ink();init_config12();init_ide();init_uiLocale();init_CustomSelect();init_Dialog();import_jsx_runtime114=__toESM(require_jsx_runtime());__name(IdeAutoConnectDialog,"IdeAutoConnectDialog");__name(shouldShowAutoConnectDialog,"shouldShowAutoConnectDialog");__name(IdeDisableAutoConnectDialog,"IdeDisableAutoConnectDialog");__name(shouldShowDisableAutoConnectDialog,"shouldShowDisableAutoConnectDialog")}});var ide_exports={};__export(ide_exports,{call:()=>call35,formatWorkspaceFolders:()=>formatWorkspaceFolders});import*as path26 from"path";function IDEScreen({availableIDEs,unavailableIDEs,selectedIDE,onClose,onSelect}){let[selectedValue,setSelectedValue]=(0,import_react84.useState)(selectedIDE?.port?.toString()??"None"),[showAutoConnectDialog,setShowAutoConnectDialog]=(0,import_react84.useState)(!1),[showDisableAutoConnectDialog,setShowDisableAutoConnectDialog]=(0,import_react84.useState)(!1),handleSelectIDE=(0,import_react84.useCallback)(value=>{value!=="None"&&shouldShowAutoConnectDialog()?setShowAutoConnectDialog(!0):value==="None"&&shouldShowDisableAutoConnectDialog()?setShowDisableAutoConnectDialog(!0):onSelect(availableIDEs.find(ide2=>ide2.port===parseInt(value)))},[availableIDEs,onSelect]),ideCounts=availableIDEs.reduce((acc,ide2)=>(acc[ide2.name]=(acc[ide2.name]||0)+1,acc),{}),options=availableIDEs.map(ide2=>{let showWorkspace=(ideCounts[ide2.name]||0)>1&&ide2.workspaceFolders.length>0;return{label:ide2.name,value:ide2.port.toString(),description:showWorkspace?formatWorkspaceFolders(ide2.workspaceFolders):void 0}}).concat([{label:"None",value:"None",description:void 0}]);return showAutoConnectDialog?(0,import_jsx_runtime115.jsx)(IdeAutoConnectDialog,{onComplete:()=>handleSelectIDE(selectedValue)}):showDisableAutoConnectDialog?(0,import_jsx_runtime115.jsx)(IdeDisableAutoConnectDialog,{onComplete:()=>{onSelect(void 0)}}):(0,import_jsx_runtime115.jsx)(Dialog,{title:"Select IDE",subtitle:"Connect to an IDE for integrated development features.",onCancel:onClose,color:"ide",children:(0,import_jsx_runtime115.jsxs)(ThemedBox_default,{flexDirection:"column",children:[availableIDEs.length===0&&(0,import_jsx_runtime115.jsx)(ThemedText,{dimColor:!0,children:"No available IDEs detected. Make sure your IDE has the Clavue extension or plugin installed and is running."}),availableIDEs.length!==0&&(0,import_jsx_runtime115.jsx)(Select,{defaultValue:selectedValue,defaultFocusValue:selectedValue,options,onChange:value=>{setSelectedValue(value),handleSelectIDE(value)}}),availableIDEs.length!==0&&availableIDEs.some(ide2=>ide2.name==="VS Code"||ide2.name==="Visual Studio Code")&&(0,import_jsx_runtime115.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime115.jsx)(ThemedText,{color:"warning",children:"Note: Only one Clavue instance can be connected to VS Code at a time."})}),availableIDEs.length!==0&&!isSupportedTerminal()&&(0,import_jsx_runtime115.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime115.jsx)(ThemedText,{dimColor:!0,children:"Tip: You can enable auto-connect to IDE in /config or with the --ide flag"})}),unavailableIDEs.length>0&&(0,import_jsx_runtime115.jsxs)(ThemedBox_default,{marginTop:1,flexDirection:"column",children:[(0,import_jsx_runtime115.jsxs)(ThemedText,{dimColor:!0,children:["Found ",unavailableIDEs.length," other running IDE(s). However, their workspace/project directories do not match the current cwd."]}),(0,import_jsx_runtime115.jsx)(ThemedBox_default,{marginTop:1,flexDirection:"column",children:unavailableIDEs.map((ide2,index)=>(0,import_jsx_runtime115.jsx)(ThemedBox_default,{paddingLeft:3,children:(0,import_jsx_runtime115.jsxs)(ThemedText,{dimColor:!0,children:["\u2022 ",ide2.name,": ",formatWorkspaceFolders(ide2.workspaceFolders)]})},index))})]})]})})}async function findCurrentIDE(availableIDEs,dynamicMcpConfig){let currentConfig=dynamicMcpConfig?.ide;if(!currentConfig||currentConfig.type!=="sse-ide"&&currentConfig.type!=="ws-ide")return null;for(let ide2 of availableIDEs)if(ide2.url===currentConfig.url)return ide2;return null}function IDEOpenSelection({availableIDEs,onSelectIDE,onDone}){let[selectedValue,setSelectedValue]=(0,import_react84.useState)(availableIDEs[0]?.port?.toString()??""),handleSelectIDE=(0,import_react84.useCallback)(value=>{let selectedIDE=availableIDEs.find(ide2=>ide2.port===parseInt(value));onSelectIDE(selectedIDE)},[availableIDEs,onSelectIDE]),options=availableIDEs.map(ide2=>({label:ide2.name,value:ide2.port.toString()}));function handleCancel(){onDone("IDE selection cancelled",{display:"system"})}return __name(handleCancel,"handleCancel"),(0,import_jsx_runtime115.jsx)(Dialog,{title:"Select an IDE to open the project",onCancel:handleCancel,color:"ide",children:(0,import_jsx_runtime115.jsx)(Select,{defaultValue:selectedValue,defaultFocusValue:selectedValue,options,onChange:value=>{setSelectedValue(value),handleSelectIDE(value)}})})}function RunningIDESelector({runningIDEs,onSelectIDE,onDone}){let[selectedValue,setSelectedValue]=(0,import_react84.useState)(runningIDEs[0]??""),handleSelectIDE=(0,import_react84.useCallback)(value=>{onSelectIDE(value)},[onSelectIDE]),options=runningIDEs.map(ide2=>({label:toIDEDisplayName(ide2),value:ide2}));function handleCancel(){onDone("IDE selection cancelled",{display:"system"})}return __name(handleCancel,"handleCancel"),(0,import_jsx_runtime115.jsx)(Dialog,{title:"Select IDE to install extension",onCancel:handleCancel,color:"ide",children:(0,import_jsx_runtime115.jsx)(Select,{defaultFocusValue:selectedValue,options,onChange:value=>{setSelectedValue(value),handleSelectIDE(value)}})})}function InstallOnMount({ide:ide2,onInstall}){return(0,import_react84.useEffect)(()=>{onInstall(ide2)},[ide2,onInstall]),null}async function call35(onDone,context3,args){logEvent("tengu_ext_ide_command",{});let{options:{dynamicMcpConfig},onChangeDynamicMcpConfig}=context3;if(args?.trim()==="open"){let worktreeSession=getCurrentWorktreeSession(),targetPath=worktreeSession?worktreeSession.worktreePath:getCwd(),availableIDEs2=(await detectIDEs(!0)).filter(ide2=>ide2.isValid);return availableIDEs2.length===0?(onDone("No IDEs with Clavue extension detected."),null):(0,import_jsx_runtime115.jsx)(IDEOpenSelection,{availableIDEs:availableIDEs2,onSelectIDE:async selectedIDE=>{if(!selectedIDE){onDone("No IDE selected.");return}if(selectedIDE.name.toLowerCase().includes("vscode")||selectedIDE.name.toLowerCase().includes("cursor")||selectedIDE.name.toLowerCase().includes("windsurf")){let{code}=await execFileNoThrow("code",[targetPath]);onDone(code===0?`Opened ${worktreeSession?"worktree":"project"} in ${source_default.bold(selectedIDE.name)}`:`Failed to open in ${selectedIDE.name}. Try opening manually: ${targetPath}`)}else isSupportedJetBrainsTerminal()?onDone(`Please open the ${worktreeSession?"worktree":"project"} manually in ${source_default.bold(selectedIDE.name)}: ${targetPath}`):onDone(`Please open the ${worktreeSession?"worktree":"project"} manually in ${source_default.bold(selectedIDE.name)}: ${targetPath}`)},onDone:()=>{onDone("Exited without opening IDE",{display:"system"})}})}let detectedIDEs=await detectIDEs(!0);if(detectedIDEs.length===0&&context3.onInstallIDEExtension&&!isSupportedTerminal()){let runningIDEs=await detectRunningIDEs(),onInstall=__name(ide2=>{context3.onInstallIDEExtension&&(context3.onInstallIDEExtension(ide2),isJetBrainsIde(ide2)?onDone(`Installed plugin to ${source_default.bold(toIDEDisplayName(ide2))}
7119
+ ${prompt.trim()}`}var imagineVideo,imagine_video_default,init_imagine_video=__esm({"src/commands/imagine-video/index.ts"(){init_prompt10();__name(imagineVideoInstruction,"imagineVideoInstruction");imagineVideo={type:"prompt",name:"imagine-video",description:"Generate a short video from a description (Grok /imagine-video)",aliases:["imagine_video","imaginevideo"],progressMessage:"planning video",contentLength:280,argNames:["description"],allowedTools:[IMAGE_GEN_TOOL_NAME],source:"builtin",argumentHint:"<description>",async getPromptForCommand(args){let prompt=args.trim();return prompt?[{type:"text",text:imagineVideoInstruction(prompt)}]:[{type:"text",text:"Usage: /imagine-video <description> \u2014 e.g. /imagine-video a cat playing piano in a jazz club"}]}},imagine_video_default=imagineVideo}});function Commands({commands,maxHeight,columns,title,onCancel,emptyMessage}){let{headerFocused,focusHeader}=useTabHeaderFocus(),maxWidth=Math.max(1,columns-10),visibleCount=Math.max(1,Math.floor((maxHeight-10)/2)),options=(0,import_react82.useMemo)(()=>{let seen2=new Set;return commands.filter(cmd=>seen2.has(cmd.name)?!1:(seen2.add(cmd.name),!0)).sort((a2,b3)=>a2.name.localeCompare(b3.name)).map(cmd=>({label:`/${cmd.name}`,value:cmd.name,description:truncate2(formatDescriptionWithSource(cmd),maxWidth,!0)}))},[commands,maxWidth]);return(0,import_jsx_runtime109.jsx)(ThemedBox_default,{flexDirection:"column",paddingY:1,children:commands.length===0&&emptyMessage?(0,import_jsx_runtime109.jsx)(ThemedText,{dimColor:!0,children:emptyMessage}):(0,import_jsx_runtime109.jsxs)(import_jsx_runtime109.Fragment,{children:[(0,import_jsx_runtime109.jsx)(ThemedText,{children:title}),(0,import_jsx_runtime109.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime109.jsx)(Select,{options,visibleOptionCount:visibleCount,onCancel,disableSelection:!0,hideIndexes:!0,layout:"compact-vertical",onUpFromFirstItem:focusHeader,isDisabled:headerFocused})})]})})}var import_react82,import_jsx_runtime109,init_Commands=__esm({"src/components/HelpV2/Commands.tsx"(){import_react82=__toESM(require_react());init_commands2();init_ink();init_format2();init_select();init_Tabs();import_jsx_runtime109=__toESM(require_jsx_runtime());__name(Commands,"Commands")}});function getNewlineInstructions(){return env4.terminal==="Apple_Terminal"&&process.platform==="darwin"||isShiftEnterKeyBindingInstalled()?"shift + \u23CE for newline":hasUsedBackslashReturn()?"\\\u23CE for newline":"backslash (\\) + return (\u23CE) for newline"}var init_utils11=__esm({"src/components/PromptInput/utils.ts"(){init_terminalSetup();init_config12();init_env2();__name(getNewlineInstructions,"getNewlineInstructions")}});function formatShortcut(shortcut){return shortcut.replace(/\+/g," + ")}function PromptInputHelpMenu(props){let{dimColor,fixedWidth,gap,paddingX}=props,isZh7=resolveUiLocale()==="zh-CN",transcriptShortcut=formatShortcut(useShortcutDisplay("app:toggleTranscript","Global","ctrl+o")),todosShortcut=formatShortcut(useShortcutDisplay("app:toggleTodos","Global","ctrl+t")),undoShortcut=formatShortcut(useShortcutDisplay("chat:undo","Chat","ctrl+_")),stashShortcut=formatShortcut(useShortcutDisplay("chat:stash","Chat","ctrl+s")),cycleModeShortcut=formatShortcut(useShortcutDisplay("chat:cycleMode","Chat","shift+tab")),modelPickerShortcut=formatShortcut(useShortcutDisplay("chat:modelPicker","Chat","alt+p")),fastModeShortcut=formatShortcut(useShortcutDisplay("chat:fastMode","Chat","alt+o")),externalEditorShortcut=formatShortcut(useShortcutDisplay("chat:externalEditor","Chat","ctrl+g")),terminalShortcut=formatShortcut(useShortcutDisplay("app:toggleTerminal","Global","meta+j")),imagePasteShortcut=formatShortcut(useShortcutDisplay("chat:imagePaste","Chat","ctrl+v"));return(0,import_jsx_runtime110.jsxs)(ThemedBox_default,{paddingX,flexDirection:"row",gap,children:[(0,import_jsx_runtime110.jsxs)(ThemedBox_default,{flexDirection:"column",width:fixedWidth?24:void 0,children:[(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["! ",isZh7?"\u8FDB\u5165 bash \u6A21\u5F0F":"for bash mode"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["/ ",isZh7?"\u89E6\u53D1\u547D\u4EE4":"for commands"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["@ ",isZh7?"\u63D2\u5165\u6587\u4EF6\u8DEF\u5F84":"for file paths"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["& ",isZh7?"\u540E\u53F0\u8FD0\u884C":"for background"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["/btw ",isZh7?"\u63D2\u5165\u5C0F\u95EE\u9898":"for side question"]})})]}),(0,import_jsx_runtime110.jsxs)(ThemedBox_default,{flexDirection:"column",width:fixedWidth?35:void 0,children:[(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsx)(ThemedText,{dimColor,children:isZh7?"\u8FDE\u6309\u4E24\u6B21 esc \u6E05\u7A7A\u8F93\u5165":"double tap esc to clear input"})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[cycleModeShortcut," ",isZh7?"\u81EA\u52A8\u63A5\u53D7\u7F16\u8F91":"to auto-accept edits"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[transcriptShortcut," ",isZh7?"\u663E\u793A\u8BE6\u7EC6\u8F93\u51FA":"for verbose output"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[todosShortcut," ",isZh7?"\u5C55\u5F00/\u6298\u53E0\u4EFB\u52A1":"to toggle tasks"]})}),null,(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsx)(ThemedText,{dimColor,children:getNewlineInstructions()})})]}),(0,import_jsx_runtime110.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[undoShortcut," ",isZh7?"\u64A4\u9500":"to undo"]})}),getPlatform()!=="windows"&&(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["ctrl + z ",isZh7?"\u6302\u8D77\u8FDB\u7A0B":"to suspend"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[imagePasteShortcut," ",isZh7?"\u7C98\u8D34\u56FE\u7247":"to paste images"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[modelPickerShortcut," ",isZh7?"\u5207\u6362\u6A21\u578B":"to switch model"]})}),isFastModeEnabled()&&isFastModeAvailable()&&(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[fastModeShortcut," ",isZh7?"\u5207\u6362\u6781\u901F\u6A21\u5F0F":"to toggle fast mode"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[stashShortcut," ",isZh7?"\u6682\u5B58\u63D0\u793A\u8BCD":"to stash prompt"]})}),(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:[externalEditorShortcut," ",isZh7?"\u7528 $EDITOR \u7F16\u8F91":"to edit in $EDITOR"]})}),isKeybindingCustomizationEnabled()&&(0,import_jsx_runtime110.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime110.jsxs)(ThemedText,{dimColor,children:["/keybindings ",isZh7?"\u81EA\u5B9A\u4E49\u5FEB\u6377\u952E":"to customize"]})})]})]})}var import_jsx_runtime110,init_PromptInputHelpMenu=__esm({"src/components/PromptInput/PromptInputHelpMenu.tsx"(){init_ink();init_platform2();init_loadUserBindings();init_useShortcutDisplay();init_growthbook();init_fastMode();init_uiLocale();init_utils11();import_jsx_runtime110=__toESM(require_jsx_runtime());__name(formatShortcut,"formatShortcut");__name(PromptInputHelpMenu,"PromptInputHelpMenu")}});function General(){let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime111.jsxs)(ThemedBox_default,{flexDirection:"column",paddingY:1,gap:1,children:[(0,import_jsx_runtime111.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime111.jsx)(ThemedText,{children:isZh7?HELP_GENERAL_ZH:HELP_GENERAL_EN})}),(0,import_jsx_runtime111.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime111.jsx)(ThemedBox_default,{children:(0,import_jsx_runtime111.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5FEB\u6377\u952E":"Shortcuts"})}),(0,import_jsx_runtime111.jsx)(PromptInputHelpMenu,{gap:2,fixedWidth:!0})]})]})}var import_jsx_runtime111,HELP_GENERAL_EN,HELP_GENERAL_ZH,init_General=__esm({"src/components/HelpV2/General.tsx"(){init_ink();init_uiLocale();init_PromptInputHelpMenu();import_jsx_runtime111=__toESM(require_jsx_runtime()),HELP_GENERAL_EN="Clavue understands your codebase, makes edits with your permission, and executes commands \u2014 right from your terminal.",HELP_GENERAL_ZH="\u514B\u62C9\u7EF4 \u7406\u89E3\u4F60\u7684\u4EE3\u7801\u5E93,\u5728\u4F60\u6388\u6743\u540E\u4FEE\u6539\u6587\u4EF6,\u5E76\u76F4\u63A5\u5728\u7EC8\u7AEF\u4E2D\u6267\u884C\u547D\u4EE4\u3002";__name(General,"General")}});function HelpV2({onClose,commands}){let{rows,columns}=useTerminalSize(),maxHeight=Math.floor(rows/2),isZh7=resolveUiLocale()==="zh-CN",insideModal=useIsInsideModal(),close2=__name(()=>onClose("Help dialog dismissed",{display:"system"}),"close");useKeybinding("help:dismiss",close2,{context:"Help"});let exitState=useExitOnCtrlCDWithKeybindings(close2),dismissShortcut=useShortcutDisplay("help:dismiss","Help","esc"),builtinNames=builtInCommandNames(),builtinCommands=commands.filter(cmd=>{let classification=getCommandSurfaceClassification(cmd.name);return builtinNames.has(cmd.name)&&!cmd.isHidden&&isPublicCommandSurface(classification)}),antOnlyCommands=[],customCommands=commands.filter(cmd=>!builtinNames.has(cmd.name)&&!cmd.isHidden),tabs=[(0,import_jsx_runtime112.jsx)(Tab,{title:"general",children:(0,import_jsx_runtime112.jsx)(General,{})},"general")],builtinCommandsTitle=isZh7?"\u6D4F\u89C8\u516C\u5F00\u9ED8\u8BA4\u547D\u4EE4:":"Browse public default commands:";return tabs.push((0,import_jsx_runtime112.jsx)(Tab,{title:"commands",children:(0,import_jsx_runtime112.jsx)(Commands,{commands:builtinCommands,maxHeight,columns,title:builtinCommandsTitle,onCancel:close2})},"commands")),tabs.push((0,import_jsx_runtime112.jsx)(Tab,{title:"custom-commands",children:(0,import_jsx_runtime112.jsx)(Commands,{commands:customCommands,maxHeight,columns,title:isZh7?"\u6D4F\u89C8\u81EA\u5B9A\u4E49\u547D\u4EE4:":"Browse custom commands:",emptyMessage:isZh7?"\u6682\u65E0\u81EA\u5B9A\u4E49\u547D\u4EE4":"No custom commands found",onCancel:close2})},"custom")),(0,import_jsx_runtime112.jsx)(ThemedBox_default,{flexDirection:"column",height:insideModal?void 0:maxHeight,children:(0,import_jsx_runtime112.jsxs)(Pane,{color:"professionalBlue",children:[(0,import_jsx_runtime112.jsx)(Tabs,{title:"Clavue v13.9.2",color:"professionalBlue",defaultTab:"general",children:tabs}),(0,import_jsx_runtime112.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime112.jsxs)(ThemedText,{children:[isZh7?"\u66F4\u591A\u5E2E\u52A9: ":"For more help: ",(0,import_jsx_runtime112.jsx)(Link,{url:"https://www.clavue.com"})]})}),(0,import_jsx_runtime112.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime112.jsx)(ThemedText,{dimColor:!0,children:exitState.pending?(0,import_jsx_runtime112.jsx)(import_jsx_runtime112.Fragment,{children:isZh7?`\u518D\u6309\u4E00\u6B21 ${exitState.keyName} \u9000\u51FA`:`Press ${exitState.keyName} again to exit`}):(0,import_jsx_runtime112.jsx)(ThemedText,{italic:!0,children:isZh7?`${dismissShortcut} \u53D6\u6D88`:`${dismissShortcut} to cancel`})})})]})})}var import_jsx_runtime112,init_HelpV2=__esm({"src/components/HelpV2/HelpV2.tsx"(){init_useExitOnCtrlCDWithKeybindings();init_useShortcutDisplay();init_commands2();init_modalContext();init_useTerminalSize();init_ink();init_useKeybinding();init_uiLocale();init_Pane();init_Tabs();init_Commands();init_General();import_jsx_runtime112=__toESM(require_jsx_runtime());__name(HelpV2,"HelpV2")}});var help_exports={};__export(help_exports,{call:()=>call34});var import_jsx_runtime113,call34,init_help=__esm({"src/commands/help/help.tsx"(){init_HelpV2();import_jsx_runtime113=__toESM(require_jsx_runtime()),call34=__name(async(onDone,{options:{commands}})=>(0,import_jsx_runtime113.jsx)(HelpV2,{commands,onClose:onDone}),"call")}});var help,help_default,init_help2=__esm({"src/commands/help/index.ts"(){help={type:"local-jsx",name:"help",description:"Show help and available commands",load:__name(()=>Promise.resolve().then(()=>(init_help(),help_exports)),"load")},help_default=help}});function IdeAutoConnectDialog({onComplete}){let handleSelect=(0,import_react83.useCallback)(async value=>{let autoConnect=value==="yes";saveGlobalConfig(current=>({...current,autoConnectIde:autoConnect,hasIdeAutoConnectDialogBeenShown:!0})),onComplete()},[onComplete]),isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime114.jsxs)(Dialog,{title:isZh7?"\u662F\u5426\u542F\u7528 IDE \u81EA\u52A8\u8FDE\u63A5?":"Do you wish to enable auto-connect to IDE?",color:"ide",onCancel:onComplete,children:[(0,import_jsx_runtime114.jsx)(Select,{options:[{label:isZh7?"\u662F":"Yes",value:"yes"},{label:isZh7?"\u5426":"No",value:"no"}],onChange:handleSelect,defaultValue:"yes"}),(0,import_jsx_runtime114.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u4E5F\u53EF\u4EE5\u5728 /config \u4E2D\u914D\u7F6E,\u6216\u4F7F\u7528 --ide \u9009\u9879":"You can also configure this in /config or with the --ide flag"})]})}function shouldShowAutoConnectDialog(){let config3=getGlobalConfig();return!isSupportedTerminal()&&config3.autoConnectIde!==!0&&config3.hasIdeAutoConnectDialogBeenShown!==!0}function IdeDisableAutoConnectDialog({onComplete}){let handleSelect=(0,import_react83.useCallback)(value=>{let disableAutoConnect=value==="yes";disableAutoConnect&&saveGlobalConfig(current=>({...current,autoConnectIde:!1})),onComplete(disableAutoConnect)},[onComplete]),handleCancel=(0,import_react83.useCallback)(()=>{onComplete(!1)},[onComplete]),isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime114.jsx)(Dialog,{title:isZh7?"\u662F\u5426\u7981\u7528 IDE \u81EA\u52A8\u8FDE\u63A5?":"Do you wish to disable auto-connect to IDE?",subtitle:isZh7?"\u4E5F\u53EF\u4EE5\u5728 /config \u4E2D\u914D\u7F6E":"You can also configure this in /config",onCancel:handleCancel,color:"ide",children:(0,import_jsx_runtime114.jsx)(Select,{options:[{label:isZh7?"\u5426":"No",value:"no"},{label:isZh7?"\u662F":"Yes",value:"yes"}],onChange:handleSelect,defaultValue:"no"})})}function shouldShowDisableAutoConnectDialog(){let config3=getGlobalConfig();return!isSupportedTerminal()&&config3.autoConnectIde===!0}var import_react83,import_jsx_runtime114,init_IdeAutoConnectDialog=__esm({"src/components/IdeAutoConnectDialog.tsx"(){import_react83=__toESM(require_react());init_ink();init_config12();init_ide();init_uiLocale();init_CustomSelect();init_Dialog();import_jsx_runtime114=__toESM(require_jsx_runtime());__name(IdeAutoConnectDialog,"IdeAutoConnectDialog");__name(shouldShowAutoConnectDialog,"shouldShowAutoConnectDialog");__name(IdeDisableAutoConnectDialog,"IdeDisableAutoConnectDialog");__name(shouldShowDisableAutoConnectDialog,"shouldShowDisableAutoConnectDialog")}});var ide_exports={};__export(ide_exports,{call:()=>call35,formatWorkspaceFolders:()=>formatWorkspaceFolders});import*as path26 from"path";function IDEScreen({availableIDEs,unavailableIDEs,selectedIDE,onClose,onSelect}){let[selectedValue,setSelectedValue]=(0,import_react84.useState)(selectedIDE?.port?.toString()??"None"),[showAutoConnectDialog,setShowAutoConnectDialog]=(0,import_react84.useState)(!1),[showDisableAutoConnectDialog,setShowDisableAutoConnectDialog]=(0,import_react84.useState)(!1),handleSelectIDE=(0,import_react84.useCallback)(value=>{value!=="None"&&shouldShowAutoConnectDialog()?setShowAutoConnectDialog(!0):value==="None"&&shouldShowDisableAutoConnectDialog()?setShowDisableAutoConnectDialog(!0):onSelect(availableIDEs.find(ide2=>ide2.port===parseInt(value)))},[availableIDEs,onSelect]),ideCounts=availableIDEs.reduce((acc,ide2)=>(acc[ide2.name]=(acc[ide2.name]||0)+1,acc),{}),options=availableIDEs.map(ide2=>{let showWorkspace=(ideCounts[ide2.name]||0)>1&&ide2.workspaceFolders.length>0;return{label:ide2.name,value:ide2.port.toString(),description:showWorkspace?formatWorkspaceFolders(ide2.workspaceFolders):void 0}}).concat([{label:"None",value:"None",description:void 0}]);return showAutoConnectDialog?(0,import_jsx_runtime115.jsx)(IdeAutoConnectDialog,{onComplete:()=>handleSelectIDE(selectedValue)}):showDisableAutoConnectDialog?(0,import_jsx_runtime115.jsx)(IdeDisableAutoConnectDialog,{onComplete:()=>{onSelect(void 0)}}):(0,import_jsx_runtime115.jsx)(Dialog,{title:"Select IDE",subtitle:"Connect to an IDE for integrated development features.",onCancel:onClose,color:"ide",children:(0,import_jsx_runtime115.jsxs)(ThemedBox_default,{flexDirection:"column",children:[availableIDEs.length===0&&(0,import_jsx_runtime115.jsx)(ThemedText,{dimColor:!0,children:"No available IDEs detected. Make sure your IDE has the Clavue extension or plugin installed and is running."}),availableIDEs.length!==0&&(0,import_jsx_runtime115.jsx)(Select,{defaultValue:selectedValue,defaultFocusValue:selectedValue,options,onChange:value=>{setSelectedValue(value),handleSelectIDE(value)}}),availableIDEs.length!==0&&availableIDEs.some(ide2=>ide2.name==="VS Code"||ide2.name==="Visual Studio Code")&&(0,import_jsx_runtime115.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime115.jsx)(ThemedText,{color:"warning",children:"Note: Only one Clavue instance can be connected to VS Code at a time."})}),availableIDEs.length!==0&&!isSupportedTerminal()&&(0,import_jsx_runtime115.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime115.jsx)(ThemedText,{dimColor:!0,children:"Tip: You can enable auto-connect to IDE in /config or with the --ide flag"})}),unavailableIDEs.length>0&&(0,import_jsx_runtime115.jsxs)(ThemedBox_default,{marginTop:1,flexDirection:"column",children:[(0,import_jsx_runtime115.jsxs)(ThemedText,{dimColor:!0,children:["Found ",unavailableIDEs.length," other running IDE(s). However, their workspace/project directories do not match the current cwd."]}),(0,import_jsx_runtime115.jsx)(ThemedBox_default,{marginTop:1,flexDirection:"column",children:unavailableIDEs.map((ide2,index)=>(0,import_jsx_runtime115.jsx)(ThemedBox_default,{paddingLeft:3,children:(0,import_jsx_runtime115.jsxs)(ThemedText,{dimColor:!0,children:["\u2022 ",ide2.name,": ",formatWorkspaceFolders(ide2.workspaceFolders)]})},index))})]})]})})}async function findCurrentIDE(availableIDEs,dynamicMcpConfig){let currentConfig=dynamicMcpConfig?.ide;if(!currentConfig||currentConfig.type!=="sse-ide"&&currentConfig.type!=="ws-ide")return null;for(let ide2 of availableIDEs)if(ide2.url===currentConfig.url)return ide2;return null}function IDEOpenSelection({availableIDEs,onSelectIDE,onDone}){let[selectedValue,setSelectedValue]=(0,import_react84.useState)(availableIDEs[0]?.port?.toString()??""),handleSelectIDE=(0,import_react84.useCallback)(value=>{let selectedIDE=availableIDEs.find(ide2=>ide2.port===parseInt(value));onSelectIDE(selectedIDE)},[availableIDEs,onSelectIDE]),options=availableIDEs.map(ide2=>({label:ide2.name,value:ide2.port.toString()}));function handleCancel(){onDone("IDE selection cancelled",{display:"system"})}return __name(handleCancel,"handleCancel"),(0,import_jsx_runtime115.jsx)(Dialog,{title:"Select an IDE to open the project",onCancel:handleCancel,color:"ide",children:(0,import_jsx_runtime115.jsx)(Select,{defaultValue:selectedValue,defaultFocusValue:selectedValue,options,onChange:value=>{setSelectedValue(value),handleSelectIDE(value)}})})}function RunningIDESelector({runningIDEs,onSelectIDE,onDone}){let[selectedValue,setSelectedValue]=(0,import_react84.useState)(runningIDEs[0]??""),handleSelectIDE=(0,import_react84.useCallback)(value=>{onSelectIDE(value)},[onSelectIDE]),options=runningIDEs.map(ide2=>({label:toIDEDisplayName(ide2),value:ide2}));function handleCancel(){onDone("IDE selection cancelled",{display:"system"})}return __name(handleCancel,"handleCancel"),(0,import_jsx_runtime115.jsx)(Dialog,{title:"Select IDE to install extension",onCancel:handleCancel,color:"ide",children:(0,import_jsx_runtime115.jsx)(Select,{defaultFocusValue:selectedValue,options,onChange:value=>{setSelectedValue(value),handleSelectIDE(value)}})})}function InstallOnMount({ide:ide2,onInstall}){return(0,import_react84.useEffect)(()=>{onInstall(ide2)},[ide2,onInstall]),null}async function call35(onDone,context3,args){logEvent("tengu_ext_ide_command",{});let{options:{dynamicMcpConfig},onChangeDynamicMcpConfig}=context3;if(args?.trim()==="open"){let worktreeSession=getCurrentWorktreeSession(),targetPath=worktreeSession?worktreeSession.worktreePath:getCwd(),availableIDEs2=(await detectIDEs(!0)).filter(ide2=>ide2.isValid);return availableIDEs2.length===0?(onDone("No IDEs with Clavue extension detected."),null):(0,import_jsx_runtime115.jsx)(IDEOpenSelection,{availableIDEs:availableIDEs2,onSelectIDE:async selectedIDE=>{if(!selectedIDE){onDone("No IDE selected.");return}if(selectedIDE.name.toLowerCase().includes("vscode")||selectedIDE.name.toLowerCase().includes("cursor")||selectedIDE.name.toLowerCase().includes("windsurf")){let{code}=await execFileNoThrow("code",[targetPath]);onDone(code===0?`Opened ${worktreeSession?"worktree":"project"} in ${source_default.bold(selectedIDE.name)}`:`Failed to open in ${selectedIDE.name}. Try opening manually: ${targetPath}`)}else isSupportedJetBrainsTerminal()?onDone(`Please open the ${worktreeSession?"worktree":"project"} manually in ${source_default.bold(selectedIDE.name)}: ${targetPath}`):onDone(`Please open the ${worktreeSession?"worktree":"project"} manually in ${source_default.bold(selectedIDE.name)}: ${targetPath}`)},onDone:()=>{onDone("Exited without opening IDE",{display:"system"})}})}let detectedIDEs=await detectIDEs(!0);if(detectedIDEs.length===0&&context3.onInstallIDEExtension&&!isSupportedTerminal()){let runningIDEs=await detectRunningIDEs(),onInstall=__name(ide2=>{context3.onInstallIDEExtension&&(context3.onInstallIDEExtension(ide2),isJetBrainsIde(ide2)?onDone(`Installed plugin to ${source_default.bold(toIDEDisplayName(ide2))}
7120
7120
  Please ${source_default.bold("restart your IDE")} completely for it to take effect`):onDone(`Installed extension to ${source_default.bold(toIDEDisplayName(ide2))}`))},"onInstall");if(runningIDEs.length>1)return(0,import_jsx_runtime115.jsx)(RunningIDESelector,{runningIDEs,onSelectIDE:onInstall,onDone:()=>{onDone("No IDE selected.",{display:"system"})}});if(runningIDEs.length===1)return(0,import_jsx_runtime115.jsx)(InstallOnMount,{ide:runningIDEs[0],onInstall})}let availableIDEs=detectedIDEs.filter(ide2=>ide2.isValid),unavailableIDEs=detectedIDEs.filter(ide2=>!ide2.isValid),currentIDE=await findCurrentIDE(availableIDEs,dynamicMcpConfig);return(0,import_jsx_runtime115.jsx)(IDECommandFlow,{availableIDEs,unavailableIDEs,currentIDE,dynamicMcpConfig,onChangeDynamicMcpConfig,onDone})}function IDECommandFlow({availableIDEs,unavailableIDEs,currentIDE,dynamicMcpConfig,onChangeDynamicMcpConfig,onDone}){let[connectingIDE,setConnectingIDE]=(0,import_react84.useState)(null),ideClient=useAppState(s2=>s2.mcp.clients.find(c4=>c4.name==="ide")),setAppState=useSetAppState(),isFirstCheckRef=(0,import_react84.useRef)(!0);(0,import_react84.useEffect)(()=>{if(connectingIDE){if(isFirstCheckRef.current){isFirstCheckRef.current=!1;return}!ideClient||ideClient.type==="pending"||(ideClient.type==="connected"?onDone(`Connected to ${connectingIDE.name}.`):ideClient.type==="failed"&&onDone(`Failed to connect to ${connectingIDE.name}.`))}},[ideClient,connectingIDE,onDone]),(0,import_react84.useEffect)(()=>{if(!connectingIDE)return;let timer2=setTimeout(onDone,IDE_CONNECTION_TIMEOUT_MS,`Connection to ${connectingIDE.name} timed out.`);return()=>clearTimeout(timer2)},[connectingIDE,onDone]);let handleSelectIDE=(0,import_react84.useCallback)(selectedIDE=>{if(!onChangeDynamicMcpConfig){onDone("Error connecting to IDE.");return}let newConfig={...dynamicMcpConfig||{}};if(currentIDE&&delete newConfig.ide,!selectedIDE){ideClient&&ideClient.type==="connected"&&currentIDE&&(ideClient.client.onclose=()=>{},clearServerCache("ide",ideClient.config),setAppState(prev=>({...prev,mcp:{...prev.mcp,clients:prev.mcp.clients.filter(c4=>c4.name!=="ide"),tools:prev.mcp.tools.filter(t7=>!t7.name?.startsWith("mcp__ide__")),commands:prev.mcp.commands.filter(c4=>!c4.name?.startsWith("mcp__ide__"))}}))),onChangeDynamicMcpConfig(newConfig),onDone(currentIDE?`Disconnected from ${currentIDE.name}.`:"No IDE selected.");return}let url3=selectedIDE.url;newConfig.ide={type:url3.startsWith("ws:")?"ws-ide":"sse-ide",url:url3,ideName:selectedIDE.name,authToken:selectedIDE.authToken,ideRunningInWindows:selectedIDE.ideRunningInWindows,scope:"dynamic"},isFirstCheckRef.current=!0,setConnectingIDE(selectedIDE),onChangeDynamicMcpConfig(newConfig)},[dynamicMcpConfig,currentIDE,ideClient,setAppState,onChangeDynamicMcpConfig,onDone]);return connectingIDE?(0,import_jsx_runtime115.jsxs)(ThemedText,{dimColor:!0,children:["Connecting to ",connectingIDE.name,"\u2026"]}):(0,import_jsx_runtime115.jsx)(IDEScreen,{availableIDEs,unavailableIDEs,selectedIDE:currentIDE,onClose:()=>onDone("IDE selection cancelled",{display:"system"}),onSelect:handleSelectIDE})}function formatWorkspaceFolders(folders,maxLength=100){if(folders.length===0)return"";let cwd6=getCwd(),foldersToShow=folders.slice(0,2),hasMore=folders.length>2,ellipsisOverhead=hasMore?3:0,separatorOverhead=(foldersToShow.length-1)*2,availableLength=maxLength-separatorOverhead-ellipsisOverhead,maxLengthPerPath=Math.floor(availableLength/foldersToShow.length),cwdNFC=cwd6.normalize("NFC"),result2=foldersToShow.map(folder=>{let folderNFC=folder.normalize("NFC");return folderNFC.startsWith(cwdNFC+path26.sep)&&(folder=folderNFC.slice(cwdNFC.length+1)),folder.length<=maxLengthPerPath?folder:"\u2026"+folder.slice(-(maxLengthPerPath-1))}).join(", ");return hasMore&&(result2+=", \u2026"),result2}var import_react84,import_jsx_runtime115,IDE_CONNECTION_TIMEOUT_MS,init_ide2=__esm({"src/commands/ide/ide.tsx"(){init_source();import_react84=__toESM(require_react());init_analytics();init_CustomSelect();init_Dialog();init_IdeAutoConnectDialog();init_ink();init_client9();init_AppState();init_cwd2();init_execFileNoThrow();init_ide();init_worktree();import_jsx_runtime115=__toESM(require_jsx_runtime());__name(IDEScreen,"IDEScreen");__name(findCurrentIDE,"findCurrentIDE");__name(IDEOpenSelection,"IDEOpenSelection");__name(RunningIDESelector,"RunningIDESelector");__name(InstallOnMount,"InstallOnMount");__name(call35,"call");IDE_CONNECTION_TIMEOUT_MS=35e3;__name(IDECommandFlow,"IDECommandFlow");__name(formatWorkspaceFolders,"formatWorkspaceFolders")}});var ide,ide_default,init_ide3=__esm({"src/commands/ide/index.ts"(){ide={type:"local-jsx",name:"ide",description:"Manage IDE integrations and show status",argumentHint:"[open]",load:__name(()=>Promise.resolve().then(()=>(init_ide2(),ide_exports)),"load")},ide_default=ide}});import{existsSync as existsSync37,readFileSync as readFileSync42,readdirSync as readdirSync11,statSync as statSync13}from"node:fs";import{join as join172}from"node:path";function normalizeRunTag(raw){return String(raw||"").trim().replace(/[^\w.-]+/g,"-").replace(/^-+|-+$/g,"")}function countLines4(text3){return text3?text3.replace(/\s+$/,"").split(/\r?\n/).length:0}function readIfExists(path40){try{return existsSync37(path40)?readFileSync42(path40,"utf8"):null}catch{return null}}function findClavueMd(cwd6){let candidates=[join172(cwd6,"clavue.md"),join172(cwd6,".clavue","clavue.md")];for(let p of candidates)if(existsSync37(p))return p;return null}function findAgentsMd(cwd6){for(let name of["AGENTS.md","Agents.md"]){let p=join172(cwd6,name);if(existsSync37(p))return p}return null}function countRules(cwd6){let dir=join172(cwd6,".clavue","rules");try{return readdirSync11(dir).filter(n4=>n4.endsWith(".md")).length}catch{return 0}}function scoreInitLedger(cwd6,runTag,mode2="default"){let tag2=normalizeRunTag(runTag),m3=mode2==="full"?"full":mode2==="diagnose"?"diagnose":"default",reasons=[];if(m3==="diagnose")return{runTag:tag2,mode:m3,clavuePath:findClavueMd(cwd6),agentsPath:findAgentsMd(cwd6),clavueLines:0,agentsLines:0,rulesCount:countRules(cwd6),hasClavueHeader:!1,hasAgentsHeader:!1,claudeMdTouchedRisk:!1,complete:!0,reasons:[]};tag2||reasons.push("run_tag is empty");let clavuePath=findClavueMd(cwd6),agentsPath=findAgentsMd(cwd6),clavueRaw=clavuePath?readIfExists(clavuePath):null,agentsRaw=agentsPath?readIfExists(agentsPath):null,clavueLines=clavueRaw?countLines4(clavueRaw):0,agentsLines=agentsRaw?countLines4(agentsRaw):0,hasClavueHeader=!!clavueRaw&&/^#\s*clavue\.md\b/im.test(clavueRaw),hasAgentsHeader=!!agentsRaw&&(/^#\s*Repository Guidelines\b/im.test(agentsRaw)||/^#\s*AGENTS\.md\b/im.test(agentsRaw)),rulesCount=countRules(cwd6),claudeMdTouchedRisk=!1,claudePath=join172(cwd6,"\u0043LAUDE.md");if(existsSync37(claudePath)&&clavuePath)try{let claudeM=statSync13(claudePath).mtimeMs,clavueM=statSync13(clavuePath).mtimeMs;claudeM>=clavueM-2e3&&(claudeMdTouchedRisk=!0)}catch{}!clavuePath||!clavueRaw?reasons.push("missing clavue.md (L1 runtime briefing)"):(hasClavueHeader||reasons.push("clavue.md missing required `# clavue.md` header"),clavueLines>CLAVUE_MD_HARD_CEILING_LINES&&reasons.push(`clavue.md has ${clavueLines} lines (hard ceiling ${CLAVUE_MD_HARD_CEILING_LINES}; move bulk to .clavue/rules/)`),clavueLines<8&&reasons.push("clavue.md suspiciously short (<8 lines) \u2014 likely incomplete")),!agentsPath||!agentsRaw?reasons.push("missing AGENTS.md portable export"):hasAgentsHeader?agentsLines<8&&reasons.push("AGENTS.md suspiciously short (<8 lines)"):reasons.push("AGENTS.md missing Repository Guidelines / AGENTS.md header"),m3==="full"&&rulesCount<1&&reasons.push("full mode expects \u22651 topic file under .clavue/rules/ (architecture / build-and-test / \u2026)");let complete=reasons.length===0;return{runTag:tag2,mode:m3,clavuePath,agentsPath,clavueLines,agentsLines,rulesCount,hasClavueHeader,hasAgentsHeader,claudeMdTouchedRisk,complete,reasons:complete?claudeMdTouchedRisk?["advisory: \u0043LAUDE.md mtime near clavue.md \u2014 ensure /init did not Write \u0043LAUDE.md"]:[]:reasons}}function formatInitLedgerScore(score){return score.mode==="diagnose"?`init diagnose COMPLETE for run_tag=${score.runTag||"(none)"} \xB7 read-only`:score.complete?[`init ledger COMPLETE for run_tag=${score.runTag}`,`mode=${score.mode}`,`clavue_lines=${score.clavueLines}/${CLAVUE_MD_HARD_CEILING_LINES}`,`agents_lines=${score.agentsLines}`,`rules=${score.rulesCount}`,score.\u0063laudeMdTouchedRisk?"claude_md_risk=1":null].filter(Boolean).join(" \xB7 "):[`init ledger INCOMPLETE for run_tag=${score.runTag||"(empty)"}`,...score.reasons.map(r2=>`- ${r2}`)].join(`
7121
7121
  `)}var CLAVUE_MD_HARD_CEILING_LINES,CLAVUE_MD_TARGET_LINES,init_initLedger=__esm({"src/commands/init/initLedger.ts"(){CLAVUE_MD_HARD_CEILING_LINES=120,CLAVUE_MD_TARGET_LINES=80;__name(normalizeRunTag,"normalizeRunTag");__name(countLines4,"countLines");__name(readIfExists,"readIfExists");__name(findClavueMd,"findClavueMd");__name(findAgentsMd,"findAgentsMd");__name(countRules,"countRules");__name(scoreInitLedger,"scoreInitLedger");__name(formatInitLedgerScore,"formatInitLedgerScore")}});function stampBlocks(options){let runTag=String(options.runTag||"").trim(),mode2=options.mode??"default",card=String(options.operatorCard||"").trim(),cardBlock=card?`
7122
7122
  ${card}
@@ -7672,8 +7672,8 @@ Remember:
7672
7672
  5. Use jq to parse the JSON responses from the GitHub API
7673
7673
 
7674
7674
  ${args?"Additional user input: "+args:""}
7675
- `}]}})}});import{mkdir as mkdir57,readFile as readFile62,writeFile as writeFile63}from"fs/promises";import{dirname as dirname75,join as join182}from"path";function getChangelogCachePath(){return join182(getClaudeConfigHomeDir(),"cache","changelog.md")}async function migrateChangelogFromConfig(){let config3=getGlobalConfig();if(!config3.cachedChangelog)return;let cachePath2=getChangelogCachePath();try{await mkdir57(dirname75(cachePath2),{recursive:!0}),await writeFile63(cachePath2,config3.cachedChangelog,{encoding:"utf-8",flag:"wx"})}catch{}saveGlobalConfig(({cachedChangelog:_2,...rest2})=>rest2)}async function fetchAndStoreChangelog(){if(getIsNonInteractiveSession()||isEssentialTrafficOnly())return;let response=await axios_default.get(RAW_CHANGELOG_URL);if(response.status===200){let changelogContent=response.data;if(changelogContent===changelogMemoryCache)return;let cachePath2=getChangelogCachePath();await mkdir57(dirname75(cachePath2),{recursive:!0}),await writeFile63(cachePath2,changelogContent,{encoding:"utf-8"}),changelogMemoryCache=changelogContent;let changelogLastFetched=Date.now();saveGlobalConfig(current=>({...current,changelogLastFetched}))}}async function getStoredChangelog(){if(changelogMemoryCache!==null)return changelogMemoryCache;let cachePath2=getChangelogCachePath();try{let content=await readFile62(cachePath2,"utf-8");return changelogMemoryCache=content,content}catch{return changelogMemoryCache='# Changelog\n\nClavue \u53D1\u5E03\u8BF4\u660E\u3002\u672C\u6587\u4EF6\u5728\u6784\u5EFA\u65F6\u6CE8\u5165\u8FD0\u884C\u65F6\uFF0C\u9A71\u52A8 `/release-notes` \u4E0E\u542F\u52A8\u753B\u9762\u7684\u300C\u65B0\u7279\u6027\u300D\u680F\u3002\n\n\u683C\u5F0F\u7EA6\u5B9A\uFF08\u89E3\u6790\u5668\u4F9D\u8D56\uFF09\uFF1A\u4E8C\u7EA7\u6807\u9898\u4E3A `## <\u7248\u672C> - <\u65E5\u671F>`\uFF0C\u6761\u76EE\u4EE5 `- ` \u5F00\u5934\uFF0C\u4E00\u884C\u4E00\u6761\uFF0C\n\u547D\u4EE4\u3001\u53C2\u6570\u4E0E\u6A21\u578B\u540D\u4FDD\u7559\u82F1\u6587\u3002\n\n## 13.9.1 - 2026-10-23\n\n- **\u951A\u5B9A\u4F1A\u8BDD cwd \u5199\u6587\u4EF6\u3002** \u65E0\u663E\u5F0F\u8DEF\u5F84\u65F6 Edit/Write \u4E0D\u5F97\u843D\u5230\u5144\u5F1F\u6C99\u7BB1\uFF1B\u7EDD\u5BF9\u8DEF\u5F84\u9003\u51FA session cwd \u4F1A\u88AB\u62D2\u7EDD\n- **print \u6210\u529F\u5373\u9000\u51FA 0\u3002** `subtype=success` \u65F6\u8FDB\u7A0B\u9000\u51FA\u7801\u6052\u4E3A 0\uFF0C\u4E0D\u518D\u51FA\u73B0 success \u5374 exit 1\uFF08bench C1\uFF09\n- **print \u7ED3\u679C\u8865\u9F50 timing\u3002** `result.timing` \u53EF\u5BF9\u6807 v1\uFF08wallMs / modelMs / toolCalls \u7B49\uFF09\n\n## 13.9.0 - 2026-10-23\n\n- **\u754C\u9762\u5168\u9762\u5BF9\u6807 Grok Build\u3002** \u9876\u680F/\u5E95\u680F/\u72B6\u6001\u884C\uFF08chrome\uFF09\u3001\u4E3B\u9898\u8272\u4E0E\u5B57\u5F62\u3001\u9996\u9875\u4E00\u5C4F\u53EF\u8F93\u5165\u4E14\u70ED\u952E\u4E0D\u541E\u9996\u5B57\u3001\u952E\u4F4D\u5BFC\u822A\u4E0E\u5FEB\u6377\u952E\u9762\u677F\u3001\u4E00\u8F6E\u6C47\u603B \u25C8 / \u9010\u6761 \u25C6 / \u4E09\u5C42\u5C55\u5F00\u3001\u5185\u8054\u6743\u9650\u5361\u3001\u5B50\u4EE3\u7406\u884C\u4E0E dock\u3001\u65E5\u8BB0\u964D\u566A\u4E0E\u5931\u8D25\u6761\uFF0C\u516B\u7EC4 GUI \u4E00\u5E76\u5408\u5165\n- **\u534F\u8BAE\u767B\u8BB0\u91CD\u5EFA\u3002** \u5408\u5E76\u540E\u7EDF\u4E00\u91CD\u5EFA UI \u534F\u8BAE registry\uFF0C\u4FDD\u7559\u5168\u90E8\u4E8B\u4EF6\u767B\u8BB0\uFF0C\u4E0D\u4E22\u7AEF\u53E3\n\n## 13.8.0 - 2026-10-22\n\n- **\u51FA\u9519\u65F6\u8BF4\u6E05\u695A\u3001\u5C11\u7A7A\u8F6C\u3002** \u9519\u8BEF\u7EDF\u4E00\u5206\u6210\u53EF\u91CD\u8BD5\u3001\u53EF\u6062\u590D\u3001\u5FC5\u987B\u505C\u6B62\u4E09\u7C7B\uFF1B401/402/\u78C1\u76D8\u6EE1\u76F4\u63A5\u505C\u5E76\u7ED9\u4E00\u884C\u539F\u56E0\uFF0C\u65AD\u7F51\u3001\u8D85\u65F6\u3001429\u30015xx \u624D\u91CD\u8BD5\n- **\u574F\u5DE5\u5177\u8C03\u7528\u81EA\u52A8\u4FEE\u3002** \u65E0\u540D\u6216\u53C2\u6570\u574F\u6389\u7684\u5DE5\u5177\u8C03\u7528\u6309\u300C\u4E22\u5F03\u91CD\u8BD5 \u2192 \u63D0\u9192\u5DE5\u5177\u540D \u2192 \u6309\u53C2\u6570\u63A8\u65AD \u2192 \u6362\u6A21\u578B\u300D\u4FEE\u590D\uFF0C\u72B6\u6001\u884C\u663E\u793A\u300C\u6B63\u5728\u91CD\u8BD5 (n/4)\u300D\uFF0C\u4FEE\u4E0D\u597D\u53EA\u7559\u4E00\u884C\u9519\u8BEF\n- **\u56DE\u590D\u88AB\u622A\u65AD\u80FD\u63A5\u4E0A\u3002** \u6D41\u4E2D\u65AD\u540E\u4ECE\u65AD\u70B9\u7EED\u5199\uFF0C\u9996\u5B57\u7B49\u5F85\u6309\u7F51\u5173\u8868\u73B0\u81EA\u9002\u5E94\uFF1B\u5207\u5230\u5907\u7528\u6A21\u578B\u65F6\u5DE5\u5177\u5217\u8868\u4FDD\u6301\u4E0D\u53D8\uFF0C\u63D0\u793A\u7F13\u5B58\u4E0D\u5931\u6548\n- **\u81EA\u52A8\u7EED\u63A5\u53EA\u6709\u4E00\u4E2A\u51FA\u53E3\u3002** \u5404\u7C7B\u7EED\u63A5\u8D70\u540C\u4E00\u51FA\u53E3\uFF0C\u6709\u8FDB\u5C55\u4E0D\u8BA1\u6570\uFF0C\u8FDE\u7EED\u65E0\u8FDB\u5C55 8 \u6B21\u6216\u6BCF\u56DE\u5408 40 \u6B21\u540E\u505C\u4E0B\u5E76\u8BF4\u660E\uFF1B\u6309\u8BC1\u636E\u5224\u65AD\u662F\u5426\u5361\u4F4F\uFF0C\u4E0D\u518D\u51ED\u5B57\u6570\n- **\u5B50\u4EE3\u7406\u6709\u8D26\u672C\u3002** \u6309\u5B50\u4EE3\u7406\u8BB0\u5F55\u5DE5\u5177\u6B21\u6570\u3001token \u548C\u91CD\u590D\u8BFB\u53D6\uFF1B\u652F\u6301\u65F6\u95F4\u9884\u7B97\u4E0E\u6536\u5C3E\u603B\u7ED3\u56DE\u5408\uFF0C\u53EA\u8BFB\u4EFB\u52A1\u4E0D\u518D\u88AB\u8981\u6C42\u6539\u6587\u4EF6\uFF1B`/parallel` \u6709\u5E76\u53D1\u4E0A\u9650\n- **\u66F4\u5B89\u5168\u3002** \u62E6\u622A\u8BEF\u6740\u81EA\u8EAB\u6216\u65E0\u5173\u8FDB\u7A0B\u7684 kill\uFF1B\u65B0\u589E AIza\u3001AKIA/ASIA\u3001glpat-\u3001hf_\u3001npm_\u3001xai- \u7B49\u683C\u5F0F\u53CA\u300C\u4E3B\u673A \u7528\u6237 \u5BC6\u7801\u300D\u4E09\u6BB5\u5F0F\u6253\u7801\uFF1B\u6539\u52A8 `~/.ssh`\u3001`~/.aws` \u7B49\u51ED\u636E\u8DEF\u5F84\u524D\u5148\u786E\u8BA4\n- **\u8BF7\u6C42\u4F53 gzip\u3002** \u7F51\u5173\u652F\u6301\u65F6\u8BF7\u6C42\u81EA\u52A8\u538B\u7F29\uFF0C\u9047\u5230 400/415 \u56DE\u9000\u5E76\u8BB0\u4F4F\u4E00\u5C0F\u65F6\uFF1B\u82E5\u5E72\u754C\u9762\u7EC6\u8282\u4FEE\u6574\n\n## 13.7.0 - 2026-10-21\n\n- **\u65E5\u8BB0\u91CD\u505A\uFF0C\u8F93\u51FA\u66F4\u5E72\u51C0\u3002** \u6BCF\u8F6E\u53EA\u51FA\u4E8B\u4EF6\uFF08\u5F00\u59CB\u3001\u5DE5\u5177\u5F00\u59CB\u4E0E\u7ED3\u675F\u3001\u6700\u7EC8\u56DE\u7B54\u3001\u7ED3\u675F\u539F\u56E0\uFF09\uFF0C\u65E5\u8BB0\u6587\u5B57\u7EDF\u4E00\u7531 pager \u751F\u6210\uFF1B\u7ED3\u5C3E\u4E00\u8F6E\u4E00\u884C\u3001\u5C5E\u4E8E\u672C\u8F6E\uFF0C\u5931\u8D25\u6216\u4E2D\u65AD\u65F6\u4E0D\u518D\u5199\u300C\u5B8C\u6210\u300D\uFF0C\u6D3B\u52A8\u6761\u4E0D\u518D\u6F0F\u51FA\u5185\u90E8\u7F16\u7801\n- **\u540E\u53F0\u4EFB\u52A1\u4E0D\u518D\u5237\u5C4F\u3002** \u76F8\u90BB\u7684\u540E\u53F0\u4EFB\u52A1\u901A\u77E5\u5408\u5E76\u6210\u4E00\u8F6E\u5904\u7406\uFF08\u5408\u5E76\u7A97\u53E3\u9ED8\u8BA4 1500ms\uFF09\uFF0C\u81EA\u52A8\u8DDF\u8FDB\u56DE\u5408\u5931\u8D25\u65F6\u53EA\u7559\u4E00\u6761\u53EF\u539F\u5730\u66F4\u65B0\u7684\u63D0\u793A\uFF0C\u4E0D\u518D\u753B\u6574\u5757\u5931\u8D25\u5361\n- **\u56DE\u5408\u6536\u5C3E\u5224\u5F97\u66F4\u51C6\u3002** \u4EE5\u300C\u6211\u4F1A\u2026\u300D\u300C\u63A5\u4E0B\u6765\u2026\u300D\u8FD9\u7C7B\u627F\u8BFA\u53E5\u7ED3\u5C3E\u7B97\u672A\u5B8C\u6210\uFF1B\u7B49\u5F85\u540E\u53F0\u4EFB\u52A1\u4E0D\u5224\u5931\u8D25\uFF1B\u76EE\u6807\u4E0D\u4F1A\u88AB\u77ED\u56DE\u590D\u6216\u4EFB\u52A1\u901A\u77E5\u5360\u4F4F\n- **\u7F51\u5173\u66F4\u7A33\u3002** \u91CD\u8BD5\u7EDF\u4E00\u8BA1\u5165\u4E00\u4E2A\u9884\u7B97\uFF0C\u4E0D\u518D\u51FA\u73B0\u91CD\u8BD5\u4E8C\u5341\u591A\u6B21\uFF1B\u91CD\u590D\u7684\u6D41\u4E8B\u4EF6\u53BB\u91CD\uFF1B\u5207\u5907\u7528\u65F6\u8DF3\u8FC7\u88C5\u4E0D\u4E0B\u5F53\u524D\u4E0A\u4E0B\u6587\u7684\u6A21\u578B\uFF1B\u517C\u5BB9 text/plain \u56DE\u590D\uFF1B\u7A7A text block \u4E0D\u518D\u5BFC\u81F4 400\uFF1B\u5B50\u4EE3\u7406\u88AB\u622A\u65AD\u540E\u4F1A\u7EED\u5199\n- **\u5907\u7528\u6A21\u578B\u63D0\u793A\u53EA\u51FA\u4E00\u6B21\u3002** \u6BCF\u4F1A\u8BDD\u6BCF\u5BF9\u6A21\u578B\u53EA\u63D0\u793A\u4E00\u6B21\u300C\u5DF2\u5207\u5230\u5907\u7528\u6A21\u578B B\uFF08A \u4E0D\u53EF\u7528\uFF09\u300D\uFF1B\u5E95\u680F\u7A84\u5C4F\u65F6\u5148\u7701\u6389 @effort \u7B49\u6807\u7B7E\uFF0C\u4FDD\u4F4F\u5B8C\u6574\u6A21\u578B\u540D\n- **\u5DE5\u5177\u66F4\u5BBD\u5BB9\u4E5F\u66F4\u5B89\u5168\u3002** Write / Grep \u63A5\u53D7\u5E38\u89C1\u53C2\u6570\u522B\u540D\u3001\u4E22\u6389\u591A\u4F59\u5B57\u6BB5\uFF1B\u5DF2\u6709\u6587\u4EF6\u662F GBK\u3001Shift-JIS \u7B49\u975E UTF-8 \u7F16\u7801\u65F6\u62D2\u7EDD\u5199\u5165\u5E76\u8BF4\u660E\u7F16\u7801\uFF0C\u4E0D\u6539\u539F\u5B57\u8282\n- **\u5361\u6B7B\u4E0E\u8FDB\u7A0B\u6536\u5F97\u5E72\u51C0\u3002** \u5361\u6B7B\u515C\u5E95\u5B88\u62A4\uFF1BBash \u6309\u8FDB\u7A0B\u7EC4\u767B\u8BB0\u5E76\u6574\u7EC4\u6E05\u7406\uFF1B\u9000\u51FA\u65F6\u540E\u53F0\u547D\u4EE4 1.5s \u5185\u5F3A\u6740\u4E14 SessionEnd \u5FC5\u8DD1\uFF1B\u53EA\u6740\u542F\u52A8\u5668\u65F6\u5B50\u8FDB\u7A0B\u4E0D\u518D\u6210\u5B64\u513F\n- **\u957F\u4F1A\u8BDD\u66F4\u7701\u3002** \u6BCF\u6B21\u66F4\u65B0\u4E0D\u518D\u91CD\u626B\u5168\u5BF9\u8BDD\uFF1B\u5DE5\u5177\u8F93\u51FA\u8D85\u8FC7 2000 \u884C\u843D\u76D8\u53EA\u7559\u6458\u8981\uFF1B\u65B0\u589E\u7ED3\u679C\u6865 `result.json`\n- **\u6743\u9650\u52A0\u56FA\u3002** \u85CF\u5728\u5B50\u547D\u4EE4\u3001\u5F15\u53F7\u6216\u53D8\u91CF\u91CC\u7684\u5371\u9669 `rm` \u4E5F\u4F1A\u62E6\uFF1B\u4FEE\u8865\u4E00\u6279 Bash \u5206\u6790\u7ED5\u8FC7\uFF1B\u6309 symlink \u7684\u771F\u5B9E\u843D\u70B9\u5224\u6743\u9650\uFF1Bplan \u6A21\u5F0F\u4E0B Bash \u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF1BMCP \u62A5\u9519\u91CC\u7684\u5BC6\u94A5\u5148\u6253\u7801\uFF1B\u65B0\u589E `--restricted` \u53EA\u8BFB\u6A21\u5F0F\n- **\u4EE5\u300C\u7406\u89E3\uFF1A\u300D\u5F00\u5934\u7684\u6700\u7EC8\u7B54\u6848\u4E0D\u518D\u88AB\u541E\u3002** \u91CD\u8BD5\u540E\u7B54\u6848\u4E0D\u4F1A\u6D88\u5931\uFF1B`/model` \u56DE\u6267\u53EA\u663E\u793A\u4E00\u6B21\u5E76\u5237\u65B0\u5E95\u680F\n\n## 13.6.0 - 2026-10-19\n\n- **\u5907\u7528\u94FE\u66F4\u53EF\u9760\u3002** \u9996\u5305\u8D85\u65F6\u6216\u5907\u7528\u6A21\u578B\u8FD4\u56DE 404 / 5xx \u65F6\uFF0C\u6CBF `CLAVUE_COMBO_FALLBACK`\uFF08\u9017\u53F7\u5206\u9694\uFF09\u5207\u5230\u4E0B\u4E00\u4E2A\u6A21\u578B\uFF0C\u8DF3\u8FC7\u540C\u5BB6\u65CF\u522B\u540D\uFF08`cn:deepseek-v4.1-flash` \u4E0D\u4F1A\u518D\u5207\u56DE `deepseek-v4-flash`\uFF09\u3002\u521A\u5931\u6548\u7684\u6A21\u578B 10 \u5206\u949F\u5185\u4E0D\u518D\u9009\uFF08`CLAVUE_MODEL_HEALTH_TTL_MS`\uFF09\uFF1B\u6574\u6761\u94FE\u90FD\u5931\u6548\u65F6\u56DE\u5230\u5B8C\u6574\u94FE\u3002\u4E3B\u6A21\u578B\u4E0A\u7684 502/503 \u4ECD\u6309\u539F\u6765\u7684\u4E24\u6B21\u9608\u503C\n- **\u5B58\u6863\u524D\u5BC6\u94A5\u6253\u7801\u3002** \u4F1A\u8BDD jsonl \u548C `history.jsonl` \u5199\u76D8\u524D\u906E\u6389 `sshpass -p`\u3001`SSHPASS=`\u3001`mysql -p` / `--password`\u3001`PGPASSWORD`\u3001`MYSQL_PWD`\u3001`curl -u`\u3001\u5E26\u8D26\u53F7\u5BC6\u7801\u7684 URL\u3001`Authorization: Bearer`\u3001`sk-` / `ghp_` \u5BC6\u94A5\u3001`password=`\u3001`*_PASS=` / `*_PWD=`\u3002\u6267\u884C\u4ECD\u7528\u539F\u547D\u4EE4\uFF1B`PWD=` / `$PWD` \u4E0D\u53D7\u5F71\u54CD\n- **\u663E\u5F0F\u8BE2\u95EE\u89C4\u5219\u4F18\u5148\u3002** `Bash(rm:*)` \u8FD9\u7C7B ask \u89C4\u5219\u547D\u4E2D\u590D\u5408\u547D\u4EE4\u91CC\u7684\u5B50\u547D\u4EE4\uFF08`rm \u2026 && ls`\uFF09\u65F6\uFF0C\u4E0D\u518D\u88AB\u5168\u5C40 `Bash` \u5141\u8BB8\u8986\u76D6\uFF1B\u9ED8\u8BA4\u6A21\u5F0F\u548C\u6C99\u7BB1\u6A21\u5F0F\u90FD\u751F\u6548\uFF0C`bypassPermissions` \u4ECD\u8C41\u514D\n- **\u5B50\u4EE3\u7406\u88AB\u62E6\u65F6\u8BF4\u6E05\u539F\u56E0\u3002** \u8D85\u8FC7 `CLAVUE_AGENT_MAX_DEPTH` \u65F6\u8FD4\u56DE\u7ED3\u6784\u5316\u7684 `<spawn_blocked>` \u8BF4\u660E\uFF0C\u63D0\u793A\u540C\u4E00\u8C03\u7528\u4F1A\u518D\u6B21\u88AB\u62E6\u3001\u8BF7\u5728\u5F53\u524D\u4F1A\u8BDD\u5B8C\u6210\u3002\u6DF1\u5EA6\u6309\u771F\u5B9E\u5D4C\u5957\u5C42\u6570\u8BA1\u7B97\n- **\u5DE5\u5177\u53C2\u6570\u5F62\u72B6\u4E0D\u5BF9\u4E0D\u518D\u5D29\u6E83\u3002** \u6A21\u578B\u628A `path` \u5199\u6210\u6570\u7EC4\u3001\u5BF9\u8C61\u6216\u6F0F\u5199\u65F6\uFF0C\u6D88\u606F\u6298\u53E0\u548C\u8BB0\u5FC6\u8DEF\u5F84\u5224\u65AD\u9000\u56DE\u539F\u59CB\u884C\u663E\u793A\uFF0C\u4E0D\u518D\u62A5 `The "path" argument must be of type string`\n- **\u8FDB\u51FA worktree \u771F\u6B63\u6E05\u6389 plans \u76EE\u5F55\u7F13\u5B58\u3002** \u4EE5\u524D\u7F13\u5B58\u6CA1\u88AB\u6E05\u6389\uFF0Cplans \u76EE\u5F55\u4E00\u76F4\u6307\u5411\u8FDB\u5165 worktree \u524D\u7684\u76EE\u5F55\uFF0C\u73B0\u5728\u4F1A\u8DDF\u7740\u5207\u6362\n\n## 13.5.0 - 2026-10-16\n\n- **\u56DB\u6863\u8DEF\u7531\u3002** \u89C4\u5219\u628A\u56DE\u5408\u5206\u6210 \u7B80\u5355 / \u4E00\u822C / \u590D\u6742 / \u957F\u7A0B\u3002\u62FF\u4E0D\u51C6\u65F6\u8BA1\u5212\u69FD\u6700\u591A\u60F3 1 \u79D2\uFF0C\u8D85\u65F6\u7B97\u4E00\u822C\u3002`/goal` \u662F\u957F\u7A0B\u3002`/mode` \u56FA\u5B9A\u6863\u4F4D\u3002`CLAVUE_TIERS=0` \u5173\u95ED\u3002\u6539\u8FC7\u7684\u6587\u4EF6\u8D85\u8FC7 5 \u4E2A\u5347\u5230\u81F3\u5C11\u590D\u6742\uFF0C\u8D85\u8FC7 15 \u4E2A\u5347\u5230\u957F\u7A0B\uFF1B\u7B80\u5355\u6863\u91CC\u8BF7\u6C42\u8D85\u8FC7 20 \u6B21\u5347\u5230\u4E00\u822C\uFF1B\u540C\u4E00\u6761\u68C0\u67E5\u5931\u8D25 3 \u6B21\u5347\u4E00\u6863\uFF1BJEV \u5224\u5B9A\u4E25\u91CD\u5347\u5230\u81F3\u5C11\u590D\u6742\u3002\u964D\u6863\u53EA\u53D1\u751F\u5728\u4E0B\u4E00\u8F6E\u5F00\u59CB\n- **\u7B80\u5355\u6863\u5C11\u505A\u3002** \u4E0D\u8DD1 REVIEW\uFF0C\u4E0D\u95EE\u4EA4\u4ED8\u88C1\u5224\uFF0C\u56DE\u5408\u7ED3\u675F\u4E0D\u7B49\u5F85\uFF0C\u7CFB\u7EDF\u63D0\u793A\u7528\u7CBE\u7B80\u7248\u3002\u5DE5\u5177\u53EA\u7559 10 \u4E2A\u6838\u5FC3\uFF0C`mcp__*` \u59CB\u7EC8\u4FDD\u7559\u3002\u4E00\u822C\u6863\u5BA1\u67E5\u7B49\u5F85\u6700\u591A 5 \u79D2\u3002\u590D\u6742\u548C\u957F\u7A0B\u6700\u591A 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\n- **\u72B6\u6001\u884C\u5E26\u6863\u4F4D\u3002** \u5728 `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42` \u540E\u52A0 `\u7B80\u5355`\u3002\u6362\u6863 15 \u79D2\u5185\u663E\u793A `\u7B80\u5355\u2192\u4E00\u822C`\n- **stdin \u5148\u770B 200ms\u3002** `-p` \u7B49\u7BA1\u9053\u7B2C\u4E00\u5B57\u8282\u9ED8\u8BA4 200ms\uFF08`CLAVUE_STDIN_PEEK_MS`\uFF0C0 \u4E0D\u7B49\uFF09\u3002MCP \u542F\u52A8\u8D5B\u8DD1\u4ECD\u662F 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF09\n\n## 13.4.2 - 2026-10-16\n\n- **\u8BA1\u65F6\u884C\u7528\u771F\u5B9E\u9636\u6BB5\u540D\u3002** \u8C03\u8BD5\u65E5\u5FD7\u4E0D\u518D\u628A\u6BCF\u4E00\u8DF3\u90FD\u5199\u6210 `sdk`\uFF0C\u800C\u662F `intake/jev`\u3001`plan`\u3001`scout`\u3001`main`\u3001`review`\u3001`compact`\u3001`subagent`\u3001`fanout` \u52A0\u4E0A\u6A21\u578B\u548C\u6BEB\u79D2\u3002\u72B6\u6001\u884C\u663E\u793A `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42`\n- **\u7F16\u6392\u5BF9\u9F50 v1\u3002** JEV intake \u5728\u56DE\u5408\u5F00\u59CB\u5C31\u53D1\u51FA\u53BB\uFF0C\u53EA\u5728\u8BA1\u5212\u8DF3\u4E4B\u524D\u7B49\u5F85\u3002\u77ED\u7EED\u5199\uFF08\u7EE7\u7EED\uFF09\u590D\u7528\u4E0A\u4E00\u8F6E\u5206\u7C7B\uFF1A0 \u6B21 JEV\u30010 \u6B21 PLAN\u3002\u8BA1\u5212\u8DF3\u81EA\u8EAB 30 \u79D2\u5230\u70B9\u5C31\u9759\u9ED8\u4E22\u6389\uFF08`CLAVUE_COMBO_PLAN_TIMEOUT_MS`\uFF09\uFF0C\u9996\u5305\u524D\u4ECD\u53EA\u7B49\u6700\u591A 1.8 \u79D2\u3002\u540C\u4E00\u4EFD\u8BA1\u5212\u53EA\u5BA1\u67E5\u4E00\u6B21\uFF0C\u8BA1\u5212\u6700\u591A\u4FEE\u8BA2\u4E00\u6B21\u3002`CLAVUE_COMBO_PLAN_HOP=0` \u4ECD\u53EF\u5173\u6389\u8BA1\u5212\u8DF3\n- **\u56DE\u5408\u7ED3\u675F\u7684\u5BA1\u67E5\u7B49\u5F85\u3002** \u914D\u7F6E\u9ED8\u8BA4\u4ECD\u662F 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\u3002\u7410\u788E\u56DE\u5408\u4E0D\u7B49\u5F85\uFF1B\u5176\u4F59\u56DE\u5408\u6700\u591A\u7B49 5 \u79D2\n- **\u51B7\u542F\u52A8\u4E0D\u6321 MCP\u3002** \u65E0\u5934\u6A21\u5F0F\u9ED8\u8BA4\u5728\u540E\u53F0\u8FDE\u63A5 MCP\uFF0C\u4E0D\u518D\u628A\u7B2C\u4E00\u8BF7\u6C42\u6321\u4F4F\u6700\u591A 8 \u79D2\u3002`CLAVUE_HEADLESS_MCP_BUDGET_MS=0` \u6062\u590D\u4E00\u76F4\u7B49\u5230\u8FDE\u5B8C\n- **JEV \u9274\u6743\u5931\u8D25\u8DE8\u8FDB\u7A0B\u8DF3\u8FC7\u3002** \u4E00\u6761 intake \u91CC\u4E24\u628A key \u90FD 401 \u5C31\u4F1A\u5199\u4E0B `jev-auth-fail.json`\u3002\u4E0B\u4E00\u4E2A\u8FDB\u7A0B\u5728 TTL \u5185\u4E0D\u518D\u53D1\u90A3\u4E24\u4E0B 401\n- **\u540E\u53F0\u8FDE\u4E0A\u7684 MCP \u4F1A\u8FDB\u540E\u7EED\u8BF7\u6C42\u3002** \u542F\u52A8\u65F6\u548C\u8FDE\u63A5\u8D5B\u8DD1\uFF0C\u9ED8\u8BA4\u6700\u591A 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF0C0 \u9A6C\u4E0A\u8FD4\u56DE\uFF09\u3002\u6BCF\u4E2A\u670D\u52A1\u5668\u8FDE\u4E0A\u5C31\u5199\u5165 headless store\u3002\u540C\u4E00\u56DE\u5408\u91CC\u4E0B\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u8C03\u7528 `refreshTools()` \u91CD\u8BFB `buildAllTools(getAppState())`\u3002`stickyToolsForTurn` \u4E0D\u518D\u56E0\u4E3A\u5DE5\u5177\u4E0D\u5728\u4E0A\u4E00\u8BF7\u6C42\u7684\u540D\u5355\u91CC\u5C31\u4E22\u6389 `mcp__*`\u3002\u6838\u5FC3\u5DE5\u5177\u9762\u4E5F\u4FDD\u7559 `mcp__*`\n- **\u6D41\u4E2D\u95F4\u5361\u4F4F\u4F1A\u6362\u5907\u7528\u6A21\u578B\u3002** \u804A\u5929\u6A21\u578B\u4EE5\u524D\u4E24\u4E2A chunk \u4E4B\u95F4\u53EF\u4EE5\u7A7A 180 \u79D2\uFF0C\u6240\u4EE5 -p \u91CC 81 \u79D2\u548C 147 \u79D2\u7684\u505C\u987F\u4E0D\u4F1A\u4E2D\u6B62\u3002\u73B0\u5728\u9ED8\u8BA4 60 \u79D2\uFF08`CLAVUE_API_STREAM_IDLE_TIMEOUT_MS`\uFF0C\u4E5F\u8BA4 `CLAVUE_STREAM_IDLE_TIMEOUT_MS`\uFF1B`CLAVUE_STREAM_WATCHDOG=0` \u5173\u95ED\uFF09\u3002\u5230\u70B9\u53D6\u6D88\u6D41\uFF08\u5DF2\u7ECF\u51FA\u8FC7\u5B57\u4E5F\u53D6\u6D88\uFF09\uFF0C\u4E22\u6389\u534A\u622A\u52A9\u624B\u6D88\u606F\uFF0C\u6309\u9996\u5305\u540C\u4E00\u6761\u5907\u7528\u94FE\u91CD\u8BD5\u4E00\u6B21\n- **\u8BA1\u5212\u8C03\u7528\u7684\u8BA1\u65F6\u884C\u5199 `plan`\u3002** \u9636\u6BB5\u6309\u8C03\u7528\u70B9\u7684 phase/role \u8BB0\uFF0C\u4E0D\u518D\u56E0\u4E3A querySource \u662F `sdk` \u5C31\u5168\u90E8\u5199\u6210 `main`\u3002scout / review \u540C\u7406\n\n## 13.4.1 - 2026-10-16\n\n- **\u9996\u5305\u8D85\u65F6\u6362\u5907\u7528\u6A21\u578B\u3002** \u9ED8\u8BA4\u7B49\u5F85\u4ECE 90 \u79D2\u964D\u5230 45 \u79D2\uFF08`CLAVUE_API_FIRST_BYTE_TIMEOUT_MS`\uFF0C0 \u5173\u95ED\uFF09\uFF0C\u6D41\u5F0F\u548C\u672C\u5730\u975E\u6D41\u5F0F\uFF08\u542B 127.0.0.1\uFF09\u90FD\u8BA1\u65F6\u3002\u8D85\u65F6\u540E\u4E0D\u518D\u91CD\u8BD5\u540C\u4E00\u4E2A\u6A21\u578B\uFF0C\u6539\u5207\u5907\u7528\uFF1Aprofile \u7684 `fallback`\u3001\u7136\u540E `CLAVUE_COMBO_FALLBACK`\u3001\u7136\u540E ttqq \u9ED8\u8BA4 `cn:deepseek-v4.1-flash`\uFF1B`off` \u5173\u95ED\u3002\u72B6\u6001\u884C\u663E\u793A `\u7B49\u5F85\u6A21\u578B\u9996\u5305 Ns`\u3002\u540E\u53F0\u8C03\u7528\u9ED8\u8BA4\u6700\u591A 20 \u79D2\uFF08`CLAVUE_SIDE_CALL_TIMEOUT_MS`\uFF0Cplan/review \u4E0D\u5957\u8FD9\u5C42\u4E0A\u9650\uFF09\n- **JEV \u4E0E FastApply \u51ED\u8BC1\u94FE\u3002** \u73B0\u6709\u987A\u5E8F\u4E4B\u540E\u8865\u4E0A\u5DF2\u767B\u5F55\u8D26\u53F7 key\uFF08`auth.json`\uFF0C\u542B `https://api.clavue.com::client` \u8FD9\u79CD\u6309\u4E3B\u673A\u5B58\u653E\u7684\u6761\u76EE\uFF09\u548C\u672C\u673A\u8BBE\u5907 key\uFF08`official-device-key.json`\uFF09\u3002\u914D\u7F6E\u76EE\u5F55\u8DDF\u968F `CLAVUE_CONFIG_DIR`\u3002\u53EA\u53D1\u7ED9 api.clavue.com\u3002\u67D0\u4E00\u7EA7\u8FD4\u56DE 401 \u5C31\u8BD5\u4E0B\u4E00\u7EA7\uFF0C\u5E76\u8BB0\u4E0B\u65B0\u6765\u6E90\uFF08`key source=auth.json:https://api.clavue.com::clavue-gui`\uFF09\u3002`/provider current` \u5217\u51FA\u6574\u6761\u94FE\u548C\u6BCF\u4E00\u7EA7\u662F\u5426\u627E\u5230\u3002\u540C\u4E00\u8BF7\u6C42 1 \u79D2\u5185\u4E0D\u53D1\u7B2C\u4E8C\u6B21\uFF0C\u6362 key \u9664\u5916\u3002\u5168\u90E8 401 \u65F6\u7EC8\u7AEF\u53EA\u6253\u4E00\u884C\u4E2D\u6587\u4FEE\u590D\u63D0\u793A\uFF0C\u4E0D\u518D\u6A21\u62DF\u5224\u5B9A\u3002\u5224\u5B9A\u5931\u8D25\u4F1A\u8BB0\u4F4F\u4E00\u5C0F\u6BB5\u65F6\u95F4\uFF08`CLAVUE_JEV_AUTH_FAIL_TTL_MS`\uFF0C\u9ED8\u8BA4 10 \u5206\u949F\uFF09\uFF0C\u8FD9\u6BB5\u65F6\u95F4\u91CC\u4E0D\u518D\u53D1 intake\n- **`provider current` \u8BFB\u53D6 settings.json \u7684 env\u3002** JEV/FA \u72B6\u6001\u4E0D\u518D\u56E0\u4E3A\u53EA\u5199\u5728 settings \u91CC\u800C\u663E\u793A off\u3002\u5DF2\u4FDD\u5B58\u7684\u7EBF\u8DEF\u662F\u5F53\u524D\u8DEF\u7531\u65F6\uFF0C\u4E0D\u518D\u663E\u793A `Current API config: None`\n- **DeepSeek \u63A8\u7406 token \u4E0D\u518D\u91CD\u590D\u8BA1\u5165\u4E0A\u4E0B\u6587\u3002** `reasoning_tokens` \u662F `completion_tokens` \u7684\u5B50\u96C6\uFF1B\u7F51\u5173\u628A\u4E24\u8005\u76F8\u52A0\u5199\u8FDB `output_tokens` \u65F6\u6309 completion \u8BA1\u3002\u540C\u4E00\u56DE\u590D\u62C6\u5F00\u7684\u601D\u8003\u5757\u4E0D\u518D\u88AB\u4F30\u7B97\u7B2C\u4E8C\u904D\n- **\u9632\u538B\u7F29\u98CE\u66B4\u3002** \u540C\u4E00\u6A21\u578B\u5BB6\u65CF\u91CC\u6362\u6A21\u578B\u3001\u7A97\u53E3\u6CA1\u6709\u53D8\u5C0F\u65F6\uFF0C\u4E0A\u4E0B\u6587\u6CA1\u5230\u65B0\u6A21\u578B\u9608\u503C\u5C31\u4E0D\u538B\u7F29\u3002\u6458\u8981\u6309 `CLAVUE_AUTO_COMPACT_MODEL` \u2192 light \u2192 FA \u2192 \u4E3B\u6A21\u578B\uFF0C\u6BCF\u4E2A\u6A21\u578B\u9650\u65F6 90 \u79D2\uFF08`CLAVUE_AUTO_COMPACT_TIMEOUT_MS`\uFF09\u3002\u4E0A\u4E0B\u6587\u4E0D\u5230 token \u9608\u503C 30% \u65F6\uFF0C\u5185\u5B58\u538B\u529B\u53EA\u6E05\u7F13\u5B58\uFF0C\u4E0D\u8DD1\u538B\u7F29\u3002\u7B2C\u4E09\u65B9\u7EBF\u8DEF\u4E0D\u4F1A\u9ED8\u8BA4\u53BB\u8C03 `clavue-2.1-fast` / `clavue-2.1` / `clavue-2.1-pro`\uFF1B\u53EA\u6709\u5B98\u65B9\u4E91\uFF0C\u6216\u4F60\u7528 `CLAVUE_COMBO_LIGHT` / `CLAVUE_AUTO_COMPACT_MODEL` \u8FD9\u7C7B\u73AF\u5883\u53D8\u91CF\u5199\u660E\uFF0C\u624D\u4F1A\u8D70\u8FD9\u4E9B id\n- **\u4EE3\u7801\u56DE\u5408\u5C11\u7B49\u524D\u7F6E\u8DF3\u3002** \u8BA1\u5212\u8DF3\u9ED8\u8BA4\u6700\u591A\u5360\u9996\u5305\u524D 1.8 \u79D2\uFF08`CLAVUE_SCOUT_TIMEOUT_MS`\uFF0C`CLAVUE_COMBO_PLAN_BLOCK=1` \u6062\u590D\u4E00\u76F4\u7B49\uFF09\u3002\u72EC\u7ACB\u7684\u8BA1\u5212\u69FD\u5E76\u884C\uFF0C\u8D85\u65F6\u4E0D\u518D\u4E32\u884C\u6362\u4E0B\u4E00\u4E2A\u6A21\u578B\u3002\u8C03\u8BD5\u65E5\u5FD7\u4E00\u884C `stage -> model -> ms`\n- **ttqq \u9884\u8BBE\u4E0D\u518D\u5185\u7F6E `clavue-2.1-fast`\u3002** \u8F7B\u91CF\u69FD\u7559\u7A7A\uFF0C\u8F85\u52A9\u8C03\u7528\u8DDF\u7740\u4E3B\u6A21\u578B\uFF0C\u9664\u975E\u4F60\u81EA\u5DF1\u6307\u5B9A\n- **\u7B2C\u4E09\u65B9 JEV fan-out\u3002** \u8C03\u7528\u65B9\u6CA1\u6709\u6307\u5B9A\u6A21\u578B\u65F6\u4E0D\u518D\u585E\u9ED8\u8BA4 `clavue-jev`\n\n## 13.4.0 - 2026-10-16\n\n- **\u4F4E\u98CE\u9669 clavue-v1 \u5BF9\u9F50\uFF08#8\uFF09\u3002** \u6062\u590D\u4F1A\u8BDD\u3001\u5806\u9876\u3001\u6EA2\u51FA\u3001print \u6536\u5C3E\u4E0E goal \u95F8\u95E8\u4ECE clavue-v1 \u8FC1\u5165\n- **1.48.5 \u4E4B\u540E\u7684\u5BF9\u9F50\uFF08#9\uFF09\u3002** \u8FC1\u5165 clavue-v1 1.48.7\uFF0C\u5E76\u7F13\u5B58\u7A33\u5B9A\u7684 system \u524D\u7F00\n- **\u53EF\u9009\u7684\u539F\u751F fetch \u5BA2\u6237\u7AEF\uFF08#10\uFF09\u3002** `CLAVUE_NATIVE_CLIENT` \u672A\u8BBE\u7F6E\u65F6\u4ECD\u8D70\u539F\u6709\u4F20\u8F93\uFF1B\u8BBE\u7F6E\u540E\u6539\u7528\u57FA\u4E8E fetch \u7684\u5BA2\u6237\u7AEF\n- **\u53EF\u9009\u7684 Rust napi \u70ED\u8DEF\u5F84\uFF08#11\uFF09\u3002** `CLAVUE_NATIVE_RS` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u672A\u8BBE\u7F6E\u65F6\u4E0D\u52A0\u8F7D addon\n- **\u53EF\u9009\u7684 fast-apply\uFF08#12\uFF09\u3002** `clavue-fa` \u7684 ApplyEdit \u9ED8\u8BA4\u5173\u95ED\n- **\u53EF\u9009\u7684 JEV \u51B3\u7B56\u95E8\uFF08#14\uFF09\u3002** \u6302\u5728\u5171\u4EAB aux \u69FD\u4E0A\uFF0C\u9ED8\u8BA4\u4E0D\u542F\u7528\n- **\u7EC4\u5408\u6210\u672C\u95F8\u4E0E\u8F93\u51FA\u536B\u751F\uFF08#13\uFF09\u3002** \u4ECE clavue-v1 \u8FC1\u5165\uFF1B\u536B\u751F\u9ED8\u8BA4\u5173\u95ED\uFF0C\u88C1\u526A\u524D\u7F00\u4FDD\u6301\u7A33\u5B9A\n- **JEV / ApplyEdit \u5B9E\u673A\u4FEE\u590D\uFF08#15\uFF09\u3002** \u505C\u6389 JEV \u7684 follow-up \u5FAA\u73AF\uFF0C\u5E76\u4FEE\u6389 ApplyEdit \u7684 bundle \u5D29\u6E83\n- **\u53EF\u9009\u6548\u7387\u5305\uFF08#16\uFF09\u3002** `CLAVUE_EFFICIENCY` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u6253\u5F00\u540E\u5305\u542B\u5E76\u884C JEV\n- **\u6BCF\u56DE\u5408\u5F00\u9500\uFF08#17\uFF09\u3002** \u957F\u4F1A\u8BDD\u7684\u6BCF\u56DE\u5408\u5DE5\u4F5C\u4E0D\u518D\u626B\u5B8C\u6574\u5386\u53F2\uFF1Bpager \u6BCF\u5E27\u53EA\u68C0\u67E5\u7A97\u53E3\u5185\u7684 journal \u6233\n- **\u65B0\u80FD\u529B\u5168\u90E8\u9ED8\u8BA4\u5173\u95ED\u3002** `CLAVUE_NATIVE_CLIENT`\u3001`CLAVUE_NATIVE_RS`\u3001`clavue-fa`\u3001JEV\u3001\u7EC4\u5408\u6210\u672C\u4E0E\u8F93\u51FA\u536B\u751F\u3001`CLAVUE_EFFICIENCY` \u90FD\u8981\u663E\u5F0F\u6253\u5F00\u624D\u751F\u6548\n\n## 13.3.3 - 2026-09-29\n\n- **Esc\xD72 \u56DE\u9000\u9009\u62E9\u6846\u56DE\u6765\u4E86\u3002** \u53CC\u51FB Esc \u7684\u56DE\u9000\u300C\u9009\u62E9\u6846\u300D\u6B64\u524D\u4F1A\u5BF9\u5DF2\u7ECF\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\n \u5224\u5B9A\u6210 0 \u4E2A\u6539\u52A8\uFF0C\u4E8E\u662F\u628A\u5B83\u5F53\u6210\u6253\u9519\u7684\u7A7A\u56DE\u5408\u76F4\u63A5\u64A4\u56DE\uFF0C\u9009\u62E9\u5217\u8868\u6839\u672C\u4E0D\u518D\u51FA\u73B0\u3002\n \u6839\u56E0\u662F\u56DE\u9000\u7528\u7684\u6539\u52A8\u8BA1\u6570\u662F\u81EA\u5DF1\u7EF4\u62A4\u7684\u4E00\u5957\u5C0F\u5199\u5B50\u4E32\u5339\u914D\uFF08`edit ` / `write `\uFF09\uFF0C\n \u8BA4\u4E0D\u51FA\u5F53\u524D\u5DE5\u5177\u810A\u67F1\u7684\u771F\u5B9E\u5F62\u6001 `Update(path)` / `Create(path)` / `Write(path)`\u3002\n \u73B0\u5728\u8BA1\u6570\u6539\u8D70\u552F\u4E00\u7684\u7F16\u8F91\u5224\u5B9A `journal_format::is_edit_tool_label`\uFF0C\n \u4E0E\u4EA4\u4ED8\u6C47\u603B\u5171\u7528\u540C\u4E00\u6743\u5A01\uFF1A\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\u7167\u5E38\u5F39\u51FA\u9009\u62E9\u6846\uFF0C\n \u771F\u6B63\u6CA1\u6539\u52A8\u7684\u56DE\u5408\u4ECD\u6309\u7A7A\u56DE\u5408\u5373\u65F6\u64A4\u56DE\n- **\u53EA\u4FEE\u5206\u7C7B\uFF0C\u4E0D\u6539\u4EA4\u4E92\u3002** \u9009\u62E9\u6846\u7684\u7ED8\u5236\u3001\u952E\u76D8/\u9F20\u6807\u547D\u4E2D\u3001ModeSelect \u5355\u9009\u5168\u90E8\u4FDD\u6301\u539F\u6837\uFF1B\n \u672C\u6B21\u4EC5\u8BA9\u300C\u54EA\u4E9B\u56DE\u5408\u7B97\u6539\u8FC7\u6587\u4EF6\u300D\u8FD9\u4E00\u5904\u5224\u5B9A\u6062\u590D\u6B63\u786E\n\n## 13.3.2 - 2026-09-29\n\n- **\u5347\u7EA7\u6210\u529F\u540E\u76F4\u63A5\u8FDB\u5165\u754C\u9762\uFF0C\u4E0D\u518D\u8981\u6C42\u5B8C\u5168\u9000\u51FA\u3002** Node duplex \u5BBF\u4E3B\u662F\u9876\u5C42\u8FDB\u7A0B\uFF0C\n \u542F\u52A8\u65F6\u53EA\u89E3\u6790\u4E00\u6B21 `agentEntry` / `pagerBin`\uFF1B\u540E\u53F0 `npm install -g` \u6362\u6389\u4E86\u78C1\u76D8\u4E0A\u7684\n \u65B0\u7248\u672C\uFF0C\u5185\u5B58\u91CC\u4ECD\u662F\u65E7\u4EE3\u7801\uFF0C\u4E8E\u662F\u53EA\u80FD\u9760\u7528\u6237\u624B\u52A8\u9000\u51FA\u91CD\u8FDB\u3002\u73B0\u5728\u5BBF\u4E3B\u5728\u5347\u7EA7\u6210\u529F\u540E\n \u539F\u5730\u91CD\u6267\u884C\u81EA\u5DF1\uFF1Apager \u5148\u6309\u6B63\u5E38\u8DEF\u5F84\u9000\u51FA\uFF08\u79BB\u5F00 raw mode\u3001\u6062\u590D\u5C4F\u5E55\uFF09\uFF0CCLI \u5165\u53E3\n \u5728 pager \u91CA\u653E TTY \u540E\u518D\u8D77\u65B0\u8FDB\u7A0B\u3002\u5B88\u536B `CLAVUE_SESSION_RELAUNCH=1` \u9632\u6B62\u91CD\u6267\u884C\u5FAA\u73AF\uFF0C\n `CLAVUE_DISABLE_SESSION_RELAUNCH=1` \u53EF\u5173\u95ED\uFF1B\u6D4B\u8BD5/\u5F00\u53D1\u8FD0\u884C\u65F6\u62D2\u7EDD\u91CD\u6267\u884C\n- **\u9996\u6B21\u914D\u7F6E\u88C5\u8F7D\u540E\u540C\u6837\u539F\u5730\u8FDB\u5165\u754C\u9762\u3002** `routeTrack`\uFF08\u627F\u8F7D `needsSetup` /\n `officialReady`\uFF09\u6B64\u524D\u53EA\u5728\u542F\u52A8\u65F6\u53D1\u9001\u4E00\u6B21\uFF0C\u4E8E\u662F\u5728\u7EBF\u8DEF / BYOK \u9762\u677F\u4FDD\u5B58\u540E\uFF0C\n pager \u7684\u9996\u6B21\u914D\u7F6E\u83DC\u5355\u4E00\u76F4\u9501\u7740\uFF0C\u5FC5\u987B\u9000\u51FA\u91CD\u8FDB\u624D\u6D88\u5931\u3002\u73B0\u5728\u9762\u677F\u4FDD\u5B58\u91CD\u542F agent \u65F6\n \u4E00\u5E76\u91CD\u53D1 `routeTrack`\uFF0C\u754C\u9762\u5F53\u6B21\u4F1A\u8BDD\u5373\u89E3\u9501\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.3 - 2026-09-29\n\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.2 - 2026-09-20\n\n- \u539F\u751F pager \u53D1\u5E03\u95E8\u7981\u53D6\u771F\uFF1Astaged \u4E8C\u8FDB\u5236\u5FC5\u987B\u5185\u5D4C\u5F53\u524D pager \u6E90\u7801\u6458\u8981\n \uFF08`--build-info` JSON \u5F62\u72B6\u7684 `sourceDigest` \u5B57\u6BB5\uFF0C\u951A\u5B9A `"sourceDigest":"<64 hex>"`\uFF09\uFF0C\n \u65E7\u6E90\u7801\u7F16\u8BD1\u51FA\u7684\u4E8C\u8FDB\u5236\u5373\u4F7F\u54C8\u5E0C\u81EA\u6D3D\u4E5F\u4F1A\u88AB\u62D2\u7EDD\uFF0C\u4E0D\u518D\u9760\u4EC5\u81EA\u6D3D\u7684 manifest \u54C8\u5E0C\u653E\u884C\n- manifest \u6EAF\u6E90\u6539\u4E3A\u6309\u5E8F\u89E3\u6790\u800C\u975E\u9759\u9ED8\u7701\u7565\uFF1A`CLAVUE_RELEASE_SOURCE_COMMIT` \u2192\n `GITHUB_SHA` \u2192 `git rev-parse HEAD`\uFF1B`releaseTag` \u672A\u8BBE\u65F6\u56DE\u843D\u4E3A `v${version}`\uFF0C\n \u672C\u5730\u53D1\u5E03\u6784\u5EFA\u4E0D\u518D\u4E22\u5931\u53D1\u5E03\u95E8\u7981\u6240\u9700\u5B57\u6BB5\n- \u8FD0\u884C\u65F6\u4E0E pager \u4EA7\u7269\u4E0D\u53D8\uFF1A`dist/native` \u4E8C\u8FDB\u5236\u6CBF\u7528 13.2.1\uFF0C\u4EC5 `manifest.json`\n \u6EAF\u6E90\u4E0E\u95E8\u7981\u63A5\u7EBF\u53D8\u66F4\n\n## 13.2.1 - 2026-09-20\n\n- \u65E5\u8BB0\u7EB5\u5411\u8282\u594F\u6539\u4E3A\u4E24\u7EA7\uFF1A\u6BB5\u843D\u8FB9\u754C\uFF08\u65B0\u7684\u7528\u6237\u56DE\u5408\u3001Recap \u524D\uFF09\u5728\u6807\u51C6\u9AD8\u5EA6\u547C\u5438\u4E24\u884C\uFF0C\n \u6BB5\u5185\u5206\u7EC4\u7684\u547C\u5438\u4FDD\u6301\u4E00\u884C\uFF1Bcompact \u4E0B\u6240\u6709\u95F4\u9699\u4ECD\u4E3A\u4E00\u884C\uFF0C\u5BC6\u5EA6\u4E0D\u6D6A\u8D39\u4EFB\u4F55\u4E00\u884C\u3002\n \u7EC8\u7AEF\u6CA1\u6709\u5B57\u4F53\u884C\u9AD8\uFF0C\u8282\u594F\u53EA\u80FD\u6765\u81EA\u95F4\u9699\u5206\u7EA7\u4E0E\u5185\u8FB9\u8DDD\uFF0C\u8FD9\u6761\u89C4\u5F8B\u73B0\u5DF2\u5199\u5165 J8 \u800C\u975E\u6BCF\u6B21\u91CD\u65B0\u53D1\u73B0\n- \u9996\u5C4F\u6539\u4E3A compose-first\uFF1A\u5DF2\u914D\u7F6E\u7EBF\u8DEF\u65F6\uFF0C\u8F93\u5165\u6846\u4E3A\u7A7A\u6309 Enter \u76F4\u63A5\u5F00\u65B0\u4F1A\u8BDD\uFF08\u9879\u76EE\u9009\u62E9\u4ECD\u751F\u6548\uFF09\uFF0C\n \u63D0\u793A\u6587\u6848\u6539\u4E3A\u300CEnter \u5F00\u5DE5\u300D\uFF1B\u9996\u6B21\u8FD0\u884C\u4FDD\u7559\u786E\u8BA4\u8BED\u4E49\u2014\u2014\u7EBF\u8DEF\u5FC5\u987B\u5148\u5B58\u5728\uFF0C\u4F1A\u8BDD\u624D\u53EF\u80FD\u5F00\u59CB\n- \u9996\u5C4F\u8BB0\u4F4F\u6700\u8FD1\u4E09\u4E2A\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u663E\u793A\u5728\u4FE1\u606F\u677F\u4E0B\u65B9\uFF0C\u6309 1-3 \u76F4\u63A5\u91CD\u5F00\u3002\u663E\u793A\u7684 cwd \u53D6\u81EA\u4F1A\u8BDD\u8BB0\u5F55\u91CC\n \u5199\u5165\u7684 cwd \u5B57\u6BB5\uFF0C\u7EDD\u4E0D\u7531\u76EE\u5F55 slug \u53CD\u89E3\uFF08slug \u6709\u635F\uFF1A\u8DEF\u5F84\u5206\u9694\u7B26\u4E0E\u8FDE\u5B57\u7B26\u4E0D\u53EF\u533A\u5206\uFF09\uFF1B\n \u4E34\u65F6\u76EE\u5F55\u3001\u5BB6\u76EE\u5F55\u4E0E\u8BB0\u5F55\u5B58\u653E\u76EE\u5F55\u672C\u8EAB\u90FD\u88AB\u6392\u9664\n- \u95E8\u7981\u53D6\u771F\uFF1A\u4E24\u4E2A pager/broker \u6D4B\u8BD5\u4E0D\u518D\u8BFB\u5F00\u53D1\u673A\u672C\u5730\u7684 review model \u8986\u5199\uFF0C\n \u4E2A\u4EBA\u8BBE\u7F6E\u91CC\u7684 pin \u4E0D\u80FD\u518D\u628A\u53D1\u5E03\u95E8\u7981\u5224\u7EA2\n- \u6E90\u7801\u7EA7\u5224\u65AD\u57FA\u5E95\uFF08\u4E0D\u968F\u672C\u5305\u53D1\u5E03\uFF09\uFF1Alaziness / intent / verify-green \u4E09\u6761\u65E2\u6709\u89C4\u5219\u5730\u677F\u4E4B\u4E0B\n \u5404\u6709\u4E00\u4E2A\u7C7B\u578B\u5316\u5224\u65AD\u5C42\uFF0C\u9ED8\u8BA4\u4F11\u7720\uFF08\u672A\u8BBE TYPESAFE_API_KEY \u5373\u5B8C\u5168\u4E0D\u52A8\uFF09\u3002\n \u5B83\u5728 8.16.1 \u7684\u4EA7\u7269\u91CC\u662F\u60F0\u6027\u7684\u2014\u2014\u8BE6\u89C1\u53D1\u5E03\u8BF4\u660E\u7684 Known \u4E00\u8282\n\n## 13.2.0 - 2026-09-19\n\n- `/release-notes` \u79BB\u7EBF\u53EF\u7528\uFF1A\u6784\u5EFA\u671F\u628A `CHANGELOG.md` \u6CE8\u5165 `MACRO.VERSION_CHANGELOG`\n \uFF08\u6B64\u524D\u6052\u4E3A\u7A7A\u4E32\uFF09\uFF0C\u7F13\u5B58\u672A\u547D\u4E2D\u65F6\u56DE\u843D\u5230\u5185\u7F6E\u526F\u672C\u800C\u975E `""`\uFF0C\u5168\u65B0\u5B89\u88C5\u9996\u6B21\u8FD0\u884C\u5373\u53EF\u770B\u5230\u771F\u5B9E\u6761\u76EE\n- `/release-notes` \u7684\u94FE\u63A5\u4E0E\u540E\u53F0 fetch \u6B64\u524D\u90FD\u6307\u5411 anthropics/claude-code\uFF0C\u6539\u4E3A\u6307\u5411 Clavue \u81EA\u8EAB\u4ED3\u5E93\uFF1B\n \u547D\u4EE4\u6539\u4E3A\u5148\u8BFB\u672C\u5730\u5185\u5BB9\u3001\u628A\u7F51\u7EDC\u5F53\u4F5C\u4E0B\u6B21\u5237\u65B0\u7684\u6765\u6E90\uFF0C\u4E0D\u518D\u4E3A I/O \u963B\u585E\u7B54\u6848\n- hop \u6B63\u6587\u6536\u655B\uFF1A\u8FDE\u7EED\u91CD\u590D\u884C\u6298\u53E0\u4E3A\u9996\u5C3E\u4E24\u884C\u5E76\u6CE8\u660E\u7701\u7565\u6761\u6570\uFF08\u8FDE\u7EED\u4E24\u884C\u5C5E\u6B63\u5E38\u4E66\u5199\uFF0C\u4E0D\u5904\u7406\uFF09\uFF0C\n \u8D85\u957F\u6B63\u6587\u6539\u4E3A\u4FDD\u7559\u9996\u5C3E\u800C\u975E\u53EA\u7559\u5934\u90E8\uFF0C\u5E76\u6CE8\u660E\u539F\u59CB\u957F\u5EA6\uFF0C\u907F\u514D\u622A\u65AD\u540E\u7684\u6B63\u6587\u88AB\u8BEF\u8BFB\u4E3A\u672C\u6765\u5C31\u8FD9\u4E48\u77ED\n- Tips \u8FDC\u7A0B feed\uFF1A\u6587\u6848\u53EF\u5728\u4E0D\u53D1\u7248\u7684\u60C5\u51B5\u4E0B\u66F4\u6B63\u3002feed \u5C5E\u4E0D\u53EF\u4FE1\u8F93\u5165\uFF0C\u6309\u767D\u540D\u5355\u6821\u9A8C\u2014\u2014\n \u5FC5\u987B\u58F0\u660E\u672C\u4EA7\u54C1\u3001URL \u5FC5\u987B\u4E3A https\u3001\u5B57\u7B26\u4E32\u957F\u5EA6\u8BBE\u4E0A\u9650\uFF1B\u5355\u6761\u7578\u5F62\u6761\u76EE\u53EA\u4E22\u5F03\u81EA\u8EAB\uFF0C\u4E0D\u5F71\u54CD\u5176\u4F59\u6761\u76EE\u3002\n \u6761\u76EE\u590D\u7528\u65E2\u6709\u51B7\u5374\u673A\u5236\u5E76\u4F7F\u7528\u547D\u540D\u7A7A\u95F4 id\uFF0C\u4E0E\u5185\u7F6E\u63D0\u793A\u4E92\u4E0D\u5E72\u6270\uFF1B\u5931\u8D25\u5168\u7A0B\u9759\u9ED8\uFF0C\u7F51\u7EDC\u95EE\u9898\u4E0D\u4F1A\u53D8\u6210\u62A5\u9519\u6216\u62D6\u6162\u56DE\u5408\n- Tips \u63D0\u793A\u6B64\u524D\u4E0D\u53EF\u8FBE\u800C\u975E\u8FC7\u671F\uFF1A`getRelevantTips` \u7684\u552F\u4E00\u8C03\u7528\u65B9\u4E22\u5F03\u4E86\u7ED3\u679C\uFF0C`getTipToShowOnSpinner`\n \u65E0\u4EFB\u4F55\u8C03\u7528\u65B9\uFF0C`contextTipsActive` \u6052\u4E3A `false` \u4E14\u4ECE\u672A\u8D4B\u503C\u3002\u6539\u4E3A\u5728\u6E32\u67D3\u63D0\u793A\u7684 Spinner \u5185\u90E8\u9009\u53D6\u63D0\u793A\n\n## 13.1.5 - 2026-09-14\n\n- \u4FA7\u67E5\u8BE2\uFF08plan/review hop\u3001\u5206\u7C7B\u5668\u3001\u8BB0\u5FC6\u68C0\u7D22\u3001\u8BC1\u636E\u6536\u636E\uFF09\u6539\u4E3A\u6D41\u5F0F\uFF1A\u4E0D\u518D\u53D1 `stream:false` \u7684\n `/v1/chat/completions`\uFF0C\u907F\u514D\u6DF1\u5EA6\u63A8\u7406\u6A21\u578B\u5728\u7F51\u5173 600 \u79D2\u4EE3\u7406\u5899\u4E0A\u88AB\u6390\u65AD\n- \u4FA7\u67E5\u8BE2\u7684 `effort` \u771F\u6B63\u843D\u5230 `output_config.effort`\uFF1A\u6B64\u524D\u8BE5\u5B57\u6BB5\u672A\u5728\u9009\u9879\u7C7B\u578B\u4E0A\u58F0\u660E\uFF0C\n \u8C03\u7528\u65B9\u5C55\u5F00\u4F20\u503C\u4E0D\u4F1A\u89E6\u53D1\u7C7B\u578B\u68C0\u67E5\uFF0C\u503C\u88AB\u9759\u9ED8\u4E22\u5F03\uFF0C\u7F51\u5173\u9000\u56DE\u81EA\u8EAB\u9ED8\u8BA4\u6863\n- \u8BCA\u65AD\u7C7B Bash/PowerShell \u65E5\u5FD7\u8D70 light \u69FD\u8BC1\u636E\u6536\u636E\uFF1A\u5F15\u7528\u5FC5\u987B\u5728\u539F\u6587\u9010\u5B57\u8282\u547D\u4E2D\uFF0C\u5426\u5219\u4FDD\u7559\u539F\u65E5\u5FD7\uFF1B\n `CLAVUE_EVIDENCE_REDUCER=0` \u5173\u95ED\n- \u5927 Read/Grep/Glob \u9996\u6B21\u4ECD\u7ED9\u5168\u6587\uFF0C\u4E4B\u540E\u51BB\u6210 `clavue_observation_v1` \u5360\u4F4D\uFF0C\u7528 ObsRecall \u5206\u9875\u53EC\u56DE\uFF1B\n `CLAVUE_OBS_PACK=0` \u5173\u95ED\n- \u56DE\u5408\u6309 trivial/research/implement/heavy \u8C03\u5EA6 hop\uFF1B\u4E3B\u69FD model/effort \u7C98\u4F4F\u4EE5\u4FDD\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\n \u4EC5 compact \u540E\u4E14\u540C\u7C7B\u8FDE\u7EED\u4E24\u8F6E\u624D\u8003\u8651\u6539 effort\n- Plan hop \u7684 DSML \u7B49\u672A\u89E3\u6790\u5DE5\u5177\u65B9\u8A00\u4ECE Thought \u5C55\u793A\u4E0E plan/review \u4E0A\u4E0B\u6587\u4E00\u5E76\u5265\u79BB\uFF0C\u6574\u5757\u5220\u9664\uFF0C\n \u4E0D\u5199\u5165 transcript \u4E5F\u4E0D\u704C\u8FDB\u4E3B\u6A21\u578B\n- \u4ECE\u771F\u5B9E prompt-too-long \u62D2\u7EDD\u4E2D\u5B66\u4E60\u6BCF\u4E2A\u6A21\u578B\u7684\u5B9E\u9645\u8F93\u5165\u4E0A\u9650\uFF0C\u53EA\u6536\u7D27\u4E0D\u653E\u5927\u7A97\u53E3\uFF1B\u7F51\u5173\u53EA\u62A5\n `prompt_tokens` / `completion_tokens` \u65F6\u7528\u91CF\u4E0D\u518D\u5168\u6620\u5C04\u6210 0\n- Edit \u53EF\u9009 `then_run`\uFF1A\u4EC5\u5141\u8BB8\u5355\u6761\u8BCA\u65AD\u547D\u4EE4\uFF0C\u8D70 Bash \u6743\u9650\u5361\u4E0E sandbox\uFF0C\u7981\u6B62 `;&|` \u5939\u5E26\n- T0 Fast \u4FDD\u6301 primary-only\uFF1A\u8DEF\u5F84\u5C42\u5224\u5B9A\u524D\u7F6E\u5230 hop \u8C03\u5EA6\uFF0C\u6700\u7B80\u56DE\u5408\u4E0D\u518D\u4E3A\u8BC1\u636E\u6536\u636E\u4ED8\u4E00\u6B21 light \u5F80\u8FD4\n',changelogMemoryCache}}function getStoredChangelogFromMemory(){return changelogMemoryCache??""}function parseChangelog(content){try{if(!content)return{};let releaseNotes2={},sections=content.split(/^## /gm).slice(1);for(let section of sections){let lines=section.trim().split(`
7676
- `);if(lines.length===0)continue;let versionLine=lines[0];if(!versionLine)continue;let version3=versionLine.split(" - ")[0]?.trim()||"";if(!version3)continue;let notes=lines.slice(1).filter(line=>line.trim().startsWith("- ")).map(line=>line.trim().substring(2).trim()).filter(Boolean);notes.length>0&&(releaseNotes2[version3]=notes)}return releaseNotes2}catch(error40){return logError2(toError(error40)),{}}}function getRecentReleaseNotes(currentVersion,previousVersion,changelogContent=getStoredChangelogFromMemory()){try{let releaseNotes2=parseChangelog(changelogContent),baseCurrentVersion=(0,import_semver7.coerce)(currentVersion),basePreviousVersion=previousVersion?(0,import_semver7.coerce)(previousVersion):null;if(!basePreviousVersion||baseCurrentVersion&&gt2(baseCurrentVersion.version,basePreviousVersion.version))return Object.entries(releaseNotes2).filter(([version3])=>!basePreviousVersion||gt2(version3,basePreviousVersion.version)).sort(([versionA],[versionB])=>gt2(versionA,versionB)?-1:1).flatMap(([_2,notes])=>notes).filter(Boolean).slice(0,MAX_RELEASE_NOTES_SHOWN)}catch(error40){return logError2(toError(error40)),[]}return[]}function getAllReleaseNotes(changelogContent=getStoredChangelogFromMemory()){try{let releaseNotes2=parseChangelog(changelogContent);return Object.keys(releaseNotes2).sort((a2,b3)=>gt2(a2,b3)?1:-1).map(version3=>{let versionNotes=releaseNotes2[version3];if(!versionNotes||versionNotes.length===0)return null;let notes=versionNotes.filter(Boolean);return notes.length===0?null:[version3,notes]}).filter(item=>item!==null)}catch(error40){return logError2(toError(error40)),[]}}function getBundledReleaseNotes(){let bundled='# Changelog\n\nClavue \u53D1\u5E03\u8BF4\u660E\u3002\u672C\u6587\u4EF6\u5728\u6784\u5EFA\u65F6\u6CE8\u5165\u8FD0\u884C\u65F6\uFF0C\u9A71\u52A8 `/release-notes` \u4E0E\u542F\u52A8\u753B\u9762\u7684\u300C\u65B0\u7279\u6027\u300D\u680F\u3002\n\n\u683C\u5F0F\u7EA6\u5B9A\uFF08\u89E3\u6790\u5668\u4F9D\u8D56\uFF09\uFF1A\u4E8C\u7EA7\u6807\u9898\u4E3A `## <\u7248\u672C> - <\u65E5\u671F>`\uFF0C\u6761\u76EE\u4EE5 `- ` \u5F00\u5934\uFF0C\u4E00\u884C\u4E00\u6761\uFF0C\n\u547D\u4EE4\u3001\u53C2\u6570\u4E0E\u6A21\u578B\u540D\u4FDD\u7559\u82F1\u6587\u3002\n\n## 13.9.1 - 2026-10-23\n\n- **\u951A\u5B9A\u4F1A\u8BDD cwd \u5199\u6587\u4EF6\u3002** \u65E0\u663E\u5F0F\u8DEF\u5F84\u65F6 Edit/Write \u4E0D\u5F97\u843D\u5230\u5144\u5F1F\u6C99\u7BB1\uFF1B\u7EDD\u5BF9\u8DEF\u5F84\u9003\u51FA session cwd \u4F1A\u88AB\u62D2\u7EDD\n- **print \u6210\u529F\u5373\u9000\u51FA 0\u3002** `subtype=success` \u65F6\u8FDB\u7A0B\u9000\u51FA\u7801\u6052\u4E3A 0\uFF0C\u4E0D\u518D\u51FA\u73B0 success \u5374 exit 1\uFF08bench C1\uFF09\n- **print \u7ED3\u679C\u8865\u9F50 timing\u3002** `result.timing` \u53EF\u5BF9\u6807 v1\uFF08wallMs / modelMs / toolCalls \u7B49\uFF09\n\n## 13.9.0 - 2026-10-23\n\n- **\u754C\u9762\u5168\u9762\u5BF9\u6807 Grok Build\u3002** \u9876\u680F/\u5E95\u680F/\u72B6\u6001\u884C\uFF08chrome\uFF09\u3001\u4E3B\u9898\u8272\u4E0E\u5B57\u5F62\u3001\u9996\u9875\u4E00\u5C4F\u53EF\u8F93\u5165\u4E14\u70ED\u952E\u4E0D\u541E\u9996\u5B57\u3001\u952E\u4F4D\u5BFC\u822A\u4E0E\u5FEB\u6377\u952E\u9762\u677F\u3001\u4E00\u8F6E\u6C47\u603B \u25C8 / \u9010\u6761 \u25C6 / \u4E09\u5C42\u5C55\u5F00\u3001\u5185\u8054\u6743\u9650\u5361\u3001\u5B50\u4EE3\u7406\u884C\u4E0E dock\u3001\u65E5\u8BB0\u964D\u566A\u4E0E\u5931\u8D25\u6761\uFF0C\u516B\u7EC4 GUI \u4E00\u5E76\u5408\u5165\n- **\u534F\u8BAE\u767B\u8BB0\u91CD\u5EFA\u3002** \u5408\u5E76\u540E\u7EDF\u4E00\u91CD\u5EFA UI \u534F\u8BAE registry\uFF0C\u4FDD\u7559\u5168\u90E8\u4E8B\u4EF6\u767B\u8BB0\uFF0C\u4E0D\u4E22\u7AEF\u53E3\n\n## 13.8.0 - 2026-10-22\n\n- **\u51FA\u9519\u65F6\u8BF4\u6E05\u695A\u3001\u5C11\u7A7A\u8F6C\u3002** \u9519\u8BEF\u7EDF\u4E00\u5206\u6210\u53EF\u91CD\u8BD5\u3001\u53EF\u6062\u590D\u3001\u5FC5\u987B\u505C\u6B62\u4E09\u7C7B\uFF1B401/402/\u78C1\u76D8\u6EE1\u76F4\u63A5\u505C\u5E76\u7ED9\u4E00\u884C\u539F\u56E0\uFF0C\u65AD\u7F51\u3001\u8D85\u65F6\u3001429\u30015xx \u624D\u91CD\u8BD5\n- **\u574F\u5DE5\u5177\u8C03\u7528\u81EA\u52A8\u4FEE\u3002** \u65E0\u540D\u6216\u53C2\u6570\u574F\u6389\u7684\u5DE5\u5177\u8C03\u7528\u6309\u300C\u4E22\u5F03\u91CD\u8BD5 \u2192 \u63D0\u9192\u5DE5\u5177\u540D \u2192 \u6309\u53C2\u6570\u63A8\u65AD \u2192 \u6362\u6A21\u578B\u300D\u4FEE\u590D\uFF0C\u72B6\u6001\u884C\u663E\u793A\u300C\u6B63\u5728\u91CD\u8BD5 (n/4)\u300D\uFF0C\u4FEE\u4E0D\u597D\u53EA\u7559\u4E00\u884C\u9519\u8BEF\n- **\u56DE\u590D\u88AB\u622A\u65AD\u80FD\u63A5\u4E0A\u3002** \u6D41\u4E2D\u65AD\u540E\u4ECE\u65AD\u70B9\u7EED\u5199\uFF0C\u9996\u5B57\u7B49\u5F85\u6309\u7F51\u5173\u8868\u73B0\u81EA\u9002\u5E94\uFF1B\u5207\u5230\u5907\u7528\u6A21\u578B\u65F6\u5DE5\u5177\u5217\u8868\u4FDD\u6301\u4E0D\u53D8\uFF0C\u63D0\u793A\u7F13\u5B58\u4E0D\u5931\u6548\n- **\u81EA\u52A8\u7EED\u63A5\u53EA\u6709\u4E00\u4E2A\u51FA\u53E3\u3002** \u5404\u7C7B\u7EED\u63A5\u8D70\u540C\u4E00\u51FA\u53E3\uFF0C\u6709\u8FDB\u5C55\u4E0D\u8BA1\u6570\uFF0C\u8FDE\u7EED\u65E0\u8FDB\u5C55 8 \u6B21\u6216\u6BCF\u56DE\u5408 40 \u6B21\u540E\u505C\u4E0B\u5E76\u8BF4\u660E\uFF1B\u6309\u8BC1\u636E\u5224\u65AD\u662F\u5426\u5361\u4F4F\uFF0C\u4E0D\u518D\u51ED\u5B57\u6570\n- **\u5B50\u4EE3\u7406\u6709\u8D26\u672C\u3002** \u6309\u5B50\u4EE3\u7406\u8BB0\u5F55\u5DE5\u5177\u6B21\u6570\u3001token \u548C\u91CD\u590D\u8BFB\u53D6\uFF1B\u652F\u6301\u65F6\u95F4\u9884\u7B97\u4E0E\u6536\u5C3E\u603B\u7ED3\u56DE\u5408\uFF0C\u53EA\u8BFB\u4EFB\u52A1\u4E0D\u518D\u88AB\u8981\u6C42\u6539\u6587\u4EF6\uFF1B`/parallel` \u6709\u5E76\u53D1\u4E0A\u9650\n- **\u66F4\u5B89\u5168\u3002** \u62E6\u622A\u8BEF\u6740\u81EA\u8EAB\u6216\u65E0\u5173\u8FDB\u7A0B\u7684 kill\uFF1B\u65B0\u589E AIza\u3001AKIA/ASIA\u3001glpat-\u3001hf_\u3001npm_\u3001xai- \u7B49\u683C\u5F0F\u53CA\u300C\u4E3B\u673A \u7528\u6237 \u5BC6\u7801\u300D\u4E09\u6BB5\u5F0F\u6253\u7801\uFF1B\u6539\u52A8 `~/.ssh`\u3001`~/.aws` \u7B49\u51ED\u636E\u8DEF\u5F84\u524D\u5148\u786E\u8BA4\n- **\u8BF7\u6C42\u4F53 gzip\u3002** \u7F51\u5173\u652F\u6301\u65F6\u8BF7\u6C42\u81EA\u52A8\u538B\u7F29\uFF0C\u9047\u5230 400/415 \u56DE\u9000\u5E76\u8BB0\u4F4F\u4E00\u5C0F\u65F6\uFF1B\u82E5\u5E72\u754C\u9762\u7EC6\u8282\u4FEE\u6574\n\n## 13.7.0 - 2026-10-21\n\n- **\u65E5\u8BB0\u91CD\u505A\uFF0C\u8F93\u51FA\u66F4\u5E72\u51C0\u3002** \u6BCF\u8F6E\u53EA\u51FA\u4E8B\u4EF6\uFF08\u5F00\u59CB\u3001\u5DE5\u5177\u5F00\u59CB\u4E0E\u7ED3\u675F\u3001\u6700\u7EC8\u56DE\u7B54\u3001\u7ED3\u675F\u539F\u56E0\uFF09\uFF0C\u65E5\u8BB0\u6587\u5B57\u7EDF\u4E00\u7531 pager \u751F\u6210\uFF1B\u7ED3\u5C3E\u4E00\u8F6E\u4E00\u884C\u3001\u5C5E\u4E8E\u672C\u8F6E\uFF0C\u5931\u8D25\u6216\u4E2D\u65AD\u65F6\u4E0D\u518D\u5199\u300C\u5B8C\u6210\u300D\uFF0C\u6D3B\u52A8\u6761\u4E0D\u518D\u6F0F\u51FA\u5185\u90E8\u7F16\u7801\n- **\u540E\u53F0\u4EFB\u52A1\u4E0D\u518D\u5237\u5C4F\u3002** \u76F8\u90BB\u7684\u540E\u53F0\u4EFB\u52A1\u901A\u77E5\u5408\u5E76\u6210\u4E00\u8F6E\u5904\u7406\uFF08\u5408\u5E76\u7A97\u53E3\u9ED8\u8BA4 1500ms\uFF09\uFF0C\u81EA\u52A8\u8DDF\u8FDB\u56DE\u5408\u5931\u8D25\u65F6\u53EA\u7559\u4E00\u6761\u53EF\u539F\u5730\u66F4\u65B0\u7684\u63D0\u793A\uFF0C\u4E0D\u518D\u753B\u6574\u5757\u5931\u8D25\u5361\n- **\u56DE\u5408\u6536\u5C3E\u5224\u5F97\u66F4\u51C6\u3002** \u4EE5\u300C\u6211\u4F1A\u2026\u300D\u300C\u63A5\u4E0B\u6765\u2026\u300D\u8FD9\u7C7B\u627F\u8BFA\u53E5\u7ED3\u5C3E\u7B97\u672A\u5B8C\u6210\uFF1B\u7B49\u5F85\u540E\u53F0\u4EFB\u52A1\u4E0D\u5224\u5931\u8D25\uFF1B\u76EE\u6807\u4E0D\u4F1A\u88AB\u77ED\u56DE\u590D\u6216\u4EFB\u52A1\u901A\u77E5\u5360\u4F4F\n- **\u7F51\u5173\u66F4\u7A33\u3002** \u91CD\u8BD5\u7EDF\u4E00\u8BA1\u5165\u4E00\u4E2A\u9884\u7B97\uFF0C\u4E0D\u518D\u51FA\u73B0\u91CD\u8BD5\u4E8C\u5341\u591A\u6B21\uFF1B\u91CD\u590D\u7684\u6D41\u4E8B\u4EF6\u53BB\u91CD\uFF1B\u5207\u5907\u7528\u65F6\u8DF3\u8FC7\u88C5\u4E0D\u4E0B\u5F53\u524D\u4E0A\u4E0B\u6587\u7684\u6A21\u578B\uFF1B\u517C\u5BB9 text/plain \u56DE\u590D\uFF1B\u7A7A text block \u4E0D\u518D\u5BFC\u81F4 400\uFF1B\u5B50\u4EE3\u7406\u88AB\u622A\u65AD\u540E\u4F1A\u7EED\u5199\n- **\u5907\u7528\u6A21\u578B\u63D0\u793A\u53EA\u51FA\u4E00\u6B21\u3002** \u6BCF\u4F1A\u8BDD\u6BCF\u5BF9\u6A21\u578B\u53EA\u63D0\u793A\u4E00\u6B21\u300C\u5DF2\u5207\u5230\u5907\u7528\u6A21\u578B B\uFF08A \u4E0D\u53EF\u7528\uFF09\u300D\uFF1B\u5E95\u680F\u7A84\u5C4F\u65F6\u5148\u7701\u6389 @effort \u7B49\u6807\u7B7E\uFF0C\u4FDD\u4F4F\u5B8C\u6574\u6A21\u578B\u540D\n- **\u5DE5\u5177\u66F4\u5BBD\u5BB9\u4E5F\u66F4\u5B89\u5168\u3002** Write / Grep \u63A5\u53D7\u5E38\u89C1\u53C2\u6570\u522B\u540D\u3001\u4E22\u6389\u591A\u4F59\u5B57\u6BB5\uFF1B\u5DF2\u6709\u6587\u4EF6\u662F GBK\u3001Shift-JIS \u7B49\u975E UTF-8 \u7F16\u7801\u65F6\u62D2\u7EDD\u5199\u5165\u5E76\u8BF4\u660E\u7F16\u7801\uFF0C\u4E0D\u6539\u539F\u5B57\u8282\n- **\u5361\u6B7B\u4E0E\u8FDB\u7A0B\u6536\u5F97\u5E72\u51C0\u3002** \u5361\u6B7B\u515C\u5E95\u5B88\u62A4\uFF1BBash \u6309\u8FDB\u7A0B\u7EC4\u767B\u8BB0\u5E76\u6574\u7EC4\u6E05\u7406\uFF1B\u9000\u51FA\u65F6\u540E\u53F0\u547D\u4EE4 1.5s \u5185\u5F3A\u6740\u4E14 SessionEnd \u5FC5\u8DD1\uFF1B\u53EA\u6740\u542F\u52A8\u5668\u65F6\u5B50\u8FDB\u7A0B\u4E0D\u518D\u6210\u5B64\u513F\n- **\u957F\u4F1A\u8BDD\u66F4\u7701\u3002** \u6BCF\u6B21\u66F4\u65B0\u4E0D\u518D\u91CD\u626B\u5168\u5BF9\u8BDD\uFF1B\u5DE5\u5177\u8F93\u51FA\u8D85\u8FC7 2000 \u884C\u843D\u76D8\u53EA\u7559\u6458\u8981\uFF1B\u65B0\u589E\u7ED3\u679C\u6865 `result.json`\n- **\u6743\u9650\u52A0\u56FA\u3002** \u85CF\u5728\u5B50\u547D\u4EE4\u3001\u5F15\u53F7\u6216\u53D8\u91CF\u91CC\u7684\u5371\u9669 `rm` \u4E5F\u4F1A\u62E6\uFF1B\u4FEE\u8865\u4E00\u6279 Bash \u5206\u6790\u7ED5\u8FC7\uFF1B\u6309 symlink \u7684\u771F\u5B9E\u843D\u70B9\u5224\u6743\u9650\uFF1Bplan \u6A21\u5F0F\u4E0B Bash \u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF1BMCP \u62A5\u9519\u91CC\u7684\u5BC6\u94A5\u5148\u6253\u7801\uFF1B\u65B0\u589E `--restricted` \u53EA\u8BFB\u6A21\u5F0F\n- **\u4EE5\u300C\u7406\u89E3\uFF1A\u300D\u5F00\u5934\u7684\u6700\u7EC8\u7B54\u6848\u4E0D\u518D\u88AB\u541E\u3002** \u91CD\u8BD5\u540E\u7B54\u6848\u4E0D\u4F1A\u6D88\u5931\uFF1B`/model` \u56DE\u6267\u53EA\u663E\u793A\u4E00\u6B21\u5E76\u5237\u65B0\u5E95\u680F\n\n## 13.6.0 - 2026-10-19\n\n- **\u5907\u7528\u94FE\u66F4\u53EF\u9760\u3002** \u9996\u5305\u8D85\u65F6\u6216\u5907\u7528\u6A21\u578B\u8FD4\u56DE 404 / 5xx \u65F6\uFF0C\u6CBF `CLAVUE_COMBO_FALLBACK`\uFF08\u9017\u53F7\u5206\u9694\uFF09\u5207\u5230\u4E0B\u4E00\u4E2A\u6A21\u578B\uFF0C\u8DF3\u8FC7\u540C\u5BB6\u65CF\u522B\u540D\uFF08`cn:deepseek-v4.1-flash` \u4E0D\u4F1A\u518D\u5207\u56DE `deepseek-v4-flash`\uFF09\u3002\u521A\u5931\u6548\u7684\u6A21\u578B 10 \u5206\u949F\u5185\u4E0D\u518D\u9009\uFF08`CLAVUE_MODEL_HEALTH_TTL_MS`\uFF09\uFF1B\u6574\u6761\u94FE\u90FD\u5931\u6548\u65F6\u56DE\u5230\u5B8C\u6574\u94FE\u3002\u4E3B\u6A21\u578B\u4E0A\u7684 502/503 \u4ECD\u6309\u539F\u6765\u7684\u4E24\u6B21\u9608\u503C\n- **\u5B58\u6863\u524D\u5BC6\u94A5\u6253\u7801\u3002** \u4F1A\u8BDD jsonl \u548C `history.jsonl` \u5199\u76D8\u524D\u906E\u6389 `sshpass -p`\u3001`SSHPASS=`\u3001`mysql -p` / `--password`\u3001`PGPASSWORD`\u3001`MYSQL_PWD`\u3001`curl -u`\u3001\u5E26\u8D26\u53F7\u5BC6\u7801\u7684 URL\u3001`Authorization: Bearer`\u3001`sk-` / `ghp_` \u5BC6\u94A5\u3001`password=`\u3001`*_PASS=` / `*_PWD=`\u3002\u6267\u884C\u4ECD\u7528\u539F\u547D\u4EE4\uFF1B`PWD=` / `$PWD` \u4E0D\u53D7\u5F71\u54CD\n- **\u663E\u5F0F\u8BE2\u95EE\u89C4\u5219\u4F18\u5148\u3002** `Bash(rm:*)` \u8FD9\u7C7B ask \u89C4\u5219\u547D\u4E2D\u590D\u5408\u547D\u4EE4\u91CC\u7684\u5B50\u547D\u4EE4\uFF08`rm \u2026 && ls`\uFF09\u65F6\uFF0C\u4E0D\u518D\u88AB\u5168\u5C40 `Bash` \u5141\u8BB8\u8986\u76D6\uFF1B\u9ED8\u8BA4\u6A21\u5F0F\u548C\u6C99\u7BB1\u6A21\u5F0F\u90FD\u751F\u6548\uFF0C`bypassPermissions` \u4ECD\u8C41\u514D\n- **\u5B50\u4EE3\u7406\u88AB\u62E6\u65F6\u8BF4\u6E05\u539F\u56E0\u3002** \u8D85\u8FC7 `CLAVUE_AGENT_MAX_DEPTH` \u65F6\u8FD4\u56DE\u7ED3\u6784\u5316\u7684 `<spawn_blocked>` \u8BF4\u660E\uFF0C\u63D0\u793A\u540C\u4E00\u8C03\u7528\u4F1A\u518D\u6B21\u88AB\u62E6\u3001\u8BF7\u5728\u5F53\u524D\u4F1A\u8BDD\u5B8C\u6210\u3002\u6DF1\u5EA6\u6309\u771F\u5B9E\u5D4C\u5957\u5C42\u6570\u8BA1\u7B97\n- **\u5DE5\u5177\u53C2\u6570\u5F62\u72B6\u4E0D\u5BF9\u4E0D\u518D\u5D29\u6E83\u3002** \u6A21\u578B\u628A `path` \u5199\u6210\u6570\u7EC4\u3001\u5BF9\u8C61\u6216\u6F0F\u5199\u65F6\uFF0C\u6D88\u606F\u6298\u53E0\u548C\u8BB0\u5FC6\u8DEF\u5F84\u5224\u65AD\u9000\u56DE\u539F\u59CB\u884C\u663E\u793A\uFF0C\u4E0D\u518D\u62A5 `The "path" argument must be of type string`\n- **\u8FDB\u51FA worktree \u771F\u6B63\u6E05\u6389 plans \u76EE\u5F55\u7F13\u5B58\u3002** \u4EE5\u524D\u7F13\u5B58\u6CA1\u88AB\u6E05\u6389\uFF0Cplans \u76EE\u5F55\u4E00\u76F4\u6307\u5411\u8FDB\u5165 worktree \u524D\u7684\u76EE\u5F55\uFF0C\u73B0\u5728\u4F1A\u8DDF\u7740\u5207\u6362\n\n## 13.5.0 - 2026-10-16\n\n- **\u56DB\u6863\u8DEF\u7531\u3002** \u89C4\u5219\u628A\u56DE\u5408\u5206\u6210 \u7B80\u5355 / \u4E00\u822C / \u590D\u6742 / \u957F\u7A0B\u3002\u62FF\u4E0D\u51C6\u65F6\u8BA1\u5212\u69FD\u6700\u591A\u60F3 1 \u79D2\uFF0C\u8D85\u65F6\u7B97\u4E00\u822C\u3002`/goal` \u662F\u957F\u7A0B\u3002`/mode` \u56FA\u5B9A\u6863\u4F4D\u3002`CLAVUE_TIERS=0` \u5173\u95ED\u3002\u6539\u8FC7\u7684\u6587\u4EF6\u8D85\u8FC7 5 \u4E2A\u5347\u5230\u81F3\u5C11\u590D\u6742\uFF0C\u8D85\u8FC7 15 \u4E2A\u5347\u5230\u957F\u7A0B\uFF1B\u7B80\u5355\u6863\u91CC\u8BF7\u6C42\u8D85\u8FC7 20 \u6B21\u5347\u5230\u4E00\u822C\uFF1B\u540C\u4E00\u6761\u68C0\u67E5\u5931\u8D25 3 \u6B21\u5347\u4E00\u6863\uFF1BJEV \u5224\u5B9A\u4E25\u91CD\u5347\u5230\u81F3\u5C11\u590D\u6742\u3002\u964D\u6863\u53EA\u53D1\u751F\u5728\u4E0B\u4E00\u8F6E\u5F00\u59CB\n- **\u7B80\u5355\u6863\u5C11\u505A\u3002** \u4E0D\u8DD1 REVIEW\uFF0C\u4E0D\u95EE\u4EA4\u4ED8\u88C1\u5224\uFF0C\u56DE\u5408\u7ED3\u675F\u4E0D\u7B49\u5F85\uFF0C\u7CFB\u7EDF\u63D0\u793A\u7528\u7CBE\u7B80\u7248\u3002\u5DE5\u5177\u53EA\u7559 10 \u4E2A\u6838\u5FC3\uFF0C`mcp__*` \u59CB\u7EC8\u4FDD\u7559\u3002\u4E00\u822C\u6863\u5BA1\u67E5\u7B49\u5F85\u6700\u591A 5 \u79D2\u3002\u590D\u6742\u548C\u957F\u7A0B\u6700\u591A 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\n- **\u72B6\u6001\u884C\u5E26\u6863\u4F4D\u3002** \u5728 `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42` \u540E\u52A0 `\u7B80\u5355`\u3002\u6362\u6863 15 \u79D2\u5185\u663E\u793A `\u7B80\u5355\u2192\u4E00\u822C`\n- **stdin \u5148\u770B 200ms\u3002** `-p` \u7B49\u7BA1\u9053\u7B2C\u4E00\u5B57\u8282\u9ED8\u8BA4 200ms\uFF08`CLAVUE_STDIN_PEEK_MS`\uFF0C0 \u4E0D\u7B49\uFF09\u3002MCP \u542F\u52A8\u8D5B\u8DD1\u4ECD\u662F 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF09\n\n## 13.4.2 - 2026-10-16\n\n- **\u8BA1\u65F6\u884C\u7528\u771F\u5B9E\u9636\u6BB5\u540D\u3002** \u8C03\u8BD5\u65E5\u5FD7\u4E0D\u518D\u628A\u6BCF\u4E00\u8DF3\u90FD\u5199\u6210 `sdk`\uFF0C\u800C\u662F `intake/jev`\u3001`plan`\u3001`scout`\u3001`main`\u3001`review`\u3001`compact`\u3001`subagent`\u3001`fanout` \u52A0\u4E0A\u6A21\u578B\u548C\u6BEB\u79D2\u3002\u72B6\u6001\u884C\u663E\u793A `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42`\n- **\u7F16\u6392\u5BF9\u9F50 v1\u3002** JEV intake \u5728\u56DE\u5408\u5F00\u59CB\u5C31\u53D1\u51FA\u53BB\uFF0C\u53EA\u5728\u8BA1\u5212\u8DF3\u4E4B\u524D\u7B49\u5F85\u3002\u77ED\u7EED\u5199\uFF08\u7EE7\u7EED\uFF09\u590D\u7528\u4E0A\u4E00\u8F6E\u5206\u7C7B\uFF1A0 \u6B21 JEV\u30010 \u6B21 PLAN\u3002\u8BA1\u5212\u8DF3\u81EA\u8EAB 30 \u79D2\u5230\u70B9\u5C31\u9759\u9ED8\u4E22\u6389\uFF08`CLAVUE_COMBO_PLAN_TIMEOUT_MS`\uFF09\uFF0C\u9996\u5305\u524D\u4ECD\u53EA\u7B49\u6700\u591A 1.8 \u79D2\u3002\u540C\u4E00\u4EFD\u8BA1\u5212\u53EA\u5BA1\u67E5\u4E00\u6B21\uFF0C\u8BA1\u5212\u6700\u591A\u4FEE\u8BA2\u4E00\u6B21\u3002`CLAVUE_COMBO_PLAN_HOP=0` \u4ECD\u53EF\u5173\u6389\u8BA1\u5212\u8DF3\n- **\u56DE\u5408\u7ED3\u675F\u7684\u5BA1\u67E5\u7B49\u5F85\u3002** \u914D\u7F6E\u9ED8\u8BA4\u4ECD\u662F 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\u3002\u7410\u788E\u56DE\u5408\u4E0D\u7B49\u5F85\uFF1B\u5176\u4F59\u56DE\u5408\u6700\u591A\u7B49 5 \u79D2\n- **\u51B7\u542F\u52A8\u4E0D\u6321 MCP\u3002** \u65E0\u5934\u6A21\u5F0F\u9ED8\u8BA4\u5728\u540E\u53F0\u8FDE\u63A5 MCP\uFF0C\u4E0D\u518D\u628A\u7B2C\u4E00\u8BF7\u6C42\u6321\u4F4F\u6700\u591A 8 \u79D2\u3002`CLAVUE_HEADLESS_MCP_BUDGET_MS=0` \u6062\u590D\u4E00\u76F4\u7B49\u5230\u8FDE\u5B8C\n- **JEV \u9274\u6743\u5931\u8D25\u8DE8\u8FDB\u7A0B\u8DF3\u8FC7\u3002** \u4E00\u6761 intake \u91CC\u4E24\u628A key \u90FD 401 \u5C31\u4F1A\u5199\u4E0B `jev-auth-fail.json`\u3002\u4E0B\u4E00\u4E2A\u8FDB\u7A0B\u5728 TTL \u5185\u4E0D\u518D\u53D1\u90A3\u4E24\u4E0B 401\n- **\u540E\u53F0\u8FDE\u4E0A\u7684 MCP \u4F1A\u8FDB\u540E\u7EED\u8BF7\u6C42\u3002** \u542F\u52A8\u65F6\u548C\u8FDE\u63A5\u8D5B\u8DD1\uFF0C\u9ED8\u8BA4\u6700\u591A 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF0C0 \u9A6C\u4E0A\u8FD4\u56DE\uFF09\u3002\u6BCF\u4E2A\u670D\u52A1\u5668\u8FDE\u4E0A\u5C31\u5199\u5165 headless store\u3002\u540C\u4E00\u56DE\u5408\u91CC\u4E0B\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u8C03\u7528 `refreshTools()` \u91CD\u8BFB `buildAllTools(getAppState())`\u3002`stickyToolsForTurn` \u4E0D\u518D\u56E0\u4E3A\u5DE5\u5177\u4E0D\u5728\u4E0A\u4E00\u8BF7\u6C42\u7684\u540D\u5355\u91CC\u5C31\u4E22\u6389 `mcp__*`\u3002\u6838\u5FC3\u5DE5\u5177\u9762\u4E5F\u4FDD\u7559 `mcp__*`\n- **\u6D41\u4E2D\u95F4\u5361\u4F4F\u4F1A\u6362\u5907\u7528\u6A21\u578B\u3002** \u804A\u5929\u6A21\u578B\u4EE5\u524D\u4E24\u4E2A chunk \u4E4B\u95F4\u53EF\u4EE5\u7A7A 180 \u79D2\uFF0C\u6240\u4EE5 -p \u91CC 81 \u79D2\u548C 147 \u79D2\u7684\u505C\u987F\u4E0D\u4F1A\u4E2D\u6B62\u3002\u73B0\u5728\u9ED8\u8BA4 60 \u79D2\uFF08`CLAVUE_API_STREAM_IDLE_TIMEOUT_MS`\uFF0C\u4E5F\u8BA4 `CLAVUE_STREAM_IDLE_TIMEOUT_MS`\uFF1B`CLAVUE_STREAM_WATCHDOG=0` \u5173\u95ED\uFF09\u3002\u5230\u70B9\u53D6\u6D88\u6D41\uFF08\u5DF2\u7ECF\u51FA\u8FC7\u5B57\u4E5F\u53D6\u6D88\uFF09\uFF0C\u4E22\u6389\u534A\u622A\u52A9\u624B\u6D88\u606F\uFF0C\u6309\u9996\u5305\u540C\u4E00\u6761\u5907\u7528\u94FE\u91CD\u8BD5\u4E00\u6B21\n- **\u8BA1\u5212\u8C03\u7528\u7684\u8BA1\u65F6\u884C\u5199 `plan`\u3002** \u9636\u6BB5\u6309\u8C03\u7528\u70B9\u7684 phase/role \u8BB0\uFF0C\u4E0D\u518D\u56E0\u4E3A querySource \u662F `sdk` \u5C31\u5168\u90E8\u5199\u6210 `main`\u3002scout / review \u540C\u7406\n\n## 13.4.1 - 2026-10-16\n\n- **\u9996\u5305\u8D85\u65F6\u6362\u5907\u7528\u6A21\u578B\u3002** \u9ED8\u8BA4\u7B49\u5F85\u4ECE 90 \u79D2\u964D\u5230 45 \u79D2\uFF08`CLAVUE_API_FIRST_BYTE_TIMEOUT_MS`\uFF0C0 \u5173\u95ED\uFF09\uFF0C\u6D41\u5F0F\u548C\u672C\u5730\u975E\u6D41\u5F0F\uFF08\u542B 127.0.0.1\uFF09\u90FD\u8BA1\u65F6\u3002\u8D85\u65F6\u540E\u4E0D\u518D\u91CD\u8BD5\u540C\u4E00\u4E2A\u6A21\u578B\uFF0C\u6539\u5207\u5907\u7528\uFF1Aprofile \u7684 `fallback`\u3001\u7136\u540E `CLAVUE_COMBO_FALLBACK`\u3001\u7136\u540E ttqq \u9ED8\u8BA4 `cn:deepseek-v4.1-flash`\uFF1B`off` \u5173\u95ED\u3002\u72B6\u6001\u884C\u663E\u793A `\u7B49\u5F85\u6A21\u578B\u9996\u5305 Ns`\u3002\u540E\u53F0\u8C03\u7528\u9ED8\u8BA4\u6700\u591A 20 \u79D2\uFF08`CLAVUE_SIDE_CALL_TIMEOUT_MS`\uFF0Cplan/review \u4E0D\u5957\u8FD9\u5C42\u4E0A\u9650\uFF09\n- **JEV \u4E0E FastApply \u51ED\u8BC1\u94FE\u3002** \u73B0\u6709\u987A\u5E8F\u4E4B\u540E\u8865\u4E0A\u5DF2\u767B\u5F55\u8D26\u53F7 key\uFF08`auth.json`\uFF0C\u542B `https://api.clavue.com::client` \u8FD9\u79CD\u6309\u4E3B\u673A\u5B58\u653E\u7684\u6761\u76EE\uFF09\u548C\u672C\u673A\u8BBE\u5907 key\uFF08`official-device-key.json`\uFF09\u3002\u914D\u7F6E\u76EE\u5F55\u8DDF\u968F `CLAVUE_CONFIG_DIR`\u3002\u53EA\u53D1\u7ED9 api.clavue.com\u3002\u67D0\u4E00\u7EA7\u8FD4\u56DE 401 \u5C31\u8BD5\u4E0B\u4E00\u7EA7\uFF0C\u5E76\u8BB0\u4E0B\u65B0\u6765\u6E90\uFF08`key source=auth.json:https://api.clavue.com::clavue-gui`\uFF09\u3002`/provider current` \u5217\u51FA\u6574\u6761\u94FE\u548C\u6BCF\u4E00\u7EA7\u662F\u5426\u627E\u5230\u3002\u540C\u4E00\u8BF7\u6C42 1 \u79D2\u5185\u4E0D\u53D1\u7B2C\u4E8C\u6B21\uFF0C\u6362 key \u9664\u5916\u3002\u5168\u90E8 401 \u65F6\u7EC8\u7AEF\u53EA\u6253\u4E00\u884C\u4E2D\u6587\u4FEE\u590D\u63D0\u793A\uFF0C\u4E0D\u518D\u6A21\u62DF\u5224\u5B9A\u3002\u5224\u5B9A\u5931\u8D25\u4F1A\u8BB0\u4F4F\u4E00\u5C0F\u6BB5\u65F6\u95F4\uFF08`CLAVUE_JEV_AUTH_FAIL_TTL_MS`\uFF0C\u9ED8\u8BA4 10 \u5206\u949F\uFF09\uFF0C\u8FD9\u6BB5\u65F6\u95F4\u91CC\u4E0D\u518D\u53D1 intake\n- **`provider current` \u8BFB\u53D6 settings.json \u7684 env\u3002** JEV/FA \u72B6\u6001\u4E0D\u518D\u56E0\u4E3A\u53EA\u5199\u5728 settings \u91CC\u800C\u663E\u793A off\u3002\u5DF2\u4FDD\u5B58\u7684\u7EBF\u8DEF\u662F\u5F53\u524D\u8DEF\u7531\u65F6\uFF0C\u4E0D\u518D\u663E\u793A `Current API config: None`\n- **DeepSeek \u63A8\u7406 token \u4E0D\u518D\u91CD\u590D\u8BA1\u5165\u4E0A\u4E0B\u6587\u3002** `reasoning_tokens` \u662F `completion_tokens` \u7684\u5B50\u96C6\uFF1B\u7F51\u5173\u628A\u4E24\u8005\u76F8\u52A0\u5199\u8FDB `output_tokens` \u65F6\u6309 completion \u8BA1\u3002\u540C\u4E00\u56DE\u590D\u62C6\u5F00\u7684\u601D\u8003\u5757\u4E0D\u518D\u88AB\u4F30\u7B97\u7B2C\u4E8C\u904D\n- **\u9632\u538B\u7F29\u98CE\u66B4\u3002** \u540C\u4E00\u6A21\u578B\u5BB6\u65CF\u91CC\u6362\u6A21\u578B\u3001\u7A97\u53E3\u6CA1\u6709\u53D8\u5C0F\u65F6\uFF0C\u4E0A\u4E0B\u6587\u6CA1\u5230\u65B0\u6A21\u578B\u9608\u503C\u5C31\u4E0D\u538B\u7F29\u3002\u6458\u8981\u6309 `CLAVUE_AUTO_COMPACT_MODEL` \u2192 light \u2192 FA \u2192 \u4E3B\u6A21\u578B\uFF0C\u6BCF\u4E2A\u6A21\u578B\u9650\u65F6 90 \u79D2\uFF08`CLAVUE_AUTO_COMPACT_TIMEOUT_MS`\uFF09\u3002\u4E0A\u4E0B\u6587\u4E0D\u5230 token \u9608\u503C 30% \u65F6\uFF0C\u5185\u5B58\u538B\u529B\u53EA\u6E05\u7F13\u5B58\uFF0C\u4E0D\u8DD1\u538B\u7F29\u3002\u7B2C\u4E09\u65B9\u7EBF\u8DEF\u4E0D\u4F1A\u9ED8\u8BA4\u53BB\u8C03 `clavue-2.1-fast` / `clavue-2.1` / `clavue-2.1-pro`\uFF1B\u53EA\u6709\u5B98\u65B9\u4E91\uFF0C\u6216\u4F60\u7528 `CLAVUE_COMBO_LIGHT` / `CLAVUE_AUTO_COMPACT_MODEL` \u8FD9\u7C7B\u73AF\u5883\u53D8\u91CF\u5199\u660E\uFF0C\u624D\u4F1A\u8D70\u8FD9\u4E9B id\n- **\u4EE3\u7801\u56DE\u5408\u5C11\u7B49\u524D\u7F6E\u8DF3\u3002** \u8BA1\u5212\u8DF3\u9ED8\u8BA4\u6700\u591A\u5360\u9996\u5305\u524D 1.8 \u79D2\uFF08`CLAVUE_SCOUT_TIMEOUT_MS`\uFF0C`CLAVUE_COMBO_PLAN_BLOCK=1` \u6062\u590D\u4E00\u76F4\u7B49\uFF09\u3002\u72EC\u7ACB\u7684\u8BA1\u5212\u69FD\u5E76\u884C\uFF0C\u8D85\u65F6\u4E0D\u518D\u4E32\u884C\u6362\u4E0B\u4E00\u4E2A\u6A21\u578B\u3002\u8C03\u8BD5\u65E5\u5FD7\u4E00\u884C `stage -> model -> ms`\n- **ttqq \u9884\u8BBE\u4E0D\u518D\u5185\u7F6E `clavue-2.1-fast`\u3002** \u8F7B\u91CF\u69FD\u7559\u7A7A\uFF0C\u8F85\u52A9\u8C03\u7528\u8DDF\u7740\u4E3B\u6A21\u578B\uFF0C\u9664\u975E\u4F60\u81EA\u5DF1\u6307\u5B9A\n- **\u7B2C\u4E09\u65B9 JEV fan-out\u3002** \u8C03\u7528\u65B9\u6CA1\u6709\u6307\u5B9A\u6A21\u578B\u65F6\u4E0D\u518D\u585E\u9ED8\u8BA4 `clavue-jev`\n\n## 13.4.0 - 2026-10-16\n\n- **\u4F4E\u98CE\u9669 clavue-v1 \u5BF9\u9F50\uFF08#8\uFF09\u3002** \u6062\u590D\u4F1A\u8BDD\u3001\u5806\u9876\u3001\u6EA2\u51FA\u3001print \u6536\u5C3E\u4E0E goal \u95F8\u95E8\u4ECE clavue-v1 \u8FC1\u5165\n- **1.48.5 \u4E4B\u540E\u7684\u5BF9\u9F50\uFF08#9\uFF09\u3002** \u8FC1\u5165 clavue-v1 1.48.7\uFF0C\u5E76\u7F13\u5B58\u7A33\u5B9A\u7684 system \u524D\u7F00\n- **\u53EF\u9009\u7684\u539F\u751F fetch \u5BA2\u6237\u7AEF\uFF08#10\uFF09\u3002** `CLAVUE_NATIVE_CLIENT` \u672A\u8BBE\u7F6E\u65F6\u4ECD\u8D70\u539F\u6709\u4F20\u8F93\uFF1B\u8BBE\u7F6E\u540E\u6539\u7528\u57FA\u4E8E fetch \u7684\u5BA2\u6237\u7AEF\n- **\u53EF\u9009\u7684 Rust napi \u70ED\u8DEF\u5F84\uFF08#11\uFF09\u3002** `CLAVUE_NATIVE_RS` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u672A\u8BBE\u7F6E\u65F6\u4E0D\u52A0\u8F7D addon\n- **\u53EF\u9009\u7684 fast-apply\uFF08#12\uFF09\u3002** `clavue-fa` \u7684 ApplyEdit \u9ED8\u8BA4\u5173\u95ED\n- **\u53EF\u9009\u7684 JEV \u51B3\u7B56\u95E8\uFF08#14\uFF09\u3002** \u6302\u5728\u5171\u4EAB aux \u69FD\u4E0A\uFF0C\u9ED8\u8BA4\u4E0D\u542F\u7528\n- **\u7EC4\u5408\u6210\u672C\u95F8\u4E0E\u8F93\u51FA\u536B\u751F\uFF08#13\uFF09\u3002** \u4ECE clavue-v1 \u8FC1\u5165\uFF1B\u536B\u751F\u9ED8\u8BA4\u5173\u95ED\uFF0C\u88C1\u526A\u524D\u7F00\u4FDD\u6301\u7A33\u5B9A\n- **JEV / ApplyEdit \u5B9E\u673A\u4FEE\u590D\uFF08#15\uFF09\u3002** \u505C\u6389 JEV \u7684 follow-up \u5FAA\u73AF\uFF0C\u5E76\u4FEE\u6389 ApplyEdit \u7684 bundle \u5D29\u6E83\n- **\u53EF\u9009\u6548\u7387\u5305\uFF08#16\uFF09\u3002** `CLAVUE_EFFICIENCY` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u6253\u5F00\u540E\u5305\u542B\u5E76\u884C JEV\n- **\u6BCF\u56DE\u5408\u5F00\u9500\uFF08#17\uFF09\u3002** \u957F\u4F1A\u8BDD\u7684\u6BCF\u56DE\u5408\u5DE5\u4F5C\u4E0D\u518D\u626B\u5B8C\u6574\u5386\u53F2\uFF1Bpager \u6BCF\u5E27\u53EA\u68C0\u67E5\u7A97\u53E3\u5185\u7684 journal \u6233\n- **\u65B0\u80FD\u529B\u5168\u90E8\u9ED8\u8BA4\u5173\u95ED\u3002** `CLAVUE_NATIVE_CLIENT`\u3001`CLAVUE_NATIVE_RS`\u3001`clavue-fa`\u3001JEV\u3001\u7EC4\u5408\u6210\u672C\u4E0E\u8F93\u51FA\u536B\u751F\u3001`CLAVUE_EFFICIENCY` \u90FD\u8981\u663E\u5F0F\u6253\u5F00\u624D\u751F\u6548\n\n## 13.3.3 - 2026-09-29\n\n- **Esc\xD72 \u56DE\u9000\u9009\u62E9\u6846\u56DE\u6765\u4E86\u3002** \u53CC\u51FB Esc \u7684\u56DE\u9000\u300C\u9009\u62E9\u6846\u300D\u6B64\u524D\u4F1A\u5BF9\u5DF2\u7ECF\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\n \u5224\u5B9A\u6210 0 \u4E2A\u6539\u52A8\uFF0C\u4E8E\u662F\u628A\u5B83\u5F53\u6210\u6253\u9519\u7684\u7A7A\u56DE\u5408\u76F4\u63A5\u64A4\u56DE\uFF0C\u9009\u62E9\u5217\u8868\u6839\u672C\u4E0D\u518D\u51FA\u73B0\u3002\n \u6839\u56E0\u662F\u56DE\u9000\u7528\u7684\u6539\u52A8\u8BA1\u6570\u662F\u81EA\u5DF1\u7EF4\u62A4\u7684\u4E00\u5957\u5C0F\u5199\u5B50\u4E32\u5339\u914D\uFF08`edit ` / `write `\uFF09\uFF0C\n \u8BA4\u4E0D\u51FA\u5F53\u524D\u5DE5\u5177\u810A\u67F1\u7684\u771F\u5B9E\u5F62\u6001 `Update(path)` / `Create(path)` / `Write(path)`\u3002\n \u73B0\u5728\u8BA1\u6570\u6539\u8D70\u552F\u4E00\u7684\u7F16\u8F91\u5224\u5B9A `journal_format::is_edit_tool_label`\uFF0C\n \u4E0E\u4EA4\u4ED8\u6C47\u603B\u5171\u7528\u540C\u4E00\u6743\u5A01\uFF1A\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\u7167\u5E38\u5F39\u51FA\u9009\u62E9\u6846\uFF0C\n \u771F\u6B63\u6CA1\u6539\u52A8\u7684\u56DE\u5408\u4ECD\u6309\u7A7A\u56DE\u5408\u5373\u65F6\u64A4\u56DE\n- **\u53EA\u4FEE\u5206\u7C7B\uFF0C\u4E0D\u6539\u4EA4\u4E92\u3002** \u9009\u62E9\u6846\u7684\u7ED8\u5236\u3001\u952E\u76D8/\u9F20\u6807\u547D\u4E2D\u3001ModeSelect \u5355\u9009\u5168\u90E8\u4FDD\u6301\u539F\u6837\uFF1B\n \u672C\u6B21\u4EC5\u8BA9\u300C\u54EA\u4E9B\u56DE\u5408\u7B97\u6539\u8FC7\u6587\u4EF6\u300D\u8FD9\u4E00\u5904\u5224\u5B9A\u6062\u590D\u6B63\u786E\n\n## 13.3.2 - 2026-09-29\n\n- **\u5347\u7EA7\u6210\u529F\u540E\u76F4\u63A5\u8FDB\u5165\u754C\u9762\uFF0C\u4E0D\u518D\u8981\u6C42\u5B8C\u5168\u9000\u51FA\u3002** Node duplex \u5BBF\u4E3B\u662F\u9876\u5C42\u8FDB\u7A0B\uFF0C\n \u542F\u52A8\u65F6\u53EA\u89E3\u6790\u4E00\u6B21 `agentEntry` / `pagerBin`\uFF1B\u540E\u53F0 `npm install -g` \u6362\u6389\u4E86\u78C1\u76D8\u4E0A\u7684\n \u65B0\u7248\u672C\uFF0C\u5185\u5B58\u91CC\u4ECD\u662F\u65E7\u4EE3\u7801\uFF0C\u4E8E\u662F\u53EA\u80FD\u9760\u7528\u6237\u624B\u52A8\u9000\u51FA\u91CD\u8FDB\u3002\u73B0\u5728\u5BBF\u4E3B\u5728\u5347\u7EA7\u6210\u529F\u540E\n \u539F\u5730\u91CD\u6267\u884C\u81EA\u5DF1\uFF1Apager \u5148\u6309\u6B63\u5E38\u8DEF\u5F84\u9000\u51FA\uFF08\u79BB\u5F00 raw mode\u3001\u6062\u590D\u5C4F\u5E55\uFF09\uFF0CCLI \u5165\u53E3\n \u5728 pager \u91CA\u653E TTY \u540E\u518D\u8D77\u65B0\u8FDB\u7A0B\u3002\u5B88\u536B `CLAVUE_SESSION_RELAUNCH=1` \u9632\u6B62\u91CD\u6267\u884C\u5FAA\u73AF\uFF0C\n `CLAVUE_DISABLE_SESSION_RELAUNCH=1` \u53EF\u5173\u95ED\uFF1B\u6D4B\u8BD5/\u5F00\u53D1\u8FD0\u884C\u65F6\u62D2\u7EDD\u91CD\u6267\u884C\n- **\u9996\u6B21\u914D\u7F6E\u88C5\u8F7D\u540E\u540C\u6837\u539F\u5730\u8FDB\u5165\u754C\u9762\u3002** `routeTrack`\uFF08\u627F\u8F7D `needsSetup` /\n `officialReady`\uFF09\u6B64\u524D\u53EA\u5728\u542F\u52A8\u65F6\u53D1\u9001\u4E00\u6B21\uFF0C\u4E8E\u662F\u5728\u7EBF\u8DEF / BYOK \u9762\u677F\u4FDD\u5B58\u540E\uFF0C\n pager \u7684\u9996\u6B21\u914D\u7F6E\u83DC\u5355\u4E00\u76F4\u9501\u7740\uFF0C\u5FC5\u987B\u9000\u51FA\u91CD\u8FDB\u624D\u6D88\u5931\u3002\u73B0\u5728\u9762\u677F\u4FDD\u5B58\u91CD\u542F agent \u65F6\n \u4E00\u5E76\u91CD\u53D1 `routeTrack`\uFF0C\u754C\u9762\u5F53\u6B21\u4F1A\u8BDD\u5373\u89E3\u9501\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.3 - 2026-09-29\n\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.2 - 2026-09-20\n\n- \u539F\u751F pager \u53D1\u5E03\u95E8\u7981\u53D6\u771F\uFF1Astaged \u4E8C\u8FDB\u5236\u5FC5\u987B\u5185\u5D4C\u5F53\u524D pager \u6E90\u7801\u6458\u8981\n \uFF08`--build-info` JSON \u5F62\u72B6\u7684 `sourceDigest` \u5B57\u6BB5\uFF0C\u951A\u5B9A `"sourceDigest":"<64 hex>"`\uFF09\uFF0C\n \u65E7\u6E90\u7801\u7F16\u8BD1\u51FA\u7684\u4E8C\u8FDB\u5236\u5373\u4F7F\u54C8\u5E0C\u81EA\u6D3D\u4E5F\u4F1A\u88AB\u62D2\u7EDD\uFF0C\u4E0D\u518D\u9760\u4EC5\u81EA\u6D3D\u7684 manifest \u54C8\u5E0C\u653E\u884C\n- manifest \u6EAF\u6E90\u6539\u4E3A\u6309\u5E8F\u89E3\u6790\u800C\u975E\u9759\u9ED8\u7701\u7565\uFF1A`CLAVUE_RELEASE_SOURCE_COMMIT` \u2192\n `GITHUB_SHA` \u2192 `git rev-parse HEAD`\uFF1B`releaseTag` \u672A\u8BBE\u65F6\u56DE\u843D\u4E3A `v${version}`\uFF0C\n \u672C\u5730\u53D1\u5E03\u6784\u5EFA\u4E0D\u518D\u4E22\u5931\u53D1\u5E03\u95E8\u7981\u6240\u9700\u5B57\u6BB5\n- \u8FD0\u884C\u65F6\u4E0E pager \u4EA7\u7269\u4E0D\u53D8\uFF1A`dist/native` \u4E8C\u8FDB\u5236\u6CBF\u7528 13.2.1\uFF0C\u4EC5 `manifest.json`\n \u6EAF\u6E90\u4E0E\u95E8\u7981\u63A5\u7EBF\u53D8\u66F4\n\n## 13.2.1 - 2026-09-20\n\n- \u65E5\u8BB0\u7EB5\u5411\u8282\u594F\u6539\u4E3A\u4E24\u7EA7\uFF1A\u6BB5\u843D\u8FB9\u754C\uFF08\u65B0\u7684\u7528\u6237\u56DE\u5408\u3001Recap \u524D\uFF09\u5728\u6807\u51C6\u9AD8\u5EA6\u547C\u5438\u4E24\u884C\uFF0C\n \u6BB5\u5185\u5206\u7EC4\u7684\u547C\u5438\u4FDD\u6301\u4E00\u884C\uFF1Bcompact \u4E0B\u6240\u6709\u95F4\u9699\u4ECD\u4E3A\u4E00\u884C\uFF0C\u5BC6\u5EA6\u4E0D\u6D6A\u8D39\u4EFB\u4F55\u4E00\u884C\u3002\n \u7EC8\u7AEF\u6CA1\u6709\u5B57\u4F53\u884C\u9AD8\uFF0C\u8282\u594F\u53EA\u80FD\u6765\u81EA\u95F4\u9699\u5206\u7EA7\u4E0E\u5185\u8FB9\u8DDD\uFF0C\u8FD9\u6761\u89C4\u5F8B\u73B0\u5DF2\u5199\u5165 J8 \u800C\u975E\u6BCF\u6B21\u91CD\u65B0\u53D1\u73B0\n- \u9996\u5C4F\u6539\u4E3A compose-first\uFF1A\u5DF2\u914D\u7F6E\u7EBF\u8DEF\u65F6\uFF0C\u8F93\u5165\u6846\u4E3A\u7A7A\u6309 Enter \u76F4\u63A5\u5F00\u65B0\u4F1A\u8BDD\uFF08\u9879\u76EE\u9009\u62E9\u4ECD\u751F\u6548\uFF09\uFF0C\n \u63D0\u793A\u6587\u6848\u6539\u4E3A\u300CEnter \u5F00\u5DE5\u300D\uFF1B\u9996\u6B21\u8FD0\u884C\u4FDD\u7559\u786E\u8BA4\u8BED\u4E49\u2014\u2014\u7EBF\u8DEF\u5FC5\u987B\u5148\u5B58\u5728\uFF0C\u4F1A\u8BDD\u624D\u53EF\u80FD\u5F00\u59CB\n- \u9996\u5C4F\u8BB0\u4F4F\u6700\u8FD1\u4E09\u4E2A\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u663E\u793A\u5728\u4FE1\u606F\u677F\u4E0B\u65B9\uFF0C\u6309 1-3 \u76F4\u63A5\u91CD\u5F00\u3002\u663E\u793A\u7684 cwd \u53D6\u81EA\u4F1A\u8BDD\u8BB0\u5F55\u91CC\n \u5199\u5165\u7684 cwd \u5B57\u6BB5\uFF0C\u7EDD\u4E0D\u7531\u76EE\u5F55 slug \u53CD\u89E3\uFF08slug \u6709\u635F\uFF1A\u8DEF\u5F84\u5206\u9694\u7B26\u4E0E\u8FDE\u5B57\u7B26\u4E0D\u53EF\u533A\u5206\uFF09\uFF1B\n \u4E34\u65F6\u76EE\u5F55\u3001\u5BB6\u76EE\u5F55\u4E0E\u8BB0\u5F55\u5B58\u653E\u76EE\u5F55\u672C\u8EAB\u90FD\u88AB\u6392\u9664\n- \u95E8\u7981\u53D6\u771F\uFF1A\u4E24\u4E2A pager/broker \u6D4B\u8BD5\u4E0D\u518D\u8BFB\u5F00\u53D1\u673A\u672C\u5730\u7684 review model \u8986\u5199\uFF0C\n \u4E2A\u4EBA\u8BBE\u7F6E\u91CC\u7684 pin \u4E0D\u80FD\u518D\u628A\u53D1\u5E03\u95E8\u7981\u5224\u7EA2\n- \u6E90\u7801\u7EA7\u5224\u65AD\u57FA\u5E95\uFF08\u4E0D\u968F\u672C\u5305\u53D1\u5E03\uFF09\uFF1Alaziness / intent / verify-green \u4E09\u6761\u65E2\u6709\u89C4\u5219\u5730\u677F\u4E4B\u4E0B\n \u5404\u6709\u4E00\u4E2A\u7C7B\u578B\u5316\u5224\u65AD\u5C42\uFF0C\u9ED8\u8BA4\u4F11\u7720\uFF08\u672A\u8BBE TYPESAFE_API_KEY \u5373\u5B8C\u5168\u4E0D\u52A8\uFF09\u3002\n \u5B83\u5728 8.16.1 \u7684\u4EA7\u7269\u91CC\u662F\u60F0\u6027\u7684\u2014\u2014\u8BE6\u89C1\u53D1\u5E03\u8BF4\u660E\u7684 Known \u4E00\u8282\n\n## 13.2.0 - 2026-09-19\n\n- `/release-notes` \u79BB\u7EBF\u53EF\u7528\uFF1A\u6784\u5EFA\u671F\u628A `CHANGELOG.md` \u6CE8\u5165 `MACRO.VERSION_CHANGELOG`\n \uFF08\u6B64\u524D\u6052\u4E3A\u7A7A\u4E32\uFF09\uFF0C\u7F13\u5B58\u672A\u547D\u4E2D\u65F6\u56DE\u843D\u5230\u5185\u7F6E\u526F\u672C\u800C\u975E `""`\uFF0C\u5168\u65B0\u5B89\u88C5\u9996\u6B21\u8FD0\u884C\u5373\u53EF\u770B\u5230\u771F\u5B9E\u6761\u76EE\n- `/release-notes` \u7684\u94FE\u63A5\u4E0E\u540E\u53F0 fetch \u6B64\u524D\u90FD\u6307\u5411 anthropics/claude-code\uFF0C\u6539\u4E3A\u6307\u5411 Clavue \u81EA\u8EAB\u4ED3\u5E93\uFF1B\n \u547D\u4EE4\u6539\u4E3A\u5148\u8BFB\u672C\u5730\u5185\u5BB9\u3001\u628A\u7F51\u7EDC\u5F53\u4F5C\u4E0B\u6B21\u5237\u65B0\u7684\u6765\u6E90\uFF0C\u4E0D\u518D\u4E3A I/O \u963B\u585E\u7B54\u6848\n- hop \u6B63\u6587\u6536\u655B\uFF1A\u8FDE\u7EED\u91CD\u590D\u884C\u6298\u53E0\u4E3A\u9996\u5C3E\u4E24\u884C\u5E76\u6CE8\u660E\u7701\u7565\u6761\u6570\uFF08\u8FDE\u7EED\u4E24\u884C\u5C5E\u6B63\u5E38\u4E66\u5199\uFF0C\u4E0D\u5904\u7406\uFF09\uFF0C\n \u8D85\u957F\u6B63\u6587\u6539\u4E3A\u4FDD\u7559\u9996\u5C3E\u800C\u975E\u53EA\u7559\u5934\u90E8\uFF0C\u5E76\u6CE8\u660E\u539F\u59CB\u957F\u5EA6\uFF0C\u907F\u514D\u622A\u65AD\u540E\u7684\u6B63\u6587\u88AB\u8BEF\u8BFB\u4E3A\u672C\u6765\u5C31\u8FD9\u4E48\u77ED\n- Tips \u8FDC\u7A0B feed\uFF1A\u6587\u6848\u53EF\u5728\u4E0D\u53D1\u7248\u7684\u60C5\u51B5\u4E0B\u66F4\u6B63\u3002feed \u5C5E\u4E0D\u53EF\u4FE1\u8F93\u5165\uFF0C\u6309\u767D\u540D\u5355\u6821\u9A8C\u2014\u2014\n \u5FC5\u987B\u58F0\u660E\u672C\u4EA7\u54C1\u3001URL \u5FC5\u987B\u4E3A https\u3001\u5B57\u7B26\u4E32\u957F\u5EA6\u8BBE\u4E0A\u9650\uFF1B\u5355\u6761\u7578\u5F62\u6761\u76EE\u53EA\u4E22\u5F03\u81EA\u8EAB\uFF0C\u4E0D\u5F71\u54CD\u5176\u4F59\u6761\u76EE\u3002\n \u6761\u76EE\u590D\u7528\u65E2\u6709\u51B7\u5374\u673A\u5236\u5E76\u4F7F\u7528\u547D\u540D\u7A7A\u95F4 id\uFF0C\u4E0E\u5185\u7F6E\u63D0\u793A\u4E92\u4E0D\u5E72\u6270\uFF1B\u5931\u8D25\u5168\u7A0B\u9759\u9ED8\uFF0C\u7F51\u7EDC\u95EE\u9898\u4E0D\u4F1A\u53D8\u6210\u62A5\u9519\u6216\u62D6\u6162\u56DE\u5408\n- Tips \u63D0\u793A\u6B64\u524D\u4E0D\u53EF\u8FBE\u800C\u975E\u8FC7\u671F\uFF1A`getRelevantTips` \u7684\u552F\u4E00\u8C03\u7528\u65B9\u4E22\u5F03\u4E86\u7ED3\u679C\uFF0C`getTipToShowOnSpinner`\n \u65E0\u4EFB\u4F55\u8C03\u7528\u65B9\uFF0C`contextTipsActive` \u6052\u4E3A `false` \u4E14\u4ECE\u672A\u8D4B\u503C\u3002\u6539\u4E3A\u5728\u6E32\u67D3\u63D0\u793A\u7684 Spinner \u5185\u90E8\u9009\u53D6\u63D0\u793A\n\n## 13.1.5 - 2026-09-14\n\n- \u4FA7\u67E5\u8BE2\uFF08plan/review hop\u3001\u5206\u7C7B\u5668\u3001\u8BB0\u5FC6\u68C0\u7D22\u3001\u8BC1\u636E\u6536\u636E\uFF09\u6539\u4E3A\u6D41\u5F0F\uFF1A\u4E0D\u518D\u53D1 `stream:false` \u7684\n `/v1/chat/completions`\uFF0C\u907F\u514D\u6DF1\u5EA6\u63A8\u7406\u6A21\u578B\u5728\u7F51\u5173 600 \u79D2\u4EE3\u7406\u5899\u4E0A\u88AB\u6390\u65AD\n- \u4FA7\u67E5\u8BE2\u7684 `effort` \u771F\u6B63\u843D\u5230 `output_config.effort`\uFF1A\u6B64\u524D\u8BE5\u5B57\u6BB5\u672A\u5728\u9009\u9879\u7C7B\u578B\u4E0A\u58F0\u660E\uFF0C\n \u8C03\u7528\u65B9\u5C55\u5F00\u4F20\u503C\u4E0D\u4F1A\u89E6\u53D1\u7C7B\u578B\u68C0\u67E5\uFF0C\u503C\u88AB\u9759\u9ED8\u4E22\u5F03\uFF0C\u7F51\u5173\u9000\u56DE\u81EA\u8EAB\u9ED8\u8BA4\u6863\n- \u8BCA\u65AD\u7C7B Bash/PowerShell \u65E5\u5FD7\u8D70 light \u69FD\u8BC1\u636E\u6536\u636E\uFF1A\u5F15\u7528\u5FC5\u987B\u5728\u539F\u6587\u9010\u5B57\u8282\u547D\u4E2D\uFF0C\u5426\u5219\u4FDD\u7559\u539F\u65E5\u5FD7\uFF1B\n `CLAVUE_EVIDENCE_REDUCER=0` \u5173\u95ED\n- \u5927 Read/Grep/Glob \u9996\u6B21\u4ECD\u7ED9\u5168\u6587\uFF0C\u4E4B\u540E\u51BB\u6210 `clavue_observation_v1` \u5360\u4F4D\uFF0C\u7528 ObsRecall \u5206\u9875\u53EC\u56DE\uFF1B\n `CLAVUE_OBS_PACK=0` \u5173\u95ED\n- \u56DE\u5408\u6309 trivial/research/implement/heavy \u8C03\u5EA6 hop\uFF1B\u4E3B\u69FD model/effort \u7C98\u4F4F\u4EE5\u4FDD\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\n \u4EC5 compact \u540E\u4E14\u540C\u7C7B\u8FDE\u7EED\u4E24\u8F6E\u624D\u8003\u8651\u6539 effort\n- Plan hop \u7684 DSML \u7B49\u672A\u89E3\u6790\u5DE5\u5177\u65B9\u8A00\u4ECE Thought \u5C55\u793A\u4E0E plan/review \u4E0A\u4E0B\u6587\u4E00\u5E76\u5265\u79BB\uFF0C\u6574\u5757\u5220\u9664\uFF0C\n \u4E0D\u5199\u5165 transcript \u4E5F\u4E0D\u704C\u8FDB\u4E3B\u6A21\u578B\n- \u4ECE\u771F\u5B9E prompt-too-long \u62D2\u7EDD\u4E2D\u5B66\u4E60\u6BCF\u4E2A\u6A21\u578B\u7684\u5B9E\u9645\u8F93\u5165\u4E0A\u9650\uFF0C\u53EA\u6536\u7D27\u4E0D\u653E\u5927\u7A97\u53E3\uFF1B\u7F51\u5173\u53EA\u62A5\n `prompt_tokens` / `completion_tokens` \u65F6\u7528\u91CF\u4E0D\u518D\u5168\u6620\u5C04\u6210 0\n- Edit \u53EF\u9009 `then_run`\uFF1A\u4EC5\u5141\u8BB8\u5355\u6761\u8BCA\u65AD\u547D\u4EE4\uFF0C\u8D70 Bash \u6743\u9650\u5361\u4E0E sandbox\uFF0C\u7981\u6B62 `;&|` \u5939\u5E26\n- T0 Fast \u4FDD\u6301 primary-only\uFF1A\u8DEF\u5F84\u5C42\u5224\u5B9A\u524D\u7F6E\u5230 hop \u8C03\u5EA6\uFF0C\u6700\u7B80\u56DE\u5408\u4E0D\u518D\u4E3A\u8BC1\u636E\u6536\u636E\u4ED8\u4E00\u6B21 light \u5F80\u8FD4\n';if(!bundled)return null;let parsed=getAllReleaseNotes(bundled);return parsed.length===0?null:parsed[parsed.length-1]?.[1]??null}async function checkForReleaseNotes(lastSeenVersion,currentVersion="2.1.88"){let bundled=getBundledReleaseNotes();if(bundled)return{hasReleaseNotes:!0,releaseNotes:bundled};if(process.env.USER_TYPE==="ant")return{hasReleaseNotes:!1,releaseNotes:[]};let cachedChangelog=await getStoredChangelog();(lastSeenVersion!==currentVersion||!cachedChangelog)&&fetchAndStoreChangelog().catch(error40=>logError2(toError(error40)));let releaseNotes2=getRecentReleaseNotes(currentVersion,lastSeenVersion,cachedChangelog);return{hasReleaseNotes:releaseNotes2.length>0,releaseNotes:releaseNotes2}}function checkForReleaseNotesSync(lastSeenVersion,currentVersion="2.1.88"){let bundled=getBundledReleaseNotes();if(bundled)return{hasReleaseNotes:!0,releaseNotes:bundled};if(process.env.USER_TYPE==="ant")return{hasReleaseNotes:!1,releaseNotes:[]};let releaseNotes2=getRecentReleaseNotes(currentVersion,lastSeenVersion);return{hasReleaseNotes:releaseNotes2.length>0,releaseNotes:releaseNotes2}}var import_semver7,MAX_RELEASE_NOTES_SHOWN,CHANGELOG_URL,RAW_CHANGELOG_URL,changelogMemoryCache,init_releaseNotes=__esm({"src/utils/releaseNotes.ts"(){init_axios2();import_semver7=__toESM(require_semver2());init_state();init_config12();init_envUtils();init_errors2();init_log3();init_privacyLevel();init_semver();MAX_RELEASE_NOTES_SHOWN=5,CHANGELOG_URL="https://github.com/mycode699/clavue/blob/main/CHANGELOG.md",RAW_CHANGELOG_URL="https://raw.githubusercontent.com/mycode699/clavue/refs/heads/main/CHANGELOG.md";__name(getChangelogCachePath,"getChangelogCachePath");changelogMemoryCache=null;__name(migrateChangelogFromConfig,"migrateChangelogFromConfig");__name(fetchAndStoreChangelog,"fetchAndStoreChangelog");__name(getStoredChangelog,"getStoredChangelog");__name(getStoredChangelogFromMemory,"getStoredChangelogFromMemory");__name(parseChangelog,"parseChangelog");__name(getRecentReleaseNotes,"getRecentReleaseNotes");__name(getAllReleaseNotes,"getAllReleaseNotes");__name(getBundledReleaseNotes,"getBundledReleaseNotes");__name(checkForReleaseNotes,"checkForReleaseNotes");__name(checkForReleaseNotesSync,"checkForReleaseNotesSync")}});var release_notes_exports={};__export(release_notes_exports,{call:()=>call40});function formatReleaseNotes(notes){return notes.map(([version3,notes2])=>{let header=`Version ${version3}:`,bulletPoints=notes2.map(note=>`\xB7 ${note}`).join(`
7675
+ `}]}})}});import{mkdir as mkdir57,readFile as readFile62,writeFile as writeFile63}from"fs/promises";import{dirname as dirname75,join as join182}from"path";function getChangelogCachePath(){return join182(getClaudeConfigHomeDir(),"cache","changelog.md")}async function migrateChangelogFromConfig(){let config3=getGlobalConfig();if(!config3.cachedChangelog)return;let cachePath2=getChangelogCachePath();try{await mkdir57(dirname75(cachePath2),{recursive:!0}),await writeFile63(cachePath2,config3.cachedChangelog,{encoding:"utf-8",flag:"wx"})}catch{}saveGlobalConfig(({cachedChangelog:_2,...rest2})=>rest2)}async function fetchAndStoreChangelog(){if(getIsNonInteractiveSession()||isEssentialTrafficOnly())return;let response=await axios_default.get(RAW_CHANGELOG_URL);if(response.status===200){let changelogContent=response.data;if(changelogContent===changelogMemoryCache)return;let cachePath2=getChangelogCachePath();await mkdir57(dirname75(cachePath2),{recursive:!0}),await writeFile63(cachePath2,changelogContent,{encoding:"utf-8"}),changelogMemoryCache=changelogContent;let changelogLastFetched=Date.now();saveGlobalConfig(current=>({...current,changelogLastFetched}))}}async function getStoredChangelog(){if(changelogMemoryCache!==null)return changelogMemoryCache;let cachePath2=getChangelogCachePath();try{let content=await readFile62(cachePath2,"utf-8");return changelogMemoryCache=content,content}catch{return changelogMemoryCache='# Changelog\n\nClavue \u53D1\u5E03\u8BF4\u660E\u3002\u672C\u6587\u4EF6\u5728\u6784\u5EFA\u65F6\u6CE8\u5165\u8FD0\u884C\u65F6\uFF0C\u9A71\u52A8 `/release-notes` \u4E0E\u542F\u52A8\u753B\u9762\u7684\u300C\u65B0\u7279\u6027\u300D\u680F\u3002\n\n\u683C\u5F0F\u7EA6\u5B9A\uFF08\u89E3\u6790\u5668\u4F9D\u8D56\uFF09\uFF1A\u4E8C\u7EA7\u6807\u9898\u4E3A `## <\u7248\u672C> - <\u65E5\u671F>`\uFF0C\u6761\u76EE\u4EE5 `- ` \u5F00\u5934\uFF0C\u4E00\u884C\u4E00\u6761\uFF0C\n\u547D\u4EE4\u3001\u53C2\u6570\u4E0E\u6A21\u578B\u540D\u4FDD\u7559\u82F1\u6587\u3002\n\n## 13.9.2 - 2026-10-23\n\n- **\u8FDE\u7EED\u601D\u8003\u6298\u6210\u4E00\u884C\u3002** \u7ED8\u5236\u65F6\u5408\u5E76\u76F8\u90BB Thinking \u810A\uFF1B\u4E0D\u8DB3 50ms \u4E0D\u518D\u663E\u793A `0.0s`\uFF1B\u540C id \u65F6\u957F\u7ECF\u6458\u8981\u7BA1\u9053\u7D2F\u52A0\n- **\u601D\u8003\u5C3E\u5DF4\u589E\u91CF\u91CD\u7ED8\u3002** \u810F\u5C3E\u5DF4\u53EA\u91CD\u753B\u7C98\u5728\u4E00\u8D77\u7684 Tool / Thinking / Verify \u540E\u7F00\uFF0C\u4E0D\u518D\u6574\u672C\u65E5\u8BB0\u91CD\u6392\n- **\u6D41\u5F0F\u601D\u8003\u5171\u7528\u4E00\u4E2A id\u3002** \u540C\u4E00\u6761\u52A9\u624B\u6D88\u606F\u53EA\u4FDD\u7559\u4E00\u4E2A thinking id\uFF0C\u907F\u514D\u6BCF\u7247\u6BB5\u5168\u91CF rebuild\n- **\u957F\u8DEF\u5F84\u6309\u659C\u6760\u6298\u884C\u3002** URL \u4E0E\u7EDD\u5BF9\u8DEF\u5F84\u5728 `/` \u6216 `\\` \u540E\u65AD\u884C\uFF0C\u51CF\u5C11\u8BCD\u4E2D\u622A\u65AD\n- **\u52A9\u624B\u8868\u683C\u4E0A\u4E0B\u7559\u767D\u3002** \u56F4\u680F\u5916\u3001`\u250C` \u524D\u4E0E `\u2514` \u540E\u5404\u7559\u4E00\u884C\uFF0C\u51CF\u8F7B\u62E5\u6324\n- **hello.version \u8986\u76D6\u9876\u680F\u7248\u672C\u3002** \u975E\u7A7A hello \u7248\u672C\u8986\u76D6\u7F16\u8BD1\u671F chrome \u7248\u672C\uFF1Bdoctrine map \u4EE5 `package.json` \u4E3A\u73B0\u884C npm pin\n\n## 13.9.1 - 2026-10-23\n\n- **\u951A\u5B9A\u4F1A\u8BDD cwd \u5199\u6587\u4EF6\u3002** \u65E0\u663E\u5F0F\u8DEF\u5F84\u65F6 Edit/Write \u4E0D\u5F97\u843D\u5230\u5144\u5F1F\u6C99\u7BB1\uFF1B\u7EDD\u5BF9\u8DEF\u5F84\u9003\u51FA session cwd \u4F1A\u88AB\u62D2\u7EDD\n- **print \u6210\u529F\u5373\u9000\u51FA 0\u3002** `subtype=success` \u65F6\u8FDB\u7A0B\u9000\u51FA\u7801\u6052\u4E3A 0\uFF0C\u4E0D\u518D\u51FA\u73B0 success \u5374 exit 1\uFF08bench C1\uFF09\n- **print \u7ED3\u679C\u8865\u9F50 timing\u3002** `result.timing` \u53EF\u5BF9\u6807 v1\uFF08wallMs / modelMs / toolCalls \u7B49\uFF09\n\n## 13.9.0 - 2026-10-23\n\n- **\u754C\u9762\u5168\u9762\u5BF9\u6807 Grok Build\u3002** \u9876\u680F/\u5E95\u680F/\u72B6\u6001\u884C\uFF08chrome\uFF09\u3001\u4E3B\u9898\u8272\u4E0E\u5B57\u5F62\u3001\u9996\u9875\u4E00\u5C4F\u53EF\u8F93\u5165\u4E14\u70ED\u952E\u4E0D\u541E\u9996\u5B57\u3001\u952E\u4F4D\u5BFC\u822A\u4E0E\u5FEB\u6377\u952E\u9762\u677F\u3001\u4E00\u8F6E\u6C47\u603B \u25C8 / \u9010\u6761 \u25C6 / \u4E09\u5C42\u5C55\u5F00\u3001\u5185\u8054\u6743\u9650\u5361\u3001\u5B50\u4EE3\u7406\u884C\u4E0E dock\u3001\u65E5\u8BB0\u964D\u566A\u4E0E\u5931\u8D25\u6761\uFF0C\u516B\u7EC4 GUI \u4E00\u5E76\u5408\u5165\n- **\u534F\u8BAE\u767B\u8BB0\u91CD\u5EFA\u3002** \u5408\u5E76\u540E\u7EDF\u4E00\u91CD\u5EFA UI \u534F\u8BAE registry\uFF0C\u4FDD\u7559\u5168\u90E8\u4E8B\u4EF6\u767B\u8BB0\uFF0C\u4E0D\u4E22\u7AEF\u53E3\n\n## 13.8.0 - 2026-10-22\n\n- **\u51FA\u9519\u65F6\u8BF4\u6E05\u695A\u3001\u5C11\u7A7A\u8F6C\u3002** \u9519\u8BEF\u7EDF\u4E00\u5206\u6210\u53EF\u91CD\u8BD5\u3001\u53EF\u6062\u590D\u3001\u5FC5\u987B\u505C\u6B62\u4E09\u7C7B\uFF1B401/402/\u78C1\u76D8\u6EE1\u76F4\u63A5\u505C\u5E76\u7ED9\u4E00\u884C\u539F\u56E0\uFF0C\u65AD\u7F51\u3001\u8D85\u65F6\u3001429\u30015xx \u624D\u91CD\u8BD5\n- **\u574F\u5DE5\u5177\u8C03\u7528\u81EA\u52A8\u4FEE\u3002** \u65E0\u540D\u6216\u53C2\u6570\u574F\u6389\u7684\u5DE5\u5177\u8C03\u7528\u6309\u300C\u4E22\u5F03\u91CD\u8BD5 \u2192 \u63D0\u9192\u5DE5\u5177\u540D \u2192 \u6309\u53C2\u6570\u63A8\u65AD \u2192 \u6362\u6A21\u578B\u300D\u4FEE\u590D\uFF0C\u72B6\u6001\u884C\u663E\u793A\u300C\u6B63\u5728\u91CD\u8BD5 (n/4)\u300D\uFF0C\u4FEE\u4E0D\u597D\u53EA\u7559\u4E00\u884C\u9519\u8BEF\n- **\u56DE\u590D\u88AB\u622A\u65AD\u80FD\u63A5\u4E0A\u3002** \u6D41\u4E2D\u65AD\u540E\u4ECE\u65AD\u70B9\u7EED\u5199\uFF0C\u9996\u5B57\u7B49\u5F85\u6309\u7F51\u5173\u8868\u73B0\u81EA\u9002\u5E94\uFF1B\u5207\u5230\u5907\u7528\u6A21\u578B\u65F6\u5DE5\u5177\u5217\u8868\u4FDD\u6301\u4E0D\u53D8\uFF0C\u63D0\u793A\u7F13\u5B58\u4E0D\u5931\u6548\n- **\u81EA\u52A8\u7EED\u63A5\u53EA\u6709\u4E00\u4E2A\u51FA\u53E3\u3002** \u5404\u7C7B\u7EED\u63A5\u8D70\u540C\u4E00\u51FA\u53E3\uFF0C\u6709\u8FDB\u5C55\u4E0D\u8BA1\u6570\uFF0C\u8FDE\u7EED\u65E0\u8FDB\u5C55 8 \u6B21\u6216\u6BCF\u56DE\u5408 40 \u6B21\u540E\u505C\u4E0B\u5E76\u8BF4\u660E\uFF1B\u6309\u8BC1\u636E\u5224\u65AD\u662F\u5426\u5361\u4F4F\uFF0C\u4E0D\u518D\u51ED\u5B57\u6570\n- **\u5B50\u4EE3\u7406\u6709\u8D26\u672C\u3002** \u6309\u5B50\u4EE3\u7406\u8BB0\u5F55\u5DE5\u5177\u6B21\u6570\u3001token \u548C\u91CD\u590D\u8BFB\u53D6\uFF1B\u652F\u6301\u65F6\u95F4\u9884\u7B97\u4E0E\u6536\u5C3E\u603B\u7ED3\u56DE\u5408\uFF0C\u53EA\u8BFB\u4EFB\u52A1\u4E0D\u518D\u88AB\u8981\u6C42\u6539\u6587\u4EF6\uFF1B`/parallel` \u6709\u5E76\u53D1\u4E0A\u9650\n- **\u66F4\u5B89\u5168\u3002** \u62E6\u622A\u8BEF\u6740\u81EA\u8EAB\u6216\u65E0\u5173\u8FDB\u7A0B\u7684 kill\uFF1B\u65B0\u589E AIza\u3001AKIA/ASIA\u3001glpat-\u3001hf_\u3001npm_\u3001xai- \u7B49\u683C\u5F0F\u53CA\u300C\u4E3B\u673A \u7528\u6237 \u5BC6\u7801\u300D\u4E09\u6BB5\u5F0F\u6253\u7801\uFF1B\u6539\u52A8 `~/.ssh`\u3001`~/.aws` \u7B49\u51ED\u636E\u8DEF\u5F84\u524D\u5148\u786E\u8BA4\n- **\u8BF7\u6C42\u4F53 gzip\u3002** \u7F51\u5173\u652F\u6301\u65F6\u8BF7\u6C42\u81EA\u52A8\u538B\u7F29\uFF0C\u9047\u5230 400/415 \u56DE\u9000\u5E76\u8BB0\u4F4F\u4E00\u5C0F\u65F6\uFF1B\u82E5\u5E72\u754C\u9762\u7EC6\u8282\u4FEE\u6574\n\n## 13.7.0 - 2026-10-21\n\n- **\u65E5\u8BB0\u91CD\u505A\uFF0C\u8F93\u51FA\u66F4\u5E72\u51C0\u3002** \u6BCF\u8F6E\u53EA\u51FA\u4E8B\u4EF6\uFF08\u5F00\u59CB\u3001\u5DE5\u5177\u5F00\u59CB\u4E0E\u7ED3\u675F\u3001\u6700\u7EC8\u56DE\u7B54\u3001\u7ED3\u675F\u539F\u56E0\uFF09\uFF0C\u65E5\u8BB0\u6587\u5B57\u7EDF\u4E00\u7531 pager \u751F\u6210\uFF1B\u7ED3\u5C3E\u4E00\u8F6E\u4E00\u884C\u3001\u5C5E\u4E8E\u672C\u8F6E\uFF0C\u5931\u8D25\u6216\u4E2D\u65AD\u65F6\u4E0D\u518D\u5199\u300C\u5B8C\u6210\u300D\uFF0C\u6D3B\u52A8\u6761\u4E0D\u518D\u6F0F\u51FA\u5185\u90E8\u7F16\u7801\n- **\u540E\u53F0\u4EFB\u52A1\u4E0D\u518D\u5237\u5C4F\u3002** \u76F8\u90BB\u7684\u540E\u53F0\u4EFB\u52A1\u901A\u77E5\u5408\u5E76\u6210\u4E00\u8F6E\u5904\u7406\uFF08\u5408\u5E76\u7A97\u53E3\u9ED8\u8BA4 1500ms\uFF09\uFF0C\u81EA\u52A8\u8DDF\u8FDB\u56DE\u5408\u5931\u8D25\u65F6\u53EA\u7559\u4E00\u6761\u53EF\u539F\u5730\u66F4\u65B0\u7684\u63D0\u793A\uFF0C\u4E0D\u518D\u753B\u6574\u5757\u5931\u8D25\u5361\n- **\u56DE\u5408\u6536\u5C3E\u5224\u5F97\u66F4\u51C6\u3002** \u4EE5\u300C\u6211\u4F1A\u2026\u300D\u300C\u63A5\u4E0B\u6765\u2026\u300D\u8FD9\u7C7B\u627F\u8BFA\u53E5\u7ED3\u5C3E\u7B97\u672A\u5B8C\u6210\uFF1B\u7B49\u5F85\u540E\u53F0\u4EFB\u52A1\u4E0D\u5224\u5931\u8D25\uFF1B\u76EE\u6807\u4E0D\u4F1A\u88AB\u77ED\u56DE\u590D\u6216\u4EFB\u52A1\u901A\u77E5\u5360\u4F4F\n- **\u7F51\u5173\u66F4\u7A33\u3002** \u91CD\u8BD5\u7EDF\u4E00\u8BA1\u5165\u4E00\u4E2A\u9884\u7B97\uFF0C\u4E0D\u518D\u51FA\u73B0\u91CD\u8BD5\u4E8C\u5341\u591A\u6B21\uFF1B\u91CD\u590D\u7684\u6D41\u4E8B\u4EF6\u53BB\u91CD\uFF1B\u5207\u5907\u7528\u65F6\u8DF3\u8FC7\u88C5\u4E0D\u4E0B\u5F53\u524D\u4E0A\u4E0B\u6587\u7684\u6A21\u578B\uFF1B\u517C\u5BB9 text/plain \u56DE\u590D\uFF1B\u7A7A text block \u4E0D\u518D\u5BFC\u81F4 400\uFF1B\u5B50\u4EE3\u7406\u88AB\u622A\u65AD\u540E\u4F1A\u7EED\u5199\n- **\u5907\u7528\u6A21\u578B\u63D0\u793A\u53EA\u51FA\u4E00\u6B21\u3002** \u6BCF\u4F1A\u8BDD\u6BCF\u5BF9\u6A21\u578B\u53EA\u63D0\u793A\u4E00\u6B21\u300C\u5DF2\u5207\u5230\u5907\u7528\u6A21\u578B B\uFF08A \u4E0D\u53EF\u7528\uFF09\u300D\uFF1B\u5E95\u680F\u7A84\u5C4F\u65F6\u5148\u7701\u6389 @effort \u7B49\u6807\u7B7E\uFF0C\u4FDD\u4F4F\u5B8C\u6574\u6A21\u578B\u540D\n- **\u5DE5\u5177\u66F4\u5BBD\u5BB9\u4E5F\u66F4\u5B89\u5168\u3002** Write / Grep \u63A5\u53D7\u5E38\u89C1\u53C2\u6570\u522B\u540D\u3001\u4E22\u6389\u591A\u4F59\u5B57\u6BB5\uFF1B\u5DF2\u6709\u6587\u4EF6\u662F GBK\u3001Shift-JIS \u7B49\u975E UTF-8 \u7F16\u7801\u65F6\u62D2\u7EDD\u5199\u5165\u5E76\u8BF4\u660E\u7F16\u7801\uFF0C\u4E0D\u6539\u539F\u5B57\u8282\n- **\u5361\u6B7B\u4E0E\u8FDB\u7A0B\u6536\u5F97\u5E72\u51C0\u3002** \u5361\u6B7B\u515C\u5E95\u5B88\u62A4\uFF1BBash \u6309\u8FDB\u7A0B\u7EC4\u767B\u8BB0\u5E76\u6574\u7EC4\u6E05\u7406\uFF1B\u9000\u51FA\u65F6\u540E\u53F0\u547D\u4EE4 1.5s \u5185\u5F3A\u6740\u4E14 SessionEnd \u5FC5\u8DD1\uFF1B\u53EA\u6740\u542F\u52A8\u5668\u65F6\u5B50\u8FDB\u7A0B\u4E0D\u518D\u6210\u5B64\u513F\n- **\u957F\u4F1A\u8BDD\u66F4\u7701\u3002** \u6BCF\u6B21\u66F4\u65B0\u4E0D\u518D\u91CD\u626B\u5168\u5BF9\u8BDD\uFF1B\u5DE5\u5177\u8F93\u51FA\u8D85\u8FC7 2000 \u884C\u843D\u76D8\u53EA\u7559\u6458\u8981\uFF1B\u65B0\u589E\u7ED3\u679C\u6865 `result.json`\n- **\u6743\u9650\u52A0\u56FA\u3002** \u85CF\u5728\u5B50\u547D\u4EE4\u3001\u5F15\u53F7\u6216\u53D8\u91CF\u91CC\u7684\u5371\u9669 `rm` \u4E5F\u4F1A\u62E6\uFF1B\u4FEE\u8865\u4E00\u6279 Bash \u5206\u6790\u7ED5\u8FC7\uFF1B\u6309 symlink \u7684\u771F\u5B9E\u843D\u70B9\u5224\u6743\u9650\uFF1Bplan \u6A21\u5F0F\u4E0B Bash \u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF1BMCP \u62A5\u9519\u91CC\u7684\u5BC6\u94A5\u5148\u6253\u7801\uFF1B\u65B0\u589E `--restricted` \u53EA\u8BFB\u6A21\u5F0F\n- **\u4EE5\u300C\u7406\u89E3\uFF1A\u300D\u5F00\u5934\u7684\u6700\u7EC8\u7B54\u6848\u4E0D\u518D\u88AB\u541E\u3002** \u91CD\u8BD5\u540E\u7B54\u6848\u4E0D\u4F1A\u6D88\u5931\uFF1B`/model` \u56DE\u6267\u53EA\u663E\u793A\u4E00\u6B21\u5E76\u5237\u65B0\u5E95\u680F\n\n## 13.6.0 - 2026-10-19\n\n- **\u5907\u7528\u94FE\u66F4\u53EF\u9760\u3002** \u9996\u5305\u8D85\u65F6\u6216\u5907\u7528\u6A21\u578B\u8FD4\u56DE 404 / 5xx \u65F6\uFF0C\u6CBF `CLAVUE_COMBO_FALLBACK`\uFF08\u9017\u53F7\u5206\u9694\uFF09\u5207\u5230\u4E0B\u4E00\u4E2A\u6A21\u578B\uFF0C\u8DF3\u8FC7\u540C\u5BB6\u65CF\u522B\u540D\uFF08`cn:deepseek-v4.1-flash` \u4E0D\u4F1A\u518D\u5207\u56DE `deepseek-v4-flash`\uFF09\u3002\u521A\u5931\u6548\u7684\u6A21\u578B 10 \u5206\u949F\u5185\u4E0D\u518D\u9009\uFF08`CLAVUE_MODEL_HEALTH_TTL_MS`\uFF09\uFF1B\u6574\u6761\u94FE\u90FD\u5931\u6548\u65F6\u56DE\u5230\u5B8C\u6574\u94FE\u3002\u4E3B\u6A21\u578B\u4E0A\u7684 502/503 \u4ECD\u6309\u539F\u6765\u7684\u4E24\u6B21\u9608\u503C\n- **\u5B58\u6863\u524D\u5BC6\u94A5\u6253\u7801\u3002** \u4F1A\u8BDD jsonl \u548C `history.jsonl` \u5199\u76D8\u524D\u906E\u6389 `sshpass -p`\u3001`SSHPASS=`\u3001`mysql -p` / `--password`\u3001`PGPASSWORD`\u3001`MYSQL_PWD`\u3001`curl -u`\u3001\u5E26\u8D26\u53F7\u5BC6\u7801\u7684 URL\u3001`Authorization: Bearer`\u3001`sk-` / `ghp_` \u5BC6\u94A5\u3001`password=`\u3001`*_PASS=` / `*_PWD=`\u3002\u6267\u884C\u4ECD\u7528\u539F\u547D\u4EE4\uFF1B`PWD=` / `$PWD` \u4E0D\u53D7\u5F71\u54CD\n- **\u663E\u5F0F\u8BE2\u95EE\u89C4\u5219\u4F18\u5148\u3002** `Bash(rm:*)` \u8FD9\u7C7B ask \u89C4\u5219\u547D\u4E2D\u590D\u5408\u547D\u4EE4\u91CC\u7684\u5B50\u547D\u4EE4\uFF08`rm \u2026 && ls`\uFF09\u65F6\uFF0C\u4E0D\u518D\u88AB\u5168\u5C40 `Bash` \u5141\u8BB8\u8986\u76D6\uFF1B\u9ED8\u8BA4\u6A21\u5F0F\u548C\u6C99\u7BB1\u6A21\u5F0F\u90FD\u751F\u6548\uFF0C`bypassPermissions` \u4ECD\u8C41\u514D\n- **\u5B50\u4EE3\u7406\u88AB\u62E6\u65F6\u8BF4\u6E05\u539F\u56E0\u3002** \u8D85\u8FC7 `CLAVUE_AGENT_MAX_DEPTH` \u65F6\u8FD4\u56DE\u7ED3\u6784\u5316\u7684 `<spawn_blocked>` \u8BF4\u660E\uFF0C\u63D0\u793A\u540C\u4E00\u8C03\u7528\u4F1A\u518D\u6B21\u88AB\u62E6\u3001\u8BF7\u5728\u5F53\u524D\u4F1A\u8BDD\u5B8C\u6210\u3002\u6DF1\u5EA6\u6309\u771F\u5B9E\u5D4C\u5957\u5C42\u6570\u8BA1\u7B97\n- **\u5DE5\u5177\u53C2\u6570\u5F62\u72B6\u4E0D\u5BF9\u4E0D\u518D\u5D29\u6E83\u3002** \u6A21\u578B\u628A `path` \u5199\u6210\u6570\u7EC4\u3001\u5BF9\u8C61\u6216\u6F0F\u5199\u65F6\uFF0C\u6D88\u606F\u6298\u53E0\u548C\u8BB0\u5FC6\u8DEF\u5F84\u5224\u65AD\u9000\u56DE\u539F\u59CB\u884C\u663E\u793A\uFF0C\u4E0D\u518D\u62A5 `The "path" argument must be of type string`\n- **\u8FDB\u51FA worktree \u771F\u6B63\u6E05\u6389 plans \u76EE\u5F55\u7F13\u5B58\u3002** \u4EE5\u524D\u7F13\u5B58\u6CA1\u88AB\u6E05\u6389\uFF0Cplans \u76EE\u5F55\u4E00\u76F4\u6307\u5411\u8FDB\u5165 worktree \u524D\u7684\u76EE\u5F55\uFF0C\u73B0\u5728\u4F1A\u8DDF\u7740\u5207\u6362\n\n## 13.5.0 - 2026-10-16\n\n- **\u56DB\u6863\u8DEF\u7531\u3002** \u89C4\u5219\u628A\u56DE\u5408\u5206\u6210 \u7B80\u5355 / \u4E00\u822C / \u590D\u6742 / \u957F\u7A0B\u3002\u62FF\u4E0D\u51C6\u65F6\u8BA1\u5212\u69FD\u6700\u591A\u60F3 1 \u79D2\uFF0C\u8D85\u65F6\u7B97\u4E00\u822C\u3002`/goal` \u662F\u957F\u7A0B\u3002`/mode` \u56FA\u5B9A\u6863\u4F4D\u3002`CLAVUE_TIERS=0` \u5173\u95ED\u3002\u6539\u8FC7\u7684\u6587\u4EF6\u8D85\u8FC7 5 \u4E2A\u5347\u5230\u81F3\u5C11\u590D\u6742\uFF0C\u8D85\u8FC7 15 \u4E2A\u5347\u5230\u957F\u7A0B\uFF1B\u7B80\u5355\u6863\u91CC\u8BF7\u6C42\u8D85\u8FC7 20 \u6B21\u5347\u5230\u4E00\u822C\uFF1B\u540C\u4E00\u6761\u68C0\u67E5\u5931\u8D25 3 \u6B21\u5347\u4E00\u6863\uFF1BJEV \u5224\u5B9A\u4E25\u91CD\u5347\u5230\u81F3\u5C11\u590D\u6742\u3002\u964D\u6863\u53EA\u53D1\u751F\u5728\u4E0B\u4E00\u8F6E\u5F00\u59CB\n- **\u7B80\u5355\u6863\u5C11\u505A\u3002** \u4E0D\u8DD1 REVIEW\uFF0C\u4E0D\u95EE\u4EA4\u4ED8\u88C1\u5224\uFF0C\u56DE\u5408\u7ED3\u675F\u4E0D\u7B49\u5F85\uFF0C\u7CFB\u7EDF\u63D0\u793A\u7528\u7CBE\u7B80\u7248\u3002\u5DE5\u5177\u53EA\u7559 10 \u4E2A\u6838\u5FC3\uFF0C`mcp__*` \u59CB\u7EC8\u4FDD\u7559\u3002\u4E00\u822C\u6863\u5BA1\u67E5\u7B49\u5F85\u6700\u591A 5 \u79D2\u3002\u590D\u6742\u548C\u957F\u7A0B\u6700\u591A 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\n- **\u72B6\u6001\u884C\u5E26\u6863\u4F4D\u3002** \u5728 `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42` \u540E\u52A0 `\u7B80\u5355`\u3002\u6362\u6863 15 \u79D2\u5185\u663E\u793A `\u7B80\u5355\u2192\u4E00\u822C`\n- **stdin \u5148\u770B 200ms\u3002** `-p` \u7B49\u7BA1\u9053\u7B2C\u4E00\u5B57\u8282\u9ED8\u8BA4 200ms\uFF08`CLAVUE_STDIN_PEEK_MS`\uFF0C0 \u4E0D\u7B49\uFF09\u3002MCP \u542F\u52A8\u8D5B\u8DD1\u4ECD\u662F 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF09\n\n## 13.4.2 - 2026-10-16\n\n- **\u8BA1\u65F6\u884C\u7528\u771F\u5B9E\u9636\u6BB5\u540D\u3002** \u8C03\u8BD5\u65E5\u5FD7\u4E0D\u518D\u628A\u6BCF\u4E00\u8DF3\u90FD\u5199\u6210 `sdk`\uFF0C\u800C\u662F `intake/jev`\u3001`plan`\u3001`scout`\u3001`main`\u3001`review`\u3001`compact`\u3001`subagent`\u3001`fanout` \u52A0\u4E0A\u6A21\u578B\u548C\u6BEB\u79D2\u3002\u72B6\u6001\u884C\u663E\u793A `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42`\n- **\u7F16\u6392\u5BF9\u9F50 v1\u3002** JEV intake \u5728\u56DE\u5408\u5F00\u59CB\u5C31\u53D1\u51FA\u53BB\uFF0C\u53EA\u5728\u8BA1\u5212\u8DF3\u4E4B\u524D\u7B49\u5F85\u3002\u77ED\u7EED\u5199\uFF08\u7EE7\u7EED\uFF09\u590D\u7528\u4E0A\u4E00\u8F6E\u5206\u7C7B\uFF1A0 \u6B21 JEV\u30010 \u6B21 PLAN\u3002\u8BA1\u5212\u8DF3\u81EA\u8EAB 30 \u79D2\u5230\u70B9\u5C31\u9759\u9ED8\u4E22\u6389\uFF08`CLAVUE_COMBO_PLAN_TIMEOUT_MS`\uFF09\uFF0C\u9996\u5305\u524D\u4ECD\u53EA\u7B49\u6700\u591A 1.8 \u79D2\u3002\u540C\u4E00\u4EFD\u8BA1\u5212\u53EA\u5BA1\u67E5\u4E00\u6B21\uFF0C\u8BA1\u5212\u6700\u591A\u4FEE\u8BA2\u4E00\u6B21\u3002`CLAVUE_COMBO_PLAN_HOP=0` \u4ECD\u53EF\u5173\u6389\u8BA1\u5212\u8DF3\n- **\u56DE\u5408\u7ED3\u675F\u7684\u5BA1\u67E5\u7B49\u5F85\u3002** \u914D\u7F6E\u9ED8\u8BA4\u4ECD\u662F 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\u3002\u7410\u788E\u56DE\u5408\u4E0D\u7B49\u5F85\uFF1B\u5176\u4F59\u56DE\u5408\u6700\u591A\u7B49 5 \u79D2\n- **\u51B7\u542F\u52A8\u4E0D\u6321 MCP\u3002** \u65E0\u5934\u6A21\u5F0F\u9ED8\u8BA4\u5728\u540E\u53F0\u8FDE\u63A5 MCP\uFF0C\u4E0D\u518D\u628A\u7B2C\u4E00\u8BF7\u6C42\u6321\u4F4F\u6700\u591A 8 \u79D2\u3002`CLAVUE_HEADLESS_MCP_BUDGET_MS=0` \u6062\u590D\u4E00\u76F4\u7B49\u5230\u8FDE\u5B8C\n- **JEV \u9274\u6743\u5931\u8D25\u8DE8\u8FDB\u7A0B\u8DF3\u8FC7\u3002** \u4E00\u6761 intake \u91CC\u4E24\u628A key \u90FD 401 \u5C31\u4F1A\u5199\u4E0B `jev-auth-fail.json`\u3002\u4E0B\u4E00\u4E2A\u8FDB\u7A0B\u5728 TTL \u5185\u4E0D\u518D\u53D1\u90A3\u4E24\u4E0B 401\n- **\u540E\u53F0\u8FDE\u4E0A\u7684 MCP \u4F1A\u8FDB\u540E\u7EED\u8BF7\u6C42\u3002** \u542F\u52A8\u65F6\u548C\u8FDE\u63A5\u8D5B\u8DD1\uFF0C\u9ED8\u8BA4\u6700\u591A 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF0C0 \u9A6C\u4E0A\u8FD4\u56DE\uFF09\u3002\u6BCF\u4E2A\u670D\u52A1\u5668\u8FDE\u4E0A\u5C31\u5199\u5165 headless store\u3002\u540C\u4E00\u56DE\u5408\u91CC\u4E0B\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u8C03\u7528 `refreshTools()` \u91CD\u8BFB `buildAllTools(getAppState())`\u3002`stickyToolsForTurn` \u4E0D\u518D\u56E0\u4E3A\u5DE5\u5177\u4E0D\u5728\u4E0A\u4E00\u8BF7\u6C42\u7684\u540D\u5355\u91CC\u5C31\u4E22\u6389 `mcp__*`\u3002\u6838\u5FC3\u5DE5\u5177\u9762\u4E5F\u4FDD\u7559 `mcp__*`\n- **\u6D41\u4E2D\u95F4\u5361\u4F4F\u4F1A\u6362\u5907\u7528\u6A21\u578B\u3002** \u804A\u5929\u6A21\u578B\u4EE5\u524D\u4E24\u4E2A chunk \u4E4B\u95F4\u53EF\u4EE5\u7A7A 180 \u79D2\uFF0C\u6240\u4EE5 -p \u91CC 81 \u79D2\u548C 147 \u79D2\u7684\u505C\u987F\u4E0D\u4F1A\u4E2D\u6B62\u3002\u73B0\u5728\u9ED8\u8BA4 60 \u79D2\uFF08`CLAVUE_API_STREAM_IDLE_TIMEOUT_MS`\uFF0C\u4E5F\u8BA4 `CLAVUE_STREAM_IDLE_TIMEOUT_MS`\uFF1B`CLAVUE_STREAM_WATCHDOG=0` \u5173\u95ED\uFF09\u3002\u5230\u70B9\u53D6\u6D88\u6D41\uFF08\u5DF2\u7ECF\u51FA\u8FC7\u5B57\u4E5F\u53D6\u6D88\uFF09\uFF0C\u4E22\u6389\u534A\u622A\u52A9\u624B\u6D88\u606F\uFF0C\u6309\u9996\u5305\u540C\u4E00\u6761\u5907\u7528\u94FE\u91CD\u8BD5\u4E00\u6B21\n- **\u8BA1\u5212\u8C03\u7528\u7684\u8BA1\u65F6\u884C\u5199 `plan`\u3002** \u9636\u6BB5\u6309\u8C03\u7528\u70B9\u7684 phase/role \u8BB0\uFF0C\u4E0D\u518D\u56E0\u4E3A querySource \u662F `sdk` \u5C31\u5168\u90E8\u5199\u6210 `main`\u3002scout / review \u540C\u7406\n\n## 13.4.1 - 2026-10-16\n\n- **\u9996\u5305\u8D85\u65F6\u6362\u5907\u7528\u6A21\u578B\u3002** \u9ED8\u8BA4\u7B49\u5F85\u4ECE 90 \u79D2\u964D\u5230 45 \u79D2\uFF08`CLAVUE_API_FIRST_BYTE_TIMEOUT_MS`\uFF0C0 \u5173\u95ED\uFF09\uFF0C\u6D41\u5F0F\u548C\u672C\u5730\u975E\u6D41\u5F0F\uFF08\u542B 127.0.0.1\uFF09\u90FD\u8BA1\u65F6\u3002\u8D85\u65F6\u540E\u4E0D\u518D\u91CD\u8BD5\u540C\u4E00\u4E2A\u6A21\u578B\uFF0C\u6539\u5207\u5907\u7528\uFF1Aprofile \u7684 `fallback`\u3001\u7136\u540E `CLAVUE_COMBO_FALLBACK`\u3001\u7136\u540E ttqq \u9ED8\u8BA4 `cn:deepseek-v4.1-flash`\uFF1B`off` \u5173\u95ED\u3002\u72B6\u6001\u884C\u663E\u793A `\u7B49\u5F85\u6A21\u578B\u9996\u5305 Ns`\u3002\u540E\u53F0\u8C03\u7528\u9ED8\u8BA4\u6700\u591A 20 \u79D2\uFF08`CLAVUE_SIDE_CALL_TIMEOUT_MS`\uFF0Cplan/review \u4E0D\u5957\u8FD9\u5C42\u4E0A\u9650\uFF09\n- **JEV \u4E0E FastApply \u51ED\u8BC1\u94FE\u3002** \u73B0\u6709\u987A\u5E8F\u4E4B\u540E\u8865\u4E0A\u5DF2\u767B\u5F55\u8D26\u53F7 key\uFF08`auth.json`\uFF0C\u542B `https://api.clavue.com::client` \u8FD9\u79CD\u6309\u4E3B\u673A\u5B58\u653E\u7684\u6761\u76EE\uFF09\u548C\u672C\u673A\u8BBE\u5907 key\uFF08`official-device-key.json`\uFF09\u3002\u914D\u7F6E\u76EE\u5F55\u8DDF\u968F `CLAVUE_CONFIG_DIR`\u3002\u53EA\u53D1\u7ED9 api.clavue.com\u3002\u67D0\u4E00\u7EA7\u8FD4\u56DE 401 \u5C31\u8BD5\u4E0B\u4E00\u7EA7\uFF0C\u5E76\u8BB0\u4E0B\u65B0\u6765\u6E90\uFF08`key source=auth.json:https://api.clavue.com::clavue-gui`\uFF09\u3002`/provider current` \u5217\u51FA\u6574\u6761\u94FE\u548C\u6BCF\u4E00\u7EA7\u662F\u5426\u627E\u5230\u3002\u540C\u4E00\u8BF7\u6C42 1 \u79D2\u5185\u4E0D\u53D1\u7B2C\u4E8C\u6B21\uFF0C\u6362 key \u9664\u5916\u3002\u5168\u90E8 401 \u65F6\u7EC8\u7AEF\u53EA\u6253\u4E00\u884C\u4E2D\u6587\u4FEE\u590D\u63D0\u793A\uFF0C\u4E0D\u518D\u6A21\u62DF\u5224\u5B9A\u3002\u5224\u5B9A\u5931\u8D25\u4F1A\u8BB0\u4F4F\u4E00\u5C0F\u6BB5\u65F6\u95F4\uFF08`CLAVUE_JEV_AUTH_FAIL_TTL_MS`\uFF0C\u9ED8\u8BA4 10 \u5206\u949F\uFF09\uFF0C\u8FD9\u6BB5\u65F6\u95F4\u91CC\u4E0D\u518D\u53D1 intake\n- **`provider current` \u8BFB\u53D6 settings.json \u7684 env\u3002** JEV/FA \u72B6\u6001\u4E0D\u518D\u56E0\u4E3A\u53EA\u5199\u5728 settings \u91CC\u800C\u663E\u793A off\u3002\u5DF2\u4FDD\u5B58\u7684\u7EBF\u8DEF\u662F\u5F53\u524D\u8DEF\u7531\u65F6\uFF0C\u4E0D\u518D\u663E\u793A `Current API config: None`\n- **DeepSeek \u63A8\u7406 token \u4E0D\u518D\u91CD\u590D\u8BA1\u5165\u4E0A\u4E0B\u6587\u3002** `reasoning_tokens` \u662F `completion_tokens` \u7684\u5B50\u96C6\uFF1B\u7F51\u5173\u628A\u4E24\u8005\u76F8\u52A0\u5199\u8FDB `output_tokens` \u65F6\u6309 completion \u8BA1\u3002\u540C\u4E00\u56DE\u590D\u62C6\u5F00\u7684\u601D\u8003\u5757\u4E0D\u518D\u88AB\u4F30\u7B97\u7B2C\u4E8C\u904D\n- **\u9632\u538B\u7F29\u98CE\u66B4\u3002** \u540C\u4E00\u6A21\u578B\u5BB6\u65CF\u91CC\u6362\u6A21\u578B\u3001\u7A97\u53E3\u6CA1\u6709\u53D8\u5C0F\u65F6\uFF0C\u4E0A\u4E0B\u6587\u6CA1\u5230\u65B0\u6A21\u578B\u9608\u503C\u5C31\u4E0D\u538B\u7F29\u3002\u6458\u8981\u6309 `CLAVUE_AUTO_COMPACT_MODEL` \u2192 light \u2192 FA \u2192 \u4E3B\u6A21\u578B\uFF0C\u6BCF\u4E2A\u6A21\u578B\u9650\u65F6 90 \u79D2\uFF08`CLAVUE_AUTO_COMPACT_TIMEOUT_MS`\uFF09\u3002\u4E0A\u4E0B\u6587\u4E0D\u5230 token \u9608\u503C 30% \u65F6\uFF0C\u5185\u5B58\u538B\u529B\u53EA\u6E05\u7F13\u5B58\uFF0C\u4E0D\u8DD1\u538B\u7F29\u3002\u7B2C\u4E09\u65B9\u7EBF\u8DEF\u4E0D\u4F1A\u9ED8\u8BA4\u53BB\u8C03 `clavue-2.1-fast` / `clavue-2.1` / `clavue-2.1-pro`\uFF1B\u53EA\u6709\u5B98\u65B9\u4E91\uFF0C\u6216\u4F60\u7528 `CLAVUE_COMBO_LIGHT` / `CLAVUE_AUTO_COMPACT_MODEL` \u8FD9\u7C7B\u73AF\u5883\u53D8\u91CF\u5199\u660E\uFF0C\u624D\u4F1A\u8D70\u8FD9\u4E9B id\n- **\u4EE3\u7801\u56DE\u5408\u5C11\u7B49\u524D\u7F6E\u8DF3\u3002** \u8BA1\u5212\u8DF3\u9ED8\u8BA4\u6700\u591A\u5360\u9996\u5305\u524D 1.8 \u79D2\uFF08`CLAVUE_SCOUT_TIMEOUT_MS`\uFF0C`CLAVUE_COMBO_PLAN_BLOCK=1` \u6062\u590D\u4E00\u76F4\u7B49\uFF09\u3002\u72EC\u7ACB\u7684\u8BA1\u5212\u69FD\u5E76\u884C\uFF0C\u8D85\u65F6\u4E0D\u518D\u4E32\u884C\u6362\u4E0B\u4E00\u4E2A\u6A21\u578B\u3002\u8C03\u8BD5\u65E5\u5FD7\u4E00\u884C `stage -> model -> ms`\n- **ttqq \u9884\u8BBE\u4E0D\u518D\u5185\u7F6E `clavue-2.1-fast`\u3002** \u8F7B\u91CF\u69FD\u7559\u7A7A\uFF0C\u8F85\u52A9\u8C03\u7528\u8DDF\u7740\u4E3B\u6A21\u578B\uFF0C\u9664\u975E\u4F60\u81EA\u5DF1\u6307\u5B9A\n- **\u7B2C\u4E09\u65B9 JEV fan-out\u3002** \u8C03\u7528\u65B9\u6CA1\u6709\u6307\u5B9A\u6A21\u578B\u65F6\u4E0D\u518D\u585E\u9ED8\u8BA4 `clavue-jev`\n\n## 13.4.0 - 2026-10-16\n\n- **\u4F4E\u98CE\u9669 clavue-v1 \u5BF9\u9F50\uFF08#8\uFF09\u3002** \u6062\u590D\u4F1A\u8BDD\u3001\u5806\u9876\u3001\u6EA2\u51FA\u3001print \u6536\u5C3E\u4E0E goal \u95F8\u95E8\u4ECE clavue-v1 \u8FC1\u5165\n- **1.48.5 \u4E4B\u540E\u7684\u5BF9\u9F50\uFF08#9\uFF09\u3002** \u8FC1\u5165 clavue-v1 1.48.7\uFF0C\u5E76\u7F13\u5B58\u7A33\u5B9A\u7684 system \u524D\u7F00\n- **\u53EF\u9009\u7684\u539F\u751F fetch \u5BA2\u6237\u7AEF\uFF08#10\uFF09\u3002** `CLAVUE_NATIVE_CLIENT` \u672A\u8BBE\u7F6E\u65F6\u4ECD\u8D70\u539F\u6709\u4F20\u8F93\uFF1B\u8BBE\u7F6E\u540E\u6539\u7528\u57FA\u4E8E fetch \u7684\u5BA2\u6237\u7AEF\n- **\u53EF\u9009\u7684 Rust napi \u70ED\u8DEF\u5F84\uFF08#11\uFF09\u3002** `CLAVUE_NATIVE_RS` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u672A\u8BBE\u7F6E\u65F6\u4E0D\u52A0\u8F7D addon\n- **\u53EF\u9009\u7684 fast-apply\uFF08#12\uFF09\u3002** `clavue-fa` \u7684 ApplyEdit \u9ED8\u8BA4\u5173\u95ED\n- **\u53EF\u9009\u7684 JEV \u51B3\u7B56\u95E8\uFF08#14\uFF09\u3002** \u6302\u5728\u5171\u4EAB aux \u69FD\u4E0A\uFF0C\u9ED8\u8BA4\u4E0D\u542F\u7528\n- **\u7EC4\u5408\u6210\u672C\u95F8\u4E0E\u8F93\u51FA\u536B\u751F\uFF08#13\uFF09\u3002** \u4ECE clavue-v1 \u8FC1\u5165\uFF1B\u536B\u751F\u9ED8\u8BA4\u5173\u95ED\uFF0C\u88C1\u526A\u524D\u7F00\u4FDD\u6301\u7A33\u5B9A\n- **JEV / ApplyEdit \u5B9E\u673A\u4FEE\u590D\uFF08#15\uFF09\u3002** \u505C\u6389 JEV \u7684 follow-up \u5FAA\u73AF\uFF0C\u5E76\u4FEE\u6389 ApplyEdit \u7684 bundle \u5D29\u6E83\n- **\u53EF\u9009\u6548\u7387\u5305\uFF08#16\uFF09\u3002** `CLAVUE_EFFICIENCY` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u6253\u5F00\u540E\u5305\u542B\u5E76\u884C JEV\n- **\u6BCF\u56DE\u5408\u5F00\u9500\uFF08#17\uFF09\u3002** \u957F\u4F1A\u8BDD\u7684\u6BCF\u56DE\u5408\u5DE5\u4F5C\u4E0D\u518D\u626B\u5B8C\u6574\u5386\u53F2\uFF1Bpager \u6BCF\u5E27\u53EA\u68C0\u67E5\u7A97\u53E3\u5185\u7684 journal \u6233\n- **\u65B0\u80FD\u529B\u5168\u90E8\u9ED8\u8BA4\u5173\u95ED\u3002** `CLAVUE_NATIVE_CLIENT`\u3001`CLAVUE_NATIVE_RS`\u3001`clavue-fa`\u3001JEV\u3001\u7EC4\u5408\u6210\u672C\u4E0E\u8F93\u51FA\u536B\u751F\u3001`CLAVUE_EFFICIENCY` \u90FD\u8981\u663E\u5F0F\u6253\u5F00\u624D\u751F\u6548\n\n## 13.3.3 - 2026-09-29\n\n- **Esc\xD72 \u56DE\u9000\u9009\u62E9\u6846\u56DE\u6765\u4E86\u3002** \u53CC\u51FB Esc \u7684\u56DE\u9000\u300C\u9009\u62E9\u6846\u300D\u6B64\u524D\u4F1A\u5BF9\u5DF2\u7ECF\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\n \u5224\u5B9A\u6210 0 \u4E2A\u6539\u52A8\uFF0C\u4E8E\u662F\u628A\u5B83\u5F53\u6210\u6253\u9519\u7684\u7A7A\u56DE\u5408\u76F4\u63A5\u64A4\u56DE\uFF0C\u9009\u62E9\u5217\u8868\u6839\u672C\u4E0D\u518D\u51FA\u73B0\u3002\n \u6839\u56E0\u662F\u56DE\u9000\u7528\u7684\u6539\u52A8\u8BA1\u6570\u662F\u81EA\u5DF1\u7EF4\u62A4\u7684\u4E00\u5957\u5C0F\u5199\u5B50\u4E32\u5339\u914D\uFF08`edit ` / `write `\uFF09\uFF0C\n \u8BA4\u4E0D\u51FA\u5F53\u524D\u5DE5\u5177\u810A\u67F1\u7684\u771F\u5B9E\u5F62\u6001 `Update(path)` / `Create(path)` / `Write(path)`\u3002\n \u73B0\u5728\u8BA1\u6570\u6539\u8D70\u552F\u4E00\u7684\u7F16\u8F91\u5224\u5B9A `journal_format::is_edit_tool_label`\uFF0C\n \u4E0E\u4EA4\u4ED8\u6C47\u603B\u5171\u7528\u540C\u4E00\u6743\u5A01\uFF1A\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\u7167\u5E38\u5F39\u51FA\u9009\u62E9\u6846\uFF0C\n \u771F\u6B63\u6CA1\u6539\u52A8\u7684\u56DE\u5408\u4ECD\u6309\u7A7A\u56DE\u5408\u5373\u65F6\u64A4\u56DE\n- **\u53EA\u4FEE\u5206\u7C7B\uFF0C\u4E0D\u6539\u4EA4\u4E92\u3002** \u9009\u62E9\u6846\u7684\u7ED8\u5236\u3001\u952E\u76D8/\u9F20\u6807\u547D\u4E2D\u3001ModeSelect \u5355\u9009\u5168\u90E8\u4FDD\u6301\u539F\u6837\uFF1B\n \u672C\u6B21\u4EC5\u8BA9\u300C\u54EA\u4E9B\u56DE\u5408\u7B97\u6539\u8FC7\u6587\u4EF6\u300D\u8FD9\u4E00\u5904\u5224\u5B9A\u6062\u590D\u6B63\u786E\n\n## 13.3.2 - 2026-09-29\n\n- **\u5347\u7EA7\u6210\u529F\u540E\u76F4\u63A5\u8FDB\u5165\u754C\u9762\uFF0C\u4E0D\u518D\u8981\u6C42\u5B8C\u5168\u9000\u51FA\u3002** Node duplex \u5BBF\u4E3B\u662F\u9876\u5C42\u8FDB\u7A0B\uFF0C\n \u542F\u52A8\u65F6\u53EA\u89E3\u6790\u4E00\u6B21 `agentEntry` / `pagerBin`\uFF1B\u540E\u53F0 `npm install -g` \u6362\u6389\u4E86\u78C1\u76D8\u4E0A\u7684\n \u65B0\u7248\u672C\uFF0C\u5185\u5B58\u91CC\u4ECD\u662F\u65E7\u4EE3\u7801\uFF0C\u4E8E\u662F\u53EA\u80FD\u9760\u7528\u6237\u624B\u52A8\u9000\u51FA\u91CD\u8FDB\u3002\u73B0\u5728\u5BBF\u4E3B\u5728\u5347\u7EA7\u6210\u529F\u540E\n \u539F\u5730\u91CD\u6267\u884C\u81EA\u5DF1\uFF1Apager \u5148\u6309\u6B63\u5E38\u8DEF\u5F84\u9000\u51FA\uFF08\u79BB\u5F00 raw mode\u3001\u6062\u590D\u5C4F\u5E55\uFF09\uFF0CCLI \u5165\u53E3\n \u5728 pager \u91CA\u653E TTY \u540E\u518D\u8D77\u65B0\u8FDB\u7A0B\u3002\u5B88\u536B `CLAVUE_SESSION_RELAUNCH=1` \u9632\u6B62\u91CD\u6267\u884C\u5FAA\u73AF\uFF0C\n `CLAVUE_DISABLE_SESSION_RELAUNCH=1` \u53EF\u5173\u95ED\uFF1B\u6D4B\u8BD5/\u5F00\u53D1\u8FD0\u884C\u65F6\u62D2\u7EDD\u91CD\u6267\u884C\n- **\u9996\u6B21\u914D\u7F6E\u88C5\u8F7D\u540E\u540C\u6837\u539F\u5730\u8FDB\u5165\u754C\u9762\u3002** `routeTrack`\uFF08\u627F\u8F7D `needsSetup` /\n `officialReady`\uFF09\u6B64\u524D\u53EA\u5728\u542F\u52A8\u65F6\u53D1\u9001\u4E00\u6B21\uFF0C\u4E8E\u662F\u5728\u7EBF\u8DEF / BYOK \u9762\u677F\u4FDD\u5B58\u540E\uFF0C\n pager \u7684\u9996\u6B21\u914D\u7F6E\u83DC\u5355\u4E00\u76F4\u9501\u7740\uFF0C\u5FC5\u987B\u9000\u51FA\u91CD\u8FDB\u624D\u6D88\u5931\u3002\u73B0\u5728\u9762\u677F\u4FDD\u5B58\u91CD\u542F agent \u65F6\n \u4E00\u5E76\u91CD\u53D1 `routeTrack`\uFF0C\u754C\u9762\u5F53\u6B21\u4F1A\u8BDD\u5373\u89E3\u9501\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.3 - 2026-09-29\n\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.2 - 2026-09-20\n\n- \u539F\u751F pager \u53D1\u5E03\u95E8\u7981\u53D6\u771F\uFF1Astaged \u4E8C\u8FDB\u5236\u5FC5\u987B\u5185\u5D4C\u5F53\u524D pager \u6E90\u7801\u6458\u8981\n \uFF08`--build-info` JSON \u5F62\u72B6\u7684 `sourceDigest` \u5B57\u6BB5\uFF0C\u951A\u5B9A `"sourceDigest":"<64 hex>"`\uFF09\uFF0C\n \u65E7\u6E90\u7801\u7F16\u8BD1\u51FA\u7684\u4E8C\u8FDB\u5236\u5373\u4F7F\u54C8\u5E0C\u81EA\u6D3D\u4E5F\u4F1A\u88AB\u62D2\u7EDD\uFF0C\u4E0D\u518D\u9760\u4EC5\u81EA\u6D3D\u7684 manifest \u54C8\u5E0C\u653E\u884C\n- manifest \u6EAF\u6E90\u6539\u4E3A\u6309\u5E8F\u89E3\u6790\u800C\u975E\u9759\u9ED8\u7701\u7565\uFF1A`CLAVUE_RELEASE_SOURCE_COMMIT` \u2192\n `GITHUB_SHA` \u2192 `git rev-parse HEAD`\uFF1B`releaseTag` \u672A\u8BBE\u65F6\u56DE\u843D\u4E3A `v${version}`\uFF0C\n \u672C\u5730\u53D1\u5E03\u6784\u5EFA\u4E0D\u518D\u4E22\u5931\u53D1\u5E03\u95E8\u7981\u6240\u9700\u5B57\u6BB5\n- \u8FD0\u884C\u65F6\u4E0E pager \u4EA7\u7269\u4E0D\u53D8\uFF1A`dist/native` \u4E8C\u8FDB\u5236\u6CBF\u7528 13.2.1\uFF0C\u4EC5 `manifest.json`\n \u6EAF\u6E90\u4E0E\u95E8\u7981\u63A5\u7EBF\u53D8\u66F4\n\n## 13.2.1 - 2026-09-20\n\n- \u65E5\u8BB0\u7EB5\u5411\u8282\u594F\u6539\u4E3A\u4E24\u7EA7\uFF1A\u6BB5\u843D\u8FB9\u754C\uFF08\u65B0\u7684\u7528\u6237\u56DE\u5408\u3001Recap \u524D\uFF09\u5728\u6807\u51C6\u9AD8\u5EA6\u547C\u5438\u4E24\u884C\uFF0C\n \u6BB5\u5185\u5206\u7EC4\u7684\u547C\u5438\u4FDD\u6301\u4E00\u884C\uFF1Bcompact \u4E0B\u6240\u6709\u95F4\u9699\u4ECD\u4E3A\u4E00\u884C\uFF0C\u5BC6\u5EA6\u4E0D\u6D6A\u8D39\u4EFB\u4F55\u4E00\u884C\u3002\n \u7EC8\u7AEF\u6CA1\u6709\u5B57\u4F53\u884C\u9AD8\uFF0C\u8282\u594F\u53EA\u80FD\u6765\u81EA\u95F4\u9699\u5206\u7EA7\u4E0E\u5185\u8FB9\u8DDD\uFF0C\u8FD9\u6761\u89C4\u5F8B\u73B0\u5DF2\u5199\u5165 J8 \u800C\u975E\u6BCF\u6B21\u91CD\u65B0\u53D1\u73B0\n- \u9996\u5C4F\u6539\u4E3A compose-first\uFF1A\u5DF2\u914D\u7F6E\u7EBF\u8DEF\u65F6\uFF0C\u8F93\u5165\u6846\u4E3A\u7A7A\u6309 Enter \u76F4\u63A5\u5F00\u65B0\u4F1A\u8BDD\uFF08\u9879\u76EE\u9009\u62E9\u4ECD\u751F\u6548\uFF09\uFF0C\n \u63D0\u793A\u6587\u6848\u6539\u4E3A\u300CEnter \u5F00\u5DE5\u300D\uFF1B\u9996\u6B21\u8FD0\u884C\u4FDD\u7559\u786E\u8BA4\u8BED\u4E49\u2014\u2014\u7EBF\u8DEF\u5FC5\u987B\u5148\u5B58\u5728\uFF0C\u4F1A\u8BDD\u624D\u53EF\u80FD\u5F00\u59CB\n- \u9996\u5C4F\u8BB0\u4F4F\u6700\u8FD1\u4E09\u4E2A\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u663E\u793A\u5728\u4FE1\u606F\u677F\u4E0B\u65B9\uFF0C\u6309 1-3 \u76F4\u63A5\u91CD\u5F00\u3002\u663E\u793A\u7684 cwd \u53D6\u81EA\u4F1A\u8BDD\u8BB0\u5F55\u91CC\n \u5199\u5165\u7684 cwd \u5B57\u6BB5\uFF0C\u7EDD\u4E0D\u7531\u76EE\u5F55 slug \u53CD\u89E3\uFF08slug \u6709\u635F\uFF1A\u8DEF\u5F84\u5206\u9694\u7B26\u4E0E\u8FDE\u5B57\u7B26\u4E0D\u53EF\u533A\u5206\uFF09\uFF1B\n \u4E34\u65F6\u76EE\u5F55\u3001\u5BB6\u76EE\u5F55\u4E0E\u8BB0\u5F55\u5B58\u653E\u76EE\u5F55\u672C\u8EAB\u90FD\u88AB\u6392\u9664\n- \u95E8\u7981\u53D6\u771F\uFF1A\u4E24\u4E2A pager/broker \u6D4B\u8BD5\u4E0D\u518D\u8BFB\u5F00\u53D1\u673A\u672C\u5730\u7684 review model \u8986\u5199\uFF0C\n \u4E2A\u4EBA\u8BBE\u7F6E\u91CC\u7684 pin \u4E0D\u80FD\u518D\u628A\u53D1\u5E03\u95E8\u7981\u5224\u7EA2\n- \u6E90\u7801\u7EA7\u5224\u65AD\u57FA\u5E95\uFF08\u4E0D\u968F\u672C\u5305\u53D1\u5E03\uFF09\uFF1Alaziness / intent / verify-green \u4E09\u6761\u65E2\u6709\u89C4\u5219\u5730\u677F\u4E4B\u4E0B\n \u5404\u6709\u4E00\u4E2A\u7C7B\u578B\u5316\u5224\u65AD\u5C42\uFF0C\u9ED8\u8BA4\u4F11\u7720\uFF08\u672A\u8BBE TYPESAFE_API_KEY \u5373\u5B8C\u5168\u4E0D\u52A8\uFF09\u3002\n \u5B83\u5728 8.16.1 \u7684\u4EA7\u7269\u91CC\u662F\u60F0\u6027\u7684\u2014\u2014\u8BE6\u89C1\u53D1\u5E03\u8BF4\u660E\u7684 Known \u4E00\u8282\n\n## 13.2.0 - 2026-09-19\n\n- `/release-notes` \u79BB\u7EBF\u53EF\u7528\uFF1A\u6784\u5EFA\u671F\u628A `CHANGELOG.md` \u6CE8\u5165 `MACRO.VERSION_CHANGELOG`\n \uFF08\u6B64\u524D\u6052\u4E3A\u7A7A\u4E32\uFF09\uFF0C\u7F13\u5B58\u672A\u547D\u4E2D\u65F6\u56DE\u843D\u5230\u5185\u7F6E\u526F\u672C\u800C\u975E `""`\uFF0C\u5168\u65B0\u5B89\u88C5\u9996\u6B21\u8FD0\u884C\u5373\u53EF\u770B\u5230\u771F\u5B9E\u6761\u76EE\n- `/release-notes` \u7684\u94FE\u63A5\u4E0E\u540E\u53F0 fetch \u6B64\u524D\u90FD\u6307\u5411 anthropics/claude-code\uFF0C\u6539\u4E3A\u6307\u5411 Clavue \u81EA\u8EAB\u4ED3\u5E93\uFF1B\n \u547D\u4EE4\u6539\u4E3A\u5148\u8BFB\u672C\u5730\u5185\u5BB9\u3001\u628A\u7F51\u7EDC\u5F53\u4F5C\u4E0B\u6B21\u5237\u65B0\u7684\u6765\u6E90\uFF0C\u4E0D\u518D\u4E3A I/O \u963B\u585E\u7B54\u6848\n- hop \u6B63\u6587\u6536\u655B\uFF1A\u8FDE\u7EED\u91CD\u590D\u884C\u6298\u53E0\u4E3A\u9996\u5C3E\u4E24\u884C\u5E76\u6CE8\u660E\u7701\u7565\u6761\u6570\uFF08\u8FDE\u7EED\u4E24\u884C\u5C5E\u6B63\u5E38\u4E66\u5199\uFF0C\u4E0D\u5904\u7406\uFF09\uFF0C\n \u8D85\u957F\u6B63\u6587\u6539\u4E3A\u4FDD\u7559\u9996\u5C3E\u800C\u975E\u53EA\u7559\u5934\u90E8\uFF0C\u5E76\u6CE8\u660E\u539F\u59CB\u957F\u5EA6\uFF0C\u907F\u514D\u622A\u65AD\u540E\u7684\u6B63\u6587\u88AB\u8BEF\u8BFB\u4E3A\u672C\u6765\u5C31\u8FD9\u4E48\u77ED\n- Tips \u8FDC\u7A0B feed\uFF1A\u6587\u6848\u53EF\u5728\u4E0D\u53D1\u7248\u7684\u60C5\u51B5\u4E0B\u66F4\u6B63\u3002feed \u5C5E\u4E0D\u53EF\u4FE1\u8F93\u5165\uFF0C\u6309\u767D\u540D\u5355\u6821\u9A8C\u2014\u2014\n \u5FC5\u987B\u58F0\u660E\u672C\u4EA7\u54C1\u3001URL \u5FC5\u987B\u4E3A https\u3001\u5B57\u7B26\u4E32\u957F\u5EA6\u8BBE\u4E0A\u9650\uFF1B\u5355\u6761\u7578\u5F62\u6761\u76EE\u53EA\u4E22\u5F03\u81EA\u8EAB\uFF0C\u4E0D\u5F71\u54CD\u5176\u4F59\u6761\u76EE\u3002\n \u6761\u76EE\u590D\u7528\u65E2\u6709\u51B7\u5374\u673A\u5236\u5E76\u4F7F\u7528\u547D\u540D\u7A7A\u95F4 id\uFF0C\u4E0E\u5185\u7F6E\u63D0\u793A\u4E92\u4E0D\u5E72\u6270\uFF1B\u5931\u8D25\u5168\u7A0B\u9759\u9ED8\uFF0C\u7F51\u7EDC\u95EE\u9898\u4E0D\u4F1A\u53D8\u6210\u62A5\u9519\u6216\u62D6\u6162\u56DE\u5408\n- Tips \u63D0\u793A\u6B64\u524D\u4E0D\u53EF\u8FBE\u800C\u975E\u8FC7\u671F\uFF1A`getRelevantTips` \u7684\u552F\u4E00\u8C03\u7528\u65B9\u4E22\u5F03\u4E86\u7ED3\u679C\uFF0C`getTipToShowOnSpinner`\n \u65E0\u4EFB\u4F55\u8C03\u7528\u65B9\uFF0C`contextTipsActive` \u6052\u4E3A `false` \u4E14\u4ECE\u672A\u8D4B\u503C\u3002\u6539\u4E3A\u5728\u6E32\u67D3\u63D0\u793A\u7684 Spinner \u5185\u90E8\u9009\u53D6\u63D0\u793A\n\n## 13.1.5 - 2026-09-14\n\n- \u4FA7\u67E5\u8BE2\uFF08plan/review hop\u3001\u5206\u7C7B\u5668\u3001\u8BB0\u5FC6\u68C0\u7D22\u3001\u8BC1\u636E\u6536\u636E\uFF09\u6539\u4E3A\u6D41\u5F0F\uFF1A\u4E0D\u518D\u53D1 `stream:false` \u7684\n `/v1/chat/completions`\uFF0C\u907F\u514D\u6DF1\u5EA6\u63A8\u7406\u6A21\u578B\u5728\u7F51\u5173 600 \u79D2\u4EE3\u7406\u5899\u4E0A\u88AB\u6390\u65AD\n- \u4FA7\u67E5\u8BE2\u7684 `effort` \u771F\u6B63\u843D\u5230 `output_config.effort`\uFF1A\u6B64\u524D\u8BE5\u5B57\u6BB5\u672A\u5728\u9009\u9879\u7C7B\u578B\u4E0A\u58F0\u660E\uFF0C\n \u8C03\u7528\u65B9\u5C55\u5F00\u4F20\u503C\u4E0D\u4F1A\u89E6\u53D1\u7C7B\u578B\u68C0\u67E5\uFF0C\u503C\u88AB\u9759\u9ED8\u4E22\u5F03\uFF0C\u7F51\u5173\u9000\u56DE\u81EA\u8EAB\u9ED8\u8BA4\u6863\n- \u8BCA\u65AD\u7C7B Bash/PowerShell \u65E5\u5FD7\u8D70 light \u69FD\u8BC1\u636E\u6536\u636E\uFF1A\u5F15\u7528\u5FC5\u987B\u5728\u539F\u6587\u9010\u5B57\u8282\u547D\u4E2D\uFF0C\u5426\u5219\u4FDD\u7559\u539F\u65E5\u5FD7\uFF1B\n `CLAVUE_EVIDENCE_REDUCER=0` \u5173\u95ED\n- \u5927 Read/Grep/Glob \u9996\u6B21\u4ECD\u7ED9\u5168\u6587\uFF0C\u4E4B\u540E\u51BB\u6210 `clavue_observation_v1` \u5360\u4F4D\uFF0C\u7528 ObsRecall \u5206\u9875\u53EC\u56DE\uFF1B\n `CLAVUE_OBS_PACK=0` \u5173\u95ED\n- \u56DE\u5408\u6309 trivial/research/implement/heavy \u8C03\u5EA6 hop\uFF1B\u4E3B\u69FD model/effort \u7C98\u4F4F\u4EE5\u4FDD\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\n \u4EC5 compact \u540E\u4E14\u540C\u7C7B\u8FDE\u7EED\u4E24\u8F6E\u624D\u8003\u8651\u6539 effort\n- Plan hop \u7684 DSML \u7B49\u672A\u89E3\u6790\u5DE5\u5177\u65B9\u8A00\u4ECE Thought \u5C55\u793A\u4E0E plan/review \u4E0A\u4E0B\u6587\u4E00\u5E76\u5265\u79BB\uFF0C\u6574\u5757\u5220\u9664\uFF0C\n \u4E0D\u5199\u5165 transcript \u4E5F\u4E0D\u704C\u8FDB\u4E3B\u6A21\u578B\n- \u4ECE\u771F\u5B9E prompt-too-long \u62D2\u7EDD\u4E2D\u5B66\u4E60\u6BCF\u4E2A\u6A21\u578B\u7684\u5B9E\u9645\u8F93\u5165\u4E0A\u9650\uFF0C\u53EA\u6536\u7D27\u4E0D\u653E\u5927\u7A97\u53E3\uFF1B\u7F51\u5173\u53EA\u62A5\n `prompt_tokens` / `completion_tokens` \u65F6\u7528\u91CF\u4E0D\u518D\u5168\u6620\u5C04\u6210 0\n- Edit \u53EF\u9009 `then_run`\uFF1A\u4EC5\u5141\u8BB8\u5355\u6761\u8BCA\u65AD\u547D\u4EE4\uFF0C\u8D70 Bash \u6743\u9650\u5361\u4E0E sandbox\uFF0C\u7981\u6B62 `;&|` \u5939\u5E26\n- T0 Fast \u4FDD\u6301 primary-only\uFF1A\u8DEF\u5F84\u5C42\u5224\u5B9A\u524D\u7F6E\u5230 hop \u8C03\u5EA6\uFF0C\u6700\u7B80\u56DE\u5408\u4E0D\u518D\u4E3A\u8BC1\u636E\u6536\u636E\u4ED8\u4E00\u6B21 light \u5F80\u8FD4\n',changelogMemoryCache}}function getStoredChangelogFromMemory(){return changelogMemoryCache??""}function parseChangelog(content){try{if(!content)return{};let releaseNotes2={},sections=content.split(/^## /gm).slice(1);for(let section of sections){let lines=section.trim().split(`
7676
+ `);if(lines.length===0)continue;let versionLine=lines[0];if(!versionLine)continue;let version3=versionLine.split(" - ")[0]?.trim()||"";if(!version3)continue;let notes=lines.slice(1).filter(line=>line.trim().startsWith("- ")).map(line=>line.trim().substring(2).trim()).filter(Boolean);notes.length>0&&(releaseNotes2[version3]=notes)}return releaseNotes2}catch(error40){return logError2(toError(error40)),{}}}function getRecentReleaseNotes(currentVersion,previousVersion,changelogContent=getStoredChangelogFromMemory()){try{let releaseNotes2=parseChangelog(changelogContent),baseCurrentVersion=(0,import_semver7.coerce)(currentVersion),basePreviousVersion=previousVersion?(0,import_semver7.coerce)(previousVersion):null;if(!basePreviousVersion||baseCurrentVersion&&gt2(baseCurrentVersion.version,basePreviousVersion.version))return Object.entries(releaseNotes2).filter(([version3])=>!basePreviousVersion||gt2(version3,basePreviousVersion.version)).sort(([versionA],[versionB])=>gt2(versionA,versionB)?-1:1).flatMap(([_2,notes])=>notes).filter(Boolean).slice(0,MAX_RELEASE_NOTES_SHOWN)}catch(error40){return logError2(toError(error40)),[]}return[]}function getAllReleaseNotes(changelogContent=getStoredChangelogFromMemory()){try{let releaseNotes2=parseChangelog(changelogContent);return Object.keys(releaseNotes2).sort((a2,b3)=>gt2(a2,b3)?1:-1).map(version3=>{let versionNotes=releaseNotes2[version3];if(!versionNotes||versionNotes.length===0)return null;let notes=versionNotes.filter(Boolean);return notes.length===0?null:[version3,notes]}).filter(item=>item!==null)}catch(error40){return logError2(toError(error40)),[]}}function getBundledReleaseNotes(){let bundled='# Changelog\n\nClavue \u53D1\u5E03\u8BF4\u660E\u3002\u672C\u6587\u4EF6\u5728\u6784\u5EFA\u65F6\u6CE8\u5165\u8FD0\u884C\u65F6\uFF0C\u9A71\u52A8 `/release-notes` \u4E0E\u542F\u52A8\u753B\u9762\u7684\u300C\u65B0\u7279\u6027\u300D\u680F\u3002\n\n\u683C\u5F0F\u7EA6\u5B9A\uFF08\u89E3\u6790\u5668\u4F9D\u8D56\uFF09\uFF1A\u4E8C\u7EA7\u6807\u9898\u4E3A `## <\u7248\u672C> - <\u65E5\u671F>`\uFF0C\u6761\u76EE\u4EE5 `- ` \u5F00\u5934\uFF0C\u4E00\u884C\u4E00\u6761\uFF0C\n\u547D\u4EE4\u3001\u53C2\u6570\u4E0E\u6A21\u578B\u540D\u4FDD\u7559\u82F1\u6587\u3002\n\n## 13.9.2 - 2026-10-23\n\n- **\u8FDE\u7EED\u601D\u8003\u6298\u6210\u4E00\u884C\u3002** \u7ED8\u5236\u65F6\u5408\u5E76\u76F8\u90BB Thinking \u810A\uFF1B\u4E0D\u8DB3 50ms \u4E0D\u518D\u663E\u793A `0.0s`\uFF1B\u540C id \u65F6\u957F\u7ECF\u6458\u8981\u7BA1\u9053\u7D2F\u52A0\n- **\u601D\u8003\u5C3E\u5DF4\u589E\u91CF\u91CD\u7ED8\u3002** \u810F\u5C3E\u5DF4\u53EA\u91CD\u753B\u7C98\u5728\u4E00\u8D77\u7684 Tool / Thinking / Verify \u540E\u7F00\uFF0C\u4E0D\u518D\u6574\u672C\u65E5\u8BB0\u91CD\u6392\n- **\u6D41\u5F0F\u601D\u8003\u5171\u7528\u4E00\u4E2A id\u3002** \u540C\u4E00\u6761\u52A9\u624B\u6D88\u606F\u53EA\u4FDD\u7559\u4E00\u4E2A thinking id\uFF0C\u907F\u514D\u6BCF\u7247\u6BB5\u5168\u91CF rebuild\n- **\u957F\u8DEF\u5F84\u6309\u659C\u6760\u6298\u884C\u3002** URL \u4E0E\u7EDD\u5BF9\u8DEF\u5F84\u5728 `/` \u6216 `\\` \u540E\u65AD\u884C\uFF0C\u51CF\u5C11\u8BCD\u4E2D\u622A\u65AD\n- **\u52A9\u624B\u8868\u683C\u4E0A\u4E0B\u7559\u767D\u3002** \u56F4\u680F\u5916\u3001`\u250C` \u524D\u4E0E `\u2514` \u540E\u5404\u7559\u4E00\u884C\uFF0C\u51CF\u8F7B\u62E5\u6324\n- **hello.version \u8986\u76D6\u9876\u680F\u7248\u672C\u3002** \u975E\u7A7A hello \u7248\u672C\u8986\u76D6\u7F16\u8BD1\u671F chrome \u7248\u672C\uFF1Bdoctrine map \u4EE5 `package.json` \u4E3A\u73B0\u884C npm pin\n\n## 13.9.1 - 2026-10-23\n\n- **\u951A\u5B9A\u4F1A\u8BDD cwd \u5199\u6587\u4EF6\u3002** \u65E0\u663E\u5F0F\u8DEF\u5F84\u65F6 Edit/Write \u4E0D\u5F97\u843D\u5230\u5144\u5F1F\u6C99\u7BB1\uFF1B\u7EDD\u5BF9\u8DEF\u5F84\u9003\u51FA session cwd \u4F1A\u88AB\u62D2\u7EDD\n- **print \u6210\u529F\u5373\u9000\u51FA 0\u3002** `subtype=success` \u65F6\u8FDB\u7A0B\u9000\u51FA\u7801\u6052\u4E3A 0\uFF0C\u4E0D\u518D\u51FA\u73B0 success \u5374 exit 1\uFF08bench C1\uFF09\n- **print \u7ED3\u679C\u8865\u9F50 timing\u3002** `result.timing` \u53EF\u5BF9\u6807 v1\uFF08wallMs / modelMs / toolCalls \u7B49\uFF09\n\n## 13.9.0 - 2026-10-23\n\n- **\u754C\u9762\u5168\u9762\u5BF9\u6807 Grok Build\u3002** \u9876\u680F/\u5E95\u680F/\u72B6\u6001\u884C\uFF08chrome\uFF09\u3001\u4E3B\u9898\u8272\u4E0E\u5B57\u5F62\u3001\u9996\u9875\u4E00\u5C4F\u53EF\u8F93\u5165\u4E14\u70ED\u952E\u4E0D\u541E\u9996\u5B57\u3001\u952E\u4F4D\u5BFC\u822A\u4E0E\u5FEB\u6377\u952E\u9762\u677F\u3001\u4E00\u8F6E\u6C47\u603B \u25C8 / \u9010\u6761 \u25C6 / \u4E09\u5C42\u5C55\u5F00\u3001\u5185\u8054\u6743\u9650\u5361\u3001\u5B50\u4EE3\u7406\u884C\u4E0E dock\u3001\u65E5\u8BB0\u964D\u566A\u4E0E\u5931\u8D25\u6761\uFF0C\u516B\u7EC4 GUI \u4E00\u5E76\u5408\u5165\n- **\u534F\u8BAE\u767B\u8BB0\u91CD\u5EFA\u3002** \u5408\u5E76\u540E\u7EDF\u4E00\u91CD\u5EFA UI \u534F\u8BAE registry\uFF0C\u4FDD\u7559\u5168\u90E8\u4E8B\u4EF6\u767B\u8BB0\uFF0C\u4E0D\u4E22\u7AEF\u53E3\n\n## 13.8.0 - 2026-10-22\n\n- **\u51FA\u9519\u65F6\u8BF4\u6E05\u695A\u3001\u5C11\u7A7A\u8F6C\u3002** \u9519\u8BEF\u7EDF\u4E00\u5206\u6210\u53EF\u91CD\u8BD5\u3001\u53EF\u6062\u590D\u3001\u5FC5\u987B\u505C\u6B62\u4E09\u7C7B\uFF1B401/402/\u78C1\u76D8\u6EE1\u76F4\u63A5\u505C\u5E76\u7ED9\u4E00\u884C\u539F\u56E0\uFF0C\u65AD\u7F51\u3001\u8D85\u65F6\u3001429\u30015xx \u624D\u91CD\u8BD5\n- **\u574F\u5DE5\u5177\u8C03\u7528\u81EA\u52A8\u4FEE\u3002** \u65E0\u540D\u6216\u53C2\u6570\u574F\u6389\u7684\u5DE5\u5177\u8C03\u7528\u6309\u300C\u4E22\u5F03\u91CD\u8BD5 \u2192 \u63D0\u9192\u5DE5\u5177\u540D \u2192 \u6309\u53C2\u6570\u63A8\u65AD \u2192 \u6362\u6A21\u578B\u300D\u4FEE\u590D\uFF0C\u72B6\u6001\u884C\u663E\u793A\u300C\u6B63\u5728\u91CD\u8BD5 (n/4)\u300D\uFF0C\u4FEE\u4E0D\u597D\u53EA\u7559\u4E00\u884C\u9519\u8BEF\n- **\u56DE\u590D\u88AB\u622A\u65AD\u80FD\u63A5\u4E0A\u3002** \u6D41\u4E2D\u65AD\u540E\u4ECE\u65AD\u70B9\u7EED\u5199\uFF0C\u9996\u5B57\u7B49\u5F85\u6309\u7F51\u5173\u8868\u73B0\u81EA\u9002\u5E94\uFF1B\u5207\u5230\u5907\u7528\u6A21\u578B\u65F6\u5DE5\u5177\u5217\u8868\u4FDD\u6301\u4E0D\u53D8\uFF0C\u63D0\u793A\u7F13\u5B58\u4E0D\u5931\u6548\n- **\u81EA\u52A8\u7EED\u63A5\u53EA\u6709\u4E00\u4E2A\u51FA\u53E3\u3002** \u5404\u7C7B\u7EED\u63A5\u8D70\u540C\u4E00\u51FA\u53E3\uFF0C\u6709\u8FDB\u5C55\u4E0D\u8BA1\u6570\uFF0C\u8FDE\u7EED\u65E0\u8FDB\u5C55 8 \u6B21\u6216\u6BCF\u56DE\u5408 40 \u6B21\u540E\u505C\u4E0B\u5E76\u8BF4\u660E\uFF1B\u6309\u8BC1\u636E\u5224\u65AD\u662F\u5426\u5361\u4F4F\uFF0C\u4E0D\u518D\u51ED\u5B57\u6570\n- **\u5B50\u4EE3\u7406\u6709\u8D26\u672C\u3002** \u6309\u5B50\u4EE3\u7406\u8BB0\u5F55\u5DE5\u5177\u6B21\u6570\u3001token \u548C\u91CD\u590D\u8BFB\u53D6\uFF1B\u652F\u6301\u65F6\u95F4\u9884\u7B97\u4E0E\u6536\u5C3E\u603B\u7ED3\u56DE\u5408\uFF0C\u53EA\u8BFB\u4EFB\u52A1\u4E0D\u518D\u88AB\u8981\u6C42\u6539\u6587\u4EF6\uFF1B`/parallel` \u6709\u5E76\u53D1\u4E0A\u9650\n- **\u66F4\u5B89\u5168\u3002** \u62E6\u622A\u8BEF\u6740\u81EA\u8EAB\u6216\u65E0\u5173\u8FDB\u7A0B\u7684 kill\uFF1B\u65B0\u589E AIza\u3001AKIA/ASIA\u3001glpat-\u3001hf_\u3001npm_\u3001xai- \u7B49\u683C\u5F0F\u53CA\u300C\u4E3B\u673A \u7528\u6237 \u5BC6\u7801\u300D\u4E09\u6BB5\u5F0F\u6253\u7801\uFF1B\u6539\u52A8 `~/.ssh`\u3001`~/.aws` \u7B49\u51ED\u636E\u8DEF\u5F84\u524D\u5148\u786E\u8BA4\n- **\u8BF7\u6C42\u4F53 gzip\u3002** \u7F51\u5173\u652F\u6301\u65F6\u8BF7\u6C42\u81EA\u52A8\u538B\u7F29\uFF0C\u9047\u5230 400/415 \u56DE\u9000\u5E76\u8BB0\u4F4F\u4E00\u5C0F\u65F6\uFF1B\u82E5\u5E72\u754C\u9762\u7EC6\u8282\u4FEE\u6574\n\n## 13.7.0 - 2026-10-21\n\n- **\u65E5\u8BB0\u91CD\u505A\uFF0C\u8F93\u51FA\u66F4\u5E72\u51C0\u3002** \u6BCF\u8F6E\u53EA\u51FA\u4E8B\u4EF6\uFF08\u5F00\u59CB\u3001\u5DE5\u5177\u5F00\u59CB\u4E0E\u7ED3\u675F\u3001\u6700\u7EC8\u56DE\u7B54\u3001\u7ED3\u675F\u539F\u56E0\uFF09\uFF0C\u65E5\u8BB0\u6587\u5B57\u7EDF\u4E00\u7531 pager \u751F\u6210\uFF1B\u7ED3\u5C3E\u4E00\u8F6E\u4E00\u884C\u3001\u5C5E\u4E8E\u672C\u8F6E\uFF0C\u5931\u8D25\u6216\u4E2D\u65AD\u65F6\u4E0D\u518D\u5199\u300C\u5B8C\u6210\u300D\uFF0C\u6D3B\u52A8\u6761\u4E0D\u518D\u6F0F\u51FA\u5185\u90E8\u7F16\u7801\n- **\u540E\u53F0\u4EFB\u52A1\u4E0D\u518D\u5237\u5C4F\u3002** \u76F8\u90BB\u7684\u540E\u53F0\u4EFB\u52A1\u901A\u77E5\u5408\u5E76\u6210\u4E00\u8F6E\u5904\u7406\uFF08\u5408\u5E76\u7A97\u53E3\u9ED8\u8BA4 1500ms\uFF09\uFF0C\u81EA\u52A8\u8DDF\u8FDB\u56DE\u5408\u5931\u8D25\u65F6\u53EA\u7559\u4E00\u6761\u53EF\u539F\u5730\u66F4\u65B0\u7684\u63D0\u793A\uFF0C\u4E0D\u518D\u753B\u6574\u5757\u5931\u8D25\u5361\n- **\u56DE\u5408\u6536\u5C3E\u5224\u5F97\u66F4\u51C6\u3002** \u4EE5\u300C\u6211\u4F1A\u2026\u300D\u300C\u63A5\u4E0B\u6765\u2026\u300D\u8FD9\u7C7B\u627F\u8BFA\u53E5\u7ED3\u5C3E\u7B97\u672A\u5B8C\u6210\uFF1B\u7B49\u5F85\u540E\u53F0\u4EFB\u52A1\u4E0D\u5224\u5931\u8D25\uFF1B\u76EE\u6807\u4E0D\u4F1A\u88AB\u77ED\u56DE\u590D\u6216\u4EFB\u52A1\u901A\u77E5\u5360\u4F4F\n- **\u7F51\u5173\u66F4\u7A33\u3002** \u91CD\u8BD5\u7EDF\u4E00\u8BA1\u5165\u4E00\u4E2A\u9884\u7B97\uFF0C\u4E0D\u518D\u51FA\u73B0\u91CD\u8BD5\u4E8C\u5341\u591A\u6B21\uFF1B\u91CD\u590D\u7684\u6D41\u4E8B\u4EF6\u53BB\u91CD\uFF1B\u5207\u5907\u7528\u65F6\u8DF3\u8FC7\u88C5\u4E0D\u4E0B\u5F53\u524D\u4E0A\u4E0B\u6587\u7684\u6A21\u578B\uFF1B\u517C\u5BB9 text/plain \u56DE\u590D\uFF1B\u7A7A text block \u4E0D\u518D\u5BFC\u81F4 400\uFF1B\u5B50\u4EE3\u7406\u88AB\u622A\u65AD\u540E\u4F1A\u7EED\u5199\n- **\u5907\u7528\u6A21\u578B\u63D0\u793A\u53EA\u51FA\u4E00\u6B21\u3002** \u6BCF\u4F1A\u8BDD\u6BCF\u5BF9\u6A21\u578B\u53EA\u63D0\u793A\u4E00\u6B21\u300C\u5DF2\u5207\u5230\u5907\u7528\u6A21\u578B B\uFF08A \u4E0D\u53EF\u7528\uFF09\u300D\uFF1B\u5E95\u680F\u7A84\u5C4F\u65F6\u5148\u7701\u6389 @effort \u7B49\u6807\u7B7E\uFF0C\u4FDD\u4F4F\u5B8C\u6574\u6A21\u578B\u540D\n- **\u5DE5\u5177\u66F4\u5BBD\u5BB9\u4E5F\u66F4\u5B89\u5168\u3002** Write / Grep \u63A5\u53D7\u5E38\u89C1\u53C2\u6570\u522B\u540D\u3001\u4E22\u6389\u591A\u4F59\u5B57\u6BB5\uFF1B\u5DF2\u6709\u6587\u4EF6\u662F GBK\u3001Shift-JIS \u7B49\u975E UTF-8 \u7F16\u7801\u65F6\u62D2\u7EDD\u5199\u5165\u5E76\u8BF4\u660E\u7F16\u7801\uFF0C\u4E0D\u6539\u539F\u5B57\u8282\n- **\u5361\u6B7B\u4E0E\u8FDB\u7A0B\u6536\u5F97\u5E72\u51C0\u3002** \u5361\u6B7B\u515C\u5E95\u5B88\u62A4\uFF1BBash \u6309\u8FDB\u7A0B\u7EC4\u767B\u8BB0\u5E76\u6574\u7EC4\u6E05\u7406\uFF1B\u9000\u51FA\u65F6\u540E\u53F0\u547D\u4EE4 1.5s \u5185\u5F3A\u6740\u4E14 SessionEnd \u5FC5\u8DD1\uFF1B\u53EA\u6740\u542F\u52A8\u5668\u65F6\u5B50\u8FDB\u7A0B\u4E0D\u518D\u6210\u5B64\u513F\n- **\u957F\u4F1A\u8BDD\u66F4\u7701\u3002** \u6BCF\u6B21\u66F4\u65B0\u4E0D\u518D\u91CD\u626B\u5168\u5BF9\u8BDD\uFF1B\u5DE5\u5177\u8F93\u51FA\u8D85\u8FC7 2000 \u884C\u843D\u76D8\u53EA\u7559\u6458\u8981\uFF1B\u65B0\u589E\u7ED3\u679C\u6865 `result.json`\n- **\u6743\u9650\u52A0\u56FA\u3002** \u85CF\u5728\u5B50\u547D\u4EE4\u3001\u5F15\u53F7\u6216\u53D8\u91CF\u91CC\u7684\u5371\u9669 `rm` \u4E5F\u4F1A\u62E6\uFF1B\u4FEE\u8865\u4E00\u6279 Bash \u5206\u6790\u7ED5\u8FC7\uFF1B\u6309 symlink \u7684\u771F\u5B9E\u843D\u70B9\u5224\u6743\u9650\uFF1Bplan \u6A21\u5F0F\u4E0B Bash \u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF1BMCP \u62A5\u9519\u91CC\u7684\u5BC6\u94A5\u5148\u6253\u7801\uFF1B\u65B0\u589E `--restricted` \u53EA\u8BFB\u6A21\u5F0F\n- **\u4EE5\u300C\u7406\u89E3\uFF1A\u300D\u5F00\u5934\u7684\u6700\u7EC8\u7B54\u6848\u4E0D\u518D\u88AB\u541E\u3002** \u91CD\u8BD5\u540E\u7B54\u6848\u4E0D\u4F1A\u6D88\u5931\uFF1B`/model` \u56DE\u6267\u53EA\u663E\u793A\u4E00\u6B21\u5E76\u5237\u65B0\u5E95\u680F\n\n## 13.6.0 - 2026-10-19\n\n- **\u5907\u7528\u94FE\u66F4\u53EF\u9760\u3002** \u9996\u5305\u8D85\u65F6\u6216\u5907\u7528\u6A21\u578B\u8FD4\u56DE 404 / 5xx \u65F6\uFF0C\u6CBF `CLAVUE_COMBO_FALLBACK`\uFF08\u9017\u53F7\u5206\u9694\uFF09\u5207\u5230\u4E0B\u4E00\u4E2A\u6A21\u578B\uFF0C\u8DF3\u8FC7\u540C\u5BB6\u65CF\u522B\u540D\uFF08`cn:deepseek-v4.1-flash` \u4E0D\u4F1A\u518D\u5207\u56DE `deepseek-v4-flash`\uFF09\u3002\u521A\u5931\u6548\u7684\u6A21\u578B 10 \u5206\u949F\u5185\u4E0D\u518D\u9009\uFF08`CLAVUE_MODEL_HEALTH_TTL_MS`\uFF09\uFF1B\u6574\u6761\u94FE\u90FD\u5931\u6548\u65F6\u56DE\u5230\u5B8C\u6574\u94FE\u3002\u4E3B\u6A21\u578B\u4E0A\u7684 502/503 \u4ECD\u6309\u539F\u6765\u7684\u4E24\u6B21\u9608\u503C\n- **\u5B58\u6863\u524D\u5BC6\u94A5\u6253\u7801\u3002** \u4F1A\u8BDD jsonl \u548C `history.jsonl` \u5199\u76D8\u524D\u906E\u6389 `sshpass -p`\u3001`SSHPASS=`\u3001`mysql -p` / `--password`\u3001`PGPASSWORD`\u3001`MYSQL_PWD`\u3001`curl -u`\u3001\u5E26\u8D26\u53F7\u5BC6\u7801\u7684 URL\u3001`Authorization: Bearer`\u3001`sk-` / `ghp_` \u5BC6\u94A5\u3001`password=`\u3001`*_PASS=` / `*_PWD=`\u3002\u6267\u884C\u4ECD\u7528\u539F\u547D\u4EE4\uFF1B`PWD=` / `$PWD` \u4E0D\u53D7\u5F71\u54CD\n- **\u663E\u5F0F\u8BE2\u95EE\u89C4\u5219\u4F18\u5148\u3002** `Bash(rm:*)` \u8FD9\u7C7B ask \u89C4\u5219\u547D\u4E2D\u590D\u5408\u547D\u4EE4\u91CC\u7684\u5B50\u547D\u4EE4\uFF08`rm \u2026 && ls`\uFF09\u65F6\uFF0C\u4E0D\u518D\u88AB\u5168\u5C40 `Bash` \u5141\u8BB8\u8986\u76D6\uFF1B\u9ED8\u8BA4\u6A21\u5F0F\u548C\u6C99\u7BB1\u6A21\u5F0F\u90FD\u751F\u6548\uFF0C`bypassPermissions` \u4ECD\u8C41\u514D\n- **\u5B50\u4EE3\u7406\u88AB\u62E6\u65F6\u8BF4\u6E05\u539F\u56E0\u3002** \u8D85\u8FC7 `CLAVUE_AGENT_MAX_DEPTH` \u65F6\u8FD4\u56DE\u7ED3\u6784\u5316\u7684 `<spawn_blocked>` \u8BF4\u660E\uFF0C\u63D0\u793A\u540C\u4E00\u8C03\u7528\u4F1A\u518D\u6B21\u88AB\u62E6\u3001\u8BF7\u5728\u5F53\u524D\u4F1A\u8BDD\u5B8C\u6210\u3002\u6DF1\u5EA6\u6309\u771F\u5B9E\u5D4C\u5957\u5C42\u6570\u8BA1\u7B97\n- **\u5DE5\u5177\u53C2\u6570\u5F62\u72B6\u4E0D\u5BF9\u4E0D\u518D\u5D29\u6E83\u3002** \u6A21\u578B\u628A `path` \u5199\u6210\u6570\u7EC4\u3001\u5BF9\u8C61\u6216\u6F0F\u5199\u65F6\uFF0C\u6D88\u606F\u6298\u53E0\u548C\u8BB0\u5FC6\u8DEF\u5F84\u5224\u65AD\u9000\u56DE\u539F\u59CB\u884C\u663E\u793A\uFF0C\u4E0D\u518D\u62A5 `The "path" argument must be of type string`\n- **\u8FDB\u51FA worktree \u771F\u6B63\u6E05\u6389 plans \u76EE\u5F55\u7F13\u5B58\u3002** \u4EE5\u524D\u7F13\u5B58\u6CA1\u88AB\u6E05\u6389\uFF0Cplans \u76EE\u5F55\u4E00\u76F4\u6307\u5411\u8FDB\u5165 worktree \u524D\u7684\u76EE\u5F55\uFF0C\u73B0\u5728\u4F1A\u8DDF\u7740\u5207\u6362\n\n## 13.5.0 - 2026-10-16\n\n- **\u56DB\u6863\u8DEF\u7531\u3002** \u89C4\u5219\u628A\u56DE\u5408\u5206\u6210 \u7B80\u5355 / \u4E00\u822C / \u590D\u6742 / \u957F\u7A0B\u3002\u62FF\u4E0D\u51C6\u65F6\u8BA1\u5212\u69FD\u6700\u591A\u60F3 1 \u79D2\uFF0C\u8D85\u65F6\u7B97\u4E00\u822C\u3002`/goal` \u662F\u957F\u7A0B\u3002`/mode` \u56FA\u5B9A\u6863\u4F4D\u3002`CLAVUE_TIERS=0` \u5173\u95ED\u3002\u6539\u8FC7\u7684\u6587\u4EF6\u8D85\u8FC7 5 \u4E2A\u5347\u5230\u81F3\u5C11\u590D\u6742\uFF0C\u8D85\u8FC7 15 \u4E2A\u5347\u5230\u957F\u7A0B\uFF1B\u7B80\u5355\u6863\u91CC\u8BF7\u6C42\u8D85\u8FC7 20 \u6B21\u5347\u5230\u4E00\u822C\uFF1B\u540C\u4E00\u6761\u68C0\u67E5\u5931\u8D25 3 \u6B21\u5347\u4E00\u6863\uFF1BJEV \u5224\u5B9A\u4E25\u91CD\u5347\u5230\u81F3\u5C11\u590D\u6742\u3002\u964D\u6863\u53EA\u53D1\u751F\u5728\u4E0B\u4E00\u8F6E\u5F00\u59CB\n- **\u7B80\u5355\u6863\u5C11\u505A\u3002** \u4E0D\u8DD1 REVIEW\uFF0C\u4E0D\u95EE\u4EA4\u4ED8\u88C1\u5224\uFF0C\u56DE\u5408\u7ED3\u675F\u4E0D\u7B49\u5F85\uFF0C\u7CFB\u7EDF\u63D0\u793A\u7528\u7CBE\u7B80\u7248\u3002\u5DE5\u5177\u53EA\u7559 10 \u4E2A\u6838\u5FC3\uFF0C`mcp__*` \u59CB\u7EC8\u4FDD\u7559\u3002\u4E00\u822C\u6863\u5BA1\u67E5\u7B49\u5F85\u6700\u591A 5 \u79D2\u3002\u590D\u6742\u548C\u957F\u7A0B\u6700\u591A 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\n- **\u72B6\u6001\u884C\u5E26\u6863\u4F4D\u3002** \u5728 `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42` \u540E\u52A0 `\u7B80\u5355`\u3002\u6362\u6863 15 \u79D2\u5185\u663E\u793A `\u7B80\u5355\u2192\u4E00\u822C`\n- **stdin \u5148\u770B 200ms\u3002** `-p` \u7B49\u7BA1\u9053\u7B2C\u4E00\u5B57\u8282\u9ED8\u8BA4 200ms\uFF08`CLAVUE_STDIN_PEEK_MS`\uFF0C0 \u4E0D\u7B49\uFF09\u3002MCP \u542F\u52A8\u8D5B\u8DD1\u4ECD\u662F 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF09\n\n## 13.4.2 - 2026-10-16\n\n- **\u8BA1\u65F6\u884C\u7528\u771F\u5B9E\u9636\u6BB5\u540D\u3002** \u8C03\u8BD5\u65E5\u5FD7\u4E0D\u518D\u628A\u6BCF\u4E00\u8DF3\u90FD\u5199\u6210 `sdk`\uFF0C\u800C\u662F `intake/jev`\u3001`plan`\u3001`scout`\u3001`main`\u3001`review`\u3001`compact`\u3001`subagent`\u3001`fanout` \u52A0\u4E0A\u6A21\u578B\u548C\u6BEB\u79D2\u3002\u72B6\u6001\u884C\u663E\u793A `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42`\n- **\u7F16\u6392\u5BF9\u9F50 v1\u3002** JEV intake \u5728\u56DE\u5408\u5F00\u59CB\u5C31\u53D1\u51FA\u53BB\uFF0C\u53EA\u5728\u8BA1\u5212\u8DF3\u4E4B\u524D\u7B49\u5F85\u3002\u77ED\u7EED\u5199\uFF08\u7EE7\u7EED\uFF09\u590D\u7528\u4E0A\u4E00\u8F6E\u5206\u7C7B\uFF1A0 \u6B21 JEV\u30010 \u6B21 PLAN\u3002\u8BA1\u5212\u8DF3\u81EA\u8EAB 30 \u79D2\u5230\u70B9\u5C31\u9759\u9ED8\u4E22\u6389\uFF08`CLAVUE_COMBO_PLAN_TIMEOUT_MS`\uFF09\uFF0C\u9996\u5305\u524D\u4ECD\u53EA\u7B49\u6700\u591A 1.8 \u79D2\u3002\u540C\u4E00\u4EFD\u8BA1\u5212\u53EA\u5BA1\u67E5\u4E00\u6B21\uFF0C\u8BA1\u5212\u6700\u591A\u4FEE\u8BA2\u4E00\u6B21\u3002`CLAVUE_COMBO_PLAN_HOP=0` \u4ECD\u53EF\u5173\u6389\u8BA1\u5212\u8DF3\n- **\u56DE\u5408\u7ED3\u675F\u7684\u5BA1\u67E5\u7B49\u5F85\u3002** \u914D\u7F6E\u9ED8\u8BA4\u4ECD\u662F 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\u3002\u7410\u788E\u56DE\u5408\u4E0D\u7B49\u5F85\uFF1B\u5176\u4F59\u56DE\u5408\u6700\u591A\u7B49 5 \u79D2\n- **\u51B7\u542F\u52A8\u4E0D\u6321 MCP\u3002** \u65E0\u5934\u6A21\u5F0F\u9ED8\u8BA4\u5728\u540E\u53F0\u8FDE\u63A5 MCP\uFF0C\u4E0D\u518D\u628A\u7B2C\u4E00\u8BF7\u6C42\u6321\u4F4F\u6700\u591A 8 \u79D2\u3002`CLAVUE_HEADLESS_MCP_BUDGET_MS=0` \u6062\u590D\u4E00\u76F4\u7B49\u5230\u8FDE\u5B8C\n- **JEV \u9274\u6743\u5931\u8D25\u8DE8\u8FDB\u7A0B\u8DF3\u8FC7\u3002** \u4E00\u6761 intake \u91CC\u4E24\u628A key \u90FD 401 \u5C31\u4F1A\u5199\u4E0B `jev-auth-fail.json`\u3002\u4E0B\u4E00\u4E2A\u8FDB\u7A0B\u5728 TTL \u5185\u4E0D\u518D\u53D1\u90A3\u4E24\u4E0B 401\n- **\u540E\u53F0\u8FDE\u4E0A\u7684 MCP \u4F1A\u8FDB\u540E\u7EED\u8BF7\u6C42\u3002** \u542F\u52A8\u65F6\u548C\u8FDE\u63A5\u8D5B\u8DD1\uFF0C\u9ED8\u8BA4\u6700\u591A 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF0C0 \u9A6C\u4E0A\u8FD4\u56DE\uFF09\u3002\u6BCF\u4E2A\u670D\u52A1\u5668\u8FDE\u4E0A\u5C31\u5199\u5165 headless store\u3002\u540C\u4E00\u56DE\u5408\u91CC\u4E0B\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u8C03\u7528 `refreshTools()` \u91CD\u8BFB `buildAllTools(getAppState())`\u3002`stickyToolsForTurn` \u4E0D\u518D\u56E0\u4E3A\u5DE5\u5177\u4E0D\u5728\u4E0A\u4E00\u8BF7\u6C42\u7684\u540D\u5355\u91CC\u5C31\u4E22\u6389 `mcp__*`\u3002\u6838\u5FC3\u5DE5\u5177\u9762\u4E5F\u4FDD\u7559 `mcp__*`\n- **\u6D41\u4E2D\u95F4\u5361\u4F4F\u4F1A\u6362\u5907\u7528\u6A21\u578B\u3002** \u804A\u5929\u6A21\u578B\u4EE5\u524D\u4E24\u4E2A chunk \u4E4B\u95F4\u53EF\u4EE5\u7A7A 180 \u79D2\uFF0C\u6240\u4EE5 -p \u91CC 81 \u79D2\u548C 147 \u79D2\u7684\u505C\u987F\u4E0D\u4F1A\u4E2D\u6B62\u3002\u73B0\u5728\u9ED8\u8BA4 60 \u79D2\uFF08`CLAVUE_API_STREAM_IDLE_TIMEOUT_MS`\uFF0C\u4E5F\u8BA4 `CLAVUE_STREAM_IDLE_TIMEOUT_MS`\uFF1B`CLAVUE_STREAM_WATCHDOG=0` \u5173\u95ED\uFF09\u3002\u5230\u70B9\u53D6\u6D88\u6D41\uFF08\u5DF2\u7ECF\u51FA\u8FC7\u5B57\u4E5F\u53D6\u6D88\uFF09\uFF0C\u4E22\u6389\u534A\u622A\u52A9\u624B\u6D88\u606F\uFF0C\u6309\u9996\u5305\u540C\u4E00\u6761\u5907\u7528\u94FE\u91CD\u8BD5\u4E00\u6B21\n- **\u8BA1\u5212\u8C03\u7528\u7684\u8BA1\u65F6\u884C\u5199 `plan`\u3002** \u9636\u6BB5\u6309\u8C03\u7528\u70B9\u7684 phase/role \u8BB0\uFF0C\u4E0D\u518D\u56E0\u4E3A querySource \u662F `sdk` \u5C31\u5168\u90E8\u5199\u6210 `main`\u3002scout / review \u540C\u7406\n\n## 13.4.1 - 2026-10-16\n\n- **\u9996\u5305\u8D85\u65F6\u6362\u5907\u7528\u6A21\u578B\u3002** \u9ED8\u8BA4\u7B49\u5F85\u4ECE 90 \u79D2\u964D\u5230 45 \u79D2\uFF08`CLAVUE_API_FIRST_BYTE_TIMEOUT_MS`\uFF0C0 \u5173\u95ED\uFF09\uFF0C\u6D41\u5F0F\u548C\u672C\u5730\u975E\u6D41\u5F0F\uFF08\u542B 127.0.0.1\uFF09\u90FD\u8BA1\u65F6\u3002\u8D85\u65F6\u540E\u4E0D\u518D\u91CD\u8BD5\u540C\u4E00\u4E2A\u6A21\u578B\uFF0C\u6539\u5207\u5907\u7528\uFF1Aprofile \u7684 `fallback`\u3001\u7136\u540E `CLAVUE_COMBO_FALLBACK`\u3001\u7136\u540E ttqq \u9ED8\u8BA4 `cn:deepseek-v4.1-flash`\uFF1B`off` \u5173\u95ED\u3002\u72B6\u6001\u884C\u663E\u793A `\u7B49\u5F85\u6A21\u578B\u9996\u5305 Ns`\u3002\u540E\u53F0\u8C03\u7528\u9ED8\u8BA4\u6700\u591A 20 \u79D2\uFF08`CLAVUE_SIDE_CALL_TIMEOUT_MS`\uFF0Cplan/review \u4E0D\u5957\u8FD9\u5C42\u4E0A\u9650\uFF09\n- **JEV \u4E0E FastApply \u51ED\u8BC1\u94FE\u3002** \u73B0\u6709\u987A\u5E8F\u4E4B\u540E\u8865\u4E0A\u5DF2\u767B\u5F55\u8D26\u53F7 key\uFF08`auth.json`\uFF0C\u542B `https://api.clavue.com::client` \u8FD9\u79CD\u6309\u4E3B\u673A\u5B58\u653E\u7684\u6761\u76EE\uFF09\u548C\u672C\u673A\u8BBE\u5907 key\uFF08`official-device-key.json`\uFF09\u3002\u914D\u7F6E\u76EE\u5F55\u8DDF\u968F `CLAVUE_CONFIG_DIR`\u3002\u53EA\u53D1\u7ED9 api.clavue.com\u3002\u67D0\u4E00\u7EA7\u8FD4\u56DE 401 \u5C31\u8BD5\u4E0B\u4E00\u7EA7\uFF0C\u5E76\u8BB0\u4E0B\u65B0\u6765\u6E90\uFF08`key source=auth.json:https://api.clavue.com::clavue-gui`\uFF09\u3002`/provider current` \u5217\u51FA\u6574\u6761\u94FE\u548C\u6BCF\u4E00\u7EA7\u662F\u5426\u627E\u5230\u3002\u540C\u4E00\u8BF7\u6C42 1 \u79D2\u5185\u4E0D\u53D1\u7B2C\u4E8C\u6B21\uFF0C\u6362 key \u9664\u5916\u3002\u5168\u90E8 401 \u65F6\u7EC8\u7AEF\u53EA\u6253\u4E00\u884C\u4E2D\u6587\u4FEE\u590D\u63D0\u793A\uFF0C\u4E0D\u518D\u6A21\u62DF\u5224\u5B9A\u3002\u5224\u5B9A\u5931\u8D25\u4F1A\u8BB0\u4F4F\u4E00\u5C0F\u6BB5\u65F6\u95F4\uFF08`CLAVUE_JEV_AUTH_FAIL_TTL_MS`\uFF0C\u9ED8\u8BA4 10 \u5206\u949F\uFF09\uFF0C\u8FD9\u6BB5\u65F6\u95F4\u91CC\u4E0D\u518D\u53D1 intake\n- **`provider current` \u8BFB\u53D6 settings.json \u7684 env\u3002** JEV/FA \u72B6\u6001\u4E0D\u518D\u56E0\u4E3A\u53EA\u5199\u5728 settings \u91CC\u800C\u663E\u793A off\u3002\u5DF2\u4FDD\u5B58\u7684\u7EBF\u8DEF\u662F\u5F53\u524D\u8DEF\u7531\u65F6\uFF0C\u4E0D\u518D\u663E\u793A `Current API config: None`\n- **DeepSeek \u63A8\u7406 token \u4E0D\u518D\u91CD\u590D\u8BA1\u5165\u4E0A\u4E0B\u6587\u3002** `reasoning_tokens` \u662F `completion_tokens` \u7684\u5B50\u96C6\uFF1B\u7F51\u5173\u628A\u4E24\u8005\u76F8\u52A0\u5199\u8FDB `output_tokens` \u65F6\u6309 completion \u8BA1\u3002\u540C\u4E00\u56DE\u590D\u62C6\u5F00\u7684\u601D\u8003\u5757\u4E0D\u518D\u88AB\u4F30\u7B97\u7B2C\u4E8C\u904D\n- **\u9632\u538B\u7F29\u98CE\u66B4\u3002** \u540C\u4E00\u6A21\u578B\u5BB6\u65CF\u91CC\u6362\u6A21\u578B\u3001\u7A97\u53E3\u6CA1\u6709\u53D8\u5C0F\u65F6\uFF0C\u4E0A\u4E0B\u6587\u6CA1\u5230\u65B0\u6A21\u578B\u9608\u503C\u5C31\u4E0D\u538B\u7F29\u3002\u6458\u8981\u6309 `CLAVUE_AUTO_COMPACT_MODEL` \u2192 light \u2192 FA \u2192 \u4E3B\u6A21\u578B\uFF0C\u6BCF\u4E2A\u6A21\u578B\u9650\u65F6 90 \u79D2\uFF08`CLAVUE_AUTO_COMPACT_TIMEOUT_MS`\uFF09\u3002\u4E0A\u4E0B\u6587\u4E0D\u5230 token \u9608\u503C 30% \u65F6\uFF0C\u5185\u5B58\u538B\u529B\u53EA\u6E05\u7F13\u5B58\uFF0C\u4E0D\u8DD1\u538B\u7F29\u3002\u7B2C\u4E09\u65B9\u7EBF\u8DEF\u4E0D\u4F1A\u9ED8\u8BA4\u53BB\u8C03 `clavue-2.1-fast` / `clavue-2.1` / `clavue-2.1-pro`\uFF1B\u53EA\u6709\u5B98\u65B9\u4E91\uFF0C\u6216\u4F60\u7528 `CLAVUE_COMBO_LIGHT` / `CLAVUE_AUTO_COMPACT_MODEL` \u8FD9\u7C7B\u73AF\u5883\u53D8\u91CF\u5199\u660E\uFF0C\u624D\u4F1A\u8D70\u8FD9\u4E9B id\n- **\u4EE3\u7801\u56DE\u5408\u5C11\u7B49\u524D\u7F6E\u8DF3\u3002** \u8BA1\u5212\u8DF3\u9ED8\u8BA4\u6700\u591A\u5360\u9996\u5305\u524D 1.8 \u79D2\uFF08`CLAVUE_SCOUT_TIMEOUT_MS`\uFF0C`CLAVUE_COMBO_PLAN_BLOCK=1` \u6062\u590D\u4E00\u76F4\u7B49\uFF09\u3002\u72EC\u7ACB\u7684\u8BA1\u5212\u69FD\u5E76\u884C\uFF0C\u8D85\u65F6\u4E0D\u518D\u4E32\u884C\u6362\u4E0B\u4E00\u4E2A\u6A21\u578B\u3002\u8C03\u8BD5\u65E5\u5FD7\u4E00\u884C `stage -> model -> ms`\n- **ttqq \u9884\u8BBE\u4E0D\u518D\u5185\u7F6E `clavue-2.1-fast`\u3002** \u8F7B\u91CF\u69FD\u7559\u7A7A\uFF0C\u8F85\u52A9\u8C03\u7528\u8DDF\u7740\u4E3B\u6A21\u578B\uFF0C\u9664\u975E\u4F60\u81EA\u5DF1\u6307\u5B9A\n- **\u7B2C\u4E09\u65B9 JEV fan-out\u3002** \u8C03\u7528\u65B9\u6CA1\u6709\u6307\u5B9A\u6A21\u578B\u65F6\u4E0D\u518D\u585E\u9ED8\u8BA4 `clavue-jev`\n\n## 13.4.0 - 2026-10-16\n\n- **\u4F4E\u98CE\u9669 clavue-v1 \u5BF9\u9F50\uFF08#8\uFF09\u3002** \u6062\u590D\u4F1A\u8BDD\u3001\u5806\u9876\u3001\u6EA2\u51FA\u3001print \u6536\u5C3E\u4E0E goal \u95F8\u95E8\u4ECE clavue-v1 \u8FC1\u5165\n- **1.48.5 \u4E4B\u540E\u7684\u5BF9\u9F50\uFF08#9\uFF09\u3002** \u8FC1\u5165 clavue-v1 1.48.7\uFF0C\u5E76\u7F13\u5B58\u7A33\u5B9A\u7684 system \u524D\u7F00\n- **\u53EF\u9009\u7684\u539F\u751F fetch \u5BA2\u6237\u7AEF\uFF08#10\uFF09\u3002** `CLAVUE_NATIVE_CLIENT` \u672A\u8BBE\u7F6E\u65F6\u4ECD\u8D70\u539F\u6709\u4F20\u8F93\uFF1B\u8BBE\u7F6E\u540E\u6539\u7528\u57FA\u4E8E fetch \u7684\u5BA2\u6237\u7AEF\n- **\u53EF\u9009\u7684 Rust napi \u70ED\u8DEF\u5F84\uFF08#11\uFF09\u3002** `CLAVUE_NATIVE_RS` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u672A\u8BBE\u7F6E\u65F6\u4E0D\u52A0\u8F7D addon\n- **\u53EF\u9009\u7684 fast-apply\uFF08#12\uFF09\u3002** `clavue-fa` \u7684 ApplyEdit \u9ED8\u8BA4\u5173\u95ED\n- **\u53EF\u9009\u7684 JEV \u51B3\u7B56\u95E8\uFF08#14\uFF09\u3002** \u6302\u5728\u5171\u4EAB aux \u69FD\u4E0A\uFF0C\u9ED8\u8BA4\u4E0D\u542F\u7528\n- **\u7EC4\u5408\u6210\u672C\u95F8\u4E0E\u8F93\u51FA\u536B\u751F\uFF08#13\uFF09\u3002** \u4ECE clavue-v1 \u8FC1\u5165\uFF1B\u536B\u751F\u9ED8\u8BA4\u5173\u95ED\uFF0C\u88C1\u526A\u524D\u7F00\u4FDD\u6301\u7A33\u5B9A\n- **JEV / ApplyEdit \u5B9E\u673A\u4FEE\u590D\uFF08#15\uFF09\u3002** \u505C\u6389 JEV \u7684 follow-up \u5FAA\u73AF\uFF0C\u5E76\u4FEE\u6389 ApplyEdit \u7684 bundle \u5D29\u6E83\n- **\u53EF\u9009\u6548\u7387\u5305\uFF08#16\uFF09\u3002** `CLAVUE_EFFICIENCY` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u6253\u5F00\u540E\u5305\u542B\u5E76\u884C JEV\n- **\u6BCF\u56DE\u5408\u5F00\u9500\uFF08#17\uFF09\u3002** \u957F\u4F1A\u8BDD\u7684\u6BCF\u56DE\u5408\u5DE5\u4F5C\u4E0D\u518D\u626B\u5B8C\u6574\u5386\u53F2\uFF1Bpager \u6BCF\u5E27\u53EA\u68C0\u67E5\u7A97\u53E3\u5185\u7684 journal \u6233\n- **\u65B0\u80FD\u529B\u5168\u90E8\u9ED8\u8BA4\u5173\u95ED\u3002** `CLAVUE_NATIVE_CLIENT`\u3001`CLAVUE_NATIVE_RS`\u3001`clavue-fa`\u3001JEV\u3001\u7EC4\u5408\u6210\u672C\u4E0E\u8F93\u51FA\u536B\u751F\u3001`CLAVUE_EFFICIENCY` \u90FD\u8981\u663E\u5F0F\u6253\u5F00\u624D\u751F\u6548\n\n## 13.3.3 - 2026-09-29\n\n- **Esc\xD72 \u56DE\u9000\u9009\u62E9\u6846\u56DE\u6765\u4E86\u3002** \u53CC\u51FB Esc \u7684\u56DE\u9000\u300C\u9009\u62E9\u6846\u300D\u6B64\u524D\u4F1A\u5BF9\u5DF2\u7ECF\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\n \u5224\u5B9A\u6210 0 \u4E2A\u6539\u52A8\uFF0C\u4E8E\u662F\u628A\u5B83\u5F53\u6210\u6253\u9519\u7684\u7A7A\u56DE\u5408\u76F4\u63A5\u64A4\u56DE\uFF0C\u9009\u62E9\u5217\u8868\u6839\u672C\u4E0D\u518D\u51FA\u73B0\u3002\n \u6839\u56E0\u662F\u56DE\u9000\u7528\u7684\u6539\u52A8\u8BA1\u6570\u662F\u81EA\u5DF1\u7EF4\u62A4\u7684\u4E00\u5957\u5C0F\u5199\u5B50\u4E32\u5339\u914D\uFF08`edit ` / `write `\uFF09\uFF0C\n \u8BA4\u4E0D\u51FA\u5F53\u524D\u5DE5\u5177\u810A\u67F1\u7684\u771F\u5B9E\u5F62\u6001 `Update(path)` / `Create(path)` / `Write(path)`\u3002\n \u73B0\u5728\u8BA1\u6570\u6539\u8D70\u552F\u4E00\u7684\u7F16\u8F91\u5224\u5B9A `journal_format::is_edit_tool_label`\uFF0C\n \u4E0E\u4EA4\u4ED8\u6C47\u603B\u5171\u7528\u540C\u4E00\u6743\u5A01\uFF1A\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\u7167\u5E38\u5F39\u51FA\u9009\u62E9\u6846\uFF0C\n \u771F\u6B63\u6CA1\u6539\u52A8\u7684\u56DE\u5408\u4ECD\u6309\u7A7A\u56DE\u5408\u5373\u65F6\u64A4\u56DE\n- **\u53EA\u4FEE\u5206\u7C7B\uFF0C\u4E0D\u6539\u4EA4\u4E92\u3002** \u9009\u62E9\u6846\u7684\u7ED8\u5236\u3001\u952E\u76D8/\u9F20\u6807\u547D\u4E2D\u3001ModeSelect \u5355\u9009\u5168\u90E8\u4FDD\u6301\u539F\u6837\uFF1B\n \u672C\u6B21\u4EC5\u8BA9\u300C\u54EA\u4E9B\u56DE\u5408\u7B97\u6539\u8FC7\u6587\u4EF6\u300D\u8FD9\u4E00\u5904\u5224\u5B9A\u6062\u590D\u6B63\u786E\n\n## 13.3.2 - 2026-09-29\n\n- **\u5347\u7EA7\u6210\u529F\u540E\u76F4\u63A5\u8FDB\u5165\u754C\u9762\uFF0C\u4E0D\u518D\u8981\u6C42\u5B8C\u5168\u9000\u51FA\u3002** Node duplex \u5BBF\u4E3B\u662F\u9876\u5C42\u8FDB\u7A0B\uFF0C\n \u542F\u52A8\u65F6\u53EA\u89E3\u6790\u4E00\u6B21 `agentEntry` / `pagerBin`\uFF1B\u540E\u53F0 `npm install -g` \u6362\u6389\u4E86\u78C1\u76D8\u4E0A\u7684\n \u65B0\u7248\u672C\uFF0C\u5185\u5B58\u91CC\u4ECD\u662F\u65E7\u4EE3\u7801\uFF0C\u4E8E\u662F\u53EA\u80FD\u9760\u7528\u6237\u624B\u52A8\u9000\u51FA\u91CD\u8FDB\u3002\u73B0\u5728\u5BBF\u4E3B\u5728\u5347\u7EA7\u6210\u529F\u540E\n \u539F\u5730\u91CD\u6267\u884C\u81EA\u5DF1\uFF1Apager \u5148\u6309\u6B63\u5E38\u8DEF\u5F84\u9000\u51FA\uFF08\u79BB\u5F00 raw mode\u3001\u6062\u590D\u5C4F\u5E55\uFF09\uFF0CCLI \u5165\u53E3\n \u5728 pager \u91CA\u653E TTY \u540E\u518D\u8D77\u65B0\u8FDB\u7A0B\u3002\u5B88\u536B `CLAVUE_SESSION_RELAUNCH=1` \u9632\u6B62\u91CD\u6267\u884C\u5FAA\u73AF\uFF0C\n `CLAVUE_DISABLE_SESSION_RELAUNCH=1` \u53EF\u5173\u95ED\uFF1B\u6D4B\u8BD5/\u5F00\u53D1\u8FD0\u884C\u65F6\u62D2\u7EDD\u91CD\u6267\u884C\n- **\u9996\u6B21\u914D\u7F6E\u88C5\u8F7D\u540E\u540C\u6837\u539F\u5730\u8FDB\u5165\u754C\u9762\u3002** `routeTrack`\uFF08\u627F\u8F7D `needsSetup` /\n `officialReady`\uFF09\u6B64\u524D\u53EA\u5728\u542F\u52A8\u65F6\u53D1\u9001\u4E00\u6B21\uFF0C\u4E8E\u662F\u5728\u7EBF\u8DEF / BYOK \u9762\u677F\u4FDD\u5B58\u540E\uFF0C\n pager \u7684\u9996\u6B21\u914D\u7F6E\u83DC\u5355\u4E00\u76F4\u9501\u7740\uFF0C\u5FC5\u987B\u9000\u51FA\u91CD\u8FDB\u624D\u6D88\u5931\u3002\u73B0\u5728\u9762\u677F\u4FDD\u5B58\u91CD\u542F agent \u65F6\n \u4E00\u5E76\u91CD\u53D1 `routeTrack`\uFF0C\u754C\u9762\u5F53\u6B21\u4F1A\u8BDD\u5373\u89E3\u9501\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.3 - 2026-09-29\n\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.2 - 2026-09-20\n\n- \u539F\u751F pager \u53D1\u5E03\u95E8\u7981\u53D6\u771F\uFF1Astaged \u4E8C\u8FDB\u5236\u5FC5\u987B\u5185\u5D4C\u5F53\u524D pager \u6E90\u7801\u6458\u8981\n \uFF08`--build-info` JSON \u5F62\u72B6\u7684 `sourceDigest` \u5B57\u6BB5\uFF0C\u951A\u5B9A `"sourceDigest":"<64 hex>"`\uFF09\uFF0C\n \u65E7\u6E90\u7801\u7F16\u8BD1\u51FA\u7684\u4E8C\u8FDB\u5236\u5373\u4F7F\u54C8\u5E0C\u81EA\u6D3D\u4E5F\u4F1A\u88AB\u62D2\u7EDD\uFF0C\u4E0D\u518D\u9760\u4EC5\u81EA\u6D3D\u7684 manifest \u54C8\u5E0C\u653E\u884C\n- manifest \u6EAF\u6E90\u6539\u4E3A\u6309\u5E8F\u89E3\u6790\u800C\u975E\u9759\u9ED8\u7701\u7565\uFF1A`CLAVUE_RELEASE_SOURCE_COMMIT` \u2192\n `GITHUB_SHA` \u2192 `git rev-parse HEAD`\uFF1B`releaseTag` \u672A\u8BBE\u65F6\u56DE\u843D\u4E3A `v${version}`\uFF0C\n \u672C\u5730\u53D1\u5E03\u6784\u5EFA\u4E0D\u518D\u4E22\u5931\u53D1\u5E03\u95E8\u7981\u6240\u9700\u5B57\u6BB5\n- \u8FD0\u884C\u65F6\u4E0E pager \u4EA7\u7269\u4E0D\u53D8\uFF1A`dist/native` \u4E8C\u8FDB\u5236\u6CBF\u7528 13.2.1\uFF0C\u4EC5 `manifest.json`\n \u6EAF\u6E90\u4E0E\u95E8\u7981\u63A5\u7EBF\u53D8\u66F4\n\n## 13.2.1 - 2026-09-20\n\n- \u65E5\u8BB0\u7EB5\u5411\u8282\u594F\u6539\u4E3A\u4E24\u7EA7\uFF1A\u6BB5\u843D\u8FB9\u754C\uFF08\u65B0\u7684\u7528\u6237\u56DE\u5408\u3001Recap \u524D\uFF09\u5728\u6807\u51C6\u9AD8\u5EA6\u547C\u5438\u4E24\u884C\uFF0C\n \u6BB5\u5185\u5206\u7EC4\u7684\u547C\u5438\u4FDD\u6301\u4E00\u884C\uFF1Bcompact \u4E0B\u6240\u6709\u95F4\u9699\u4ECD\u4E3A\u4E00\u884C\uFF0C\u5BC6\u5EA6\u4E0D\u6D6A\u8D39\u4EFB\u4F55\u4E00\u884C\u3002\n \u7EC8\u7AEF\u6CA1\u6709\u5B57\u4F53\u884C\u9AD8\uFF0C\u8282\u594F\u53EA\u80FD\u6765\u81EA\u95F4\u9699\u5206\u7EA7\u4E0E\u5185\u8FB9\u8DDD\uFF0C\u8FD9\u6761\u89C4\u5F8B\u73B0\u5DF2\u5199\u5165 J8 \u800C\u975E\u6BCF\u6B21\u91CD\u65B0\u53D1\u73B0\n- \u9996\u5C4F\u6539\u4E3A compose-first\uFF1A\u5DF2\u914D\u7F6E\u7EBF\u8DEF\u65F6\uFF0C\u8F93\u5165\u6846\u4E3A\u7A7A\u6309 Enter \u76F4\u63A5\u5F00\u65B0\u4F1A\u8BDD\uFF08\u9879\u76EE\u9009\u62E9\u4ECD\u751F\u6548\uFF09\uFF0C\n \u63D0\u793A\u6587\u6848\u6539\u4E3A\u300CEnter \u5F00\u5DE5\u300D\uFF1B\u9996\u6B21\u8FD0\u884C\u4FDD\u7559\u786E\u8BA4\u8BED\u4E49\u2014\u2014\u7EBF\u8DEF\u5FC5\u987B\u5148\u5B58\u5728\uFF0C\u4F1A\u8BDD\u624D\u53EF\u80FD\u5F00\u59CB\n- \u9996\u5C4F\u8BB0\u4F4F\u6700\u8FD1\u4E09\u4E2A\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u663E\u793A\u5728\u4FE1\u606F\u677F\u4E0B\u65B9\uFF0C\u6309 1-3 \u76F4\u63A5\u91CD\u5F00\u3002\u663E\u793A\u7684 cwd \u53D6\u81EA\u4F1A\u8BDD\u8BB0\u5F55\u91CC\n \u5199\u5165\u7684 cwd \u5B57\u6BB5\uFF0C\u7EDD\u4E0D\u7531\u76EE\u5F55 slug \u53CD\u89E3\uFF08slug \u6709\u635F\uFF1A\u8DEF\u5F84\u5206\u9694\u7B26\u4E0E\u8FDE\u5B57\u7B26\u4E0D\u53EF\u533A\u5206\uFF09\uFF1B\n \u4E34\u65F6\u76EE\u5F55\u3001\u5BB6\u76EE\u5F55\u4E0E\u8BB0\u5F55\u5B58\u653E\u76EE\u5F55\u672C\u8EAB\u90FD\u88AB\u6392\u9664\n- \u95E8\u7981\u53D6\u771F\uFF1A\u4E24\u4E2A pager/broker \u6D4B\u8BD5\u4E0D\u518D\u8BFB\u5F00\u53D1\u673A\u672C\u5730\u7684 review model \u8986\u5199\uFF0C\n \u4E2A\u4EBA\u8BBE\u7F6E\u91CC\u7684 pin \u4E0D\u80FD\u518D\u628A\u53D1\u5E03\u95E8\u7981\u5224\u7EA2\n- \u6E90\u7801\u7EA7\u5224\u65AD\u57FA\u5E95\uFF08\u4E0D\u968F\u672C\u5305\u53D1\u5E03\uFF09\uFF1Alaziness / intent / verify-green \u4E09\u6761\u65E2\u6709\u89C4\u5219\u5730\u677F\u4E4B\u4E0B\n \u5404\u6709\u4E00\u4E2A\u7C7B\u578B\u5316\u5224\u65AD\u5C42\uFF0C\u9ED8\u8BA4\u4F11\u7720\uFF08\u672A\u8BBE TYPESAFE_API_KEY \u5373\u5B8C\u5168\u4E0D\u52A8\uFF09\u3002\n \u5B83\u5728 8.16.1 \u7684\u4EA7\u7269\u91CC\u662F\u60F0\u6027\u7684\u2014\u2014\u8BE6\u89C1\u53D1\u5E03\u8BF4\u660E\u7684 Known \u4E00\u8282\n\n## 13.2.0 - 2026-09-19\n\n- `/release-notes` \u79BB\u7EBF\u53EF\u7528\uFF1A\u6784\u5EFA\u671F\u628A `CHANGELOG.md` \u6CE8\u5165 `MACRO.VERSION_CHANGELOG`\n \uFF08\u6B64\u524D\u6052\u4E3A\u7A7A\u4E32\uFF09\uFF0C\u7F13\u5B58\u672A\u547D\u4E2D\u65F6\u56DE\u843D\u5230\u5185\u7F6E\u526F\u672C\u800C\u975E `""`\uFF0C\u5168\u65B0\u5B89\u88C5\u9996\u6B21\u8FD0\u884C\u5373\u53EF\u770B\u5230\u771F\u5B9E\u6761\u76EE\n- `/release-notes` \u7684\u94FE\u63A5\u4E0E\u540E\u53F0 fetch \u6B64\u524D\u90FD\u6307\u5411 anthropics/claude-code\uFF0C\u6539\u4E3A\u6307\u5411 Clavue \u81EA\u8EAB\u4ED3\u5E93\uFF1B\n \u547D\u4EE4\u6539\u4E3A\u5148\u8BFB\u672C\u5730\u5185\u5BB9\u3001\u628A\u7F51\u7EDC\u5F53\u4F5C\u4E0B\u6B21\u5237\u65B0\u7684\u6765\u6E90\uFF0C\u4E0D\u518D\u4E3A I/O \u963B\u585E\u7B54\u6848\n- hop \u6B63\u6587\u6536\u655B\uFF1A\u8FDE\u7EED\u91CD\u590D\u884C\u6298\u53E0\u4E3A\u9996\u5C3E\u4E24\u884C\u5E76\u6CE8\u660E\u7701\u7565\u6761\u6570\uFF08\u8FDE\u7EED\u4E24\u884C\u5C5E\u6B63\u5E38\u4E66\u5199\uFF0C\u4E0D\u5904\u7406\uFF09\uFF0C\n \u8D85\u957F\u6B63\u6587\u6539\u4E3A\u4FDD\u7559\u9996\u5C3E\u800C\u975E\u53EA\u7559\u5934\u90E8\uFF0C\u5E76\u6CE8\u660E\u539F\u59CB\u957F\u5EA6\uFF0C\u907F\u514D\u622A\u65AD\u540E\u7684\u6B63\u6587\u88AB\u8BEF\u8BFB\u4E3A\u672C\u6765\u5C31\u8FD9\u4E48\u77ED\n- Tips \u8FDC\u7A0B feed\uFF1A\u6587\u6848\u53EF\u5728\u4E0D\u53D1\u7248\u7684\u60C5\u51B5\u4E0B\u66F4\u6B63\u3002feed \u5C5E\u4E0D\u53EF\u4FE1\u8F93\u5165\uFF0C\u6309\u767D\u540D\u5355\u6821\u9A8C\u2014\u2014\n \u5FC5\u987B\u58F0\u660E\u672C\u4EA7\u54C1\u3001URL \u5FC5\u987B\u4E3A https\u3001\u5B57\u7B26\u4E32\u957F\u5EA6\u8BBE\u4E0A\u9650\uFF1B\u5355\u6761\u7578\u5F62\u6761\u76EE\u53EA\u4E22\u5F03\u81EA\u8EAB\uFF0C\u4E0D\u5F71\u54CD\u5176\u4F59\u6761\u76EE\u3002\n \u6761\u76EE\u590D\u7528\u65E2\u6709\u51B7\u5374\u673A\u5236\u5E76\u4F7F\u7528\u547D\u540D\u7A7A\u95F4 id\uFF0C\u4E0E\u5185\u7F6E\u63D0\u793A\u4E92\u4E0D\u5E72\u6270\uFF1B\u5931\u8D25\u5168\u7A0B\u9759\u9ED8\uFF0C\u7F51\u7EDC\u95EE\u9898\u4E0D\u4F1A\u53D8\u6210\u62A5\u9519\u6216\u62D6\u6162\u56DE\u5408\n- Tips \u63D0\u793A\u6B64\u524D\u4E0D\u53EF\u8FBE\u800C\u975E\u8FC7\u671F\uFF1A`getRelevantTips` \u7684\u552F\u4E00\u8C03\u7528\u65B9\u4E22\u5F03\u4E86\u7ED3\u679C\uFF0C`getTipToShowOnSpinner`\n \u65E0\u4EFB\u4F55\u8C03\u7528\u65B9\uFF0C`contextTipsActive` \u6052\u4E3A `false` \u4E14\u4ECE\u672A\u8D4B\u503C\u3002\u6539\u4E3A\u5728\u6E32\u67D3\u63D0\u793A\u7684 Spinner \u5185\u90E8\u9009\u53D6\u63D0\u793A\n\n## 13.1.5 - 2026-09-14\n\n- \u4FA7\u67E5\u8BE2\uFF08plan/review hop\u3001\u5206\u7C7B\u5668\u3001\u8BB0\u5FC6\u68C0\u7D22\u3001\u8BC1\u636E\u6536\u636E\uFF09\u6539\u4E3A\u6D41\u5F0F\uFF1A\u4E0D\u518D\u53D1 `stream:false` \u7684\n `/v1/chat/completions`\uFF0C\u907F\u514D\u6DF1\u5EA6\u63A8\u7406\u6A21\u578B\u5728\u7F51\u5173 600 \u79D2\u4EE3\u7406\u5899\u4E0A\u88AB\u6390\u65AD\n- \u4FA7\u67E5\u8BE2\u7684 `effort` \u771F\u6B63\u843D\u5230 `output_config.effort`\uFF1A\u6B64\u524D\u8BE5\u5B57\u6BB5\u672A\u5728\u9009\u9879\u7C7B\u578B\u4E0A\u58F0\u660E\uFF0C\n \u8C03\u7528\u65B9\u5C55\u5F00\u4F20\u503C\u4E0D\u4F1A\u89E6\u53D1\u7C7B\u578B\u68C0\u67E5\uFF0C\u503C\u88AB\u9759\u9ED8\u4E22\u5F03\uFF0C\u7F51\u5173\u9000\u56DE\u81EA\u8EAB\u9ED8\u8BA4\u6863\n- \u8BCA\u65AD\u7C7B Bash/PowerShell \u65E5\u5FD7\u8D70 light \u69FD\u8BC1\u636E\u6536\u636E\uFF1A\u5F15\u7528\u5FC5\u987B\u5728\u539F\u6587\u9010\u5B57\u8282\u547D\u4E2D\uFF0C\u5426\u5219\u4FDD\u7559\u539F\u65E5\u5FD7\uFF1B\n `CLAVUE_EVIDENCE_REDUCER=0` \u5173\u95ED\n- \u5927 Read/Grep/Glob \u9996\u6B21\u4ECD\u7ED9\u5168\u6587\uFF0C\u4E4B\u540E\u51BB\u6210 `clavue_observation_v1` \u5360\u4F4D\uFF0C\u7528 ObsRecall \u5206\u9875\u53EC\u56DE\uFF1B\n `CLAVUE_OBS_PACK=0` \u5173\u95ED\n- \u56DE\u5408\u6309 trivial/research/implement/heavy \u8C03\u5EA6 hop\uFF1B\u4E3B\u69FD model/effort \u7C98\u4F4F\u4EE5\u4FDD\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\n \u4EC5 compact \u540E\u4E14\u540C\u7C7B\u8FDE\u7EED\u4E24\u8F6E\u624D\u8003\u8651\u6539 effort\n- Plan hop \u7684 DSML \u7B49\u672A\u89E3\u6790\u5DE5\u5177\u65B9\u8A00\u4ECE Thought \u5C55\u793A\u4E0E plan/review \u4E0A\u4E0B\u6587\u4E00\u5E76\u5265\u79BB\uFF0C\u6574\u5757\u5220\u9664\uFF0C\n \u4E0D\u5199\u5165 transcript \u4E5F\u4E0D\u704C\u8FDB\u4E3B\u6A21\u578B\n- \u4ECE\u771F\u5B9E prompt-too-long \u62D2\u7EDD\u4E2D\u5B66\u4E60\u6BCF\u4E2A\u6A21\u578B\u7684\u5B9E\u9645\u8F93\u5165\u4E0A\u9650\uFF0C\u53EA\u6536\u7D27\u4E0D\u653E\u5927\u7A97\u53E3\uFF1B\u7F51\u5173\u53EA\u62A5\n `prompt_tokens` / `completion_tokens` \u65F6\u7528\u91CF\u4E0D\u518D\u5168\u6620\u5C04\u6210 0\n- Edit \u53EF\u9009 `then_run`\uFF1A\u4EC5\u5141\u8BB8\u5355\u6761\u8BCA\u65AD\u547D\u4EE4\uFF0C\u8D70 Bash \u6743\u9650\u5361\u4E0E sandbox\uFF0C\u7981\u6B62 `;&|` \u5939\u5E26\n- T0 Fast \u4FDD\u6301 primary-only\uFF1A\u8DEF\u5F84\u5C42\u5224\u5B9A\u524D\u7F6E\u5230 hop \u8C03\u5EA6\uFF0C\u6700\u7B80\u56DE\u5408\u4E0D\u518D\u4E3A\u8BC1\u636E\u6536\u636E\u4ED8\u4E00\u6B21 light \u5F80\u8FD4\n';if(!bundled)return null;let parsed=getAllReleaseNotes(bundled);return parsed.length===0?null:parsed[parsed.length-1]?.[1]??null}async function checkForReleaseNotes(lastSeenVersion,currentVersion="2.1.88"){let bundled=getBundledReleaseNotes();if(bundled)return{hasReleaseNotes:!0,releaseNotes:bundled};if(process.env.USER_TYPE==="ant")return{hasReleaseNotes:!1,releaseNotes:[]};let cachedChangelog=await getStoredChangelog();(lastSeenVersion!==currentVersion||!cachedChangelog)&&fetchAndStoreChangelog().catch(error40=>logError2(toError(error40)));let releaseNotes2=getRecentReleaseNotes(currentVersion,lastSeenVersion,cachedChangelog);return{hasReleaseNotes:releaseNotes2.length>0,releaseNotes:releaseNotes2}}function checkForReleaseNotesSync(lastSeenVersion,currentVersion="2.1.88"){let bundled=getBundledReleaseNotes();if(bundled)return{hasReleaseNotes:!0,releaseNotes:bundled};if(process.env.USER_TYPE==="ant")return{hasReleaseNotes:!1,releaseNotes:[]};let releaseNotes2=getRecentReleaseNotes(currentVersion,lastSeenVersion);return{hasReleaseNotes:releaseNotes2.length>0,releaseNotes:releaseNotes2}}var import_semver7,MAX_RELEASE_NOTES_SHOWN,CHANGELOG_URL,RAW_CHANGELOG_URL,changelogMemoryCache,init_releaseNotes=__esm({"src/utils/releaseNotes.ts"(){init_axios2();import_semver7=__toESM(require_semver2());init_state();init_config12();init_envUtils();init_errors2();init_log3();init_privacyLevel();init_semver();MAX_RELEASE_NOTES_SHOWN=5,CHANGELOG_URL="https://github.com/mycode699/clavue/blob/main/CHANGELOG.md",RAW_CHANGELOG_URL="https://raw.githubusercontent.com/mycode699/clavue/refs/heads/main/CHANGELOG.md";__name(getChangelogCachePath,"getChangelogCachePath");changelogMemoryCache=null;__name(migrateChangelogFromConfig,"migrateChangelogFromConfig");__name(fetchAndStoreChangelog,"fetchAndStoreChangelog");__name(getStoredChangelog,"getStoredChangelog");__name(getStoredChangelogFromMemory,"getStoredChangelogFromMemory");__name(parseChangelog,"parseChangelog");__name(getRecentReleaseNotes,"getRecentReleaseNotes");__name(getAllReleaseNotes,"getAllReleaseNotes");__name(getBundledReleaseNotes,"getBundledReleaseNotes");__name(checkForReleaseNotes,"checkForReleaseNotes");__name(checkForReleaseNotesSync,"checkForReleaseNotesSync")}});var release_notes_exports={};__export(release_notes_exports,{call:()=>call40});function formatReleaseNotes(notes){return notes.map(([version3,notes2])=>{let header=`Version ${version3}:`,bulletPoints=notes2.map(note=>`\xB7 ${note}`).join(`
7677
7677
  `);return`${header}
7678
7678
  ${bulletPoints}`}).join(`
7679
7679
 
@@ -8117,8 +8117,8 @@ ${displayString}`)))},[writeRaw]),notifyKitty=(0,import_react109.useCallback)(({
8117
8117
  `)}function toolResultSearchText(r2){if(!r2||typeof r2!="object")return typeof r2=="string"?r2:"";let o2=r2;if(typeof o2.stdout=="string"){let err2=typeof o2.stderr=="string"?o2.stderr:"";return o2.stdout+(err2?`
8118
8118
  `+err2:"")}if(o2.file&&typeof o2.file=="object"&&typeof o2.file.content=="string")return o2.file.content;let parts=[];for(let k2 of["content","output","result","text","message"]){let v2=o2[k2];typeof v2=="string"&&parts.push(v2)}for(let k2 of["filenames","lines","results"]){let v2=o2[k2];Array.isArray(v2)&&v2.every(x3=>typeof x3=="string")&&parts.push(v2.join(`
8119
8119
  `))}return parts.join(`
8120
- `)}var SYSTEM_REMINDER_CLOSE,RENDERED_AS_SENTINEL,searchTextCache,init_transcriptSearch=__esm({"src/utils/transcriptSearch.ts"(){init_messages4();SYSTEM_REMINDER_CLOSE="</system-reminder>",RENDERED_AS_SENTINEL=new Set([INTERRUPT_MESSAGE,INTERRUPT_MESSAGE_FOR_TOOL_USE]),searchTextCache=new WeakMap;__name(renderableSearchText,"renderableSearchText");__name(computeSearchText,"computeSearchText");__name(toolUseSearchText,"toolUseSearchText");__name(toolResultSearchText,"toolResultSearchText")}});function getRemoteAwareDisplayPath(appState){let displayBase=process.env.DEMO_VERSION?"/code/claude":getDisplayPath(appState?.isRemoteMode&&appState.remoteCwd?appState.remoteCwd:getCwd()),serverUrl=getDirectConnectServerUrl();return serverUrl?`${displayBase} in ${serverUrl.replace(/^https?:\/\//,"")}`:displayBase}function getLayoutMode(columns){return columns>=70?"horizontal":"compact"}function calculateLayoutDimensions(columns,layoutMode,optimalLeftWidth){if(layoutMode==="horizontal"){let leftWidth=optimalLeftWidth,usedSpace=BORDER_PADDING+CONTENT_PADDING+DIVIDER_WIDTH+leftWidth,availableForRight=columns-usedSpace,rightWidth=Math.max(30,availableForRight),totalWidth2=Math.min(leftWidth+rightWidth+DIVIDER_WIDTH+CONTENT_PADDING,columns-BORDER_PADDING);return totalWidth2<leftWidth+rightWidth+DIVIDER_WIDTH+CONTENT_PADDING&&(rightWidth=totalWidth2-leftWidth-DIVIDER_WIDTH-CONTENT_PADDING),{leftWidth,rightWidth,totalWidth:totalWidth2}}let totalWidth=Math.min(columns-BORDER_PADDING,MAX_LEFT_WIDTH+20);return{leftWidth:totalWidth,rightWidth:totalWidth,totalWidth}}function calculateOptimalLeftWidth(welcomeMessage,truncatedCwd,modelLine){let contentWidth=Math.max(stringWidth(welcomeMessage),stringWidth(APP_BRAND_SUBTITLE),stringWidth(truncatedCwd),stringWidth(modelLine),20);return Math.min(contentWidth+4,MAX_LEFT_WIDTH)}function formatWelcomeMessage(username){return!username||username.length>MAX_USERNAME_LENGTH?"\u51C6\u5907\u597D\u4E86\u5C31\u5F00\u59CB\u3002":`\u6B22\u8FCE\u56DE\u6765\uFF0C${username}\u3002`}function truncatePath(path40,maxLength){if(stringWidth(path40)<=maxLength)return path40;let separator="/",ellipsis="\u2026",ellipsisWidth=1,separatorWidth=1,parts=path40.split(separator),first=parts[0]||"",last2=parts[parts.length-1]||"",firstWidth=stringWidth(first),lastWidth=stringWidth(last2);if(parts.length===1)return truncateToWidth(path40,maxLength);if(first===""&&ellipsisWidth+separatorWidth+lastWidth>=maxLength)return`${separator}${truncateToWidth(last2,Math.max(1,maxLength-separatorWidth))}`;if(first!==""&&ellipsisWidth*2+separatorWidth+lastWidth>=maxLength)return`${ellipsis}${separator}${truncateToWidth(last2,Math.max(1,maxLength-ellipsisWidth-separatorWidth))}`;if(parts.length===2){let availableForFirst=maxLength-ellipsisWidth-separatorWidth-lastWidth;return`${truncateToWidthNoEllipsis(first,availableForFirst)}${ellipsis}${separator}${last2}`}let available=maxLength-firstWidth-lastWidth-ellipsisWidth-2*separatorWidth;if(available<=0){let availableForFirst=Math.max(0,maxLength-lastWidth-ellipsisWidth-2*separatorWidth);return`${truncateToWidthNoEllipsis(first,availableForFirst)}${separator}${ellipsis}${separator}${last2}`}let middleParts=[];for(let i3=parts.length-2;i3>0;i3--){let part=parts[i3];if(part&&stringWidth(part)+separatorWidth<=available)middleParts.unshift(part),available-=stringWidth(part)+separatorWidth;else break}return middleParts.length===0?`${first}${separator}${ellipsis}${separator}${last2}`:`${first}${separator}${ellipsis}${separator}${middleParts.join(separator)}${separator}${last2}`}async function getRecentActivity(){if(cachePromise)return cachePromise;let currentSessionId=getSessionId();return cachePromise=loadMessageLogs(10).then(logs2=>(cachedActivity=logs2.filter(log4=>{if(log4.isSidechain||log4.sessionId===currentSessionId||log4.summary?.includes("I apologize"))return!1;let hasSummary=log4.summary&&log4.summary!=="No prompt",hasFirstPrompt=log4.firstPrompt&&log4.firstPrompt!=="No prompt";return hasSummary||hasFirstPrompt}).slice(0,3),cachedActivity)).catch(()=>(cachedActivity=[],cachedActivity)),cachePromise}function getRecentActivitySync(){return cachedActivity}function getLogoDisplayData(appState){let version3=process.env.DEMO_VERSION??APP_VERSION,cwd6=getRemoteAwareDisplayPath(appState),billingType=isClaudeAISubscriber()?getSubscriptionName():"Usage-based API billing",agentName=getInitialSettings().agent;return{version:version3,cwd:cwd6,billingType,agentName}}function formatModelAndBilling(modelName,billingType,availableWidth){return stringWidth(modelName)+3+stringWidth(billingType)>availableWidth?{shouldSplit:!0,truncatedModel:truncate2(modelName,availableWidth),truncatedBilling:truncate2(billingType,availableWidth)}:{shouldSplit:!1,truncatedModel:truncate2(modelName,Math.max(availableWidth-stringWidth(billingType)-3,10)),truncatedBilling:billingType}}function getRecentReleaseNotesSync(maxItems){if(process.env.USER_TYPE==="ant"){let changelog2='# Changelog\n\nClavue \u53D1\u5E03\u8BF4\u660E\u3002\u672C\u6587\u4EF6\u5728\u6784\u5EFA\u65F6\u6CE8\u5165\u8FD0\u884C\u65F6\uFF0C\u9A71\u52A8 `/release-notes` \u4E0E\u542F\u52A8\u753B\u9762\u7684\u300C\u65B0\u7279\u6027\u300D\u680F\u3002\n\n\u683C\u5F0F\u7EA6\u5B9A\uFF08\u89E3\u6790\u5668\u4F9D\u8D56\uFF09\uFF1A\u4E8C\u7EA7\u6807\u9898\u4E3A `## <\u7248\u672C> - <\u65E5\u671F>`\uFF0C\u6761\u76EE\u4EE5 `- ` \u5F00\u5934\uFF0C\u4E00\u884C\u4E00\u6761\uFF0C\n\u547D\u4EE4\u3001\u53C2\u6570\u4E0E\u6A21\u578B\u540D\u4FDD\u7559\u82F1\u6587\u3002\n\n## 13.9.1 - 2026-10-23\n\n- **\u951A\u5B9A\u4F1A\u8BDD cwd \u5199\u6587\u4EF6\u3002** \u65E0\u663E\u5F0F\u8DEF\u5F84\u65F6 Edit/Write \u4E0D\u5F97\u843D\u5230\u5144\u5F1F\u6C99\u7BB1\uFF1B\u7EDD\u5BF9\u8DEF\u5F84\u9003\u51FA session cwd \u4F1A\u88AB\u62D2\u7EDD\n- **print \u6210\u529F\u5373\u9000\u51FA 0\u3002** `subtype=success` \u65F6\u8FDB\u7A0B\u9000\u51FA\u7801\u6052\u4E3A 0\uFF0C\u4E0D\u518D\u51FA\u73B0 success \u5374 exit 1\uFF08bench C1\uFF09\n- **print \u7ED3\u679C\u8865\u9F50 timing\u3002** `result.timing` \u53EF\u5BF9\u6807 v1\uFF08wallMs / modelMs / toolCalls \u7B49\uFF09\n\n## 13.9.0 - 2026-10-23\n\n- **\u754C\u9762\u5168\u9762\u5BF9\u6807 Grok Build\u3002** \u9876\u680F/\u5E95\u680F/\u72B6\u6001\u884C\uFF08chrome\uFF09\u3001\u4E3B\u9898\u8272\u4E0E\u5B57\u5F62\u3001\u9996\u9875\u4E00\u5C4F\u53EF\u8F93\u5165\u4E14\u70ED\u952E\u4E0D\u541E\u9996\u5B57\u3001\u952E\u4F4D\u5BFC\u822A\u4E0E\u5FEB\u6377\u952E\u9762\u677F\u3001\u4E00\u8F6E\u6C47\u603B \u25C8 / \u9010\u6761 \u25C6 / \u4E09\u5C42\u5C55\u5F00\u3001\u5185\u8054\u6743\u9650\u5361\u3001\u5B50\u4EE3\u7406\u884C\u4E0E dock\u3001\u65E5\u8BB0\u964D\u566A\u4E0E\u5931\u8D25\u6761\uFF0C\u516B\u7EC4 GUI \u4E00\u5E76\u5408\u5165\n- **\u534F\u8BAE\u767B\u8BB0\u91CD\u5EFA\u3002** \u5408\u5E76\u540E\u7EDF\u4E00\u91CD\u5EFA UI \u534F\u8BAE registry\uFF0C\u4FDD\u7559\u5168\u90E8\u4E8B\u4EF6\u767B\u8BB0\uFF0C\u4E0D\u4E22\u7AEF\u53E3\n\n## 13.8.0 - 2026-10-22\n\n- **\u51FA\u9519\u65F6\u8BF4\u6E05\u695A\u3001\u5C11\u7A7A\u8F6C\u3002** \u9519\u8BEF\u7EDF\u4E00\u5206\u6210\u53EF\u91CD\u8BD5\u3001\u53EF\u6062\u590D\u3001\u5FC5\u987B\u505C\u6B62\u4E09\u7C7B\uFF1B401/402/\u78C1\u76D8\u6EE1\u76F4\u63A5\u505C\u5E76\u7ED9\u4E00\u884C\u539F\u56E0\uFF0C\u65AD\u7F51\u3001\u8D85\u65F6\u3001429\u30015xx \u624D\u91CD\u8BD5\n- **\u574F\u5DE5\u5177\u8C03\u7528\u81EA\u52A8\u4FEE\u3002** \u65E0\u540D\u6216\u53C2\u6570\u574F\u6389\u7684\u5DE5\u5177\u8C03\u7528\u6309\u300C\u4E22\u5F03\u91CD\u8BD5 \u2192 \u63D0\u9192\u5DE5\u5177\u540D \u2192 \u6309\u53C2\u6570\u63A8\u65AD \u2192 \u6362\u6A21\u578B\u300D\u4FEE\u590D\uFF0C\u72B6\u6001\u884C\u663E\u793A\u300C\u6B63\u5728\u91CD\u8BD5 (n/4)\u300D\uFF0C\u4FEE\u4E0D\u597D\u53EA\u7559\u4E00\u884C\u9519\u8BEF\n- **\u56DE\u590D\u88AB\u622A\u65AD\u80FD\u63A5\u4E0A\u3002** \u6D41\u4E2D\u65AD\u540E\u4ECE\u65AD\u70B9\u7EED\u5199\uFF0C\u9996\u5B57\u7B49\u5F85\u6309\u7F51\u5173\u8868\u73B0\u81EA\u9002\u5E94\uFF1B\u5207\u5230\u5907\u7528\u6A21\u578B\u65F6\u5DE5\u5177\u5217\u8868\u4FDD\u6301\u4E0D\u53D8\uFF0C\u63D0\u793A\u7F13\u5B58\u4E0D\u5931\u6548\n- **\u81EA\u52A8\u7EED\u63A5\u53EA\u6709\u4E00\u4E2A\u51FA\u53E3\u3002** \u5404\u7C7B\u7EED\u63A5\u8D70\u540C\u4E00\u51FA\u53E3\uFF0C\u6709\u8FDB\u5C55\u4E0D\u8BA1\u6570\uFF0C\u8FDE\u7EED\u65E0\u8FDB\u5C55 8 \u6B21\u6216\u6BCF\u56DE\u5408 40 \u6B21\u540E\u505C\u4E0B\u5E76\u8BF4\u660E\uFF1B\u6309\u8BC1\u636E\u5224\u65AD\u662F\u5426\u5361\u4F4F\uFF0C\u4E0D\u518D\u51ED\u5B57\u6570\n- **\u5B50\u4EE3\u7406\u6709\u8D26\u672C\u3002** \u6309\u5B50\u4EE3\u7406\u8BB0\u5F55\u5DE5\u5177\u6B21\u6570\u3001token \u548C\u91CD\u590D\u8BFB\u53D6\uFF1B\u652F\u6301\u65F6\u95F4\u9884\u7B97\u4E0E\u6536\u5C3E\u603B\u7ED3\u56DE\u5408\uFF0C\u53EA\u8BFB\u4EFB\u52A1\u4E0D\u518D\u88AB\u8981\u6C42\u6539\u6587\u4EF6\uFF1B`/parallel` \u6709\u5E76\u53D1\u4E0A\u9650\n- **\u66F4\u5B89\u5168\u3002** \u62E6\u622A\u8BEF\u6740\u81EA\u8EAB\u6216\u65E0\u5173\u8FDB\u7A0B\u7684 kill\uFF1B\u65B0\u589E AIza\u3001AKIA/ASIA\u3001glpat-\u3001hf_\u3001npm_\u3001xai- \u7B49\u683C\u5F0F\u53CA\u300C\u4E3B\u673A \u7528\u6237 \u5BC6\u7801\u300D\u4E09\u6BB5\u5F0F\u6253\u7801\uFF1B\u6539\u52A8 `~/.ssh`\u3001`~/.aws` \u7B49\u51ED\u636E\u8DEF\u5F84\u524D\u5148\u786E\u8BA4\n- **\u8BF7\u6C42\u4F53 gzip\u3002** \u7F51\u5173\u652F\u6301\u65F6\u8BF7\u6C42\u81EA\u52A8\u538B\u7F29\uFF0C\u9047\u5230 400/415 \u56DE\u9000\u5E76\u8BB0\u4F4F\u4E00\u5C0F\u65F6\uFF1B\u82E5\u5E72\u754C\u9762\u7EC6\u8282\u4FEE\u6574\n\n## 13.7.0 - 2026-10-21\n\n- **\u65E5\u8BB0\u91CD\u505A\uFF0C\u8F93\u51FA\u66F4\u5E72\u51C0\u3002** \u6BCF\u8F6E\u53EA\u51FA\u4E8B\u4EF6\uFF08\u5F00\u59CB\u3001\u5DE5\u5177\u5F00\u59CB\u4E0E\u7ED3\u675F\u3001\u6700\u7EC8\u56DE\u7B54\u3001\u7ED3\u675F\u539F\u56E0\uFF09\uFF0C\u65E5\u8BB0\u6587\u5B57\u7EDF\u4E00\u7531 pager \u751F\u6210\uFF1B\u7ED3\u5C3E\u4E00\u8F6E\u4E00\u884C\u3001\u5C5E\u4E8E\u672C\u8F6E\uFF0C\u5931\u8D25\u6216\u4E2D\u65AD\u65F6\u4E0D\u518D\u5199\u300C\u5B8C\u6210\u300D\uFF0C\u6D3B\u52A8\u6761\u4E0D\u518D\u6F0F\u51FA\u5185\u90E8\u7F16\u7801\n- **\u540E\u53F0\u4EFB\u52A1\u4E0D\u518D\u5237\u5C4F\u3002** \u76F8\u90BB\u7684\u540E\u53F0\u4EFB\u52A1\u901A\u77E5\u5408\u5E76\u6210\u4E00\u8F6E\u5904\u7406\uFF08\u5408\u5E76\u7A97\u53E3\u9ED8\u8BA4 1500ms\uFF09\uFF0C\u81EA\u52A8\u8DDF\u8FDB\u56DE\u5408\u5931\u8D25\u65F6\u53EA\u7559\u4E00\u6761\u53EF\u539F\u5730\u66F4\u65B0\u7684\u63D0\u793A\uFF0C\u4E0D\u518D\u753B\u6574\u5757\u5931\u8D25\u5361\n- **\u56DE\u5408\u6536\u5C3E\u5224\u5F97\u66F4\u51C6\u3002** \u4EE5\u300C\u6211\u4F1A\u2026\u300D\u300C\u63A5\u4E0B\u6765\u2026\u300D\u8FD9\u7C7B\u627F\u8BFA\u53E5\u7ED3\u5C3E\u7B97\u672A\u5B8C\u6210\uFF1B\u7B49\u5F85\u540E\u53F0\u4EFB\u52A1\u4E0D\u5224\u5931\u8D25\uFF1B\u76EE\u6807\u4E0D\u4F1A\u88AB\u77ED\u56DE\u590D\u6216\u4EFB\u52A1\u901A\u77E5\u5360\u4F4F\n- **\u7F51\u5173\u66F4\u7A33\u3002** \u91CD\u8BD5\u7EDF\u4E00\u8BA1\u5165\u4E00\u4E2A\u9884\u7B97\uFF0C\u4E0D\u518D\u51FA\u73B0\u91CD\u8BD5\u4E8C\u5341\u591A\u6B21\uFF1B\u91CD\u590D\u7684\u6D41\u4E8B\u4EF6\u53BB\u91CD\uFF1B\u5207\u5907\u7528\u65F6\u8DF3\u8FC7\u88C5\u4E0D\u4E0B\u5F53\u524D\u4E0A\u4E0B\u6587\u7684\u6A21\u578B\uFF1B\u517C\u5BB9 text/plain \u56DE\u590D\uFF1B\u7A7A text block \u4E0D\u518D\u5BFC\u81F4 400\uFF1B\u5B50\u4EE3\u7406\u88AB\u622A\u65AD\u540E\u4F1A\u7EED\u5199\n- **\u5907\u7528\u6A21\u578B\u63D0\u793A\u53EA\u51FA\u4E00\u6B21\u3002** \u6BCF\u4F1A\u8BDD\u6BCF\u5BF9\u6A21\u578B\u53EA\u63D0\u793A\u4E00\u6B21\u300C\u5DF2\u5207\u5230\u5907\u7528\u6A21\u578B B\uFF08A \u4E0D\u53EF\u7528\uFF09\u300D\uFF1B\u5E95\u680F\u7A84\u5C4F\u65F6\u5148\u7701\u6389 @effort \u7B49\u6807\u7B7E\uFF0C\u4FDD\u4F4F\u5B8C\u6574\u6A21\u578B\u540D\n- **\u5DE5\u5177\u66F4\u5BBD\u5BB9\u4E5F\u66F4\u5B89\u5168\u3002** Write / Grep \u63A5\u53D7\u5E38\u89C1\u53C2\u6570\u522B\u540D\u3001\u4E22\u6389\u591A\u4F59\u5B57\u6BB5\uFF1B\u5DF2\u6709\u6587\u4EF6\u662F GBK\u3001Shift-JIS \u7B49\u975E UTF-8 \u7F16\u7801\u65F6\u62D2\u7EDD\u5199\u5165\u5E76\u8BF4\u660E\u7F16\u7801\uFF0C\u4E0D\u6539\u539F\u5B57\u8282\n- **\u5361\u6B7B\u4E0E\u8FDB\u7A0B\u6536\u5F97\u5E72\u51C0\u3002** \u5361\u6B7B\u515C\u5E95\u5B88\u62A4\uFF1BBash \u6309\u8FDB\u7A0B\u7EC4\u767B\u8BB0\u5E76\u6574\u7EC4\u6E05\u7406\uFF1B\u9000\u51FA\u65F6\u540E\u53F0\u547D\u4EE4 1.5s \u5185\u5F3A\u6740\u4E14 SessionEnd \u5FC5\u8DD1\uFF1B\u53EA\u6740\u542F\u52A8\u5668\u65F6\u5B50\u8FDB\u7A0B\u4E0D\u518D\u6210\u5B64\u513F\n- **\u957F\u4F1A\u8BDD\u66F4\u7701\u3002** \u6BCF\u6B21\u66F4\u65B0\u4E0D\u518D\u91CD\u626B\u5168\u5BF9\u8BDD\uFF1B\u5DE5\u5177\u8F93\u51FA\u8D85\u8FC7 2000 \u884C\u843D\u76D8\u53EA\u7559\u6458\u8981\uFF1B\u65B0\u589E\u7ED3\u679C\u6865 `result.json`\n- **\u6743\u9650\u52A0\u56FA\u3002** \u85CF\u5728\u5B50\u547D\u4EE4\u3001\u5F15\u53F7\u6216\u53D8\u91CF\u91CC\u7684\u5371\u9669 `rm` \u4E5F\u4F1A\u62E6\uFF1B\u4FEE\u8865\u4E00\u6279 Bash \u5206\u6790\u7ED5\u8FC7\uFF1B\u6309 symlink \u7684\u771F\u5B9E\u843D\u70B9\u5224\u6743\u9650\uFF1Bplan \u6A21\u5F0F\u4E0B Bash \u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF1BMCP \u62A5\u9519\u91CC\u7684\u5BC6\u94A5\u5148\u6253\u7801\uFF1B\u65B0\u589E `--restricted` \u53EA\u8BFB\u6A21\u5F0F\n- **\u4EE5\u300C\u7406\u89E3\uFF1A\u300D\u5F00\u5934\u7684\u6700\u7EC8\u7B54\u6848\u4E0D\u518D\u88AB\u541E\u3002** \u91CD\u8BD5\u540E\u7B54\u6848\u4E0D\u4F1A\u6D88\u5931\uFF1B`/model` \u56DE\u6267\u53EA\u663E\u793A\u4E00\u6B21\u5E76\u5237\u65B0\u5E95\u680F\n\n## 13.6.0 - 2026-10-19\n\n- **\u5907\u7528\u94FE\u66F4\u53EF\u9760\u3002** \u9996\u5305\u8D85\u65F6\u6216\u5907\u7528\u6A21\u578B\u8FD4\u56DE 404 / 5xx \u65F6\uFF0C\u6CBF `CLAVUE_COMBO_FALLBACK`\uFF08\u9017\u53F7\u5206\u9694\uFF09\u5207\u5230\u4E0B\u4E00\u4E2A\u6A21\u578B\uFF0C\u8DF3\u8FC7\u540C\u5BB6\u65CF\u522B\u540D\uFF08`cn:deepseek-v4.1-flash` \u4E0D\u4F1A\u518D\u5207\u56DE `deepseek-v4-flash`\uFF09\u3002\u521A\u5931\u6548\u7684\u6A21\u578B 10 \u5206\u949F\u5185\u4E0D\u518D\u9009\uFF08`CLAVUE_MODEL_HEALTH_TTL_MS`\uFF09\uFF1B\u6574\u6761\u94FE\u90FD\u5931\u6548\u65F6\u56DE\u5230\u5B8C\u6574\u94FE\u3002\u4E3B\u6A21\u578B\u4E0A\u7684 502/503 \u4ECD\u6309\u539F\u6765\u7684\u4E24\u6B21\u9608\u503C\n- **\u5B58\u6863\u524D\u5BC6\u94A5\u6253\u7801\u3002** \u4F1A\u8BDD jsonl \u548C `history.jsonl` \u5199\u76D8\u524D\u906E\u6389 `sshpass -p`\u3001`SSHPASS=`\u3001`mysql -p` / `--password`\u3001`PGPASSWORD`\u3001`MYSQL_PWD`\u3001`curl -u`\u3001\u5E26\u8D26\u53F7\u5BC6\u7801\u7684 URL\u3001`Authorization: Bearer`\u3001`sk-` / `ghp_` \u5BC6\u94A5\u3001`password=`\u3001`*_PASS=` / `*_PWD=`\u3002\u6267\u884C\u4ECD\u7528\u539F\u547D\u4EE4\uFF1B`PWD=` / `$PWD` \u4E0D\u53D7\u5F71\u54CD\n- **\u663E\u5F0F\u8BE2\u95EE\u89C4\u5219\u4F18\u5148\u3002** `Bash(rm:*)` \u8FD9\u7C7B ask \u89C4\u5219\u547D\u4E2D\u590D\u5408\u547D\u4EE4\u91CC\u7684\u5B50\u547D\u4EE4\uFF08`rm \u2026 && ls`\uFF09\u65F6\uFF0C\u4E0D\u518D\u88AB\u5168\u5C40 `Bash` \u5141\u8BB8\u8986\u76D6\uFF1B\u9ED8\u8BA4\u6A21\u5F0F\u548C\u6C99\u7BB1\u6A21\u5F0F\u90FD\u751F\u6548\uFF0C`bypassPermissions` \u4ECD\u8C41\u514D\n- **\u5B50\u4EE3\u7406\u88AB\u62E6\u65F6\u8BF4\u6E05\u539F\u56E0\u3002** \u8D85\u8FC7 `CLAVUE_AGENT_MAX_DEPTH` \u65F6\u8FD4\u56DE\u7ED3\u6784\u5316\u7684 `<spawn_blocked>` \u8BF4\u660E\uFF0C\u63D0\u793A\u540C\u4E00\u8C03\u7528\u4F1A\u518D\u6B21\u88AB\u62E6\u3001\u8BF7\u5728\u5F53\u524D\u4F1A\u8BDD\u5B8C\u6210\u3002\u6DF1\u5EA6\u6309\u771F\u5B9E\u5D4C\u5957\u5C42\u6570\u8BA1\u7B97\n- **\u5DE5\u5177\u53C2\u6570\u5F62\u72B6\u4E0D\u5BF9\u4E0D\u518D\u5D29\u6E83\u3002** \u6A21\u578B\u628A `path` \u5199\u6210\u6570\u7EC4\u3001\u5BF9\u8C61\u6216\u6F0F\u5199\u65F6\uFF0C\u6D88\u606F\u6298\u53E0\u548C\u8BB0\u5FC6\u8DEF\u5F84\u5224\u65AD\u9000\u56DE\u539F\u59CB\u884C\u663E\u793A\uFF0C\u4E0D\u518D\u62A5 `The "path" argument must be of type string`\n- **\u8FDB\u51FA worktree \u771F\u6B63\u6E05\u6389 plans \u76EE\u5F55\u7F13\u5B58\u3002** \u4EE5\u524D\u7F13\u5B58\u6CA1\u88AB\u6E05\u6389\uFF0Cplans \u76EE\u5F55\u4E00\u76F4\u6307\u5411\u8FDB\u5165 worktree \u524D\u7684\u76EE\u5F55\uFF0C\u73B0\u5728\u4F1A\u8DDF\u7740\u5207\u6362\n\n## 13.5.0 - 2026-10-16\n\n- **\u56DB\u6863\u8DEF\u7531\u3002** \u89C4\u5219\u628A\u56DE\u5408\u5206\u6210 \u7B80\u5355 / \u4E00\u822C / \u590D\u6742 / \u957F\u7A0B\u3002\u62FF\u4E0D\u51C6\u65F6\u8BA1\u5212\u69FD\u6700\u591A\u60F3 1 \u79D2\uFF0C\u8D85\u65F6\u7B97\u4E00\u822C\u3002`/goal` \u662F\u957F\u7A0B\u3002`/mode` \u56FA\u5B9A\u6863\u4F4D\u3002`CLAVUE_TIERS=0` \u5173\u95ED\u3002\u6539\u8FC7\u7684\u6587\u4EF6\u8D85\u8FC7 5 \u4E2A\u5347\u5230\u81F3\u5C11\u590D\u6742\uFF0C\u8D85\u8FC7 15 \u4E2A\u5347\u5230\u957F\u7A0B\uFF1B\u7B80\u5355\u6863\u91CC\u8BF7\u6C42\u8D85\u8FC7 20 \u6B21\u5347\u5230\u4E00\u822C\uFF1B\u540C\u4E00\u6761\u68C0\u67E5\u5931\u8D25 3 \u6B21\u5347\u4E00\u6863\uFF1BJEV \u5224\u5B9A\u4E25\u91CD\u5347\u5230\u81F3\u5C11\u590D\u6742\u3002\u964D\u6863\u53EA\u53D1\u751F\u5728\u4E0B\u4E00\u8F6E\u5F00\u59CB\n- **\u7B80\u5355\u6863\u5C11\u505A\u3002** \u4E0D\u8DD1 REVIEW\uFF0C\u4E0D\u95EE\u4EA4\u4ED8\u88C1\u5224\uFF0C\u56DE\u5408\u7ED3\u675F\u4E0D\u7B49\u5F85\uFF0C\u7CFB\u7EDF\u63D0\u793A\u7528\u7CBE\u7B80\u7248\u3002\u5DE5\u5177\u53EA\u7559 10 \u4E2A\u6838\u5FC3\uFF0C`mcp__*` \u59CB\u7EC8\u4FDD\u7559\u3002\u4E00\u822C\u6863\u5BA1\u67E5\u7B49\u5F85\u6700\u591A 5 \u79D2\u3002\u590D\u6742\u548C\u957F\u7A0B\u6700\u591A 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\n- **\u72B6\u6001\u884C\u5E26\u6863\u4F4D\u3002** \u5728 `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42` \u540E\u52A0 `\u7B80\u5355`\u3002\u6362\u6863 15 \u79D2\u5185\u663E\u793A `\u7B80\u5355\u2192\u4E00\u822C`\n- **stdin \u5148\u770B 200ms\u3002** `-p` \u7B49\u7BA1\u9053\u7B2C\u4E00\u5B57\u8282\u9ED8\u8BA4 200ms\uFF08`CLAVUE_STDIN_PEEK_MS`\uFF0C0 \u4E0D\u7B49\uFF09\u3002MCP \u542F\u52A8\u8D5B\u8DD1\u4ECD\u662F 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF09\n\n## 13.4.2 - 2026-10-16\n\n- **\u8BA1\u65F6\u884C\u7528\u771F\u5B9E\u9636\u6BB5\u540D\u3002** \u8C03\u8BD5\u65E5\u5FD7\u4E0D\u518D\u628A\u6BCF\u4E00\u8DF3\u90FD\u5199\u6210 `sdk`\uFF0C\u800C\u662F `intake/jev`\u3001`plan`\u3001`scout`\u3001`main`\u3001`review`\u3001`compact`\u3001`subagent`\u3001`fanout` \u52A0\u4E0A\u6A21\u578B\u548C\u6BEB\u79D2\u3002\u72B6\u6001\u884C\u663E\u793A `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42`\n- **\u7F16\u6392\u5BF9\u9F50 v1\u3002** JEV intake \u5728\u56DE\u5408\u5F00\u59CB\u5C31\u53D1\u51FA\u53BB\uFF0C\u53EA\u5728\u8BA1\u5212\u8DF3\u4E4B\u524D\u7B49\u5F85\u3002\u77ED\u7EED\u5199\uFF08\u7EE7\u7EED\uFF09\u590D\u7528\u4E0A\u4E00\u8F6E\u5206\u7C7B\uFF1A0 \u6B21 JEV\u30010 \u6B21 PLAN\u3002\u8BA1\u5212\u8DF3\u81EA\u8EAB 30 \u79D2\u5230\u70B9\u5C31\u9759\u9ED8\u4E22\u6389\uFF08`CLAVUE_COMBO_PLAN_TIMEOUT_MS`\uFF09\uFF0C\u9996\u5305\u524D\u4ECD\u53EA\u7B49\u6700\u591A 1.8 \u79D2\u3002\u540C\u4E00\u4EFD\u8BA1\u5212\u53EA\u5BA1\u67E5\u4E00\u6B21\uFF0C\u8BA1\u5212\u6700\u591A\u4FEE\u8BA2\u4E00\u6B21\u3002`CLAVUE_COMBO_PLAN_HOP=0` \u4ECD\u53EF\u5173\u6389\u8BA1\u5212\u8DF3\n- **\u56DE\u5408\u7ED3\u675F\u7684\u5BA1\u67E5\u7B49\u5F85\u3002** \u914D\u7F6E\u9ED8\u8BA4\u4ECD\u662F 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\u3002\u7410\u788E\u56DE\u5408\u4E0D\u7B49\u5F85\uFF1B\u5176\u4F59\u56DE\u5408\u6700\u591A\u7B49 5 \u79D2\n- **\u51B7\u542F\u52A8\u4E0D\u6321 MCP\u3002** \u65E0\u5934\u6A21\u5F0F\u9ED8\u8BA4\u5728\u540E\u53F0\u8FDE\u63A5 MCP\uFF0C\u4E0D\u518D\u628A\u7B2C\u4E00\u8BF7\u6C42\u6321\u4F4F\u6700\u591A 8 \u79D2\u3002`CLAVUE_HEADLESS_MCP_BUDGET_MS=0` \u6062\u590D\u4E00\u76F4\u7B49\u5230\u8FDE\u5B8C\n- **JEV \u9274\u6743\u5931\u8D25\u8DE8\u8FDB\u7A0B\u8DF3\u8FC7\u3002** \u4E00\u6761 intake \u91CC\u4E24\u628A key \u90FD 401 \u5C31\u4F1A\u5199\u4E0B `jev-auth-fail.json`\u3002\u4E0B\u4E00\u4E2A\u8FDB\u7A0B\u5728 TTL \u5185\u4E0D\u518D\u53D1\u90A3\u4E24\u4E0B 401\n- **\u540E\u53F0\u8FDE\u4E0A\u7684 MCP \u4F1A\u8FDB\u540E\u7EED\u8BF7\u6C42\u3002** \u542F\u52A8\u65F6\u548C\u8FDE\u63A5\u8D5B\u8DD1\uFF0C\u9ED8\u8BA4\u6700\u591A 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF0C0 \u9A6C\u4E0A\u8FD4\u56DE\uFF09\u3002\u6BCF\u4E2A\u670D\u52A1\u5668\u8FDE\u4E0A\u5C31\u5199\u5165 headless store\u3002\u540C\u4E00\u56DE\u5408\u91CC\u4E0B\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u8C03\u7528 `refreshTools()` \u91CD\u8BFB `buildAllTools(getAppState())`\u3002`stickyToolsForTurn` \u4E0D\u518D\u56E0\u4E3A\u5DE5\u5177\u4E0D\u5728\u4E0A\u4E00\u8BF7\u6C42\u7684\u540D\u5355\u91CC\u5C31\u4E22\u6389 `mcp__*`\u3002\u6838\u5FC3\u5DE5\u5177\u9762\u4E5F\u4FDD\u7559 `mcp__*`\n- **\u6D41\u4E2D\u95F4\u5361\u4F4F\u4F1A\u6362\u5907\u7528\u6A21\u578B\u3002** \u804A\u5929\u6A21\u578B\u4EE5\u524D\u4E24\u4E2A chunk \u4E4B\u95F4\u53EF\u4EE5\u7A7A 180 \u79D2\uFF0C\u6240\u4EE5 -p \u91CC 81 \u79D2\u548C 147 \u79D2\u7684\u505C\u987F\u4E0D\u4F1A\u4E2D\u6B62\u3002\u73B0\u5728\u9ED8\u8BA4 60 \u79D2\uFF08`CLAVUE_API_STREAM_IDLE_TIMEOUT_MS`\uFF0C\u4E5F\u8BA4 `CLAVUE_STREAM_IDLE_TIMEOUT_MS`\uFF1B`CLAVUE_STREAM_WATCHDOG=0` \u5173\u95ED\uFF09\u3002\u5230\u70B9\u53D6\u6D88\u6D41\uFF08\u5DF2\u7ECF\u51FA\u8FC7\u5B57\u4E5F\u53D6\u6D88\uFF09\uFF0C\u4E22\u6389\u534A\u622A\u52A9\u624B\u6D88\u606F\uFF0C\u6309\u9996\u5305\u540C\u4E00\u6761\u5907\u7528\u94FE\u91CD\u8BD5\u4E00\u6B21\n- **\u8BA1\u5212\u8C03\u7528\u7684\u8BA1\u65F6\u884C\u5199 `plan`\u3002** \u9636\u6BB5\u6309\u8C03\u7528\u70B9\u7684 phase/role \u8BB0\uFF0C\u4E0D\u518D\u56E0\u4E3A querySource \u662F `sdk` \u5C31\u5168\u90E8\u5199\u6210 `main`\u3002scout / review \u540C\u7406\n\n## 13.4.1 - 2026-10-16\n\n- **\u9996\u5305\u8D85\u65F6\u6362\u5907\u7528\u6A21\u578B\u3002** \u9ED8\u8BA4\u7B49\u5F85\u4ECE 90 \u79D2\u964D\u5230 45 \u79D2\uFF08`CLAVUE_API_FIRST_BYTE_TIMEOUT_MS`\uFF0C0 \u5173\u95ED\uFF09\uFF0C\u6D41\u5F0F\u548C\u672C\u5730\u975E\u6D41\u5F0F\uFF08\u542B 127.0.0.1\uFF09\u90FD\u8BA1\u65F6\u3002\u8D85\u65F6\u540E\u4E0D\u518D\u91CD\u8BD5\u540C\u4E00\u4E2A\u6A21\u578B\uFF0C\u6539\u5207\u5907\u7528\uFF1Aprofile \u7684 `fallback`\u3001\u7136\u540E `CLAVUE_COMBO_FALLBACK`\u3001\u7136\u540E ttqq \u9ED8\u8BA4 `cn:deepseek-v4.1-flash`\uFF1B`off` \u5173\u95ED\u3002\u72B6\u6001\u884C\u663E\u793A `\u7B49\u5F85\u6A21\u578B\u9996\u5305 Ns`\u3002\u540E\u53F0\u8C03\u7528\u9ED8\u8BA4\u6700\u591A 20 \u79D2\uFF08`CLAVUE_SIDE_CALL_TIMEOUT_MS`\uFF0Cplan/review \u4E0D\u5957\u8FD9\u5C42\u4E0A\u9650\uFF09\n- **JEV \u4E0E FastApply \u51ED\u8BC1\u94FE\u3002** \u73B0\u6709\u987A\u5E8F\u4E4B\u540E\u8865\u4E0A\u5DF2\u767B\u5F55\u8D26\u53F7 key\uFF08`auth.json`\uFF0C\u542B `https://api.clavue.com::client` \u8FD9\u79CD\u6309\u4E3B\u673A\u5B58\u653E\u7684\u6761\u76EE\uFF09\u548C\u672C\u673A\u8BBE\u5907 key\uFF08`official-device-key.json`\uFF09\u3002\u914D\u7F6E\u76EE\u5F55\u8DDF\u968F `CLAVUE_CONFIG_DIR`\u3002\u53EA\u53D1\u7ED9 api.clavue.com\u3002\u67D0\u4E00\u7EA7\u8FD4\u56DE 401 \u5C31\u8BD5\u4E0B\u4E00\u7EA7\uFF0C\u5E76\u8BB0\u4E0B\u65B0\u6765\u6E90\uFF08`key source=auth.json:https://api.clavue.com::clavue-gui`\uFF09\u3002`/provider current` \u5217\u51FA\u6574\u6761\u94FE\u548C\u6BCF\u4E00\u7EA7\u662F\u5426\u627E\u5230\u3002\u540C\u4E00\u8BF7\u6C42 1 \u79D2\u5185\u4E0D\u53D1\u7B2C\u4E8C\u6B21\uFF0C\u6362 key \u9664\u5916\u3002\u5168\u90E8 401 \u65F6\u7EC8\u7AEF\u53EA\u6253\u4E00\u884C\u4E2D\u6587\u4FEE\u590D\u63D0\u793A\uFF0C\u4E0D\u518D\u6A21\u62DF\u5224\u5B9A\u3002\u5224\u5B9A\u5931\u8D25\u4F1A\u8BB0\u4F4F\u4E00\u5C0F\u6BB5\u65F6\u95F4\uFF08`CLAVUE_JEV_AUTH_FAIL_TTL_MS`\uFF0C\u9ED8\u8BA4 10 \u5206\u949F\uFF09\uFF0C\u8FD9\u6BB5\u65F6\u95F4\u91CC\u4E0D\u518D\u53D1 intake\n- **`provider current` \u8BFB\u53D6 settings.json \u7684 env\u3002** JEV/FA \u72B6\u6001\u4E0D\u518D\u56E0\u4E3A\u53EA\u5199\u5728 settings \u91CC\u800C\u663E\u793A off\u3002\u5DF2\u4FDD\u5B58\u7684\u7EBF\u8DEF\u662F\u5F53\u524D\u8DEF\u7531\u65F6\uFF0C\u4E0D\u518D\u663E\u793A `Current API config: None`\n- **DeepSeek \u63A8\u7406 token \u4E0D\u518D\u91CD\u590D\u8BA1\u5165\u4E0A\u4E0B\u6587\u3002** `reasoning_tokens` \u662F `completion_tokens` \u7684\u5B50\u96C6\uFF1B\u7F51\u5173\u628A\u4E24\u8005\u76F8\u52A0\u5199\u8FDB `output_tokens` \u65F6\u6309 completion \u8BA1\u3002\u540C\u4E00\u56DE\u590D\u62C6\u5F00\u7684\u601D\u8003\u5757\u4E0D\u518D\u88AB\u4F30\u7B97\u7B2C\u4E8C\u904D\n- **\u9632\u538B\u7F29\u98CE\u66B4\u3002** \u540C\u4E00\u6A21\u578B\u5BB6\u65CF\u91CC\u6362\u6A21\u578B\u3001\u7A97\u53E3\u6CA1\u6709\u53D8\u5C0F\u65F6\uFF0C\u4E0A\u4E0B\u6587\u6CA1\u5230\u65B0\u6A21\u578B\u9608\u503C\u5C31\u4E0D\u538B\u7F29\u3002\u6458\u8981\u6309 `CLAVUE_AUTO_COMPACT_MODEL` \u2192 light \u2192 FA \u2192 \u4E3B\u6A21\u578B\uFF0C\u6BCF\u4E2A\u6A21\u578B\u9650\u65F6 90 \u79D2\uFF08`CLAVUE_AUTO_COMPACT_TIMEOUT_MS`\uFF09\u3002\u4E0A\u4E0B\u6587\u4E0D\u5230 token \u9608\u503C 30% \u65F6\uFF0C\u5185\u5B58\u538B\u529B\u53EA\u6E05\u7F13\u5B58\uFF0C\u4E0D\u8DD1\u538B\u7F29\u3002\u7B2C\u4E09\u65B9\u7EBF\u8DEF\u4E0D\u4F1A\u9ED8\u8BA4\u53BB\u8C03 `clavue-2.1-fast` / `clavue-2.1` / `clavue-2.1-pro`\uFF1B\u53EA\u6709\u5B98\u65B9\u4E91\uFF0C\u6216\u4F60\u7528 `CLAVUE_COMBO_LIGHT` / `CLAVUE_AUTO_COMPACT_MODEL` \u8FD9\u7C7B\u73AF\u5883\u53D8\u91CF\u5199\u660E\uFF0C\u624D\u4F1A\u8D70\u8FD9\u4E9B id\n- **\u4EE3\u7801\u56DE\u5408\u5C11\u7B49\u524D\u7F6E\u8DF3\u3002** \u8BA1\u5212\u8DF3\u9ED8\u8BA4\u6700\u591A\u5360\u9996\u5305\u524D 1.8 \u79D2\uFF08`CLAVUE_SCOUT_TIMEOUT_MS`\uFF0C`CLAVUE_COMBO_PLAN_BLOCK=1` \u6062\u590D\u4E00\u76F4\u7B49\uFF09\u3002\u72EC\u7ACB\u7684\u8BA1\u5212\u69FD\u5E76\u884C\uFF0C\u8D85\u65F6\u4E0D\u518D\u4E32\u884C\u6362\u4E0B\u4E00\u4E2A\u6A21\u578B\u3002\u8C03\u8BD5\u65E5\u5FD7\u4E00\u884C `stage -> model -> ms`\n- **ttqq \u9884\u8BBE\u4E0D\u518D\u5185\u7F6E `clavue-2.1-fast`\u3002** \u8F7B\u91CF\u69FD\u7559\u7A7A\uFF0C\u8F85\u52A9\u8C03\u7528\u8DDF\u7740\u4E3B\u6A21\u578B\uFF0C\u9664\u975E\u4F60\u81EA\u5DF1\u6307\u5B9A\n- **\u7B2C\u4E09\u65B9 JEV fan-out\u3002** \u8C03\u7528\u65B9\u6CA1\u6709\u6307\u5B9A\u6A21\u578B\u65F6\u4E0D\u518D\u585E\u9ED8\u8BA4 `clavue-jev`\n\n## 13.4.0 - 2026-10-16\n\n- **\u4F4E\u98CE\u9669 clavue-v1 \u5BF9\u9F50\uFF08#8\uFF09\u3002** \u6062\u590D\u4F1A\u8BDD\u3001\u5806\u9876\u3001\u6EA2\u51FA\u3001print \u6536\u5C3E\u4E0E goal \u95F8\u95E8\u4ECE clavue-v1 \u8FC1\u5165\n- **1.48.5 \u4E4B\u540E\u7684\u5BF9\u9F50\uFF08#9\uFF09\u3002** \u8FC1\u5165 clavue-v1 1.48.7\uFF0C\u5E76\u7F13\u5B58\u7A33\u5B9A\u7684 system \u524D\u7F00\n- **\u53EF\u9009\u7684\u539F\u751F fetch \u5BA2\u6237\u7AEF\uFF08#10\uFF09\u3002** `CLAVUE_NATIVE_CLIENT` \u672A\u8BBE\u7F6E\u65F6\u4ECD\u8D70\u539F\u6709\u4F20\u8F93\uFF1B\u8BBE\u7F6E\u540E\u6539\u7528\u57FA\u4E8E fetch \u7684\u5BA2\u6237\u7AEF\n- **\u53EF\u9009\u7684 Rust napi \u70ED\u8DEF\u5F84\uFF08#11\uFF09\u3002** `CLAVUE_NATIVE_RS` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u672A\u8BBE\u7F6E\u65F6\u4E0D\u52A0\u8F7D addon\n- **\u53EF\u9009\u7684 fast-apply\uFF08#12\uFF09\u3002** `clavue-fa` \u7684 ApplyEdit \u9ED8\u8BA4\u5173\u95ED\n- **\u53EF\u9009\u7684 JEV \u51B3\u7B56\u95E8\uFF08#14\uFF09\u3002** \u6302\u5728\u5171\u4EAB aux \u69FD\u4E0A\uFF0C\u9ED8\u8BA4\u4E0D\u542F\u7528\n- **\u7EC4\u5408\u6210\u672C\u95F8\u4E0E\u8F93\u51FA\u536B\u751F\uFF08#13\uFF09\u3002** \u4ECE clavue-v1 \u8FC1\u5165\uFF1B\u536B\u751F\u9ED8\u8BA4\u5173\u95ED\uFF0C\u88C1\u526A\u524D\u7F00\u4FDD\u6301\u7A33\u5B9A\n- **JEV / ApplyEdit \u5B9E\u673A\u4FEE\u590D\uFF08#15\uFF09\u3002** \u505C\u6389 JEV \u7684 follow-up \u5FAA\u73AF\uFF0C\u5E76\u4FEE\u6389 ApplyEdit \u7684 bundle \u5D29\u6E83\n- **\u53EF\u9009\u6548\u7387\u5305\uFF08#16\uFF09\u3002** `CLAVUE_EFFICIENCY` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u6253\u5F00\u540E\u5305\u542B\u5E76\u884C JEV\n- **\u6BCF\u56DE\u5408\u5F00\u9500\uFF08#17\uFF09\u3002** \u957F\u4F1A\u8BDD\u7684\u6BCF\u56DE\u5408\u5DE5\u4F5C\u4E0D\u518D\u626B\u5B8C\u6574\u5386\u53F2\uFF1Bpager \u6BCF\u5E27\u53EA\u68C0\u67E5\u7A97\u53E3\u5185\u7684 journal \u6233\n- **\u65B0\u80FD\u529B\u5168\u90E8\u9ED8\u8BA4\u5173\u95ED\u3002** `CLAVUE_NATIVE_CLIENT`\u3001`CLAVUE_NATIVE_RS`\u3001`clavue-fa`\u3001JEV\u3001\u7EC4\u5408\u6210\u672C\u4E0E\u8F93\u51FA\u536B\u751F\u3001`CLAVUE_EFFICIENCY` \u90FD\u8981\u663E\u5F0F\u6253\u5F00\u624D\u751F\u6548\n\n## 13.3.3 - 2026-09-29\n\n- **Esc\xD72 \u56DE\u9000\u9009\u62E9\u6846\u56DE\u6765\u4E86\u3002** \u53CC\u51FB Esc \u7684\u56DE\u9000\u300C\u9009\u62E9\u6846\u300D\u6B64\u524D\u4F1A\u5BF9\u5DF2\u7ECF\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\n \u5224\u5B9A\u6210 0 \u4E2A\u6539\u52A8\uFF0C\u4E8E\u662F\u628A\u5B83\u5F53\u6210\u6253\u9519\u7684\u7A7A\u56DE\u5408\u76F4\u63A5\u64A4\u56DE\uFF0C\u9009\u62E9\u5217\u8868\u6839\u672C\u4E0D\u518D\u51FA\u73B0\u3002\n \u6839\u56E0\u662F\u56DE\u9000\u7528\u7684\u6539\u52A8\u8BA1\u6570\u662F\u81EA\u5DF1\u7EF4\u62A4\u7684\u4E00\u5957\u5C0F\u5199\u5B50\u4E32\u5339\u914D\uFF08`edit ` / `write `\uFF09\uFF0C\n \u8BA4\u4E0D\u51FA\u5F53\u524D\u5DE5\u5177\u810A\u67F1\u7684\u771F\u5B9E\u5F62\u6001 `Update(path)` / `Create(path)` / `Write(path)`\u3002\n \u73B0\u5728\u8BA1\u6570\u6539\u8D70\u552F\u4E00\u7684\u7F16\u8F91\u5224\u5B9A `journal_format::is_edit_tool_label`\uFF0C\n \u4E0E\u4EA4\u4ED8\u6C47\u603B\u5171\u7528\u540C\u4E00\u6743\u5A01\uFF1A\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\u7167\u5E38\u5F39\u51FA\u9009\u62E9\u6846\uFF0C\n \u771F\u6B63\u6CA1\u6539\u52A8\u7684\u56DE\u5408\u4ECD\u6309\u7A7A\u56DE\u5408\u5373\u65F6\u64A4\u56DE\n- **\u53EA\u4FEE\u5206\u7C7B\uFF0C\u4E0D\u6539\u4EA4\u4E92\u3002** \u9009\u62E9\u6846\u7684\u7ED8\u5236\u3001\u952E\u76D8/\u9F20\u6807\u547D\u4E2D\u3001ModeSelect \u5355\u9009\u5168\u90E8\u4FDD\u6301\u539F\u6837\uFF1B\n \u672C\u6B21\u4EC5\u8BA9\u300C\u54EA\u4E9B\u56DE\u5408\u7B97\u6539\u8FC7\u6587\u4EF6\u300D\u8FD9\u4E00\u5904\u5224\u5B9A\u6062\u590D\u6B63\u786E\n\n## 13.3.2 - 2026-09-29\n\n- **\u5347\u7EA7\u6210\u529F\u540E\u76F4\u63A5\u8FDB\u5165\u754C\u9762\uFF0C\u4E0D\u518D\u8981\u6C42\u5B8C\u5168\u9000\u51FA\u3002** Node duplex \u5BBF\u4E3B\u662F\u9876\u5C42\u8FDB\u7A0B\uFF0C\n \u542F\u52A8\u65F6\u53EA\u89E3\u6790\u4E00\u6B21 `agentEntry` / `pagerBin`\uFF1B\u540E\u53F0 `npm install -g` \u6362\u6389\u4E86\u78C1\u76D8\u4E0A\u7684\n \u65B0\u7248\u672C\uFF0C\u5185\u5B58\u91CC\u4ECD\u662F\u65E7\u4EE3\u7801\uFF0C\u4E8E\u662F\u53EA\u80FD\u9760\u7528\u6237\u624B\u52A8\u9000\u51FA\u91CD\u8FDB\u3002\u73B0\u5728\u5BBF\u4E3B\u5728\u5347\u7EA7\u6210\u529F\u540E\n \u539F\u5730\u91CD\u6267\u884C\u81EA\u5DF1\uFF1Apager \u5148\u6309\u6B63\u5E38\u8DEF\u5F84\u9000\u51FA\uFF08\u79BB\u5F00 raw mode\u3001\u6062\u590D\u5C4F\u5E55\uFF09\uFF0CCLI \u5165\u53E3\n \u5728 pager \u91CA\u653E TTY \u540E\u518D\u8D77\u65B0\u8FDB\u7A0B\u3002\u5B88\u536B `CLAVUE_SESSION_RELAUNCH=1` \u9632\u6B62\u91CD\u6267\u884C\u5FAA\u73AF\uFF0C\n `CLAVUE_DISABLE_SESSION_RELAUNCH=1` \u53EF\u5173\u95ED\uFF1B\u6D4B\u8BD5/\u5F00\u53D1\u8FD0\u884C\u65F6\u62D2\u7EDD\u91CD\u6267\u884C\n- **\u9996\u6B21\u914D\u7F6E\u88C5\u8F7D\u540E\u540C\u6837\u539F\u5730\u8FDB\u5165\u754C\u9762\u3002** `routeTrack`\uFF08\u627F\u8F7D `needsSetup` /\n `officialReady`\uFF09\u6B64\u524D\u53EA\u5728\u542F\u52A8\u65F6\u53D1\u9001\u4E00\u6B21\uFF0C\u4E8E\u662F\u5728\u7EBF\u8DEF / BYOK \u9762\u677F\u4FDD\u5B58\u540E\uFF0C\n pager \u7684\u9996\u6B21\u914D\u7F6E\u83DC\u5355\u4E00\u76F4\u9501\u7740\uFF0C\u5FC5\u987B\u9000\u51FA\u91CD\u8FDB\u624D\u6D88\u5931\u3002\u73B0\u5728\u9762\u677F\u4FDD\u5B58\u91CD\u542F agent \u65F6\n \u4E00\u5E76\u91CD\u53D1 `routeTrack`\uFF0C\u754C\u9762\u5F53\u6B21\u4F1A\u8BDD\u5373\u89E3\u9501\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.3 - 2026-09-29\n\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.2 - 2026-09-20\n\n- \u539F\u751F pager \u53D1\u5E03\u95E8\u7981\u53D6\u771F\uFF1Astaged \u4E8C\u8FDB\u5236\u5FC5\u987B\u5185\u5D4C\u5F53\u524D pager \u6E90\u7801\u6458\u8981\n \uFF08`--build-info` JSON \u5F62\u72B6\u7684 `sourceDigest` \u5B57\u6BB5\uFF0C\u951A\u5B9A `"sourceDigest":"<64 hex>"`\uFF09\uFF0C\n \u65E7\u6E90\u7801\u7F16\u8BD1\u51FA\u7684\u4E8C\u8FDB\u5236\u5373\u4F7F\u54C8\u5E0C\u81EA\u6D3D\u4E5F\u4F1A\u88AB\u62D2\u7EDD\uFF0C\u4E0D\u518D\u9760\u4EC5\u81EA\u6D3D\u7684 manifest \u54C8\u5E0C\u653E\u884C\n- manifest \u6EAF\u6E90\u6539\u4E3A\u6309\u5E8F\u89E3\u6790\u800C\u975E\u9759\u9ED8\u7701\u7565\uFF1A`CLAVUE_RELEASE_SOURCE_COMMIT` \u2192\n `GITHUB_SHA` \u2192 `git rev-parse HEAD`\uFF1B`releaseTag` \u672A\u8BBE\u65F6\u56DE\u843D\u4E3A `v${version}`\uFF0C\n \u672C\u5730\u53D1\u5E03\u6784\u5EFA\u4E0D\u518D\u4E22\u5931\u53D1\u5E03\u95E8\u7981\u6240\u9700\u5B57\u6BB5\n- \u8FD0\u884C\u65F6\u4E0E pager \u4EA7\u7269\u4E0D\u53D8\uFF1A`dist/native` \u4E8C\u8FDB\u5236\u6CBF\u7528 13.2.1\uFF0C\u4EC5 `manifest.json`\n \u6EAF\u6E90\u4E0E\u95E8\u7981\u63A5\u7EBF\u53D8\u66F4\n\n## 13.2.1 - 2026-09-20\n\n- \u65E5\u8BB0\u7EB5\u5411\u8282\u594F\u6539\u4E3A\u4E24\u7EA7\uFF1A\u6BB5\u843D\u8FB9\u754C\uFF08\u65B0\u7684\u7528\u6237\u56DE\u5408\u3001Recap \u524D\uFF09\u5728\u6807\u51C6\u9AD8\u5EA6\u547C\u5438\u4E24\u884C\uFF0C\n \u6BB5\u5185\u5206\u7EC4\u7684\u547C\u5438\u4FDD\u6301\u4E00\u884C\uFF1Bcompact \u4E0B\u6240\u6709\u95F4\u9699\u4ECD\u4E3A\u4E00\u884C\uFF0C\u5BC6\u5EA6\u4E0D\u6D6A\u8D39\u4EFB\u4F55\u4E00\u884C\u3002\n \u7EC8\u7AEF\u6CA1\u6709\u5B57\u4F53\u884C\u9AD8\uFF0C\u8282\u594F\u53EA\u80FD\u6765\u81EA\u95F4\u9699\u5206\u7EA7\u4E0E\u5185\u8FB9\u8DDD\uFF0C\u8FD9\u6761\u89C4\u5F8B\u73B0\u5DF2\u5199\u5165 J8 \u800C\u975E\u6BCF\u6B21\u91CD\u65B0\u53D1\u73B0\n- \u9996\u5C4F\u6539\u4E3A compose-first\uFF1A\u5DF2\u914D\u7F6E\u7EBF\u8DEF\u65F6\uFF0C\u8F93\u5165\u6846\u4E3A\u7A7A\u6309 Enter \u76F4\u63A5\u5F00\u65B0\u4F1A\u8BDD\uFF08\u9879\u76EE\u9009\u62E9\u4ECD\u751F\u6548\uFF09\uFF0C\n \u63D0\u793A\u6587\u6848\u6539\u4E3A\u300CEnter \u5F00\u5DE5\u300D\uFF1B\u9996\u6B21\u8FD0\u884C\u4FDD\u7559\u786E\u8BA4\u8BED\u4E49\u2014\u2014\u7EBF\u8DEF\u5FC5\u987B\u5148\u5B58\u5728\uFF0C\u4F1A\u8BDD\u624D\u53EF\u80FD\u5F00\u59CB\n- \u9996\u5C4F\u8BB0\u4F4F\u6700\u8FD1\u4E09\u4E2A\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u663E\u793A\u5728\u4FE1\u606F\u677F\u4E0B\u65B9\uFF0C\u6309 1-3 \u76F4\u63A5\u91CD\u5F00\u3002\u663E\u793A\u7684 cwd \u53D6\u81EA\u4F1A\u8BDD\u8BB0\u5F55\u91CC\n \u5199\u5165\u7684 cwd \u5B57\u6BB5\uFF0C\u7EDD\u4E0D\u7531\u76EE\u5F55 slug \u53CD\u89E3\uFF08slug \u6709\u635F\uFF1A\u8DEF\u5F84\u5206\u9694\u7B26\u4E0E\u8FDE\u5B57\u7B26\u4E0D\u53EF\u533A\u5206\uFF09\uFF1B\n \u4E34\u65F6\u76EE\u5F55\u3001\u5BB6\u76EE\u5F55\u4E0E\u8BB0\u5F55\u5B58\u653E\u76EE\u5F55\u672C\u8EAB\u90FD\u88AB\u6392\u9664\n- \u95E8\u7981\u53D6\u771F\uFF1A\u4E24\u4E2A pager/broker \u6D4B\u8BD5\u4E0D\u518D\u8BFB\u5F00\u53D1\u673A\u672C\u5730\u7684 review model \u8986\u5199\uFF0C\n \u4E2A\u4EBA\u8BBE\u7F6E\u91CC\u7684 pin \u4E0D\u80FD\u518D\u628A\u53D1\u5E03\u95E8\u7981\u5224\u7EA2\n- \u6E90\u7801\u7EA7\u5224\u65AD\u57FA\u5E95\uFF08\u4E0D\u968F\u672C\u5305\u53D1\u5E03\uFF09\uFF1Alaziness / intent / verify-green \u4E09\u6761\u65E2\u6709\u89C4\u5219\u5730\u677F\u4E4B\u4E0B\n \u5404\u6709\u4E00\u4E2A\u7C7B\u578B\u5316\u5224\u65AD\u5C42\uFF0C\u9ED8\u8BA4\u4F11\u7720\uFF08\u672A\u8BBE TYPESAFE_API_KEY \u5373\u5B8C\u5168\u4E0D\u52A8\uFF09\u3002\n \u5B83\u5728 8.16.1 \u7684\u4EA7\u7269\u91CC\u662F\u60F0\u6027\u7684\u2014\u2014\u8BE6\u89C1\u53D1\u5E03\u8BF4\u660E\u7684 Known \u4E00\u8282\n\n## 13.2.0 - 2026-09-19\n\n- `/release-notes` \u79BB\u7EBF\u53EF\u7528\uFF1A\u6784\u5EFA\u671F\u628A `CHANGELOG.md` \u6CE8\u5165 `MACRO.VERSION_CHANGELOG`\n \uFF08\u6B64\u524D\u6052\u4E3A\u7A7A\u4E32\uFF09\uFF0C\u7F13\u5B58\u672A\u547D\u4E2D\u65F6\u56DE\u843D\u5230\u5185\u7F6E\u526F\u672C\u800C\u975E `""`\uFF0C\u5168\u65B0\u5B89\u88C5\u9996\u6B21\u8FD0\u884C\u5373\u53EF\u770B\u5230\u771F\u5B9E\u6761\u76EE\n- `/release-notes` \u7684\u94FE\u63A5\u4E0E\u540E\u53F0 fetch \u6B64\u524D\u90FD\u6307\u5411 anthropics/claude-code\uFF0C\u6539\u4E3A\u6307\u5411 Clavue \u81EA\u8EAB\u4ED3\u5E93\uFF1B\n \u547D\u4EE4\u6539\u4E3A\u5148\u8BFB\u672C\u5730\u5185\u5BB9\u3001\u628A\u7F51\u7EDC\u5F53\u4F5C\u4E0B\u6B21\u5237\u65B0\u7684\u6765\u6E90\uFF0C\u4E0D\u518D\u4E3A I/O \u963B\u585E\u7B54\u6848\n- hop \u6B63\u6587\u6536\u655B\uFF1A\u8FDE\u7EED\u91CD\u590D\u884C\u6298\u53E0\u4E3A\u9996\u5C3E\u4E24\u884C\u5E76\u6CE8\u660E\u7701\u7565\u6761\u6570\uFF08\u8FDE\u7EED\u4E24\u884C\u5C5E\u6B63\u5E38\u4E66\u5199\uFF0C\u4E0D\u5904\u7406\uFF09\uFF0C\n \u8D85\u957F\u6B63\u6587\u6539\u4E3A\u4FDD\u7559\u9996\u5C3E\u800C\u975E\u53EA\u7559\u5934\u90E8\uFF0C\u5E76\u6CE8\u660E\u539F\u59CB\u957F\u5EA6\uFF0C\u907F\u514D\u622A\u65AD\u540E\u7684\u6B63\u6587\u88AB\u8BEF\u8BFB\u4E3A\u672C\u6765\u5C31\u8FD9\u4E48\u77ED\n- Tips \u8FDC\u7A0B feed\uFF1A\u6587\u6848\u53EF\u5728\u4E0D\u53D1\u7248\u7684\u60C5\u51B5\u4E0B\u66F4\u6B63\u3002feed \u5C5E\u4E0D\u53EF\u4FE1\u8F93\u5165\uFF0C\u6309\u767D\u540D\u5355\u6821\u9A8C\u2014\u2014\n \u5FC5\u987B\u58F0\u660E\u672C\u4EA7\u54C1\u3001URL \u5FC5\u987B\u4E3A https\u3001\u5B57\u7B26\u4E32\u957F\u5EA6\u8BBE\u4E0A\u9650\uFF1B\u5355\u6761\u7578\u5F62\u6761\u76EE\u53EA\u4E22\u5F03\u81EA\u8EAB\uFF0C\u4E0D\u5F71\u54CD\u5176\u4F59\u6761\u76EE\u3002\n \u6761\u76EE\u590D\u7528\u65E2\u6709\u51B7\u5374\u673A\u5236\u5E76\u4F7F\u7528\u547D\u540D\u7A7A\u95F4 id\uFF0C\u4E0E\u5185\u7F6E\u63D0\u793A\u4E92\u4E0D\u5E72\u6270\uFF1B\u5931\u8D25\u5168\u7A0B\u9759\u9ED8\uFF0C\u7F51\u7EDC\u95EE\u9898\u4E0D\u4F1A\u53D8\u6210\u62A5\u9519\u6216\u62D6\u6162\u56DE\u5408\n- Tips \u63D0\u793A\u6B64\u524D\u4E0D\u53EF\u8FBE\u800C\u975E\u8FC7\u671F\uFF1A`getRelevantTips` \u7684\u552F\u4E00\u8C03\u7528\u65B9\u4E22\u5F03\u4E86\u7ED3\u679C\uFF0C`getTipToShowOnSpinner`\n \u65E0\u4EFB\u4F55\u8C03\u7528\u65B9\uFF0C`contextTipsActive` \u6052\u4E3A `false` \u4E14\u4ECE\u672A\u8D4B\u503C\u3002\u6539\u4E3A\u5728\u6E32\u67D3\u63D0\u793A\u7684 Spinner \u5185\u90E8\u9009\u53D6\u63D0\u793A\n\n## 13.1.5 - 2026-09-14\n\n- \u4FA7\u67E5\u8BE2\uFF08plan/review hop\u3001\u5206\u7C7B\u5668\u3001\u8BB0\u5FC6\u68C0\u7D22\u3001\u8BC1\u636E\u6536\u636E\uFF09\u6539\u4E3A\u6D41\u5F0F\uFF1A\u4E0D\u518D\u53D1 `stream:false` \u7684\n `/v1/chat/completions`\uFF0C\u907F\u514D\u6DF1\u5EA6\u63A8\u7406\u6A21\u578B\u5728\u7F51\u5173 600 \u79D2\u4EE3\u7406\u5899\u4E0A\u88AB\u6390\u65AD\n- \u4FA7\u67E5\u8BE2\u7684 `effort` \u771F\u6B63\u843D\u5230 `output_config.effort`\uFF1A\u6B64\u524D\u8BE5\u5B57\u6BB5\u672A\u5728\u9009\u9879\u7C7B\u578B\u4E0A\u58F0\u660E\uFF0C\n \u8C03\u7528\u65B9\u5C55\u5F00\u4F20\u503C\u4E0D\u4F1A\u89E6\u53D1\u7C7B\u578B\u68C0\u67E5\uFF0C\u503C\u88AB\u9759\u9ED8\u4E22\u5F03\uFF0C\u7F51\u5173\u9000\u56DE\u81EA\u8EAB\u9ED8\u8BA4\u6863\n- \u8BCA\u65AD\u7C7B Bash/PowerShell \u65E5\u5FD7\u8D70 light \u69FD\u8BC1\u636E\u6536\u636E\uFF1A\u5F15\u7528\u5FC5\u987B\u5728\u539F\u6587\u9010\u5B57\u8282\u547D\u4E2D\uFF0C\u5426\u5219\u4FDD\u7559\u539F\u65E5\u5FD7\uFF1B\n `CLAVUE_EVIDENCE_REDUCER=0` \u5173\u95ED\n- \u5927 Read/Grep/Glob \u9996\u6B21\u4ECD\u7ED9\u5168\u6587\uFF0C\u4E4B\u540E\u51BB\u6210 `clavue_observation_v1` \u5360\u4F4D\uFF0C\u7528 ObsRecall \u5206\u9875\u53EC\u56DE\uFF1B\n `CLAVUE_OBS_PACK=0` \u5173\u95ED\n- \u56DE\u5408\u6309 trivial/research/implement/heavy \u8C03\u5EA6 hop\uFF1B\u4E3B\u69FD model/effort \u7C98\u4F4F\u4EE5\u4FDD\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\n \u4EC5 compact \u540E\u4E14\u540C\u7C7B\u8FDE\u7EED\u4E24\u8F6E\u624D\u8003\u8651\u6539 effort\n- Plan hop \u7684 DSML \u7B49\u672A\u89E3\u6790\u5DE5\u5177\u65B9\u8A00\u4ECE Thought \u5C55\u793A\u4E0E plan/review \u4E0A\u4E0B\u6587\u4E00\u5E76\u5265\u79BB\uFF0C\u6574\u5757\u5220\u9664\uFF0C\n \u4E0D\u5199\u5165 transcript \u4E5F\u4E0D\u704C\u8FDB\u4E3B\u6A21\u578B\n- \u4ECE\u771F\u5B9E prompt-too-long \u62D2\u7EDD\u4E2D\u5B66\u4E60\u6BCF\u4E2A\u6A21\u578B\u7684\u5B9E\u9645\u8F93\u5165\u4E0A\u9650\uFF0C\u53EA\u6536\u7D27\u4E0D\u653E\u5927\u7A97\u53E3\uFF1B\u7F51\u5173\u53EA\u62A5\n `prompt_tokens` / `completion_tokens` \u65F6\u7528\u91CF\u4E0D\u518D\u5168\u6620\u5C04\u6210 0\n- Edit \u53EF\u9009 `then_run`\uFF1A\u4EC5\u5141\u8BB8\u5355\u6761\u8BCA\u65AD\u547D\u4EE4\uFF0C\u8D70 Bash \u6743\u9650\u5361\u4E0E sandbox\uFF0C\u7981\u6B62 `;&|` \u5939\u5E26\n- T0 Fast \u4FDD\u6301 primary-only\uFF1A\u8DEF\u5F84\u5C42\u5224\u5B9A\u524D\u7F6E\u5230 hop \u8C03\u5EA6\uFF0C\u6700\u7B80\u56DE\u5408\u4E0D\u518D\u4E3A\u8BC1\u636E\u6536\u636E\u4ED8\u4E00\u6B21 light \u5F80\u8FD4\n';return changelog2?changelog2.trim().split(`
8121
- `).filter(Boolean).slice(0,maxItems):[]}let changelog=getStoredChangelogFromMemory();if(!changelog)return[];let parsed;try{parsed=parseChangelog(changelog)}catch{return[]}let allNotes=[],versions=Object.keys(parsed).sort((a2,b3)=>gt2(a2,b3)?-1:1).slice(0,3);for(let version3 of versions){let notes=parsed[version3];notes&&allNotes.push(...notes)}return allNotes.slice(0,maxItems)}var MAX_LEFT_WIDTH,MAX_USERNAME_LENGTH,BORDER_PADDING,DIVIDER_WIDTH,CONTENT_PADDING,cachedActivity,cachePromise,init_logoV2Utils=__esm({"src/utils/logoV2Utils.ts"(){init_state();init_branding();init_stringWidth();init_auth();init_cwd2();init_file();init_format2();init_releaseNotes();init_semver();init_sessionStorage();init_settings2();MAX_LEFT_WIDTH=50,MAX_USERNAME_LENGTH=20,BORDER_PADDING=4,DIVIDER_WIDTH=1,CONTENT_PADDING=2;__name(getRemoteAwareDisplayPath,"getRemoteAwareDisplayPath");__name(getLayoutMode,"getLayoutMode");__name(calculateLayoutDimensions,"calculateLayoutDimensions");__name(calculateOptimalLeftWidth,"calculateOptimalLeftWidth");__name(formatWelcomeMessage,"formatWelcomeMessage");__name(truncatePath,"truncatePath");cachedActivity=[],cachePromise=null;__name(getRecentActivity,"getRecentActivity");__name(getRecentActivitySync,"getRecentActivitySync");__name(getLogoDisplayData,"getLogoDisplayData");__name(formatModelAndBilling,"formatModelAndBilling");__name(getRecentReleaseNotesSync,"getRecentReleaseNotesSync")}});function Clawd({pose="default"}={}){let frame=POSE_FRAMES[pose];return(0,import_jsx_runtime143.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime143.jsx)(ThemedText,{color:"mascot_body",children:frame.top}),(0,import_jsx_runtime143.jsx)(ThemedText,{color:"mascot_body",children:frame.middle}),(0,import_jsx_runtime143.jsx)(ThemedText,{color:"mascot_body",children:frame.bottom})]})}var import_jsx_runtime143,POSE_FRAMES,init_Clawd=__esm({"src/components/LogoV2/Clawd.tsx"(){init_ink();import_jsx_runtime143=__toESM(require_jsx_runtime()),POSE_FRAMES={default:{top:" \u256D\u2500\u2500\u256E ",middle:" \u2502 \u9F8D \u2502 ",bottom:" \u2570\u2500\u2500\u256F "},"look-left":{top:" \u256D\u2500\u2500\u256E ",middle:" \u2502\u9F8D \u2502 ",bottom:" \u2570\u2500\u2500\u256F "},"look-right":{top:" \u256D\u2500\u2500\u256E ",middle:" \u2502 \u9F8D\u2502 ",bottom:" \u2570\u2500\u2500\u256F "},"arms-up":{top:" \u2571\u256D\u2500\u2500\u256E\u2572 ",middle:" \u2502 \u9F8D \u2502 ",bottom:" \u2570\u2500\u2500\u256F "}};__name(Clawd,"Clawd")}});function calculateFeedWidth(config3){let{title,lines,footer,emptyMessage,customContent}=config3,maxWidth=stringWidth(title);if(customContent!==void 0)maxWidth=Math.max(maxWidth,customContent.width);else if(lines.length===0&&emptyMessage)maxWidth=Math.max(maxWidth,stringWidth(emptyMessage));else{let maxTimestampWidth=Math.max(0,...lines.map(line=>line.timestamp?stringWidth(line.timestamp):0));for(let line of lines){let timestampWidth=maxTimestampWidth>0?maxTimestampWidth:0,lineWidth=stringWidth(line.text)+(timestampWidth>0?timestampWidth+2:0);maxWidth=Math.max(maxWidth,lineWidth)}}return footer&&(maxWidth=Math.max(maxWidth,stringWidth(footer))),maxWidth}function Feed({config:config3,actualWidth}){let{title,lines,footer,emptyMessage,customContent}=config3,gap=" ",maxTimestampWidth=Math.max(0,...lines.map(line=>line.timestamp?stringWidth(line.timestamp):0));return(0,import_jsx_runtime144.jsxs)(ThemedBox_default,{flexDirection:"column",width:actualWidth,children:[(0,import_jsx_runtime144.jsx)(ThemedText,{bold:!0,color:"brand",children:title}),customContent?(0,import_jsx_runtime144.jsxs)(import_jsx_runtime144.Fragment,{children:[customContent.content,footer&&(0,import_jsx_runtime144.jsx)(ThemedText,{dimColor:!0,italic:!0,children:truncate2(footer,actualWidth)})]}):lines.length===0&&emptyMessage?(0,import_jsx_runtime144.jsx)(ThemedText,{dimColor:!0,children:truncate2(emptyMessage,actualWidth)}):(0,import_jsx_runtime144.jsxs)(import_jsx_runtime144.Fragment,{children:[lines.map((line,index)=>{let textWidth=Math.max(10,actualWidth-(maxTimestampWidth>0?maxTimestampWidth+gap.length:0));return(0,import_jsx_runtime144.jsxs)(ThemedText,{children:[maxTimestampWidth>0&&(0,import_jsx_runtime144.jsxs)(import_jsx_runtime144.Fragment,{children:[(0,import_jsx_runtime144.jsx)(ThemedText,{dimColor:!0,children:(line.timestamp||"").padEnd(maxTimestampWidth)}),gap]}),(0,import_jsx_runtime144.jsx)(ThemedText,{children:truncate2(line.text,textWidth)})]},index)}),footer&&(0,import_jsx_runtime144.jsx)(ThemedText,{dimColor:!0,italic:!0,children:truncate2(footer,actualWidth)})]})]})}var import_jsx_runtime144,init_Feed=__esm({"src/components/LogoV2/Feed.tsx"(){init_stringWidth2();init_ink();init_format2();import_jsx_runtime144=__toESM(require_jsx_runtime());__name(calculateFeedWidth,"calculateFeedWidth");__name(Feed,"Feed")}});function FeedColumn({feeds,maxWidth}){let feedWidths=feeds.map(feed=>calculateFeedWidth(feed)),maxOfAllFeeds=Math.max(...feedWidths),actualWidth=Math.min(maxOfAllFeeds,maxWidth);return(0,import_jsx_runtime145.jsx)(ThemedBox_default,{flexDirection:"column",children:feeds.map((feed,index)=>(0,import_jsx_runtime145.jsxs)(React65.Fragment,{children:[(0,import_jsx_runtime145.jsx)(Feed,{config:feed,actualWidth}),index<feeds.length-1&&(0,import_jsx_runtime145.jsx)(Divider,{color:"brand",width:actualWidth})]},index))})}var React65,import_jsx_runtime145,init_FeedColumn=__esm({"src/components/LogoV2/FeedColumn.tsx"(){React65=__toESM(require_react());init_ink();init_Divider();init_Feed();import_jsx_runtime145=__toESM(require_jsx_runtime());__name(FeedColumn,"FeedColumn")}});import{homedir as homedir37}from"os";function createRecentActivityFeed(activities){let lines=activities.map(log4=>{let time3=formatRelativeTimeAgo(log4.modified);return{text:(log4.summary&&log4.summary!=="No prompt"?log4.summary:log4.firstPrompt)||"",timestamp:time3}});return{title:"Recent activity",lines,footer:lines.length>0?"/resume for more":void 0,emptyMessage:"No recent activity"}}function createWhatsNewFeed(releaseNotes2){let lines=releaseNotes2.map(note=>({text:note}));return{title:"What's new",lines,footer:lines.length>0?"/release-notes for more":void 0,emptyMessage:"Check the Clavue changelog for updates"}}function createProjectOnboardingFeed(steps){let lines=steps.filter(({isEnabled:isEnabled3})=>isEnabled3).sort((a2,b3)=>Number(a2.isComplete)-Number(b3.isComplete)).map(({text:text3,isComplete})=>({text:`${isComplete?`${figures_default.tick} `:""}${text3}`})),warningText=getCwd()===homedir37()?"Note: You have launched Clavue in your home directory. For the best experience, launch it in a project directory instead.":void 0;return warningText&&lines.push({text:warningText}),{title:"Tips for getting started",lines}}var init_feedConfigs=__esm({"src/components/LogoV2/feedConfigs.tsx"(){init_figures();init_cwd2();init_format2();__name(createRecentActivityFeed,"createRecentActivityFeed");__name(createWhatsNewFeed,"createWhatsNewFeed");__name(createProjectOnboardingFeed,"createProjectOnboardingFeed")}});function OffscreenFreeze({children}){"use no memo";let inVirtualList=(0,import_react110.useContext)(InVirtualListContext),[ref,{isVisible}]=useTerminalViewport(),cached6=(0,import_react110.useRef)(children);return(isVisible||inVirtualList)&&(cached6.current=children),(0,import_jsx_runtime146.jsx)(ThemedBox_default,{ref,children:cached6.current})}var import_react110,import_jsx_runtime146,init_OffscreenFreeze=__esm({"src/components/OffscreenFreeze.tsx"(){import_react110=__toESM(require_react());init_use_terminal_viewport();init_ink();init_messageActions();import_jsx_runtime146=__toESM(require_jsx_runtime());__name(OffscreenFreeze,"OffscreenFreeze")}});function hold(pose,offset,frames){return Array.from({length:frames},()=>({pose,offset}))}function AnimatedClawd(){let{pose,bounceOffset,onClick}=useClawdAnimation();return(0,import_jsx_runtime147.jsx)(ThemedBox_default,{height:CLAWD_HEIGHT,flexDirection:"column",onClick,children:(0,import_jsx_runtime147.jsx)(ThemedBox_default,{marginTop:bounceOffset,flexShrink:0,children:(0,import_jsx_runtime147.jsx)(Clawd,{pose})})})}function useClawdAnimation(){let[reducedMotion]=(0,import_react111.useState)(()=>getInitialSettings().prefersReducedMotion??!1),[frameIndex,setFrameIndex]=(0,import_react111.useState)(-1),sequenceRef=(0,import_react111.useRef)(JUMP_WAVE),onClick=__name(()=>{reducedMotion||frameIndex!==-1||(sequenceRef.current=CLICK_ANIMATIONS[Math.floor(Math.random()*CLICK_ANIMATIONS.length)],setFrameIndex(0))},"onClick");(0,import_react111.useEffect)(()=>{if(frameIndex===-1)return;if(frameIndex>=sequenceRef.current.length){setFrameIndex(-1);return}let timer2=setTimeout(setFrameIndex,FRAME_MS,incrementFrame);return()=>clearTimeout(timer2)},[frameIndex]);let seq=sequenceRef.current,current=frameIndex>=0&&frameIndex<seq.length?seq[frameIndex]:IDLE;return{pose:current.pose,bounceOffset:current.offset,onClick}}var import_react111,import_jsx_runtime147,JUMP_WAVE,LOOK_AROUND,CLICK_ANIMATIONS,IDLE,FRAME_MS,incrementFrame,CLAWD_HEIGHT,init_AnimatedClawd=__esm({"src/components/LogoV2/AnimatedClawd.tsx"(){import_react111=__toESM(require_react());init_ink();init_settings2();init_Clawd();import_jsx_runtime147=__toESM(require_jsx_runtime());__name(hold,"hold");JUMP_WAVE=[...hold("default",1,2),...hold("arms-up",0,3),...hold("default",0,1),...hold("default",1,2),...hold("arms-up",0,3),...hold("default",0,1)],LOOK_AROUND=[...hold("look-right",0,5),...hold("look-left",0,5),...hold("default",0,1)],CLICK_ANIMATIONS=[JUMP_WAVE,LOOK_AROUND],IDLE={pose:"default",offset:0},FRAME_MS=60,incrementFrame=__name(i3=>i3+1,"incrementFrame"),CLAWD_HEIGHT=3;__name(AnimatedClawd,"AnimatedClawd");__name(useClawdAnimation,"useClawdAnimation")}});function BrandWordmark({version:version3,welcomeMessage,align="left",showVersion=!0}){return(0,import_jsx_runtime148.jsxs)(ThemedBox_default,{flexDirection:"column",alignItems:align==="center"?"center":"flex-start",children:[(0,import_jsx_runtime148.jsxs)(ThemedText,{children:[(0,import_jsx_runtime148.jsx)(ThemedText,{color:"inactive",children:"/"}),(0,import_jsx_runtime148.jsx)(ThemedText,{color:"brand",bold:!0,children:APP_NAME}),showVersion&&version3?(0,import_jsx_runtime148.jsx)(ThemedText,{dimColor:!0,children:` v${version3}`}):null]}),(0,import_jsx_runtime148.jsx)(ThemedText,{color:"brand",children:APP_BRAND_SUBTITLE}),welcomeMessage?(0,import_jsx_runtime148.jsx)(ThemedText,{dimColor:!0,children:welcomeMessage}):null]})}var import_jsx_runtime148,init_BrandWordmark=__esm({"src/components/LogoV2/BrandWordmark.tsx"(){init_ink();init_branding();import_jsx_runtime148=__toESM(require_jsx_runtime());__name(BrandWordmark,"BrandWordmark")}});function CondensedLogo(){let{columns}=useTerminalSize(),agent=useAppState(s2=>s2.agent),effortValue=useAppState(s2=>s2.effortValue),remoteCwd=useAppState(s2=>s2.remoteCwd),model=useMainLoopModel(),modelDisplayName=renderModelSetting(model),{version:version3,cwd:cwd6,billingType,agentName:agentNameFromSettings}=getLogoDisplayData({isRemoteMode:getIsRemoteMode(),remoteCwd}),agentName=agent??agentNameFromSettings,textWidth=Math.max(columns-15,20),truncatedVersion=truncate2(version3,Math.max(textWidth-13,6)),effortSuffix=getEffortSuffix(model,effortValue),{shouldSplit,truncatedModel,truncatedBilling}=formatModelAndBilling(modelDisplayName+effortSuffix,billingType,textWidth),cwdAvailableWidth=agentName?textWidth-1-stringWidth(agentName)-3:textWidth,truncatedCwd=truncatePath(cwd6,Math.max(cwdAvailableWidth,10)),locationLine=agentName?`@${agentName} \xB7 ${truncatedCwd}`:truncatedCwd;return(0,import_jsx_runtime149.jsx)(OffscreenFreeze,{children:(0,import_jsx_runtime149.jsxs)(ThemedBox_default,{flexDirection:"row",gap:2,alignItems:"center",children:[isFullscreenEnvEnabled()?(0,import_jsx_runtime149.jsx)(AnimatedClawd,{}):(0,import_jsx_runtime149.jsx)(Clawd,{}),(0,import_jsx_runtime149.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime149.jsx)(BrandWordmark,{version:truncatedVersion}),shouldSplit?(0,import_jsx_runtime149.jsxs)(import_jsx_runtime149.Fragment,{children:[(0,import_jsx_runtime149.jsx)(ThemedText,{dimColor:!0,children:truncatedModel}),(0,import_jsx_runtime149.jsx)(ThemedText,{dimColor:!0,children:truncatedBilling})]}):(0,import_jsx_runtime149.jsxs)(ThemedText,{dimColor:!0,children:[truncatedModel," \xB7 ",truncatedBilling]}),(0,import_jsx_runtime149.jsx)(ThemedText,{dimColor:!0,children:locationLine})]})]})})}var import_jsx_runtime149,init_CondensedLogo=__esm({"src/components/LogoV2/CondensedLogo.tsx"(){init_state();init_useMainLoopModel();init_useTerminalSize();init_stringWidth2();init_ink();init_AppState();init_effort();init_format2();init_fullscreen();init_logoV2Utils();init_model();init_OffscreenFreeze();init_AnimatedClawd();init_BrandWordmark();init_Clawd();import_jsx_runtime149=__toESM(require_jsx_runtime());__name(CondensedLogo,"CondensedLogo")}});function EmergencyTip(){let tip=(0,import_react112.useMemo)(getTipOfFeed,[]),lastShownTip=(0,import_react112.useMemo)(()=>getGlobalConfig().lastShownEmergencyTip,[]),shouldShow=tip.tip&&tip.tip!==lastShownTip;return(0,import_react112.useEffect)(()=>{shouldShow&&saveGlobalConfig(current=>current.lastShownEmergencyTip===tip.tip?current:{...current,lastShownEmergencyTip:tip.tip})},[shouldShow,tip.tip]),shouldShow?(0,import_jsx_runtime150.jsx)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:(0,import_jsx_runtime150.jsx)(ThemedText,{...tip.color==="warning"?{color:"warning"}:tip.color==="error"?{color:"error"}:{dimColor:!0},children:tip.tip})}):null}function getTipOfFeed(){return getDynamicConfig_CACHED_MAY_BE_STALE(CONFIG_NAME,DEFAULT_TIP)}var import_react112,import_jsx_runtime150,CONFIG_NAME,DEFAULT_TIP,init_EmergencyTip=__esm({"src/components/LogoV2/EmergencyTip.tsx"(){import_react112=__toESM(require_react());init_ink();init_growthbook();init_config12();import_jsx_runtime150=__toESM(require_jsx_runtime()),CONFIG_NAME="tengu-top-of-feed-tip";__name(EmergencyTip,"EmergencyTip");DEFAULT_TIP={tip:"",color:"dim"};__name(getTipOfFeed,"getTipOfFeed")}});function AnimatedAsterisk({char=TEARDROP_ASTERISK}){let[reducedMotion]=(0,import_react113.useState)(()=>getInitialSettings().prefersReducedMotion??!1),[done,setDone]=(0,import_react113.useState)(reducedMotion),startTimeRef=(0,import_react113.useRef)(null),[ref,time3]=useAnimationFrame(done?null:50);if((0,import_react113.useEffect)(()=>{if(done)return;let t7=setTimeout(setDone,TOTAL_ANIMATION_MS,!0);return()=>clearTimeout(t7)},[done]),done)return(0,import_jsx_runtime151.jsx)(ThemedBox_default,{ref,children:(0,import_jsx_runtime151.jsx)(ThemedText,{color:SETTLED_GREY,children:char})});startTimeRef.current===null&&(startTimeRef.current=time3);let hue=(time3-startTimeRef.current)/SWEEP_DURATION_MS*360%360;return(0,import_jsx_runtime151.jsx)(ThemedBox_default,{ref,children:(0,import_jsx_runtime151.jsx)(ThemedText,{color:toRGBColor(hueToRgb(hue)),children:char})})}var import_react113,import_jsx_runtime151,SWEEP_DURATION_MS,SWEEP_COUNT,TOTAL_ANIMATION_MS,SETTLED_GREY,init_AnimatedAsterisk=__esm({"src/components/LogoV2/AnimatedAsterisk.tsx"(){import_react113=__toESM(require_react());init_figures2();init_ink();init_settings2();init_utils7();import_jsx_runtime151=__toESM(require_jsx_runtime()),SWEEP_DURATION_MS=1500,SWEEP_COUNT=2,TOTAL_ANIMATION_MS=SWEEP_DURATION_MS*SWEEP_COUNT,SETTLED_GREY=toRGBColor({r:153,g:153,b:153});__name(AnimatedAsterisk,"AnimatedAsterisk")}});function shouldShowOpus1mMergeNotice(){return isOpus1mMergeEnabled()&&(getGlobalConfig().opus1mMergeNoticeSeenCount??0)<MAX_SHOW_COUNT}function Opus1mMergeNotice(){let[show]=(0,import_react114.useState)(shouldShowOpus1mMergeNotice);return(0,import_react114.useEffect)(()=>{if(!show)return;let newCount=(getGlobalConfig().opus1mMergeNoticeSeenCount??0)+1;saveGlobalConfig(prev=>(prev.opus1mMergeNoticeSeenCount??0)>=newCount?prev:{...prev,opus1mMergeNoticeSeenCount:newCount})},[show]),show?(0,import_jsx_runtime152.jsxs)(ThemedBox_default,{paddingLeft:2,children:[(0,import_jsx_runtime152.jsx)(AnimatedAsterisk,{char:UP_ARROW}),(0,import_jsx_runtime152.jsxs)(ThemedText,{dimColor:!0,children:[" ","Clavue Opus now includes a 1M context window"]})]}):null}var import_react114,import_jsx_runtime152,MAX_SHOW_COUNT,init_Opus1mMergeNotice=__esm({"src/components/LogoV2/Opus1mMergeNotice.tsx"(){import_react114=__toESM(require_react());init_figures2();init_ink();init_config12();init_model();init_AnimatedAsterisk();import_jsx_runtime152=__toESM(require_jsx_runtime()),MAX_SHOW_COUNT=6;__name(shouldShowOpus1mMergeNotice,"shouldShowOpus1mMergeNotice");__name(Opus1mMergeNotice,"Opus1mMergeNotice")}});function VoiceModeNotice(){return null}var import_react115,import_jsx_runtime153,init_VoiceModeNotice=__esm({"src/components/LogoV2/VoiceModeNotice.tsx"(){import_react115=__toESM(require_react());init_ink();init_config12();init_settings2();init_uiLocale();init_voiceModeEnabled();init_AnimatedAsterisk();init_Opus1mMergeNotice();import_jsx_runtime153=__toESM(require_jsx_runtime());__name(VoiceModeNotice,"VoiceModeNotice")}});function LogoV2(){let activities=getRecentActivitySync(),username=getGlobalConfig().oauthAccount?.displayName??"",{columns}=useTerminalSize(),showOnboarding=shouldShowProjectOnboarding(),showSandboxStatus=SandboxManager.isSandboxingEnabled(),agent=useAppState(s2=>s2.agent),effortValue=useAppState(s2=>s2.effortValue),remoteCwd=useAppState(s2=>s2.remoteCwd),remoteSessionUrl=useAppState(s2=>s2.remoteSessionUrl),config3=getGlobalConfig(),changelog;try{changelog=getRecentReleaseNotesSync(3)}catch{changelog=[]}let[announcement]=(0,import_react116.useState)(()=>{let announcements=getInitialSettings().companyAnnouncements;if(!(!announcements||announcements.length===0))return config3.numStartups===1?announcements[0]:announcements[Math.floor(Math.random()*announcements.length)]}),{hasReleaseNotes}=checkForReleaseNotesSync(config3.lastReleaseNotesSeen);(0,import_react116.useEffect)(()=>{getGlobalConfig().lastReleaseNotesSeen!=="13.9.1"&&(saveGlobalConfig(current=>current.lastReleaseNotesSeen==="13.9.1"?current:{...current,lastReleaseNotesSeen:"13.9.1"}),showOnboarding&&incrementProjectOnboardingSeenCount())},[config3,showOnboarding]);let model=useMainLoopModel(),fullModelDisplayName=renderModelSetting(model),{version:version3,cwd:cwd6,billingType,agentName:agentNameFromSettings}=getLogoDisplayData({isRemoteMode:getIsRemoteMode(),remoteCwd}),agentName=agent??agentNameFromSettings,effortSuffix=getEffortSuffix(model,effortValue),modelDisplayName=truncate2(fullModelDisplayName+effortSuffix,LEFT_PANEL_MAX_WIDTH-20);if(!hasReleaseNotes&&!showOnboarding&&!isEnvTruthy2(process.env.CLAUDE_CODE_FORCE_FULL_LOGO))return(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsx)(CondensedLogo,{}),(0,import_jsx_runtime154.jsx)(VoiceModeNotice,{}),(0,import_jsx_runtime154.jsx)(Opus1mMergeNotice,{}),isDebugMode()&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime154.jsx)(ThemedText,{color:"warning",children:"Debug mode enabled"}),(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["Logging to: ",isDebugToStdErr()?"stderr":getDebugLogPath()]})]}),(0,import_jsx_runtime154.jsx)(EmergencyTip,{}),process.env.CLAUDE_CODE_TMUX_SESSION&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["tmux session: ",process.env.CLAUDE_CODE_TMUX_SESSION]}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS?`Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - ${APP_NAME} uses ${process.env.CLAUDE_CODE_TMUX_PREFIX})`:`Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} d`})]}),announcement&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[!process.env.IS_DEMO&&config3.oauthAccount?.organizationName&&(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["Message from ",config3.oauthAccount.organizationName,":"]}),(0,import_jsx_runtime154.jsx)(ThemedText,{children:announcement})]}),!1,!1]});let layoutMode=getLayoutMode(columns),userTheme=resolveThemeSetting(getGlobalConfig().theme),borderTitle=` ${color("brand",userTheme)(APP_NAME)} ${color("inactive",userTheme)(`v${version3}`)} `,compactBorderTitle=color("brand",userTheme)(` ${APP_NAME} `);if(layoutMode==="compact"){let welcomeMessage2=formatWelcomeMessage(username);stringWidth(welcomeMessage2)>columns-4&&(welcomeMessage2=formatWelcomeMessage(null));let cwdAvailableWidth2=agentName?columns-4-"@".length-stringWidth(agentName)-" \xB7 ".length:columns-4,truncatedCwd2=truncatePath(cwd6,Math.max(cwdAvailableWidth2,10));return(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsx)(OffscreenFreeze,{children:(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{flexDirection:"column",borderStyle:"round",borderColor:"claude",borderText:{content:compactBorderTitle,position:"top",align:"start",offset:1},paddingX:1,paddingY:1,alignItems:"center",width:columns,children:[(0,import_jsx_runtime154.jsx)(ThemedText,{bold:!0,children:welcomeMessage2}),(0,import_jsx_runtime154.jsx)(ThemedBox_default,{marginY:1,children:(0,import_jsx_runtime154.jsx)(Clawd,{})}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:modelDisplayName}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:billingType}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:agentName?`@${agentName} \xB7 ${truncatedCwd2}`:truncatedCwd2})]})}),(0,import_jsx_runtime154.jsx)(VoiceModeNotice,{}),(0,import_jsx_runtime154.jsx)(Opus1mMergeNotice,{}),showSandboxStatus&&(0,import_jsx_runtime154.jsx)(ThemedBox_default,{marginTop:1,flexDirection:"column",children:(0,import_jsx_runtime154.jsx)(ThemedText,{color:"warning",children:"Your bash commands will be sandboxed. Disable with /sandbox."})})]})}let welcomeMessage=formatWelcomeMessage(username),modelKnown=isKnownModel(model),modelLine=!process.env.IS_DEMO&&config3.oauthAccount?.organizationName?`${modelDisplayName}${modelKnown?"":" (unknown \u2014 passthrough)"} \xB7 ${billingType} \xB7 ${config3.oauthAccount.organizationName}`:`${modelDisplayName}${modelKnown?"":" (unknown \u2014 passthrough)"} \xB7 ${billingType}`,cwdAvailableWidth=agentName?LEFT_PANEL_MAX_WIDTH-"@".length-stringWidth(agentName)-" \xB7 ".length:LEFT_PANEL_MAX_WIDTH,truncatedCwd=truncatePath(cwd6,Math.max(cwdAvailableWidth,10)),cwdLine=agentName?`@${agentName} \xB7 ${truncatedCwd}`:truncatedCwd,optimalLeftWidth=calculateOptimalLeftWidth(welcomeMessage,cwdLine,modelLine),{leftWidth,rightWidth}=calculateLayoutDimensions(columns,layoutMode,optimalLeftWidth);return(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsx)(OffscreenFreeze,{children:(0,import_jsx_runtime154.jsx)(ThemedBox_default,{flexDirection:"column",borderStyle:"round",borderColor:"claude",borderText:{content:borderTitle,position:"top",align:"start",offset:3},children:(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{flexDirection:layoutMode==="horizontal"?"row":"column",paddingX:1,gap:1,children:[(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{flexDirection:"column",width:leftWidth,justifyContent:"space-between",alignItems:"center",minHeight:9,children:[(0,import_jsx_runtime154.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime154.jsx)(ThemedText,{bold:!0,children:welcomeMessage})}),(0,import_jsx_runtime154.jsx)(Clawd,{}),(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{flexDirection:"column",alignItems:"center",children:[(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:modelLine}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:cwdLine})]})]}),layoutMode==="horizontal"&&(0,import_jsx_runtime154.jsx)(ThemedBox_default,{height:"100%",borderStyle:"single",borderColor:"claude",borderDimColor:!0,borderTop:!1,borderBottom:!1,borderLeft:!1}),layoutMode==="horizontal"&&(0,import_jsx_runtime154.jsx)(FeedColumn,{feeds:showOnboarding?[createProjectOnboardingFeed(getSteps()),createRecentActivityFeed(activities)]:[createRecentActivityFeed(activities),createWhatsNewFeed(changelog)],maxWidth:rightWidth})]})})}),(0,import_jsx_runtime154.jsx)(VoiceModeNotice,{}),(0,import_jsx_runtime154.jsx)(Opus1mMergeNotice,{}),isDebugMode()&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime154.jsx)(ThemedText,{color:"warning",children:"Debug mode enabled"}),(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["Logging to: ",isDebugToStdErr()?"stderr":getDebugLogPath()]})]}),(0,import_jsx_runtime154.jsx)(EmergencyTip,{}),process.env.CLAUDE_CODE_TMUX_SESSION&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["tmux session: ",process.env.CLAUDE_CODE_TMUX_SESSION]}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS?`Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - ${APP_NAME} uses ${process.env.CLAUDE_CODE_TMUX_PREFIX})`:`Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} d`})]}),announcement&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[!process.env.IS_DEMO&&config3.oauthAccount?.organizationName&&(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["Message from ",config3.oauthAccount.organizationName,":"]}),(0,import_jsx_runtime154.jsx)(ThemedText,{children:announcement})]}),showSandboxStatus&&(0,import_jsx_runtime154.jsx)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:(0,import_jsx_runtime154.jsx)(ThemedText,{color:"warning",children:"Your bash commands will be sandboxed. Disable with /sandbox."})}),!1,!1]})}var import_react116,import_jsx_runtime154,LEFT_PANEL_MAX_WIDTH,init_LogoV2=__esm({"src/components/LogoV2/LogoV2.tsx"(){init_branding();init_ink();init_useTerminalSize();init_stringWidth2();init_logoV2Utils();init_format2();init_file();init_Clawd();init_FeedColumn();init_feedConfigs();init_config12();init_systemTheme();init_settings2();init_debug();import_react116=__toESM(require_react());init_projectOnboardingState();init_CondensedLogo();init_OffscreenFreeze();init_releaseNotes();init_dumpPrompts();init_envUtils();init_startupProfiler();init_EmergencyTip();init_VoiceModeNotice();init_Opus1mMergeNotice();init_state();init_sandbox_adapter();init_AppState();init_effort();init_useMainLoopModel();init_model();import_jsx_runtime154=__toESM(require_jsx_runtime()),LEFT_PANEL_MAX_WIDTH=50;__name(LogoV2,"LogoV2")}});function CompactSummary({message,screen}){let isZh7=resolveUiLocale()==="zh-CN",isTranscriptMode=screen==="transcript",textContent=getUserMessageText(message)||"",metadata=message.summarizeMetadata;return metadata?(0,import_jsx_runtime155.jsx)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime155.jsx)(ThemedBox_default,{minWidth:2,children:(0,import_jsx_runtime155.jsx)(ThemedText,{color:"text",children:BLACK_CIRCLE})}),(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime155.jsx)(ThemedText,{bold:!0,children:isZh7?"\u4F1A\u8BDD\u6458\u8981":"Summarized conversation"}),!isTranscriptMode&&(0,import_jsx_runtime155.jsx)(MessageResponse,{children:(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime155.jsx)(ThemedText,{dimColor:!0,children:isZh7?`\u5DF2\u6458\u8981 ${metadata.messagesSummarized} \u6761\u6D88\u606F${metadata.direction==="up_to"?"(\u6B64\u5904\u4E4B\u524D)":"(\u6B64\u5904\u4E4B\u540E)"}`:`Summarized ${metadata.messagesSummarized} messages ${metadata.direction==="up_to"?"up to this point":"from this point"}`}),metadata.userContext&&(0,import_jsx_runtime155.jsxs)(ThemedText,{dimColor:!0,children:[isZh7?"\u4E0A\u4E0B\u6587:":"Context:"," ","\u201C",metadata.userContext,"\u201D"]}),(0,import_jsx_runtime155.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime155.jsx)(ConfigurableShortcutHint,{action:"app:toggleTranscript",context:"Global",fallback:"ctrl+o",description:isZh7?"\u5C55\u5F00\u5386\u53F2":"expand history",parens:!0})})]})}),isTranscriptMode&&(0,import_jsx_runtime155.jsx)(MessageResponse,{children:(0,import_jsx_runtime155.jsx)(ThemedText,{children:textContent})})]})]})}):(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime155.jsx)(ThemedBox_default,{minWidth:2,children:(0,import_jsx_runtime155.jsx)(ThemedText,{color:"text",children:BLACK_CIRCLE})}),(0,import_jsx_runtime155.jsx)(ThemedBox_default,{flexDirection:"column",children:(0,import_jsx_runtime155.jsxs)(ThemedText,{bold:!0,children:[isZh7?"\u538B\u7F29\u6458\u8981":"Compact summary",!isTranscriptMode&&(0,import_jsx_runtime155.jsxs)(ThemedText,{dimColor:!0,children:[" ",(0,import_jsx_runtime155.jsx)(ConfigurableShortcutHint,{action:"app:toggleTranscript",context:"Global",fallback:"ctrl+o",description:isZh7?"\u5C55\u5F00":"expand",parens:!0})]})]})})]}),isTranscriptMode&&(0,import_jsx_runtime155.jsx)(MessageResponse,{children:(0,import_jsx_runtime155.jsx)(ThemedText,{children:textContent})})]})}var import_jsx_runtime155,init_CompactSummary=__esm({"src/components/CompactSummary.tsx"(){init_figures2();init_ink();init_messages4();init_uiLocale();init_ConfigurableShortcutHint();init_MessageResponse();import_jsx_runtime155=__toESM(require_jsx_runtime());__name(CompactSummary,"CompactSummary")}});function useBlink(enabled5,intervalMs=BLINK_INTERVAL_MS){let focused=useTerminalFocus(),[ref,time3]=useAnimationFrame(enabled5&&focused?intervalMs:null);if(!enabled5||!focused)return[ref,!0];let isVisible=Math.floor(time3/intervalMs)%2===0;return[ref,isVisible]}var BLINK_INTERVAL_MS,init_useBlink=__esm({"src/hooks/useBlink.ts"(){init_ink();BLINK_INTERVAL_MS=600;__name(useBlink,"useBlink")}});function ToolUseLoader({isError:isError2,isUnresolved,shouldAnimate}){let[ref,isBlinking]=useBlink(shouldAnimate);return(0,import_jsx_runtime156.jsx)(ThemedBox_default,{ref,minWidth:2,children:(0,import_jsx_runtime156.jsx)(ThemedText,{color:isUnresolved?void 0:isError2?"error":"success",dimColor:isUnresolved,children:!shouldAnimate||isBlinking||isError2||!isUnresolved?BLACK_CIRCLE:" "})})}var import_jsx_runtime156,init_ToolUseLoader=__esm({"src/components/ToolUseLoader.tsx"(){init_figures2();init_useBlink();init_ink();import_jsx_runtime156=__toESM(require_jsx_runtime());__name(ToolUseLoader,"ToolUseLoader")}});function AdvisorMessage({block:block2,addMargin,resolvedToolUseIDs,erroredToolUseIDs,shouldAnimate,verbose,advisorModel}){if(block2.type==="server_tool_use"){let input2=block2.input&&Object.keys(block2.input).length>0?jsonStringify(block2.input):null;return(0,import_jsx_runtime157.jsxs)(ThemedBox_default,{marginTop:addMargin?1:0,paddingRight:2,flexDirection:"row",children:[(0,import_jsx_runtime157.jsx)(ToolUseLoader,{shouldAnimate,isUnresolved:!resolvedToolUseIDs.has(block2.id),isError:erroredToolUseIDs.has(block2.id)}),(0,import_jsx_runtime157.jsx)(ThemedText,{bold:!0,children:"Advising"}),advisorModel?(0,import_jsx_runtime157.jsxs)(ThemedText,{dimColor:!0,children:[" using ",renderModelName(advisorModel)]}):null,input2?(0,import_jsx_runtime157.jsxs)(ThemedText,{dimColor:!0,children:[" \xB7 ",input2]}):null]})}let body;switch(block2.content.type){case"advisor_tool_result_error":body=(0,import_jsx_runtime157.jsxs)(ThemedText,{color:"error",children:["Advisor unavailable (",block2.content.error_code,")"]});break;case"advisor_result":body=verbose?(0,import_jsx_runtime157.jsx)(ThemedText,{dimColor:!0,children:block2.content.text}):(0,import_jsx_runtime157.jsxs)(ThemedText,{dimColor:!0,children:[figures_default.tick," Advisor has reviewed the conversation and will apply the feedback ",(0,import_jsx_runtime157.jsx)(CtrlOToExpand,{})]});break;case"advisor_redacted_result":body=(0,import_jsx_runtime157.jsxs)(ThemedText,{dimColor:!0,children:[figures_default.tick," Advisor has reviewed the conversation and will apply the feedback"]});break}return(0,import_jsx_runtime157.jsx)(ThemedBox_default,{paddingRight:2,children:(0,import_jsx_runtime157.jsx)(MessageResponse,{children:body})})}var import_jsx_runtime157,init_AdvisorMessage=__esm({"src/components/messages/AdvisorMessage.tsx"(){init_figures();init_ink();init_model();init_slowOperations();init_CtrlOToExpand();init_MessageResponse();init_ToolUseLoader();import_jsx_runtime157=__toESM(require_jsx_runtime());__name(AdvisorMessage,"AdvisorMessage")}});function AssistantRedactedThinkingMessage({addMargin=!1}){return(0,import_jsx_runtime158.jsx)(ThemedBox_default,{marginTop:addMargin?1:0,children:(0,import_jsx_runtime158.jsx)(ThemedText,{dimColor:!0,italic:!0,children:"\u25C7 Thinking\u2026"})})}var import_jsx_runtime158,init_AssistantRedactedThinkingMessage=__esm({"src/components/messages/AssistantRedactedThinkingMessage.tsx"(){init_ink();import_jsx_runtime158=__toESM(require_jsx_runtime());__name(AssistantRedactedThinkingMessage,"AssistantRedactedThinkingMessage")}});function useClaudeAiLimits(){let[limits,setLimits]=(0,import_react117.useState)({...currentLimits});return(0,import_react117.useEffect)(()=>{let listener2=__name(newLimits=>{setLimits({...newLimits})},"listener");return statusListeners.add(listener2),()=>{statusListeners.delete(listener2)}},[]),limits}var import_react117,init_claudeAiLimitsHook=__esm({"src/services/claudeAiLimitsHook.ts"(){import_react117=__toESM(require_react());init_claudeAiLimits();__name(useClaudeAiLimits,"useClaudeAiLimits")}});function getUpsellMessage({shouldShowUpsell,isMax20x,shouldAutoOpenRateLimitOptionsMenu}){return shouldShowUpsell?shouldAutoOpenRateLimitOptionsMenu&&!isMax20x?"Opening your options\u2026":PROVIDER_SWITCH_HINT:null}function RateLimitMessage({text:text3,onOpenRateLimitOptions}){let isMax20x=getRateLimitTier()==="default_claude_max_20x",shouldShowUpsell=shouldProcessMockLimits()||isClaudeAISubscriber(),canSeeRateLimitOptionsUpsell=shouldShowUpsell&&!isMax20x,[hasOpenedInteractiveMenu,setHasOpenedInteractiveMenu]=(0,import_react118.useState)(!1),claudeAiLimits=useClaudeAiLimits(),isCurrentlyRateLimited=claudeAiLimits.status==="rejected"&&claudeAiLimits.resetsAt!==void 0&&!claudeAiLimits.isUsingOverage,shouldAutoOpenRateLimitOptionsMenu=canSeeRateLimitOptionsUpsell&&!hasOpenedInteractiveMenu&&isCurrentlyRateLimited&&onOpenRateLimitOptions;(0,import_react118.useEffect)(()=>{shouldAutoOpenRateLimitOptionsMenu&&(setHasOpenedInteractiveMenu(!0),onOpenRateLimitOptions())},[shouldAutoOpenRateLimitOptionsMenu,onOpenRateLimitOptions]);let upsell=(0,import_react118.useMemo)(()=>{let message=getUpsellMessage({shouldShowUpsell,isMax20x,shouldAutoOpenRateLimitOptionsMenu:!!shouldAutoOpenRateLimitOptionsMenu});return message?(0,import_jsx_runtime159.jsx)(ThemedText,{dimColor:!0,children:message}):null},[shouldShowUpsell,isMax20x,shouldAutoOpenRateLimitOptionsMenu]);return(0,import_jsx_runtime159.jsx)(MessageResponse,{children:(0,import_jsx_runtime159.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime159.jsx)(ThemedText,{color:"error",children:text3}),hasOpenedInteractiveMenu?null:upsell]})})}var import_react118,import_jsx_runtime159,init_RateLimitMessage=__esm({"src/components/messages/RateLimitMessage.tsx"(){import_react118=__toESM(require_react());init_ink();init_claudeAiLimitsHook();init_rateLimitMocking();init_auth();init_product();init_MessageResponse();import_jsx_runtime159=__toESM(require_jsx_runtime());__name(getUpsellMessage,"getUpsellMessage");__name(RateLimitMessage,"RateLimitMessage")}});function InvalidApiKeyMessage(){let isKeychainLocked=isMacOsKeychainLocked();return(0,import_jsx_runtime160.jsx)(MessageResponse,{children:(0,import_jsx_runtime160.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:getInvalidApiKeyErrorMessage()}),isKeychainLocked&&(0,import_jsx_runtime160.jsx)(ThemedText,{dimColor:!0,children:"\xB7 Run in another terminal: security unlock-keychain"})]})})}function AssistantTextMessage({param:{text:text3},addMargin,shouldShowDot,verbose,onOpenRateLimitOptions}){let isSelected=(0,import_react119.useContext)(MessageActionsSelectedContext);if(isEmptyMessageText(text3))return null;if(isRateLimitErrorMessage(text3))return(0,import_jsx_runtime160.jsx)(RateLimitMessage,{text:text3,onOpenRateLimitOptions});switch(text3){case NO_RESPONSE_REQUESTED:return null;case PROMPT_TOO_LONG_ERROR_MESSAGE:{let upgradeHint=getUpgradeMessage("warning");return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsxs)(ThemedText,{color:"error",children:["Context limit reached \xB7 /compact or /clear to continue",upgradeHint?` \xB7 ${upgradeHint}`:""]})})}case CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE:return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsxs)(ThemedText,{color:"error",children:["\u4F59\u989D\u4E0D\u8DB3 \xB7 \u8BF7\u5230\u6240\u7528\u670D\u52A1\u5546\u5145\u503C\uFF0C\u6216",PROVIDER_SWITCH_HINT]})});case getInvalidApiKeyErrorMessage():return(0,import_jsx_runtime160.jsx)(InvalidApiKeyMessage,{});case getInvalidApiKeyErrorMessageExternal():return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:getInvalidApiKeyErrorMessageExternal()})});case getOrgDisabledErrorMessageEnvKey():case getOrgDisabledErrorMessageEnvKeyWithOauth():return(0,import_jsx_runtime160.jsx)(MessageResponse,{children:(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:text3})});case getTokenRevokedErrorMessage():return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:getTokenRevokedErrorMessage()})});case getApiTimeoutErrorMessage():return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsxs)(ThemedText,{color:"error",children:[getApiTimeoutErrorMessage(),process.env.API_TIMEOUT_MS&&(0,import_jsx_runtime160.jsxs)(import_jsx_runtime160.Fragment,{children:[" ","(API_TIMEOUT_MS=",process.env.API_TIMEOUT_MS,"ms, try increasing it)"]})]})});case getCustomOffSwitchMessage():return(0,import_jsx_runtime160.jsx)(MessageResponse,{children:(0,import_jsx_runtime160.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:getCustomOffSwitchMessage()}),(0,import_jsx_runtime160.jsxs)(ThemedText,{children:["To continue immediately, use /model to switch to"," ",renderModelName(getDefaultSonnetModel())," and continue coding."]})]})});case ERROR_MESSAGE_USER_ABORT:return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsx)(InterruptedByUser,{})});default:if(startsWithApiErrorPrefix(text3)){let truncated=!verbose&&text3.length>MAX_API_ERROR_CHARS;return(0,import_jsx_runtime160.jsx)(MessageResponse,{children:(0,import_jsx_runtime160.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:text3===API_ERROR_MESSAGE_PREFIX?`${API_ERROR_MESSAGE_PREFIX}: Please wait a moment and try again.`:truncated?text3.slice(0,MAX_API_ERROR_CHARS)+"\u2026":text3}),truncated&&(0,import_jsx_runtime160.jsx)(CtrlOToExpand,{})]})})}return(0,import_jsx_runtime160.jsx)(ThemedBox_default,{alignItems:"flex-start",flexDirection:"row",justifyContent:"space-between",marginTop:addMargin?1:0,width:"100%",backgroundColor:isSelected?"messageActionsBackground":void 0,children:(0,import_jsx_runtime160.jsxs)(ThemedBox_default,{flexDirection:"row",children:[shouldShowDot&&(0,import_jsx_runtime160.jsx)(NoSelect,{fromLeftEdge:!0,minWidth:2,children:(0,import_jsx_runtime160.jsx)(ThemedText,{color:isSelected?"suggestion":"text",children:BLACK_CIRCLE})}),(0,import_jsx_runtime160.jsx)(ThemedBox_default,{flexDirection:"column",children:(0,import_jsx_runtime160.jsx)(Markdown,{children:text3})})]})})}}var import_react119,import_jsx_runtime160,MAX_API_ERROR_CHARS,init_AssistantTextMessage=__esm({"src/components/messages/AssistantTextMessage.tsx"(){import_react119=__toESM(require_react());init_compact2();init_rateLimitMessages();init_figures2();init_ink();init_errors8();init_messages4();init_contextWindowUpgradeCheck();init_model();init_macOsKeychainStorage();init_CtrlOToExpand();init_InterruptedByUser();init_Markdown();init_MessageResponse();init_messageActions();init_RateLimitMessage();init_product();import_jsx_runtime160=__toESM(require_jsx_runtime()),MAX_API_ERROR_CHARS=1e3;__name(InvalidApiKeyMessage,"InvalidApiKeyMessage");__name(AssistantTextMessage,"AssistantTextMessage")}});function AssistantThinkingMessage({param,addMargin=!1,isTranscriptMode,verbose,hideInTranscript=!1}){let thinking=param?.thinking||"";if(!thinking||hideInTranscript)return null;let shouldShowFullThinking=isTranscriptMode||verbose,label2="\u25C7 Thought",durationMs=param?.durationMs,tokenEstimate=thinking?Math.max(1,Math.floor(thinking.length/4)):0,durationLabel=durationMs?`Thought for ${(durationMs/1e3).toFixed(1)}s (${tokenEstimate} tokens)`:label2;if(!shouldShowFullThinking){let preview2="";if(thinking){let firstLine3=thinking.split(`
8120
+ `)}var SYSTEM_REMINDER_CLOSE,RENDERED_AS_SENTINEL,searchTextCache,init_transcriptSearch=__esm({"src/utils/transcriptSearch.ts"(){init_messages4();SYSTEM_REMINDER_CLOSE="</system-reminder>",RENDERED_AS_SENTINEL=new Set([INTERRUPT_MESSAGE,INTERRUPT_MESSAGE_FOR_TOOL_USE]),searchTextCache=new WeakMap;__name(renderableSearchText,"renderableSearchText");__name(computeSearchText,"computeSearchText");__name(toolUseSearchText,"toolUseSearchText");__name(toolResultSearchText,"toolResultSearchText")}});function getRemoteAwareDisplayPath(appState){let displayBase=process.env.DEMO_VERSION?"/code/claude":getDisplayPath(appState?.isRemoteMode&&appState.remoteCwd?appState.remoteCwd:getCwd()),serverUrl=getDirectConnectServerUrl();return serverUrl?`${displayBase} in ${serverUrl.replace(/^https?:\/\//,"")}`:displayBase}function getLayoutMode(columns){return columns>=70?"horizontal":"compact"}function calculateLayoutDimensions(columns,layoutMode,optimalLeftWidth){if(layoutMode==="horizontal"){let leftWidth=optimalLeftWidth,usedSpace=BORDER_PADDING+CONTENT_PADDING+DIVIDER_WIDTH+leftWidth,availableForRight=columns-usedSpace,rightWidth=Math.max(30,availableForRight),totalWidth2=Math.min(leftWidth+rightWidth+DIVIDER_WIDTH+CONTENT_PADDING,columns-BORDER_PADDING);return totalWidth2<leftWidth+rightWidth+DIVIDER_WIDTH+CONTENT_PADDING&&(rightWidth=totalWidth2-leftWidth-DIVIDER_WIDTH-CONTENT_PADDING),{leftWidth,rightWidth,totalWidth:totalWidth2}}let totalWidth=Math.min(columns-BORDER_PADDING,MAX_LEFT_WIDTH+20);return{leftWidth:totalWidth,rightWidth:totalWidth,totalWidth}}function calculateOptimalLeftWidth(welcomeMessage,truncatedCwd,modelLine){let contentWidth=Math.max(stringWidth(welcomeMessage),stringWidth(APP_BRAND_SUBTITLE),stringWidth(truncatedCwd),stringWidth(modelLine),20);return Math.min(contentWidth+4,MAX_LEFT_WIDTH)}function formatWelcomeMessage(username){return!username||username.length>MAX_USERNAME_LENGTH?"\u51C6\u5907\u597D\u4E86\u5C31\u5F00\u59CB\u3002":`\u6B22\u8FCE\u56DE\u6765\uFF0C${username}\u3002`}function truncatePath(path40,maxLength){if(stringWidth(path40)<=maxLength)return path40;let separator="/",ellipsis="\u2026",ellipsisWidth=1,separatorWidth=1,parts=path40.split(separator),first=parts[0]||"",last2=parts[parts.length-1]||"",firstWidth=stringWidth(first),lastWidth=stringWidth(last2);if(parts.length===1)return truncateToWidth(path40,maxLength);if(first===""&&ellipsisWidth+separatorWidth+lastWidth>=maxLength)return`${separator}${truncateToWidth(last2,Math.max(1,maxLength-separatorWidth))}`;if(first!==""&&ellipsisWidth*2+separatorWidth+lastWidth>=maxLength)return`${ellipsis}${separator}${truncateToWidth(last2,Math.max(1,maxLength-ellipsisWidth-separatorWidth))}`;if(parts.length===2){let availableForFirst=maxLength-ellipsisWidth-separatorWidth-lastWidth;return`${truncateToWidthNoEllipsis(first,availableForFirst)}${ellipsis}${separator}${last2}`}let available=maxLength-firstWidth-lastWidth-ellipsisWidth-2*separatorWidth;if(available<=0){let availableForFirst=Math.max(0,maxLength-lastWidth-ellipsisWidth-2*separatorWidth);return`${truncateToWidthNoEllipsis(first,availableForFirst)}${separator}${ellipsis}${separator}${last2}`}let middleParts=[];for(let i3=parts.length-2;i3>0;i3--){let part=parts[i3];if(part&&stringWidth(part)+separatorWidth<=available)middleParts.unshift(part),available-=stringWidth(part)+separatorWidth;else break}return middleParts.length===0?`${first}${separator}${ellipsis}${separator}${last2}`:`${first}${separator}${ellipsis}${separator}${middleParts.join(separator)}${separator}${last2}`}async function getRecentActivity(){if(cachePromise)return cachePromise;let currentSessionId=getSessionId();return cachePromise=loadMessageLogs(10).then(logs2=>(cachedActivity=logs2.filter(log4=>{if(log4.isSidechain||log4.sessionId===currentSessionId||log4.summary?.includes("I apologize"))return!1;let hasSummary=log4.summary&&log4.summary!=="No prompt",hasFirstPrompt=log4.firstPrompt&&log4.firstPrompt!=="No prompt";return hasSummary||hasFirstPrompt}).slice(0,3),cachedActivity)).catch(()=>(cachedActivity=[],cachedActivity)),cachePromise}function getRecentActivitySync(){return cachedActivity}function getLogoDisplayData(appState){let version3=process.env.DEMO_VERSION??APP_VERSION,cwd6=getRemoteAwareDisplayPath(appState),billingType=isClaudeAISubscriber()?getSubscriptionName():"Usage-based API billing",agentName=getInitialSettings().agent;return{version:version3,cwd:cwd6,billingType,agentName}}function formatModelAndBilling(modelName,billingType,availableWidth){return stringWidth(modelName)+3+stringWidth(billingType)>availableWidth?{shouldSplit:!0,truncatedModel:truncate2(modelName,availableWidth),truncatedBilling:truncate2(billingType,availableWidth)}:{shouldSplit:!1,truncatedModel:truncate2(modelName,Math.max(availableWidth-stringWidth(billingType)-3,10)),truncatedBilling:billingType}}function getRecentReleaseNotesSync(maxItems){if(process.env.USER_TYPE==="ant"){let changelog2='# Changelog\n\nClavue \u53D1\u5E03\u8BF4\u660E\u3002\u672C\u6587\u4EF6\u5728\u6784\u5EFA\u65F6\u6CE8\u5165\u8FD0\u884C\u65F6\uFF0C\u9A71\u52A8 `/release-notes` \u4E0E\u542F\u52A8\u753B\u9762\u7684\u300C\u65B0\u7279\u6027\u300D\u680F\u3002\n\n\u683C\u5F0F\u7EA6\u5B9A\uFF08\u89E3\u6790\u5668\u4F9D\u8D56\uFF09\uFF1A\u4E8C\u7EA7\u6807\u9898\u4E3A `## <\u7248\u672C> - <\u65E5\u671F>`\uFF0C\u6761\u76EE\u4EE5 `- ` \u5F00\u5934\uFF0C\u4E00\u884C\u4E00\u6761\uFF0C\n\u547D\u4EE4\u3001\u53C2\u6570\u4E0E\u6A21\u578B\u540D\u4FDD\u7559\u82F1\u6587\u3002\n\n## 13.9.2 - 2026-10-23\n\n- **\u8FDE\u7EED\u601D\u8003\u6298\u6210\u4E00\u884C\u3002** \u7ED8\u5236\u65F6\u5408\u5E76\u76F8\u90BB Thinking \u810A\uFF1B\u4E0D\u8DB3 50ms \u4E0D\u518D\u663E\u793A `0.0s`\uFF1B\u540C id \u65F6\u957F\u7ECF\u6458\u8981\u7BA1\u9053\u7D2F\u52A0\n- **\u601D\u8003\u5C3E\u5DF4\u589E\u91CF\u91CD\u7ED8\u3002** \u810F\u5C3E\u5DF4\u53EA\u91CD\u753B\u7C98\u5728\u4E00\u8D77\u7684 Tool / Thinking / Verify \u540E\u7F00\uFF0C\u4E0D\u518D\u6574\u672C\u65E5\u8BB0\u91CD\u6392\n- **\u6D41\u5F0F\u601D\u8003\u5171\u7528\u4E00\u4E2A id\u3002** \u540C\u4E00\u6761\u52A9\u624B\u6D88\u606F\u53EA\u4FDD\u7559\u4E00\u4E2A thinking id\uFF0C\u907F\u514D\u6BCF\u7247\u6BB5\u5168\u91CF rebuild\n- **\u957F\u8DEF\u5F84\u6309\u659C\u6760\u6298\u884C\u3002** URL \u4E0E\u7EDD\u5BF9\u8DEF\u5F84\u5728 `/` \u6216 `\\` \u540E\u65AD\u884C\uFF0C\u51CF\u5C11\u8BCD\u4E2D\u622A\u65AD\n- **\u52A9\u624B\u8868\u683C\u4E0A\u4E0B\u7559\u767D\u3002** \u56F4\u680F\u5916\u3001`\u250C` \u524D\u4E0E `\u2514` \u540E\u5404\u7559\u4E00\u884C\uFF0C\u51CF\u8F7B\u62E5\u6324\n- **hello.version \u8986\u76D6\u9876\u680F\u7248\u672C\u3002** \u975E\u7A7A hello \u7248\u672C\u8986\u76D6\u7F16\u8BD1\u671F chrome \u7248\u672C\uFF1Bdoctrine map \u4EE5 `package.json` \u4E3A\u73B0\u884C npm pin\n\n## 13.9.1 - 2026-10-23\n\n- **\u951A\u5B9A\u4F1A\u8BDD cwd \u5199\u6587\u4EF6\u3002** \u65E0\u663E\u5F0F\u8DEF\u5F84\u65F6 Edit/Write \u4E0D\u5F97\u843D\u5230\u5144\u5F1F\u6C99\u7BB1\uFF1B\u7EDD\u5BF9\u8DEF\u5F84\u9003\u51FA session cwd \u4F1A\u88AB\u62D2\u7EDD\n- **print \u6210\u529F\u5373\u9000\u51FA 0\u3002** `subtype=success` \u65F6\u8FDB\u7A0B\u9000\u51FA\u7801\u6052\u4E3A 0\uFF0C\u4E0D\u518D\u51FA\u73B0 success \u5374 exit 1\uFF08bench C1\uFF09\n- **print \u7ED3\u679C\u8865\u9F50 timing\u3002** `result.timing` \u53EF\u5BF9\u6807 v1\uFF08wallMs / modelMs / toolCalls \u7B49\uFF09\n\n## 13.9.0 - 2026-10-23\n\n- **\u754C\u9762\u5168\u9762\u5BF9\u6807 Grok Build\u3002** \u9876\u680F/\u5E95\u680F/\u72B6\u6001\u884C\uFF08chrome\uFF09\u3001\u4E3B\u9898\u8272\u4E0E\u5B57\u5F62\u3001\u9996\u9875\u4E00\u5C4F\u53EF\u8F93\u5165\u4E14\u70ED\u952E\u4E0D\u541E\u9996\u5B57\u3001\u952E\u4F4D\u5BFC\u822A\u4E0E\u5FEB\u6377\u952E\u9762\u677F\u3001\u4E00\u8F6E\u6C47\u603B \u25C8 / \u9010\u6761 \u25C6 / \u4E09\u5C42\u5C55\u5F00\u3001\u5185\u8054\u6743\u9650\u5361\u3001\u5B50\u4EE3\u7406\u884C\u4E0E dock\u3001\u65E5\u8BB0\u964D\u566A\u4E0E\u5931\u8D25\u6761\uFF0C\u516B\u7EC4 GUI \u4E00\u5E76\u5408\u5165\n- **\u534F\u8BAE\u767B\u8BB0\u91CD\u5EFA\u3002** \u5408\u5E76\u540E\u7EDF\u4E00\u91CD\u5EFA UI \u534F\u8BAE registry\uFF0C\u4FDD\u7559\u5168\u90E8\u4E8B\u4EF6\u767B\u8BB0\uFF0C\u4E0D\u4E22\u7AEF\u53E3\n\n## 13.8.0 - 2026-10-22\n\n- **\u51FA\u9519\u65F6\u8BF4\u6E05\u695A\u3001\u5C11\u7A7A\u8F6C\u3002** \u9519\u8BEF\u7EDF\u4E00\u5206\u6210\u53EF\u91CD\u8BD5\u3001\u53EF\u6062\u590D\u3001\u5FC5\u987B\u505C\u6B62\u4E09\u7C7B\uFF1B401/402/\u78C1\u76D8\u6EE1\u76F4\u63A5\u505C\u5E76\u7ED9\u4E00\u884C\u539F\u56E0\uFF0C\u65AD\u7F51\u3001\u8D85\u65F6\u3001429\u30015xx \u624D\u91CD\u8BD5\n- **\u574F\u5DE5\u5177\u8C03\u7528\u81EA\u52A8\u4FEE\u3002** \u65E0\u540D\u6216\u53C2\u6570\u574F\u6389\u7684\u5DE5\u5177\u8C03\u7528\u6309\u300C\u4E22\u5F03\u91CD\u8BD5 \u2192 \u63D0\u9192\u5DE5\u5177\u540D \u2192 \u6309\u53C2\u6570\u63A8\u65AD \u2192 \u6362\u6A21\u578B\u300D\u4FEE\u590D\uFF0C\u72B6\u6001\u884C\u663E\u793A\u300C\u6B63\u5728\u91CD\u8BD5 (n/4)\u300D\uFF0C\u4FEE\u4E0D\u597D\u53EA\u7559\u4E00\u884C\u9519\u8BEF\n- **\u56DE\u590D\u88AB\u622A\u65AD\u80FD\u63A5\u4E0A\u3002** \u6D41\u4E2D\u65AD\u540E\u4ECE\u65AD\u70B9\u7EED\u5199\uFF0C\u9996\u5B57\u7B49\u5F85\u6309\u7F51\u5173\u8868\u73B0\u81EA\u9002\u5E94\uFF1B\u5207\u5230\u5907\u7528\u6A21\u578B\u65F6\u5DE5\u5177\u5217\u8868\u4FDD\u6301\u4E0D\u53D8\uFF0C\u63D0\u793A\u7F13\u5B58\u4E0D\u5931\u6548\n- **\u81EA\u52A8\u7EED\u63A5\u53EA\u6709\u4E00\u4E2A\u51FA\u53E3\u3002** \u5404\u7C7B\u7EED\u63A5\u8D70\u540C\u4E00\u51FA\u53E3\uFF0C\u6709\u8FDB\u5C55\u4E0D\u8BA1\u6570\uFF0C\u8FDE\u7EED\u65E0\u8FDB\u5C55 8 \u6B21\u6216\u6BCF\u56DE\u5408 40 \u6B21\u540E\u505C\u4E0B\u5E76\u8BF4\u660E\uFF1B\u6309\u8BC1\u636E\u5224\u65AD\u662F\u5426\u5361\u4F4F\uFF0C\u4E0D\u518D\u51ED\u5B57\u6570\n- **\u5B50\u4EE3\u7406\u6709\u8D26\u672C\u3002** \u6309\u5B50\u4EE3\u7406\u8BB0\u5F55\u5DE5\u5177\u6B21\u6570\u3001token \u548C\u91CD\u590D\u8BFB\u53D6\uFF1B\u652F\u6301\u65F6\u95F4\u9884\u7B97\u4E0E\u6536\u5C3E\u603B\u7ED3\u56DE\u5408\uFF0C\u53EA\u8BFB\u4EFB\u52A1\u4E0D\u518D\u88AB\u8981\u6C42\u6539\u6587\u4EF6\uFF1B`/parallel` \u6709\u5E76\u53D1\u4E0A\u9650\n- **\u66F4\u5B89\u5168\u3002** \u62E6\u622A\u8BEF\u6740\u81EA\u8EAB\u6216\u65E0\u5173\u8FDB\u7A0B\u7684 kill\uFF1B\u65B0\u589E AIza\u3001AKIA/ASIA\u3001glpat-\u3001hf_\u3001npm_\u3001xai- \u7B49\u683C\u5F0F\u53CA\u300C\u4E3B\u673A \u7528\u6237 \u5BC6\u7801\u300D\u4E09\u6BB5\u5F0F\u6253\u7801\uFF1B\u6539\u52A8 `~/.ssh`\u3001`~/.aws` \u7B49\u51ED\u636E\u8DEF\u5F84\u524D\u5148\u786E\u8BA4\n- **\u8BF7\u6C42\u4F53 gzip\u3002** \u7F51\u5173\u652F\u6301\u65F6\u8BF7\u6C42\u81EA\u52A8\u538B\u7F29\uFF0C\u9047\u5230 400/415 \u56DE\u9000\u5E76\u8BB0\u4F4F\u4E00\u5C0F\u65F6\uFF1B\u82E5\u5E72\u754C\u9762\u7EC6\u8282\u4FEE\u6574\n\n## 13.7.0 - 2026-10-21\n\n- **\u65E5\u8BB0\u91CD\u505A\uFF0C\u8F93\u51FA\u66F4\u5E72\u51C0\u3002** \u6BCF\u8F6E\u53EA\u51FA\u4E8B\u4EF6\uFF08\u5F00\u59CB\u3001\u5DE5\u5177\u5F00\u59CB\u4E0E\u7ED3\u675F\u3001\u6700\u7EC8\u56DE\u7B54\u3001\u7ED3\u675F\u539F\u56E0\uFF09\uFF0C\u65E5\u8BB0\u6587\u5B57\u7EDF\u4E00\u7531 pager \u751F\u6210\uFF1B\u7ED3\u5C3E\u4E00\u8F6E\u4E00\u884C\u3001\u5C5E\u4E8E\u672C\u8F6E\uFF0C\u5931\u8D25\u6216\u4E2D\u65AD\u65F6\u4E0D\u518D\u5199\u300C\u5B8C\u6210\u300D\uFF0C\u6D3B\u52A8\u6761\u4E0D\u518D\u6F0F\u51FA\u5185\u90E8\u7F16\u7801\n- **\u540E\u53F0\u4EFB\u52A1\u4E0D\u518D\u5237\u5C4F\u3002** \u76F8\u90BB\u7684\u540E\u53F0\u4EFB\u52A1\u901A\u77E5\u5408\u5E76\u6210\u4E00\u8F6E\u5904\u7406\uFF08\u5408\u5E76\u7A97\u53E3\u9ED8\u8BA4 1500ms\uFF09\uFF0C\u81EA\u52A8\u8DDF\u8FDB\u56DE\u5408\u5931\u8D25\u65F6\u53EA\u7559\u4E00\u6761\u53EF\u539F\u5730\u66F4\u65B0\u7684\u63D0\u793A\uFF0C\u4E0D\u518D\u753B\u6574\u5757\u5931\u8D25\u5361\n- **\u56DE\u5408\u6536\u5C3E\u5224\u5F97\u66F4\u51C6\u3002** \u4EE5\u300C\u6211\u4F1A\u2026\u300D\u300C\u63A5\u4E0B\u6765\u2026\u300D\u8FD9\u7C7B\u627F\u8BFA\u53E5\u7ED3\u5C3E\u7B97\u672A\u5B8C\u6210\uFF1B\u7B49\u5F85\u540E\u53F0\u4EFB\u52A1\u4E0D\u5224\u5931\u8D25\uFF1B\u76EE\u6807\u4E0D\u4F1A\u88AB\u77ED\u56DE\u590D\u6216\u4EFB\u52A1\u901A\u77E5\u5360\u4F4F\n- **\u7F51\u5173\u66F4\u7A33\u3002** \u91CD\u8BD5\u7EDF\u4E00\u8BA1\u5165\u4E00\u4E2A\u9884\u7B97\uFF0C\u4E0D\u518D\u51FA\u73B0\u91CD\u8BD5\u4E8C\u5341\u591A\u6B21\uFF1B\u91CD\u590D\u7684\u6D41\u4E8B\u4EF6\u53BB\u91CD\uFF1B\u5207\u5907\u7528\u65F6\u8DF3\u8FC7\u88C5\u4E0D\u4E0B\u5F53\u524D\u4E0A\u4E0B\u6587\u7684\u6A21\u578B\uFF1B\u517C\u5BB9 text/plain \u56DE\u590D\uFF1B\u7A7A text block \u4E0D\u518D\u5BFC\u81F4 400\uFF1B\u5B50\u4EE3\u7406\u88AB\u622A\u65AD\u540E\u4F1A\u7EED\u5199\n- **\u5907\u7528\u6A21\u578B\u63D0\u793A\u53EA\u51FA\u4E00\u6B21\u3002** \u6BCF\u4F1A\u8BDD\u6BCF\u5BF9\u6A21\u578B\u53EA\u63D0\u793A\u4E00\u6B21\u300C\u5DF2\u5207\u5230\u5907\u7528\u6A21\u578B B\uFF08A \u4E0D\u53EF\u7528\uFF09\u300D\uFF1B\u5E95\u680F\u7A84\u5C4F\u65F6\u5148\u7701\u6389 @effort \u7B49\u6807\u7B7E\uFF0C\u4FDD\u4F4F\u5B8C\u6574\u6A21\u578B\u540D\n- **\u5DE5\u5177\u66F4\u5BBD\u5BB9\u4E5F\u66F4\u5B89\u5168\u3002** Write / Grep \u63A5\u53D7\u5E38\u89C1\u53C2\u6570\u522B\u540D\u3001\u4E22\u6389\u591A\u4F59\u5B57\u6BB5\uFF1B\u5DF2\u6709\u6587\u4EF6\u662F GBK\u3001Shift-JIS \u7B49\u975E UTF-8 \u7F16\u7801\u65F6\u62D2\u7EDD\u5199\u5165\u5E76\u8BF4\u660E\u7F16\u7801\uFF0C\u4E0D\u6539\u539F\u5B57\u8282\n- **\u5361\u6B7B\u4E0E\u8FDB\u7A0B\u6536\u5F97\u5E72\u51C0\u3002** \u5361\u6B7B\u515C\u5E95\u5B88\u62A4\uFF1BBash \u6309\u8FDB\u7A0B\u7EC4\u767B\u8BB0\u5E76\u6574\u7EC4\u6E05\u7406\uFF1B\u9000\u51FA\u65F6\u540E\u53F0\u547D\u4EE4 1.5s \u5185\u5F3A\u6740\u4E14 SessionEnd \u5FC5\u8DD1\uFF1B\u53EA\u6740\u542F\u52A8\u5668\u65F6\u5B50\u8FDB\u7A0B\u4E0D\u518D\u6210\u5B64\u513F\n- **\u957F\u4F1A\u8BDD\u66F4\u7701\u3002** \u6BCF\u6B21\u66F4\u65B0\u4E0D\u518D\u91CD\u626B\u5168\u5BF9\u8BDD\uFF1B\u5DE5\u5177\u8F93\u51FA\u8D85\u8FC7 2000 \u884C\u843D\u76D8\u53EA\u7559\u6458\u8981\uFF1B\u65B0\u589E\u7ED3\u679C\u6865 `result.json`\n- **\u6743\u9650\u52A0\u56FA\u3002** \u85CF\u5728\u5B50\u547D\u4EE4\u3001\u5F15\u53F7\u6216\u53D8\u91CF\u91CC\u7684\u5371\u9669 `rm` \u4E5F\u4F1A\u62E6\uFF1B\u4FEE\u8865\u4E00\u6279 Bash \u5206\u6790\u7ED5\u8FC7\uFF1B\u6309 symlink \u7684\u771F\u5B9E\u843D\u70B9\u5224\u6743\u9650\uFF1Bplan \u6A21\u5F0F\u4E0B Bash \u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF1BMCP \u62A5\u9519\u91CC\u7684\u5BC6\u94A5\u5148\u6253\u7801\uFF1B\u65B0\u589E `--restricted` \u53EA\u8BFB\u6A21\u5F0F\n- **\u4EE5\u300C\u7406\u89E3\uFF1A\u300D\u5F00\u5934\u7684\u6700\u7EC8\u7B54\u6848\u4E0D\u518D\u88AB\u541E\u3002** \u91CD\u8BD5\u540E\u7B54\u6848\u4E0D\u4F1A\u6D88\u5931\uFF1B`/model` \u56DE\u6267\u53EA\u663E\u793A\u4E00\u6B21\u5E76\u5237\u65B0\u5E95\u680F\n\n## 13.6.0 - 2026-10-19\n\n- **\u5907\u7528\u94FE\u66F4\u53EF\u9760\u3002** \u9996\u5305\u8D85\u65F6\u6216\u5907\u7528\u6A21\u578B\u8FD4\u56DE 404 / 5xx \u65F6\uFF0C\u6CBF `CLAVUE_COMBO_FALLBACK`\uFF08\u9017\u53F7\u5206\u9694\uFF09\u5207\u5230\u4E0B\u4E00\u4E2A\u6A21\u578B\uFF0C\u8DF3\u8FC7\u540C\u5BB6\u65CF\u522B\u540D\uFF08`cn:deepseek-v4.1-flash` \u4E0D\u4F1A\u518D\u5207\u56DE `deepseek-v4-flash`\uFF09\u3002\u521A\u5931\u6548\u7684\u6A21\u578B 10 \u5206\u949F\u5185\u4E0D\u518D\u9009\uFF08`CLAVUE_MODEL_HEALTH_TTL_MS`\uFF09\uFF1B\u6574\u6761\u94FE\u90FD\u5931\u6548\u65F6\u56DE\u5230\u5B8C\u6574\u94FE\u3002\u4E3B\u6A21\u578B\u4E0A\u7684 502/503 \u4ECD\u6309\u539F\u6765\u7684\u4E24\u6B21\u9608\u503C\n- **\u5B58\u6863\u524D\u5BC6\u94A5\u6253\u7801\u3002** \u4F1A\u8BDD jsonl \u548C `history.jsonl` \u5199\u76D8\u524D\u906E\u6389 `sshpass -p`\u3001`SSHPASS=`\u3001`mysql -p` / `--password`\u3001`PGPASSWORD`\u3001`MYSQL_PWD`\u3001`curl -u`\u3001\u5E26\u8D26\u53F7\u5BC6\u7801\u7684 URL\u3001`Authorization: Bearer`\u3001`sk-` / `ghp_` \u5BC6\u94A5\u3001`password=`\u3001`*_PASS=` / `*_PWD=`\u3002\u6267\u884C\u4ECD\u7528\u539F\u547D\u4EE4\uFF1B`PWD=` / `$PWD` \u4E0D\u53D7\u5F71\u54CD\n- **\u663E\u5F0F\u8BE2\u95EE\u89C4\u5219\u4F18\u5148\u3002** `Bash(rm:*)` \u8FD9\u7C7B ask \u89C4\u5219\u547D\u4E2D\u590D\u5408\u547D\u4EE4\u91CC\u7684\u5B50\u547D\u4EE4\uFF08`rm \u2026 && ls`\uFF09\u65F6\uFF0C\u4E0D\u518D\u88AB\u5168\u5C40 `Bash` \u5141\u8BB8\u8986\u76D6\uFF1B\u9ED8\u8BA4\u6A21\u5F0F\u548C\u6C99\u7BB1\u6A21\u5F0F\u90FD\u751F\u6548\uFF0C`bypassPermissions` \u4ECD\u8C41\u514D\n- **\u5B50\u4EE3\u7406\u88AB\u62E6\u65F6\u8BF4\u6E05\u539F\u56E0\u3002** \u8D85\u8FC7 `CLAVUE_AGENT_MAX_DEPTH` \u65F6\u8FD4\u56DE\u7ED3\u6784\u5316\u7684 `<spawn_blocked>` \u8BF4\u660E\uFF0C\u63D0\u793A\u540C\u4E00\u8C03\u7528\u4F1A\u518D\u6B21\u88AB\u62E6\u3001\u8BF7\u5728\u5F53\u524D\u4F1A\u8BDD\u5B8C\u6210\u3002\u6DF1\u5EA6\u6309\u771F\u5B9E\u5D4C\u5957\u5C42\u6570\u8BA1\u7B97\n- **\u5DE5\u5177\u53C2\u6570\u5F62\u72B6\u4E0D\u5BF9\u4E0D\u518D\u5D29\u6E83\u3002** \u6A21\u578B\u628A `path` \u5199\u6210\u6570\u7EC4\u3001\u5BF9\u8C61\u6216\u6F0F\u5199\u65F6\uFF0C\u6D88\u606F\u6298\u53E0\u548C\u8BB0\u5FC6\u8DEF\u5F84\u5224\u65AD\u9000\u56DE\u539F\u59CB\u884C\u663E\u793A\uFF0C\u4E0D\u518D\u62A5 `The "path" argument must be of type string`\n- **\u8FDB\u51FA worktree \u771F\u6B63\u6E05\u6389 plans \u76EE\u5F55\u7F13\u5B58\u3002** \u4EE5\u524D\u7F13\u5B58\u6CA1\u88AB\u6E05\u6389\uFF0Cplans \u76EE\u5F55\u4E00\u76F4\u6307\u5411\u8FDB\u5165 worktree \u524D\u7684\u76EE\u5F55\uFF0C\u73B0\u5728\u4F1A\u8DDF\u7740\u5207\u6362\n\n## 13.5.0 - 2026-10-16\n\n- **\u56DB\u6863\u8DEF\u7531\u3002** \u89C4\u5219\u628A\u56DE\u5408\u5206\u6210 \u7B80\u5355 / \u4E00\u822C / \u590D\u6742 / \u957F\u7A0B\u3002\u62FF\u4E0D\u51C6\u65F6\u8BA1\u5212\u69FD\u6700\u591A\u60F3 1 \u79D2\uFF0C\u8D85\u65F6\u7B97\u4E00\u822C\u3002`/goal` \u662F\u957F\u7A0B\u3002`/mode` \u56FA\u5B9A\u6863\u4F4D\u3002`CLAVUE_TIERS=0` \u5173\u95ED\u3002\u6539\u8FC7\u7684\u6587\u4EF6\u8D85\u8FC7 5 \u4E2A\u5347\u5230\u81F3\u5C11\u590D\u6742\uFF0C\u8D85\u8FC7 15 \u4E2A\u5347\u5230\u957F\u7A0B\uFF1B\u7B80\u5355\u6863\u91CC\u8BF7\u6C42\u8D85\u8FC7 20 \u6B21\u5347\u5230\u4E00\u822C\uFF1B\u540C\u4E00\u6761\u68C0\u67E5\u5931\u8D25 3 \u6B21\u5347\u4E00\u6863\uFF1BJEV \u5224\u5B9A\u4E25\u91CD\u5347\u5230\u81F3\u5C11\u590D\u6742\u3002\u964D\u6863\u53EA\u53D1\u751F\u5728\u4E0B\u4E00\u8F6E\u5F00\u59CB\n- **\u7B80\u5355\u6863\u5C11\u505A\u3002** \u4E0D\u8DD1 REVIEW\uFF0C\u4E0D\u95EE\u4EA4\u4ED8\u88C1\u5224\uFF0C\u56DE\u5408\u7ED3\u675F\u4E0D\u7B49\u5F85\uFF0C\u7CFB\u7EDF\u63D0\u793A\u7528\u7CBE\u7B80\u7248\u3002\u5DE5\u5177\u53EA\u7559 10 \u4E2A\u6838\u5FC3\uFF0C`mcp__*` \u59CB\u7EC8\u4FDD\u7559\u3002\u4E00\u822C\u6863\u5BA1\u67E5\u7B49\u5F85\u6700\u591A 5 \u79D2\u3002\u590D\u6742\u548C\u957F\u7A0B\u6700\u591A 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\n- **\u72B6\u6001\u884C\u5E26\u6863\u4F4D\u3002** \u5728 `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42` \u540E\u52A0 `\u7B80\u5355`\u3002\u6362\u6863 15 \u79D2\u5185\u663E\u793A `\u7B80\u5355\u2192\u4E00\u822C`\n- **stdin \u5148\u770B 200ms\u3002** `-p` \u7B49\u7BA1\u9053\u7B2C\u4E00\u5B57\u8282\u9ED8\u8BA4 200ms\uFF08`CLAVUE_STDIN_PEEK_MS`\uFF0C0 \u4E0D\u7B49\uFF09\u3002MCP \u542F\u52A8\u8D5B\u8DD1\u4ECD\u662F 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF09\n\n## 13.4.2 - 2026-10-16\n\n- **\u8BA1\u65F6\u884C\u7528\u771F\u5B9E\u9636\u6BB5\u540D\u3002** \u8C03\u8BD5\u65E5\u5FD7\u4E0D\u518D\u628A\u6BCF\u4E00\u8DF3\u90FD\u5199\u6210 `sdk`\uFF0C\u800C\u662F `intake/jev`\u3001`plan`\u3001`scout`\u3001`main`\u3001`review`\u3001`compact`\u3001`subagent`\u3001`fanout` \u52A0\u4E0A\u6A21\u578B\u548C\u6BEB\u79D2\u3002\u72B6\u6001\u884C\u663E\u793A `\u672C\u6B65 \u2026\uFF5C\u672C\u8F6E \u2026 \xB7 N \u6B21\u8BF7\u6C42`\n- **\u7F16\u6392\u5BF9\u9F50 v1\u3002** JEV intake \u5728\u56DE\u5408\u5F00\u59CB\u5C31\u53D1\u51FA\u53BB\uFF0C\u53EA\u5728\u8BA1\u5212\u8DF3\u4E4B\u524D\u7B49\u5F85\u3002\u77ED\u7EED\u5199\uFF08\u7EE7\u7EED\uFF09\u590D\u7528\u4E0A\u4E00\u8F6E\u5206\u7C7B\uFF1A0 \u6B21 JEV\u30010 \u6B21 PLAN\u3002\u8BA1\u5212\u8DF3\u81EA\u8EAB 30 \u79D2\u5230\u70B9\u5C31\u9759\u9ED8\u4E22\u6389\uFF08`CLAVUE_COMBO_PLAN_TIMEOUT_MS`\uFF09\uFF0C\u9996\u5305\u524D\u4ECD\u53EA\u7B49\u6700\u591A 1.8 \u79D2\u3002\u540C\u4E00\u4EFD\u8BA1\u5212\u53EA\u5BA1\u67E5\u4E00\u6B21\uFF0C\u8BA1\u5212\u6700\u591A\u4FEE\u8BA2\u4E00\u6B21\u3002`CLAVUE_COMBO_PLAN_HOP=0` \u4ECD\u53EF\u5173\u6389\u8BA1\u5212\u8DF3\n- **\u56DE\u5408\u7ED3\u675F\u7684\u5BA1\u67E5\u7B49\u5F85\u3002** \u914D\u7F6E\u9ED8\u8BA4\u4ECD\u662F 20 \u79D2\uFF08`CLAVUE_COMBO_REVIEW_GRACE_MS`\uFF09\u3002\u7410\u788E\u56DE\u5408\u4E0D\u7B49\u5F85\uFF1B\u5176\u4F59\u56DE\u5408\u6700\u591A\u7B49 5 \u79D2\n- **\u51B7\u542F\u52A8\u4E0D\u6321 MCP\u3002** \u65E0\u5934\u6A21\u5F0F\u9ED8\u8BA4\u5728\u540E\u53F0\u8FDE\u63A5 MCP\uFF0C\u4E0D\u518D\u628A\u7B2C\u4E00\u8BF7\u6C42\u6321\u4F4F\u6700\u591A 8 \u79D2\u3002`CLAVUE_HEADLESS_MCP_BUDGET_MS=0` \u6062\u590D\u4E00\u76F4\u7B49\u5230\u8FDE\u5B8C\n- **JEV \u9274\u6743\u5931\u8D25\u8DE8\u8FDB\u7A0B\u8DF3\u8FC7\u3002** \u4E00\u6761 intake \u91CC\u4E24\u628A key \u90FD 401 \u5C31\u4F1A\u5199\u4E0B `jev-auth-fail.json`\u3002\u4E0B\u4E00\u4E2A\u8FDB\u7A0B\u5728 TTL \u5185\u4E0D\u518D\u53D1\u90A3\u4E24\u4E0B 401\n- **\u540E\u53F0\u8FDE\u4E0A\u7684 MCP \u4F1A\u8FDB\u540E\u7EED\u8BF7\u6C42\u3002** \u542F\u52A8\u65F6\u548C\u8FDE\u63A5\u8D5B\u8DD1\uFF0C\u9ED8\u8BA4\u6700\u591A 500ms\uFF08`CLAVUE_MCP_STARTUP_WAIT_MS`\uFF0C0 \u9A6C\u4E0A\u8FD4\u56DE\uFF09\u3002\u6BCF\u4E2A\u670D\u52A1\u5668\u8FDE\u4E0A\u5C31\u5199\u5165 headless store\u3002\u540C\u4E00\u56DE\u5408\u91CC\u4E0B\u4E00\u6B21\u6A21\u578B\u8BF7\u6C42\u8C03\u7528 `refreshTools()` \u91CD\u8BFB `buildAllTools(getAppState())`\u3002`stickyToolsForTurn` \u4E0D\u518D\u56E0\u4E3A\u5DE5\u5177\u4E0D\u5728\u4E0A\u4E00\u8BF7\u6C42\u7684\u540D\u5355\u91CC\u5C31\u4E22\u6389 `mcp__*`\u3002\u6838\u5FC3\u5DE5\u5177\u9762\u4E5F\u4FDD\u7559 `mcp__*`\n- **\u6D41\u4E2D\u95F4\u5361\u4F4F\u4F1A\u6362\u5907\u7528\u6A21\u578B\u3002** \u804A\u5929\u6A21\u578B\u4EE5\u524D\u4E24\u4E2A chunk \u4E4B\u95F4\u53EF\u4EE5\u7A7A 180 \u79D2\uFF0C\u6240\u4EE5 -p \u91CC 81 \u79D2\u548C 147 \u79D2\u7684\u505C\u987F\u4E0D\u4F1A\u4E2D\u6B62\u3002\u73B0\u5728\u9ED8\u8BA4 60 \u79D2\uFF08`CLAVUE_API_STREAM_IDLE_TIMEOUT_MS`\uFF0C\u4E5F\u8BA4 `CLAVUE_STREAM_IDLE_TIMEOUT_MS`\uFF1B`CLAVUE_STREAM_WATCHDOG=0` \u5173\u95ED\uFF09\u3002\u5230\u70B9\u53D6\u6D88\u6D41\uFF08\u5DF2\u7ECF\u51FA\u8FC7\u5B57\u4E5F\u53D6\u6D88\uFF09\uFF0C\u4E22\u6389\u534A\u622A\u52A9\u624B\u6D88\u606F\uFF0C\u6309\u9996\u5305\u540C\u4E00\u6761\u5907\u7528\u94FE\u91CD\u8BD5\u4E00\u6B21\n- **\u8BA1\u5212\u8C03\u7528\u7684\u8BA1\u65F6\u884C\u5199 `plan`\u3002** \u9636\u6BB5\u6309\u8C03\u7528\u70B9\u7684 phase/role \u8BB0\uFF0C\u4E0D\u518D\u56E0\u4E3A querySource \u662F `sdk` \u5C31\u5168\u90E8\u5199\u6210 `main`\u3002scout / review \u540C\u7406\n\n## 13.4.1 - 2026-10-16\n\n- **\u9996\u5305\u8D85\u65F6\u6362\u5907\u7528\u6A21\u578B\u3002** \u9ED8\u8BA4\u7B49\u5F85\u4ECE 90 \u79D2\u964D\u5230 45 \u79D2\uFF08`CLAVUE_API_FIRST_BYTE_TIMEOUT_MS`\uFF0C0 \u5173\u95ED\uFF09\uFF0C\u6D41\u5F0F\u548C\u672C\u5730\u975E\u6D41\u5F0F\uFF08\u542B 127.0.0.1\uFF09\u90FD\u8BA1\u65F6\u3002\u8D85\u65F6\u540E\u4E0D\u518D\u91CD\u8BD5\u540C\u4E00\u4E2A\u6A21\u578B\uFF0C\u6539\u5207\u5907\u7528\uFF1Aprofile \u7684 `fallback`\u3001\u7136\u540E `CLAVUE_COMBO_FALLBACK`\u3001\u7136\u540E ttqq \u9ED8\u8BA4 `cn:deepseek-v4.1-flash`\uFF1B`off` \u5173\u95ED\u3002\u72B6\u6001\u884C\u663E\u793A `\u7B49\u5F85\u6A21\u578B\u9996\u5305 Ns`\u3002\u540E\u53F0\u8C03\u7528\u9ED8\u8BA4\u6700\u591A 20 \u79D2\uFF08`CLAVUE_SIDE_CALL_TIMEOUT_MS`\uFF0Cplan/review \u4E0D\u5957\u8FD9\u5C42\u4E0A\u9650\uFF09\n- **JEV \u4E0E FastApply \u51ED\u8BC1\u94FE\u3002** \u73B0\u6709\u987A\u5E8F\u4E4B\u540E\u8865\u4E0A\u5DF2\u767B\u5F55\u8D26\u53F7 key\uFF08`auth.json`\uFF0C\u542B `https://api.clavue.com::client` \u8FD9\u79CD\u6309\u4E3B\u673A\u5B58\u653E\u7684\u6761\u76EE\uFF09\u548C\u672C\u673A\u8BBE\u5907 key\uFF08`official-device-key.json`\uFF09\u3002\u914D\u7F6E\u76EE\u5F55\u8DDF\u968F `CLAVUE_CONFIG_DIR`\u3002\u53EA\u53D1\u7ED9 api.clavue.com\u3002\u67D0\u4E00\u7EA7\u8FD4\u56DE 401 \u5C31\u8BD5\u4E0B\u4E00\u7EA7\uFF0C\u5E76\u8BB0\u4E0B\u65B0\u6765\u6E90\uFF08`key source=auth.json:https://api.clavue.com::clavue-gui`\uFF09\u3002`/provider current` \u5217\u51FA\u6574\u6761\u94FE\u548C\u6BCF\u4E00\u7EA7\u662F\u5426\u627E\u5230\u3002\u540C\u4E00\u8BF7\u6C42 1 \u79D2\u5185\u4E0D\u53D1\u7B2C\u4E8C\u6B21\uFF0C\u6362 key \u9664\u5916\u3002\u5168\u90E8 401 \u65F6\u7EC8\u7AEF\u53EA\u6253\u4E00\u884C\u4E2D\u6587\u4FEE\u590D\u63D0\u793A\uFF0C\u4E0D\u518D\u6A21\u62DF\u5224\u5B9A\u3002\u5224\u5B9A\u5931\u8D25\u4F1A\u8BB0\u4F4F\u4E00\u5C0F\u6BB5\u65F6\u95F4\uFF08`CLAVUE_JEV_AUTH_FAIL_TTL_MS`\uFF0C\u9ED8\u8BA4 10 \u5206\u949F\uFF09\uFF0C\u8FD9\u6BB5\u65F6\u95F4\u91CC\u4E0D\u518D\u53D1 intake\n- **`provider current` \u8BFB\u53D6 settings.json \u7684 env\u3002** JEV/FA \u72B6\u6001\u4E0D\u518D\u56E0\u4E3A\u53EA\u5199\u5728 settings \u91CC\u800C\u663E\u793A off\u3002\u5DF2\u4FDD\u5B58\u7684\u7EBF\u8DEF\u662F\u5F53\u524D\u8DEF\u7531\u65F6\uFF0C\u4E0D\u518D\u663E\u793A `Current API config: None`\n- **DeepSeek \u63A8\u7406 token \u4E0D\u518D\u91CD\u590D\u8BA1\u5165\u4E0A\u4E0B\u6587\u3002** `reasoning_tokens` \u662F `completion_tokens` \u7684\u5B50\u96C6\uFF1B\u7F51\u5173\u628A\u4E24\u8005\u76F8\u52A0\u5199\u8FDB `output_tokens` \u65F6\u6309 completion \u8BA1\u3002\u540C\u4E00\u56DE\u590D\u62C6\u5F00\u7684\u601D\u8003\u5757\u4E0D\u518D\u88AB\u4F30\u7B97\u7B2C\u4E8C\u904D\n- **\u9632\u538B\u7F29\u98CE\u66B4\u3002** \u540C\u4E00\u6A21\u578B\u5BB6\u65CF\u91CC\u6362\u6A21\u578B\u3001\u7A97\u53E3\u6CA1\u6709\u53D8\u5C0F\u65F6\uFF0C\u4E0A\u4E0B\u6587\u6CA1\u5230\u65B0\u6A21\u578B\u9608\u503C\u5C31\u4E0D\u538B\u7F29\u3002\u6458\u8981\u6309 `CLAVUE_AUTO_COMPACT_MODEL` \u2192 light \u2192 FA \u2192 \u4E3B\u6A21\u578B\uFF0C\u6BCF\u4E2A\u6A21\u578B\u9650\u65F6 90 \u79D2\uFF08`CLAVUE_AUTO_COMPACT_TIMEOUT_MS`\uFF09\u3002\u4E0A\u4E0B\u6587\u4E0D\u5230 token \u9608\u503C 30% \u65F6\uFF0C\u5185\u5B58\u538B\u529B\u53EA\u6E05\u7F13\u5B58\uFF0C\u4E0D\u8DD1\u538B\u7F29\u3002\u7B2C\u4E09\u65B9\u7EBF\u8DEF\u4E0D\u4F1A\u9ED8\u8BA4\u53BB\u8C03 `clavue-2.1-fast` / `clavue-2.1` / `clavue-2.1-pro`\uFF1B\u53EA\u6709\u5B98\u65B9\u4E91\uFF0C\u6216\u4F60\u7528 `CLAVUE_COMBO_LIGHT` / `CLAVUE_AUTO_COMPACT_MODEL` \u8FD9\u7C7B\u73AF\u5883\u53D8\u91CF\u5199\u660E\uFF0C\u624D\u4F1A\u8D70\u8FD9\u4E9B id\n- **\u4EE3\u7801\u56DE\u5408\u5C11\u7B49\u524D\u7F6E\u8DF3\u3002** \u8BA1\u5212\u8DF3\u9ED8\u8BA4\u6700\u591A\u5360\u9996\u5305\u524D 1.8 \u79D2\uFF08`CLAVUE_SCOUT_TIMEOUT_MS`\uFF0C`CLAVUE_COMBO_PLAN_BLOCK=1` \u6062\u590D\u4E00\u76F4\u7B49\uFF09\u3002\u72EC\u7ACB\u7684\u8BA1\u5212\u69FD\u5E76\u884C\uFF0C\u8D85\u65F6\u4E0D\u518D\u4E32\u884C\u6362\u4E0B\u4E00\u4E2A\u6A21\u578B\u3002\u8C03\u8BD5\u65E5\u5FD7\u4E00\u884C `stage -> model -> ms`\n- **ttqq \u9884\u8BBE\u4E0D\u518D\u5185\u7F6E `clavue-2.1-fast`\u3002** \u8F7B\u91CF\u69FD\u7559\u7A7A\uFF0C\u8F85\u52A9\u8C03\u7528\u8DDF\u7740\u4E3B\u6A21\u578B\uFF0C\u9664\u975E\u4F60\u81EA\u5DF1\u6307\u5B9A\n- **\u7B2C\u4E09\u65B9 JEV fan-out\u3002** \u8C03\u7528\u65B9\u6CA1\u6709\u6307\u5B9A\u6A21\u578B\u65F6\u4E0D\u518D\u585E\u9ED8\u8BA4 `clavue-jev`\n\n## 13.4.0 - 2026-10-16\n\n- **\u4F4E\u98CE\u9669 clavue-v1 \u5BF9\u9F50\uFF08#8\uFF09\u3002** \u6062\u590D\u4F1A\u8BDD\u3001\u5806\u9876\u3001\u6EA2\u51FA\u3001print \u6536\u5C3E\u4E0E goal \u95F8\u95E8\u4ECE clavue-v1 \u8FC1\u5165\n- **1.48.5 \u4E4B\u540E\u7684\u5BF9\u9F50\uFF08#9\uFF09\u3002** \u8FC1\u5165 clavue-v1 1.48.7\uFF0C\u5E76\u7F13\u5B58\u7A33\u5B9A\u7684 system \u524D\u7F00\n- **\u53EF\u9009\u7684\u539F\u751F fetch \u5BA2\u6237\u7AEF\uFF08#10\uFF09\u3002** `CLAVUE_NATIVE_CLIENT` \u672A\u8BBE\u7F6E\u65F6\u4ECD\u8D70\u539F\u6709\u4F20\u8F93\uFF1B\u8BBE\u7F6E\u540E\u6539\u7528\u57FA\u4E8E fetch \u7684\u5BA2\u6237\u7AEF\n- **\u53EF\u9009\u7684 Rust napi \u70ED\u8DEF\u5F84\uFF08#11\uFF09\u3002** `CLAVUE_NATIVE_RS` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u672A\u8BBE\u7F6E\u65F6\u4E0D\u52A0\u8F7D addon\n- **\u53EF\u9009\u7684 fast-apply\uFF08#12\uFF09\u3002** `clavue-fa` \u7684 ApplyEdit \u9ED8\u8BA4\u5173\u95ED\n- **\u53EF\u9009\u7684 JEV \u51B3\u7B56\u95E8\uFF08#14\uFF09\u3002** \u6302\u5728\u5171\u4EAB aux \u69FD\u4E0A\uFF0C\u9ED8\u8BA4\u4E0D\u542F\u7528\n- **\u7EC4\u5408\u6210\u672C\u95F8\u4E0E\u8F93\u51FA\u536B\u751F\uFF08#13\uFF09\u3002** \u4ECE clavue-v1 \u8FC1\u5165\uFF1B\u536B\u751F\u9ED8\u8BA4\u5173\u95ED\uFF0C\u88C1\u526A\u524D\u7F00\u4FDD\u6301\u7A33\u5B9A\n- **JEV / ApplyEdit \u5B9E\u673A\u4FEE\u590D\uFF08#15\uFF09\u3002** \u505C\u6389 JEV \u7684 follow-up \u5FAA\u73AF\uFF0C\u5E76\u4FEE\u6389 ApplyEdit \u7684 bundle \u5D29\u6E83\n- **\u53EF\u9009\u6548\u7387\u5305\uFF08#16\uFF09\u3002** `CLAVUE_EFFICIENCY` \u9ED8\u8BA4\u5173\u95ED\uFF1B\u6253\u5F00\u540E\u5305\u542B\u5E76\u884C JEV\n- **\u6BCF\u56DE\u5408\u5F00\u9500\uFF08#17\uFF09\u3002** \u957F\u4F1A\u8BDD\u7684\u6BCF\u56DE\u5408\u5DE5\u4F5C\u4E0D\u518D\u626B\u5B8C\u6574\u5386\u53F2\uFF1Bpager \u6BCF\u5E27\u53EA\u68C0\u67E5\u7A97\u53E3\u5185\u7684 journal \u6233\n- **\u65B0\u80FD\u529B\u5168\u90E8\u9ED8\u8BA4\u5173\u95ED\u3002** `CLAVUE_NATIVE_CLIENT`\u3001`CLAVUE_NATIVE_RS`\u3001`clavue-fa`\u3001JEV\u3001\u7EC4\u5408\u6210\u672C\u4E0E\u8F93\u51FA\u536B\u751F\u3001`CLAVUE_EFFICIENCY` \u90FD\u8981\u663E\u5F0F\u6253\u5F00\u624D\u751F\u6548\n\n## 13.3.3 - 2026-09-29\n\n- **Esc\xD72 \u56DE\u9000\u9009\u62E9\u6846\u56DE\u6765\u4E86\u3002** \u53CC\u51FB Esc \u7684\u56DE\u9000\u300C\u9009\u62E9\u6846\u300D\u6B64\u524D\u4F1A\u5BF9\u5DF2\u7ECF\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\n \u5224\u5B9A\u6210 0 \u4E2A\u6539\u52A8\uFF0C\u4E8E\u662F\u628A\u5B83\u5F53\u6210\u6253\u9519\u7684\u7A7A\u56DE\u5408\u76F4\u63A5\u64A4\u56DE\uFF0C\u9009\u62E9\u5217\u8868\u6839\u672C\u4E0D\u518D\u51FA\u73B0\u3002\n \u6839\u56E0\u662F\u56DE\u9000\u7528\u7684\u6539\u52A8\u8BA1\u6570\u662F\u81EA\u5DF1\u7EF4\u62A4\u7684\u4E00\u5957\u5C0F\u5199\u5B50\u4E32\u5339\u914D\uFF08`edit ` / `write `\uFF09\uFF0C\n \u8BA4\u4E0D\u51FA\u5F53\u524D\u5DE5\u5177\u810A\u67F1\u7684\u771F\u5B9E\u5F62\u6001 `Update(path)` / `Create(path)` / `Write(path)`\u3002\n \u73B0\u5728\u8BA1\u6570\u6539\u8D70\u552F\u4E00\u7684\u7F16\u8F91\u5224\u5B9A `journal_format::is_edit_tool_label`\uFF0C\n \u4E0E\u4EA4\u4ED8\u6C47\u603B\u5171\u7528\u540C\u4E00\u6743\u5A01\uFF1A\u6539\u8FC7\u6587\u4EF6\u7684\u56DE\u5408\u7167\u5E38\u5F39\u51FA\u9009\u62E9\u6846\uFF0C\n \u771F\u6B63\u6CA1\u6539\u52A8\u7684\u56DE\u5408\u4ECD\u6309\u7A7A\u56DE\u5408\u5373\u65F6\u64A4\u56DE\n- **\u53EA\u4FEE\u5206\u7C7B\uFF0C\u4E0D\u6539\u4EA4\u4E92\u3002** \u9009\u62E9\u6846\u7684\u7ED8\u5236\u3001\u952E\u76D8/\u9F20\u6807\u547D\u4E2D\u3001ModeSelect \u5355\u9009\u5168\u90E8\u4FDD\u6301\u539F\u6837\uFF1B\n \u672C\u6B21\u4EC5\u8BA9\u300C\u54EA\u4E9B\u56DE\u5408\u7B97\u6539\u8FC7\u6587\u4EF6\u300D\u8FD9\u4E00\u5904\u5224\u5B9A\u6062\u590D\u6B63\u786E\n\n## 13.3.2 - 2026-09-29\n\n- **\u5347\u7EA7\u6210\u529F\u540E\u76F4\u63A5\u8FDB\u5165\u754C\u9762\uFF0C\u4E0D\u518D\u8981\u6C42\u5B8C\u5168\u9000\u51FA\u3002** Node duplex \u5BBF\u4E3B\u662F\u9876\u5C42\u8FDB\u7A0B\uFF0C\n \u542F\u52A8\u65F6\u53EA\u89E3\u6790\u4E00\u6B21 `agentEntry` / `pagerBin`\uFF1B\u540E\u53F0 `npm install -g` \u6362\u6389\u4E86\u78C1\u76D8\u4E0A\u7684\n \u65B0\u7248\u672C\uFF0C\u5185\u5B58\u91CC\u4ECD\u662F\u65E7\u4EE3\u7801\uFF0C\u4E8E\u662F\u53EA\u80FD\u9760\u7528\u6237\u624B\u52A8\u9000\u51FA\u91CD\u8FDB\u3002\u73B0\u5728\u5BBF\u4E3B\u5728\u5347\u7EA7\u6210\u529F\u540E\n \u539F\u5730\u91CD\u6267\u884C\u81EA\u5DF1\uFF1Apager \u5148\u6309\u6B63\u5E38\u8DEF\u5F84\u9000\u51FA\uFF08\u79BB\u5F00 raw mode\u3001\u6062\u590D\u5C4F\u5E55\uFF09\uFF0CCLI \u5165\u53E3\n \u5728 pager \u91CA\u653E TTY \u540E\u518D\u8D77\u65B0\u8FDB\u7A0B\u3002\u5B88\u536B `CLAVUE_SESSION_RELAUNCH=1` \u9632\u6B62\u91CD\u6267\u884C\u5FAA\u73AF\uFF0C\n `CLAVUE_DISABLE_SESSION_RELAUNCH=1` \u53EF\u5173\u95ED\uFF1B\u6D4B\u8BD5/\u5F00\u53D1\u8FD0\u884C\u65F6\u62D2\u7EDD\u91CD\u6267\u884C\n- **\u9996\u6B21\u914D\u7F6E\u88C5\u8F7D\u540E\u540C\u6837\u539F\u5730\u8FDB\u5165\u754C\u9762\u3002** `routeTrack`\uFF08\u627F\u8F7D `needsSetup` /\n `officialReady`\uFF09\u6B64\u524D\u53EA\u5728\u542F\u52A8\u65F6\u53D1\u9001\u4E00\u6B21\uFF0C\u4E8E\u662F\u5728\u7EBF\u8DEF / BYOK \u9762\u677F\u4FDD\u5B58\u540E\uFF0C\n pager \u7684\u9996\u6B21\u914D\u7F6E\u83DC\u5355\u4E00\u76F4\u9501\u7740\uFF0C\u5FC5\u987B\u9000\u51FA\u91CD\u8FDB\u624D\u6D88\u5931\u3002\u73B0\u5728\u9762\u677F\u4FDD\u5B58\u91CD\u542F agent \u65F6\n \u4E00\u5E76\u91CD\u53D1 `routeTrack`\uFF0C\u754C\u9762\u5F53\u6B21\u4F1A\u8BDD\u5373\u89E3\u9501\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.3 - 2026-09-29\n\n- **\u8BDA\u5B9E\u7684\u300C\u8FD9\u4E2A\u6587\u4EF6\u672C\u6765\u5C31\u6CA1\u95EE\u9898\u300D\u4E0D\u518D\u5224\u8D1F\u3002** \u4E24\u5904\u6839\u56E0\uFF1A\u4E00\u662F\u8DEF\u5F84\u5426\u5B9A\u53EA\u8BA4\u7948\u4F7F\u53E5\n \uFF08`Do NOT touch X`\uFF09\uFF0C\u4E0D\u8BA4\u72B6\u6001\u8C13\u8BED\uFF08`X was already correct` / `X \u6CA1\u6709 bug`\uFF09\uFF1B\n \u4E8C\u662F `-p` \u4F1A\u628A harness \u81EA\u5DF1\u7684\u72B6\u6001\u680F\uFF08`\xB7 state=\u2026 \xB7 next=Edit X \xB7 gap:X \xB7 \u2026`\uFF09\n \u8FFD\u52A0\u5230\u7ED3\u679C\u6587\u672C\uFF0C`QueryEngine` \u518D\u628A\u540C\u4E00\u5B57\u7B26\u4E32\u4EA4\u7ED9\u5047\u5B8C\u6210\u95F8\u95E8\uFF0C`next=Edit X`\n \u88AB\u8BFB\u6210\u300C\u6A21\u578B\u8BF4\u5B83\u6539\u4E86 X\u300D\u3002\u73B0\u5728\u72B6\u6001\u8C13\u8BED\u6309\u53CC\u5411\u5339\u914D\uFF0C\u6574\u884C\u72B6\u6001\u680F\u5728\u626B\u63CF\u524D\u5265\u6389\uFF1B\n \u6A21\u578B\u81EA\u5DF1\u7684 bullet \u4E0E\u6B63\u6587\u91CC\u7684\u540C\u7C7B token \u4ECD\u7B97\u58F0\u660E\uFF0C\u771F\u8BEF\u62A5\uFF08`Fixed a.js and b.js`\uFF09\u7167\u65E7\u62D2\u7EDD\n- **\u4E3B\u601D\u8003\u6863\u53EA\u5728\u7528\u6237\u8BBE\u7F6E\u65F6\u6539\u53D8\u3002** \u538B\u7F29\u3001\u88C1\u526A\u4E0E\u4E0A\u4E0B\u6587\u8FC7\u957F\u6062\u590D\u4E0D\u518D\u6539\u5199\n `output_config.effort`\uFF1B\u6B64\u524D compact \u4E4B\u540E effort \u4F1A\u88AB\u6539\u6210 turn-class \u5EFA\u8BAE\u503C\uFF0C\n \u7B49\u4E8E\u653E\u5F03\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\u5E76\u628A\u663E\u5F0F `/effort high` \u9759\u9ED8\u964D\u6863\n- **\u538B\u7F29\u89E6\u53D1\u70B9\u6309\u53D1\u5E03\u7A97\u53E3\u7B97\u3002** \u4E0A\u4E0B\u6587\u76EE\u5F55\u7ED9\u51FA\u66F4\u5927\u7A97\u53E3\u65F6\uFF0C\u4E4B\u524D\u5B66\u5230\u7684\u6536\u7D27\u4E0A\u9650\u4F1A\u88AB\u9000\u5F79\uFF1B\n 100 \u4E07\u7A97\u53E3\u7EA6\u5728 62% \u5C31\u538B\u7F29\uFF0C\u4E0D\u518D\u628A\u63A5\u8FD1\u6EE1\u7684\u524D\u7F00\u53CD\u590D\u91CD\u53D1\n- **\u53EA\u8BFB\u547D\u4EE4\u7684\u5931\u8D25\u4E0D\u518D\u8FDE\u5750\u3002** \u540C\u6279\u8BFB\u53D6\u91CC\u6709\u4E00\u6761\u5931\u8D25\uFF08`sed -n`\u3001`rg` \u6CA1\u547D\u4E2D\uFF09\u65F6\uFF0C\n \u5176\u4F59\u8BFB\u53D6\u7EE7\u7EED\uFF1B\u4F1A\u6539\u6587\u4EF6\u7684 Bash \u4ECD\u6309\u987A\u5E8F\u6267\u884C\n- **\u8FDE\u7EED\u4E09\u6B21\u5355\u53EA\u8BFB\u5DE5\u5177\u56DE\u590D\u540E\u63D0\u9192\u4E00\u6B21\u5E76\u884C\u8BFB\u53D6**\uFF08\u7B2C 8 \u6B21\u518D\u63D0\u9192\uFF0C\u5355\u94FE\u4E0A\u9650 2 \u6B21\uFF1B\n \u5199\u6216\u6210\u6279\u5373\u6E05\u96F6\uFF09\n- **\u5931\u8D25\u7684\u6D4B\u8BD5\u4E0D\u518D\u5F53\u8BC1\u636E\u3002** `node --test` \u6458\u8981\u91CC\u7684 `\u2139 fail N` \u662F\u503C\u5728\u540E\u5F62\u6001\n \uFF08\u4E0E pytest \u7684 `N failed` \u76F8\u53CD\uFF09\uFF0C\u6B64\u524D\u53EA\u8BA4\u503C\u5728\u524D\uFF0C\u5931\u8D25\u8FD0\u884C\u53CD\u800C\u547D\u4E2D\u76F8\u90BB\u7684\n `\u2139 pass` \u884C\u88AB\u5224\u7EFF\n- **\u7EC4\u5408\u8BF4\u660E\u6536\u655B\u5230\u4E3B\u7CFB\u7EDF\u63D0\u793A**\uFF08\u7EC4\u5408\u5F00\u542F\u65F6\uFF09\uFF1A\u8BA1\u5212\u53EA\u63D0\u4F9B\u6587\u4EF6\u3001\u6B65\u9AA4\u548C\u4E00\u6761\u9A8C\u6536\u547D\u4EE4\uFF1B\n \u5BA1\u67E5\u4E0E\u5224\u5B9A\u662F\u8BC1\u636E\u3001\u4E0D\u662F\u65B0\u4EFB\u52A1\uFF1B\u72EC\u7ACB\u8BFB\u53D6\u653E\u8FDB\u540C\u4E00\u4E2A\u56DE\u590D\u3002hop \u6B63\u6587\u53EA\u8FFD\u52A0\u4E00\u53E5\u8BC1\u636E\u8BF4\u660E\uFF0C\n \u4FA7\u6A21\u578B\u65E0\u6CD5\u7528\u81EA\u5DF1\u7684\u6307\u4EE4\u76D6\u6389\u5951\u7EA6\u3002\u53E6\uFF1A\u9001\u7ED9\u6A21\u578B\u7684\u8BF4\u660E\u4FDD\u6301\u82F1\u8BED\uFF0C\u5BF9\u7528\u6237\u7684\u56DE\u590D\u8DDF\u968F\n \u6700\u540E\u4E00\u6761\u6D88\u606F\u8BED\u8A00\n- **\u6062\u590D\u4F1A\u8BDD\u4E0D\u518D\u91CD\u590D `call_id`**\uFF08\u4E0A\u6E38 400 `Duplicate call_id`\uFF09\uFF1B\n \u6A21\u578B\u5728\u6B63\u6587\u4E2D\u9014\u65AD\u8FDE\u65F6\u6807\u8BB0\u4E3A\u88AB\u622A\u65AD\u800C\u975E\u6B63\u5E38\u6536\u5C3E\n- **\u957F\u4F1A\u8BDD\u5806\u9876\u51CF\u538B\u771F\u6B63\u751F\u6548**\uFF1A\u672B\u5C3E\u7A97\u53E3\u4EE5\u5916\u7684\u8D85\u5927\u5DE5\u5177\u7ED3\u679C\u5C31\u5730\u6536\u53E3\uFF0C\n \u4E0D\u518D\u53EA\u6E05\u7F13\u5B58\uFF08\u53EF\u8FBE\u5373\u4E0D\u53EF\u56DE\u6536\uFF09\n- **pager J10 \u6700\u8FD1\u9879\u76EE `restart_cwd` \u4E0D\u518D\u88AB codec \u4E22\u5F03**\uFF08\u6B64\u524D\u8BE5\u529F\u80FD\u4ECE\u672A\u751F\u6548\uFF09\n- \u5B89\u88C5\u6587\u6863\u7684\u8FD0\u884C\u65F6\u4E0B\u9650\u6539\u4E3A **Node 22**\uFF08`engines` \u4E00\u76F4\u662F `>=22`\uFF0C\u6587\u6863\u6B64\u524D\u5199 18\uFF09\n\n## 13.2.2 - 2026-09-20\n\n- \u539F\u751F pager \u53D1\u5E03\u95E8\u7981\u53D6\u771F\uFF1Astaged \u4E8C\u8FDB\u5236\u5FC5\u987B\u5185\u5D4C\u5F53\u524D pager \u6E90\u7801\u6458\u8981\n \uFF08`--build-info` JSON \u5F62\u72B6\u7684 `sourceDigest` \u5B57\u6BB5\uFF0C\u951A\u5B9A `"sourceDigest":"<64 hex>"`\uFF09\uFF0C\n \u65E7\u6E90\u7801\u7F16\u8BD1\u51FA\u7684\u4E8C\u8FDB\u5236\u5373\u4F7F\u54C8\u5E0C\u81EA\u6D3D\u4E5F\u4F1A\u88AB\u62D2\u7EDD\uFF0C\u4E0D\u518D\u9760\u4EC5\u81EA\u6D3D\u7684 manifest \u54C8\u5E0C\u653E\u884C\n- manifest \u6EAF\u6E90\u6539\u4E3A\u6309\u5E8F\u89E3\u6790\u800C\u975E\u9759\u9ED8\u7701\u7565\uFF1A`CLAVUE_RELEASE_SOURCE_COMMIT` \u2192\n `GITHUB_SHA` \u2192 `git rev-parse HEAD`\uFF1B`releaseTag` \u672A\u8BBE\u65F6\u56DE\u843D\u4E3A `v${version}`\uFF0C\n \u672C\u5730\u53D1\u5E03\u6784\u5EFA\u4E0D\u518D\u4E22\u5931\u53D1\u5E03\u95E8\u7981\u6240\u9700\u5B57\u6BB5\n- \u8FD0\u884C\u65F6\u4E0E pager \u4EA7\u7269\u4E0D\u53D8\uFF1A`dist/native` \u4E8C\u8FDB\u5236\u6CBF\u7528 13.2.1\uFF0C\u4EC5 `manifest.json`\n \u6EAF\u6E90\u4E0E\u95E8\u7981\u63A5\u7EBF\u53D8\u66F4\n\n## 13.2.1 - 2026-09-20\n\n- \u65E5\u8BB0\u7EB5\u5411\u8282\u594F\u6539\u4E3A\u4E24\u7EA7\uFF1A\u6BB5\u843D\u8FB9\u754C\uFF08\u65B0\u7684\u7528\u6237\u56DE\u5408\u3001Recap \u524D\uFF09\u5728\u6807\u51C6\u9AD8\u5EA6\u547C\u5438\u4E24\u884C\uFF0C\n \u6BB5\u5185\u5206\u7EC4\u7684\u547C\u5438\u4FDD\u6301\u4E00\u884C\uFF1Bcompact \u4E0B\u6240\u6709\u95F4\u9699\u4ECD\u4E3A\u4E00\u884C\uFF0C\u5BC6\u5EA6\u4E0D\u6D6A\u8D39\u4EFB\u4F55\u4E00\u884C\u3002\n \u7EC8\u7AEF\u6CA1\u6709\u5B57\u4F53\u884C\u9AD8\uFF0C\u8282\u594F\u53EA\u80FD\u6765\u81EA\u95F4\u9699\u5206\u7EA7\u4E0E\u5185\u8FB9\u8DDD\uFF0C\u8FD9\u6761\u89C4\u5F8B\u73B0\u5DF2\u5199\u5165 J8 \u800C\u975E\u6BCF\u6B21\u91CD\u65B0\u53D1\u73B0\n- \u9996\u5C4F\u6539\u4E3A compose-first\uFF1A\u5DF2\u914D\u7F6E\u7EBF\u8DEF\u65F6\uFF0C\u8F93\u5165\u6846\u4E3A\u7A7A\u6309 Enter \u76F4\u63A5\u5F00\u65B0\u4F1A\u8BDD\uFF08\u9879\u76EE\u9009\u62E9\u4ECD\u751F\u6548\uFF09\uFF0C\n \u63D0\u793A\u6587\u6848\u6539\u4E3A\u300CEnter \u5F00\u5DE5\u300D\uFF1B\u9996\u6B21\u8FD0\u884C\u4FDD\u7559\u786E\u8BA4\u8BED\u4E49\u2014\u2014\u7EBF\u8DEF\u5FC5\u987B\u5148\u5B58\u5728\uFF0C\u4F1A\u8BDD\u624D\u53EF\u80FD\u5F00\u59CB\n- \u9996\u5C4F\u8BB0\u4F4F\u6700\u8FD1\u4E09\u4E2A\u5DE5\u4F5C\u76EE\u5F55\uFF1A\u663E\u793A\u5728\u4FE1\u606F\u677F\u4E0B\u65B9\uFF0C\u6309 1-3 \u76F4\u63A5\u91CD\u5F00\u3002\u663E\u793A\u7684 cwd \u53D6\u81EA\u4F1A\u8BDD\u8BB0\u5F55\u91CC\n \u5199\u5165\u7684 cwd \u5B57\u6BB5\uFF0C\u7EDD\u4E0D\u7531\u76EE\u5F55 slug \u53CD\u89E3\uFF08slug \u6709\u635F\uFF1A\u8DEF\u5F84\u5206\u9694\u7B26\u4E0E\u8FDE\u5B57\u7B26\u4E0D\u53EF\u533A\u5206\uFF09\uFF1B\n \u4E34\u65F6\u76EE\u5F55\u3001\u5BB6\u76EE\u5F55\u4E0E\u8BB0\u5F55\u5B58\u653E\u76EE\u5F55\u672C\u8EAB\u90FD\u88AB\u6392\u9664\n- \u95E8\u7981\u53D6\u771F\uFF1A\u4E24\u4E2A pager/broker \u6D4B\u8BD5\u4E0D\u518D\u8BFB\u5F00\u53D1\u673A\u672C\u5730\u7684 review model \u8986\u5199\uFF0C\n \u4E2A\u4EBA\u8BBE\u7F6E\u91CC\u7684 pin \u4E0D\u80FD\u518D\u628A\u53D1\u5E03\u95E8\u7981\u5224\u7EA2\n- \u6E90\u7801\u7EA7\u5224\u65AD\u57FA\u5E95\uFF08\u4E0D\u968F\u672C\u5305\u53D1\u5E03\uFF09\uFF1Alaziness / intent / verify-green \u4E09\u6761\u65E2\u6709\u89C4\u5219\u5730\u677F\u4E4B\u4E0B\n \u5404\u6709\u4E00\u4E2A\u7C7B\u578B\u5316\u5224\u65AD\u5C42\uFF0C\u9ED8\u8BA4\u4F11\u7720\uFF08\u672A\u8BBE TYPESAFE_API_KEY \u5373\u5B8C\u5168\u4E0D\u52A8\uFF09\u3002\n \u5B83\u5728 8.16.1 \u7684\u4EA7\u7269\u91CC\u662F\u60F0\u6027\u7684\u2014\u2014\u8BE6\u89C1\u53D1\u5E03\u8BF4\u660E\u7684 Known \u4E00\u8282\n\n## 13.2.0 - 2026-09-19\n\n- `/release-notes` \u79BB\u7EBF\u53EF\u7528\uFF1A\u6784\u5EFA\u671F\u628A `CHANGELOG.md` \u6CE8\u5165 `MACRO.VERSION_CHANGELOG`\n \uFF08\u6B64\u524D\u6052\u4E3A\u7A7A\u4E32\uFF09\uFF0C\u7F13\u5B58\u672A\u547D\u4E2D\u65F6\u56DE\u843D\u5230\u5185\u7F6E\u526F\u672C\u800C\u975E `""`\uFF0C\u5168\u65B0\u5B89\u88C5\u9996\u6B21\u8FD0\u884C\u5373\u53EF\u770B\u5230\u771F\u5B9E\u6761\u76EE\n- `/release-notes` \u7684\u94FE\u63A5\u4E0E\u540E\u53F0 fetch \u6B64\u524D\u90FD\u6307\u5411 anthropics/claude-code\uFF0C\u6539\u4E3A\u6307\u5411 Clavue \u81EA\u8EAB\u4ED3\u5E93\uFF1B\n \u547D\u4EE4\u6539\u4E3A\u5148\u8BFB\u672C\u5730\u5185\u5BB9\u3001\u628A\u7F51\u7EDC\u5F53\u4F5C\u4E0B\u6B21\u5237\u65B0\u7684\u6765\u6E90\uFF0C\u4E0D\u518D\u4E3A I/O \u963B\u585E\u7B54\u6848\n- hop \u6B63\u6587\u6536\u655B\uFF1A\u8FDE\u7EED\u91CD\u590D\u884C\u6298\u53E0\u4E3A\u9996\u5C3E\u4E24\u884C\u5E76\u6CE8\u660E\u7701\u7565\u6761\u6570\uFF08\u8FDE\u7EED\u4E24\u884C\u5C5E\u6B63\u5E38\u4E66\u5199\uFF0C\u4E0D\u5904\u7406\uFF09\uFF0C\n \u8D85\u957F\u6B63\u6587\u6539\u4E3A\u4FDD\u7559\u9996\u5C3E\u800C\u975E\u53EA\u7559\u5934\u90E8\uFF0C\u5E76\u6CE8\u660E\u539F\u59CB\u957F\u5EA6\uFF0C\u907F\u514D\u622A\u65AD\u540E\u7684\u6B63\u6587\u88AB\u8BEF\u8BFB\u4E3A\u672C\u6765\u5C31\u8FD9\u4E48\u77ED\n- Tips \u8FDC\u7A0B feed\uFF1A\u6587\u6848\u53EF\u5728\u4E0D\u53D1\u7248\u7684\u60C5\u51B5\u4E0B\u66F4\u6B63\u3002feed \u5C5E\u4E0D\u53EF\u4FE1\u8F93\u5165\uFF0C\u6309\u767D\u540D\u5355\u6821\u9A8C\u2014\u2014\n \u5FC5\u987B\u58F0\u660E\u672C\u4EA7\u54C1\u3001URL \u5FC5\u987B\u4E3A https\u3001\u5B57\u7B26\u4E32\u957F\u5EA6\u8BBE\u4E0A\u9650\uFF1B\u5355\u6761\u7578\u5F62\u6761\u76EE\u53EA\u4E22\u5F03\u81EA\u8EAB\uFF0C\u4E0D\u5F71\u54CD\u5176\u4F59\u6761\u76EE\u3002\n \u6761\u76EE\u590D\u7528\u65E2\u6709\u51B7\u5374\u673A\u5236\u5E76\u4F7F\u7528\u547D\u540D\u7A7A\u95F4 id\uFF0C\u4E0E\u5185\u7F6E\u63D0\u793A\u4E92\u4E0D\u5E72\u6270\uFF1B\u5931\u8D25\u5168\u7A0B\u9759\u9ED8\uFF0C\u7F51\u7EDC\u95EE\u9898\u4E0D\u4F1A\u53D8\u6210\u62A5\u9519\u6216\u62D6\u6162\u56DE\u5408\n- Tips \u63D0\u793A\u6B64\u524D\u4E0D\u53EF\u8FBE\u800C\u975E\u8FC7\u671F\uFF1A`getRelevantTips` \u7684\u552F\u4E00\u8C03\u7528\u65B9\u4E22\u5F03\u4E86\u7ED3\u679C\uFF0C`getTipToShowOnSpinner`\n \u65E0\u4EFB\u4F55\u8C03\u7528\u65B9\uFF0C`contextTipsActive` \u6052\u4E3A `false` \u4E14\u4ECE\u672A\u8D4B\u503C\u3002\u6539\u4E3A\u5728\u6E32\u67D3\u63D0\u793A\u7684 Spinner \u5185\u90E8\u9009\u53D6\u63D0\u793A\n\n## 13.1.5 - 2026-09-14\n\n- \u4FA7\u67E5\u8BE2\uFF08plan/review hop\u3001\u5206\u7C7B\u5668\u3001\u8BB0\u5FC6\u68C0\u7D22\u3001\u8BC1\u636E\u6536\u636E\uFF09\u6539\u4E3A\u6D41\u5F0F\uFF1A\u4E0D\u518D\u53D1 `stream:false` \u7684\n `/v1/chat/completions`\uFF0C\u907F\u514D\u6DF1\u5EA6\u63A8\u7406\u6A21\u578B\u5728\u7F51\u5173 600 \u79D2\u4EE3\u7406\u5899\u4E0A\u88AB\u6390\u65AD\n- \u4FA7\u67E5\u8BE2\u7684 `effort` \u771F\u6B63\u843D\u5230 `output_config.effort`\uFF1A\u6B64\u524D\u8BE5\u5B57\u6BB5\u672A\u5728\u9009\u9879\u7C7B\u578B\u4E0A\u58F0\u660E\uFF0C\n \u8C03\u7528\u65B9\u5C55\u5F00\u4F20\u503C\u4E0D\u4F1A\u89E6\u53D1\u7C7B\u578B\u68C0\u67E5\uFF0C\u503C\u88AB\u9759\u9ED8\u4E22\u5F03\uFF0C\u7F51\u5173\u9000\u56DE\u81EA\u8EAB\u9ED8\u8BA4\u6863\n- \u8BCA\u65AD\u7C7B Bash/PowerShell \u65E5\u5FD7\u8D70 light \u69FD\u8BC1\u636E\u6536\u636E\uFF1A\u5F15\u7528\u5FC5\u987B\u5728\u539F\u6587\u9010\u5B57\u8282\u547D\u4E2D\uFF0C\u5426\u5219\u4FDD\u7559\u539F\u65E5\u5FD7\uFF1B\n `CLAVUE_EVIDENCE_REDUCER=0` \u5173\u95ED\n- \u5927 Read/Grep/Glob \u9996\u6B21\u4ECD\u7ED9\u5168\u6587\uFF0C\u4E4B\u540E\u51BB\u6210 `clavue_observation_v1` \u5360\u4F4D\uFF0C\u7528 ObsRecall \u5206\u9875\u53EC\u56DE\uFF1B\n `CLAVUE_OBS_PACK=0` \u5173\u95ED\n- \u56DE\u5408\u6309 trivial/research/implement/heavy \u8C03\u5EA6 hop\uFF1B\u4E3B\u69FD model/effort \u7C98\u4F4F\u4EE5\u4FDD\u4E0A\u6E38\u524D\u7F00\u7F13\u5B58\uFF0C\n \u4EC5 compact \u540E\u4E14\u540C\u7C7B\u8FDE\u7EED\u4E24\u8F6E\u624D\u8003\u8651\u6539 effort\n- Plan hop \u7684 DSML \u7B49\u672A\u89E3\u6790\u5DE5\u5177\u65B9\u8A00\u4ECE Thought \u5C55\u793A\u4E0E plan/review \u4E0A\u4E0B\u6587\u4E00\u5E76\u5265\u79BB\uFF0C\u6574\u5757\u5220\u9664\uFF0C\n \u4E0D\u5199\u5165 transcript \u4E5F\u4E0D\u704C\u8FDB\u4E3B\u6A21\u578B\n- \u4ECE\u771F\u5B9E prompt-too-long \u62D2\u7EDD\u4E2D\u5B66\u4E60\u6BCF\u4E2A\u6A21\u578B\u7684\u5B9E\u9645\u8F93\u5165\u4E0A\u9650\uFF0C\u53EA\u6536\u7D27\u4E0D\u653E\u5927\u7A97\u53E3\uFF1B\u7F51\u5173\u53EA\u62A5\n `prompt_tokens` / `completion_tokens` \u65F6\u7528\u91CF\u4E0D\u518D\u5168\u6620\u5C04\u6210 0\n- Edit \u53EF\u9009 `then_run`\uFF1A\u4EC5\u5141\u8BB8\u5355\u6761\u8BCA\u65AD\u547D\u4EE4\uFF0C\u8D70 Bash \u6743\u9650\u5361\u4E0E sandbox\uFF0C\u7981\u6B62 `;&|` \u5939\u5E26\n- T0 Fast \u4FDD\u6301 primary-only\uFF1A\u8DEF\u5F84\u5C42\u5224\u5B9A\u524D\u7F6E\u5230 hop \u8C03\u5EA6\uFF0C\u6700\u7B80\u56DE\u5408\u4E0D\u518D\u4E3A\u8BC1\u636E\u6536\u636E\u4ED8\u4E00\u6B21 light \u5F80\u8FD4\n';return changelog2?changelog2.trim().split(`
8121
+ `).filter(Boolean).slice(0,maxItems):[]}let changelog=getStoredChangelogFromMemory();if(!changelog)return[];let parsed;try{parsed=parseChangelog(changelog)}catch{return[]}let allNotes=[],versions=Object.keys(parsed).sort((a2,b3)=>gt2(a2,b3)?-1:1).slice(0,3);for(let version3 of versions){let notes=parsed[version3];notes&&allNotes.push(...notes)}return allNotes.slice(0,maxItems)}var MAX_LEFT_WIDTH,MAX_USERNAME_LENGTH,BORDER_PADDING,DIVIDER_WIDTH,CONTENT_PADDING,cachedActivity,cachePromise,init_logoV2Utils=__esm({"src/utils/logoV2Utils.ts"(){init_state();init_branding();init_stringWidth();init_auth();init_cwd2();init_file();init_format2();init_releaseNotes();init_semver();init_sessionStorage();init_settings2();MAX_LEFT_WIDTH=50,MAX_USERNAME_LENGTH=20,BORDER_PADDING=4,DIVIDER_WIDTH=1,CONTENT_PADDING=2;__name(getRemoteAwareDisplayPath,"getRemoteAwareDisplayPath");__name(getLayoutMode,"getLayoutMode");__name(calculateLayoutDimensions,"calculateLayoutDimensions");__name(calculateOptimalLeftWidth,"calculateOptimalLeftWidth");__name(formatWelcomeMessage,"formatWelcomeMessage");__name(truncatePath,"truncatePath");cachedActivity=[],cachePromise=null;__name(getRecentActivity,"getRecentActivity");__name(getRecentActivitySync,"getRecentActivitySync");__name(getLogoDisplayData,"getLogoDisplayData");__name(formatModelAndBilling,"formatModelAndBilling");__name(getRecentReleaseNotesSync,"getRecentReleaseNotesSync")}});function Clawd({pose="default"}={}){let frame=POSE_FRAMES[pose];return(0,import_jsx_runtime143.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime143.jsx)(ThemedText,{color:"mascot_body",children:frame.top}),(0,import_jsx_runtime143.jsx)(ThemedText,{color:"mascot_body",children:frame.middle}),(0,import_jsx_runtime143.jsx)(ThemedText,{color:"mascot_body",children:frame.bottom})]})}var import_jsx_runtime143,POSE_FRAMES,init_Clawd=__esm({"src/components/LogoV2/Clawd.tsx"(){init_ink();import_jsx_runtime143=__toESM(require_jsx_runtime()),POSE_FRAMES={default:{top:" \u256D\u2500\u2500\u256E ",middle:" \u2502 \u9F8D \u2502 ",bottom:" \u2570\u2500\u2500\u256F "},"look-left":{top:" \u256D\u2500\u2500\u256E ",middle:" \u2502\u9F8D \u2502 ",bottom:" \u2570\u2500\u2500\u256F "},"look-right":{top:" \u256D\u2500\u2500\u256E ",middle:" \u2502 \u9F8D\u2502 ",bottom:" \u2570\u2500\u2500\u256F "},"arms-up":{top:" \u2571\u256D\u2500\u2500\u256E\u2572 ",middle:" \u2502 \u9F8D \u2502 ",bottom:" \u2570\u2500\u2500\u256F "}};__name(Clawd,"Clawd")}});function calculateFeedWidth(config3){let{title,lines,footer,emptyMessage,customContent}=config3,maxWidth=stringWidth(title);if(customContent!==void 0)maxWidth=Math.max(maxWidth,customContent.width);else if(lines.length===0&&emptyMessage)maxWidth=Math.max(maxWidth,stringWidth(emptyMessage));else{let maxTimestampWidth=Math.max(0,...lines.map(line=>line.timestamp?stringWidth(line.timestamp):0));for(let line of lines){let timestampWidth=maxTimestampWidth>0?maxTimestampWidth:0,lineWidth=stringWidth(line.text)+(timestampWidth>0?timestampWidth+2:0);maxWidth=Math.max(maxWidth,lineWidth)}}return footer&&(maxWidth=Math.max(maxWidth,stringWidth(footer))),maxWidth}function Feed({config:config3,actualWidth}){let{title,lines,footer,emptyMessage,customContent}=config3,gap=" ",maxTimestampWidth=Math.max(0,...lines.map(line=>line.timestamp?stringWidth(line.timestamp):0));return(0,import_jsx_runtime144.jsxs)(ThemedBox_default,{flexDirection:"column",width:actualWidth,children:[(0,import_jsx_runtime144.jsx)(ThemedText,{bold:!0,color:"brand",children:title}),customContent?(0,import_jsx_runtime144.jsxs)(import_jsx_runtime144.Fragment,{children:[customContent.content,footer&&(0,import_jsx_runtime144.jsx)(ThemedText,{dimColor:!0,italic:!0,children:truncate2(footer,actualWidth)})]}):lines.length===0&&emptyMessage?(0,import_jsx_runtime144.jsx)(ThemedText,{dimColor:!0,children:truncate2(emptyMessage,actualWidth)}):(0,import_jsx_runtime144.jsxs)(import_jsx_runtime144.Fragment,{children:[lines.map((line,index)=>{let textWidth=Math.max(10,actualWidth-(maxTimestampWidth>0?maxTimestampWidth+gap.length:0));return(0,import_jsx_runtime144.jsxs)(ThemedText,{children:[maxTimestampWidth>0&&(0,import_jsx_runtime144.jsxs)(import_jsx_runtime144.Fragment,{children:[(0,import_jsx_runtime144.jsx)(ThemedText,{dimColor:!0,children:(line.timestamp||"").padEnd(maxTimestampWidth)}),gap]}),(0,import_jsx_runtime144.jsx)(ThemedText,{children:truncate2(line.text,textWidth)})]},index)}),footer&&(0,import_jsx_runtime144.jsx)(ThemedText,{dimColor:!0,italic:!0,children:truncate2(footer,actualWidth)})]})]})}var import_jsx_runtime144,init_Feed=__esm({"src/components/LogoV2/Feed.tsx"(){init_stringWidth2();init_ink();init_format2();import_jsx_runtime144=__toESM(require_jsx_runtime());__name(calculateFeedWidth,"calculateFeedWidth");__name(Feed,"Feed")}});function FeedColumn({feeds,maxWidth}){let feedWidths=feeds.map(feed=>calculateFeedWidth(feed)),maxOfAllFeeds=Math.max(...feedWidths),actualWidth=Math.min(maxOfAllFeeds,maxWidth);return(0,import_jsx_runtime145.jsx)(ThemedBox_default,{flexDirection:"column",children:feeds.map((feed,index)=>(0,import_jsx_runtime145.jsxs)(React65.Fragment,{children:[(0,import_jsx_runtime145.jsx)(Feed,{config:feed,actualWidth}),index<feeds.length-1&&(0,import_jsx_runtime145.jsx)(Divider,{color:"brand",width:actualWidth})]},index))})}var React65,import_jsx_runtime145,init_FeedColumn=__esm({"src/components/LogoV2/FeedColumn.tsx"(){React65=__toESM(require_react());init_ink();init_Divider();init_Feed();import_jsx_runtime145=__toESM(require_jsx_runtime());__name(FeedColumn,"FeedColumn")}});import{homedir as homedir37}from"os";function createRecentActivityFeed(activities){let lines=activities.map(log4=>{let time3=formatRelativeTimeAgo(log4.modified);return{text:(log4.summary&&log4.summary!=="No prompt"?log4.summary:log4.firstPrompt)||"",timestamp:time3}});return{title:"Recent activity",lines,footer:lines.length>0?"/resume for more":void 0,emptyMessage:"No recent activity"}}function createWhatsNewFeed(releaseNotes2){let lines=releaseNotes2.map(note=>({text:note}));return{title:"What's new",lines,footer:lines.length>0?"/release-notes for more":void 0,emptyMessage:"Check the Clavue changelog for updates"}}function createProjectOnboardingFeed(steps){let lines=steps.filter(({isEnabled:isEnabled3})=>isEnabled3).sort((a2,b3)=>Number(a2.isComplete)-Number(b3.isComplete)).map(({text:text3,isComplete})=>({text:`${isComplete?`${figures_default.tick} `:""}${text3}`})),warningText=getCwd()===homedir37()?"Note: You have launched Clavue in your home directory. For the best experience, launch it in a project directory instead.":void 0;return warningText&&lines.push({text:warningText}),{title:"Tips for getting started",lines}}var init_feedConfigs=__esm({"src/components/LogoV2/feedConfigs.tsx"(){init_figures();init_cwd2();init_format2();__name(createRecentActivityFeed,"createRecentActivityFeed");__name(createWhatsNewFeed,"createWhatsNewFeed");__name(createProjectOnboardingFeed,"createProjectOnboardingFeed")}});function OffscreenFreeze({children}){"use no memo";let inVirtualList=(0,import_react110.useContext)(InVirtualListContext),[ref,{isVisible}]=useTerminalViewport(),cached6=(0,import_react110.useRef)(children);return(isVisible||inVirtualList)&&(cached6.current=children),(0,import_jsx_runtime146.jsx)(ThemedBox_default,{ref,children:cached6.current})}var import_react110,import_jsx_runtime146,init_OffscreenFreeze=__esm({"src/components/OffscreenFreeze.tsx"(){import_react110=__toESM(require_react());init_use_terminal_viewport();init_ink();init_messageActions();import_jsx_runtime146=__toESM(require_jsx_runtime());__name(OffscreenFreeze,"OffscreenFreeze")}});function hold(pose,offset,frames){return Array.from({length:frames},()=>({pose,offset}))}function AnimatedClawd(){let{pose,bounceOffset,onClick}=useClawdAnimation();return(0,import_jsx_runtime147.jsx)(ThemedBox_default,{height:CLAWD_HEIGHT,flexDirection:"column",onClick,children:(0,import_jsx_runtime147.jsx)(ThemedBox_default,{marginTop:bounceOffset,flexShrink:0,children:(0,import_jsx_runtime147.jsx)(Clawd,{pose})})})}function useClawdAnimation(){let[reducedMotion]=(0,import_react111.useState)(()=>getInitialSettings().prefersReducedMotion??!1),[frameIndex,setFrameIndex]=(0,import_react111.useState)(-1),sequenceRef=(0,import_react111.useRef)(JUMP_WAVE),onClick=__name(()=>{reducedMotion||frameIndex!==-1||(sequenceRef.current=CLICK_ANIMATIONS[Math.floor(Math.random()*CLICK_ANIMATIONS.length)],setFrameIndex(0))},"onClick");(0,import_react111.useEffect)(()=>{if(frameIndex===-1)return;if(frameIndex>=sequenceRef.current.length){setFrameIndex(-1);return}let timer2=setTimeout(setFrameIndex,FRAME_MS,incrementFrame);return()=>clearTimeout(timer2)},[frameIndex]);let seq=sequenceRef.current,current=frameIndex>=0&&frameIndex<seq.length?seq[frameIndex]:IDLE;return{pose:current.pose,bounceOffset:current.offset,onClick}}var import_react111,import_jsx_runtime147,JUMP_WAVE,LOOK_AROUND,CLICK_ANIMATIONS,IDLE,FRAME_MS,incrementFrame,CLAWD_HEIGHT,init_AnimatedClawd=__esm({"src/components/LogoV2/AnimatedClawd.tsx"(){import_react111=__toESM(require_react());init_ink();init_settings2();init_Clawd();import_jsx_runtime147=__toESM(require_jsx_runtime());__name(hold,"hold");JUMP_WAVE=[...hold("default",1,2),...hold("arms-up",0,3),...hold("default",0,1),...hold("default",1,2),...hold("arms-up",0,3),...hold("default",0,1)],LOOK_AROUND=[...hold("look-right",0,5),...hold("look-left",0,5),...hold("default",0,1)],CLICK_ANIMATIONS=[JUMP_WAVE,LOOK_AROUND],IDLE={pose:"default",offset:0},FRAME_MS=60,incrementFrame=__name(i3=>i3+1,"incrementFrame"),CLAWD_HEIGHT=3;__name(AnimatedClawd,"AnimatedClawd");__name(useClawdAnimation,"useClawdAnimation")}});function BrandWordmark({version:version3,welcomeMessage,align="left",showVersion=!0}){return(0,import_jsx_runtime148.jsxs)(ThemedBox_default,{flexDirection:"column",alignItems:align==="center"?"center":"flex-start",children:[(0,import_jsx_runtime148.jsxs)(ThemedText,{children:[(0,import_jsx_runtime148.jsx)(ThemedText,{color:"inactive",children:"/"}),(0,import_jsx_runtime148.jsx)(ThemedText,{color:"brand",bold:!0,children:APP_NAME}),showVersion&&version3?(0,import_jsx_runtime148.jsx)(ThemedText,{dimColor:!0,children:` v${version3}`}):null]}),(0,import_jsx_runtime148.jsx)(ThemedText,{color:"brand",children:APP_BRAND_SUBTITLE}),welcomeMessage?(0,import_jsx_runtime148.jsx)(ThemedText,{dimColor:!0,children:welcomeMessage}):null]})}var import_jsx_runtime148,init_BrandWordmark=__esm({"src/components/LogoV2/BrandWordmark.tsx"(){init_ink();init_branding();import_jsx_runtime148=__toESM(require_jsx_runtime());__name(BrandWordmark,"BrandWordmark")}});function CondensedLogo(){let{columns}=useTerminalSize(),agent=useAppState(s2=>s2.agent),effortValue=useAppState(s2=>s2.effortValue),remoteCwd=useAppState(s2=>s2.remoteCwd),model=useMainLoopModel(),modelDisplayName=renderModelSetting(model),{version:version3,cwd:cwd6,billingType,agentName:agentNameFromSettings}=getLogoDisplayData({isRemoteMode:getIsRemoteMode(),remoteCwd}),agentName=agent??agentNameFromSettings,textWidth=Math.max(columns-15,20),truncatedVersion=truncate2(version3,Math.max(textWidth-13,6)),effortSuffix=getEffortSuffix(model,effortValue),{shouldSplit,truncatedModel,truncatedBilling}=formatModelAndBilling(modelDisplayName+effortSuffix,billingType,textWidth),cwdAvailableWidth=agentName?textWidth-1-stringWidth(agentName)-3:textWidth,truncatedCwd=truncatePath(cwd6,Math.max(cwdAvailableWidth,10)),locationLine=agentName?`@${agentName} \xB7 ${truncatedCwd}`:truncatedCwd;return(0,import_jsx_runtime149.jsx)(OffscreenFreeze,{children:(0,import_jsx_runtime149.jsxs)(ThemedBox_default,{flexDirection:"row",gap:2,alignItems:"center",children:[isFullscreenEnvEnabled()?(0,import_jsx_runtime149.jsx)(AnimatedClawd,{}):(0,import_jsx_runtime149.jsx)(Clawd,{}),(0,import_jsx_runtime149.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime149.jsx)(BrandWordmark,{version:truncatedVersion}),shouldSplit?(0,import_jsx_runtime149.jsxs)(import_jsx_runtime149.Fragment,{children:[(0,import_jsx_runtime149.jsx)(ThemedText,{dimColor:!0,children:truncatedModel}),(0,import_jsx_runtime149.jsx)(ThemedText,{dimColor:!0,children:truncatedBilling})]}):(0,import_jsx_runtime149.jsxs)(ThemedText,{dimColor:!0,children:[truncatedModel," \xB7 ",truncatedBilling]}),(0,import_jsx_runtime149.jsx)(ThemedText,{dimColor:!0,children:locationLine})]})]})})}var import_jsx_runtime149,init_CondensedLogo=__esm({"src/components/LogoV2/CondensedLogo.tsx"(){init_state();init_useMainLoopModel();init_useTerminalSize();init_stringWidth2();init_ink();init_AppState();init_effort();init_format2();init_fullscreen();init_logoV2Utils();init_model();init_OffscreenFreeze();init_AnimatedClawd();init_BrandWordmark();init_Clawd();import_jsx_runtime149=__toESM(require_jsx_runtime());__name(CondensedLogo,"CondensedLogo")}});function EmergencyTip(){let tip=(0,import_react112.useMemo)(getTipOfFeed,[]),lastShownTip=(0,import_react112.useMemo)(()=>getGlobalConfig().lastShownEmergencyTip,[]),shouldShow=tip.tip&&tip.tip!==lastShownTip;return(0,import_react112.useEffect)(()=>{shouldShow&&saveGlobalConfig(current=>current.lastShownEmergencyTip===tip.tip?current:{...current,lastShownEmergencyTip:tip.tip})},[shouldShow,tip.tip]),shouldShow?(0,import_jsx_runtime150.jsx)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:(0,import_jsx_runtime150.jsx)(ThemedText,{...tip.color==="warning"?{color:"warning"}:tip.color==="error"?{color:"error"}:{dimColor:!0},children:tip.tip})}):null}function getTipOfFeed(){return getDynamicConfig_CACHED_MAY_BE_STALE(CONFIG_NAME,DEFAULT_TIP)}var import_react112,import_jsx_runtime150,CONFIG_NAME,DEFAULT_TIP,init_EmergencyTip=__esm({"src/components/LogoV2/EmergencyTip.tsx"(){import_react112=__toESM(require_react());init_ink();init_growthbook();init_config12();import_jsx_runtime150=__toESM(require_jsx_runtime()),CONFIG_NAME="tengu-top-of-feed-tip";__name(EmergencyTip,"EmergencyTip");DEFAULT_TIP={tip:"",color:"dim"};__name(getTipOfFeed,"getTipOfFeed")}});function AnimatedAsterisk({char=TEARDROP_ASTERISK}){let[reducedMotion]=(0,import_react113.useState)(()=>getInitialSettings().prefersReducedMotion??!1),[done,setDone]=(0,import_react113.useState)(reducedMotion),startTimeRef=(0,import_react113.useRef)(null),[ref,time3]=useAnimationFrame(done?null:50);if((0,import_react113.useEffect)(()=>{if(done)return;let t7=setTimeout(setDone,TOTAL_ANIMATION_MS,!0);return()=>clearTimeout(t7)},[done]),done)return(0,import_jsx_runtime151.jsx)(ThemedBox_default,{ref,children:(0,import_jsx_runtime151.jsx)(ThemedText,{color:SETTLED_GREY,children:char})});startTimeRef.current===null&&(startTimeRef.current=time3);let hue=(time3-startTimeRef.current)/SWEEP_DURATION_MS*360%360;return(0,import_jsx_runtime151.jsx)(ThemedBox_default,{ref,children:(0,import_jsx_runtime151.jsx)(ThemedText,{color:toRGBColor(hueToRgb(hue)),children:char})})}var import_react113,import_jsx_runtime151,SWEEP_DURATION_MS,SWEEP_COUNT,TOTAL_ANIMATION_MS,SETTLED_GREY,init_AnimatedAsterisk=__esm({"src/components/LogoV2/AnimatedAsterisk.tsx"(){import_react113=__toESM(require_react());init_figures2();init_ink();init_settings2();init_utils7();import_jsx_runtime151=__toESM(require_jsx_runtime()),SWEEP_DURATION_MS=1500,SWEEP_COUNT=2,TOTAL_ANIMATION_MS=SWEEP_DURATION_MS*SWEEP_COUNT,SETTLED_GREY=toRGBColor({r:153,g:153,b:153});__name(AnimatedAsterisk,"AnimatedAsterisk")}});function shouldShowOpus1mMergeNotice(){return isOpus1mMergeEnabled()&&(getGlobalConfig().opus1mMergeNoticeSeenCount??0)<MAX_SHOW_COUNT}function Opus1mMergeNotice(){let[show]=(0,import_react114.useState)(shouldShowOpus1mMergeNotice);return(0,import_react114.useEffect)(()=>{if(!show)return;let newCount=(getGlobalConfig().opus1mMergeNoticeSeenCount??0)+1;saveGlobalConfig(prev=>(prev.opus1mMergeNoticeSeenCount??0)>=newCount?prev:{...prev,opus1mMergeNoticeSeenCount:newCount})},[show]),show?(0,import_jsx_runtime152.jsxs)(ThemedBox_default,{paddingLeft:2,children:[(0,import_jsx_runtime152.jsx)(AnimatedAsterisk,{char:UP_ARROW}),(0,import_jsx_runtime152.jsxs)(ThemedText,{dimColor:!0,children:[" ","Clavue Opus now includes a 1M context window"]})]}):null}var import_react114,import_jsx_runtime152,MAX_SHOW_COUNT,init_Opus1mMergeNotice=__esm({"src/components/LogoV2/Opus1mMergeNotice.tsx"(){import_react114=__toESM(require_react());init_figures2();init_ink();init_config12();init_model();init_AnimatedAsterisk();import_jsx_runtime152=__toESM(require_jsx_runtime()),MAX_SHOW_COUNT=6;__name(shouldShowOpus1mMergeNotice,"shouldShowOpus1mMergeNotice");__name(Opus1mMergeNotice,"Opus1mMergeNotice")}});function VoiceModeNotice(){return null}var import_react115,import_jsx_runtime153,init_VoiceModeNotice=__esm({"src/components/LogoV2/VoiceModeNotice.tsx"(){import_react115=__toESM(require_react());init_ink();init_config12();init_settings2();init_uiLocale();init_voiceModeEnabled();init_AnimatedAsterisk();init_Opus1mMergeNotice();import_jsx_runtime153=__toESM(require_jsx_runtime());__name(VoiceModeNotice,"VoiceModeNotice")}});function LogoV2(){let activities=getRecentActivitySync(),username=getGlobalConfig().oauthAccount?.displayName??"",{columns}=useTerminalSize(),showOnboarding=shouldShowProjectOnboarding(),showSandboxStatus=SandboxManager.isSandboxingEnabled(),agent=useAppState(s2=>s2.agent),effortValue=useAppState(s2=>s2.effortValue),remoteCwd=useAppState(s2=>s2.remoteCwd),remoteSessionUrl=useAppState(s2=>s2.remoteSessionUrl),config3=getGlobalConfig(),changelog;try{changelog=getRecentReleaseNotesSync(3)}catch{changelog=[]}let[announcement]=(0,import_react116.useState)(()=>{let announcements=getInitialSettings().companyAnnouncements;if(!(!announcements||announcements.length===0))return config3.numStartups===1?announcements[0]:announcements[Math.floor(Math.random()*announcements.length)]}),{hasReleaseNotes}=checkForReleaseNotesSync(config3.lastReleaseNotesSeen);(0,import_react116.useEffect)(()=>{getGlobalConfig().lastReleaseNotesSeen!=="13.9.2"&&(saveGlobalConfig(current=>current.lastReleaseNotesSeen==="13.9.2"?current:{...current,lastReleaseNotesSeen:"13.9.2"}),showOnboarding&&incrementProjectOnboardingSeenCount())},[config3,showOnboarding]);let model=useMainLoopModel(),fullModelDisplayName=renderModelSetting(model),{version:version3,cwd:cwd6,billingType,agentName:agentNameFromSettings}=getLogoDisplayData({isRemoteMode:getIsRemoteMode(),remoteCwd}),agentName=agent??agentNameFromSettings,effortSuffix=getEffortSuffix(model,effortValue),modelDisplayName=truncate2(fullModelDisplayName+effortSuffix,LEFT_PANEL_MAX_WIDTH-20);if(!hasReleaseNotes&&!showOnboarding&&!isEnvTruthy2(process.env.CLAUDE_CODE_FORCE_FULL_LOGO))return(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsx)(CondensedLogo,{}),(0,import_jsx_runtime154.jsx)(VoiceModeNotice,{}),(0,import_jsx_runtime154.jsx)(Opus1mMergeNotice,{}),isDebugMode()&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime154.jsx)(ThemedText,{color:"warning",children:"Debug mode enabled"}),(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["Logging to: ",isDebugToStdErr()?"stderr":getDebugLogPath()]})]}),(0,import_jsx_runtime154.jsx)(EmergencyTip,{}),process.env.CLAUDE_CODE_TMUX_SESSION&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["tmux session: ",process.env.CLAUDE_CODE_TMUX_SESSION]}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS?`Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - ${APP_NAME} uses ${process.env.CLAUDE_CODE_TMUX_PREFIX})`:`Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} d`})]}),announcement&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[!process.env.IS_DEMO&&config3.oauthAccount?.organizationName&&(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["Message from ",config3.oauthAccount.organizationName,":"]}),(0,import_jsx_runtime154.jsx)(ThemedText,{children:announcement})]}),!1,!1]});let layoutMode=getLayoutMode(columns),userTheme=resolveThemeSetting(getGlobalConfig().theme),borderTitle=` ${color("brand",userTheme)(APP_NAME)} ${color("inactive",userTheme)(`v${version3}`)} `,compactBorderTitle=color("brand",userTheme)(` ${APP_NAME} `);if(layoutMode==="compact"){let welcomeMessage2=formatWelcomeMessage(username);stringWidth(welcomeMessage2)>columns-4&&(welcomeMessage2=formatWelcomeMessage(null));let cwdAvailableWidth2=agentName?columns-4-"@".length-stringWidth(agentName)-" \xB7 ".length:columns-4,truncatedCwd2=truncatePath(cwd6,Math.max(cwdAvailableWidth2,10));return(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsx)(OffscreenFreeze,{children:(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{flexDirection:"column",borderStyle:"round",borderColor:"claude",borderText:{content:compactBorderTitle,position:"top",align:"start",offset:1},paddingX:1,paddingY:1,alignItems:"center",width:columns,children:[(0,import_jsx_runtime154.jsx)(ThemedText,{bold:!0,children:welcomeMessage2}),(0,import_jsx_runtime154.jsx)(ThemedBox_default,{marginY:1,children:(0,import_jsx_runtime154.jsx)(Clawd,{})}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:modelDisplayName}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:billingType}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:agentName?`@${agentName} \xB7 ${truncatedCwd2}`:truncatedCwd2})]})}),(0,import_jsx_runtime154.jsx)(VoiceModeNotice,{}),(0,import_jsx_runtime154.jsx)(Opus1mMergeNotice,{}),showSandboxStatus&&(0,import_jsx_runtime154.jsx)(ThemedBox_default,{marginTop:1,flexDirection:"column",children:(0,import_jsx_runtime154.jsx)(ThemedText,{color:"warning",children:"Your bash commands will be sandboxed. Disable with /sandbox."})})]})}let welcomeMessage=formatWelcomeMessage(username),modelKnown=isKnownModel(model),modelLine=!process.env.IS_DEMO&&config3.oauthAccount?.organizationName?`${modelDisplayName}${modelKnown?"":" (unknown \u2014 passthrough)"} \xB7 ${billingType} \xB7 ${config3.oauthAccount.organizationName}`:`${modelDisplayName}${modelKnown?"":" (unknown \u2014 passthrough)"} \xB7 ${billingType}`,cwdAvailableWidth=agentName?LEFT_PANEL_MAX_WIDTH-"@".length-stringWidth(agentName)-" \xB7 ".length:LEFT_PANEL_MAX_WIDTH,truncatedCwd=truncatePath(cwd6,Math.max(cwdAvailableWidth,10)),cwdLine=agentName?`@${agentName} \xB7 ${truncatedCwd}`:truncatedCwd,optimalLeftWidth=calculateOptimalLeftWidth(welcomeMessage,cwdLine,modelLine),{leftWidth,rightWidth}=calculateLayoutDimensions(columns,layoutMode,optimalLeftWidth);return(0,import_jsx_runtime154.jsxs)(import_jsx_runtime154.Fragment,{children:[(0,import_jsx_runtime154.jsx)(OffscreenFreeze,{children:(0,import_jsx_runtime154.jsx)(ThemedBox_default,{flexDirection:"column",borderStyle:"round",borderColor:"claude",borderText:{content:borderTitle,position:"top",align:"start",offset:3},children:(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{flexDirection:layoutMode==="horizontal"?"row":"column",paddingX:1,gap:1,children:[(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{flexDirection:"column",width:leftWidth,justifyContent:"space-between",alignItems:"center",minHeight:9,children:[(0,import_jsx_runtime154.jsx)(ThemedBox_default,{marginTop:1,children:(0,import_jsx_runtime154.jsx)(ThemedText,{bold:!0,children:welcomeMessage})}),(0,import_jsx_runtime154.jsx)(Clawd,{}),(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{flexDirection:"column",alignItems:"center",children:[(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:modelLine}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:cwdLine})]})]}),layoutMode==="horizontal"&&(0,import_jsx_runtime154.jsx)(ThemedBox_default,{height:"100%",borderStyle:"single",borderColor:"claude",borderDimColor:!0,borderTop:!1,borderBottom:!1,borderLeft:!1}),layoutMode==="horizontal"&&(0,import_jsx_runtime154.jsx)(FeedColumn,{feeds:showOnboarding?[createProjectOnboardingFeed(getSteps()),createRecentActivityFeed(activities)]:[createRecentActivityFeed(activities),createWhatsNewFeed(changelog)],maxWidth:rightWidth})]})})}),(0,import_jsx_runtime154.jsx)(VoiceModeNotice,{}),(0,import_jsx_runtime154.jsx)(Opus1mMergeNotice,{}),isDebugMode()&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime154.jsx)(ThemedText,{color:"warning",children:"Debug mode enabled"}),(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["Logging to: ",isDebugToStdErr()?"stderr":getDebugLogPath()]})]}),(0,import_jsx_runtime154.jsx)(EmergencyTip,{}),process.env.CLAUDE_CODE_TMUX_SESSION&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["tmux session: ",process.env.CLAUDE_CODE_TMUX_SESSION]}),(0,import_jsx_runtime154.jsx)(ThemedText,{dimColor:!0,children:process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS?`Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - ${APP_NAME} uses ${process.env.CLAUDE_CODE_TMUX_PREFIX})`:`Detach: ${process.env.CLAUDE_CODE_TMUX_PREFIX} d`})]}),announcement&&(0,import_jsx_runtime154.jsxs)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:[!process.env.IS_DEMO&&config3.oauthAccount?.organizationName&&(0,import_jsx_runtime154.jsxs)(ThemedText,{dimColor:!0,children:["Message from ",config3.oauthAccount.organizationName,":"]}),(0,import_jsx_runtime154.jsx)(ThemedText,{children:announcement})]}),showSandboxStatus&&(0,import_jsx_runtime154.jsx)(ThemedBox_default,{paddingLeft:2,flexDirection:"column",children:(0,import_jsx_runtime154.jsx)(ThemedText,{color:"warning",children:"Your bash commands will be sandboxed. Disable with /sandbox."})}),!1,!1]})}var import_react116,import_jsx_runtime154,LEFT_PANEL_MAX_WIDTH,init_LogoV2=__esm({"src/components/LogoV2/LogoV2.tsx"(){init_branding();init_ink();init_useTerminalSize();init_stringWidth2();init_logoV2Utils();init_format2();init_file();init_Clawd();init_FeedColumn();init_feedConfigs();init_config12();init_systemTheme();init_settings2();init_debug();import_react116=__toESM(require_react());init_projectOnboardingState();init_CondensedLogo();init_OffscreenFreeze();init_releaseNotes();init_dumpPrompts();init_envUtils();init_startupProfiler();init_EmergencyTip();init_VoiceModeNotice();init_Opus1mMergeNotice();init_state();init_sandbox_adapter();init_AppState();init_effort();init_useMainLoopModel();init_model();import_jsx_runtime154=__toESM(require_jsx_runtime()),LEFT_PANEL_MAX_WIDTH=50;__name(LogoV2,"LogoV2")}});function CompactSummary({message,screen}){let isZh7=resolveUiLocale()==="zh-CN",isTranscriptMode=screen==="transcript",textContent=getUserMessageText(message)||"",metadata=message.summarizeMetadata;return metadata?(0,import_jsx_runtime155.jsx)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime155.jsx)(ThemedBox_default,{minWidth:2,children:(0,import_jsx_runtime155.jsx)(ThemedText,{color:"text",children:BLACK_CIRCLE})}),(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime155.jsx)(ThemedText,{bold:!0,children:isZh7?"\u4F1A\u8BDD\u6458\u8981":"Summarized conversation"}),!isTranscriptMode&&(0,import_jsx_runtime155.jsx)(MessageResponse,{children:(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime155.jsx)(ThemedText,{dimColor:!0,children:isZh7?`\u5DF2\u6458\u8981 ${metadata.messagesSummarized} \u6761\u6D88\u606F${metadata.direction==="up_to"?"(\u6B64\u5904\u4E4B\u524D)":"(\u6B64\u5904\u4E4B\u540E)"}`:`Summarized ${metadata.messagesSummarized} messages ${metadata.direction==="up_to"?"up to this point":"from this point"}`}),metadata.userContext&&(0,import_jsx_runtime155.jsxs)(ThemedText,{dimColor:!0,children:[isZh7?"\u4E0A\u4E0B\u6587:":"Context:"," ","\u201C",metadata.userContext,"\u201D"]}),(0,import_jsx_runtime155.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime155.jsx)(ConfigurableShortcutHint,{action:"app:toggleTranscript",context:"Global",fallback:"ctrl+o",description:isZh7?"\u5C55\u5F00\u5386\u53F2":"expand history",parens:!0})})]})}),isTranscriptMode&&(0,import_jsx_runtime155.jsx)(MessageResponse,{children:(0,import_jsx_runtime155.jsx)(ThemedText,{children:textContent})})]})]})}):(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:[(0,import_jsx_runtime155.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime155.jsx)(ThemedBox_default,{minWidth:2,children:(0,import_jsx_runtime155.jsx)(ThemedText,{color:"text",children:BLACK_CIRCLE})}),(0,import_jsx_runtime155.jsx)(ThemedBox_default,{flexDirection:"column",children:(0,import_jsx_runtime155.jsxs)(ThemedText,{bold:!0,children:[isZh7?"\u538B\u7F29\u6458\u8981":"Compact summary",!isTranscriptMode&&(0,import_jsx_runtime155.jsxs)(ThemedText,{dimColor:!0,children:[" ",(0,import_jsx_runtime155.jsx)(ConfigurableShortcutHint,{action:"app:toggleTranscript",context:"Global",fallback:"ctrl+o",description:isZh7?"\u5C55\u5F00":"expand",parens:!0})]})]})})]}),isTranscriptMode&&(0,import_jsx_runtime155.jsx)(MessageResponse,{children:(0,import_jsx_runtime155.jsx)(ThemedText,{children:textContent})})]})}var import_jsx_runtime155,init_CompactSummary=__esm({"src/components/CompactSummary.tsx"(){init_figures2();init_ink();init_messages4();init_uiLocale();init_ConfigurableShortcutHint();init_MessageResponse();import_jsx_runtime155=__toESM(require_jsx_runtime());__name(CompactSummary,"CompactSummary")}});function useBlink(enabled5,intervalMs=BLINK_INTERVAL_MS){let focused=useTerminalFocus(),[ref,time3]=useAnimationFrame(enabled5&&focused?intervalMs:null);if(!enabled5||!focused)return[ref,!0];let isVisible=Math.floor(time3/intervalMs)%2===0;return[ref,isVisible]}var BLINK_INTERVAL_MS,init_useBlink=__esm({"src/hooks/useBlink.ts"(){init_ink();BLINK_INTERVAL_MS=600;__name(useBlink,"useBlink")}});function ToolUseLoader({isError:isError2,isUnresolved,shouldAnimate}){let[ref,isBlinking]=useBlink(shouldAnimate);return(0,import_jsx_runtime156.jsx)(ThemedBox_default,{ref,minWidth:2,children:(0,import_jsx_runtime156.jsx)(ThemedText,{color:isUnresolved?void 0:isError2?"error":"success",dimColor:isUnresolved,children:!shouldAnimate||isBlinking||isError2||!isUnresolved?BLACK_CIRCLE:" "})})}var import_jsx_runtime156,init_ToolUseLoader=__esm({"src/components/ToolUseLoader.tsx"(){init_figures2();init_useBlink();init_ink();import_jsx_runtime156=__toESM(require_jsx_runtime());__name(ToolUseLoader,"ToolUseLoader")}});function AdvisorMessage({block:block2,addMargin,resolvedToolUseIDs,erroredToolUseIDs,shouldAnimate,verbose,advisorModel}){if(block2.type==="server_tool_use"){let input2=block2.input&&Object.keys(block2.input).length>0?jsonStringify(block2.input):null;return(0,import_jsx_runtime157.jsxs)(ThemedBox_default,{marginTop:addMargin?1:0,paddingRight:2,flexDirection:"row",children:[(0,import_jsx_runtime157.jsx)(ToolUseLoader,{shouldAnimate,isUnresolved:!resolvedToolUseIDs.has(block2.id),isError:erroredToolUseIDs.has(block2.id)}),(0,import_jsx_runtime157.jsx)(ThemedText,{bold:!0,children:"Advising"}),advisorModel?(0,import_jsx_runtime157.jsxs)(ThemedText,{dimColor:!0,children:[" using ",renderModelName(advisorModel)]}):null,input2?(0,import_jsx_runtime157.jsxs)(ThemedText,{dimColor:!0,children:[" \xB7 ",input2]}):null]})}let body;switch(block2.content.type){case"advisor_tool_result_error":body=(0,import_jsx_runtime157.jsxs)(ThemedText,{color:"error",children:["Advisor unavailable (",block2.content.error_code,")"]});break;case"advisor_result":body=verbose?(0,import_jsx_runtime157.jsx)(ThemedText,{dimColor:!0,children:block2.content.text}):(0,import_jsx_runtime157.jsxs)(ThemedText,{dimColor:!0,children:[figures_default.tick," Advisor has reviewed the conversation and will apply the feedback ",(0,import_jsx_runtime157.jsx)(CtrlOToExpand,{})]});break;case"advisor_redacted_result":body=(0,import_jsx_runtime157.jsxs)(ThemedText,{dimColor:!0,children:[figures_default.tick," Advisor has reviewed the conversation and will apply the feedback"]});break}return(0,import_jsx_runtime157.jsx)(ThemedBox_default,{paddingRight:2,children:(0,import_jsx_runtime157.jsx)(MessageResponse,{children:body})})}var import_jsx_runtime157,init_AdvisorMessage=__esm({"src/components/messages/AdvisorMessage.tsx"(){init_figures();init_ink();init_model();init_slowOperations();init_CtrlOToExpand();init_MessageResponse();init_ToolUseLoader();import_jsx_runtime157=__toESM(require_jsx_runtime());__name(AdvisorMessage,"AdvisorMessage")}});function AssistantRedactedThinkingMessage({addMargin=!1}){return(0,import_jsx_runtime158.jsx)(ThemedBox_default,{marginTop:addMargin?1:0,children:(0,import_jsx_runtime158.jsx)(ThemedText,{dimColor:!0,italic:!0,children:"\u25C7 Thinking\u2026"})})}var import_jsx_runtime158,init_AssistantRedactedThinkingMessage=__esm({"src/components/messages/AssistantRedactedThinkingMessage.tsx"(){init_ink();import_jsx_runtime158=__toESM(require_jsx_runtime());__name(AssistantRedactedThinkingMessage,"AssistantRedactedThinkingMessage")}});function useClaudeAiLimits(){let[limits,setLimits]=(0,import_react117.useState)({...currentLimits});return(0,import_react117.useEffect)(()=>{let listener2=__name(newLimits=>{setLimits({...newLimits})},"listener");return statusListeners.add(listener2),()=>{statusListeners.delete(listener2)}},[]),limits}var import_react117,init_claudeAiLimitsHook=__esm({"src/services/claudeAiLimitsHook.ts"(){import_react117=__toESM(require_react());init_claudeAiLimits();__name(useClaudeAiLimits,"useClaudeAiLimits")}});function getUpsellMessage({shouldShowUpsell,isMax20x,shouldAutoOpenRateLimitOptionsMenu}){return shouldShowUpsell?shouldAutoOpenRateLimitOptionsMenu&&!isMax20x?"Opening your options\u2026":PROVIDER_SWITCH_HINT:null}function RateLimitMessage({text:text3,onOpenRateLimitOptions}){let isMax20x=getRateLimitTier()==="default_claude_max_20x",shouldShowUpsell=shouldProcessMockLimits()||isClaudeAISubscriber(),canSeeRateLimitOptionsUpsell=shouldShowUpsell&&!isMax20x,[hasOpenedInteractiveMenu,setHasOpenedInteractiveMenu]=(0,import_react118.useState)(!1),claudeAiLimits=useClaudeAiLimits(),isCurrentlyRateLimited=claudeAiLimits.status==="rejected"&&claudeAiLimits.resetsAt!==void 0&&!claudeAiLimits.isUsingOverage,shouldAutoOpenRateLimitOptionsMenu=canSeeRateLimitOptionsUpsell&&!hasOpenedInteractiveMenu&&isCurrentlyRateLimited&&onOpenRateLimitOptions;(0,import_react118.useEffect)(()=>{shouldAutoOpenRateLimitOptionsMenu&&(setHasOpenedInteractiveMenu(!0),onOpenRateLimitOptions())},[shouldAutoOpenRateLimitOptionsMenu,onOpenRateLimitOptions]);let upsell=(0,import_react118.useMemo)(()=>{let message=getUpsellMessage({shouldShowUpsell,isMax20x,shouldAutoOpenRateLimitOptionsMenu:!!shouldAutoOpenRateLimitOptionsMenu});return message?(0,import_jsx_runtime159.jsx)(ThemedText,{dimColor:!0,children:message}):null},[shouldShowUpsell,isMax20x,shouldAutoOpenRateLimitOptionsMenu]);return(0,import_jsx_runtime159.jsx)(MessageResponse,{children:(0,import_jsx_runtime159.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime159.jsx)(ThemedText,{color:"error",children:text3}),hasOpenedInteractiveMenu?null:upsell]})})}var import_react118,import_jsx_runtime159,init_RateLimitMessage=__esm({"src/components/messages/RateLimitMessage.tsx"(){import_react118=__toESM(require_react());init_ink();init_claudeAiLimitsHook();init_rateLimitMocking();init_auth();init_product();init_MessageResponse();import_jsx_runtime159=__toESM(require_jsx_runtime());__name(getUpsellMessage,"getUpsellMessage");__name(RateLimitMessage,"RateLimitMessage")}});function InvalidApiKeyMessage(){let isKeychainLocked=isMacOsKeychainLocked();return(0,import_jsx_runtime160.jsx)(MessageResponse,{children:(0,import_jsx_runtime160.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:getInvalidApiKeyErrorMessage()}),isKeychainLocked&&(0,import_jsx_runtime160.jsx)(ThemedText,{dimColor:!0,children:"\xB7 Run in another terminal: security unlock-keychain"})]})})}function AssistantTextMessage({param:{text:text3},addMargin,shouldShowDot,verbose,onOpenRateLimitOptions}){let isSelected=(0,import_react119.useContext)(MessageActionsSelectedContext);if(isEmptyMessageText(text3))return null;if(isRateLimitErrorMessage(text3))return(0,import_jsx_runtime160.jsx)(RateLimitMessage,{text:text3,onOpenRateLimitOptions});switch(text3){case NO_RESPONSE_REQUESTED:return null;case PROMPT_TOO_LONG_ERROR_MESSAGE:{let upgradeHint=getUpgradeMessage("warning");return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsxs)(ThemedText,{color:"error",children:["Context limit reached \xB7 /compact or /clear to continue",upgradeHint?` \xB7 ${upgradeHint}`:""]})})}case CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE:return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsxs)(ThemedText,{color:"error",children:["\u4F59\u989D\u4E0D\u8DB3 \xB7 \u8BF7\u5230\u6240\u7528\u670D\u52A1\u5546\u5145\u503C\uFF0C\u6216",PROVIDER_SWITCH_HINT]})});case getInvalidApiKeyErrorMessage():return(0,import_jsx_runtime160.jsx)(InvalidApiKeyMessage,{});case getInvalidApiKeyErrorMessageExternal():return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:getInvalidApiKeyErrorMessageExternal()})});case getOrgDisabledErrorMessageEnvKey():case getOrgDisabledErrorMessageEnvKeyWithOauth():return(0,import_jsx_runtime160.jsx)(MessageResponse,{children:(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:text3})});case getTokenRevokedErrorMessage():return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:getTokenRevokedErrorMessage()})});case getApiTimeoutErrorMessage():return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsxs)(ThemedText,{color:"error",children:[getApiTimeoutErrorMessage(),process.env.API_TIMEOUT_MS&&(0,import_jsx_runtime160.jsxs)(import_jsx_runtime160.Fragment,{children:[" ","(API_TIMEOUT_MS=",process.env.API_TIMEOUT_MS,"ms, try increasing it)"]})]})});case getCustomOffSwitchMessage():return(0,import_jsx_runtime160.jsx)(MessageResponse,{children:(0,import_jsx_runtime160.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:getCustomOffSwitchMessage()}),(0,import_jsx_runtime160.jsxs)(ThemedText,{children:["To continue immediately, use /model to switch to"," ",renderModelName(getDefaultSonnetModel())," and continue coding."]})]})});case ERROR_MESSAGE_USER_ABORT:return(0,import_jsx_runtime160.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime160.jsx)(InterruptedByUser,{})});default:if(startsWithApiErrorPrefix(text3)){let truncated=!verbose&&text3.length>MAX_API_ERROR_CHARS;return(0,import_jsx_runtime160.jsx)(MessageResponse,{children:(0,import_jsx_runtime160.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime160.jsx)(ThemedText,{color:"error",children:text3===API_ERROR_MESSAGE_PREFIX?`${API_ERROR_MESSAGE_PREFIX}: Please wait a moment and try again.`:truncated?text3.slice(0,MAX_API_ERROR_CHARS)+"\u2026":text3}),truncated&&(0,import_jsx_runtime160.jsx)(CtrlOToExpand,{})]})})}return(0,import_jsx_runtime160.jsx)(ThemedBox_default,{alignItems:"flex-start",flexDirection:"row",justifyContent:"space-between",marginTop:addMargin?1:0,width:"100%",backgroundColor:isSelected?"messageActionsBackground":void 0,children:(0,import_jsx_runtime160.jsxs)(ThemedBox_default,{flexDirection:"row",children:[shouldShowDot&&(0,import_jsx_runtime160.jsx)(NoSelect,{fromLeftEdge:!0,minWidth:2,children:(0,import_jsx_runtime160.jsx)(ThemedText,{color:isSelected?"suggestion":"text",children:BLACK_CIRCLE})}),(0,import_jsx_runtime160.jsx)(ThemedBox_default,{flexDirection:"column",children:(0,import_jsx_runtime160.jsx)(Markdown,{children:text3})})]})})}}var import_react119,import_jsx_runtime160,MAX_API_ERROR_CHARS,init_AssistantTextMessage=__esm({"src/components/messages/AssistantTextMessage.tsx"(){import_react119=__toESM(require_react());init_compact2();init_rateLimitMessages();init_figures2();init_ink();init_errors8();init_messages4();init_contextWindowUpgradeCheck();init_model();init_macOsKeychainStorage();init_CtrlOToExpand();init_InterruptedByUser();init_Markdown();init_MessageResponse();init_messageActions();init_RateLimitMessage();init_product();import_jsx_runtime160=__toESM(require_jsx_runtime()),MAX_API_ERROR_CHARS=1e3;__name(InvalidApiKeyMessage,"InvalidApiKeyMessage");__name(AssistantTextMessage,"AssistantTextMessage")}});function AssistantThinkingMessage({param,addMargin=!1,isTranscriptMode,verbose,hideInTranscript=!1}){let thinking=param?.thinking||"";if(!thinking||hideInTranscript)return null;let shouldShowFullThinking=isTranscriptMode||verbose,label2="\u25C7 Thought",durationMs=param?.durationMs,tokenEstimate=thinking?Math.max(1,Math.floor(thinking.length/4)):0,durationLabel=durationMs?`Thought for ${(durationMs/1e3).toFixed(1)}s (${tokenEstimate} tokens)`:label2;if(!shouldShowFullThinking){let preview2="";if(thinking){let firstLine3=thinking.split(`
8122
8122
  `).find(l=>l.trim().length>0)?.trim().slice(0,100)||"";preview2=firstLine3?` \u2014 ${firstLine3}${firstLine3.length>=100?"\u2026":""}`:""}return(0,import_jsx_runtime161.jsx)(ThemedBox_default,{marginTop:addMargin?1:0,children:(0,import_jsx_runtime161.jsxs)(ThemedText,{dimColor:!0,italic:!0,children:[durationLabel,preview2," ",(0,import_jsx_runtime161.jsx)(CtrlOToExpand,{})]})})}return(0,import_jsx_runtime161.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,marginTop:addMargin?1:0,width:"100%",borderStyle:"round",paddingX:1,children:[(0,import_jsx_runtime161.jsxs)(ThemedText,{dimColor:!0,italic:!0,children:[durationLabel,"\u2026"]}),(0,import_jsx_runtime161.jsx)(ThemedBox_default,{paddingLeft:1,children:(0,import_jsx_runtime161.jsx)(Markdown,{dimColor:!0,children:thinking})}),(0,import_jsx_runtime161.jsx)(ThemedText,{dimColor:!0,italic:!0,children:"(Ctrl+O to collapse / toggle transcript)"})]})}var import_jsx_runtime161,init_AssistantThinkingMessage=__esm({"src/components/messages/AssistantThinkingMessage.tsx"(){init_ink();init_CtrlOToExpand();init_Markdown();import_jsx_runtime161=__toESM(require_jsx_runtime());__name(AssistantThinkingMessage,"AssistantThinkingMessage")}});function useIsClassifierChecking(toolUseID){return(0,import_react120.useSyncExternalStore)(subscribeClassifierChecking,()=>isClassifierChecking(toolUseID))}var import_react120,init_classifierApprovalsHook=__esm({"src/utils/classifierApprovalsHook.ts"(){import_react120=__toESM(require_react());init_classifierApprovals();__name(useIsClassifierChecking,"useIsClassifierChecking")}});var React69,SentryErrorBoundary,init_SentryErrorBoundary=__esm({"src/components/SentryErrorBoundary.ts"(){React69=__toESM(require_react()),SentryErrorBoundary=class extends React69.Component{static{__name(this,"SentryErrorBoundary")}constructor(props){super(props),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}render(){return this.state.hasError?null:this.props.children}}}});function HookProgressMessage({hookEvent,lookups,toolUseID,isTranscriptMode}){let inProgressHookCount=lookups.inProgressHookCounts.get(toolUseID)?.get(hookEvent)??0,resolvedHookCount=lookups.resolvedHookCounts.get(toolUseID)?.get(hookEvent)??0;return inProgressHookCount===0?null:hookEvent==="PreToolUse"||hookEvent==="PostToolUse"?isTranscriptMode?(0,import_jsx_runtime162.jsx)(MessageResponse,{children:(0,import_jsx_runtime162.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime162.jsxs)(ThemedText,{dimColor:!0,children:[inProgressHookCount," "]}),(0,import_jsx_runtime162.jsx)(ThemedText,{dimColor:!0,bold:!0,children:hookEvent}),(0,import_jsx_runtime162.jsxs)(ThemedText,{dimColor:!0,children:[inProgressHookCount===1?" hook":" hooks"," ran"]})]})}):null:resolvedHookCount===inProgressHookCount?null:(0,import_jsx_runtime162.jsx)(MessageResponse,{children:(0,import_jsx_runtime162.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime162.jsx)(ThemedText,{dimColor:!0,children:"Running "}),(0,import_jsx_runtime162.jsx)(ThemedText,{dimColor:!0,bold:!0,children:hookEvent}),(0,import_jsx_runtime162.jsx)(ThemedText,{dimColor:!0,children:inProgressHookCount===1?" hook\u2026":" hooks\u2026"})]})})}var import_jsx_runtime162,init_HookProgressMessage=__esm({"src/components/messages/HookProgressMessage.tsx"(){init_ink();init_MessageResponse();import_jsx_runtime162=__toESM(require_jsx_runtime());__name(HookProgressMessage,"HookProgressMessage")}});function AssistantToolUseMessage({param,addMargin,tools,commands,verbose,inProgressToolUseIDs,progressMessagesForMessage,shouldAnimate,shouldShowDot,inProgressToolCallCount,lookups,isTranscriptMode}){let terminalSize=useTerminalSize(),[theme2]=useTheme(),bg=useSelectedMessageBg(),pendingWorkerRequest=useAppStateMaybeOutsideOfProvider(state5=>state5.pendingWorkerRequest),isClassifierCheckingRaw=useIsClassifierChecking(param.id),permissionMode=useAppStateMaybeOutsideOfProvider(state5=>state5.toolPermissionContext.mode),hasStrippedRules=useAppStateMaybeOutsideOfProvider(state5=>!!state5.toolPermissionContext.strippedDangerousRules),isAutoClassifier=permissionMode==="auto"||permissionMode==="plan"&&hasStrippedRules,isClassifierChecking2=!1,toolFeedbackRenderMode=resolveToolFeedbackRenderMode(verbose),parsed=(0,import_react121.useMemo)(()=>{if(!tools)return null;let tool2=findToolByName(tools,param.name);if(!tool2)return null;let input3=tool2.inputSchema.safeParse(param.input),data=input3.success?input3.data:void 0;return{tool:tool2,input:input3,userFacingToolName:tool2.userFacingName(data),userFacingToolNameBackgroundColor:tool2.userFacingNameBackgroundColor?.(data),isTransparentWrapper:tool2.isTransparentWrapper?.()??!1}},[tools,param]);if(!parsed)return logError2(new Error(tools?`Tool ${param.name} not found`:`Tools array is undefined for tool ${param.name}`)),null;let{tool,input:input2,userFacingToolName,userFacingToolNameBackgroundColor,isTransparentWrapper}=parsed,isResolved=lookups.resolvedToolUseIDs.has(param.id),isQueued=!inProgressToolUseIDs.has(param.id)&&!isResolved,isWaitingForPermission=pendingWorkerRequest?.toolUseId===param.id;if(isTransparentWrapper)return isQueued||isResolved?null:(0,import_jsx_runtime163.jsx)(ThemedBox_default,{flexDirection:"column",width:"100%",backgroundColor:bg,children:renderToolUseProgressMessage9(tool,tools,lookups,param.id,progressMessagesForMessage,{verbose:toolFeedbackRenderMode.verbose,inProgressToolCallCount,isTranscriptMode},terminalSize)});if(userFacingToolName==="")return null;let renderedToolUseMessage=input2.success?renderToolUseMessage34(tool,input2.data,{theme:theme2,verbose:toolFeedbackRenderMode.verbose,commands}):null;return renderedToolUseMessage===null?null:(0,import_jsx_runtime163.jsx)(ThemedBox_default,{flexDirection:"row",justifyContent:"space-between",marginTop:addMargin?1:0,width:"100%",backgroundColor:bg,children:(0,import_jsx_runtime163.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime163.jsxs)(ThemedBox_default,{flexDirection:"row",flexWrap:"nowrap",minWidth:stringWidth(userFacingToolName)+(shouldShowDot?2:0),children:[shouldShowDot&&(isQueued?(0,import_jsx_runtime163.jsx)(ThemedBox_default,{minWidth:2,children:(0,import_jsx_runtime163.jsx)(ThemedText,{dimColor:isQueued,children:BLACK_CIRCLE})}):(0,import_jsx_runtime163.jsx)(ToolUseLoader,{shouldAnimate,isUnresolved:!isResolved,isError:lookups.erroredToolUseIDs.has(param.id)})),(0,import_jsx_runtime163.jsx)(ThemedBox_default,{flexShrink:0,children:(0,import_jsx_runtime163.jsx)(ThemedText,{bold:!0,wrap:"truncate-end",backgroundColor:userFacingToolNameBackgroundColor,color:userFacingToolNameBackgroundColor?"inverseText":void 0,children:userFacingToolName})}),renderedToolUseMessage!==""&&(0,import_jsx_runtime163.jsx)(ThemedBox_default,{flexWrap:"nowrap",children:(0,import_jsx_runtime163.jsxs)(ThemedText,{children:["(",renderedToolUseMessage,")"]})}),input2.success&&tool.renderToolUseTag&&tool.renderToolUseTag(input2.data)]}),!isResolved&&!isQueued&&(isClassifierChecking2?(0,import_jsx_runtime163.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime163.jsx)(ThemedText,{dimColor:!0,children:isAutoClassifier?"Auto classifier checking\u2026":"Bash classifier checking\u2026"})}):isWaitingForPermission?(0,import_jsx_runtime163.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime163.jsx)(ThemedText,{dimColor:!0,children:"Waiting for permission\u2026"})}):renderToolUseProgressMessage9(tool,tools,lookups,param.id,progressMessagesForMessage,{verbose:toolFeedbackRenderMode.verbose,inProgressToolCallCount,isTranscriptMode},terminalSize)),!isResolved&&isQueued&&renderToolUseQueuedMessage4(tool)]})})}function renderToolUseMessage34(tool,input2,{theme:theme2,verbose,commands}){try{let parsed=tool.inputSchema.safeParse(input2);return parsed.success?tool.renderToolUseMessage(parsed.data,{theme:theme2,verbose,commands}):""}catch(error40){return logError2(new Error(`Error rendering tool use message for ${tool.name}: ${error40}`)),""}}function renderToolUseProgressMessage9(tool,tools,lookups,toolUseID,progressMessagesForMessage,{verbose,inProgressToolCallCount,isTranscriptMode},terminalSize){let toolProgressMessages=progressMessagesForMessage.filter(msg=>msg.data.type!=="hook_progress");try{let toolMessages=tool.renderToolUseProgressMessage?.(toolProgressMessages,{tools,verbose,terminalSize,inProgressToolCallCount:inProgressToolCallCount??1,isTranscriptMode})??null;return(0,import_jsx_runtime163.jsxs)(import_jsx_runtime163.Fragment,{children:[(0,import_jsx_runtime163.jsx)(SentryErrorBoundary,{children:(0,import_jsx_runtime163.jsx)(HookProgressMessage,{hookEvent:"PreToolUse",lookups,toolUseID,verbose,isTranscriptMode})}),toolMessages]})}catch(error40){return logError2(new Error(`Error rendering tool use progress message for ${tool.name}: ${error40}`)),null}}function renderToolUseQueuedMessage4(tool){try{return tool.renderToolUseQueuedMessage?.()}catch(error40){return logError2(new Error(`Error rendering tool use queued message for ${tool.name}: ${error40}`)),null}}var import_react121,import_jsx_runtime163,init_AssistantToolUseMessage=__esm({"src/components/messages/AssistantToolUseMessage.tsx"(){import_react121=__toESM(require_react());init_useTerminalSize();init_figures2();init_stringWidth2();init_ink();init_AppState();init_Tool();init_classifierApprovalsHook();init_log3();init_MessageResponse();init_messageActions();init_SentryErrorBoundary();init_ToolUseLoader();init_feedbackPresentation();init_HookProgressMessage();import_jsx_runtime163=__toESM(require_jsx_runtime());__name(AssistantToolUseMessage,"AssistantToolUseMessage");__name(renderToolUseMessage34,"renderToolUseMessage");__name(renderToolUseProgressMessage9,"renderToolUseProgressMessage");__name(renderToolUseQueuedMessage4,"renderToolUseQueuedMessage")}});function getStatusColor(status2){switch(status2){case"completed":return"success";case"failed":return"error";case"killed":return"warning";default:return"text"}}function UserAgentNotificationMessage({addMargin,param:{text:text3}}){let summary=extractTag(text3,"summary");if(!summary)return null;let status2=extractTag(text3,"status"),color3=getStatusColor(status2);return(0,import_jsx_runtime164.jsx)(ThemedBox_default,{marginTop:addMargin?1:0,children:(0,import_jsx_runtime164.jsxs)(ThemedText,{children:[(0,import_jsx_runtime164.jsx)(ThemedText,{color:color3,children:BLACK_CIRCLE})," ",summary]})})}var import_jsx_runtime164,init_UserAgentNotificationMessage=__esm({"src/components/messages/UserAgentNotificationMessage.tsx"(){init_figures2();init_ink();init_messages4();import_jsx_runtime164=__toESM(require_jsx_runtime());__name(getStatusColor,"getStatusColor");__name(UserAgentNotificationMessage,"UserAgentNotificationMessage")}});function UserBashInputMessage({param:{text:text3},addMargin}){let input2=extractTag(text3,"bash-input");return input2?(0,import_jsx_runtime165.jsxs)(ThemedBox_default,{flexDirection:"row",marginTop:addMargin?1:0,backgroundColor:"bashMessageBackgroundColor",paddingRight:1,children:[(0,import_jsx_runtime165.jsx)(ThemedText,{color:"bashBorder",children:"! "}),(0,import_jsx_runtime165.jsx)(ThemedText,{bold:!0,color:"text",children:input2})]}):null}var import_jsx_runtime165,init_UserBashInputMessage=__esm({"src/components/messages/UserBashInputMessage.tsx"(){init_ink();init_messages4();import_jsx_runtime165=__toESM(require_jsx_runtime());__name(UserBashInputMessage,"UserBashInputMessage")}});function UserBashOutputMessage({content,verbose}){let rawStdout=extractTag(content,"bash-stdout")??"",stdout=extractTag(rawStdout,"persisted-output")??rawStdout,stderr=extractTag(content,"bash-stderr")??"";return(0,import_jsx_runtime166.jsx)(BashToolResultMessage,{content:{stdout,stderr},verbose:!!verbose})}var import_jsx_runtime166,init_UserBashOutputMessage=__esm({"src/components/messages/UserBashOutputMessage.tsx"(){init_BashToolResultMessage();init_messages4();import_jsx_runtime166=__toESM(require_jsx_runtime());__name(UserBashOutputMessage,"UserBashOutputMessage")}});function UserCommandMessage({addMargin,param:{text:text3}}){let commandMessage=extractTag(text3,COMMAND_MESSAGE_TAG),args=extractTag(text3,"command-args"),isSkillFormat=extractTag(text3,"skill-format")==="true";if(!commandMessage)return null;if(isSkillFormat)return(0,import_jsx_runtime167.jsx)(ThemedBox_default,{flexDirection:"column",marginTop:addMargin?1:0,backgroundColor:"userMessageBackground",paddingRight:1,children:(0,import_jsx_runtime167.jsxs)(ThemedText,{children:[(0,import_jsx_runtime167.jsxs)(ThemedText,{color:"subtle",children:[figures_default.pointer," "]}),(0,import_jsx_runtime167.jsxs)(ThemedText,{color:"text",children:["Skill(",commandMessage,")"]})]})});let content=`/${[commandMessage,args].filter(Boolean).join(" ")}`;return(0,import_jsx_runtime167.jsx)(ThemedBox_default,{flexDirection:"column",marginTop:addMargin?1:0,backgroundColor:"userMessageBackground",paddingRight:1,children:(0,import_jsx_runtime167.jsxs)(ThemedText,{children:[(0,import_jsx_runtime167.jsxs)(ThemedText,{color:"subtle",children:[figures_default.pointer," "]}),(0,import_jsx_runtime167.jsx)(ThemedText,{color:"text",children:content})]})})}var import_jsx_runtime167,init_UserCommandMessage=__esm({"src/components/messages/UserCommandMessage.tsx"(){init_figures();init_xml();init_ink();init_messages4();import_jsx_runtime167=__toESM(require_jsx_runtime());__name(UserCommandMessage,"UserCommandMessage")}});function UserLocalCommandOutputMessage({content}){let stdout=extractTag(content,"local-command-stdout"),stderr=extractTag(content,"local-command-stderr");if(!stdout&&!stderr)return(0,import_jsx_runtime168.jsx)(MessageResponse,{children:(0,import_jsx_runtime168.jsx)(ThemedText,{dimColor:!0,children:NO_CONTENT_MESSAGE})});let lines=[];return stdout?.trim()&&lines.push((0,import_jsx_runtime168.jsx)(IndentedContent,{children:stdout.trim()},"stdout")),stderr?.trim()&&lines.push((0,import_jsx_runtime168.jsx)(IndentedContent,{children:stderr.trim()},"stderr")),lines}function IndentedContent({children}){return children.startsWith(`${DIAMOND_OPEN} `)||children.startsWith(`${DIAMOND_FILLED} `)?(0,import_jsx_runtime168.jsx)(CloudLaunchContent,{children}):(0,import_jsx_runtime168.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime168.jsx)(ThemedText,{dimColor:!0,children:" \u23BF "}),(0,import_jsx_runtime168.jsx)(ThemedBox_default,{flexDirection:"column",flexGrow:1,children:(0,import_jsx_runtime168.jsx)(Markdown,{children})})]})}function CloudLaunchContent({children}){let diamond=children[0],nl=children.indexOf(`
8123
8123
  `),header=nl===-1?children.slice(2):children.slice(2,nl),rest2=nl===-1?"":children.slice(nl+1).trim(),sep38=header.indexOf(" \xB7 "),label2=sep38===-1?header:header.slice(0,sep38),suffix=sep38===-1?"":header.slice(sep38);return(0,import_jsx_runtime168.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime168.jsxs)(ThemedText,{children:[(0,import_jsx_runtime168.jsxs)(ThemedText,{color:"background",children:[diamond," "]}),(0,import_jsx_runtime168.jsx)(ThemedText,{bold:!0,children:label2}),suffix&&(0,import_jsx_runtime168.jsx)(ThemedText,{dimColor:!0,children:suffix})]}),rest2&&(0,import_jsx_runtime168.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime168.jsx)(ThemedText,{dimColor:!0,children:" \u23BF "}),(0,import_jsx_runtime168.jsx)(ThemedText,{dimColor:!0,children:rest2})]})]})}var import_jsx_runtime168,init_UserLocalCommandOutputMessage=__esm({"src/components/messages/UserLocalCommandOutputMessage.tsx"(){init_figures2();init_messages3();init_ink();init_messages4();init_Markdown();init_MessageResponse();import_jsx_runtime168=__toESM(require_jsx_runtime());__name(UserLocalCommandOutputMessage,"UserLocalCommandOutputMessage");__name(IndentedContent,"IndentedContent");__name(CloudLaunchContent,"CloudLaunchContent")}});function getSavingMessage(){return sample_default(["Got it.","Good to know.","Noted."])}function UserMemoryInputMessage({text:text3,addMargin}){let input2=extractTag(text3,"user-memory-input"),savingText=(0,import_react122.useMemo)(()=>getSavingMessage(),[]);return input2?(0,import_jsx_runtime169.jsxs)(ThemedBox_default,{flexDirection:"column",marginTop:addMargin?1:0,width:"100%",children:[(0,import_jsx_runtime169.jsxs)(ThemedBox_default,{children:[(0,import_jsx_runtime169.jsx)(ThemedText,{color:"remember",backgroundColor:"memoryBackgroundColor",children:"#"}),(0,import_jsx_runtime169.jsxs)(ThemedText,{backgroundColor:"memoryBackgroundColor",color:"text",children:[" ",input2," "]})]}),(0,import_jsx_runtime169.jsx)(MessageResponse,{height:1,children:(0,import_jsx_runtime169.jsx)(ThemedText,{dimColor:!0,children:savingText})})]}):null}var import_react122,import_jsx_runtime169,init_UserMemoryInputMessage=__esm({"src/components/messages/UserMemoryInputMessage.tsx"(){init_sample();import_react122=__toESM(require_react());init_ink();init_messages4();init_MessageResponse();import_jsx_runtime169=__toESM(require_jsx_runtime());__name(getSavingMessage,"getSavingMessage");__name(UserMemoryInputMessage,"UserMemoryInputMessage")}});function countPlanSteps(plan2){if(!plan2)return 0;let lines=plan2.split(/\r?\n/),numbered=lines.filter(line=>/^\s{0,3}\d+\.\s+\S/.test(line)).length,bullets=lines.filter(line=>/^\s{0,3}[-*]\s+\S/.test(line)).length,headings=lines.filter(line=>/^#{1,6}\s+\S/.test(line)).length;return Math.max(numbered,bullets,headings)}function UserPlanMessage({addMargin,planContent}){let isZh7=resolveUiLocale()==="zh-CN",stepCount=countPlanSteps(planContent),heading2=isZh7?"\u6267\u884C\u8BA1\u5212":"Plan to implement",subheading=isZh7?stepCount>0?`\u5171 ${stepCount} \u6B65 \xB7 \u5F85\u4F60\u6279\u51C6\u540E\u5F00\u59CB`:"\u5F85\u4F60\u6279\u51C6\u540E\u5F00\u59CB":stepCount>0?`${stepCount} step${stepCount===1?"":"s"} \xB7 awaiting your approval`:"awaiting your approval";return(0,import_jsx_runtime170.jsxs)(ThemedBox_default,{flexDirection:"column",borderStyle:"round",borderColor:"planMode",marginTop:addMargin?1:0,paddingX:1,children:[(0,import_jsx_runtime170.jsxs)(ThemedBox_default,{marginBottom:1,flexDirection:"column",children:[(0,import_jsx_runtime170.jsxs)(ThemedText,{bold:!0,color:"planMode",children:["\u25B8 ",heading2]}),(0,import_jsx_runtime170.jsx)(ThemedText,{dimColor:!0,children:subheading})]}),(0,import_jsx_runtime170.jsx)(Markdown,{children:planContent})]})}var import_jsx_runtime170,init_UserPlanMessage=__esm({"src/components/messages/UserPlanMessage.tsx"(){init_ink();init_uiLocale();init_Markdown();import_jsx_runtime170=__toESM(require_jsx_runtime());__name(countPlanSteps,"countPlanSteps");__name(UserPlanMessage,"UserPlanMessage")}});function useQueuedMessage(){return React71.useContext(QueuedMessageContext)}var React71,import_jsx_runtime171,QueuedMessageContext,init_QueuedMessageContext=__esm({"src/context/QueuedMessageContext.tsx"(){React71=__toESM(require_react());init_ink();import_jsx_runtime171=__toESM(require_jsx_runtime()),QueuedMessageContext=React71.createContext(void 0);__name(useQueuedMessage,"useQueuedMessage")}});function formatBriefTimestamp(isoString,now3=new Date){let d=new Date(isoString);if(Number.isNaN(d.getTime()))return"";let locale=getLocale(),dayDiff=startOfDay(now3)-startOfDay(d),daysAgo=Math.round(dayDiff/864e5);return daysAgo===0?d.toLocaleTimeString(locale,{hour:"numeric",minute:"2-digit"}):daysAgo>0&&daysAgo<7?d.toLocaleString(locale,{weekday:"long",hour:"numeric",minute:"2-digit"}):d.toLocaleString(locale,{weekday:"long",month:"short",day:"numeric",hour:"numeric",minute:"2-digit"})}function getLocale(){let raw=process.env.LC_ALL||process.env.LC_TIME||process.env.LANG||"";if(!raw||raw==="C"||raw==="POSIX")return;let base=raw.split(".")[0].split("@")[0];if(!base)return;let tag2=base.replaceAll("_","-");try{return new Intl.DateTimeFormat(tag2),tag2}catch{return}}function startOfDay(d){return new Date(d.getFullYear(),d.getMonth(),d.getDate()).getTime()}var init_formatBriefTimestamp=__esm({"src/utils/formatBriefTimestamp.ts"(){__name(formatBriefTimestamp,"formatBriefTimestamp");__name(getLocale,"getLocale");__name(startOfDay,"startOfDay")}});function HighlightedThinkingText({text:text3,useBriefLayout,timestamp}){let isQueued=useQueuedMessage()?.isQueued??!1,pointerColor=(0,import_react123.useContext)(MessageActionsSelectedContext)?"suggestion":"subtle";if(useBriefLayout){let ts=timestamp?formatBriefTimestamp(timestamp):"";return(0,import_jsx_runtime172.jsxs)(ThemedBox_default,{flexDirection:"column",paddingLeft:2,children:[(0,import_jsx_runtime172.jsxs)(ThemedBox_default,{flexDirection:"row",children:[(0,import_jsx_runtime172.jsx)(ThemedText,{color:isQueued?"subtle":"briefLabelYou",children:"You"}),ts?(0,import_jsx_runtime172.jsxs)(ThemedText,{dimColor:!0,children:[" ",ts]}):null]}),(0,import_jsx_runtime172.jsx)(ThemedText,{color:isQueued?"subtle":"text",children:text3})]})}let triggers=isUltrathinkEnabled()?findThinkingTriggerPositions(text3):[];if(triggers.length===0)return(0,import_jsx_runtime172.jsxs)(ThemedText,{children:[(0,import_jsx_runtime172.jsxs)(ThemedText,{color:pointerColor,children:[figures_default.pointer," "]}),(0,import_jsx_runtime172.jsx)(ThemedText,{color:"text",children:text3})]});let parts=[],cursor=0;for(let t7 of triggers){t7.start>cursor&&parts.push((0,import_jsx_runtime172.jsx)(ThemedText,{color:"text",children:text3.slice(cursor,t7.start)},`plain-${cursor}`));for(let i3=t7.start;i3<t7.end;i3++)parts.push((0,import_jsx_runtime172.jsx)(ThemedText,{color:getRainbowColor(i3-t7.start),children:text3[i3]},`rb-${i3}`));cursor=t7.end}return cursor<text3.length&&parts.push((0,import_jsx_runtime172.jsx)(ThemedText,{color:"text",children:text3.slice(cursor)},`plain-${cursor}`)),(0,import_jsx_runtime172.jsxs)(ThemedText,{children:[(0,import_jsx_runtime172.jsxs)(ThemedText,{color:pointerColor,children:[figures_default.pointer," "]}),parts]})}var import_react123,import_jsx_runtime172,init_HighlightedThinkingText=__esm({"src/components/messages/HighlightedThinkingText.tsx"(){init_figures();import_react123=__toESM(require_react());init_QueuedMessageContext();init_ink();init_formatBriefTimestamp();init_thinking();init_messageActions();import_jsx_runtime172=__toESM(require_jsx_runtime());__name(HighlightedThinkingText,"HighlightedThinkingText")}});function UserPromptMessage({addMargin,param:{text:text3},isTranscriptMode,timestamp}){let{blocks:displayControlBlocks,remainder:promptText}=(0,import_react124.useMemo)(()=>parseLeadingDisplayControlBlocks(text3),[text3]),visibleDisplayControlBlocks=(0,import_react124.useMemo)(()=>displayControlBlocks.filter(isDisplayControlBlockVisible),[displayControlBlocks]),displayText=(0,import_react124.useMemo)(()=>{if(promptText.length<=MAX_DISPLAY_CHARS)return promptText;let head2=promptText.slice(0,TRUNCATE_HEAD_CHARS),tail2=promptText.slice(-TRUNCATE_TAIL_CHARS),hiddenLines=countCharInString(promptText,`
8124
8124
  `,TRUNCATE_HEAD_CHARS)-countCharInString(tail2,`
@@ -9922,7 +9922,7 @@ ${horizonText}`,maxTokens:8192},atAGlanceResult=await generateSectionInsight(atA
9922
9922
  </div>
9923
9923
  <script>${js}</script>
9924
9924
  </body>
9925
- </html>`}function buildExportData(data,insights,facets,remoteStats){let version3=typeof MACRO<"u"?"13.9.1":"unknown",remote_hosts_collected=remoteStats?.hosts.filter(h3=>h3.sessionCount>0).map(h3=>h3.name),facets_summary={total:facets.size,goal_categories:{},outcomes:{},satisfaction:{},friction:{}};for(let f3 of facets.values()){for(let[cat2,count4]of safeEntries(f3.goal_categories))count4>0&&(facets_summary.goal_categories[cat2]=(facets_summary.goal_categories[cat2]||0)+count4);facets_summary.outcomes[f3.outcome]=(facets_summary.outcomes[f3.outcome]||0)+1;for(let[level,count4]of safeEntries(f3.user_satisfaction_counts))count4>0&&(facets_summary.satisfaction[level]=(facets_summary.satisfaction[level]||0)+count4);for(let[type,count4]of safeEntries(f3.friction_counts))count4>0&&(facets_summary.friction[type]=(facets_summary.friction[type]||0)+count4)}return{metadata:{username:process.env.SAFEUSER||process.env.USER||"unknown",generated_at:new Date().toISOString(),claude_code_version:version3,date_range:data.date_range,session_count:data.total_sessions,...remote_hosts_collected&&remote_hosts_collected.length>0&&{remote_hosts_collected}},aggregated_data:data,insights,facets_summary}}async function scanAllSessions(){let projectsDir=getProjectsDir2(),dirents;try{dirents=await readdir39(projectsDir,{withFileTypes:!0})}catch{return[]}let projectDirs=dirents.filter(dirent=>dirent.isDirectory()).map(dirent=>join207(projectsDir,dirent.name)),allSessions=[];for(let i3=0;i3<projectDirs.length;i3++){let sessionFiles=await getSessionFilesWithMtime(projectDirs[i3]);for(let[sessionId,fileInfo]of sessionFiles)allSessions.push({sessionId,path:fileInfo.path,mtime:fileInfo.mtime,size:fileInfo.size});i3%10===9&&await new Promise(resolve67=>setImmediate(resolve67))}return allSessions.sort((a2,b3)=>b3.mtime-a2.mtime),allSessions}async function generateUsageReport(options){let remoteStats;if(process.env.USER_TYPE==="ant"&&options?.collectRemote){let destDir=join207(getClaudeConfigHomeDir(),"projects"),{hosts,totalCopied}=await collectAllRemoteHostData(destDir);remoteStats={hosts,totalCopied}}let allScannedSessions=await scanAllSessions(),totalSessionsScanned=allScannedSessions.length,META_BATCH_SIZE=50,MAX_SESSIONS_TO_LOAD=200,allMetas=[],uncachedSessions=[];for(let i3=0;i3<allScannedSessions.length;i3+=META_BATCH_SIZE){let batch2=allScannedSessions.slice(i3,i3+META_BATCH_SIZE),results=await Promise.all(batch2.map(async sessionInfo=>({sessionInfo,cached:await loadCachedSessionMeta(sessionInfo.sessionId)})));for(let{sessionInfo,cached:cached6}of results)cached6?allMetas.push(cached6):uncachedSessions.length<MAX_SESSIONS_TO_LOAD&&uncachedSessions.push(sessionInfo)}let logsForFacets=new Map,isMetaSession=__name(log4=>{for(let msg of log4.messages.slice(0,5))if(msg.type==="user"&&msg.message){let content=msg.message.content;if(typeof content=="string"&&(content.includes("RESPOND WITH ONLY A VALID JSON OBJECT")||content.includes("record_facets")))return!0}return!1},"isMetaSession"),LOAD_BATCH_SIZE=10;for(let i3=0;i3<uncachedSessions.length;i3+=LOAD_BATCH_SIZE){let batch2=uncachedSessions.slice(i3,i3+LOAD_BATCH_SIZE),batchResults=await Promise.all(batch2.map(async sessionInfo=>{try{return await loadAllLogsFromSessionFile(sessionInfo.path)}catch{return[]}})),metasToSave=[];for(let logs2 of batchResults)for(let log4 of logs2){if(isMetaSession(log4)||!hasValidDates(log4))continue;let meta=logToSessionMeta(log4);allMetas.push(meta),metasToSave.push(meta),logsForFacets.set(meta.session_id,log4)}await Promise.all(metasToSave.map(meta=>saveSessionMeta(meta)))}let bestBySession=new Map;for(let meta of allMetas){let existing=bestBySession.get(meta.session_id);(!existing||meta.user_message_count>existing.user_message_count||meta.user_message_count===existing.user_message_count&&meta.duration_minutes>existing.duration_minutes)&&bestBySession.set(meta.session_id,meta)}let keptSessionIds=new Set(bestBySession.keys());allMetas=[...bestBySession.values()];for(let sessionId of logsForFacets.keys())keptSessionIds.has(sessionId)||logsForFacets.delete(sessionId);allMetas.sort((a2,b3)=>b3.start_time.localeCompare(a2.start_time));let isSubstantiveSession=__name(meta=>!(meta.user_message_count<2||meta.duration_minutes<1),"isSubstantiveSession"),substantiveMetas=allMetas.filter(isSubstantiveSession),facets=new Map,toExtract=[],MAX_FACET_EXTRACTIONS=50,cachedFacetResults=await Promise.all(substantiveMetas.map(async meta=>({sessionId:meta.session_id,cached:await loadCachedFacets(meta.session_id)})));for(let{sessionId,cached:cached6}of cachedFacetResults)if(cached6)facets.set(sessionId,cached6);else{let log4=logsForFacets.get(sessionId);log4&&toExtract.length<MAX_FACET_EXTRACTIONS&&toExtract.push({log:log4,sessionId})}let CONCURRENCY2=50;for(let i3=0;i3<toExtract.length;i3+=CONCURRENCY2){let batch2=toExtract.slice(i3,i3+CONCURRENCY2),results=await Promise.all(batch2.map(async({log:log4,sessionId})=>{let newFacets=await extractFacetsFromAPI(log4,sessionId);return{sessionId,newFacets}})),facetsToSave=[];for(let{sessionId,newFacets}of results)newFacets&&(facets.set(sessionId,newFacets),facetsToSave.push(newFacets));await Promise.all(facetsToSave.map(f3=>saveFacets(f3)))}let isMinimalSession=__name(sessionId=>{let sessionFacets=facets.get(sessionId);if(!sessionFacets)return!1;let cats=sessionFacets.goal_categories,catKeys=safeKeys(cats).filter(k2=>(cats[k2]??0)>0);return catKeys.length===1&&catKeys[0]==="warmup_minimal"},"isMinimalSession"),substantiveSessions=substantiveMetas.filter(s2=>!isMinimalSession(s2.session_id)),substantiveFacets=new Map;for(let[sessionId,f3]of facets)isMinimalSession(sessionId)||substantiveFacets.set(sessionId,f3);let aggregated=aggregateData(substantiveSessions,substantiveFacets);aggregated.total_sessions_scanned=totalSessionsScanned;let insights=await generateParallelInsights(aggregated,facets),htmlReport=generateHtmlReport(aggregated,insights);try{await mkdir66(getDataDir(),{recursive:!0})}catch{}let htmlPath=join207(getDataDir(),"report.html");return await writeFile68(htmlPath,htmlReport,{encoding:"utf-8",mode:384}),{insights,htmlPath,data:aggregated,remoteStats,facets:substantiveFacets}}function safeEntries(obj){return obj?Object.entries(obj):[]}function safeKeys(obj){return obj?Object.keys(obj):[]}function createUsageReportCommand(){let commandMessages=getCommandMessages2();return{type:"prompt",name:"insights",description:commandMessages.insightsDescription,contentLength:0,progressMessage:commandMessages.insightsProgress,source:"builtin",async getPromptForCommand(args){let collectRemote=!1,remoteHosts=[],hasRemoteHosts=!1;process.env.USER_TYPE==="ant"&&(collectRemote=args?.includes("--homespaces")??!1,remoteHosts=await getRunningRemoteHosts(),hasRemoteHosts=remoteHosts.length>0,collectRemote&&hasRemoteHosts&&console.error(`Collecting sessions from ${remoteHosts.length} homespace(s): ${remoteHosts.join(", ")}...`));let{insights,htmlPath,data,remoteStats}=await generateUsageReport({collectRemote}),reportUrl=`file://${htmlPath}`,uploadHint="";if(process.env.USER_TYPE==="ant"){let timestamp=new Date().toISOString().replace(/[-:]/g,"").replace("T","_").slice(0,15),filename=`${process.env.SAFEUSER||process.env.USER||"unknown"}_insights_${timestamp}.html`,s3Path=`s3://anthropic-serve/atamkin/cc-user-reports/${filename}`,s3Url=`https://s3-frontend.infra.ant.dev/anthropic-serve/atamkin/cc-user-reports/${filename}`;reportUrl=s3Url;try{execFileSync3("ff",["cp",htmlPath,s3Path],{timeout:6e4,stdio:"pipe"})}catch{reportUrl=`file://${htmlPath}`,uploadHint=`
9925
+ </html>`}function buildExportData(data,insights,facets,remoteStats){let version3=typeof MACRO<"u"?"13.9.2":"unknown",remote_hosts_collected=remoteStats?.hosts.filter(h3=>h3.sessionCount>0).map(h3=>h3.name),facets_summary={total:facets.size,goal_categories:{},outcomes:{},satisfaction:{},friction:{}};for(let f3 of facets.values()){for(let[cat2,count4]of safeEntries(f3.goal_categories))count4>0&&(facets_summary.goal_categories[cat2]=(facets_summary.goal_categories[cat2]||0)+count4);facets_summary.outcomes[f3.outcome]=(facets_summary.outcomes[f3.outcome]||0)+1;for(let[level,count4]of safeEntries(f3.user_satisfaction_counts))count4>0&&(facets_summary.satisfaction[level]=(facets_summary.satisfaction[level]||0)+count4);for(let[type,count4]of safeEntries(f3.friction_counts))count4>0&&(facets_summary.friction[type]=(facets_summary.friction[type]||0)+count4)}return{metadata:{username:process.env.SAFEUSER||process.env.USER||"unknown",generated_at:new Date().toISOString(),claude_code_version:version3,date_range:data.date_range,session_count:data.total_sessions,...remote_hosts_collected&&remote_hosts_collected.length>0&&{remote_hosts_collected}},aggregated_data:data,insights,facets_summary}}async function scanAllSessions(){let projectsDir=getProjectsDir2(),dirents;try{dirents=await readdir39(projectsDir,{withFileTypes:!0})}catch{return[]}let projectDirs=dirents.filter(dirent=>dirent.isDirectory()).map(dirent=>join207(projectsDir,dirent.name)),allSessions=[];for(let i3=0;i3<projectDirs.length;i3++){let sessionFiles=await getSessionFilesWithMtime(projectDirs[i3]);for(let[sessionId,fileInfo]of sessionFiles)allSessions.push({sessionId,path:fileInfo.path,mtime:fileInfo.mtime,size:fileInfo.size});i3%10===9&&await new Promise(resolve67=>setImmediate(resolve67))}return allSessions.sort((a2,b3)=>b3.mtime-a2.mtime),allSessions}async function generateUsageReport(options){let remoteStats;if(process.env.USER_TYPE==="ant"&&options?.collectRemote){let destDir=join207(getClaudeConfigHomeDir(),"projects"),{hosts,totalCopied}=await collectAllRemoteHostData(destDir);remoteStats={hosts,totalCopied}}let allScannedSessions=await scanAllSessions(),totalSessionsScanned=allScannedSessions.length,META_BATCH_SIZE=50,MAX_SESSIONS_TO_LOAD=200,allMetas=[],uncachedSessions=[];for(let i3=0;i3<allScannedSessions.length;i3+=META_BATCH_SIZE){let batch2=allScannedSessions.slice(i3,i3+META_BATCH_SIZE),results=await Promise.all(batch2.map(async sessionInfo=>({sessionInfo,cached:await loadCachedSessionMeta(sessionInfo.sessionId)})));for(let{sessionInfo,cached:cached6}of results)cached6?allMetas.push(cached6):uncachedSessions.length<MAX_SESSIONS_TO_LOAD&&uncachedSessions.push(sessionInfo)}let logsForFacets=new Map,isMetaSession=__name(log4=>{for(let msg of log4.messages.slice(0,5))if(msg.type==="user"&&msg.message){let content=msg.message.content;if(typeof content=="string"&&(content.includes("RESPOND WITH ONLY A VALID JSON OBJECT")||content.includes("record_facets")))return!0}return!1},"isMetaSession"),LOAD_BATCH_SIZE=10;for(let i3=0;i3<uncachedSessions.length;i3+=LOAD_BATCH_SIZE){let batch2=uncachedSessions.slice(i3,i3+LOAD_BATCH_SIZE),batchResults=await Promise.all(batch2.map(async sessionInfo=>{try{return await loadAllLogsFromSessionFile(sessionInfo.path)}catch{return[]}})),metasToSave=[];for(let logs2 of batchResults)for(let log4 of logs2){if(isMetaSession(log4)||!hasValidDates(log4))continue;let meta=logToSessionMeta(log4);allMetas.push(meta),metasToSave.push(meta),logsForFacets.set(meta.session_id,log4)}await Promise.all(metasToSave.map(meta=>saveSessionMeta(meta)))}let bestBySession=new Map;for(let meta of allMetas){let existing=bestBySession.get(meta.session_id);(!existing||meta.user_message_count>existing.user_message_count||meta.user_message_count===existing.user_message_count&&meta.duration_minutes>existing.duration_minutes)&&bestBySession.set(meta.session_id,meta)}let keptSessionIds=new Set(bestBySession.keys());allMetas=[...bestBySession.values()];for(let sessionId of logsForFacets.keys())keptSessionIds.has(sessionId)||logsForFacets.delete(sessionId);allMetas.sort((a2,b3)=>b3.start_time.localeCompare(a2.start_time));let isSubstantiveSession=__name(meta=>!(meta.user_message_count<2||meta.duration_minutes<1),"isSubstantiveSession"),substantiveMetas=allMetas.filter(isSubstantiveSession),facets=new Map,toExtract=[],MAX_FACET_EXTRACTIONS=50,cachedFacetResults=await Promise.all(substantiveMetas.map(async meta=>({sessionId:meta.session_id,cached:await loadCachedFacets(meta.session_id)})));for(let{sessionId,cached:cached6}of cachedFacetResults)if(cached6)facets.set(sessionId,cached6);else{let log4=logsForFacets.get(sessionId);log4&&toExtract.length<MAX_FACET_EXTRACTIONS&&toExtract.push({log:log4,sessionId})}let CONCURRENCY2=50;for(let i3=0;i3<toExtract.length;i3+=CONCURRENCY2){let batch2=toExtract.slice(i3,i3+CONCURRENCY2),results=await Promise.all(batch2.map(async({log:log4,sessionId})=>{let newFacets=await extractFacetsFromAPI(log4,sessionId);return{sessionId,newFacets}})),facetsToSave=[];for(let{sessionId,newFacets}of results)newFacets&&(facets.set(sessionId,newFacets),facetsToSave.push(newFacets));await Promise.all(facetsToSave.map(f3=>saveFacets(f3)))}let isMinimalSession=__name(sessionId=>{let sessionFacets=facets.get(sessionId);if(!sessionFacets)return!1;let cats=sessionFacets.goal_categories,catKeys=safeKeys(cats).filter(k2=>(cats[k2]??0)>0);return catKeys.length===1&&catKeys[0]==="warmup_minimal"},"isMinimalSession"),substantiveSessions=substantiveMetas.filter(s2=>!isMinimalSession(s2.session_id)),substantiveFacets=new Map;for(let[sessionId,f3]of facets)isMinimalSession(sessionId)||substantiveFacets.set(sessionId,f3);let aggregated=aggregateData(substantiveSessions,substantiveFacets);aggregated.total_sessions_scanned=totalSessionsScanned;let insights=await generateParallelInsights(aggregated,facets),htmlReport=generateHtmlReport(aggregated,insights);try{await mkdir66(getDataDir(),{recursive:!0})}catch{}let htmlPath=join207(getDataDir(),"report.html");return await writeFile68(htmlPath,htmlReport,{encoding:"utf-8",mode:384}),{insights,htmlPath,data:aggregated,remoteStats,facets:substantiveFacets}}function safeEntries(obj){return obj?Object.entries(obj):[]}function safeKeys(obj){return obj?Object.keys(obj):[]}function createUsageReportCommand(){let commandMessages=getCommandMessages2();return{type:"prompt",name:"insights",description:commandMessages.insightsDescription,contentLength:0,progressMessage:commandMessages.insightsProgress,source:"builtin",async getPromptForCommand(args){let collectRemote=!1,remoteHosts=[],hasRemoteHosts=!1;process.env.USER_TYPE==="ant"&&(collectRemote=args?.includes("--homespaces")??!1,remoteHosts=await getRunningRemoteHosts(),hasRemoteHosts=remoteHosts.length>0,collectRemote&&hasRemoteHosts&&console.error(`Collecting sessions from ${remoteHosts.length} homespace(s): ${remoteHosts.join(", ")}...`));let{insights,htmlPath,data,remoteStats}=await generateUsageReport({collectRemote}),reportUrl=`file://${htmlPath}`,uploadHint="";if(process.env.USER_TYPE==="ant"){let timestamp=new Date().toISOString().replace(/[-:]/g,"").replace("T","_").slice(0,15),filename=`${process.env.SAFEUSER||process.env.USER||"unknown"}_insights_${timestamp}.html`,s3Path=`s3://anthropic-serve/atamkin/cc-user-reports/${filename}`,s3Url=`https://s3-frontend.infra.ant.dev/anthropic-serve/atamkin/cc-user-reports/${filename}`;reportUrl=s3Url;try{execFileSync3("ff",["cp",htmlPath,s3Path],{timeout:6e4,stdio:"pipe"})}catch{reportUrl=`file://${htmlPath}`,uploadHint=`
9926
9926
  Automatic upload failed. Are you on the boron namespace? Try \`use-bo\` and ensure you've run \`sso\`.
9927
9927
  To share, run: ff cp ${htmlPath} ${s3Path}
9928
9928
  Then access at: ${s3Url}`}}let stats3=[data.total_sessions_scanned&&data.total_sessions_scanned>data.total_sessions?`${data.total_sessions_scanned.toLocaleString()} sessions total \xB7 ${data.total_sessions} analyzed`:`${data.total_sessions} sessions`,`${data.total_messages.toLocaleString()} messages`,`${Math.round(data.total_duration_hours)}h`,`${data.git_commits} commits`].join(" \xB7 "),remoteInfo="";if(process.env.USER_TYPE==="ant")if(remoteStats&&remoteStats.totalCopied>0){let hsNames=remoteStats.hosts.filter(h3=>h3.sessionCount>0).map(h3=>h3.name).join(", ");remoteInfo=`
@@ -10114,7 +10114,7 @@ Find something genuinely interesting or amusing from the session summaries.`,max
10114
10114
  `).join("");await writeFile69(agentFile,agentContent,{encoding:"utf8",mode:384})}logForDebugging(`Hydrated ${subagentEvents.length} subagent entries across ${byAgent.size} agents`)}}return logForDiagnosticsNoPII("info","hydrate_ccr_v2_completed",{duration_ms:Date.now()-startMs,event_count:events3.length,subagent_event_count:subagentEventCount}),events3.length>0}catch(error40){if(error40 instanceof Error&&error40.message==="CCRClient: Epoch mismatch (409)")throw error40;return logForDebugging(`Error hydrating session from CCR v2: ${error40}`),logForDiagnosticsNoPII("error","hydrate_ccr_v2_fail"),!1}}function extractFirstPrompt2(transcript){let textContent=getFirstMeaningfulUserMessageTextContent(transcript);if(textContent){let result2=textContent.replace(/\n/g," ").trim();return result2.length>200&&(result2=result2.slice(0,200).trim()+"\u2026"),result2}return"No prompt"}function getFirstMeaningfulUserMessageTextContent(transcript){for(let msg of transcript){if(msg.type!=="user"||msg.isMeta||"isCompactSummary"in msg&&msg.isCompactSummary)continue;let content=msg.message?.content;if(!content)continue;let texts=[];if(typeof content=="string")texts.push(content);else if(Array.isArray(content))for(let block2 of content)block2.type==="text"&&block2.text&&texts.push(block2.text);for(let textContent of texts){if(!textContent)continue;let commandNameTag=extractTag(textContent,COMMAND_NAME_TAG);if(commandNameTag){let commandName=commandNameTag.replace(/^\//,"");if(builtInCommandNames().has(commandName))continue;{let commandArgs=extractTag(textContent,"command-args")?.trim();if(!commandArgs)continue;return`${commandNameTag} ${commandArgs}`}}let bashInput=extractTag(textContent,"bash-input");if(bashInput)return`! ${bashInput}`;if(!SKIP_FIRST_PROMPT_PATTERN2.test(textContent))return textContent}}}function removeExtraFields(transcript){return transcript.map(m3=>{let{isSidechain,parentUuid,...serializedMessage}=m3;return serializedMessage})}function applyPreservedSegmentRelinks(messages){let lastSeg,lastSegBoundaryIdx=-1,absoluteLastBoundaryIdx=-1,entryIndex=new Map,i3=0;for(let entry of messages.values()){if(entryIndex.set(entry.uuid,i3),isCompactBoundaryMessage(entry)){absoluteLastBoundaryIdx=i3;let seg=entry.compactMetadata?.preservedSegment;seg&&(lastSeg=seg,lastSegBoundaryIdx=i3)}i3++}if(!lastSeg)return;let segIsLive=lastSegBoundaryIdx===absoluteLastBoundaryIdx,preservedUuids=new Set;if(segIsLive){let walkSeen=new Set,cur=messages.get(lastSeg.tailUuid),reachedHead=!1;for(;cur&&!walkSeen.has(cur.uuid);){if(walkSeen.add(cur.uuid),preservedUuids.add(cur.uuid),cur.uuid===lastSeg.headUuid){reachedHead=!0;break}cur=cur.parentUuid?messages.get(cur.parentUuid):void 0}if(!reachedHead){logEvent("tengu_relink_walk_broken",{tailInTranscript:messages.has(lastSeg.tailUuid),headInTranscript:messages.has(lastSeg.headUuid),anchorInTranscript:messages.has(lastSeg.anchorUuid),walkSteps:walkSeen.size,transcriptSize:messages.size});return}}if(segIsLive){let head2=messages.get(lastSeg.headUuid);head2&&messages.set(lastSeg.headUuid,{...head2,parentUuid:lastSeg.anchorUuid});for(let[uuid3,msg]of messages)msg.parentUuid===lastSeg.anchorUuid&&uuid3!==lastSeg.headUuid&&messages.set(uuid3,{...msg,parentUuid:lastSeg.tailUuid});for(let uuid3 of preservedUuids){let msg=messages.get(uuid3);msg?.type==="assistant"&&messages.set(uuid3,{...msg,message:{...msg.message,usage:{...msg.message.usage,input_tokens:0,output_tokens:0,cache_creation_input_tokens:0,cache_read_input_tokens:0}}})}}let toDelete=[];for(let[uuid3]of messages){let idx=entryIndex.get(uuid3);idx!==void 0&&idx<absoluteLastBoundaryIdx&&!preservedUuids.has(uuid3)&&toDelete.push(uuid3)}for(let uuid3 of toDelete)messages.delete(uuid3)}function applySnipRemovals(messages){let toDelete=new Set;for(let entry of messages.values()){let removedUuids=entry.snipMetadata?.removedUuids;if(removedUuids)for(let uuid3 of removedUuids)toDelete.add(uuid3)}if(toDelete.size===0)return;let deletedParent=new Map,removedCount=0;for(let uuid3 of toDelete){let entry=messages.get(uuid3);entry&&(deletedParent.set(uuid3,entry.parentUuid),messages.delete(uuid3),removedCount++)}let resolve67=__name(start=>{let path40=[],cur=start;for(;cur&&toDelete.has(cur);)if(path40.push(cur),cur=deletedParent.get(cur),cur===void 0){cur=null;break}for(let p of path40)deletedParent.set(p,cur);return cur},"resolve"),relinkedCount=0;for(let[uuid3,msg]of messages)!msg.parentUuid||!toDelete.has(msg.parentUuid)||(messages.set(uuid3,{...msg,parentUuid:resolve67(msg.parentUuid)}),relinkedCount++);logEvent("tengu_snip_resume_filtered",{removed_count:removedCount,relinked_count:relinkedCount})}function findLatestMessage(messages,predicate){let latest,maxTime=-1/0;for(let m3 of messages){if(!predicate(m3))continue;let t7=Date.parse(m3.timestamp);t7>maxTime&&(maxTime=t7,latest=m3)}return latest}function buildConversationChain(messages,leafMessage){let transcript=[],seen2=new Set,currentMsg=leafMessage;for(;currentMsg;){if(seen2.has(currentMsg.uuid)){logError2(new Error(`Cycle detected in parentUuid chain at message ${currentMsg.uuid}. Returning partial transcript.`)),logEvent("tengu_chain_parent_cycle",{});break}seen2.add(currentMsg.uuid),transcript.push(currentMsg),currentMsg=currentMsg.parentUuid?messages.get(currentMsg.parentUuid):void 0}return transcript.reverse(),recoverOrphanedParallelToolResults(messages,transcript,seen2)}function transcriptFromResumeSelection(messages,leaf,pinned){let picked=selectOrderedResumeMessages([...messages.values()],{leaf,allowShortChainFileOrder:!pinned,pinFileOrderToLeaf:pinned});return picked?.usedFileOrder?picked.messages:buildConversationChain(messages,leaf)}function recoverOrphanedParallelToolResults(messages,chain2,seen2){let chainAssistants=chain2.filter(m3=>m3.type==="assistant");if(chainAssistants.length===0)return chain2;let anchorByMsgId=new Map;for(let a2 of chainAssistants)a2.message.id&&anchorByMsgId.set(a2.message.id,a2);let siblingsByMsgId=new Map,toolResultsByAsst=new Map;for(let m3 of messages.values())if(m3.type==="assistant"&&m3.message.id){let group=siblingsByMsgId.get(m3.message.id);group?group.push(m3):siblingsByMsgId.set(m3.message.id,[m3])}else if(m3.type==="user"&&m3.parentUuid&&Array.isArray(m3.message.content)&&m3.message.content.some(b3=>b3.type==="tool_result")){let group=toolResultsByAsst.get(m3.parentUuid);group?group.push(m3):toolResultsByAsst.set(m3.parentUuid,[m3])}let processedGroups=new Set,inserts=new Map,recoveredCount=0;for(let asst of chainAssistants){let msgId=asst.message.id;if(!msgId||processedGroups.has(msgId))continue;processedGroups.add(msgId);let group=siblingsByMsgId.get(msgId)??[asst],orphanedSiblings=group.filter(s2=>!seen2.has(s2.uuid)),orphanedTRs=[];for(let member of group){let trs=toolResultsByAsst.get(member.uuid);if(trs)for(let tr of trs)seen2.has(tr.uuid)||orphanedTRs.push(tr)}if(orphanedSiblings.length===0&&orphanedTRs.length===0)continue;orphanedSiblings.sort((a2,b3)=>a2.timestamp.localeCompare(b3.timestamp)),orphanedTRs.sort((a2,b3)=>a2.timestamp.localeCompare(b3.timestamp));let anchor=anchorByMsgId.get(msgId),recovered=[...orphanedSiblings,...orphanedTRs];for(let r2 of recovered)seen2.add(r2.uuid);recoveredCount+=recovered.length,inserts.set(anchor.uuid,recovered)}if(recoveredCount===0)return chain2;logEvent("tengu_chain_parallel_tr_recovered",{recovered_count:recoveredCount});let result2=[];for(let m3 of chain2){result2.push(m3);let toInsert=inserts.get(m3.uuid);toInsert&&result2.push(...toInsert)}return result2}function checkResumeConsistency(chain2,options={}){let result2=computeResumeConsistency(chain2,options.fullMessageMap?{fullMessageMap:options.fullMessageMap}:{});return result2&&logEvent("tengu_resume_consistency_delta",{expected:result2.expected,actual:result2.actual,delta:result2.delta,chain_length:result2.chainLength,checkpoint_age_entries:result2.chainLength-1-result2.actual,reason:result2.reason?1:0,lost_user_assistant_count:result2.lostUserAssistantCount,compact_boundary_count:result2.compactBoundaryCount}),result2}function buildFileHistorySnapshotChain(fileHistorySnapshots,conversation){let snapshots=[],indexByMessageId=new Map;for(let message of conversation){let snapshotMessage=fileHistorySnapshots.get(message.uuid);if(!snapshotMessage)continue;let{snapshot:snapshot2,isSnapshotUpdate}=snapshotMessage,existingIndex=isSnapshotUpdate?indexByMessageId.get(snapshot2.messageId):void 0;existingIndex===void 0?(indexByMessageId.set(snapshot2.messageId,snapshots.length),snapshots.push(snapshot2)):snapshots[existingIndex]=snapshot2}return snapshots}function buildAttributionSnapshotChain(attributionSnapshots,_conversation){return Array.from(attributionSnapshots.values())}async function loadTranscriptFromFile(filePath){if(filePath.endsWith(".jsonl")){let{messages:messages2,summaries,customTitles,tags,fileHistorySnapshots,attributionSnapshots,contextCollapseCommits,contextCollapseSnapshot,leafUuids,contentReplacements,worktreeStates}=await loadTranscriptFile(filePath);if(messages2.size===0)throw new Error("No messages found in JSONL file");let leafMessage=findLatestMessage(messages2.values(),msg=>leafUuids.has(msg.uuid));if(isNativeModuleEnabled2("session"))try{let native=nativeSessionLoadTranscript({path:filePath}),leafUuid=native?.uuids[native.uuids.length-1],pinned=leafUuid?messages2.get(leafUuid):void 0;pinned&&leafUuids.has(pinned.uuid)&&(leafMessage=pinned)}catch{}if(!leafMessage)throw new Error("No valid conversation chain found in JSONL file");let transcript=transcriptFromResumeSelection(messages2,leafMessage,!1),summary=summaries.get(leafMessage.uuid),customTitle=customTitles.get(leafMessage.sessionId),tag2=tags.get(leafMessage.sessionId),sessionId=leafMessage.sessionId;return{...convertToLogOption(transcript,0,summary,customTitle,buildFileHistorySnapshotChain(fileHistorySnapshots,transcript),tag2,filePath,buildAttributionSnapshotChain(attributionSnapshots,transcript),void 0,contentReplacements.get(sessionId)??[]),contextCollapseCommits:contextCollapseCommits.filter(e2=>e2.sessionId===sessionId),contextCollapseSnapshot:contextCollapseSnapshot?.sessionId===sessionId?contextCollapseSnapshot:void 0,worktreeSession:worktreeStates.has(sessionId)?worktreeStates.get(sessionId):void 0}}let content=await readFile71(filePath,{encoding:"utf-8"}),parsed;try{parsed=jsonParse(content)}catch(error40){throw new Error(`Invalid JSON in transcript file: ${error40}`)}let messages;if(Array.isArray(parsed))messages=parsed;else if(parsed&&typeof parsed=="object"&&"messages"in parsed){if(!Array.isArray(parsed.messages))throw new Error("Transcript messages must be an array");messages=parsed.messages}else throw new Error("Transcript must be an array of messages or an object with a messages array");return convertToLogOption(messages,0,void 0,void 0,void 0,void 0,filePath)}function hasVisibleUserContent(message){if(message.type!=="user"||message.isMeta)return!1;let content=message.message?.content;return content?typeof content=="string"?content.trim().length>0:Array.isArray(content)?content.some(block2=>block2.type==="text"||block2.type==="image"||block2.type==="document"):!1:!1}function hasVisibleAssistantContent(message){if(message.type!=="assistant")return!1;let content=message.message?.content;return!content||!Array.isArray(content)?!1:content.some(block2=>block2.type==="text"&&typeof block2.text=="string"&&block2.text.trim().length>0)}function countVisibleMessages(transcript){let count4=0;for(let message of transcript)switch(message.type){case"user":hasVisibleUserContent(message)&&count4++;break;case"assistant":hasVisibleAssistantContent(message)&&count4++;break;case"attachment":case"system":case"progress":break}return count4}function convertToLogOption(transcript,value=0,summary,customTitle,fileHistorySnapshots,tag2,fullPath,attributionSnapshots,agentSetting,contentReplacements){let lastMessage=transcript.at(-1),firstMessage=transcript[0],firstPrompt=extractFirstPrompt2(transcript),created=new Date(firstMessage.timestamp),modified=new Date(lastMessage.timestamp);return{date:lastMessage.timestamp,messages:removeExtraFields(transcript),fullPath,value,created,modified,firstPrompt,messageCount:countVisibleMessages(transcript),isSidechain:firstMessage.isSidechain,teamName:firstMessage.teamName,agentName:firstMessage.agentName,agentSetting,leafUuid:lastMessage.uuid,summary,customTitle,tag:tag2,fileHistorySnapshots,attributionSnapshots,contentReplacements,gitBranch:lastMessage.gitBranch,projectPath:firstMessage.cwd}}async function trackSessionBranchingAnalytics(logs2){let sessionIdCounts=new Map,maxCount=0;for(let log4 of logs2){let sessionId=getSessionIdFromLog(log4);if(sessionId){let newCount=(sessionIdCounts.get(sessionId)||0)+1;sessionIdCounts.set(sessionId,newCount),maxCount=Math.max(newCount,maxCount)}}if(maxCount<=1)return;let branchCounts=Array.from(sessionIdCounts.values()).filter(c4=>c4>1),sessionsWithBranches=branchCounts.length,totalBranches=branchCounts.reduce((sum2,count4)=>sum2+count4,0);logEvent("tengu_session_forked_branches_fetched",{total_sessions:sessionIdCounts.size,sessions_with_branches:sessionsWithBranches,max_branches_per_session:Math.max(...branchCounts),avg_branches_per_session:Math.round(totalBranches/sessionsWithBranches),total_transcript_count:logs2.length})}async function fetchLogs(limit){let projectDir=getProjectDir3(getOriginalCwd()),logs2=await getSessionFilesLite(projectDir,limit,getOriginalCwd());return await trackSessionBranchingAnalytics(logs2),logs2}function appendEntryToFile(fullPath,entry){let fs13=getFsImplementation(),line=jsonStringify(redactTranscriptEntry(entry))+`
10115
10115
  `;try{fs13.appendFileSync(fullPath,line,{mode:384})}catch{fs13.mkdirSync(dirname85(fullPath),{mode:448}),fs13.appendFileSync(fullPath,line,{mode:384})}}function readFileTailSync(fullPath){let fd2;try{fd2=openSync4(fullPath,"r");let st=fstatSync(fd2),tailOffset=Math.max(0,st.size-LITE_READ_BUF_SIZE),buf=Buffer.allocUnsafe(Math.min(LITE_READ_BUF_SIZE,st.size-tailOffset)),bytesRead=readSync2(fd2,buf,0,buf.length,tailOffset);return buf.toString("utf8",0,bytesRead)}catch{return""}finally{if(fd2!==void 0)try{closeSync4(fd2)}catch{}}}async function saveCustomTitle(sessionId,customTitle,fullPath,source="user"){let resolvedPath=fullPath??getTranscriptPathForSession(sessionId);appendEntryToFile(resolvedPath,{type:"custom-title",customTitle,sessionId}),sessionId===getSessionId()&&(getProject().currentSessionTitle=customTitle),logEvent("tengu_session_renamed",{source})}function recordHead(sessionId,leafUuid,reason,branchId="main"){let path40=getTranscriptPathForSession(sessionId),entry={type:"head",sessionId,leafUuid,branchId,reason,timestamp:new Date().toISOString()};appendEntryToFile(path40,entry),sessionId===getSessionId()&&branchId!=="main"&&(getProject().currentBranchId=branchId)}function recordBranch(sessionId,branchId,name,createdAtUuid,parentBranchId){let entry={type:"branch",sessionId,branchId,name,createdAtUuid,parentBranchId,timestamp:new Date().toISOString()};appendEntryToFile(getTranscriptPathForSession(sessionId),entry)}async function loadBranchesForSession(sessionId){let path40=getTranscriptPathForSession(sessionId),{resumeHeads,branchEntries,messages}=await loadTranscriptFile(path40,{keepAllLeaves:!0}),branches2=branchEntries.get(sessionId)??[],head2=resumeHeads.get(sessionId),leaves=new Map;for(let b3 of branches2){let m3=messages.get(b3.createdAtUuid);if(!m3||m3.type!=="user"&&m3.type!=="assistant")continue;let preview2="",c4=m3.message?.content;if(typeof c4=="string")preview2=c4;else if(Array.isArray(c4)){for(let block2 of c4)if(block2&&typeof block2=="object"){let text3=block2.text;if(typeof text3=="string"){preview2=text3;break}}}leaves.set(b3.createdAtUuid,{type:m3.type,preview:preview2.replace(/\n/g," ").slice(0,120),ts:m3.timestamp??""})}return{branches:branches2,head:head2,leaves}}function setActiveBranch(branchId){getProject().currentBranchId=branchId}function getActiveBranch(){return getProject().currentBranchId}function saveAiGeneratedTitle(sessionId,aiTitle){appendEntryToFile(getTranscriptPathForSession(sessionId),{type:"ai-title",aiTitle,sessionId})}function saveTaskSummary(sessionId,summary){appendEntryToFile(getTranscriptPathForSession(sessionId),{type:"task-summary",summary,sessionId,timestamp:new Date().toISOString()})}function saveSessionTurnSummary(sessionId,lastTurnSummary){let text3=String(lastTurnSummary||"").replace(/\s+/g," ").trim().slice(0,120);if(!sessionId||!text3)return;let key3=String(sessionId);if(lastTurnSummaryWritten.get(key3)!==text3){lastTurnSummaryWritten.set(key3,text3);try{appendEntryToFile(getTranscriptPathForSession(sessionId),{type:"session-turn-summary",lastTurnSummary:text3,sessionId,timestamp:new Date().toISOString()})}catch{}}}async function saveTag(sessionId,tag2,fullPath){let resolvedPath=fullPath??getTranscriptPathForSession(sessionId);appendEntryToFile(resolvedPath,{type:"tag",tag:tag2,sessionId}),sessionId===getSessionId()&&(getProject().currentSessionTag=tag2),logEvent("tengu_session_tagged",{})}async function linkSessionToPR(sessionId,prNumber,prUrl,prRepository,fullPath){let resolvedPath=fullPath??getTranscriptPathForSession(sessionId);if(appendEntryToFile(resolvedPath,{type:"pr-link",sessionId,prNumber,prUrl,prRepository,timestamp:new Date().toISOString()}),sessionId===getSessionId()){let project3=getProject();project3.currentSessionPrNumber=prNumber,project3.currentSessionPrUrl=prUrl,project3.currentSessionPrRepository=prRepository}logEvent("tengu_session_linked_to_pr",{prNumber})}function getCurrentSessionTag(sessionId){if(sessionId===getSessionId())return getProject().currentSessionTag}function getCurrentSessionTitle(sessionId){if(sessionId===getSessionId())return getProject().currentSessionTitle}function getCurrentSessionAgentColor(){return getProject().currentSessionAgentColor}function restoreSessionMetadata(meta){let project3=getProject();meta.customTitle&&(project3.currentSessionTitle??=meta.customTitle),meta.tag!==void 0&&(project3.currentSessionTag=meta.tag||void 0),meta.agentName&&(project3.currentSessionAgentName=meta.agentName),meta.agentColor&&(project3.currentSessionAgentColor=meta.agentColor),meta.agentSetting&&(project3.currentSessionAgentSetting=meta.agentSetting),meta.mode&&(project3.currentSessionMode=meta.mode),meta.worktreeSession!==void 0&&(project3.currentSessionWorktree=meta.worktreeSession),meta.prNumber!==void 0&&(project3.currentSessionPrNumber=meta.prNumber),meta.prUrl&&(project3.currentSessionPrUrl=meta.prUrl),meta.prRepository&&(project3.currentSessionPrRepository=meta.prRepository)}function clearSessionMetadata(){let project3=getProject();project3.currentSessionTitle=void 0,project3.currentSessionTag=void 0,project3.currentSessionAgentName=void 0,project3.currentSessionAgentColor=void 0,project3.currentSessionLastPrompt=void 0,project3.currentSessionAgentSetting=void 0,project3.currentSessionMode=void 0,project3.currentSessionWorktree=void 0,project3.currentSessionPrNumber=void 0,project3.currentSessionPrUrl=void 0,project3.currentSessionPrRepository=void 0}function reAppendSessionMetadata(){getProject().reAppendSessionMetadata()}async function saveAgentName(sessionId,agentName,fullPath,source="user"){let resolvedPath=fullPath??getTranscriptPathForSession(sessionId);appendEntryToFile(resolvedPath,{type:"agent-name",agentName,sessionId}),sessionId===getSessionId()&&(getProject().currentSessionAgentName=agentName,updateSessionName(agentName)),logEvent("tengu_agent_name_set",{source})}async function saveAgentColor(sessionId,agentColor,fullPath){let resolvedPath=fullPath??getTranscriptPathForSession(sessionId);appendEntryToFile(resolvedPath,{type:"agent-color",agentColor,sessionId}),sessionId===getSessionId()&&(getProject().currentSessionAgentColor=agentColor),logEvent("tengu_agent_color_set",{})}function saveAgentSetting(agentSetting){getProject().currentSessionAgentSetting=agentSetting}function cacheSessionTitle(customTitle){getProject().currentSessionTitle=customTitle}function saveMode(mode2){getProject().currentSessionMode=mode2}function saveWorktreeState(worktreeSession){let stripped=worktreeSession?{originalCwd:worktreeSession.originalCwd,worktreePath:worktreeSession.worktreePath,worktreeName:worktreeSession.worktreeName,worktreeBranch:worktreeSession.worktreeBranch,originalBranch:worktreeSession.originalBranch,originalHeadCommit:worktreeSession.originalHeadCommit,sessionId:worktreeSession.sessionId,tmuxSessionName:worktreeSession.tmuxSessionName,hookBased:worktreeSession.hookBased}:null,project3=getProject();project3.currentSessionWorktree=stripped,project3.sessionFile&&appendEntryToFile(project3.sessionFile,{type:"worktree-state",worktreeSession:stripped,sessionId:getSessionId()})}function getSessionIdFromLog(log4){return log4.sessionId?log4.sessionId:log4.messages[0]?.sessionId}function isLiteLog(log4){return log4.messages.length===0&&log4.sessionId!==void 0}async function loadFullLog(log4){if(!isLiteLog(log4))return log4;let sessionFile=log4.fullPath;if(!sessionFile)return log4;try{let{messages,summaries,customTitles,tags,agentNames,agentColors,agentSettings,prNumbers,prUrls,prRepositories,modes,worktreeStates,fileHistorySnapshots,attributionSnapshots,contentReplacements,contextCollapseCommits,contextCollapseSnapshot,leafUuids,resumeHeads,branchEntries}=await loadTranscriptFile(sessionFile);if(messages.size===0)return log4;let sessionIdFromIndex=log4.sessionId,leaf,headLeafSource="fallback";if(sessionIdFromIndex){let head2=resumeHeads.get(sessionIdFromIndex);if(head2){let candidate=messages.get(head2.leafUuid);candidate&&(candidate.type==="user"||candidate.type==="assistant")&&(leaf=candidate,headLeafSource="head")}}if(leaf||(leaf=findLatestMessage(messages.values(),msg=>leafUuids.has(msg.uuid)&&(msg.type==="user"||msg.type==="assistant"))),!leaf)return log4;let mostRecentLeaf=leaf;logEvent("tengu_resume_leaf_picked",{source_head:headLeafSource==="head"});let transcript=transcriptFromResumeSelection(messages,mostRecentLeaf,headLeafSource==="head"),sessionId=mostRecentLeaf.sessionId,consistencyDelta=checkResumeConsistency(transcript,{fullMessageMap:messages}),branchCount=sessionId?branchEntries.get(sessionId)?.length??0:0;return{...log4,messages:removeExtraFields(transcript),firstPrompt:extractFirstPrompt2(transcript),messageCount:countVisibleMessages(transcript),summary:mostRecentLeaf?summaries.get(mostRecentLeaf.uuid):log4.summary,customTitle:sessionId?customTitles.get(sessionId):log4.customTitle,tag:sessionId?tags.get(sessionId):log4.tag,agentName:sessionId?agentNames.get(sessionId):log4.agentName,agentColor:sessionId?agentColors.get(sessionId):log4.agentColor,agentSetting:sessionId?agentSettings.get(sessionId):log4.agentSetting,mode:sessionId?modes.get(sessionId):log4.mode,worktreeSession:sessionId&&worktreeStates.has(sessionId)?worktreeStates.get(sessionId):log4.worktreeSession,prNumber:sessionId?prNumbers.get(sessionId):log4.prNumber,prUrl:sessionId?prUrls.get(sessionId):log4.prUrl,prRepository:sessionId?prRepositories.get(sessionId):log4.prRepository,gitBranch:mostRecentLeaf?.gitBranch??log4.gitBranch,isSidechain:transcript[0]?.isSidechain??log4.isSidechain,teamName:transcript[0]?.teamName??log4.teamName,leafUuid:mostRecentLeaf?.uuid??log4.leafUuid,branchCount,consistencyDelta,fileHistorySnapshots:buildFileHistorySnapshotChain(fileHistorySnapshots,transcript),attributionSnapshots:buildAttributionSnapshotChain(attributionSnapshots,transcript),contentReplacements:sessionId?contentReplacements.get(sessionId)??[]:log4.contentReplacements,contextCollapseCommits:sessionId?contextCollapseCommits.filter(e2=>e2.sessionId===sessionId):void 0,contextCollapseSnapshot:sessionId&&contextCollapseSnapshot?.sessionId===sessionId?contextCollapseSnapshot:void 0}}catch(err2){return logError2(err2 instanceof Error?err2:new Error(`loadFullLog failed: ${String(err2)}`)),logEvent("tengu_resume_full_log_failed",{reason_unknown:(getErrnoCode(err2)??"unknown")==="unknown"}),log4}}async function searchSessionsByCustomTitle(query2,options){let{limit,exact}=options||{},worktreePaths=await getWorktreePaths(getOriginalCwd()),allStatLogs=await getStatOnlyLogsForWorktrees(worktreePaths),{logs:logs2}=await enrichLogs(allStatLogs,0,allStatLogs.length),normalizedQuery=query2.toLowerCase().trim(),matchingLogs=logs2.filter(log4=>{let title=log4.customTitle?.toLowerCase().trim();return title?exact?title===normalizedQuery:title.includes(normalizedQuery):!1}),sessionIdToLog=new Map;for(let log4 of matchingLogs){let sessionId=getSessionIdFromLog(log4);if(sessionId){let existing=sessionIdToLog.get(sessionId);(!existing||log4.modified>existing.modified)&&sessionIdToLog.set(sessionId,log4)}}let deduplicated=Array.from(sessionIdToLog.values());return deduplicated.sort((a2,b3)=>b3.modified.getTime()-a2.modified.getTime()),limit?deduplicated.slice(0,limit):deduplicated}function resolveMetadataBuf(carry,chunkBuf){if(carry===null||carry.length===0)return chunkBuf;if(carry.length<METADATA_PREFIX_BOUND)return Buffer.concat([carry,chunkBuf]);if(carry[0]===123){for(let m3 of METADATA_MARKER_BUFS)if(carry.compare(m3,0,m3.length,1,1+m3.length)===0)return Buffer.concat([carry,chunkBuf])}let firstNl=chunkBuf.indexOf(10);return firstNl===-1?null:chunkBuf.subarray(firstNl+1)}async function scanPreBoundaryMetadata(filePath,endOffset){let{createReadStream:createReadStream7}=await import("fs"),NEWLINE=10,stream4=createReadStream7(filePath,{end:endOffset-1}),metadataLines=[],carry=null;for await(let chunk3 of stream4){let buf=resolveMetadataBuf(carry,chunk3);if(buf===null){carry=null;continue}let hasAnyMarker=!1;for(let m3 of METADATA_MARKER_BUFS)if(buf.includes(m3)){hasAnyMarker=!0;break}if(hasAnyMarker){let lineStart=0,nl=buf.indexOf(NEWLINE);for(;nl!==-1;){for(let m3 of METADATA_MARKER_BUFS){let mIdx=buf.indexOf(m3,lineStart);if(mIdx!==-1&&mIdx<nl){metadataLines.push(buf.toString("utf-8",lineStart,nl));break}}lineStart=nl+1,nl=buf.indexOf(NEWLINE,lineStart)}carry=buf.subarray(lineStart)}else{let lastNl=buf.lastIndexOf(NEWLINE);carry=lastNl>=0?buf.subarray(lastNl+1):buf}carry.length>64*1024&&(carry=null)}if(carry!==null&&carry.length>0){for(let m3 of METADATA_MARKER_BUFS)if(carry.includes(m3)){metadataLines.push(carry.toString("utf-8"));break}}return metadataLines}function pickDepthOneUuidCandidate(buf,lineStart,candidates){let depth=0,inString=!1,escapeNext=!1,ci=0;for(let i3=lineStart;ci<candidates.length;i3++){if(i3===candidates[ci]){if(depth===1&&!inString)return candidates[ci];ci++}let b3=buf[i3];escapeNext?escapeNext=!1:inString?b3===92?escapeNext=!0:b3===34&&(inString=!1):b3===34?inString=!0:b3===123?depth++:b3===125&&depth--}return candidates.at(-1)}function walkChainBeforeParse(buf){let PARENT_PREFIX=Buffer.from('{"parentUuid":'),UUID_KEY=Buffer.from('"uuid":"'),SIDECHAIN_TRUE=Buffer.from('"isSidechain":true'),UUID_LEN=36,TS_SUFFIX=Buffer.from('","timestamp":"'),TS_SUFFIX_LEN=TS_SUFFIX.length,PREFIX_LEN=PARENT_PREFIX.length,KEY_LEN=UUID_KEY.length,msgIdx=[],metaRanges=[],uuidToSlot=new Map,pos=0,len=buf.length;for(;pos<len;){let nl=buf.indexOf(10,pos),lineEnd=nl===-1?len:nl+1;if(lineEnd-pos>PREFIX_LEN&&buf[pos]===123&&buf.compare(PARENT_PREFIX,0,PREFIX_LEN,pos,pos+PREFIX_LEN)===0){let parentStart=buf[pos+PREFIX_LEN]===34?pos+PREFIX_LEN+1:-1,firstAny=-1,suffix0=-1,suffixN,from=pos;for(;;){let next=buf.indexOf(UUID_KEY,from);if(next<0||next>=lineEnd)break;firstAny<0&&(firstAny=next);let after2=next+KEY_LEN+UUID_LEN;after2+TS_SUFFIX_LEN<=lineEnd&&buf.compare(TS_SUFFIX,0,TS_SUFFIX_LEN,after2,after2+TS_SUFFIX_LEN)===0&&(suffix0<0?suffix0=next:(suffixN??=[suffix0]).push(next)),from=next+KEY_LEN}let uk=suffixN?pickDepthOneUuidCandidate(buf,pos,suffixN):suffix0>=0?suffix0:firstAny;if(uk>=0){let uuidStart=uk+KEY_LEN,uuid3=buf.toString("latin1",uuidStart,uuidStart+UUID_LEN);uuidToSlot.set(uuid3,msgIdx.length),msgIdx.push(pos,lineEnd,parentStart)}else metaRanges.push(pos,lineEnd)}else metaRanges.push(pos,lineEnd);pos=lineEnd}let leafSlot=-1,dialogueCount=0;for(let i3=msgIdx.length-3;i3>=0;i3-=3){let start=msgIdx[i3],end=msgIdx[i3+1],sc=buf.indexOf(SIDECHAIN_TRUE,start);if(sc!==-1&&sc<end)continue;let headEnd=Math.min(end,start+480),head2=buf.toString("utf8",start,headEnd);(head2.includes('"type":"user"')||head2.includes('"type": "user"')||head2.includes('"type":"assistant"')||head2.includes('"type": "assistant"'))&&(dialogueCount+=1),leafSlot<0&&(leafSlot=i3)}if(leafSlot<0)return buf;let seen2=new Set,chain2=new Set,chainBytes=0,severedByNotice=!1,slot=leafSlot;for(;slot!==void 0&&!seen2.has(slot);){seen2.add(slot),chain2.add(msgIdx[slot]),chainBytes+=msgIdx[slot+1]-msgIdx[slot];let parentStart=msgIdx[slot+2],lineStart=msgIdx[slot],lineEnd=msgIdx[slot+1];if(parentStart<0){bufferLineHasHistoryRepairNotice(buf,lineStart,lineEnd)&&(severedByNotice=!0);break}let parent2=buf.toString("latin1",parentStart,parentStart+UUID_LEN),next=uuidToSlot.get(parent2);if(next===void 0){bufferLineHasHistoryRepairNotice(buf,lineStart,lineEnd)&&(severedByNotice=!0);break}slot=next}if(severedByNotice||parentChainIsTooShort(seen2.size,dialogueCount)||len-chainBytes<len>>1)return buf;let parts=[],m3=0;for(let i3=0;i3<msgIdx.length;i3+=3){let start=msgIdx[i3];for(;m3<metaRanges.length&&metaRanges[m3]<start;)parts.push(buf.subarray(metaRanges[m3],metaRanges[m3+1])),m3+=2;chain2.has(start)&&parts.push(buf.subarray(start,msgIdx[i3+1]))}for(;m3<metaRanges.length;)parts.push(buf.subarray(metaRanges[m3],metaRanges[m3+1])),m3+=2;return Buffer.concat(parts)}async function loadTranscriptFile(filePath,opts){let messages=new Map,summaries=new Map,customTitles=new Map,tags=new Map,agentNames=new Map,agentColors=new Map,agentSettings=new Map,prNumbers=new Map,prUrls=new Map,prRepositories=new Map,modes=new Map,worktreeStates=new Map,fileHistorySnapshots=new Map,fileHistoryLogState=createFileHistorySnapshotLogState(),attributionSnapshots=new Map,contentReplacements=new Map,agentContentReplacements=new Map,contextCollapseCommits=[],contextCollapseSnapshot,resumeHeads=new Map,branchEntries=new Map;try{let buf=null,metadataLines=null,hasPreservedSegment=!1;if(!isEnvTruthy2(process.env.CLAUDE_CODE_DISABLE_PRECOMPACT_SKIP)){let{size:size2}=await stat52(filePath);if(size2>SKIP_PRECOMPACT_THRESHOLD){let scan=await readTranscriptForLoad(filePath,size2);buf=scan.postBoundaryBuf,hasPreservedSegment=scan.hasPreservedSegment,scan.boundaryStartOffset>0&&(metadataLines=await scanPreBoundaryMetadata(filePath,scan.boundaryStartOffset))}}if(buf??=await readFile71(filePath),!opts?.keepAllLeaves&&!hasPreservedSegment&&isEnvTruthy2(process.env.CLAUDE_CODE_ENABLE_PRECOMPACT_SKIP)&&buf.length>SKIP_PRECOMPACT_THRESHOLD&&(buf=walkChainBeforeParse(buf)),metadataLines&&metadataLines.length>0){let metaEntries=parseJSONL(Buffer.from(metadataLines.join(`
10116
10116
  `)));for(let entry of metaEntries)entry.type==="summary"&&entry.leafUuid?summaries.set(entry.leafUuid,entry.summary):entry.type==="custom-title"&&entry.sessionId?customTitles.set(entry.sessionId,entry.customTitle):entry.type==="tag"&&entry.sessionId?tags.set(entry.sessionId,entry.tag):entry.type==="agent-name"&&entry.sessionId?agentNames.set(entry.sessionId,entry.agentName):entry.type==="agent-color"&&entry.sessionId?agentColors.set(entry.sessionId,entry.agentColor):entry.type==="agent-setting"&&entry.sessionId?agentSettings.set(entry.sessionId,entry.agentSetting):entry.type==="mode"&&entry.sessionId?modes.set(entry.sessionId,entry.mode):entry.type==="worktree-state"&&entry.sessionId?worktreeStates.set(entry.sessionId,entry.worktreeSession):entry.type==="pr-link"&&entry.sessionId&&(prNumbers.set(entry.sessionId,entry.prNumber),prUrls.set(entry.sessionId,entry.prUrl),prRepositories.set(entry.sessionId,entry.prRepository))}let entries=parseJSONL(buf),progressBridge=new Map;for(let entry of entries){if(isLegacyProgressEntry(entry)){let parent2=entry.parentUuid;progressBridge.set(entry.uuid,parent2&&progressBridge.has(parent2)?progressBridge.get(parent2)??null:parent2);continue}if(isTranscriptMessage(entry))entry.parentUuid&&progressBridge.has(entry.parentUuid)&&(entry.parentUuid=progressBridge.get(entry.parentUuid)??null),messages.set(entry.uuid,entry),isCompactBoundaryMessage(entry)&&(contextCollapseCommits.length=0,contextCollapseSnapshot=void 0);else if(entry.type==="summary"&&entry.leafUuid)summaries.set(entry.leafUuid,entry.summary);else if(entry.type==="custom-title"&&entry.sessionId)customTitles.set(entry.sessionId,entry.customTitle);else if(entry.type==="tag"&&entry.sessionId)tags.set(entry.sessionId,entry.tag);else if(entry.type==="agent-name"&&entry.sessionId)agentNames.set(entry.sessionId,entry.agentName);else if(entry.type==="agent-color"&&entry.sessionId)agentColors.set(entry.sessionId,entry.agentColor);else if(entry.type==="agent-setting"&&entry.sessionId)agentSettings.set(entry.sessionId,entry.agentSetting);else if(entry.type==="mode"&&entry.sessionId)modes.set(entry.sessionId,entry.mode);else if(entry.type==="worktree-state"&&entry.sessionId)worktreeStates.set(entry.sessionId,entry.worktreeSession);else if(entry.type==="pr-link"&&entry.sessionId)prNumbers.set(entry.sessionId,entry.prNumber),prUrls.set(entry.sessionId,entry.prUrl),prRepositories.set(entry.sessionId,entry.prRepository);else if(entry.type==="file-history-snapshot"){let merged=mergeLoadedFileHistorySnapshot(fileHistoryLogState,entry);merged&&fileHistorySnapshots.set(merged.messageId,{...entry,snapshot:merged.snapshot,isSnapshotUpdate:merged.isSnapshotUpdate,snapshotDelta:!1,removedPaths:void 0})}else if(entry.type==="attribution-snapshot")attributionSnapshots.set(entry.messageId,entry);else if(entry.type==="content-replacement")if(entry.agentId){let existing=agentContentReplacements.get(entry.agentId)??[];agentContentReplacements.set(entry.agentId,existing),existing.push(...entry.replacements)}else{let existing=contentReplacements.get(entry.sessionId)??[];contentReplacements.set(entry.sessionId,existing),existing.push(...entry.replacements)}else if(entry.type==="marble-origami-commit")contextCollapseCommits.push(entry);else if(entry.type==="marble-origami-snapshot")contextCollapseSnapshot=entry;else if(entry.type==="head"&&entry.sessionId)resumeHeads.set(entry.sessionId,entry);else if(entry.type==="branch"&&entry.sessionId&&entry.branchId){let list2=branchEntries.get(entry.sessionId)??[],existingIdx=list2.findIndex(b3=>b3.branchId===entry.branchId);existingIdx>=0?list2[existingIdx]=entry:list2.push(entry),branchEntries.set(entry.sessionId,list2)}}}catch(err2){logError2(err2 instanceof Error?err2:new Error(`loadTranscriptFile partial-read at ${filePath}: ${String(err2)}`)),logEvent("tengu_transcript_load_partial",{reason_parse_or_read:(getErrnoCode(err2)??"parse_or_read")==="parse_or_read",partial_messages:messages.size})}applyPreservedSegmentRelinks(messages),applySnipRemovals(messages);let allMessages=[...messages.values()],parentUuids=new Set(allMessages.map(msg=>msg.parentUuid).filter(uuid3=>uuid3!==null)),terminalMessages=allMessages.filter(msg=>!parentUuids.has(msg.uuid)),leafUuids=new Set,hasCycle2=!1;if(getFeatureValue_CACHED_MAY_BE_STALE("tengu_pebble_leaf_prune",!1)){let hasUserAssistantChild=new Set;for(let msg of allMessages)msg.parentUuid&&(msg.type==="user"||msg.type==="assistant")&&hasUserAssistantChild.add(msg.parentUuid);for(let terminal of terminalMessages){let seen2=new Set,current=terminal;for(;current;){if(seen2.has(current.uuid)){hasCycle2=!0;break}if(seen2.add(current.uuid),current.type==="user"||current.type==="assistant"){hasUserAssistantChild.has(current.uuid)||leafUuids.add(current.uuid);break}current=current.parentUuid?messages.get(current.parentUuid):void 0}}}else for(let terminal of terminalMessages){let seen2=new Set,current=terminal;for(;current;){if(seen2.has(current.uuid)){hasCycle2=!0;break}if(seen2.add(current.uuid),current.type==="user"||current.type==="assistant"){leafUuids.add(current.uuid);break}current=current.parentUuid?messages.get(current.parentUuid):void 0}}return hasCycle2&&logEvent("tengu_transcript_parent_cycle",{}),{messages,summaries,customTitles,tags,agentNames,agentColors,agentSettings,prNumbers,prUrls,prRepositories,modes,worktreeStates,fileHistorySnapshots,attributionSnapshots,contentReplacements,agentContentReplacements,contextCollapseCommits,contextCollapseSnapshot,leafUuids,resumeHeads,branchEntries}}async function resolveSessionFilePath(sessionId){let localPath=join208(getSessionProjectDir2()??getProjectDir3(getOriginalCwd()),`${sessionId}.jsonl`);try{return await stat52(localPath),localPath}catch{}let projectsDir=getProjectsDir2(),dirents;try{dirents=await readdir40(projectsDir,{withFileTypes:!0})}catch{return localPath}for(let d of dirents){if(!d.isDirectory())continue;let candidate=join208(projectsDir,d.name,`${sessionId}.jsonl`);try{return await stat52(candidate),candidate}catch{}}return localPath}async function loadSessionFile(sessionId){let sessionFile=await resolveSessionFilePath(sessionId);return loadTranscriptFile(sessionFile)}function clearSessionMessagesCache(){getSessionMessages.cache.clear?.()}async function doesMessageExistInSession(sessionId,messageUuid){return(await getSessionMessages(sessionId)).has(messageUuid)}async function getLastSessionLog(sessionId){let transcriptPath=await resolveSessionFilePath(sessionId),{messages,summaries,customTitles,tags,agentSettings,worktreeStates,fileHistorySnapshots,attributionSnapshots,contentReplacements,contextCollapseCommits,contextCollapseSnapshot,resumeHeads}=await loadTranscriptFile(transcriptPath);if(messages.size===0)return null;getSessionMessages.cache.has(sessionId)||getSessionMessages.cache.set(sessionId,Promise.resolve(new Set(messages.keys())));let head2=resumeHeads.get(sessionId),lastMessage,pinnedHead=!1;if(head2?.leafUuid){if(String(head2.leafUuid)==="00000000-0000-4000-8000-000000000000"){let now3=new Date;return{date:now3.toISOString(),messages:[],fullPath:transcriptPath,value:0,created:now3,modified:now3,firstPrompt:"",messageCount:0,isSidechain:!1,leafUuid:head2.leafUuid,summary:void 0,customTitle:customTitles.get(sessionId),fileHistorySnapshots:[],tag:tags.get(sessionId),attributionSnapshots:[],agentSetting:agentSettings.get(sessionId),contentReplacements:contentReplacements.get(sessionId)??[],worktreeSession:worktreeStates.get(sessionId),contextCollapseCommits:contextCollapseCommits.filter(e2=>e2.sessionId===sessionId),contextCollapseSnapshot:contextCollapseSnapshot?.sessionId===sessionId?contextCollapseSnapshot:void 0}}let candidate=messages.get(head2.leafUuid);candidate&&!candidate.isSidechain&&(candidate.type==="user"||candidate.type==="assistant")&&(lastMessage=candidate,pinnedHead=!0)}if(lastMessage||(lastMessage=findLatestMessage(messages.values(),m3=>!m3.isSidechain)),!lastMessage)return null;let transcript=transcriptFromResumeSelection(messages,lastMessage,pinnedHead),summary=summaries.get(lastMessage.uuid),customTitle=customTitles.get(lastMessage.sessionId),tag2=tags.get(lastMessage.sessionId),agentSetting=agentSettings.get(sessionId);return{...convertToLogOption(transcript,0,summary,customTitle,buildFileHistorySnapshotChain(fileHistorySnapshots,transcript),tag2,transcriptPath,buildAttributionSnapshotChain(attributionSnapshots,transcript),agentSetting,contentReplacements.get(sessionId)??[]),worktreeSession:worktreeStates.get(sessionId),contextCollapseCommits:contextCollapseCommits.filter(e2=>e2.sessionId===sessionId),contextCollapseSnapshot:contextCollapseSnapshot?.sessionId===sessionId?contextCollapseSnapshot:void 0}}async function loadMessageLogs(limit){let sessionLogs=await fetchLogs(limit),{logs:enriched}=await enrichLogs(sessionLogs,0,sessionLogs.length),sorted=sortLogs(enriched);return sorted.forEach((log4,i3)=>{log4.value=i3}),sorted}async function loadAllProjectsMessageLogs(limit,options){return options?.skipIndex?loadAllProjectsMessageLogsFull(limit):(await loadAllProjectsMessageLogsProgressive(limit,options?.initialEnrichCount??INITIAL_ENRICH_COUNT)).logs}async function loadAllProjectsMessageLogsFull(limit){let projectsDir=getProjectsDir2(),dirents;try{dirents=await readdir40(projectsDir,{withFileTypes:!0})}catch{return[]}let projectDirs=dirents.filter(dirent=>dirent.isDirectory()).map(dirent=>join208(projectsDir,dirent.name)),allLogs=(await Promise.all(projectDirs.map(projectDir=>getLogsWithoutIndex(projectDir,limit)))).flat(),deduped=new Map;for(let log4 of allLogs){let key3=`${log4.sessionId??""}:${log4.leafUuid??""}`,existing=deduped.get(key3);(!existing||log4.modified.getTime()>existing.modified.getTime())&&deduped.set(key3,log4)}let sorted=sortLogs([...deduped.values()]);return sorted.forEach((log4,i3)=>{log4.value=i3}),sorted}async function loadAllProjectsMessageLogsProgressive(limit,initialEnrichCount=INITIAL_ENRICH_COUNT){let projectsDir=getProjectsDir2(),dirents;try{dirents=await readdir40(projectsDir,{withFileTypes:!0})}catch{return{logs:[],allStatLogs:[],nextIndex:0}}let projectDirs=dirents.filter(dirent=>dirent.isDirectory()).map(dirent=>join208(projectsDir,dirent.name)),rawLogs=[];for(let projectDir of projectDirs)rawLogs.push(...await getSessionFilesLite(projectDir,limit));let sorted=deduplicateLogsBySessionId(rawLogs),{logs:logs2,nextIndex}=await enrichLogs(sorted,0,initialEnrichCount);return logs2.forEach((log4,i3)=>{log4.value=i3}),{logs:logs2,allStatLogs:sorted,nextIndex}}async function loadSameRepoMessageLogs(worktreePaths,limit,initialEnrichCount=INITIAL_ENRICH_COUNT){return(await loadSameRepoMessageLogsProgressive(worktreePaths,limit,initialEnrichCount)).logs}async function loadSameRepoMessageLogsProgressive(worktreePaths,limit,initialEnrichCount=INITIAL_ENRICH_COUNT){logForDebugging(`/resume: loading sessions for cwd=${getOriginalCwd()}, worktrees=[${worktreePaths.join(", ")}]`);let allStatLogs=await getStatOnlyLogsForWorktrees(worktreePaths,limit);logForDebugging(`/resume: found ${allStatLogs.length} session files on disk`);let{logs:logs2,nextIndex}=await enrichLogs(allStatLogs,0,initialEnrichCount);return logs2.forEach((log4,i3)=>{log4.value=i3}),{logs:logs2,allStatLogs,nextIndex}}async function getStatOnlyLogsForWorktrees(worktreePaths,limit){let projectsDir=getProjectsDir2();if(worktreePaths.length<=1){let cwd6=getOriginalCwd(),projectDir=getProjectDir3(cwd6);return getSessionFilesLite(projectDir,void 0,cwd6)}let caseInsensitive=process.platform==="win32",indexed=worktreePaths.map(wt=>{let sanitized=sanitizePath2(wt);return{path:wt,prefix:caseInsensitive?sanitized.toLowerCase():sanitized}});indexed.sort((a2,b3)=>b3.prefix.length-a2.prefix.length);let allLogs=[],seenDirs=new Set,allDirents;try{allDirents=await readdir40(projectsDir,{withFileTypes:!0})}catch(e2){logForDebugging(`Failed to read projects dir ${projectsDir}, falling back to current project: ${e2}`);let projectDir=getProjectDir3(getOriginalCwd());return getSessionFilesLite(projectDir,limit,getOriginalCwd())}for(let dirent of allDirents){if(!dirent.isDirectory())continue;let dirName=caseInsensitive?dirent.name.toLowerCase():dirent.name;if(!seenDirs.has(dirName)){for(let{path:wtPath,prefix}of indexed)if(dirName===prefix||dirName.startsWith(prefix+"-")){seenDirs.add(dirName),allLogs.push(...await getSessionFilesLite(join208(projectsDir,dirent.name),void 0,wtPath));break}}}return deduplicateLogsBySessionId(allLogs)}async function getAgentTranscript(agentId){let agentFile=getAgentTranscriptPath(agentId);try{let{messages,agentContentReplacements}=await loadTranscriptFile(agentFile),agentMessages=Array.from(messages.values()).filter(msg=>msg.agentId===agentId&&msg.isSidechain);if(agentMessages.length===0)return null;let parentUuids=new Set(agentMessages.map(msg=>msg.parentUuid)),leafMessage=findLatestMessage(agentMessages,msg=>!parentUuids.has(msg.uuid));return leafMessage?{messages:buildConversationChain(messages,leafMessage).filter(msg=>msg.agentId===agentId).map(({isSidechain,parentUuid,...msg})=>msg),contentReplacements:agentContentReplacements.get(agentId)??[]}:null}catch{return null}}function extractAgentIdsFromMessages(messages){let agentIds=[];for(let message of messages)message.type==="progress"&&message.data&&typeof message.data=="object"&&"type"in message.data&&(message.data.type==="agent_progress"||message.data.type==="skill_progress")&&"agentId"in message.data&&typeof message.data.agentId=="string"&&agentIds.push(message.data.agentId);return uniq3(agentIds)}function extractTeammateTranscriptsFromTasks(tasks2){let transcripts={};for(let task of Object.values(tasks2))task.type==="in_process_teammate"&&task.identity?.agentId&&task.messages&&task.messages.length>0&&(transcripts[task.identity.agentId]=task.messages);return transcripts}async function loadSubagentTranscripts(agentIds){let results=await Promise.all(agentIds.map(async agentId=>{try{let result2=await getAgentTranscript(agentId);return result2&&result2.messages.length>0?{agentId,transcript:result2.messages}:null}catch{return null}})),transcripts={};for(let result2 of results)result2&&(transcripts[result2.agentId]=result2.transcript);return transcripts}async function loadAllSubagentTranscriptsFromDisk(){let subagentsDir=join208(getSessionProjectDir2()??getProjectDir3(getOriginalCwd()),getSessionId(),"subagents"),entries;try{entries=await readdir40(subagentsDir,{withFileTypes:!0})}catch{return{}}let agentIds=entries.filter(d=>d.isFile()&&d.name.startsWith("agent-")&&d.name.endsWith(".jsonl")).map(d=>d.name.slice(6,-6));return loadSubagentTranscripts(agentIds)}function isLoggableMessage(m3){return m3.type==="progress"||m3.type==="assistant"&&Array.isArray(m3.message.content)&&m3.message.content.length===1&&m3.message.content[0]?.type==="text"&&m3.message.content[0].text===NO_RESPONSE_REQUESTED?!1:m3.type==="attachment"&&getUserType()!=="ant"?!!(m3.attachment.type==="hook_additional_context"&&isEnvTruthy2(process.env.CLAUDE_CODE_SAVE_HOOK_ADDITIONAL_CONTEXT)):!0}function collectReplIds(messages){let ids=new Set;for(let m3 of messages)if(m3.type==="assistant"&&Array.isArray(m3.message.content))for(let b3 of m3.message.content)b3.type==="tool_use"&&b3.name===REPL_TOOL_NAME&&ids.add(b3.id);return ids}function transformMessagesForExternalTranscript(messages,replIds){return messages.flatMap(m3=>{if(m3.type==="assistant"&&Array.isArray(m3.message.content)){let content=m3.message.content,filtered=content.some(b3=>b3.type==="tool_use"&&b3.name===REPL_TOOL_NAME)?content.filter(b3=>!(b3.type==="tool_use"&&b3.name===REPL_TOOL_NAME)):content;if(filtered.length===0)return[];if(m3.isVirtual){let{isVirtual:_omit,...rest2}=m3;return[{...rest2,message:{...m3.message,content:filtered}}]}return filtered!==content?[{...m3,message:{...m3.message,content:filtered}}]:[m3]}if(m3.type==="user"&&Array.isArray(m3.message.content)){let content=m3.message.content,filtered=content.some(b3=>b3.type==="tool_result"&&replIds.has(b3.tool_use_id))?content.filter(b3=>!(b3.type==="tool_result"&&replIds.has(b3.tool_use_id))):content;if(filtered.length===0)return[];if(m3.isVirtual){let{isVirtual:_omit,...rest2}=m3;return[{...rest2,message:{...m3.message,content:filtered}}]}return filtered!==content?[{...m3,message:{...m3.message,content:filtered}}]:[m3]}if("isVirtual"in m3&&m3.isVirtual){let{isVirtual:_omit,...rest2}=m3;return[rest2]}return[m3]})}function cleanMessagesForLogging(messages,allMessages=messages){let filtered=messages.filter(isLoggableMessage);return getUserType()!=="ant"?transformMessagesForExternalTranscript(filtered,collectReplIds(allMessages)):filtered}async function getLogByIndex(index){return(await loadMessageLogs())[index]||null}async function findUnresolvedToolUse(toolUseId2){try{let transcriptPath=getTranscriptPath(),{messages}=await loadTranscriptFile(transcriptPath),toolUseMessage=null;for(let message of messages.values())if(message.type==="assistant"){let content=message.message.content;if(Array.isArray(content)){for(let block2 of content)if(block2.type==="tool_use"&&block2.id===toolUseId2){toolUseMessage=message;break}}}else if(message.type==="user"){let content=message.message.content;if(Array.isArray(content)){for(let block2 of content)if(block2.type==="tool_result"&&block2.tool_use_id===toolUseId2)return null}}return toolUseMessage}catch{return null}}async function getSessionFilesWithMtime(projectDir){let sessionFilesMap=new Map,dirents;try{dirents=await readdir40(projectDir,{withFileTypes:!0})}catch{return sessionFilesMap}let candidates=[];for(let dirent of dirents){if(!dirent.isFile()||!dirent.name.endsWith(".jsonl"))continue;let sessionId=validateUuid2(basename51(dirent.name,".jsonl"));sessionId&&candidates.push({sessionId,filePath:join208(projectDir,dirent.name)})}return await Promise.all(candidates.map(async({sessionId,filePath})=>{try{let st=await stat52(filePath);sessionFilesMap.set(sessionId,{path:filePath,mtime:st.mtime.getTime(),ctime:st.birthtime.getTime(),size:st.size})}catch{logForDebugging(`Failed to stat session file: ${filePath}`)}})),sessionFilesMap}async function loadAllLogsFromSessionFile(sessionFile,projectPathOverride){let{messages,summaries,customTitles,tags,agentNames,agentColors,agentSettings,prNumbers,prUrls,prRepositories,modes,fileHistorySnapshots,attributionSnapshots,contentReplacements,leafUuids}=await loadTranscriptFile(sessionFile,{keepAllLeaves:!0});if(messages.size===0)return[];let leafMessages=[],childrenByParent=new Map;for(let msg of messages.values())if(leafUuids.has(msg.uuid))leafMessages.push(msg);else if(msg.parentUuid){let siblings=childrenByParent.get(msg.parentUuid);siblings?siblings.push(msg):childrenByParent.set(msg.parentUuid,[msg])}let logs2=[];for(let leafMessage of leafMessages){let chain2=buildConversationChain(messages,leafMessage);if(chain2.length===0)continue;let trailingMessages=childrenByParent.get(leafMessage.uuid);trailingMessages&&(trailingMessages.sort((a2,b3)=>a2.timestamp<b3.timestamp?-1:a2.timestamp>b3.timestamp?1:0),chain2.push(...trailingMessages));let firstMessage=chain2[0],sessionId=leafMessage.sessionId;logs2.push({date:leafMessage.timestamp,messages:removeExtraFields(chain2),fullPath:sessionFile,value:0,created:new Date(firstMessage.timestamp),modified:new Date(leafMessage.timestamp),firstPrompt:extractFirstPrompt2(chain2),messageCount:countVisibleMessages(chain2),isSidechain:firstMessage.isSidechain??!1,sessionId,leafUuid:leafMessage.uuid,summary:summaries.get(leafMessage.uuid),customTitle:customTitles.get(sessionId),tag:tags.get(sessionId),agentName:agentNames.get(sessionId),agentColor:agentColors.get(sessionId),agentSetting:agentSettings.get(sessionId),mode:modes.get(sessionId),prNumber:prNumbers.get(sessionId),prUrl:prUrls.get(sessionId),prRepository:prRepositories.get(sessionId),gitBranch:leafMessage.gitBranch,projectPath:projectPathOverride??firstMessage.cwd,fileHistorySnapshots:buildFileHistorySnapshotChain(fileHistorySnapshots,chain2),attributionSnapshots:buildAttributionSnapshotChain(attributionSnapshots,chain2),contentReplacements:contentReplacements.get(sessionId)??[]})}return logs2}async function getLogsWithoutIndex(projectDir,limit){let sessionFilesMap=await getSessionFilesWithMtime(projectDir);if(sessionFilesMap.size===0)return[];let filesToProcess;limit&&sessionFilesMap.size>limit?filesToProcess=[...sessionFilesMap.values()].sort((a2,b3)=>b3.mtime-a2.mtime).slice(0,limit):filesToProcess=[...sessionFilesMap.values()];let logs2=[];for(let fileInfo of filesToProcess)try{let fileLogOptions=await loadAllLogsFromSessionFile(fileInfo.path);logs2.push(...fileLogOptions)}catch{logForDebugging(`Failed to load session file: ${fileInfo.path}`)}return logs2}async function readLiteMetadata(filePath,fileSize,buf){let{head:head2,tail:tail2}=await readHeadAndTail(filePath,fileSize,buf);if(!head2)return{firstPrompt:"",isSidechain:!1};let isSidechain=head2.includes('"isSidechain":true')||head2.includes('"isSidechain": true'),projectPath=extractJsonStringField(head2,"cwd"),teamName=extractJsonStringField(head2,"teamName"),agentSetting=extractJsonStringField(head2,"agentSetting"),firstPrompt=extractLastJsonStringField(tail2,"lastPrompt")||extractFirstPromptFromChunk(head2)||extractJsonStringFieldPrefix(head2,"content",200)||extractJsonStringFieldPrefix(head2,"text",200)||"",customTitle=extractLastJsonStringField(tail2,"customTitle")??extractLastJsonStringField(head2,"customTitle")??extractLastJsonStringField(tail2,"aiTitle")??extractLastJsonStringField(head2,"aiTitle"),summary=extractLastJsonStringField(tail2,"summary"),tag2=extractLastJsonStringField(tail2,"tag"),gitBranch=extractLastJsonStringField(tail2,"gitBranch")??extractJsonStringField(head2,"gitBranch"),prUrl=extractLastJsonStringField(tail2,"prUrl"),prRepository=extractLastJsonStringField(tail2,"prRepository"),prNumber,prNumStr=extractLastJsonStringField(tail2,"prNumber");if(prNumStr&&(prNumber=parseInt(prNumStr,10)||void 0),!prNumber){let prNumMatch=tail2.lastIndexOf('"prNumber":');if(prNumMatch>=0){let afterColon=tail2.slice(prNumMatch+11,prNumMatch+25),num2=parseInt(afterColon.trim(),10);num2>0&&(prNumber=num2)}}return{firstPrompt,gitBranch,isSidechain,projectPath,teamName,customTitle,summary,tag:tag2,agentSetting,prNumber,prUrl,prRepository}}function extractFirstPromptFromChunk(chunk3){let start=0,hasTickMessages=!1,firstCommandFallback="";for(;start<chunk3.length;){let newlineIdx=chunk3.indexOf(`
10117
- `,start),line=newlineIdx>=0?chunk3.slice(start,newlineIdx):chunk3.slice(start);if(start=newlineIdx>=0?newlineIdx+1:chunk3.length,!(!line.includes('"type":"user"')&&!line.includes('"type": "user"'))&&!line.includes('"tool_result"')&&!(line.includes('"isMeta":true')||line.includes('"isMeta": true')))try{let entry=jsonParse(line);if(entry.type!=="user")continue;let message=entry.message;if(!message)continue;let content=message.content,texts=[];if(typeof content=="string")texts.push(content);else if(Array.isArray(content))for(let block2 of content){let b3=block2;b3.type==="text"&&typeof b3.text=="string"&&texts.push(b3.text)}for(let text3 of texts){if(!text3)continue;let result2=text3.replace(/\n/g," ").trim(),commandNameTag=extractTag(result2,COMMAND_NAME_TAG);if(commandNameTag){let name=commandNameTag.replace(/^\//,""),commandArgs=extractTag(result2,"command-args")?.trim()||"";if(builtInCommandNames().has(name)||!commandArgs){firstCommandFallback||(firstCommandFallback=commandNameTag);continue}return commandArgs?`${commandNameTag} ${commandArgs}`:commandNameTag}let bashInput=extractTag(result2,"bash-input");if(bashInput)return`! ${bashInput}`;if(!SKIP_FIRST_PROMPT_PATTERN2.test(result2))return result2.length>200&&(result2=result2.slice(0,200).trim()+"\u2026"),result2}}catch{continue}}return firstCommandFallback||""}function extractJsonStringFieldPrefix(text3,key3,maxLen){let patterns=[`"${key3}":"`,`"${key3}": "`];for(let pattern of patterns){let idx=text3.indexOf(pattern);if(idx<0)continue;let valueStart=idx+pattern.length,i3=valueStart,collected=0;for(;i3<text3.length&&collected<maxLen;){if(text3[i3]==="\\"){i3+=2,collected++;continue}if(text3[i3]==='"')break;i3++,collected++}return text3.slice(valueStart,i3).replace(/\\n/g," ").replace(/\\t/g," ").trim()}return""}function deduplicateLogsBySessionId(logs2){let deduped=new Map;for(let log4 of logs2){if(!log4.sessionId)continue;let existing=deduped.get(log4.sessionId);(!existing||log4.modified.getTime()>existing.modified.getTime())&&deduped.set(log4.sessionId,log4)}return sortLogs([...deduped.values()]).map((log4,i3)=>({...log4,value:i3}))}async function getSessionFilesLite(projectDir,limit,projectPath){let entries=[...(await getSessionFilesWithMtime(projectDir)).entries()].sort((a2,b3)=>b3[1].mtime-a2[1].mtime);limit&&entries.length>limit&&(entries=entries.slice(0,limit));let logs2=[];for(let[sessionId,fileInfo]of entries)logs2.push({date:new Date(fileInfo.mtime).toISOString(),messages:[],isLite:!0,fullPath:fileInfo.path,value:0,created:new Date(fileInfo.ctime),modified:new Date(fileInfo.mtime),firstPrompt:"",messageCount:0,fileSize:fileInfo.size,isSidechain:!1,sessionId,projectPath});let sorted=sortLogs(logs2);return sorted.forEach((log4,i3)=>{log4.value=i3}),sorted}async function enrichLog(log4,readBuf){if(!log4.isLite||!log4.fullPath)return log4;let meta=await readLiteMetadata(log4.fullPath,log4.fileSize??0,readBuf),enriched={...log4,isLite:!1,firstPrompt:meta.firstPrompt,gitBranch:meta.gitBranch,isSidechain:meta.isSidechain,teamName:meta.teamName,customTitle:meta.customTitle,summary:meta.summary,tag:meta.tag,agentSetting:meta.agentSetting,prNumber:meta.prNumber,prUrl:meta.prUrl,prRepository:meta.prRepository,projectPath:meta.projectPath??log4.projectPath};return!enriched.firstPrompt&&!enriched.customTitle&&(enriched.firstPrompt="(session)"),enriched.isSidechain?(logForDebugging(`Session ${log4.sessionId} filtered from /resume: isSidechain=true`),null):enriched.teamName?(logForDebugging(`Session ${log4.sessionId} filtered from /resume: teamName=${enriched.teamName}`),null):enriched}async function enrichLogs(allLogs,startIndex,count4){let result2=[],readBuf=Buffer.alloc(LITE_READ_BUF_SIZE),i3=startIndex;for(;i3<allLogs.length&&result2.length<count4;){let log4=allLogs[i3];i3++;let enriched=await enrichLog(log4,readBuf);enriched&&result2.push(enriched)}let scanned=i3-startIndex,filtered=scanned-result2.length;return filtered>0&&logForDebugging(`/resume: enriched ${scanned} sessions, ${filtered} filtered out, ${result2.length} visible (${allLogs.length-i3} remaining on disk)`),{logs:result2,nextIndex:i3}}var VERSION5,v2ArchiveAppendQueues,v2ArchiveAppendFailuresForTests,MAX_TOMBSTONE_REWRITE_BYTES,SKIP_FIRST_PROMPT_PATTERN2,EPHEMERAL_PROGRESS_TYPES,MAX_TRANSCRIPT_READ_BYTES2,agentTranscriptSubdirs,agentMetadataWriteQueues,getProjectDir3,project2,cleanupRegistered4,REMOTE_FLUSH_INTERVAL_MS,Project,lastTurnSummaryWritten,METADATA_TYPE_MARKERS,METADATA_MARKER_BUFS,METADATA_PREFIX_BOUND,getSessionMessages,INITIAL_ENRICH_COUNT,init_sessionStorage=__esm({"src/utils/sessionStorage.ts"(){init_memoize();init_analytics();init_state();init_commands2();init_branding();init_xml();init_growthbook();init_sessionIngress();init_secretRedact();init_transcriptFlushCursor();init_constants17();init_ids();init_sessionAgentMetadata();init_logs();init_v2ArchiveCodec();init_array4();init_cleanupRegistry();init_concurrentSessions();init_cwd2();init_debug();init_diagLogs();init_bridge();init_session();init_envUtils();init_errors2();init_boundaryV2();init_fileHistorySnapshotLog();init_format2();init_fsOperations();init_getWorktreePaths();init_git();init_gracefulShutdown();init_json();init_log3();init_messages4();init_path2();init_resumeConsistency();init_resumeTranscriptSelect();init_heapLiveMessages();init_transcriptWriteSet();init_sessionStoragePortable();init_settings2();init_slowOperations();init_uuid2();VERSION5=typeof MACRO<"u"?"13.9.1":APP_VERSION,v2ArchiveAppendQueues=new Map,v2ArchiveAppendFailuresForTests=0,MAX_TOMBSTONE_REWRITE_BYTES=50*1024*1024,SKIP_FIRST_PROMPT_PATTERN2=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;__name(isTranscriptMessage,"isTranscriptMessage");__name(isChainParticipant,"isChainParticipant");__name(isLegacyProgressEntry,"isLegacyProgressEntry");EPHEMERAL_PROGRESS_TYPES=new Set(["bash_progress","powershell_progress","mcp_progress"]);__name(isEphemeralToolProgress,"isEphemeralToolProgress");__name(getProjectsDir2,"getProjectsDir");__name(getTranscriptPath,"getTranscriptPath");__name(getSessionSidecarPath,"getSessionSidecarPath");__name(getSessionSidecarPathForSession,"getSessionSidecarPathForSession");__name(getTranscriptPathForSession,"getTranscriptPathForSession");MAX_TRANSCRIPT_READ_BYTES2=50*1024*1024,agentTranscriptSubdirs=new Map;__name(setAgentTranscriptSubdir,"setAgentTranscriptSubdir");__name(clearAgentTranscriptSubdir,"clearAgentTranscriptSubdir");__name(getAgentTranscriptPath,"getAgentTranscriptPath");__name(getAgentMetadataPath,"getAgentMetadataPath");agentMetadataWriteQueues=new Map;__name(enqueueAgentMetadataWrite,"enqueueAgentMetadataWrite");__name(writeAgentMetadata,"writeAgentMetadata");__name(updateAgentMetadata,"updateAgentMetadata");__name(readAgentMetadata,"readAgentMetadata");__name(getRemoteAgentsDir,"getRemoteAgentsDir");__name(getRemoteAgentMetadataPath,"getRemoteAgentMetadataPath");__name(writeRemoteAgentMetadata,"writeRemoteAgentMetadata");__name(readRemoteAgentMetadata,"readRemoteAgentMetadata");__name(deleteRemoteAgentMetadata,"deleteRemoteAgentMetadata");__name(listRemoteAgentMetadata,"listRemoteAgentMetadata");__name(sessionIdExists,"sessionIdExists");__name(getNodeEnv,"getNodeEnv");__name(shouldSkipSessionPersistence,"shouldSkipSessionPersistence");__name(getUserType,"getUserType");__name(getEntrypoint,"getEntrypoint");__name(isCustomTitleEnabled,"isCustomTitleEnabled");getProjectDir3=memoize_default(projectDir=>join208(getProjectsDir2(),sanitizePath2(projectDir))),project2=null,cleanupRegistered4=!1;__name(getProject,"getProject");__name(resetProjectFlushStateForTesting,"resetProjectFlushStateForTesting");__name(resetProjectForTesting,"resetProjectForTesting");__name(setSessionFileForTesting,"setSessionFileForTesting");__name(setInternalEventWriter,"setInternalEventWriter");__name(setInternalEventReader,"setInternalEventReader");__name(setRemoteIngressUrlForTesting,"setRemoteIngressUrlForTesting");REMOTE_FLUSH_INTERVAL_MS=10,Project=class{static{__name(this,"Project")}currentSessionTag;currentSessionTitle;currentSessionAgentName;currentSessionAgentColor;currentSessionLastPrompt;currentSessionAgentSetting;currentSessionMode;currentSessionWorktree;currentSessionPrNumber;currentSessionPrUrl;currentSessionPrRepository;currentBranchId="main";sessionFile=null;pendingEntries=[];remoteIngressUrl=null;internalEventWriter=null;internalEventReader=null;internalSubagentEventReader=null;pendingWriteCount=0;flushResolvers=[];writeQueues=new Map;flushTimer=null;activeDrain=null;FLUSH_INTERVAL_MS=100;fileHistoryLogState=createFileHistorySnapshotLogState();MAX_CHUNK_BYTES=100*1024*1024;constructor(){}_resetFlushState(){this.pendingWriteCount=0,this.flushResolvers=[],this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=null,this.activeDrain=null,this.writeQueues=new Map}incrementPendingWrites(){this.pendingWriteCount++}decrementPendingWrites(){if(this.pendingWriteCount--,this.pendingWriteCount===0){for(let resolve67 of this.flushResolvers)resolve67();this.flushResolvers=[]}}async trackWrite(fn){this.incrementPendingWrites();try{return await fn()}finally{this.decrementPendingWrites()}}enqueueWrite(filePath,entry){return new Promise(resolve67=>{let queue2=this.writeQueues.get(filePath);queue2||(queue2=[],this.writeQueues.set(filePath,queue2)),queue2.push({entry,resolve:resolve67}),this.scheduleDrain()})}scheduleDrain(){this.flushTimer||(this.flushTimer=setTimeout(async()=>{this.flushTimer=null,this.activeDrain=this.drainWriteQueue(),await this.activeDrain,this.activeDrain=null,this.writeQueues.size>0&&this.scheduleDrain()},this.FLUSH_INTERVAL_MS))}async appendToFile(filePath,data){try{await fsAppendFile(filePath,data,{mode:384})}catch{await mkdir67(dirname85(filePath),{recursive:!0,mode:448}),await fsAppendFile(filePath,data,{mode:384})}}async drainWriteQueue(){for(let[filePath,queue2]of this.writeQueues){if(queue2.length===0)continue;let batch2=queue2.splice(0),content="",resolvers=[];for(let{entry,resolve:resolve67}of batch2){let line=jsonStringify(redactTranscriptEntry(entry))+`
10117
+ `,start),line=newlineIdx>=0?chunk3.slice(start,newlineIdx):chunk3.slice(start);if(start=newlineIdx>=0?newlineIdx+1:chunk3.length,!(!line.includes('"type":"user"')&&!line.includes('"type": "user"'))&&!line.includes('"tool_result"')&&!(line.includes('"isMeta":true')||line.includes('"isMeta": true')))try{let entry=jsonParse(line);if(entry.type!=="user")continue;let message=entry.message;if(!message)continue;let content=message.content,texts=[];if(typeof content=="string")texts.push(content);else if(Array.isArray(content))for(let block2 of content){let b3=block2;b3.type==="text"&&typeof b3.text=="string"&&texts.push(b3.text)}for(let text3 of texts){if(!text3)continue;let result2=text3.replace(/\n/g," ").trim(),commandNameTag=extractTag(result2,COMMAND_NAME_TAG);if(commandNameTag){let name=commandNameTag.replace(/^\//,""),commandArgs=extractTag(result2,"command-args")?.trim()||"";if(builtInCommandNames().has(name)||!commandArgs){firstCommandFallback||(firstCommandFallback=commandNameTag);continue}return commandArgs?`${commandNameTag} ${commandArgs}`:commandNameTag}let bashInput=extractTag(result2,"bash-input");if(bashInput)return`! ${bashInput}`;if(!SKIP_FIRST_PROMPT_PATTERN2.test(result2))return result2.length>200&&(result2=result2.slice(0,200).trim()+"\u2026"),result2}}catch{continue}}return firstCommandFallback||""}function extractJsonStringFieldPrefix(text3,key3,maxLen){let patterns=[`"${key3}":"`,`"${key3}": "`];for(let pattern of patterns){let idx=text3.indexOf(pattern);if(idx<0)continue;let valueStart=idx+pattern.length,i3=valueStart,collected=0;for(;i3<text3.length&&collected<maxLen;){if(text3[i3]==="\\"){i3+=2,collected++;continue}if(text3[i3]==='"')break;i3++,collected++}return text3.slice(valueStart,i3).replace(/\\n/g," ").replace(/\\t/g," ").trim()}return""}function deduplicateLogsBySessionId(logs2){let deduped=new Map;for(let log4 of logs2){if(!log4.sessionId)continue;let existing=deduped.get(log4.sessionId);(!existing||log4.modified.getTime()>existing.modified.getTime())&&deduped.set(log4.sessionId,log4)}return sortLogs([...deduped.values()]).map((log4,i3)=>({...log4,value:i3}))}async function getSessionFilesLite(projectDir,limit,projectPath){let entries=[...(await getSessionFilesWithMtime(projectDir)).entries()].sort((a2,b3)=>b3[1].mtime-a2[1].mtime);limit&&entries.length>limit&&(entries=entries.slice(0,limit));let logs2=[];for(let[sessionId,fileInfo]of entries)logs2.push({date:new Date(fileInfo.mtime).toISOString(),messages:[],isLite:!0,fullPath:fileInfo.path,value:0,created:new Date(fileInfo.ctime),modified:new Date(fileInfo.mtime),firstPrompt:"",messageCount:0,fileSize:fileInfo.size,isSidechain:!1,sessionId,projectPath});let sorted=sortLogs(logs2);return sorted.forEach((log4,i3)=>{log4.value=i3}),sorted}async function enrichLog(log4,readBuf){if(!log4.isLite||!log4.fullPath)return log4;let meta=await readLiteMetadata(log4.fullPath,log4.fileSize??0,readBuf),enriched={...log4,isLite:!1,firstPrompt:meta.firstPrompt,gitBranch:meta.gitBranch,isSidechain:meta.isSidechain,teamName:meta.teamName,customTitle:meta.customTitle,summary:meta.summary,tag:meta.tag,agentSetting:meta.agentSetting,prNumber:meta.prNumber,prUrl:meta.prUrl,prRepository:meta.prRepository,projectPath:meta.projectPath??log4.projectPath};return!enriched.firstPrompt&&!enriched.customTitle&&(enriched.firstPrompt="(session)"),enriched.isSidechain?(logForDebugging(`Session ${log4.sessionId} filtered from /resume: isSidechain=true`),null):enriched.teamName?(logForDebugging(`Session ${log4.sessionId} filtered from /resume: teamName=${enriched.teamName}`),null):enriched}async function enrichLogs(allLogs,startIndex,count4){let result2=[],readBuf=Buffer.alloc(LITE_READ_BUF_SIZE),i3=startIndex;for(;i3<allLogs.length&&result2.length<count4;){let log4=allLogs[i3];i3++;let enriched=await enrichLog(log4,readBuf);enriched&&result2.push(enriched)}let scanned=i3-startIndex,filtered=scanned-result2.length;return filtered>0&&logForDebugging(`/resume: enriched ${scanned} sessions, ${filtered} filtered out, ${result2.length} visible (${allLogs.length-i3} remaining on disk)`),{logs:result2,nextIndex:i3}}var VERSION5,v2ArchiveAppendQueues,v2ArchiveAppendFailuresForTests,MAX_TOMBSTONE_REWRITE_BYTES,SKIP_FIRST_PROMPT_PATTERN2,EPHEMERAL_PROGRESS_TYPES,MAX_TRANSCRIPT_READ_BYTES2,agentTranscriptSubdirs,agentMetadataWriteQueues,getProjectDir3,project2,cleanupRegistered4,REMOTE_FLUSH_INTERVAL_MS,Project,lastTurnSummaryWritten,METADATA_TYPE_MARKERS,METADATA_MARKER_BUFS,METADATA_PREFIX_BOUND,getSessionMessages,INITIAL_ENRICH_COUNT,init_sessionStorage=__esm({"src/utils/sessionStorage.ts"(){init_memoize();init_analytics();init_state();init_commands2();init_branding();init_xml();init_growthbook();init_sessionIngress();init_secretRedact();init_transcriptFlushCursor();init_constants17();init_ids();init_sessionAgentMetadata();init_logs();init_v2ArchiveCodec();init_array4();init_cleanupRegistry();init_concurrentSessions();init_cwd2();init_debug();init_diagLogs();init_bridge();init_session();init_envUtils();init_errors2();init_boundaryV2();init_fileHistorySnapshotLog();init_format2();init_fsOperations();init_getWorktreePaths();init_git();init_gracefulShutdown();init_json();init_log3();init_messages4();init_path2();init_resumeConsistency();init_resumeTranscriptSelect();init_heapLiveMessages();init_transcriptWriteSet();init_sessionStoragePortable();init_settings2();init_slowOperations();init_uuid2();VERSION5=typeof MACRO<"u"?"13.9.2":APP_VERSION,v2ArchiveAppendQueues=new Map,v2ArchiveAppendFailuresForTests=0,MAX_TOMBSTONE_REWRITE_BYTES=50*1024*1024,SKIP_FIRST_PROMPT_PATTERN2=/^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;__name(isTranscriptMessage,"isTranscriptMessage");__name(isChainParticipant,"isChainParticipant");__name(isLegacyProgressEntry,"isLegacyProgressEntry");EPHEMERAL_PROGRESS_TYPES=new Set(["bash_progress","powershell_progress","mcp_progress"]);__name(isEphemeralToolProgress,"isEphemeralToolProgress");__name(getProjectsDir2,"getProjectsDir");__name(getTranscriptPath,"getTranscriptPath");__name(getSessionSidecarPath,"getSessionSidecarPath");__name(getSessionSidecarPathForSession,"getSessionSidecarPathForSession");__name(getTranscriptPathForSession,"getTranscriptPathForSession");MAX_TRANSCRIPT_READ_BYTES2=50*1024*1024,agentTranscriptSubdirs=new Map;__name(setAgentTranscriptSubdir,"setAgentTranscriptSubdir");__name(clearAgentTranscriptSubdir,"clearAgentTranscriptSubdir");__name(getAgentTranscriptPath,"getAgentTranscriptPath");__name(getAgentMetadataPath,"getAgentMetadataPath");agentMetadataWriteQueues=new Map;__name(enqueueAgentMetadataWrite,"enqueueAgentMetadataWrite");__name(writeAgentMetadata,"writeAgentMetadata");__name(updateAgentMetadata,"updateAgentMetadata");__name(readAgentMetadata,"readAgentMetadata");__name(getRemoteAgentsDir,"getRemoteAgentsDir");__name(getRemoteAgentMetadataPath,"getRemoteAgentMetadataPath");__name(writeRemoteAgentMetadata,"writeRemoteAgentMetadata");__name(readRemoteAgentMetadata,"readRemoteAgentMetadata");__name(deleteRemoteAgentMetadata,"deleteRemoteAgentMetadata");__name(listRemoteAgentMetadata,"listRemoteAgentMetadata");__name(sessionIdExists,"sessionIdExists");__name(getNodeEnv,"getNodeEnv");__name(shouldSkipSessionPersistence,"shouldSkipSessionPersistence");__name(getUserType,"getUserType");__name(getEntrypoint,"getEntrypoint");__name(isCustomTitleEnabled,"isCustomTitleEnabled");getProjectDir3=memoize_default(projectDir=>join208(getProjectsDir2(),sanitizePath2(projectDir))),project2=null,cleanupRegistered4=!1;__name(getProject,"getProject");__name(resetProjectFlushStateForTesting,"resetProjectFlushStateForTesting");__name(resetProjectForTesting,"resetProjectForTesting");__name(setSessionFileForTesting,"setSessionFileForTesting");__name(setInternalEventWriter,"setInternalEventWriter");__name(setInternalEventReader,"setInternalEventReader");__name(setRemoteIngressUrlForTesting,"setRemoteIngressUrlForTesting");REMOTE_FLUSH_INTERVAL_MS=10,Project=class{static{__name(this,"Project")}currentSessionTag;currentSessionTitle;currentSessionAgentName;currentSessionAgentColor;currentSessionLastPrompt;currentSessionAgentSetting;currentSessionMode;currentSessionWorktree;currentSessionPrNumber;currentSessionPrUrl;currentSessionPrRepository;currentBranchId="main";sessionFile=null;pendingEntries=[];remoteIngressUrl=null;internalEventWriter=null;internalEventReader=null;internalSubagentEventReader=null;pendingWriteCount=0;flushResolvers=[];writeQueues=new Map;flushTimer=null;activeDrain=null;FLUSH_INTERVAL_MS=100;fileHistoryLogState=createFileHistorySnapshotLogState();MAX_CHUNK_BYTES=100*1024*1024;constructor(){}_resetFlushState(){this.pendingWriteCount=0,this.flushResolvers=[],this.flushTimer&&clearTimeout(this.flushTimer),this.flushTimer=null,this.activeDrain=null,this.writeQueues=new Map}incrementPendingWrites(){this.pendingWriteCount++}decrementPendingWrites(){if(this.pendingWriteCount--,this.pendingWriteCount===0){for(let resolve67 of this.flushResolvers)resolve67();this.flushResolvers=[]}}async trackWrite(fn){this.incrementPendingWrites();try{return await fn()}finally{this.decrementPendingWrites()}}enqueueWrite(filePath,entry){return new Promise(resolve67=>{let queue2=this.writeQueues.get(filePath);queue2||(queue2=[],this.writeQueues.set(filePath,queue2)),queue2.push({entry,resolve:resolve67}),this.scheduleDrain()})}scheduleDrain(){this.flushTimer||(this.flushTimer=setTimeout(async()=>{this.flushTimer=null,this.activeDrain=this.drainWriteQueue(),await this.activeDrain,this.activeDrain=null,this.writeQueues.size>0&&this.scheduleDrain()},this.FLUSH_INTERVAL_MS))}async appendToFile(filePath,data){try{await fsAppendFile(filePath,data,{mode:384})}catch{await mkdir67(dirname85(filePath),{recursive:!0,mode:448}),await fsAppendFile(filePath,data,{mode:384})}}async drainWriteQueue(){for(let[filePath,queue2]of this.writeQueues){if(queue2.length===0)continue;let batch2=queue2.splice(0),content="",resolvers=[];for(let{entry,resolve:resolve67}of batch2){let line=jsonStringify(redactTranscriptEntry(entry))+`
10118
10118
  `;if(noteSerializedTranscriptEntry(filePath,entry),content.length+line.length>=this.MAX_CHUNK_BYTES){await this.appendToFile(filePath,content);for(let r2 of resolvers)r2();resolvers.length=0,content=""}content+=line,resolvers.push(resolve67)}if(content.length>0){await this.appendToFile(filePath,content);for(let r2 of resolvers)r2()}}for(let[filePath,queue2]of this.writeQueues)queue2.length===0&&this.writeQueues.delete(filePath);try{releaseLivePayloadsAfterStage()}catch{}}resetSessionFile(){this.sessionFile=null,this.pendingEntries=[]}reAppendSessionMetadata(skipTitleRefresh=!1){if(!this.sessionFile)return;let sessionId=getSessionId();if(!sessionId)return;let tailLines=readFileTailSync(this.sessionFile).split(`
10119
10119
  `);if(!skipTitleRefresh){let titleLine=tailLines.findLast(l=>l.startsWith('{"type":"custom-title"'));if(titleLine){let tailTitle=extractLastJsonStringField(titleLine,"customTitle");tailTitle!==void 0&&(this.currentSessionTitle=tailTitle||void 0)}}let tagLine=tailLines.findLast(l=>l.startsWith('{"type":"tag"'));if(tagLine){let tailTag=extractLastJsonStringField(tagLine,"tag");tailTag!==void 0&&(this.currentSessionTag=tailTag||void 0)}this.currentSessionLastPrompt&&appendEntryToFile(this.sessionFile,{type:"last-prompt",lastPrompt:this.currentSessionLastPrompt,sessionId}),this.currentSessionTitle&&appendEntryToFile(this.sessionFile,{type:"custom-title",customTitle:this.currentSessionTitle,sessionId}),this.currentSessionTag&&appendEntryToFile(this.sessionFile,{type:"tag",tag:this.currentSessionTag,sessionId}),this.currentSessionAgentName&&appendEntryToFile(this.sessionFile,{type:"agent-name",agentName:this.currentSessionAgentName,sessionId}),this.currentSessionAgentColor&&appendEntryToFile(this.sessionFile,{type:"agent-color",agentColor:this.currentSessionAgentColor,sessionId}),this.currentSessionAgentSetting&&appendEntryToFile(this.sessionFile,{type:"agent-setting",agentSetting:this.currentSessionAgentSetting,sessionId}),this.currentSessionMode&&appendEntryToFile(this.sessionFile,{type:"mode",mode:this.currentSessionMode,sessionId}),this.currentSessionWorktree!==void 0&&appendEntryToFile(this.sessionFile,{type:"worktree-state",worktreeSession:this.currentSessionWorktree,sessionId}),this.currentSessionPrNumber!==void 0&&this.currentSessionPrUrl&&this.currentSessionPrRepository&&appendEntryToFile(this.sessionFile,{type:"pr-link",sessionId,prNumber:this.currentSessionPrNumber,prUrl:this.currentSessionPrUrl,prRepository:this.currentSessionPrRepository,timestamp:new Date().toISOString()})}async flush(){if(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null),this.activeDrain&&await this.activeDrain,await this.drainWriteQueue(),this.pendingWriteCount!==0)return new Promise(resolve67=>{this.flushResolvers.push(resolve67)})}async removeMessageByUuid(targetUuid){return this.trackWrite(async()=>{if(this.sessionFile!==null)try{let fileSize=0,fh=await fsOpen2(this.sessionFile,"r+");try{let{size:size2}=await fh.stat();if(fileSize=size2,size2===0)return;let chunkLen=Math.min(size2,LITE_READ_BUF_SIZE),tailStart=size2-chunkLen,buf=Buffer.allocUnsafe(chunkLen),{bytesRead}=await fh.read(buf,0,chunkLen,tailStart),tail2=buf.subarray(0,bytesRead),needle=`"uuid":"${targetUuid}"`,matchIdx=tail2.lastIndexOf(needle);if(matchIdx>=0){let prevNl=tail2.lastIndexOf(10,matchIdx);if(prevNl>=0||tailStart===0){let lineStart=prevNl+1,nextNl=tail2.indexOf(10,matchIdx+needle.length),lineEnd=nextNl>=0?nextNl+1:bytesRead,absLineStart=tailStart+lineStart,afterLen=bytesRead-lineEnd;await fh.truncate(absLineStart),afterLen>0&&await fh.write(tail2,lineEnd,afterLen,absLineStart);return}}}finally{await fh.close()}if(fileSize>MAX_TOMBSTONE_REWRITE_BYTES){logForDebugging(`Skipping tombstone removal: session file too large (${formatFileSize(fileSize)})`,{level:"warn"});return}let lines=(await readFile71(this.sessionFile,{encoding:"utf-8"})).split(`
10120
10120
  `).filter(line=>{if(!line.trim())return!0;try{return jsonParse(line).uuid!==targetUuid}catch{return!0}});await writeFileAtomically(this.sessionFile,lines.join(`
@@ -10914,7 +10914,7 @@ ${ban}`)}}catch{}commitResultUsage(),yield{type:"result",subtype:"success",is_er
10914
10914
  `),stopReason="end_turn";if(state5.onPrompt){let hooked=await state5.onPrompt({sessionId,prompt:promptText,notify:emit3,requestClient:state5.requestClient});hooked&&(responseText=hooked.text,stopReason=hooked.stopReason??"end_turn");let ms=refreshAndEmitAcpRouteChrome(emit3,session2.currentModelId);session2.currentModelId=ms.currentModelId,state5.modelState=ms}return!state5.onPrompt&&responseText&&emit3("session/update",{sessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:responseText}}}),{jsonrpc:"2.0",id,result:{stopReason:stopReason==="error"?"refusal":stopReason==="end_turn"||stopReason==="cancelled"||stopReason==="max_tokens"?stopReason:"end_turn",_meta:{clavue:{bridge:state5.onPrompt?"hooked":"thin",sessionId,promptCount:session2.prompts.length}}}}}finally{id!==null&&state5.inflightPromptIds.delete(id)}}case"session/cancel":{let cancelParams=isObject10(request.params)?request.params:{},cancelSessionId=String(typeof cancelParams.sessionId=="string"?cancelParams.sessionId:typeof cancelParams.session_id=="string"?cancelParams.session_id:"").trim();return cancelSessionId?state5.messageStore?.cancelTurn?.(cancelSessionId,"session cancelled"):state5.messageStore?.cancelAllTurns?.("session cancelled"),{jsonrpc:"2.0",id,result:{}}}case"session/close":return{jsonrpc:"2.0",id,...handleAcpSessionClose(state5,request.params)};case"session/delete":return{jsonrpc:"2.0",id,...handleAcpSessionDelete(state5,request.params)};case"logout":return{jsonrpc:"2.0",id,...handleAcpLogout()};case"shutdown":return state5.messageStore?.cancelAllTurns?.("shutdown"),state5.sessions.clear(),state5.initialized=!1,state5.inflightPromptIds.clear(),{jsonrpc:"2.0",id,result:{ok:!0}};default:return isAcpRewindMethod(request.method)?handleAcpRewindRequest(state5,request,id,emit3):{jsonrpc:"2.0",id,error:{code:-32601,message:`Method not found: ${request.method}`}}}}catch(error40){return{jsonrpc:"2.0",id,error:{code:-32e3,message:error40 instanceof Error?error40.message:String(error40)}}}}async function handleAcpRewindRequest(state5,request,id,emit3){let kind=acpRewindMethodName(request.method),params=isObject10(request.params)?request.params:{},sessionId=typeof params.sessionId=="string"?params.sessionId:typeof params.session_id=="string"?params.session_id:"",session2=state5.sessions.get(sessionId);if(!session2)return{jsonrpc:"2.0",id,error:{code:-32001,message:`Unknown session: ${sessionId}`}};if(kind==="points"){let result2=buildAcpRewindPoints(session2.prompts);return{jsonrpc:"2.0",id,result:result2}}if(kind==="execute"){let targetPromptIndex=Number(params.targetPromptIndex??params.target_prompt_index??0),force=params.force===!0,mode2=normalizeAcpRewindMode(params.mode),durableId=resolveDurableSessionId(session2);await activateClavueSessionIdentity(durableId);let result2=await handleAcpRewindExecute({session:{sessionId:session2.sessionId,prompts:session2.prompts,durableSessionId:durableId,cwd:state5.cwd},targetPromptIndex,force,mode:mode2,messageStore:state5.messageStore,durableSessionId:durableId});return force&&result2.success&&emit3("_x.ai/session_notification",{sessionId,update:{sessionUpdate:"rewind_marker",target_prompt_index:result2.targetPromptIndex,created_at:new Date().toISOString()}}),{jsonrpc:"2.0",id,result:result2}}return{jsonrpc:"2.0",id,error:{code:-32601,message:`Method not found: ${request.method}`}}}function extractAcpPromptText(prompt){return typeof prompt=="string"?prompt.trim():Array.isArray(prompt)?prompt.map(block2=>{if(typeof block2=="string")return block2;if(isObject10(block2)){if(typeof block2.text=="string")return block2.text;if(isObject10(block2.content)&&typeof block2.content.text=="string")return block2.content.text}return""}).filter(Boolean).join(`
10915
10915
  `).trim():isObject10(prompt)&&typeof prompt.text=="string"?prompt.text.trim():""}function parseAcpLine(line){let trimmed=line.trim();if(!trimmed)return null;let parsed=JSON.parse(trimmed);if(!isObject10(parsed)||parsed.jsonrpc!=="2.0"||typeof parsed.method!="string")throw new Error("Invalid JSON-RPC 2.0 request");return parsed}async function runAcpStdioServer(options={}){let stdin=options.input??input,stdout=options.output??output,writeLine=__name(line=>{stdout.write(`${line}
10916
10916
  `)},"writeLine"),write=__name(response=>{writeLine(JSON.stringify(response))},"write"),notifyDefault=__name(notification=>{writeLine(JSON.stringify(notification))},"notifyDefault"),{createAcpClientRpc:createAcpClientRpc2}=await Promise.resolve().then(()=>(init_acpClientRpc(),acpClientRpc_exports)),clientRpc=createAcpClientRpc2(writeLine),requestClient=options.requestClient??clientRpc.request.bind(clientRpc),bridgeSubagents=createAcpSubagentRegistry((method2,params)=>{notifyDefault({jsonrpc:"2.0",method:method2,params})}),cwd6=options.cwd??process.cwd(),makeRunSubagentChild=__name(executeEnabled=>{if(executeEnabled)return async(spec,childSessionId)=>{let{executeAcpPromptHeadless:executeAcpPromptHeadless2}=await Promise.resolve().then(()=>(init_acpHeadlessExecutor(),acpHeadlessExecutor_exports)),childPrompt=[`[Clavue subagent type=${spec.subagentType}`+(spec.role?` role=${spec.role}`:"")+(spec.model?` model=${spec.model}`:"")+` id=${childSessionId}]`,"Complete the task succinctly. Prefer tools over speculation.","",spec.prompt].join(`
10917
- `);return(await executeAcpPromptHeadless2({prompt:childPrompt,cwd:cwd6,maxTurns:6,permissionMode:"acceptEdits",sessionId:childSessionId,env:{...process.env,...spec.model?{CLAVUE_MODEL:spec.model}:{},CLAVUE_ACP_SUBAGENT:"1",CLAVUE_ACP_SUBAGENT_TYPE:spec.subagentType}})).text}},"makeRunSubagentChild"),bridgeHolder={state:null},state5=options.state;if(!state5){let{resolveAcpExecuteMode:resolveAcpExecuteMode2}=await Promise.resolve().then(()=>(init_acpInProcessExecutor(),acpInProcessExecutor_exports)),mode2=options.executeMode??(options.execute===!0?process.env.CLAVUE_ACP_EXECUTE_MODE?.toLowerCase()==="subprocess"?"subprocess":"inprocess":resolveAcpExecuteMode2()),runSubagentChild=makeRunSubagentChild(mode2==="inprocess"||mode2==="subprocess"),resolveSessionPermissionMode=__name(sessionId=>bridgeHolder.state?.sessions.get(sessionId)?.permissionMode??"auto","resolveSessionPermissionMode");if(mode2==="inprocess"){let{createAcpInProcessSessionStore:createAcpInProcessSessionStore2,executeAcpPromptInProcess:executeAcpPromptInProcess2}=await Promise.resolve().then(()=>(init_acpInProcessExecutor(),acpInProcessExecutor_exports)),{bindSessionNotify:bindSessionNotify2}=await Promise.resolve().then(()=>(init_acpSessionNotify(),acpSessionNotify_exports)),sessionStore=createAcpInProcessSessionStore2();state5=createAcpBridgeState({notify:notifyDefault,requestClient,messageStore:sessionStore,cwd:cwd6,subagents:bridgeSubagents,runSubagentChild,onPrompt:__name(async({sessionId,prompt,notify:notify2,requestClient:rc})=>{let nestedNotify=bindSessionNotify2(sessionId,notify2),permissionMode=resolveSessionPermissionMode(sessionId),runTurn=__name(turnPrompt=>executeAcpPromptInProcess2({sessionId,prompt:turnPrompt,cwd:cwd6,notify:nestedNotify,requestClient:rc??requestClient,sessionStore,subagents:bridgeSubagents,permissionMode}),"runTurn"),first=await runTurn(prompt),{finalizeAcpGoalAfterExecuteTurn:finalizeAcpGoalAfterExecuteTurn2}=await Promise.resolve().then(()=>(init_acpGoal(),acpGoal_exports)),settled=await finalizeAcpGoalAfterExecuteTurn2({cwd:cwd6,sessionId,notify:notify2,result:first,subagents:bridgeSubagents,runContinuation:__name(nextInput=>runTurn(nextInput),"runContinuation")});return{text:settled.result.text,stopReason:settled.result.stopReason,toolCalls:settled.result.toolCalls}},"onPrompt")})}else if(mode2==="subprocess"){let{executeAcpPromptHeadless:executeAcpPromptHeadless2}=await Promise.resolve().then(()=>(init_acpHeadlessExecutor(),acpHeadlessExecutor_exports)),{bindSessionNotify:bindSessionNotify2}=await Promise.resolve().then(()=>(init_acpSessionNotify(),acpSessionNotify_exports));state5=createAcpBridgeState({notify:notifyDefault,requestClient,cwd:cwd6,subagents:bridgeSubagents,runSubagentChild,onPrompt:__name(async({sessionId,prompt,notify:notify2})=>{let nestedNotify=bindSessionNotify2(sessionId,notify2),permissionMode=resolveSessionPermissionMode(sessionId),runTurn=__name(turnPrompt=>executeAcpPromptHeadless2({prompt:turnPrompt,cwd:cwd6,notify:nestedNotify,sessionId,subagents:bridgeSubagents,permissionMode}),"runTurn"),first=await runTurn(prompt),{finalizeAcpGoalAfterExecuteTurn:finalizeAcpGoalAfterExecuteTurn2}=await Promise.resolve().then(()=>(init_acpGoal(),acpGoal_exports)),settled=await finalizeAcpGoalAfterExecuteTurn2({cwd:cwd6,sessionId,notify:notify2,result:first,subagents:bridgeSubagents,runContinuation:__name(nextInput=>runTurn(nextInput),"runContinuation")});return{text:settled.result.text,stopReason:settled.result.stopReason,toolCalls:settled.result.toolCalls}},"onPrompt")})}else state5=createAcpBridgeState({notify:notifyDefault,requestClient,cwd:cwd6,subagents:bridgeSubagents})}bridgeHolder.state=state5;let rl=createInterface6({input:stdin,crlfDelay:1/0});state5.notify||(state5.notify=notifyDefault),state5.requestClient||(state5.requestClient=requestClient),state5.subagents||(state5.subagents=bridgeSubagents);let inFlight=new Set,shuttingDown=!1;for await(let line of rl){let obj;try{let trimmed=String(line).trim();if(!trimmed)continue;let parsed=JSON.parse(trimmed);if(!isObject10(parsed)||parsed.jsonrpc!=="2.0")throw new Error("Invalid JSON-RPC 2.0 message");obj=parsed}catch(error40){write({jsonrpc:"2.0",id:null,error:{code:-32700,message:error40 instanceof Error?error40.message:"Parse error"}});continue}if(clientRpc.handleResponseLine(obj)||typeof obj.method!="string")continue;let request=obj;if(request.method==="session/cancel"){clientRpc.cancelAll("session cancelled");let cancelSessionId=String(request.params?.sessionId??"").trim();cancelSessionId?state5?.messageStore?.cancelTurn?.(cancelSessionId,"session cancelled"):state5?.messageStore?.cancelAllTurns?.("session cancelled")}let task=(async()=>{let response=await handleAcpRequest(state5,request);response&&write(response)})();if(inFlight.add(task),task.finally(()=>inFlight.delete(task)),request.method==="shutdown"&&request.id!==void 0){shuttingDown=!0,await Promise.allSettled([...inFlight].filter(t7=>t7!==task)),clientRpc.cancelAll("shutdown"),await task;break}}shuttingDown||clientRpc.cancelAll("stdin closed"),await Promise.allSettled([...inFlight])}var ACP_PROTOCOL_VERSION,ACP_AGENT_NAME,ACP_AGENT_VERSION,init_acpStdio=__esm({"src/entrypoints/acpStdio.ts"(){init_acpModelChrome();init_acpSessionIdentity();init_acpSessionMode();init_acpRewind();init_acpSlashRoute();init_acpSubagents();init_acpSessionLifecycle();ACP_PROTOCOL_VERSION=1,ACP_AGENT_NAME="clavue",ACP_AGENT_VERSION=(()=>{if(typeof MACRO<"u")return"13.9.1";try{let{APP_VERSION:APP_VERSION2}=(init_branding(),__toCommonJS(branding_exports));if(APP_VERSION2)return String(APP_VERSION2)}catch{}return"0.0.0"})();__name(createAcpBridgeState,"createAcpBridgeState");__name(bridgeNotify,"bridgeNotify");__name(refreshModelState,"refreshModelState");__name(isObject10,"isObject");__name(readAcpSessionId,"readAcpSessionId");__name(applySessionSetMode,"applySessionSetMode");__name(applySessionSetModel,"applySessionSetModel");__name(handleAcpRequest,"handleAcpRequest");__name(handleAcpRewindRequest,"handleAcpRewindRequest");__name(extractAcpPromptText,"extractAcpPromptText");__name(parseAcpLine,"parseAcpLine");__name(runAcpStdioServer,"runAcpStdioServer")}});var grokTuiCli_exports={};__export(grokTuiCli_exports,{formatClavueTuiVersionLine:()=>formatClavueTuiVersionLine,resolveClavueProductVersion:()=>resolveClavueProductVersion,resolveClavueTuiBinary:()=>resolveClavueTuiBinary,runGrokTuiCli:()=>runGrokTuiCli});import{spawn as spawn17}from"node:child_process";import{existsSync as existsSync67,readFileSync as readFileSync64}from"node:fs";import{dirname as dirname90,join as join232,resolve as resolve57}from"node:path";import{fileURLToPath as fileURLToPath14}from"node:url";import{arch as arch2,platform as platform4}from"node:os";function platformTriple2(){let p=platform4()==="darwin"?"darwin":platform4()==="win32"?"win32":"linux",a2=arch2()==="arm64"?"arm64":arch2()==="x64"?"x64":arch2();return`${p}-${a2}`}function resolvePackageRoot(){return resolveClavueRoot()??resolve57(__dirname3,"../..")??process.cwd()}function resolveClavueProductVersion(root2=resolvePackageRoot()){try{let pkgPath=join232(root2,"package.json");if(existsSync67(pkgPath)){let pkg=JSON.parse(readFileSync64(pkgPath,"utf8")),v2=String(pkg.version||"").trim();if(v2)return v2}}catch{}return APP_VERSION}function formatClavueTuiVersionLine(root2=resolvePackageRoot()){return`${resolveClavueProductVersion(root2)} (Clavue)`}function resolveClavueTuiBinary(){let root2=resolvePackageRoot(),native=join232(root2,"dist","native"),exe=platform4()==="win32"?".exe":"",candidates=[process.env.CLAVUE_TUI_BIN,join232(native,`clavue-tui-real-${platformTriple2()}${exe}`),join232(native,`clavue-tui-real${exe}`),join232(native,`clavue-tui-${platformTriple2()}${exe}`),join232(native,`clavue-tui${exe}`)].filter(Boolean);for(let p of candidates)if(existsSync67(p))return p;return null}async function runGrokTuiCli(args){let root2=resolvePackageRoot(),productVersion=resolveClavueProductVersion(root2);if(args.includes("--help")||args.includes("-h"))return process.stdout.write(`clavue tui \u2014 optional interaction substrate (Clavue-branded)
10917
+ `);return(await executeAcpPromptHeadless2({prompt:childPrompt,cwd:cwd6,maxTurns:6,permissionMode:"acceptEdits",sessionId:childSessionId,env:{...process.env,...spec.model?{CLAVUE_MODEL:spec.model}:{},CLAVUE_ACP_SUBAGENT:"1",CLAVUE_ACP_SUBAGENT_TYPE:spec.subagentType}})).text}},"makeRunSubagentChild"),bridgeHolder={state:null},state5=options.state;if(!state5){let{resolveAcpExecuteMode:resolveAcpExecuteMode2}=await Promise.resolve().then(()=>(init_acpInProcessExecutor(),acpInProcessExecutor_exports)),mode2=options.executeMode??(options.execute===!0?process.env.CLAVUE_ACP_EXECUTE_MODE?.toLowerCase()==="subprocess"?"subprocess":"inprocess":resolveAcpExecuteMode2()),runSubagentChild=makeRunSubagentChild(mode2==="inprocess"||mode2==="subprocess"),resolveSessionPermissionMode=__name(sessionId=>bridgeHolder.state?.sessions.get(sessionId)?.permissionMode??"auto","resolveSessionPermissionMode");if(mode2==="inprocess"){let{createAcpInProcessSessionStore:createAcpInProcessSessionStore2,executeAcpPromptInProcess:executeAcpPromptInProcess2}=await Promise.resolve().then(()=>(init_acpInProcessExecutor(),acpInProcessExecutor_exports)),{bindSessionNotify:bindSessionNotify2}=await Promise.resolve().then(()=>(init_acpSessionNotify(),acpSessionNotify_exports)),sessionStore=createAcpInProcessSessionStore2();state5=createAcpBridgeState({notify:notifyDefault,requestClient,messageStore:sessionStore,cwd:cwd6,subagents:bridgeSubagents,runSubagentChild,onPrompt:__name(async({sessionId,prompt,notify:notify2,requestClient:rc})=>{let nestedNotify=bindSessionNotify2(sessionId,notify2),permissionMode=resolveSessionPermissionMode(sessionId),runTurn=__name(turnPrompt=>executeAcpPromptInProcess2({sessionId,prompt:turnPrompt,cwd:cwd6,notify:nestedNotify,requestClient:rc??requestClient,sessionStore,subagents:bridgeSubagents,permissionMode}),"runTurn"),first=await runTurn(prompt),{finalizeAcpGoalAfterExecuteTurn:finalizeAcpGoalAfterExecuteTurn2}=await Promise.resolve().then(()=>(init_acpGoal(),acpGoal_exports)),settled=await finalizeAcpGoalAfterExecuteTurn2({cwd:cwd6,sessionId,notify:notify2,result:first,subagents:bridgeSubagents,runContinuation:__name(nextInput=>runTurn(nextInput),"runContinuation")});return{text:settled.result.text,stopReason:settled.result.stopReason,toolCalls:settled.result.toolCalls}},"onPrompt")})}else if(mode2==="subprocess"){let{executeAcpPromptHeadless:executeAcpPromptHeadless2}=await Promise.resolve().then(()=>(init_acpHeadlessExecutor(),acpHeadlessExecutor_exports)),{bindSessionNotify:bindSessionNotify2}=await Promise.resolve().then(()=>(init_acpSessionNotify(),acpSessionNotify_exports));state5=createAcpBridgeState({notify:notifyDefault,requestClient,cwd:cwd6,subagents:bridgeSubagents,runSubagentChild,onPrompt:__name(async({sessionId,prompt,notify:notify2})=>{let nestedNotify=bindSessionNotify2(sessionId,notify2),permissionMode=resolveSessionPermissionMode(sessionId),runTurn=__name(turnPrompt=>executeAcpPromptHeadless2({prompt:turnPrompt,cwd:cwd6,notify:nestedNotify,sessionId,subagents:bridgeSubagents,permissionMode}),"runTurn"),first=await runTurn(prompt),{finalizeAcpGoalAfterExecuteTurn:finalizeAcpGoalAfterExecuteTurn2}=await Promise.resolve().then(()=>(init_acpGoal(),acpGoal_exports)),settled=await finalizeAcpGoalAfterExecuteTurn2({cwd:cwd6,sessionId,notify:notify2,result:first,subagents:bridgeSubagents,runContinuation:__name(nextInput=>runTurn(nextInput),"runContinuation")});return{text:settled.result.text,stopReason:settled.result.stopReason,toolCalls:settled.result.toolCalls}},"onPrompt")})}else state5=createAcpBridgeState({notify:notifyDefault,requestClient,cwd:cwd6,subagents:bridgeSubagents})}bridgeHolder.state=state5;let rl=createInterface6({input:stdin,crlfDelay:1/0});state5.notify||(state5.notify=notifyDefault),state5.requestClient||(state5.requestClient=requestClient),state5.subagents||(state5.subagents=bridgeSubagents);let inFlight=new Set,shuttingDown=!1;for await(let line of rl){let obj;try{let trimmed=String(line).trim();if(!trimmed)continue;let parsed=JSON.parse(trimmed);if(!isObject10(parsed)||parsed.jsonrpc!=="2.0")throw new Error("Invalid JSON-RPC 2.0 message");obj=parsed}catch(error40){write({jsonrpc:"2.0",id:null,error:{code:-32700,message:error40 instanceof Error?error40.message:"Parse error"}});continue}if(clientRpc.handleResponseLine(obj)||typeof obj.method!="string")continue;let request=obj;if(request.method==="session/cancel"){clientRpc.cancelAll("session cancelled");let cancelSessionId=String(request.params?.sessionId??"").trim();cancelSessionId?state5?.messageStore?.cancelTurn?.(cancelSessionId,"session cancelled"):state5?.messageStore?.cancelAllTurns?.("session cancelled")}let task=(async()=>{let response=await handleAcpRequest(state5,request);response&&write(response)})();if(inFlight.add(task),task.finally(()=>inFlight.delete(task)),request.method==="shutdown"&&request.id!==void 0){shuttingDown=!0,await Promise.allSettled([...inFlight].filter(t7=>t7!==task)),clientRpc.cancelAll("shutdown"),await task;break}}shuttingDown||clientRpc.cancelAll("stdin closed"),await Promise.allSettled([...inFlight])}var ACP_PROTOCOL_VERSION,ACP_AGENT_NAME,ACP_AGENT_VERSION,init_acpStdio=__esm({"src/entrypoints/acpStdio.ts"(){init_acpModelChrome();init_acpSessionIdentity();init_acpSessionMode();init_acpRewind();init_acpSlashRoute();init_acpSubagents();init_acpSessionLifecycle();ACP_PROTOCOL_VERSION=1,ACP_AGENT_NAME="clavue",ACP_AGENT_VERSION=(()=>{if(typeof MACRO<"u")return"13.9.2";try{let{APP_VERSION:APP_VERSION2}=(init_branding(),__toCommonJS(branding_exports));if(APP_VERSION2)return String(APP_VERSION2)}catch{}return"0.0.0"})();__name(createAcpBridgeState,"createAcpBridgeState");__name(bridgeNotify,"bridgeNotify");__name(refreshModelState,"refreshModelState");__name(isObject10,"isObject");__name(readAcpSessionId,"readAcpSessionId");__name(applySessionSetMode,"applySessionSetMode");__name(applySessionSetModel,"applySessionSetModel");__name(handleAcpRequest,"handleAcpRequest");__name(handleAcpRewindRequest,"handleAcpRewindRequest");__name(extractAcpPromptText,"extractAcpPromptText");__name(parseAcpLine,"parseAcpLine");__name(runAcpStdioServer,"runAcpStdioServer")}});var grokTuiCli_exports={};__export(grokTuiCli_exports,{formatClavueTuiVersionLine:()=>formatClavueTuiVersionLine,resolveClavueProductVersion:()=>resolveClavueProductVersion,resolveClavueTuiBinary:()=>resolveClavueTuiBinary,runGrokTuiCli:()=>runGrokTuiCli});import{spawn as spawn17}from"node:child_process";import{existsSync as existsSync67,readFileSync as readFileSync64}from"node:fs";import{dirname as dirname90,join as join232,resolve as resolve57}from"node:path";import{fileURLToPath as fileURLToPath14}from"node:url";import{arch as arch2,platform as platform4}from"node:os";function platformTriple2(){let p=platform4()==="darwin"?"darwin":platform4()==="win32"?"win32":"linux",a2=arch2()==="arm64"?"arm64":arch2()==="x64"?"x64":arch2();return`${p}-${a2}`}function resolvePackageRoot(){return resolveClavueRoot()??resolve57(__dirname3,"../..")??process.cwd()}function resolveClavueProductVersion(root2=resolvePackageRoot()){try{let pkgPath=join232(root2,"package.json");if(existsSync67(pkgPath)){let pkg=JSON.parse(readFileSync64(pkgPath,"utf8")),v2=String(pkg.version||"").trim();if(v2)return v2}}catch{}return APP_VERSION}function formatClavueTuiVersionLine(root2=resolvePackageRoot()){return`${resolveClavueProductVersion(root2)} (Clavue)`}function resolveClavueTuiBinary(){let root2=resolvePackageRoot(),native=join232(root2,"dist","native"),exe=platform4()==="win32"?".exe":"",candidates=[process.env.CLAVUE_TUI_BIN,join232(native,`clavue-tui-real-${platformTriple2()}${exe}`),join232(native,`clavue-tui-real${exe}`),join232(native,`clavue-tui-${platformTriple2()}${exe}`),join232(native,`clavue-tui${exe}`)].filter(Boolean);for(let p of candidates)if(existsSync67(p))return p;return null}async function runGrokTuiCli(args){let root2=resolvePackageRoot(),productVersion=resolveClavueProductVersion(root2);if(args.includes("--help")||args.includes("-h"))return process.stdout.write(`clavue tui \u2014 optional interaction substrate (Clavue-branded)
10918
10918
 
10919
10919
  Usage:
10920
10920
  clavue tui Launch fullscreen TUI
@@ -10937,7 +10937,7 @@ See docs/clavue-tui-default-path.md
10937
10937
  (requires Rust 1.92, dotslash, protoc; grok-build sibling clone)
10938
10938
  Default product UI: clavue-pager (no tui required)
10939
10939
  `),1;let rest2=args;rest2[0]==="--"&&(rest2=rest2.slice(1)),!/^(1|true|yes|on)$/i.test(process.env.CLAVUE_TUI_ALLOW_GROK_UPDATE??"")&&!rest2.includes("--no-auto-update")&&!rest2.some(a2=>a2.startsWith("--no-auto-update"))&&(rest2=["--no-auto-update",...rest2]);let cliJs=join232(root2,"dist","cli.js"),env5={...process.env};env5.GROK_TEST_VERSION=env5.GROK_TEST_VERSION||productVersion,env5.CLAVUE_VERSION=env5.CLAVUE_VERSION||productVersion,env5.GROK_VERSION=env5.GROK_VERSION||productVersion,!/^(1|true|yes|on)$/i.test(process.env.CLAVUE_TUI_USE_GROK_SHELL??"")&&!env5.CLAVUE_ACP_AGENT_CMD&&existsSync67(cliJs)&&(env5.CLAVUE_ACP_AGENT_CMD=`${process.execPath} ${cliJs} acp --execute --inprocess`,env5.CLAVUE_ACP_EXECUTE=env5.CLAVUE_ACP_EXECUTE||"1");let child=spawn17(bin,rest2,{stdio:"inherit",env:env5});return await new Promise(resolveCode=>{child.on("error",e2=>{process.stderr.write(String(e2)+`
10940
- `),resolveCode(1)}),child.on("close",code=>resolveCode(code??0))})}var __dirname3,init_grokTuiCli=__esm({"src/uiProtocol/grokTuiCli.ts"(){init_agentBridge();init_branding();__dirname3=dirname90(fileURLToPath14(import.meta.url));__name(platformTriple2,"platformTriple");__name(resolvePackageRoot,"resolvePackageRoot");__name(resolveClavueProductVersion,"resolveClavueProductVersion");__name(formatClavueTuiVersionLine,"formatClavueTuiVersionLine");__name(resolveClavueTuiBinary,"resolveClavueTuiBinary");__name(runGrokTuiCli,"runGrokTuiCli")}});function sleep8(ms){return new Promise(resolve67=>setTimeout(resolve67,ms))}async function*generateMockCodingTurn(options={}){let cwd6=options.cwd??process.cwd(),sessionId=options.sessionId??`mock-${Date.now()}`,delay2=options.delayMs??0,wait=__name(async()=>{delay2>0&&await sleep8(delay2)},"wait");yield encodeA2p("hello",{role:"agent",name:"clavue-agent",version:APP_VERSION,caps:["journal","permissions","overview","route","parallel"]}),await wait(),yield encodeA2p("session.started",{sessionId,cwd:cwd6}),await wait(),yield encodeA2p("agent.running",{prompt:"mock coding turn"}),await wait(),yield encodeA2p("route.status",{provider:"openrouter",model:"gpt-5.5",qualityTier:"compatible",mode:"trustedOps",ctxPct:22,thinking:!0}),await wait(),yield encodeA2p("overview.snapshot",{ephemeral:!0,lines:["\u25A0 Implement focused journal density","\u25A1 Wire native pager protocol","\u25A1 Cut over interactive default"]}),await wait(),yield encodeA2p("thinking.delta",{blockId:"th-1",text:"Scan tool renderers, then tighten bash verify path."}),await wait(),yield encodeA2p("thinking.end",{blockId:"th-1",ms:420}),await wait(),yield encodeA2p("tool.start",{blockId:"t-search",tool:"Grep",summary:'Search "feedbackDetailMode" in src (12 matches)',tier:1}),await wait(),yield encodeA2p("tool.end",{blockId:"t-search",ok:!0,summary:"12 matches in 6 files"}),await wait(),yield encodeA2p("tool.start",{blockId:"t-read",tool:"Read",summary:"Read src/components/messages/feedbackPresentation.ts",tier:1}),await wait(),yield encodeA2p("tool.end",{blockId:"t-read",ok:!0,summary:"232 lines"}),await wait(),yield encodeA2p("tool.start",{blockId:"t-edit",tool:"Edit",summary:"Edit src/utils/promptStatusChrome.ts",tier:0}),await wait(),yield encodeA2p("tool.end",{blockId:"t-edit",ok:!0,summary:"+48 \u221212"}),await wait(),yield encodeA2p("verify.result",{blockId:"v-1",ok:!0,command:"npm run check:fast",summary:"\u25C6 verify ok \xB7 324 tests"}),await wait(),yield encodeA2p("assistant.final",{blockId:"a-1",text:"Journal helpers densified; check:fast green. Ready for native pager cutover."}),await wait(),yield encodeA2p("outcome.turn",{ok:!0,changes:"2 files",verify:"324 tests passed",verifyStatus:"passed",verifyItems:[{status:"passed",summary:"324 tests passed",command:"npm run check:fast"}],blockers:"none",next:"Run M1 pager against live agent stream",durationMs:48e3,toolCount:4,editCount:1,changeItems:[{path:"src/utils/promptStatusChrome.ts",kind:"edit",additions:48,deletions:12},{path:"src/components/messages/feedbackPresentation.ts",kind:"edit",additions:0,deletions:0}]}),await wait(),yield encodeA2p("route.status",{provider:"openrouter",model:"gpt-5.5",qualityTier:"compatible",mode:"trustedOps",ctxPct:28,thinking:!1}),yield encodeA2p("agent.idle",{}),yield encodeA2p("session.ended",{reason:"mock_complete"})}var init_mockSession=__esm({"src/uiProtocol/mockSession.ts"(){init_branding();init_codec();__name(sleep8,"sleep");__name(generateMockCodingTurn,"generateMockCodingTurn")}});function tokenCounts(usage3){return!usage3||typeof usage3!="object"?{input:0,output:0}:{input:occupiedInputTokens(usage3),output:occupiedOutputTokens(usage3)}}function hasTokenSignal(usage3){if(!usage3||typeof usage3!="object")return!1;let c4=tokenCounts(usage3);return c4.input>0||c4.output>0}function accountTurnUsage(directUsage,cumulativeUsage,baseline){if(directUsage&&hasTokenSignal(directUsage))return{...tokenCounts(directUsage),nextBaseline:baseline,cumulative:!1};if(hasTokenSignal(cumulativeUsage)){let current=tokenCounts(cumulativeUsage);return{input:Math.max(0,current.input-baseline.input),output:Math.max(0,current.output-baseline.output),nextBaseline:current,cumulative:!0}}return{input:0,output:0,nextBaseline:baseline,cumulative:!1}}var init_usageAccounting=__esm({"src/uiProtocol/usageAccounting.ts"(){init_ctxEstimate();__name(tokenCounts,"tokenCounts");__name(hasTokenSignal,"hasTokenSignal");__name(accountTurnUsage,"accountTurnUsage")}});function rememberSessionTurnSnippet(input2){let snippet=buildSessionListTurnSnippet(input2);return snippet.summary&&(lastSnippet=snippet),snippet}function sessionTurnSummaryFromOutcomePayload(payload){return{densityLine:typeof payload.densityLine=="string"?payload.densityLine:null,changeCount:typeof payload.changeCount=="number"?payload.changeCount:typeof payload.editCount=="number"?payload.editCount:void 0,verifyStatus:typeof payload.verifyStatus=="string"?payload.verifyStatus:null,honestyStatus:typeof payload.honestyStatus=="string"?payload.honestyStatus:null,honestyAllowSuccess:typeof payload.honestyAllowSuccess=="boolean"?payload.honestyAllowSuccess:null,terminalState:typeof payload.terminalState=="string"?payload.terminalState:null,ok:typeof payload.ok=="boolean"?payload.ok:null,reviewGateLine:typeof payload.reviewGateLine=="string"?payload.reviewGateLine:null,comboChrome:typeof payload.comboChrome=="string"?payload.comboChrome:null,mainlineDisposition:typeof payload.mainlineDisposition=="string"?payload.mainlineDisposition:null,durationMs:typeof payload.durationMs=="number"?payload.durationMs:null,blockers:typeof payload.blockers=="string"?payload.blockers:null}}function attachSessionTurnSummary(payload,opts){try{let snippet=rememberSessionTurnSnippet(sessionTurnSummaryFromOutcomePayload(payload));if(snippet.summary){payload.sessionTurnSummary=snippet.summary;let sid=String(opts?.sessionId||"").trim();opts?.persist!==!1&&sid&&Promise.resolve().then(()=>(init_sessionStorage(),sessionStorage_exports)).then(m3=>{m3.saveSessionTurnSummary(sid,snippet.summary)}).catch(()=>{})}}catch{}return payload}function formatSessionTurnSummary(input2){let parts=[],term=String(input2.terminalState||"").toLowerCase(),dens=String(input2.densityLine||"").trim(),blockers=String(input2.blockers||"").toLowerCase();if(term==="cancelled"||blockers.includes("interrupted"))return"interrupted";let gate=String(input2.reviewGateLine||"").trim()||(dens.match(/review-gate:[^\s·]+/)||[])[0]||"",claimBlocked=input2.honestyAllowSuccess===!1||String(input2.honestyStatus||"")==="blocked"||String(input2.honestyStatus||"")==="unverified"||String(input2.honestyStatus||"")==="failed_verify";claimBlocked&&gate?(parts.push("done blocked"),parts.push(gate)):claimBlocked&&parts.push(input2.honestyStatus==="failed_verify"?"verify fail":input2.honestyStatus==="unverified"?"unverified":"done blocked");let n4=Math.max(0,input2.changeCount??0);n4>0&&!parts.some(p=>p.includes("file"))&&parts.push(n4===1?"1 file":`${n4} files`);let vs=String(input2.verifyStatus||"").toLowerCase();vs==="failed"||dens.includes("verify")&&dens.includes("fail")?parts.some(p=>p.includes("verify"))||parts.push("verify fail"):(vs==="passed"||dens.includes("verify")&&dens.includes("ok"))&&(parts.some(p=>p.includes("verify"))||parts.push("verify ok"));let combo=String(input2.comboChrome||dens);for(let tok of["packet:wrapped","review=main"])if(combo.includes(tok)&&!parts.some(p=>p.includes(tok.split(":")[0]))){let m3=dens.match(new RegExp(`${tok.replace("=","\\=")}[^\\s\xB7]*`));parts.push(m3?.[0]||tok)}if(gate&&!parts.some(p=>p.includes("review-gate"))&&parts.push(gate),parts.length===0){if(dens){let cleaned=dens.split(" \xB7 ").filter(p=>!p.toLowerCase().startsWith("honesty:")).join(" \xB7 ");return cleaned.length>90?cleaned.slice(0,87)+"\u2026":cleaned}return input2.ok===!0?"ok":input2.ok===!1?"failed":""}let seen2=new Set,out=[];for(let p of parts){let k2=p.toLowerCase();if(!seen2.has(k2)&&(seen2.add(k2),out.push(p),out.join(" \xB7 ").length>90))break}return out.join(" \xB7 ")}function buildSessionListTurnSnippet(input2){let summary=formatSessionTurnSummary(input2),dens=`${input2.densityLine||""} ${input2.comboChrome||""}`;return{summary,...input2.reviewGateLine?{reviewGate:input2.reviewGateLine}:dens.includes("review-gate:")?{reviewGate:(dens.match(/review-gate:[^\s·]+/)||[])[0]}:{},...dens.includes("review=main")?{sameModelReview:!0}:{},...dens.includes("packet:wrapped")||input2.comboChrome?.includes("packet")?{packetWrapped:!0}:{}}}var lastSnippet,init_sessionTurnSummary=__esm({"src/runtime/sessionTurnSummary.ts"(){lastSnippet=null;__name(rememberSessionTurnSnippet,"rememberSessionTurnSnippet");__name(sessionTurnSummaryFromOutcomePayload,"sessionTurnSummaryFromOutcomePayload");__name(attachSessionTurnSummary,"attachSessionTurnSummary");__name(formatSessionTurnSummary,"formatSessionTurnSummary");__name(buildSessionListTurnSnippet,"buildSessionListTurnSnippet")}});var diaryLine_exports={};__export(diaryLine_exports,{decodeDiaryEvent:()=>decodeDiaryEvent,diaryFooterFields:()=>diaryFooterFields,diaryLocaleIsZh:()=>diaryLocaleIsZh,diaryToolWire:()=>diaryToolWire,diaryVisible:()=>diaryVisible,encodeDiaryEvent:()=>encodeDiaryEvent,stampDiaryFooter:()=>stampDiaryFooter,verbZh:()=>verbZh});function verbZh(name){return VERB[name.trim().toLowerCase()]??"\u4F7F\u7528"}function diaryVisible(event){let glyph=event.kind==="thinking"?"\u25C7":event.kind==="user"?"\u258D":event.status==="fail"?"\u2717":event.kind==="outcome"?"\u2514":event.kind==="plan"?"\u25A3":event.kind==="permission"?"\u26A0":"\u25C6",fold=event.kind==="thinking"||event.kind==="edit"||event.kind==="exec"||event.kind==="plan",line=`${glyph} ${event.verb} ${event.target}`.trim();return event.metrics&&(line+=` \xB7 ${event.metrics}`),fold&&(line+=" \u203A"),line}function encodeDiaryEvent(event){return`\u27E8${event.kind}|${event.status}|${event.verb}|${event.target}|${event.metrics}\u27E9${diaryVisible(event)}`}function diaryLocaleIsZh(env5=process.env){let raw=String(env5.CLAVUE_UI_LOCALE??env5.CLAVUE_LANG??"").trim();return raw?raw.toLowerCase().startsWith("zh"):!0}function field(value){return value.replace(/\|/g,"\xA6").replace(/\s+/g," ").trim()}function lineCount3(text3){let t7=text3.replace(/\r\n/g,`
10940
+ `),resolveCode(1)}),child.on("close",code=>resolveCode(code??0))})}var __dirname3,init_grokTuiCli=__esm({"src/uiProtocol/grokTuiCli.ts"(){init_agentBridge();init_branding();__dirname3=dirname90(fileURLToPath14(import.meta.url));__name(platformTriple2,"platformTriple");__name(resolvePackageRoot,"resolvePackageRoot");__name(resolveClavueProductVersion,"resolveClavueProductVersion");__name(formatClavueTuiVersionLine,"formatClavueTuiVersionLine");__name(resolveClavueTuiBinary,"resolveClavueTuiBinary");__name(runGrokTuiCli,"runGrokTuiCli")}});function sleep8(ms){return new Promise(resolve67=>setTimeout(resolve67,ms))}async function*generateMockCodingTurn(options={}){let cwd6=options.cwd??process.cwd(),sessionId=options.sessionId??`mock-${Date.now()}`,delay2=options.delayMs??0,wait=__name(async()=>{delay2>0&&await sleep8(delay2)},"wait");yield encodeA2p("hello",{role:"agent",name:"clavue-agent",version:APP_VERSION,caps:["journal","permissions","overview","route","parallel"]}),await wait(),yield encodeA2p("session.started",{sessionId,cwd:cwd6}),await wait(),yield encodeA2p("agent.running",{prompt:"mock coding turn"}),await wait(),yield encodeA2p("route.status",{provider:"openrouter",model:"gpt-5.5",qualityTier:"compatible",mode:"trustedOps",ctxPct:22,thinking:!0}),await wait(),yield encodeA2p("overview.snapshot",{ephemeral:!0,lines:["\u25A0 Implement focused journal density","\u25A1 Wire native pager protocol","\u25A1 Cut over interactive default"]}),await wait(),yield encodeA2p("thinking.delta",{blockId:"th-1",text:"Scan tool renderers, then tighten bash verify path."}),await wait(),yield encodeA2p("thinking.end",{blockId:"th-1",ms:420}),await wait(),yield encodeA2p("tool.start",{blockId:"t-search",tool:"Grep",summary:'Search "feedbackDetailMode" in src (12 matches)',tier:1}),await wait(),yield encodeA2p("tool.end",{blockId:"t-search",ok:!0,summary:"12 matches in 6 files"}),await wait(),yield encodeA2p("tool.start",{blockId:"t-read",tool:"Read",summary:"Read src/components/messages/feedbackPresentation.ts",tier:1}),await wait(),yield encodeA2p("tool.end",{blockId:"t-read",ok:!0,summary:"232 lines"}),await wait(),yield encodeA2p("tool.start",{blockId:"t-edit",tool:"Edit",summary:"Edit src/utils/promptStatusChrome.ts",tier:0}),await wait(),yield encodeA2p("tool.end",{blockId:"t-edit",ok:!0,summary:"+48 \u221212"}),await wait(),yield encodeA2p("verify.result",{blockId:"v-1",ok:!0,command:"npm run check:fast",summary:"\u25C6 verify ok \xB7 324 tests"}),await wait(),yield encodeA2p("assistant.final",{blockId:"a-1",text:"Journal helpers densified; check:fast green. Ready for native pager cutover."}),await wait(),yield encodeA2p("outcome.turn",{ok:!0,changes:"2 files",verify:"324 tests passed",verifyStatus:"passed",verifyItems:[{status:"passed",summary:"324 tests passed",command:"npm run check:fast"}],blockers:"none",next:"Run M1 pager against live agent stream",durationMs:48e3,toolCount:4,editCount:1,changeItems:[{path:"src/utils/promptStatusChrome.ts",kind:"edit",additions:48,deletions:12},{path:"src/components/messages/feedbackPresentation.ts",kind:"edit",additions:0,deletions:0}]}),await wait(),yield encodeA2p("route.status",{provider:"openrouter",model:"gpt-5.5",qualityTier:"compatible",mode:"trustedOps",ctxPct:28,thinking:!1}),yield encodeA2p("agent.idle",{}),yield encodeA2p("session.ended",{reason:"mock_complete"})}var init_mockSession=__esm({"src/uiProtocol/mockSession.ts"(){init_branding();init_codec();__name(sleep8,"sleep");__name(generateMockCodingTurn,"generateMockCodingTurn")}});function resetTurnThinking(){turnThinkingId=null,turnThinkingClosed=!1,snapshotDurationSent=!1}function ensureTurnThinkingId(){return turnThinkingId||(turnThinkingSerial+=1,turnThinkingId=`th-turn-${turnThinkingSerial}`),turnThinkingId}function peekTurnThinkingId(){return turnThinkingId}function closeTurnThinking(){turnThinkingClosed=!0}function appendCoalescedThinking(opts){let{out,content,block:block2,read,durationMs,wallMs,noteActivity,clearClock,textCap}=opts;if(turnThinkingClosed){if(!snapshotDurationSent&&turnThinkingId){let ms2=0;for(let part of content){let rec=read(part);rec&&rec.type==="thinking"&&(ms2=Math.max(ms2,durationMs(rec)))}ms2>0&&out.push(encodeA2p("thinking.end",{blockId:turnThinkingId,ms:ms2})),snapshotDurationSent=!0}return}let chunks=[];for(let part of content){let rec=read(part);rec&&rec.type==="thinking"&&typeof rec.thinking=="string"&&chunks.push(rec)}let id=ensureTurnThinkingId(),text3="";for(let chunk3 of chunks)text3+=String(chunk3.thinking).slice(0,textCap);text3.length>textCap&&(text3=text3.slice(0,textCap)),noteActivity(id);let ms=0;for(let chunk3 of chunks)ms=Math.max(ms,durationMs(chunk3));ms<=0?ms=wallMs(block2,id):clearClock(id),out.push(encodeA2p("route.status",{provider:null,model:null,qualityTier:null,mode:null,ctxPct:null,thinking:!0})),out.push(encodeA2p("thinking.delta",{blockId:id,text:text3})),out.push(encodeA2p("thinking.end",{blockId:id,ms})),turnThinkingClosed=!0,snapshotDurationSent=!0}var turnThinkingId,turnThinkingSerial,turnThinkingClosed,snapshotDurationSent,init_streamThinkingCoalesce=__esm({"src/uiProtocol/streamThinkingCoalesce.ts"(){init_codec();turnThinkingId=null,turnThinkingSerial=0,turnThinkingClosed=!1,snapshotDurationSent=!1;__name(resetTurnThinking,"resetTurnThinking");__name(ensureTurnThinkingId,"ensureTurnThinkingId");__name(peekTurnThinkingId,"peekTurnThinkingId");__name(closeTurnThinking,"closeTurnThinking");__name(appendCoalescedThinking,"appendCoalescedThinking")}});function tokenCounts(usage3){return!usage3||typeof usage3!="object"?{input:0,output:0}:{input:occupiedInputTokens(usage3),output:occupiedOutputTokens(usage3)}}function hasTokenSignal(usage3){if(!usage3||typeof usage3!="object")return!1;let c4=tokenCounts(usage3);return c4.input>0||c4.output>0}function accountTurnUsage(directUsage,cumulativeUsage,baseline){if(directUsage&&hasTokenSignal(directUsage))return{...tokenCounts(directUsage),nextBaseline:baseline,cumulative:!1};if(hasTokenSignal(cumulativeUsage)){let current=tokenCounts(cumulativeUsage);return{input:Math.max(0,current.input-baseline.input),output:Math.max(0,current.output-baseline.output),nextBaseline:current,cumulative:!0}}return{input:0,output:0,nextBaseline:baseline,cumulative:!1}}var init_usageAccounting=__esm({"src/uiProtocol/usageAccounting.ts"(){init_ctxEstimate();__name(tokenCounts,"tokenCounts");__name(hasTokenSignal,"hasTokenSignal");__name(accountTurnUsage,"accountTurnUsage")}});function rememberSessionTurnSnippet(input2){let snippet=buildSessionListTurnSnippet(input2);return snippet.summary&&(lastSnippet=snippet),snippet}function sessionTurnSummaryFromOutcomePayload(payload){return{densityLine:typeof payload.densityLine=="string"?payload.densityLine:null,changeCount:typeof payload.changeCount=="number"?payload.changeCount:typeof payload.editCount=="number"?payload.editCount:void 0,verifyStatus:typeof payload.verifyStatus=="string"?payload.verifyStatus:null,honestyStatus:typeof payload.honestyStatus=="string"?payload.honestyStatus:null,honestyAllowSuccess:typeof payload.honestyAllowSuccess=="boolean"?payload.honestyAllowSuccess:null,terminalState:typeof payload.terminalState=="string"?payload.terminalState:null,ok:typeof payload.ok=="boolean"?payload.ok:null,reviewGateLine:typeof payload.reviewGateLine=="string"?payload.reviewGateLine:null,comboChrome:typeof payload.comboChrome=="string"?payload.comboChrome:null,mainlineDisposition:typeof payload.mainlineDisposition=="string"?payload.mainlineDisposition:null,durationMs:typeof payload.durationMs=="number"?payload.durationMs:null,blockers:typeof payload.blockers=="string"?payload.blockers:null}}function attachSessionTurnSummary(payload,opts){try{let snippet=rememberSessionTurnSnippet(sessionTurnSummaryFromOutcomePayload(payload));if(snippet.summary){payload.sessionTurnSummary=snippet.summary;let sid=String(opts?.sessionId||"").trim();opts?.persist!==!1&&sid&&Promise.resolve().then(()=>(init_sessionStorage(),sessionStorage_exports)).then(m3=>{m3.saveSessionTurnSummary(sid,snippet.summary)}).catch(()=>{})}}catch{}return payload}function formatSessionTurnSummary(input2){let parts=[],term=String(input2.terminalState||"").toLowerCase(),dens=String(input2.densityLine||"").trim(),blockers=String(input2.blockers||"").toLowerCase();if(term==="cancelled"||blockers.includes("interrupted"))return"interrupted";let gate=String(input2.reviewGateLine||"").trim()||(dens.match(/review-gate:[^\s·]+/)||[])[0]||"",claimBlocked=input2.honestyAllowSuccess===!1||String(input2.honestyStatus||"")==="blocked"||String(input2.honestyStatus||"")==="unverified"||String(input2.honestyStatus||"")==="failed_verify";claimBlocked&&gate?(parts.push("done blocked"),parts.push(gate)):claimBlocked&&parts.push(input2.honestyStatus==="failed_verify"?"verify fail":input2.honestyStatus==="unverified"?"unverified":"done blocked");let n4=Math.max(0,input2.changeCount??0);n4>0&&!parts.some(p=>p.includes("file"))&&parts.push(n4===1?"1 file":`${n4} files`);let vs=String(input2.verifyStatus||"").toLowerCase();vs==="failed"||dens.includes("verify")&&dens.includes("fail")?parts.some(p=>p.includes("verify"))||parts.push("verify fail"):(vs==="passed"||dens.includes("verify")&&dens.includes("ok"))&&(parts.some(p=>p.includes("verify"))||parts.push("verify ok"));let combo=String(input2.comboChrome||dens);for(let tok of["packet:wrapped","review=main"])if(combo.includes(tok)&&!parts.some(p=>p.includes(tok.split(":")[0]))){let m3=dens.match(new RegExp(`${tok.replace("=","\\=")}[^\\s\xB7]*`));parts.push(m3?.[0]||tok)}if(gate&&!parts.some(p=>p.includes("review-gate"))&&parts.push(gate),parts.length===0){if(dens){let cleaned=dens.split(" \xB7 ").filter(p=>!p.toLowerCase().startsWith("honesty:")).join(" \xB7 ");return cleaned.length>90?cleaned.slice(0,87)+"\u2026":cleaned}return input2.ok===!0?"ok":input2.ok===!1?"failed":""}let seen2=new Set,out=[];for(let p of parts){let k2=p.toLowerCase();if(!seen2.has(k2)&&(seen2.add(k2),out.push(p),out.join(" \xB7 ").length>90))break}return out.join(" \xB7 ")}function buildSessionListTurnSnippet(input2){let summary=formatSessionTurnSummary(input2),dens=`${input2.densityLine||""} ${input2.comboChrome||""}`;return{summary,...input2.reviewGateLine?{reviewGate:input2.reviewGateLine}:dens.includes("review-gate:")?{reviewGate:(dens.match(/review-gate:[^\s·]+/)||[])[0]}:{},...dens.includes("review=main")?{sameModelReview:!0}:{},...dens.includes("packet:wrapped")||input2.comboChrome?.includes("packet")?{packetWrapped:!0}:{}}}var lastSnippet,init_sessionTurnSummary=__esm({"src/runtime/sessionTurnSummary.ts"(){lastSnippet=null;__name(rememberSessionTurnSnippet,"rememberSessionTurnSnippet");__name(sessionTurnSummaryFromOutcomePayload,"sessionTurnSummaryFromOutcomePayload");__name(attachSessionTurnSummary,"attachSessionTurnSummary");__name(formatSessionTurnSummary,"formatSessionTurnSummary");__name(buildSessionListTurnSnippet,"buildSessionListTurnSnippet")}});var diaryLine_exports={};__export(diaryLine_exports,{decodeDiaryEvent:()=>decodeDiaryEvent,diaryFooterFields:()=>diaryFooterFields,diaryLocaleIsZh:()=>diaryLocaleIsZh,diaryToolWire:()=>diaryToolWire,diaryVisible:()=>diaryVisible,encodeDiaryEvent:()=>encodeDiaryEvent,stampDiaryFooter:()=>stampDiaryFooter,verbZh:()=>verbZh});function verbZh(name){return VERB[name.trim().toLowerCase()]??"\u4F7F\u7528"}function diaryVisible(event){let glyph=event.kind==="thinking"?"\u25C7":event.kind==="user"?"\u258D":event.status==="fail"?"\u2717":event.kind==="outcome"?"\u2514":event.kind==="plan"?"\u25A3":event.kind==="permission"?"\u26A0":"\u25C6",fold=event.kind==="thinking"||event.kind==="edit"||event.kind==="exec"||event.kind==="plan",line=`${glyph} ${event.verb} ${event.target}`.trim();return event.metrics&&(line+=` \xB7 ${event.metrics}`),fold&&(line+=" \u203A"),line}function encodeDiaryEvent(event){return`\u27E8${event.kind}|${event.status}|${event.verb}|${event.target}|${event.metrics}\u27E9${diaryVisible(event)}`}function diaryLocaleIsZh(env5=process.env){let raw=String(env5.CLAVUE_UI_LOCALE??env5.CLAVUE_LANG??"").trim();return raw?raw.toLowerCase().startsWith("zh"):!0}function field(value){return value.replace(/\|/g,"\xA6").replace(/\s+/g," ").trim()}function lineCount3(text3){let t7=text3.replace(/\r\n/g,`
10941
10941
  `).replace(/\n$/,"");return t7?t7.split(`
10942
10942
  `).length:0}function asRec(input2){return input2&&typeof input2=="object"?input2:{}}function formatSpan(ms){if(ms==null||!Number.isFinite(ms)||ms<1e3)return"";let s2=Math.round(ms/1e3);if(s2<60)return`${s2}s`;let m3=Math.floor(s2/60),rem=s2%60;return rem?`${m3}m ${rem}s`:`${m3}m`}function diaryToolWire(opts){if(!diaryLocaleIsZh(opts.env))return null;let name=opts.name.trim(),canon=name.toLowerCase(),inp=asRec(opts.input),status2=opts.status??"run",path40=shortToolPath(String(inp.file_path??inp.path??inp.filePath??inp.target_file??"")),kind="tool",verb=verbZh(name),target="",metrics="";if(canon==="read"||canon==="readfiles"){verb="\u8BFB\u53D6",target=path40||"\u6587\u4EF6";let text3=String(opts.resultText??"");status2!=="run"&&text3.trim()&&(metrics=`${lineCount3(text3)} \u884C`)}else if(canon==="grep"||canon==="search"||canon==="glob"){verb="\u641C\u7D22";let q2=String(inp.pattern??inp.query??inp.glob??"").trim();target=q2?`"${q2.slice(0,48)}"`:path40||"\u5185\u5BB9";let text3=String(opts.resultText??""),counted=text3.match(/(\d+)\s+match/i);if(status2!=="run"){let n4=counted?Number(counted[1]):text3.split(`
10943
10943
  `).map(l=>l.trim()).filter(l=>l&&!l.startsWith("{")).length;n4>0&&(metrics=`${n4} \u5904`)}}else if(canon==="edit"||canon==="fileedit"||canon==="multiedit"||canon==="write"||canon==="filewrite"){kind="edit",verb="\u7F16\u8F91",target=path40||"\u6587\u4EF6";let edits=Array.isArray(inp.edits)?inp.edits:null,removed=0,added=0;if(edits)for(let item of edits){let rec=asRec(item);removed+=lineCount3(String(rec.old_string??rec.oldString??"")),added+=lineCount3(String(rec.new_string??rec.newString??rec.content??""))}else removed=lineCount3(String(inp.old_string??inp.oldString??"")),added=lineCount3(String(inp.new_string??inp.newString??inp.content??""));(removed||added)&&(metrics=`\u2212${removed} +${added}`)}else if(canon==="bash"||canon==="powershell"){kind="exec",verb="\u8FD0\u884C",target=(String(inp.command??inp.cmd??inp.script??"").trim()||"\u547D\u4EE4").slice(0,64);let text3=String(opts.resultText??""),pass=text3.match(/(\d+)\s+(?:pass|通过)/i)||text3.match(/(?:pass|通过)\s+(\d+)/i),bits2=[];pass&&bits2.push(`${pass[1]} \u901A\u8FC7`);let span=formatSpan(opts.elapsedMs);span&&bits2.push(span),metrics=bits2.join(" \xB7 ")}else return null;return encodeDiaryEvent({kind,status:status2,verb,target:field(target),metrics:field(metrics)})}function stampDiaryFooter(payload){Object.assign(payload,diaryFooterFields({requests:turnRequestCount(),tier:formatTierStatus()}))}function diaryFooterFields(opts){if(!diaryLocaleIsZh(opts.env))return{};let tier=String(opts.tier??"").split("\u2192")[0]?.trim(),commit=String(opts.commit??"").trim();return{diaryRequests:Math.max(0,opts.requests??0),...tier?{diaryTier:tier}:{},...commit?{diaryCommit:commit}:{}}}function decodeDiaryEvent(raw){let trimmed=raw.trimStart();if(!trimmed.startsWith("\u27E8"))return null;let end=trimmed.indexOf("\u27E9");if(end<0)return null;let parts=trimmed.slice(1,end).split("|");if(parts.length<5)return null;let[kind,status2,verb,target,metrics]=parts;return!kind||!status2||verb===void 0||target===void 0||metrics===void 0?null:{kind,status:status2,verb,target,metrics}}var VERB,init_diaryLine=__esm({"src/uiProtocol/diaryLine.ts"(){init_v1Tier();init_turnPhaseClock();init_toolJournalSummary();VERB={read:"\u8BFB\u53D6",grep:"\u641C\u7D22",search:"\u641C\u7D22",edit:"\u7F16\u8F91",write:"\u7F16\u8F91",bash:"\u8FD0\u884C",run:"\u8FD0\u884C",think:"\u601D\u8003"};__name(verbZh,"verbZh");__name(diaryVisible,"diaryVisible");__name(encodeDiaryEvent,"encodeDiaryEvent");__name(diaryLocaleIsZh,"diaryLocaleIsZh");__name(field,"field");__name(lineCount3,"lineCount");__name(asRec,"asRec");__name(formatSpan,"formatSpan");__name(diaryToolWire,"diaryToolWire");__name(stampDiaryFooter,"stampDiaryFooter");__name(diaryFooterFields,"diaryFooterFields");__name(decodeDiaryEvent,"decodeDiaryEvent")}});function truncateKeepingEditContext(lines,maxLines){if(lines.length<=maxLines||maxLines<4){if(lines.length<=maxLines)return lines;let head2=lines.slice(0,Math.max(1,maxLines-1));return head2.push(` \u2026 ${lines.length-head2.length} more`),head2}let isCtx=__name(l=>/^ {2}\d+\|/.test(l),"isCtx"),isChange=__name(l=>/^[+-] /.test(l)||/^[+-]\d/.test(l),"isChange"),i3=0;for(;i3<lines.length&&isCtx(lines[i3]);)i3++;let lead=lines.slice(0,i3),j2=lines.length;for(;j2>i3&&isCtx(lines[j2-1]);)j2--;let trail=lines.slice(j2),mid=lines.slice(i3,j2),reserved=lead.length+trail.length+1,midBudget=Math.max(2,maxLines-reserved);if(mid.length<=midBudget)return[...lead,...mid,...trail];let headMid=mid.filter(isChange).slice(0,midBudget),keepMid=headMid.length>0?headMid:mid.slice(0,midBudget),omitted=mid.length-keepMid.length;return[...lead,...keepMid,` \u2026 ${omitted} more`,...trail]}var init_editCardTruncate=__esm({"src/uiProtocol/editCardTruncate.ts"(){__name(truncateKeepingEditContext,"truncateKeepingEditContext")}});function classicTelemetryLocale(locale){let l=String(locale??"").toLowerCase();return l.startsWith("zh")?"zh":l.startsWith("ja")?"ja":"en"}function classicTokenUnit(locale){switch(classicTelemetryLocale(locale)){case"zh":return"\u8BCD\u5143";case"ja":return"\u30C8\u30FC\u30AF\u30F3";default:return"tokens"}}function formatClassicTokenCount(n4){return!Number.isFinite(n4)||n4<0?"0":formatNumber(Math.floor(n4))}function formatClassicDuration(ms){return!Number.isFinite(ms)||ms<CLASSIC_MIN_PAINT_DURATION_MS?"":ms<1e4?`${(ms/1e3).toFixed(1).replace(/\.0$/,"")}s`:formatDuration(ms)}function formatClassicOutputTokens(outputTokens,locale){return!Number.isFinite(outputTokens)||outputTokens<=0?"":`${CLASSIC_OUTPUT_TOKEN_ARROW} ${formatClassicTokenCount(outputTokens)} ${classicTokenUnit(locale)}`}function formatClassicThinkingDuration(thinkingMs,locale){if(!Number.isFinite(thinkingMs)||thinkingMs<=0)return"";let dur=formatClassicDuration(thinkingMs);if(!dur)return"";switch(classicTelemetryLocale(locale)){case"zh":return`\u5DF2\u601D\u8003 ${dur}`;case"ja":return`\u601D\u8003 ${dur}`;default:return`thought for ${dur}`}}function formatClassicTurnTelemetry(input2){let parts=[],ms=input2.elapsedMs;if(ms!=null&&Number.isFinite(ms)&&ms>=CLASSIC_MIN_PAINT_DURATION_MS){let dur=formatClassicDuration(ms);dur&&parts.push(dur)}let out=input2.outputTokens,inn=input2.inputTokens,unit=classicTokenUnit(input2.locale);input2.includeInput&&inn!=null&&inn>0&&out!=null&&out>0?parts.push(`\u2191 ${formatClassicTokenCount(inn)} \xB7 ${CLASSIC_OUTPUT_TOKEN_ARROW} ${formatClassicTokenCount(out)} ${unit}`):out!=null&&out>0?parts.push(formatClassicOutputTokens(out,input2.locale)):input2.includeInput&&inn!=null&&inn>0&&parts.push(`\u2191 ${formatClassicTokenCount(inn)} ${unit}`);let think=formatClassicThinkingDuration(Number(input2.thinkingMs??0),input2.locale);return think&&parts.push(think),parts.join(" \xB7 ")}function agentDisplayName(input2,fallback="Agent"){let raw=String(input2?.subagent_type??input2?.subagentType??input2?.agent_type??input2?.agentType??"").trim();return raw&&(raw.includes(":")&&raw.split(":").pop()||raw).trim()||fallback}function formatClassicAgentHead(name,description){let raw=String(name??"Agent").trim()||"Agent",leaf=raw.includes(":")&&raw.split(":").pop()||raw,desc=String(description??"").replace(/\s+/g," ").trim();if(!desc||desc===leaf)return leaf;let clipped=desc.length>56?`${desc.slice(0,55)}\u2026`:desc;return`${leaf}(${clipped})`}function formatClassicAgentLiveSummary(input2){let head2=formatClassicAgentHead(input2.name,input2.description),loc=classicTelemetryLocale(input2.locale),parts=[],uses=Number(input2.toolUses??0);Number.isFinite(uses)&&uses>0&&parts.push(loc==="zh"?`${uses} \u6B21\u5DE5\u5177`:loc==="ja"?`${uses} \u30C4\u30FC\u30EB`:uses===1?"1 tool use":`${uses} tool uses`);let tokens=Number(input2.outputTokens??0);Number.isFinite(tokens)&&tokens>0&&parts.push(`${formatClassicTokenCount(tokens)} ${classicTokenUnit(input2.locale)}`);let dur=formatClassicDuration(Number(input2.elapsedMs??0));return dur&&parts.push(dur),parts.length?`${head2} \xB7 ${parts.join(" \xB7 ")}`:head2}function stepClassicDisplayedTokens(displayed,target,reducedMotion=!1){if(!Number.isFinite(target)||target<0)return Math.max(0,displayed);if(reducedMotion||target<=displayed)return Math.max(displayed,target);let gap=target-displayed,increment3;return gap<70?increment3=3:gap<200?increment3=Math.max(8,Math.ceil(gap*.15)):increment3=50,Math.min(displayed+increment3,target)}function estimateClassicTokensFromText(text3){let len=String(text3??"").length;return len<=0?0:Math.max(1,Math.round(len/4))}var CLASSIC_OUTPUT_TOKEN_ARROW,CLASSIC_MIN_PAINT_DURATION_MS,init_classicTelemetry=__esm({"src/uiProtocol/classicTelemetry.ts"(){init_format2();CLASSIC_OUTPUT_TOKEN_ARROW="\u2193";__name(classicTelemetryLocale,"classicTelemetryLocale");__name(classicTokenUnit,"classicTokenUnit");__name(formatClassicTokenCount,"formatClassicTokenCount");CLASSIC_MIN_PAINT_DURATION_MS=1e3;__name(formatClassicDuration,"formatClassicDuration");__name(formatClassicOutputTokens,"formatClassicOutputTokens");__name(formatClassicThinkingDuration,"formatClassicThinkingDuration");__name(formatClassicTurnTelemetry,"formatClassicTurnTelemetry");__name(agentDisplayName,"agentDisplayName");__name(formatClassicAgentHead,"formatClassicAgentHead");__name(formatClassicAgentLiveSummary,"formatClassicAgentLiveSummary");__name(stepClassicDisplayedTokens,"stepClassicDisplayedTokens");__name(estimateClassicTokensFromText,"estimateClassicTokensFromText")}});function commandWaitsForCompletion(command7){let cmd=String(command7??"").trim();return!cmd||!cmd.includes("|")?!1:cmd.split("|").some(segment2=>BLOCKING_SEGMENT.test(segment2.trim()))}function shellProgressHint(input2){let elapsed=typeof input2.elapsedSeconds=="number"&&input2.elapsedSeconds>0?input2.elapsedSeconds:0,waits=commandWaitsForCompletion(input2.command),silent=!input2.hasOutput&&elapsed>=SHELL_SILENT_AFTER_SECONDS;if(!waits&&!silent)return"";let zh2=classicTelemetryLocale(input2.locale)==="zh",duration3=elapsed>0?formatClassicDuration(elapsed*1e3):"";return waits?zh2?duration3?`\u5DF2\u8FD0\u884C ${duration3} \xB7 \u7BA1\u9053\u8981\u7B49\u547D\u4EE4\u7ED3\u675F\u540E\u624D\u6709\u8F93\u51FA`:"\u7BA1\u9053\u8981\u7B49\u547D\u4EE4\u7ED3\u675F\u540E\u624D\u6709\u8F93\u51FA":duration3?`running ${duration3} \xB7 pipeline prints only when the command ends`:"pipeline prints only when the command ends":zh2?`\u5DF2\u8FD0\u884C ${duration3} \xB7 \u5C1A\u65E0\u8F93\u51FA`:`running ${duration3} \xB7 no output yet`}var BLOCKING_SEGMENT,SHELL_SILENT_AFTER_SECONDS,init_shellProgressLaw=__esm({"src/uiProtocol/shellProgressLaw.ts"(){init_classicTelemetry();BLOCKING_SEGMENT=/^(?:\w+=\S+\s+)*(?:sort|uniq|tac|wc|shuf|comm|join|paste|column|head|tail)\b/;__name(commandWaitsForCompletion,"commandWaitsForCompletion");SHELL_SILENT_AFTER_SECONDS=10;__name(shellProgressHint,"shellProgressHint")}});function isRecord10(value){return!!(value&&typeof value=="object"&&!Array.isArray(value))}function shortPath4(p){let s2=String(p||"").trim().replace(/\\/g,"/");if(!s2)return"";let parts=s2.split("/").filter(Boolean);return parts.length<=2?parts.join("/")||s2:`\u2026/${parts[parts.length-2]}/${parts[parts.length-1]}`}function lineCount4(text3){return text3?String(text3).replace(/\r\n/g,`
@@ -10953,7 +10953,7 @@ ${clip5(desc,120)}`:head2}}if(toolName4==="Edit"||toolName4==="FileEdit"||toolNa
10953
10953
  `):""}function planFailPaint(input2){let zh2=!!input2.zh,cls=input2.class;if(cls==="not_a_failure")return{class:cls,journalError:null,statusNotice:null,outcomeBlockers:"",terminateTurn:!1};if(cls==="interrupt_residue"){let blockers=zh2?"\u5DF2\u4E2D\u65AD":"interrupted";try{let{formatUserInterruptBlocker:formatUserInterruptBlocker2}=(init_turnCapabilityContract(),__toCommonJS(turnCapabilityContract_exports));blockers=formatUserInterruptBlocker2(zh2)}catch{}return{class:cls,journalError:null,statusNotice:null,outcomeBlockers:blockers,terminateTurn:!1}}let rawIsEssay=looksLikeAssistantEssay(input2.rawMessage),detailSeed=input2.context?.detail??(rawIsEssay?void 0:input2.rawMessage.length>0&&input2.rawMessage.length<=280?input2.rawMessage:void 0),ctx={...input2.context??{},...cls==="silent_timeout"&&!input2.context?.timeoutSource?{timeoutSource:"silent_first_token"}:{},...detailSeed?{detail:detailSeed}:{}},typed=parseTypedApiError({message:input2.rawMessage,status:input2.httpStatus,code:input2.code,zh:zh2}),rawPrimary=formatApiFailPrimaryMessage(input2.rawMessage,{zh:zh2}),preferRawRootCause=cls==="silent_timeout"||input2.code==="model_silent_timeout"||ctx.timeoutSource==="silent_first_token"||ctx.timeoutSource==="mid_turn_stall"||ctx.timeoutSource==="stream_idle"||isRichInfrastructureRootCauseMessage(String(input2.rawMessage||"")),primary=preferRawRootCause?(rawPrimary||typed.message).slice(0,400):typed.kind!=="unknown"?typed.message:rawPrimary,typedForCard={...typed,message:primary,code:input2.code||(cls==="silent_timeout"?"model_silent_timeout":typed.code),kind:(cls==="silent_timeout"||preferRawRootCause)&&typed.kind==="unknown"?"timeout":typed.kind},code=typedForCard.code,key3=apiFailFingerprint(primary),already=input2.alreadyPaintedKey&&key3&&input2.alreadyPaintedKey===key3,terminateTurn=cls==="hard_config"||cls==="hard_exhausted"||cls==="silent_timeout"||typed.kind==="auth",cardMessage=(input2.withCard!==void 0?input2.withCard:terminateTurn||cls==="soft_transport")?formatFailDiagnosticCard(typedForCard,ctx,{zh:zh2}):primary.slice(0,800),next=nextStepForFailKind(typedForCard.kind,{zh:zh2,timeoutSource:ctx.timeoutSource,code:typedForCard.code,retryAfterSec:ctx.retryAfterSec??null,attempt:ctx.attempt??null,maxAttempts:ctx.maxAttempts??null});return{class:cls,journalError:already?null:{code,message:cardMessage.slice(0,1600),blockId:API_FAIL_TURN_BLOCK_ID,httpStatus:typedForCard.httpStatus,kind:typedForCard.kind,shouldRetry:typedForCard.shouldRetry,rateLimited:typedForCard.rateLimited,acpCode:typedForCard.acpCode,next,timeoutSource:ctx.timeoutSource??null},statusNotice:null,outcomeBlockers:primary.slice(0,400),next,terminateTurn,typed:typedForCard}}function planStreamApiErrorA2p(input2){let plan2=planFailPaint({rawMessage:input2.rawMessage,class:"soft_transport",zh:input2.zh,httpStatus:input2.httpStatus,context:input2.context,withCard:!0});if(!plan2.journalError)return[];let typed=plan2.typed??parseTypedApiError({message:input2.rawMessage,status:input2.httpStatus,code:plan2.journalError.code,zh:input2.zh});return[{type:"error",payload:typedApiErrorToA2pPayload(typed,{blockId:plan2.journalError.blockId,context:input2.context,zh:input2.zh,withCard:!0})}]}function resolveTurnTerminalKind(input2){return input2.cancelled?"cancelled":input2.ok&&!input2.completionWithoutEvidence?"success":"failed"}function countOpenTodos(todos){if(!todos||todos.length===0)return 0;let n4=0;for(let t7 of todos){let s2=String(t7?.status??"").toLowerCase();s2==="completed"||s2==="cancelled"||s2==="canceled"||n4++}return n4}function formatTodosOutcomeChrome(todos,opts){let list2=todos??[];if(list2.length===0)return{nextOut:opts.next,open:0};let done=0,working=0,cancelled=0;for(let t7 of list2){let s2=String(t7?.status??"").toLowerCase();s2==="completed"?done++:s2==="cancelled"||s2==="canceled"?cancelled++:s2==="in_progress"&&working++}let open21=list2.length-done-cancelled,todosLine=opts.interrupted||cancelled>0?`${done}/${list2.length} todos \xB7 ${cancelled} cancelled \xB7 /todos`:`${done}/${list2.length} todos \xB7 ${working} working \xB7 /todos`,nextOut=opts.next;return opts.ok&&(open21>0||opts.next.includes("continue"))&&(nextOut=""),{todosLine,nextOut,open:open21}}function evaluateTurnTerminalRail(input2){let hardFail=input2.toolFailed>0||!!input2.hardVerifyFailed,zhUser=typeof input2.userTurnText=="string"&&/[\u4e00-\u9fff]/.test(input2.userTurnText);if(!input2.cancelled&&isEmptyAssistantResponseError(input2.assistantText))return{ok:!1,completionClaimed:!1,completionWithoutEvidence:!1,kind:"failed",evidenceBlocker:formatEmptyAssistantResponseMessage(zhUser)};if(input2.toolCount<=0&&input2.editCount<=0&&input2.verifyCount<=0&&(input2.openTodoCount??0)<=0&&input2.toolFailed<=0&&!input2.hardVerifyFailed&&!isCompletionClaim(input2.assistantText)){if(!input2.cancelled&&isZeroProgressExecuteTurn({toolCount:input2.toolCount,editCount:input2.editCount,cancelled:input2.cancelled,userTurnText:input2.userTurnText,assistantText:input2.assistantText,scopeLockedPostSuccess:input2.scopeLockedPostSuccess,contract:input2.contract,toolUses:input2.toolUses,toolResults:input2.toolResults})){let zh2=typeof input2.userTurnText=="string"&&/[\u4e00-\u9fff]/.test(input2.userTurnText);return{ok:!1,completionClaimed:!1,completionWithoutEvidence:!0,kind:"failed",evidenceBlocker:zeroProgressEvidenceBlocker({zh:zh2,userTurnText:input2.userTurnText,toolUses:input2.toolUses,toolCount:input2.toolCount,editCount:input2.editCount})}}let ok3=input2.streamOk&&!input2.cancelled;return{ok:ok3,completionClaimed:!1,completionWithoutEvidence:!1,kind:resolveTurnTerminalKind({cancelled:input2.cancelled,ok:ok3,completionWithoutEvidence:!1}),evidenceBlocker:void 0}}let pathTier=input2.pathTier,allowBlockingReview=input2.allowBlockingReview,pathTierDecision;if(pathTier==null||allowBlockingReview===void 0)try{if(input2.userTurnText){let pt=classifyPathTier(String(input2.userTurnText));pathTier==null&&(pathTier=pt.tier),allowBlockingReview===void 0&&(allowBlockingReview=pt.allowBlockingReview),pathTierDecision={tier:pt.tier,allowBlockingReview:pt.allowBlockingReview}}else pathTier==null&&(pathTier=null)}catch{pathTier===void 0&&(pathTier=null)}else pathTier!=null&&allowBlockingReview!==void 0&&(pathTierDecision={tier:String(pathTier),allowBlockingReview:allowBlockingReview===!0});let reviewText=input2.reviewText??extractRecentReviewText(input2.messages),honesty=evaluateHonestCompletion({assistantText:input2.assistantText,changeCount:input2.editCount,verifications:input2.hardVerifyFailed?[{passed:!1}]:input2.verifyCount>0?[{passed:!0}]:[],blockers:input2.toolFailed>0?Array.from({length:input2.toolFailed},()=>"tool error"):[],openTodoCount:input2.openTodoCount,toolCount:input2.toolCount,toolFailed:input2.toolFailed,userTurnText:input2.userTurnText,messages:input2.messages,imageToolsMounted:input2.imageToolsMounted,pathTier,allowBlockingReview,pathTierDecision,reviewText}),completionClaimed=honesty.claimed,unverifiedEditsOnly=honesty.status==="unverified"&&input2.editCount>0&&input2.verifyCount<=0&&!input2.hardVerifyFailed,completionWithoutEvidence=honesty.claimed&&!honesty.allowSuccessPresentation&&!unverifiedEditsOnly;!input2.cancelled&&isZeroProgressExecuteTurn({toolCount:input2.toolCount,editCount:input2.editCount,cancelled:input2.cancelled,userTurnText:input2.userTurnText,assistantText:input2.assistantText,contract:input2.contract,toolUses:input2.toolUses,toolResults:input2.toolResults,scopeLockedPostSuccess:input2.scopeLockedPostSuccess})&&(completionWithoutEvidence=!0);let claimAudit=auditClaimsAgainstTools({assistantText:input2.assistantText,toolUses:input2.toolUses??[],toolResults:input2.toolResults??[],editCount:input2.editCount,toolCount:input2.toolCount,cancelled:input2.cancelled});!input2.cancelled&&(claimAudit.category==="stalled_false_completion"||claimAudit.category==="stalled_narration")&&input2.editCount<=0&&(completionWithoutEvidence=!0);let verifyHardGateBlocker;if(!input2.cancelled&&!isEnvDefinedFalsy(process.env.CLAVUE_VERIFY_HARD_GATE)&&input2.planContent){let gate=computeVerifyHardGate({planContent:input2.planContent,assistantText:input2.assistantText,verifyPlanCalledThisTurn:!!input2.verifyPlanCalledThisTurn});gate&&(completionWithoutEvidence=!0,verifyHardGateBlocker=`verify hard gate \xB7 pending steps ${gate.pendingIndices.join(",")} \xB7 phrase "${gate.matchedPhrase}"`)}let reviewHardGateBlocker;if(!input2.cancelled&&!isReviewHardGateDisabled()&&input2.editCount>0&&completionClaimed){let rg=computeReviewHardGate({pathTier,allowBlockingReview,pathTierDecision,assistantText:input2.assistantText,hasMutation:input2.editCount>0,mutationFileCount:input2.editCount,reviewText,verifyFailed:!!input2.hardVerifyFailed});rg&&(completionWithoutEvidence=!0,reviewHardGateBlocker=rg.line)}let deliveryRecovered=deliveryRecoveredAfterTransportTail({streamOk:input2.streamOk,editCount:input2.editCount,toolFailed:input2.toolFailed,hardVerifyFailed:input2.hardVerifyFailed,cancelled:input2.cancelled}),ok2=(input2.streamOk||deliveryRecovered)&&!hardFail&&!completionWithoutEvidence,kind=resolveTurnTerminalKind({cancelled:input2.cancelled,ok:ok2,completionWithoutEvidence}),evidenceBlocker;if(!evidenceBlocker&&(claimAudit.category==="stalled_false_completion"||claimAudit.category==="stalled_narration")&&input2.editCount<=0&&!input2.cancelled&&(evidenceBlocker=claimAudit.unbackedClaims[0]?.slice(0,120)||claimAudit.reason||"false completion without tool evidence"),completionWithoutEvidence){if(!evidenceBlocker&&isZeroProgressExecuteTurn({toolCount:input2.toolCount,editCount:input2.editCount,cancelled:input2.cancelled,userTurnText:input2.userTurnText,assistantText:input2.assistantText,scopeLockedPostSuccess:input2.scopeLockedPostSuccess,contract:input2.contract,toolUses:input2.toolUses,toolResults:input2.toolResults})){let zh2=typeof input2.userTurnText=="string"&&/[\u4e00-\u9fff]/.test(input2.userTurnText);evidenceBlocker=zeroProgressEvidenceBlocker({zh:zh2,userTurnText:input2.userTurnText,toolUses:input2.toolUses,toolCount:input2.toolCount,editCount:input2.editCount})}!evidenceBlocker&&verifyHardGateBlocker&&(evidenceBlocker=verifyHardGateBlocker),!evidenceBlocker&&reviewHardGateBlocker&&(evidenceBlocker=reviewHardGateBlocker),evidenceBlocker||(evidenceBlocker=honesty.status==="blocked"?honesty.line?.includes("image_gen")?"image asset missing":"blocked":honesty.status==="failed_verify"?"verify failed":honesty.status==="unverified"?"unverified":COMPLETION_EVIDENCE_BLOCKER)}else hardFail&&input2.streamOk&&(evidenceBlocker=input2.toolFailed>0?`${input2.toolFailed} tool error(s)`:"verification failed");return{ok:ok2,completionClaimed,completionWithoutEvidence,kind,evidenceBlocker}}function applyTerminalHonestyToOutcomePayload(payload,opts){let out=payload;return opts.claimedComplete===!0&&(out.honestyClaimed=!0),opts.honestyAllowSuccess===!1?(out.honestyAllowSuccess=!1,out.mainlineAllowKeep=!1,out.mainlineDisposition==="keep"&&(out.mainlineDisposition="recompute")):opts.honestyAllowSuccess===!0&&(out.honestyAllowSuccess=!0,(opts.ok===!1||opts.terminalState==="failed")&&(out.honestyClaimed=!1,out.honestyStatus=void 0,out.honestyGuidance=void 0)),(opts.terminalState==="failed"||opts.ok===!1)&&(out.ok=!1,opts.terminalState&&(out.terminalState=opts.terminalState)),out}function isCompletionClaim(text3){return findCompletionClaimPhrase(text3)!==null}function isCompletionClaimWithoutEvidence(input2){if(!input2.ok)return!1;let honesty=evaluateHonestCompletion({assistantText:input2.assistantText,changeCount:input2.editCount,verifications:input2.hardVerifyFailed?[{passed:!1}]:input2.verifyCount>0?[{passed:!0}]:[],blockers:(input2.toolFailed??0)>0?Array.from({length:input2.toolFailed??0},()=>"tool error"):[],openTodoCount:input2.openTodoCount,toolCount:input2.toolCount,toolFailed:input2.toolFailed});return honesty.claimed&&!honesty.allowSuccessPresentation}function planTurnTerminal(input2){let zh2=!!input2.zh;if(input2.alreadyTerminal)return{apply:"ignored",kind:input2.kind,blockers:"",journalError:null,marker:"ignored_duplicate_terminal"};if(input2.kind==="success")return{apply:"finalized",kind:"success",blockers:"none",journalError:null,marker:zh2?"\u56DE\u5408\u5B8C\u6210":"Turn completed"};if(input2.kind==="cancelled")return{apply:"finalized",kind:"cancelled",blockers:"interrupted",journalError:null,marker:zh2?"\u56DE\u5408\u5DF2\u53D6\u6D88":"Turn cancelled"};let raw=String(input2.rawBlockers||"result failed").trim(),paintRaw=looksLikeAssistantEssay(raw)?raw:raw.split(`
10954
10954
  `).map(s2=>s2.trim()).find(Boolean)||raw,silentFirst=/silent_first_token|model_silent_timeout|模型首包超时|First-token timeout|首包超时/i.test(paintRaw),fail4=planFailPaint({rawMessage:paintRaw,class:silentFirst?"silent_timeout":"hard_config",code:silentFirst?"model_silent_timeout":"api_or_model_error",zh:zh2,withCard:!0,...silentFirst?{context:{timeoutSource:"silent_first_token"}}:{}}),genericFail=zh2?"\u6A21\u578B\u8BF7\u6C42\u5931\u8D25 \xB7 \u53EF\u91CD\u8BD5":"Model request failed \xB7 retry",spine=(fail4.outcomeBlockers||"").split(`
10955
10955
  `)[0]?.trim().slice(0,400)||"",blockers=!spine||looksLikeAssistantEssay(spine)||spine.length>160?fail4.journalError?(fail4.outcomeBlockers||genericFail).split(`
10956
- `)[0].trim().slice(0,120):genericFail:spine;return{apply:"finalized",kind:"failed",blockers:(looksLikeAssistantEssay(blockers)||/不完全一致|与预期一致/.test(blockers)?zh2?"\u6A21\u578B\u8BF7\u6C42\u5931\u8D25 \xB7 \u53EF\u91CD\u8BD5":"Model request failed \xB7 retry":blockers)||genericFail,journalError:fail4.journalError,marker:zh2?"\u56DE\u5408\u5931\u8D25":"Turn failed"}}function formatStructuredTransportFailure(input2){let zh2=!!input2.zh,status2=input2.status!=null&&Number.isFinite(input2.status)?Math.floor(Number(input2.status)):null,msg=String(input2.message||"").replace(/\s+/g," ").trim().slice(0,240),code=String(input2.code||"").trim();if(status2===401||status2===403)return zh2?`\u8BA4\u8BC1\u5931\u8D25 (${status2})${msg?` \xB7 ${msg}`:""} \xB7 \u68C0\u67E5\u5BC6\u94A5\u6216 /login`:`Auth failed (${status2})${msg?` \xB7 ${msg}`:""} \xB7 check API key or /login`;if(status2===402||status2===429){let kind=classifyQuotaExhaustion({status:status2,message:msg,code:input2.code}),track2=resolveActiveQuotaOwnerTrack();if(kind){let upsell=formatQuotaExhaustionUpsellLine(zh2?"zh-CN":"en",track2);return track2==="byok"?zh2?`\u7B2C\u4E09\u65B9\u4F59\u989D/\u9650\u6D41 (${status2})${msg?` \xB7 ${msg}`:""} \xB7 ${upsell}`:`Third-party balance/limit (${status2})${msg?` \xB7 ${msg}`:""} \xB7 ${upsell}`:zh2?`\u5B98\u65B9\u989D\u5EA6/\u9650\u6D41 (${status2})${msg?` \xB7 ${msg}`:""} \xB7 ${upsell}`:`Cloud quota/rate limit (${status2})${msg?` \xB7 ${msg}`:""} \xB7 ${upsell}`}return status2===429?zh2?`\u901F\u7387\u9650\u5236 (429)${msg?` \xB7 ${msg}`:""} \xB7 \u7A0D\u540E\u91CD\u8BD5`:`Rate limited (429)${msg?` \xB7 ${msg}`:""} \xB7 try again later`:track2==="byok"?zh2?`\u7B2C\u4E09\u65B9\u4F59\u989D\u4E0D\u8DB3 (402)${msg?` \xB7 ${msg}`:""} \xB7 \u5728\u5BC6\u94A5\u6240\u5C5E\u670D\u52A1\u5546\u5145\u503C\u6216 /provider \u6362\u8F68`:`Third-party balance (402)${msg?` \xB7 ${msg}`:""} \xB7 top up that provider or /provider switch`:zh2?`\u5B98\u65B9\u989D\u5EA6\u4E0D\u8DB3 (402)${msg?` \xB7 ${msg}`:""} \xB7 /account plans \u6216\u5207\u6362\u7B2C\u4E09\u65B9`:`Cloud quota insufficient (402)${msg?` \xB7 ${msg}`:""} \xB7 /account plans or BYOK`}return status2!=null&&status2>=500?zh2?`\u4E0A\u6E38\u670D\u52A1\u9519\u8BEF (${status2})${msg?` \xB7 ${msg}`:""} \xB7 \u53EF\u91CD\u8BD5`:`Upstream error (${status2})${msg?` \xB7 ${msg}`:""} \xB7 retry`:status2!=null&&msg?`HTTP ${status2} \xB7 ${msg}`:code&&msg?`${code} \xB7 ${msg}`:msg?formatApiFailPrimaryMessage(msg,{zh:zh2}):formatApiFailPrimaryMessage("API request failed",{zh:zh2})}var COMPLETION_EVIDENCE_BLOCKER,FAIL_SURFACE_CONTRACT_CASES,init_failSurface=__esm({"src/uiProtocol/failSurface.ts"(){init_duplexLifecycle();init_typedApiError();init_honestCompletion();init_authPolicy();init_developmentProgressGate();init_claimAudit();init_verifyHardGate();init_reviewHardGate();init_pathTier();init_envUtils();init_errors8();init_typedApiError();__name(classifyAssistantFrame,"classifyAssistantFrame");__name(extractAssistantText6,"extractAssistantText");__name(planFailPaint,"planFailPaint");__name(planStreamApiErrorA2p,"planStreamApiErrorA2p");__name(resolveTurnTerminalKind,"resolveTurnTerminalKind");__name(countOpenTodos,"countOpenTodos");__name(formatTodosOutcomeChrome,"formatTodosOutcomeChrome");__name(evaluateTurnTerminalRail,"evaluateTurnTerminalRail");COMPLETION_EVIDENCE_BLOCKER="completion claimed without execution or verification evidence";__name(applyTerminalHonestyToOutcomePayload,"applyTerminalHonestyToOutcomePayload");__name(isCompletionClaim,"isCompletionClaim");__name(isCompletionClaimWithoutEvidence,"isCompletionClaimWithoutEvidence");__name(planTurnTerminal,"planTurnTerminal");__name(formatStructuredTransportFailure,"formatStructuredTransportFailure");FAIL_SURFACE_CONTRACT_CASES=[{id:"essay-mentions-apiurl",essay:!0,expectApiError:!1,expectNonRetryable:!1},{id:"short-invalid-apiurl",text:"Invalid apiurl: not a valid URL",expectApiErrorFlag:!1,expectHeuristicShort:!0,expectNonRetryable:!0},{id:"sdk-flag-empty",isApiErrorMessage:!0,text:"API request failed",expectApiError:!0},{id:"synthetic-401",model:"<synthetic>",text:"API request failed: 401",expectApiError:!0},{id:"normal-hello",model:"grok-4.5",text:"hello",expectApiError:!1}]}});function resetTurnTrace(){turnTrace={toolUses:[],toolResults:[],assistantText:void 0,userTurnText:lastStreamUserText||void 0}}function rememberStreamUserText(raw){let text3=String(raw??"").trim();text3&&(lastStreamUserText=text3,turnTrace={...turnTrace,userTurnText:text3})}function resetFromStreamJsonLiveState(){liveTextBlockId=null,liveThinkingByIndex.clear(),liveThinkingStartedAt.clear(),pendingToolById.clear(),streamingToolsByIndex.clear(),liveAgentByParentId.clear(),turnHadAssistantText=!1,turnAssistantFinalCount=0,turnAssistantFinalCanAppend=!1,turnApiErrorText="",streamSessionId=void 0,lastStreamUserText="",resetTurnTrace()}function isEditToolName2(name){return name==="Edit"||name==="FileEdit"||name==="Write"||name==="FileWrite"}function markAssistantTextEmitted(text3){if(turnHadAssistantText=!0,typeof text3=="string"&&text3.trim()){let prev=turnTrace.assistantText??"",next=text3.trim();turnTrace={...turnTrace,assistantText:next.length>=prev.length?next:prev}}}function assistantFinalPayload(blockId,text3){let cleaned=sanitizeJournalAssistantText(text3);if(!cleaned.trim())return null;let appendToTurn=turnAssistantFinalCount>0&&turnAssistantFinalCanAppend;return turnAssistantFinalCount+=1,turnAssistantFinalCanAppend=!0,{blockId,text:cleaned,...appendToTurn?{appendToTurn:!0}:{}}}function pushAssistantFinal(out,blockId,text3){let payload=assistantFinalPayload(blockId,text3);return payload?(out.push(encodeA2p("assistant.final",payload)),!0):!1}function asRecord15(v2){return v2&&typeof v2=="object"?v2:null}function ensureLiveTextBlockId(hint){return liveTextBlockId||(liveTextBlockId=hint&&hint.length>0?`a-${hint}`:"a-live"),liveTextBlockId}function ensureLiveThinkingId(index,hint){let existing=liveThinkingByIndex.get(index);if(existing)return existing;let id=hint&&hint.length>0?`th-${hint}-${index}`:`th-live-${index}`;return liveThinkingByIndex.set(index,id),id}function noteThinkingActivity(blockId){blockId&&(liveThinkingStartedAt.has(blockId)||liveThinkingStartedAt.set(blockId,Date.now()))}function resolveThinkingDurationMs(m3,b3,blockId){let reported2=thinkingDurationMs(m3,b3);if(reported2>0)return liveThinkingStartedAt.delete(blockId),reported2;let started=liveThinkingStartedAt.get(blockId);return liveThinkingStartedAt.delete(blockId),typeof started=="number"&&started>0?Math.max(0,Date.now()-started):0}function toolSummary2(name,input2){return formatToolStartSummary(name,input2)}function taskDescription(input2){return String(input2?.description??input2?.prompt??input2?.goal??"").replace(/\s+/g," ").trim().slice(0,64)}function parseClassicTokenCountFromText(text3){if(!text3)return;let tok=text3.match(/↓\s*([\d.]+)\s*k\b/i)||text3.match(/([\d.]+)\s*k\s*(?:tokens?|词元)/i)||text3.match(/(\d[\d,]*(?:\.\d+)?)\s*(?:tokens?|词元)/i);if(!tok)return;let raw=tok[1].replace(/,/g,"").trim();if(/k\s*(?:tokens?|词元)?$/i.test(tok[0])||/↓\s*[\d.]+\s*k\b/i.test(tok[0])){let n5=parseFloat(raw);return Number.isFinite(n5)&&n5>0?Math.round(n5*1e3):void 0}let n4=parseFloat(raw);return Number.isFinite(n4)&&n4>0?Math.round(n4):void 0}function parseAgentResultMetrics(rawText){let text3=String(rawText??""),fromObj=__name(obj=>{if(!obj)return{};let toolUses=Number(obj.totalToolUseCount??obj.toolUseCount??obj.tool_count??obj.toolCount),tokens=Number(obj.totalTokens??obj.total_tokens??obj.tokenCount??obj.tokens),durationMs=Number(obj.totalDurationMs??obj.duration_ms??obj.durationMs),childAgents=Number(obj.agentCount??obj.childAgents??obj.parallelAgents);return{...Number.isFinite(toolUses)&&toolUses>0?{toolUses:Math.floor(toolUses)}:{},...Number.isFinite(tokens)&&tokens>0?{tokens:Math.floor(tokens)}:{},...Number.isFinite(durationMs)&&durationMs>0?{durationMs:Math.floor(durationMs)}:{},...Number.isFinite(childAgents)&&childAgents>1?{childAgents:Math.floor(childAgents)}:{}}},"fromObj");try{let parsed=JSON.parse(text3);if(parsed&&typeof parsed=="object"&&!Array.isArray(parsed)){let rec=parsed,nested=asRecord15(rec.toolUseResult)??asRecord15(rec.result);return{...fromObj(nested),...fromObj(rec)}}}catch{}let uses=text3.match(/(\d+)\s+tool uses/i),kids=text3.match(/(\d+)\s+parallel agents/i);return{...uses?{toolUses:Number(uses[1])}:{},...kids?{childAgents:Number(kids[1])}:{}}}function formatTaskCompleteSummary(input2,rawResult,startedAt){let desc=taskDescription(input2)||"Task",elapsedMs,m3=rawResult.match(/completed\s+in\s+([\d.]+)\s*s/i)||rawResult.match(/duration[:\s]+([\d.]+)\s*s/i);m3?elapsedMs=Math.round(parseFloat(m3[1])*1e3):startedAt&&startedAt>0&&(elapsedMs=Math.max(0,Date.now()-startedAt));let outputTokens=parseClassicTokenCountFromText(rawResult),tele=formatClassicTurnTelemetry({elapsedMs,outputTokens,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG});return{summary:tele?`Task completed \xB7 ${tele}: ${desc}`:`Task completed: ${desc}`,outputTokens,elapsedMs}}function tryParsePartialToolInput(raw){let s2=String(raw||"").trim();if(!s2)return null;try{let v2=JSON.parse(s2);if(v2&&typeof v2=="object"&&!Array.isArray(v2))return v2}catch{}let repaired=s2;(repaired.match(/(?<!\\)"/g)||[]).length%2===1&&(repaired+='"');let opens=(repaired.match(/\{/g)||[]).length,closes=(repaired.match(/\}/g)||[]).length;opens>closes&&(repaired+="}".repeat(opens-closes));try{let v2=JSON.parse(repaired);if(v2&&typeof v2=="object"&&!Array.isArray(v2))return v2}catch{}let out={},pick4=__name(keys2=>{for(let key3 of keys2){let re2=new RegExp(`"${key3}"\\s*:\\s*"((?:\\\\.|[^"\\\\])*)"`,"s"),m3=s2.match(re2);if(m3){try{out[key3]=JSON.parse(`"${m3[1]}"`)}catch{out[key3]=m3[1].replace(/\\n/g,`
10956
+ `)[0].trim().slice(0,120):genericFail:spine;return{apply:"finalized",kind:"failed",blockers:(looksLikeAssistantEssay(blockers)||/不完全一致|与预期一致/.test(blockers)?zh2?"\u6A21\u578B\u8BF7\u6C42\u5931\u8D25 \xB7 \u53EF\u91CD\u8BD5":"Model request failed \xB7 retry":blockers)||genericFail,journalError:fail4.journalError,marker:zh2?"\u56DE\u5408\u5931\u8D25":"Turn failed"}}function formatStructuredTransportFailure(input2){let zh2=!!input2.zh,status2=input2.status!=null&&Number.isFinite(input2.status)?Math.floor(Number(input2.status)):null,msg=String(input2.message||"").replace(/\s+/g," ").trim().slice(0,240),code=String(input2.code||"").trim();if(status2===401||status2===403)return zh2?`\u8BA4\u8BC1\u5931\u8D25 (${status2})${msg?` \xB7 ${msg}`:""} \xB7 \u68C0\u67E5\u5BC6\u94A5\u6216 /login`:`Auth failed (${status2})${msg?` \xB7 ${msg}`:""} \xB7 check API key or /login`;if(status2===402||status2===429){let kind=classifyQuotaExhaustion({status:status2,message:msg,code:input2.code}),track2=resolveActiveQuotaOwnerTrack();if(kind){let upsell=formatQuotaExhaustionUpsellLine(zh2?"zh-CN":"en",track2);return track2==="byok"?zh2?`\u7B2C\u4E09\u65B9\u4F59\u989D/\u9650\u6D41 (${status2})${msg?` \xB7 ${msg}`:""} \xB7 ${upsell}`:`Third-party balance/limit (${status2})${msg?` \xB7 ${msg}`:""} \xB7 ${upsell}`:zh2?`\u5B98\u65B9\u989D\u5EA6/\u9650\u6D41 (${status2})${msg?` \xB7 ${msg}`:""} \xB7 ${upsell}`:`Cloud quota/rate limit (${status2})${msg?` \xB7 ${msg}`:""} \xB7 ${upsell}`}return status2===429?zh2?`\u901F\u7387\u9650\u5236 (429)${msg?` \xB7 ${msg}`:""} \xB7 \u7A0D\u540E\u91CD\u8BD5`:`Rate limited (429)${msg?` \xB7 ${msg}`:""} \xB7 try again later`:track2==="byok"?zh2?`\u7B2C\u4E09\u65B9\u4F59\u989D\u4E0D\u8DB3 (402)${msg?` \xB7 ${msg}`:""} \xB7 \u5728\u5BC6\u94A5\u6240\u5C5E\u670D\u52A1\u5546\u5145\u503C\u6216 /provider \u6362\u8F68`:`Third-party balance (402)${msg?` \xB7 ${msg}`:""} \xB7 top up that provider or /provider switch`:zh2?`\u5B98\u65B9\u989D\u5EA6\u4E0D\u8DB3 (402)${msg?` \xB7 ${msg}`:""} \xB7 /account plans \u6216\u5207\u6362\u7B2C\u4E09\u65B9`:`Cloud quota insufficient (402)${msg?` \xB7 ${msg}`:""} \xB7 /account plans or BYOK`}return status2!=null&&status2>=500?zh2?`\u4E0A\u6E38\u670D\u52A1\u9519\u8BEF (${status2})${msg?` \xB7 ${msg}`:""} \xB7 \u53EF\u91CD\u8BD5`:`Upstream error (${status2})${msg?` \xB7 ${msg}`:""} \xB7 retry`:status2!=null&&msg?`HTTP ${status2} \xB7 ${msg}`:code&&msg?`${code} \xB7 ${msg}`:msg?formatApiFailPrimaryMessage(msg,{zh:zh2}):formatApiFailPrimaryMessage("API request failed",{zh:zh2})}var COMPLETION_EVIDENCE_BLOCKER,FAIL_SURFACE_CONTRACT_CASES,init_failSurface=__esm({"src/uiProtocol/failSurface.ts"(){init_duplexLifecycle();init_typedApiError();init_honestCompletion();init_authPolicy();init_developmentProgressGate();init_claimAudit();init_verifyHardGate();init_reviewHardGate();init_pathTier();init_envUtils();init_errors8();init_typedApiError();__name(classifyAssistantFrame,"classifyAssistantFrame");__name(extractAssistantText6,"extractAssistantText");__name(planFailPaint,"planFailPaint");__name(planStreamApiErrorA2p,"planStreamApiErrorA2p");__name(resolveTurnTerminalKind,"resolveTurnTerminalKind");__name(countOpenTodos,"countOpenTodos");__name(formatTodosOutcomeChrome,"formatTodosOutcomeChrome");__name(evaluateTurnTerminalRail,"evaluateTurnTerminalRail");COMPLETION_EVIDENCE_BLOCKER="completion claimed without execution or verification evidence";__name(applyTerminalHonestyToOutcomePayload,"applyTerminalHonestyToOutcomePayload");__name(isCompletionClaim,"isCompletionClaim");__name(isCompletionClaimWithoutEvidence,"isCompletionClaimWithoutEvidence");__name(planTurnTerminal,"planTurnTerminal");__name(formatStructuredTransportFailure,"formatStructuredTransportFailure");FAIL_SURFACE_CONTRACT_CASES=[{id:"essay-mentions-apiurl",essay:!0,expectApiError:!1,expectNonRetryable:!1},{id:"short-invalid-apiurl",text:"Invalid apiurl: not a valid URL",expectApiErrorFlag:!1,expectHeuristicShort:!0,expectNonRetryable:!0},{id:"sdk-flag-empty",isApiErrorMessage:!0,text:"API request failed",expectApiError:!0},{id:"synthetic-401",model:"<synthetic>",text:"API request failed: 401",expectApiError:!0},{id:"normal-hello",model:"grok-4.5",text:"hello",expectApiError:!1}]}});function resetTurnTrace(){turnTrace={toolUses:[],toolResults:[],assistantText:void 0,userTurnText:lastStreamUserText||void 0}}function rememberStreamUserText(raw){let text3=String(raw??"").trim();text3&&(lastStreamUserText=text3,turnTrace={...turnTrace,userTurnText:text3},resetTurnThinking())}function resetFromStreamJsonLiveState(){liveTextBlockId=null,resetTurnThinking(),liveThinkingStartedAt.clear(),pendingToolById.clear(),streamingToolsByIndex.clear(),liveAgentByParentId.clear(),turnHadAssistantText=!1,turnAssistantFinalCount=0,turnAssistantFinalCanAppend=!1,turnApiErrorText="",streamSessionId=void 0,lastStreamUserText="",resetTurnTrace()}function isEditToolName2(name){return name==="Edit"||name==="FileEdit"||name==="Write"||name==="FileWrite"}function markAssistantTextEmitted(text3){if(turnHadAssistantText=!0,typeof text3=="string"&&text3.trim()){let prev=turnTrace.assistantText??"",next=text3.trim();turnTrace={...turnTrace,assistantText:next.length>=prev.length?next:prev}}}function assistantFinalPayload(blockId,text3){let cleaned=sanitizeJournalAssistantText(text3);if(!cleaned.trim())return null;let appendToTurn=turnAssistantFinalCount>0&&turnAssistantFinalCanAppend;return turnAssistantFinalCount+=1,turnAssistantFinalCanAppend=!0,{blockId,text:cleaned,...appendToTurn?{appendToTurn:!0}:{}}}function pushAssistantFinal(out,blockId,text3){let payload=assistantFinalPayload(blockId,text3);return payload?(out.push(encodeA2p("assistant.final",payload)),!0):!1}function asRecord15(v2){return v2&&typeof v2=="object"?v2:null}function ensureLiveTextBlockId(hint){return liveTextBlockId||(liveTextBlockId=hint&&hint.length>0?`a-${hint}`:"a-live"),liveTextBlockId}function noteThinkingActivity(blockId){blockId&&(liveThinkingStartedAt.has(blockId)||liveThinkingStartedAt.set(blockId,Date.now()))}function resolveThinkingDurationMs(m3,b3,blockId){let reported2=thinkingDurationMs(m3,b3);if(reported2>0)return liveThinkingStartedAt.delete(blockId),reported2;let started=liveThinkingStartedAt.get(blockId);return liveThinkingStartedAt.delete(blockId),typeof started=="number"&&started>0?Math.max(0,Date.now()-started):0}function toolSummary2(name,input2){return formatToolStartSummary(name,input2)}function taskDescription(input2){return String(input2?.description??input2?.prompt??input2?.goal??"").replace(/\s+/g," ").trim().slice(0,64)}function parseClassicTokenCountFromText(text3){if(!text3)return;let tok=text3.match(/↓\s*([\d.]+)\s*k\b/i)||text3.match(/([\d.]+)\s*k\s*(?:tokens?|词元)/i)||text3.match(/(\d[\d,]*(?:\.\d+)?)\s*(?:tokens?|词元)/i);if(!tok)return;let raw=tok[1].replace(/,/g,"").trim();if(/k\s*(?:tokens?|词元)?$/i.test(tok[0])||/↓\s*[\d.]+\s*k\b/i.test(tok[0])){let n5=parseFloat(raw);return Number.isFinite(n5)&&n5>0?Math.round(n5*1e3):void 0}let n4=parseFloat(raw);return Number.isFinite(n4)&&n4>0?Math.round(n4):void 0}function parseAgentResultMetrics(rawText){let text3=String(rawText??""),fromObj=__name(obj=>{if(!obj)return{};let toolUses=Number(obj.totalToolUseCount??obj.toolUseCount??obj.tool_count??obj.toolCount),tokens=Number(obj.totalTokens??obj.total_tokens??obj.tokenCount??obj.tokens),durationMs=Number(obj.totalDurationMs??obj.duration_ms??obj.durationMs),childAgents=Number(obj.agentCount??obj.childAgents??obj.parallelAgents);return{...Number.isFinite(toolUses)&&toolUses>0?{toolUses:Math.floor(toolUses)}:{},...Number.isFinite(tokens)&&tokens>0?{tokens:Math.floor(tokens)}:{},...Number.isFinite(durationMs)&&durationMs>0?{durationMs:Math.floor(durationMs)}:{},...Number.isFinite(childAgents)&&childAgents>1?{childAgents:Math.floor(childAgents)}:{}}},"fromObj");try{let parsed=JSON.parse(text3);if(parsed&&typeof parsed=="object"&&!Array.isArray(parsed)){let rec=parsed,nested=asRecord15(rec.toolUseResult)??asRecord15(rec.result);return{...fromObj(nested),...fromObj(rec)}}}catch{}let uses=text3.match(/(\d+)\s+tool uses/i),kids=text3.match(/(\d+)\s+parallel agents/i);return{...uses?{toolUses:Number(uses[1])}:{},...kids?{childAgents:Number(kids[1])}:{}}}function formatTaskCompleteSummary(input2,rawResult,startedAt){let desc=taskDescription(input2)||"Task",elapsedMs,m3=rawResult.match(/completed\s+in\s+([\d.]+)\s*s/i)||rawResult.match(/duration[:\s]+([\d.]+)\s*s/i);m3?elapsedMs=Math.round(parseFloat(m3[1])*1e3):startedAt&&startedAt>0&&(elapsedMs=Math.max(0,Date.now()-startedAt));let outputTokens=parseClassicTokenCountFromText(rawResult),tele=formatClassicTurnTelemetry({elapsedMs,outputTokens,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG});return{summary:tele?`Task completed \xB7 ${tele}: ${desc}`:`Task completed: ${desc}`,outputTokens,elapsedMs}}function tryParsePartialToolInput(raw){let s2=String(raw||"").trim();if(!s2)return null;try{let v2=JSON.parse(s2);if(v2&&typeof v2=="object"&&!Array.isArray(v2))return v2}catch{}let repaired=s2;(repaired.match(/(?<!\\)"/g)||[]).length%2===1&&(repaired+='"');let opens=(repaired.match(/\{/g)||[]).length,closes=(repaired.match(/\}/g)||[]).length;opens>closes&&(repaired+="}".repeat(opens-closes));try{let v2=JSON.parse(repaired);if(v2&&typeof v2=="object"&&!Array.isArray(v2))return v2}catch{}let out={},pick4=__name(keys2=>{for(let key3 of keys2){let re2=new RegExp(`"${key3}"\\s*:\\s*"((?:\\\\.|[^"\\\\])*)"`,"s"),m3=s2.match(re2);if(m3){try{out[key3]=JSON.parse(`"${m3[1]}"`)}catch{out[key3]=m3[1].replace(/\\n/g,`
10957
10957
  `).replace(/\\"/g,'"')}return}let reOpen=new RegExp(`"${key3}"\\s*:\\s*"((?:\\\\.|[^"\\\\])*)$`,"s"),m22=s2.match(reOpen);m22&&(out[key3]=m22[1].replace(/\\n/g,`
10958
10958
  `).replace(/\\"/g,'"'))}},"pick");return pick4(["file_path","path","filePath"]),pick4(["old_string","oldString"]),pick4(["new_string","newString","content"]),out.path&&!out.file_path&&(out.file_path=out.path),out.filePath&&!out.file_path&&(out.file_path=out.filePath),out.oldString&&!out.old_string&&(out.old_string=out.oldString),out.newString&&!out.new_string&&(out.new_string=out.newString),Object.keys(out).length>0?out:null}function classifyPendingEditOp(name,input2){let inp=input2||{},isWrite=name==="Write"||name==="FileWrite",path40=String(inp.file_path??inp.path??inp.filePath??"").trim(),oldS=String(inp.old_string??inp.oldString??""),newS=String(inp.new_string??inp.newString??inp.content??"");return isWrite?!path40&&!newS?"pending":newS?"overwrite":"create":oldS||newS||path40?"edit":"pending"}function formatPendingEditSummary(name,input2){let inp=input2||{},op=classifyPendingEditOp(name,inp),path40=shortToolPath(String(inp.file_path??inp.path??inp.filePath??"")),pathBit=path40&&path40!=="file"?path40:"";return op==="create"?pathBit?`Create(${pathBit})`:"Create(\u2026)":op==="overwrite"?pathBit?`Write(${pathBit})`:"Write(\u2026)":op==="pending"?pathBit?`Update(${pathBit})`:"Update(\u2026)":pathBit?`Update(${pathBit})`:"pending edit\u2026"}function formatEditDiffBody(name,input2,resultText2,opts){let inp=input2||{},isWrite=name==="Write"||name==="FileWrite",path40=String(inp.file_path??inp.path??inp.filePath??"").trim(),oldS=String(inp.old_string??inp.oldString??""),newS=String(inp.new_string??inp.newString??inp.content??""),dens=getActiveJournalDensityPreset(),maxLines=dens.id==="verbose"?40:dens.id==="opencode"?16:22,lines=[],startLineHint=(()=>{for(let k2 of["old_start_line","start_line","startLine","line","line_number","lineNumber"]){let n4=Number(inp[k2]);if(Number.isFinite(n4)&&n4>0)return Math.floor(n4)}return 0})();if(opts?.pending){let op=classifyPendingEditOp(name,inp);op==="create"?lines.push("pending create"):op==="overwrite"?lines.push("pending overwrite"):op==="edit"?lines.push("pending edit"):lines.push("pending\u2026")}if(path40){let parts=path40.replace(/\\/g,"/").split("/").filter(Boolean),short=parts.length<=3?parts.join("/")||path40:parts.slice(-3).join("/");lines.push(short)}let fileContent=typeof opts?.fileContent=="string"?opts.fileContent:typeof inp.__fileContent=="string"?String(inp.__fileContent):typeof inp.originalFile=="string"?String(inp.originalFile):tryReadEditFileContent(path40),patchHunks2=extractStructuredPatchHunks(inp);if(patchHunks2&&patchHunks2.length>0){let hunkBody=formatHunksAsEditBody(patchHunks2,maxLines,{pending:!!opts?.pending});if(hunkBody.some(l=>/^ {2}\d+\|/.test(l)))return lines.push(...hunkBody),lines.join(`
10959
10959
  `)}if(isWrite&&newS&&!oldS){let contentLines=newS.replace(/\r\n/g,`
@@ -10992,16 +10992,16 @@ ${detail.slice(0,240)}`;return sig===lastSig||now3-lastEmitAt<minIntervalMs&&las
10992
10992
  ${tail2.join(`
10993
10993
  `)}`}}else{let maxLines=opts?.maxLines??10;lines.length>maxLines&&(t7=`${lines.slice(0,maxLines).join(`
10994
10994
  `)}
10995
- \u2026 +${lines.length-maxLines} more`)}return t7.length>maxChars&&(t7=`${t7.slice(0,maxChars)}\u2026`),t7}function extractIncrementalText(m3){if(typeof m3.delta=="string"&&m3.delta)return m3.delta;if(typeof m3.partial=="string"&&m3.partial)return m3.partial;if(typeof m3.text_delta=="string"&&m3.text_delta)return m3.text_delta;let delta=asRecord15(m3.delta);if(delta){if(typeof delta.text=="string"&&delta.text)return delta.text;if(typeof delta.partial=="string"&&delta.partial)return delta.partial;if(typeof delta.partial_json=="string"&&delta.partial_json)return delta.partial_json}let partial3=asRecord15(m3.partial);return partial3&&typeof partial3.text=="string"&&partial3.text?partial3.text:null}function thinkingDurationMs(m3,b3){let candidates=[b3.duration_ms,b3.durationMs,b3.ms,b3.thinking_duration_ms,b3.thinkingDurationMs,b3.thinking_ms,b3.thinkingMs,m3.thinking_duration_ms,m3.thinkingDurationMs,m3.thinking_ms,m3.thinkingMs,m3.duration_ms,m3.durationMs,m3.ms];for(let c4 of candidates)if(typeof c4=="number"&&Number.isFinite(c4)&&c4>0)return c4;return 0}function blockIdFor(m3,fallback){return String(m3.uuid??m3.id??m3.blockId??fallback)}function contentBlockDeltaToA2p(event,outer){let out=[],delta=asRecord15(event.delta)??asRecord15(outer?.delta);if(!delta)return out;let index=typeof event.index=="number"?event.index:typeof outer?.index=="number"?outer.index:0,baseId=blockIdFor(outer??event,`stream-${index}`),deltaType=String(delta.type??"");if(deltaType==="text_delta"||typeof delta.text=="string"){let text3=typeof delta.text=="string"?delta.text:"";if(text3){turnAssistantFinalCanAppend=!1;let id=ensureLiveTextBlockId(baseId);markAssistantTextEmitted(),out.push(encodeA2p("assistant.delta",{blockId:id,text:text3}))}return out}if(deltaType==="thinking_delta"||typeof delta.thinking=="string"){let thinking=typeof delta.thinking=="string"?delta.thinking:typeof delta.text=="string"?delta.text:"";if(thinking){let id=ensureLiveThinkingId(index,baseId);noteThinkingActivity(id),out.push(encodeA2p("route.status",{provider:null,model:null,qualityTier:null,mode:null,ctxPct:null,thinking:!0})),out.push(encodeA2p("thinking.delta",{blockId:id,text:thinking.slice(0,THINKING_TEXT_CAP)}))}return out}if(deltaType==="input_json_delta"||typeof delta.partial_json=="string"||typeof delta.input_json_delta=="string"){let chunk3=typeof delta.partial_json=="string"?delta.partial_json:typeof delta.input_json_delta=="string"?delta.input_json_delta:typeof delta.text=="string"?delta.text:"";if(!chunk3)return out;let st=streamingToolsByIndex.get(index);st||(st={id:`t-stream-${index}`,name:"Edit",jsonBuf:"",lastSig:"",lastEmitAt:0},streamingToolsByIndex.set(index,st)),st.jsonBuf+=chunk3,(st.name==="Edit"||st.name==="Tool")&&/"content"\s*:/.test(st.jsonBuf)&&!/"old_string"\s*:/.test(st.jsonBuf)&&(st.name="Write");let now3=Date.now(),built=buildPendingEditToolStart(st,now3,80,st.lastEmitAt,st.lastSig);if(built){st.lastEmitAt=now3,st.lastSig=built.sig;let parsed=tryParsePartialToolInput(st.jsonBuf);if(parsed){let p=String(parsed.file_path??parsed.path??parsed.filePath??"").trim(),snap=typeof parsed.__fileContent=="string"?String(parsed.__fileContent):p?tryReadEditFileContent(p):null;snap&&(parsed.__fileContent=snap),pendingToolById.set(st.id,{name:st.name,input:parsed,startedAt:st.lastEmitAt||now3,...snap?{fileContent:snap}:{}})}out.push(encodeA2p("tool.start",built.payload))}return out}return out}function streamJsonToA2pLines(msg){let m3=asRecord15(msg);if(!m3||typeof m3.type!="string")return[];let out=[],type=m3.type;if(type==="content_block_delta")return contentBlockDeltaToA2p(m3,m3);if(type==="stream_event"){let event=asRecord15(m3.event);if(!event||typeof event.type!="string")return out;if(event.type==="content_block_delta")return contentBlockDeltaToA2p(event,m3);if(event.type==="message_start"){let msg2=asRecord15(event.message),mid=String(msg2?.id??m3.uuid??"").trim();return liveTextBlockId=mid?`a-${mid}`:"a-live",liveThinkingByIndex.clear(),out}if(event.type==="message_stop")return liveThinkingByIndex.clear(),out;if(event.type==="content_block_start"){let cb=asRecord15(event.content_block),idx=typeof event.index=="number"?event.index:0;if(cb?.type==="text"){let bid=String(cb.id??"").trim();bid?liveTextBlockId=`a-${bid}`:liveTextBlockId||(liveTextBlockId="a-live")}if(cb?.type==="thinking"){let bid=String(cb.id??"").trim(),thId=ensureLiveThinkingId(idx,bid||void 0);noteThinkingActivity(thId),out.push(encodeA2p("route.status",{provider:null,model:null,qualityTier:null,mode:null,ctxPct:null,thinking:!0}))}if(cb?.type==="tool_use"){let id=String(cb.id??`t-stream-${idx}`).trim()||`t-stream-${idx}`,name=String(cb.name??"Tool"),inputRec=asRecord15(cb.input)??{};if(streamingToolsByIndex.set(idx,{id,name,jsonBuf:Object.keys(inputRec).length>0?JSON.stringify(inputRec):"",lastSig:"",lastEmitAt:0}),isEditToolName2(name)){turnAssistantFinalCanAppend=!1;let summary=formatPendingEditSummary(name,inputRec),detail=formatEditDiffBody(name,inputRec,void 0,{pending:!0});out.push(encodeA2p("tool.start",{blockId:id,tool:name,summary,tier:0,detail,pending:!0})),pendingToolById.set(id,{name,input:inputRec,startedAt:Date.now()})}}return out}if(event.type==="content_block_stop"){let index=typeof event.index=="number"?event.index:0,baseId=blockIdFor(m3,`stream-${index}`);if(event.content_block_type==="thinking"||event.kind==="thinking"){let thId=liveThinkingByIndex.get(index)||`th-${baseId}-${index}`;out.push(encodeA2p("thinking.end",{blockId:thId,ms:resolveThinkingDurationMs(m3,event,thId)}))}let st=streamingToolsByIndex.get(index);if(st&&isEditToolName2(st.name)){let built=buildPendingEditToolStart(st,Date.now(),0,0,"");if(built){out.push(encodeA2p("tool.start",built.payload));let parsed=tryParsePartialToolInput(st.jsonBuf);parsed&&pendingToolById.set(st.id,{name:st.name,input:parsed,startedAt:Date.now()})}}return streamingToolsByIndex.delete(index),out}return out}if(type==="assistant"){let explicitMainline=parseMainlineTurnRuntimeSnapshot(m3.mainlineRuntime);explicitMainline&&(!turnTrace.mainlineRuntime||explicitMainline.revision>=turnTrace.mainlineRuntime.revision)&&(turnTrace={...turnTrace,mainlineRuntime:explicitMainline});let parentToolUseId=String(m3.parent_tool_use_id??"").trim();if(parentToolUseId){let parentPending=pendingToolById.get(parentToolUseId),liveExisting=liveAgentByParentId.get(parentToolUseId),parentName=parentPending?.name||liveExisting?.name||"";if((parentName==="Agent"||parentName==="Task")&&(parentPending||liveExisting)){let message2=asRecord15(m3.message),usage3=asRecord15(m3.usage)??asRecord15(message2?.usage),addTokens=0;if(usage3){let out2=Number(usage3.output_tokens??usage3.outputTokens??0)||0;out2>0&&(addTokens=out2)}if(addTokens<=0){let content2=message2?.content,text3="";typeof content2=="string"?text3=content2:Array.isArray(content2)&&(text3=content2.map(block2=>{let b3=asRecord15(block2);return b3?.type==="text"&&typeof b3.text=="string"?b3.text:""}).join("")),addTokens=estimateClassicTokensFromText(text3)}let live=liveExisting;if(!live){let desc=taskDescription(parentPending?.input??null);live={name:parentName==="Task"?"Task":"Agent",description:desc,startedAt:parentPending?.startedAt??Date.now(),targetTokens:0,displayedTokens:0,lastEmitAt:0,lastSig:""},liveAgentByParentId.set(parentToolUseId,live)}addTokens>0&&(live.targetTokens=Math.max(live.targetTokens,addTokens)),live.displayedTokens=stepClassicDisplayedTokens(live.displayedTokens,live.targetTokens);let now3=Date.now(),elapsedMs=Math.max(0,now3-live.startedAt),summary=formatClassicAgentLiveSummary({name:live.name,description:live.description,elapsedMs,outputTokens:live.displayedTokens>0?live.displayedTokens:null,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG});summary!==live.lastSig&&now3-live.lastEmitAt>=AGENT_PROGRESS_MIN_INTERVAL_MS&&(live.lastSig=summary,live.lastEmitAt=now3,out.push(encodeA2p("tool.progress",{blockId:parentToolUseId,tool:live.name,summary,elapsedSeconds:elapsedMs/1e3,totalTokens:live.displayedTokens,classicTelemetry:formatClassicTurnTelemetry({elapsedMs,outputTokens:live.displayedTokens>0?live.displayedTokens:null,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG})})))}}if(isApiErrorAssistantMessage(m3)){let content2=asRecord15(m3.message)?.content;Array.isArray(content2)&&(turnApiErrorText=content2.map(block2=>{let b3=asRecord15(block2);return b3?.type==="text"&&typeof b3.text=="string"?b3.text:""}).filter(Boolean).join(`
10996
- `).trim()),turnApiErrorText||(turnApiErrorText=String(m3.error??"API request failed"));let zh2=String(process.env.CLAVUE_UI_LOCALE||process.env.LANG||"").startsWith("zh");turnApiErrorText=formatApiFailPrimaryMessage(turnApiErrorText,{zh:zh2});try{let{withProviderRouteContext:withProviderRouteContext2}=(init_errorUtils(),__toCommonJS(errorUtils_exports)),responseModel=asRecord15(m3.message)?.model,modelHint=process.env.ANTHROPIC_MODEL||process.env.ANTHROPIC_CUSTOM_MODEL_OPTION||void 0||responseModel||void 0;turnApiErrorText=withProviderRouteContext2(turnApiErrorText,modelHint&&modelHint!=="<synthetic>"?modelHint:void 0)}catch{}try{let{planStreamApiErrorA2p:planStreamApiErrorA2p2}=(init_failSurface(),__toCommonJS(failSurface_exports)),planned=planStreamApiErrorA2p2({rawMessage:turnApiErrorText,zh:zh2});if(planned.length>0){for(let ev of planned)out.push(encodeA2p(ev.type,ev.payload));return out}}catch{}return out.push(encodeA2p("error",{code:"api_or_model_error",message:turnApiErrorText.slice(0,800),blockId:API_FAIL_TURN_BLOCK_ID})),out}let content=asRecord15(m3.message)?.content,incremental=extractIncrementalText(m3);if(!Array.isArray(content)){let text3=incremental??(typeof m3.result=="string"?m3.result:typeof m3.text=="string"?m3.text:"");if(text3){let eventType=incremental?"assistant.delta":"assistant.final",blockId=ensureLiveTextBlockId(String(m3.uuid??m3.id??"").trim()||void 0);markAssistantTextEmitted(text3),eventType==="assistant.final"?pushAssistantFinal(out,blockId,text3)&&(liveTextBlockId=null):out.push(encodeA2p("assistant.delta",{blockId,text:text3}))}return out}if(incremental){turnAssistantFinalCanAppend=!1;let blockId=ensureLiveTextBlockId(String(m3.uuid??m3.id??"").trim()||void 0);markAssistantTextEmitted(),out.push(encodeA2p("assistant.delta",{blockId,text:incremental}))}for(let block2 of content){let b3=asRecord15(block2);if(b3){if(b3.type==="text"&&typeof b3.text=="string"&&b3.text.trim()){if(incremental)continue;let blockIncr=typeof b3.delta=="string"?b3.delta:typeof asRecord15(b3.delta)?.text=="string"?String(asRecord15(b3.delta).text):null,textId=liveTextBlockId||(b3.id?`a-${String(b3.id)}`:m3.uuid?`a-${String(m3.uuid)}`:m3.id?`a-${String(m3.id)}`:`a-${Date.now()}`);blockIncr?(turnAssistantFinalCanAppend=!1,liveTextBlockId||(liveTextBlockId=textId),markAssistantTextEmitted(),out.push(encodeA2p("assistant.delta",{blockId:textId,text:blockIncr}))):(markAssistantTextEmitted(b3.text),pushAssistantFinal(out,textId,b3.text),liveTextBlockId=null)}if(b3.type==="thinking"&&typeof b3.thinking=="string"){let id=liveThinkingByIndex.get(0)||`th-${String(b3.id??m3.uuid??Date.now())}`;noteThinkingActivity(id);let ms=resolveThinkingDurationMs(m3,b3,id);out.push(encodeA2p("route.status",{provider:null,model:null,qualityTier:null,mode:null,ctxPct:null,thinking:!0})),out.push(encodeA2p("thinking.delta",{blockId:id,text:b3.thinking.slice(0,THINKING_TEXT_CAP)})),out.push(encodeA2p("thinking.end",{blockId:id,ms}))}if(b3.type==="tool_use"){turnAssistantFinalCanAppend=!1;let name=String(b3.name??"Tool"),id=String(b3.id??`t-${Date.now()}`),inputRec=asRecord15(b3.input)??{},preEditFile;if(isEditToolName2(name)){let p=String(inputRec.file_path??inputRec.path??inputRec.filePath??"").trim(),snap=p?tryReadEditFileContent(p):null;snap&&(preEditFile=snap,inputRec.__fileContent=snap)}pendingToolById.set(id,{name,input:inputRec,startedAt:Date.now(),...preEditFile?{fileContent:preEditFile}:{}}),turnTrace.toolUses=[...turnTrace.toolUses,{id,name,input:b3.input??inputRec}];let presentation=classicToolPresentation(name,b3.input),summary=presentation.summary||toolSummary2(name,b3.input),isEdit=isEditToolName2(name),isTask=name==="Agent"||name==="Task",startDetail="";if(isEdit)startDetail=formatEditDiffBody(name,inputRec,void 0,{fileContent:preEditFile??null});else if(name==="Bash"||name==="PowerShell")startDetail="";else if(isTask){let desc=taskDescription(inputRec),prompt=String(inputRec.prompt??"").trim(),promptHead=prompt&&prompt!==desc?prompt.split(`
10995
+ \u2026 +${lines.length-maxLines} more`)}return t7.length>maxChars&&(t7=`${t7.slice(0,maxChars)}\u2026`),t7}function extractIncrementalText(m3){if(typeof m3.delta=="string"&&m3.delta)return m3.delta;if(typeof m3.partial=="string"&&m3.partial)return m3.partial;if(typeof m3.text_delta=="string"&&m3.text_delta)return m3.text_delta;let delta=asRecord15(m3.delta);if(delta){if(typeof delta.text=="string"&&delta.text)return delta.text;if(typeof delta.partial=="string"&&delta.partial)return delta.partial;if(typeof delta.partial_json=="string"&&delta.partial_json)return delta.partial_json}let partial3=asRecord15(m3.partial);return partial3&&typeof partial3.text=="string"&&partial3.text?partial3.text:null}function thinkingDurationMs(m3,b3){let candidates=[b3.duration_ms,b3.durationMs,b3.ms,b3.thinking_duration_ms,b3.thinkingDurationMs,b3.thinking_ms,b3.thinkingMs,m3.thinking_duration_ms,m3.thinkingDurationMs,m3.thinking_ms,m3.thinkingMs,m3.duration_ms,m3.durationMs,m3.ms];for(let c4 of candidates)if(typeof c4=="number"&&Number.isFinite(c4)&&c4>0)return c4;return 0}function blockIdFor(m3,fallback){return String(m3.uuid??m3.id??m3.blockId??fallback)}function contentBlockDeltaToA2p(event,outer){let out=[],delta=asRecord15(event.delta)??asRecord15(outer?.delta);if(!delta)return out;let index=typeof event.index=="number"?event.index:typeof outer?.index=="number"?outer.index:0,baseId=blockIdFor(outer??event,`stream-${index}`),deltaType=String(delta.type??"");if(deltaType==="text_delta"||typeof delta.text=="string"){let text3=typeof delta.text=="string"?delta.text:"";if(text3){turnAssistantFinalCanAppend=!1;let id=ensureLiveTextBlockId(baseId);markAssistantTextEmitted(),out.push(encodeA2p("assistant.delta",{blockId:id,text:text3}))}return out}if(deltaType==="thinking_delta"||typeof delta.thinking=="string"){let thinking=typeof delta.thinking=="string"?delta.thinking:typeof delta.text=="string"?delta.text:"";if(thinking){let id=ensureTurnThinkingId();noteThinkingActivity(id),out.push(encodeA2p("route.status",{provider:null,model:null,qualityTier:null,mode:null,ctxPct:null,thinking:!0})),out.push(encodeA2p("thinking.delta",{blockId:id,text:thinking.slice(0,THINKING_TEXT_CAP)}))}return out}if(deltaType==="input_json_delta"||typeof delta.partial_json=="string"||typeof delta.input_json_delta=="string"){let chunk3=typeof delta.partial_json=="string"?delta.partial_json:typeof delta.input_json_delta=="string"?delta.input_json_delta:typeof delta.text=="string"?delta.text:"";if(!chunk3)return out;let st=streamingToolsByIndex.get(index);st||(st={id:`t-stream-${index}`,name:"Edit",jsonBuf:"",lastSig:"",lastEmitAt:0},streamingToolsByIndex.set(index,st)),st.jsonBuf+=chunk3,(st.name==="Edit"||st.name==="Tool")&&/"content"\s*:/.test(st.jsonBuf)&&!/"old_string"\s*:/.test(st.jsonBuf)&&(st.name="Write");let now3=Date.now(),built=buildPendingEditToolStart(st,now3,80,st.lastEmitAt,st.lastSig);if(built){st.lastEmitAt=now3,st.lastSig=built.sig;let parsed=tryParsePartialToolInput(st.jsonBuf);if(parsed){let p=String(parsed.file_path??parsed.path??parsed.filePath??"").trim(),snap=typeof parsed.__fileContent=="string"?String(parsed.__fileContent):p?tryReadEditFileContent(p):null;snap&&(parsed.__fileContent=snap),pendingToolById.set(st.id,{name:st.name,input:parsed,startedAt:st.lastEmitAt||now3,...snap?{fileContent:snap}:{}})}out.push(encodeA2p("tool.start",built.payload))}return out}return out}function streamJsonToA2pLines(msg){let m3=asRecord15(msg);if(!m3||typeof m3.type!="string")return[];let out=[],type=m3.type;if(type==="content_block_delta")return contentBlockDeltaToA2p(m3,m3);if(type==="stream_event"){let event=asRecord15(m3.event);if(!event||typeof event.type!="string")return out;if(event.type==="content_block_delta")return contentBlockDeltaToA2p(event,m3);if(event.type==="message_start"){let msg2=asRecord15(event.message),mid=String(msg2?.id??m3.uuid??"").trim();return liveTextBlockId=mid?`a-${mid}`:"a-live",resetTurnThinking(),out}if(event.type==="message_stop")return out;if(event.type==="content_block_start"){let cb=asRecord15(event.content_block),idx=typeof event.index=="number"?event.index:0;if(cb?.type==="text"){let bid=String(cb.id??"").trim();bid?liveTextBlockId=`a-${bid}`:liveTextBlockId||(liveTextBlockId="a-live")}if(cb?.type==="thinking"){let thId=ensureTurnThinkingId();noteThinkingActivity(thId),out.push(encodeA2p("route.status",{provider:null,model:null,qualityTier:null,mode:null,ctxPct:null,thinking:!0}))}if(cb?.type==="tool_use"){let id=String(cb.id??`t-stream-${idx}`).trim()||`t-stream-${idx}`,name=String(cb.name??"Tool"),inputRec=asRecord15(cb.input)??{};if(streamingToolsByIndex.set(idx,{id,name,jsonBuf:Object.keys(inputRec).length>0?JSON.stringify(inputRec):"",lastSig:"",lastEmitAt:0}),isEditToolName2(name)){turnAssistantFinalCanAppend=!1;let summary=formatPendingEditSummary(name,inputRec),detail=formatEditDiffBody(name,inputRec,void 0,{pending:!0});out.push(encodeA2p("tool.start",{blockId:id,tool:name,summary,tier:0,detail,pending:!0})),pendingToolById.set(id,{name,input:inputRec,startedAt:Date.now()})}}return out}if(event.type==="content_block_stop"){let index=typeof event.index=="number"?event.index:0,baseId=blockIdFor(m3,`stream-${index}`);if(event.content_block_type==="thinking"||event.kind==="thinking"){let thId=peekTurnThinkingId()||`th-${baseId}-${index}`;out.push(encodeA2p("thinking.end",{blockId:thId,ms:resolveThinkingDurationMs(m3,event,thId)})),peekTurnThinkingId()&&closeTurnThinking()}let st=streamingToolsByIndex.get(index);if(st&&isEditToolName2(st.name)){let built=buildPendingEditToolStart(st,Date.now(),0,0,"");if(built){out.push(encodeA2p("tool.start",built.payload));let parsed=tryParsePartialToolInput(st.jsonBuf);parsed&&pendingToolById.set(st.id,{name:st.name,input:parsed,startedAt:Date.now()})}}return streamingToolsByIndex.delete(index),out}return out}if(type==="assistant"){let explicitMainline=parseMainlineTurnRuntimeSnapshot(m3.mainlineRuntime);explicitMainline&&(!turnTrace.mainlineRuntime||explicitMainline.revision>=turnTrace.mainlineRuntime.revision)&&(turnTrace={...turnTrace,mainlineRuntime:explicitMainline});let parentToolUseId=String(m3.parent_tool_use_id??"").trim();if(parentToolUseId){let parentPending=pendingToolById.get(parentToolUseId),liveExisting=liveAgentByParentId.get(parentToolUseId),parentName=parentPending?.name||liveExisting?.name||"";if((parentName==="Agent"||parentName==="Task")&&(parentPending||liveExisting)){let message2=asRecord15(m3.message),usage3=asRecord15(m3.usage)??asRecord15(message2?.usage),addTokens=0;if(usage3){let out2=Number(usage3.output_tokens??usage3.outputTokens??0)||0;out2>0&&(addTokens=out2)}if(addTokens<=0){let content2=message2?.content,text3="";typeof content2=="string"?text3=content2:Array.isArray(content2)&&(text3=content2.map(block2=>{let b3=asRecord15(block2);return b3?.type==="text"&&typeof b3.text=="string"?b3.text:""}).join("")),addTokens=estimateClassicTokensFromText(text3)}let live=liveExisting;if(!live){let desc=taskDescription(parentPending?.input??null);live={name:parentName==="Task"?"Task":"Agent",description:desc,startedAt:parentPending?.startedAt??Date.now(),targetTokens:0,displayedTokens:0,lastEmitAt:0,lastSig:""},liveAgentByParentId.set(parentToolUseId,live)}addTokens>0&&(live.targetTokens=Math.max(live.targetTokens,addTokens)),live.displayedTokens=stepClassicDisplayedTokens(live.displayedTokens,live.targetTokens);let now3=Date.now(),elapsedMs=Math.max(0,now3-live.startedAt),summary=formatClassicAgentLiveSummary({name:live.name,description:live.description,elapsedMs,outputTokens:live.displayedTokens>0?live.displayedTokens:null,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG});summary!==live.lastSig&&now3-live.lastEmitAt>=AGENT_PROGRESS_MIN_INTERVAL_MS&&(live.lastSig=summary,live.lastEmitAt=now3,out.push(encodeA2p("tool.progress",{blockId:parentToolUseId,tool:live.name,summary,elapsedSeconds:elapsedMs/1e3,totalTokens:live.displayedTokens,classicTelemetry:formatClassicTurnTelemetry({elapsedMs,outputTokens:live.displayedTokens>0?live.displayedTokens:null,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG})})))}}if(isApiErrorAssistantMessage(m3)){let content2=asRecord15(m3.message)?.content;Array.isArray(content2)&&(turnApiErrorText=content2.map(block2=>{let b3=asRecord15(block2);return b3?.type==="text"&&typeof b3.text=="string"?b3.text:""}).filter(Boolean).join(`
10996
+ `).trim()),turnApiErrorText||(turnApiErrorText=String(m3.error??"API request failed"));let zh2=String(process.env.CLAVUE_UI_LOCALE||process.env.LANG||"").startsWith("zh");turnApiErrorText=formatApiFailPrimaryMessage(turnApiErrorText,{zh:zh2});try{let{withProviderRouteContext:withProviderRouteContext2}=(init_errorUtils(),__toCommonJS(errorUtils_exports)),responseModel=asRecord15(m3.message)?.model,modelHint=process.env.ANTHROPIC_MODEL||process.env.ANTHROPIC_CUSTOM_MODEL_OPTION||void 0||responseModel||void 0;turnApiErrorText=withProviderRouteContext2(turnApiErrorText,modelHint&&modelHint!=="<synthetic>"?modelHint:void 0)}catch{}try{let{planStreamApiErrorA2p:planStreamApiErrorA2p2}=(init_failSurface(),__toCommonJS(failSurface_exports)),planned=planStreamApiErrorA2p2({rawMessage:turnApiErrorText,zh:zh2});if(planned.length>0){for(let ev of planned)out.push(encodeA2p(ev.type,ev.payload));return out}}catch{}return out.push(encodeA2p("error",{code:"api_or_model_error",message:turnApiErrorText.slice(0,800),blockId:API_FAIL_TURN_BLOCK_ID})),out}let content=asRecord15(m3.message)?.content,incremental=extractIncrementalText(m3);if(!Array.isArray(content)){let text3=incremental??(typeof m3.result=="string"?m3.result:typeof m3.text=="string"?m3.text:"");if(text3){let eventType=incremental?"assistant.delta":"assistant.final",blockId=ensureLiveTextBlockId(String(m3.uuid??m3.id??"").trim()||void 0);markAssistantTextEmitted(text3),eventType==="assistant.final"?pushAssistantFinal(out,blockId,text3)&&(liveTextBlockId=null):out.push(encodeA2p("assistant.delta",{blockId,text:text3}))}return out}if(incremental){turnAssistantFinalCanAppend=!1;let blockId=ensureLiveTextBlockId(String(m3.uuid??m3.id??"").trim()||void 0);markAssistantTextEmitted(),out.push(encodeA2p("assistant.delta",{blockId,text:incremental}))}for(let block2 of content){let b3=asRecord15(block2);if(b3){if(b3.type==="text"&&typeof b3.text=="string"&&b3.text.trim()){if(incremental)continue;let blockIncr=typeof b3.delta=="string"?b3.delta:typeof asRecord15(b3.delta)?.text=="string"?String(asRecord15(b3.delta).text):null,textId=liveTextBlockId||(b3.id?`a-${String(b3.id)}`:m3.uuid?`a-${String(m3.uuid)}`:m3.id?`a-${String(m3.id)}`:`a-${Date.now()}`);blockIncr?(turnAssistantFinalCanAppend=!1,liveTextBlockId||(liveTextBlockId=textId),markAssistantTextEmitted(),out.push(encodeA2p("assistant.delta",{blockId:textId,text:blockIncr}))):(markAssistantTextEmitted(b3.text),pushAssistantFinal(out,textId,b3.text),liveTextBlockId=null)}if(b3.type==="thinking"&&typeof b3.thinking=="string"){appendCoalescedThinking({out,content,block:b3,read:asRecord15,durationMs:__name(part=>thinkingDurationMs(m3,part),"durationMs"),wallMs:__name((part,id)=>resolveThinkingDurationMs(m3,part,id),"wallMs"),noteActivity:noteThinkingActivity,clearClock:__name(id=>{liveThinkingStartedAt.delete(id)},"clearClock"),textCap:THINKING_TEXT_CAP});continue}if(b3.type==="tool_use"){turnAssistantFinalCanAppend=!1;let name=String(b3.name??"Tool"),id=String(b3.id??`t-${Date.now()}`),inputRec=asRecord15(b3.input)??{},preEditFile;if(isEditToolName2(name)){let p=String(inputRec.file_path??inputRec.path??inputRec.filePath??"").trim(),snap=p?tryReadEditFileContent(p):null;snap&&(preEditFile=snap,inputRec.__fileContent=snap)}pendingToolById.set(id,{name,input:inputRec,startedAt:Date.now(),...preEditFile?{fileContent:preEditFile}:{}}),turnTrace.toolUses=[...turnTrace.toolUses,{id,name,input:b3.input??inputRec}];let presentation=classicToolPresentation(name,b3.input),summary=presentation.summary||toolSummary2(name,b3.input),isEdit=isEditToolName2(name),isTask=name==="Agent"||name==="Task",startDetail="";if(isEdit)startDetail=formatEditDiffBody(name,inputRec,void 0,{fileContent:preEditFile??null});else if(name==="Bash"||name==="PowerShell")startDetail="";else if(isTask){let desc=taskDescription(inputRec),prompt=String(inputRec.prompt??"").trim(),promptHead=prompt&&prompt!==desc?prompt.split(`
10997
10997
  `).map(l=>l.trim()).filter(Boolean).slice(0,4).join(`
10998
10998
  `).slice(0,280):"";startDetail=[desc,promptHead].filter(Boolean).join(`
10999
10999
  `)}let diaryStart=diaryToolWire({name,input:inputRec,status:"run"}),startSummary=isTask?formatClassicAgentLiveSummary({name:agentDisplayName(inputRec,name==="Task"?"Task":"Agent"),description:taskDescription(inputRec)||name,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}):diaryStart??summary;if(isTask&&liveAgentByParentId.set(id,{name:agentDisplayName(inputRec,name==="Task"?"Task":"Agent"),description:taskDescription(inputRec),startedAt:Date.now(),targetTokens:0,displayedTokens:0,lastEmitAt:0,lastSig:""}),out.push(encodeA2p("tool.start",{blockId:id,tool:name,summary:startSummary,displayName:isTask?name==="Agent"?"Agent":"Task":presentation.displayName,lead:isTask?taskDescription(inputRec):presentation.lead,expandDefault:presentation.expandDefault,tier:toolTier(name,inputRec),...startDetail?{detail:startDetail}:{},...isEdit?{pending:!1}:{}})),name==="TodoWrite"||name==="todo_write"||name==="TaskCreate"||name==="TaskUpdate"){let parsed=todosFromToolInput(inputRec);if(parsed.length>0){let snap=buildPlanTodosSnapshot({todos:parsed});out.push(encodeA2p("plan.snapshot",{lines:snap.lines,notice:snap.notice,completed:snap.completed,todoCount:snap.todoCount,inProgress:snap.inProgress,pending:snap.pending}))}}}}}return out}if(type==="user"){let content=asRecord15(m3.message)?.content;if(typeof content=="string"&&content.trim())rememberStreamUserText(content);else if(Array.isArray(content)&&!content.some(part=>asRecord15(part)?.type==="tool_result")){let texts=[];for(let part of content){let p=asRecord15(part);p?.type==="text"&&typeof p.text=="string"&&p.text.trim()&&texts.push(p.text.trim())}texts.length&&rememberStreamUserText(texts.join(`
11000
11000
  `))}if(Array.isArray(content))for(let block2 of content){let b3=asRecord15(block2);if(!b3||b3.type!=="tool_result")continue;let id=String(b3.tool_use_id??b3.toolUseId??`tr-${Date.now()}`),isError2=!!b3.is_error,rawText="",raw=b3.content;if(typeof raw=="string")rawText=raw;else if(Array.isArray(raw)){let texts=[];for(let part of raw){let t7=asRecord15(part);t7&&typeof t7.text=="string"&&texts.push(t7.text)}rawText=texts.join(`
11001
- `)}let pending2=pendingToolById.get(id);pendingToolById.delete(id);let liveAgent=liveAgentByParentId.get(id);liveAgentByParentId.delete(id);let inputWithStart=pending2?{...pending2.input,__startedAt:pending2.startedAt,...pending2.fileContent?{__fileContent:pending2.fileContent,originalFile:pending2.fileContent}:{}}:null,{summary,detail,outputTokens:parsedTokens}=toolResultSummary(isError2,rawText,pending2?.name,inputWithStart),agentMetrics=parseAgentResultMetrics(rawText),elapsedMs=agentMetrics.durationMs&&agentMetrics.durationMs>0?agentMetrics.durationMs:pending2?.startedAt&&pending2.startedAt>0?Math.max(0,Date.now()-pending2.startedAt):liveAgent?Math.max(0,Date.now()-liveAgent.startedAt):void 0,outputTokens=agentMetrics.tokens&&agentMetrics.tokens>0?agentMetrics.tokens:liveAgent&&liveAgent.targetTokens>0?liveAgent.targetTokens:parsedTokens&&parsedTokens>0?parsedTokens:void 0,toolUses=agentMetrics.toolUses&&agentMetrics.toolUses>0?agentMetrics.toolUses:void 0,telemetry=formatClassicTurnTelemetry({elapsedMs:elapsedMs!=null&&elapsedMs>=1e3?elapsedMs:void 0,outputTokens:outputTokens!=null&&outputTokens>0?outputTokens:void 0,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}),isAgentEnd=pending2?.name==="Agent"||pending2?.name==="Task"||liveAgent!=null,agentDoneTally=isAgentEnd?formatClassicAgentLiveSummary({name:liveAgent?.name||agentDisplayName(pending2?.input??null,pending2?.name==="Task"?"Task":"Agent"),description:liveAgent?.description||taskDescription(pending2?.input??null),elapsedMs,outputTokens,toolUses,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}):"",classicEnd=isAgentEnd&&agentDoneTally?agentDoneTally:telemetry&&!summary.includes(telemetry)&&!summary.includes("\u2193")?`${summary} \xB7 ${telemetry}`:summary,endSummary=diaryToolWire({name:pending2?.name??"",input:inputWithStart,status:isError2?"fail":"ok",resultText:rawText,elapsedMs})??classicEnd;turnTrace.toolResults=[...turnTrace.toolResults,{toolUseId:id,isError:isError2,content:rawText,toolUseResult:rawText?{stdout:rawText,stderr:""}:void 0}],out.push(encodeA2p("tool.end",{blockId:id,ok:!isError2,summary:endSummary,...detail?{detail}:{},...elapsedMs!=null?{elapsedMs}:{},...outputTokens!=null&&outputTokens>0?{totalTokens:outputTokens}:{},...toolUses!=null&&toolUses>0?{toolCount:toolUses}:{},...agentMetrics.childAgents!=null&&agentMetrics.childAgents>1?{childAgents:agentMetrics.childAgents}:{},...telemetry?{classicTelemetry:telemetry}:{}}));let pendingCmd=String(pending2?.input?.command||pending2?.input?.cmd||"");if(!isError2&&(pendingCmd?isSuccessfulVerifyEvidence({command:pendingCmd,output:rawText,isError:!1}):/tests?\s+passed|✓|✔|pass(?:ed)?\s+\d+|all\s+tests?\s+pass|#\s*pass\s+\d+/i.test(rawText.slice(0,1200)))){let verifySummary=endSummary.startsWith("\u25C6")||endSummary.startsWith("verify ok")?endSummary:`verify ok \xB7 ${endSummary}`;out.push(encodeA2p("verify.result",{blockId:id,ok:!0,command:"verify",summary:verifySummary}))}}return out}if(type==="result"){let alreadyStreamedAssistant=turnHadAssistantText;liveTextBlockId=null,liveThinkingByIndex.clear(),turnHadAssistantText=!1,turnAssistantFinalCount=0,turnAssistantFinalCanAppend=!1;let subtype=String(m3.subtype??""),ok2=isSuccessfulResultMessage(m3),usage3=asRecord15(m3.context_usage)??asRecord15(m3.usage)??asRecord15(m3.total_usage),modelHint=typeof m3.model=="string"?m3.model:typeof m3.model_id=="string"?m3.model_id:null;{let usageR=asRecord15(m3.usage)??asRecord15(m3.total_usage),contextR=asRecord15(m3.context_usage),ioSource=hasTokenSignal(usageR)?usageR:hasTokenSignal(contextR)?contextR:usageR??contextR,counted=tokenCounts(ioSource),inputTokens=counted.input,outputTokens=counted.output,est=estimateContextUsage(usage3,modelHint);out.push(encodeA2p("route.status",{provider:null,model:null,qualityTier:null,mode:null,ctxPct:est?.pct??null,...est?{ctxUsed:est.used,ctxWindow:est.window}:{},thinking:!1,...inputTokens>0?{inputTokens}:{},...outputTokens>0?{outputTokens}:{}}));let durationMs=typeof m3.duration_ms=="number"?m3.duration_ms:typeof m3.durationMs=="number"?m3.durationMs:void 0,costUsd=typeof m3.total_cost_usd=="number"?m3.total_cost_usd:typeof m3.totalCostUsd=="number"?m3.totalCostUsd:void 0,numTurns=typeof m3.num_turns=="number"?m3.num_turns:typeof m3.numTurns=="number"?m3.numTurns:void 0;if(pendingToolById.size>0){ok2=!1;for(let[blockId,pending2]of pendingToolById){let summary=`${pending2.name} \xB7 cancelled`;out.push(encodeA2p("tool.end",{blockId,ok:!1,summary,synthetic:!0,soft:!0})),turnTrace.toolResults=[...turnTrace.toolResults,{toolUseId:blockId,isError:!0,content:"interrupted \xB7 ended without tool result"}]}pendingToolById.clear(),streamingToolsByIndex.clear()}if(ok2){let resultText2=typeof m3.result=="string"?m3.result:typeof m3.result=="object"&&m3.result?JSON.stringify(m3.result).slice(0,400):"";resultText2&&!alreadyStreamedAssistant&&pushAssistantFinal(out,`result-${Date.now()}`,resultText2.slice(0,4e3)),resultText2&&!turnTrace.assistantText&&(turnTrace={...turnTrace,assistantText:resultText2.slice(0,4e3)});let baseSuccess={ok:!0,changes:"0 files",verify:turnTrace.toolResults.length>0?"skipped \xB7 tools completed (no verify asserted)":"not-run \xB7 no tools this turn",verifyStatus:turnTrace.toolResults.length>0?"skipped":"not-run",verifyItems:[{status:turnTrace.toolResults.length>0?"skipped":"not-run",summary:turnTrace.toolResults.length>0?"tools completed \xB7 no verify asserted":"no tools this turn"}],blockers:"none",next:"",durationMs,inputTokens:inputTokens||void 0,outputTokens:outputTokens||void 0,costUsd,numTurns,toolCount:turnTrace.toolUses.length||void 0},successPayload=baseSuccess;try{let nine26=aggregateTurnOutcomeFromTrace(turnTrace);successPayload=mergeNine26IntoOutcomePayload(baseSuccess,nine26)}catch{successPayload={...baseSuccess,changes:formatTurnOutcomeChangeLabel([])}}attachSessionTurnSummary(successPayload,{sessionId:streamSessionId||String(m3.session_id??m3.sessionId??""),persist:!0}),stampDiaryFooter(successPayload),out.push(encodeA2p("outcome.turn",successPayload)),resetTurnTrace(),out.push(encodeA2p("session.ended",{reason:"result_success"}))}else{let failureMessage=resultFailureMessage(m3,turnApiErrorText),emptyAssistant=isEmptyAssistantResponseError(failureMessage),failureCode=subtype&&subtype!=="success"?subtype:"result_error";out.push(encodeA2p("error",{code:failureCode,message:failureMessage,...emptyAssistant?{kind:"empty_assistant"}:{}}));let failToolCount=turnTrace.toolUses.length||0,toolNameById=new Map(turnTrace.toolUses.map(t7=>[t7.id,t7.name])),hardToolErrors=turnTrace.toolResults.filter(r2=>{if(!r2.isError||isInterruptToolResultMessage(String(r2.content??"")))return!1;let name=toolNameById.get(r2.toolUseId);return!isExploreScanToolError(name,String(r2.content??""))}).length,thrashOnlyErrors=hardToolErrors===0&&turnTrace.toolResults.some(r2=>r2.isError&&isInterruptToolResultMessage(String(r2.content??""))),verifyLaneFailed=hardToolErrors>0,baseFail={ok:!1,terminalState:"failed",changes:"0 files",verify:verifyLaneFailed?hardToolErrors===1?"1 tool failed":`${hardToolErrors} tools failed`:thrashOnlyErrors?"skipped \xB7 soft thrash only":failToolCount>0?`${failToolCount} tools ran \xB7 verify not asserted`:"not-run \xB7 turn failed before verify",verifyStatus:verifyLaneFailed?"failed":failToolCount>0||thrashOnlyErrors?"skipped":"not-run",verifyItems:[{status:verifyLaneFailed?"failed":failToolCount>0||thrashOnlyErrors?"skipped":"not-run",summary:thrashOnlyErrors?"soft thrash \xB7 not a verify fail":failureMessage.slice(0,400)}],blockers:thrashOnlyErrors?"interrupted":failureMessage,next:"",durationMs,inputTokens:inputTokens||void 0,outputTokens:outputTokens||void 0,costUsd,numTurns,toolCount:failToolCount||void 0,honestyClaimed:!1,honestyAllowSuccess:!0},failPayload=baseFail;try{let nine26=aggregateTurnOutcomeFromTrace(turnTrace);failPayload=mergeNine26IntoOutcomePayload(baseFail,nine26)}catch{failPayload={...baseFail,changes:formatTurnOutcomeChangeLabel([])}}attachSessionTurnSummary(failPayload,{sessionId:streamSessionId||String(m3.session_id??m3.sessionId??""),persist:!0}),stampDiaryFooter(failPayload),out.push(encodeA2p("outcome.turn",failPayload)),resetTurnTrace(),out.push(encodeA2p("session.ended",{reason:subtype||"error"}))}turnApiErrorText=""}return out}if(type==="system"){let subtype=String(m3.subtype??"");if(subtype==="init"){let sid=String(m3.session_id??m3.sessionId??"").trim();sid&&(streamSessionId=sid),out.push(encodeA2p("session.started",{sessionId:sid,cwd:String(m3.cwd??process.cwd())}));let model=String(m3.model??m3.main_loop_model??"");return model&&out.push(encodeA2p("route.status",{provider:null,model,qualityTier:null,mode:null,ctxPct:null,thinking:!1})),out}if(subtype==="status"){let status2=m3.status==null?null:String(m3.status);return status2==="compacting"?(out.push(encodeA2p("agent.running",{phase:"compacting",label:"Compacting conversation\u2026"})),out.push(encodeA2p("route.status",{waitKind:"compact",thinking:!1})),out.push(encodeA2p("system.notice",{level:"info",text:"Compacting conversation\u2026 \xB7 Ctrl+C / \u505C\u6B62 \u53D6\u6D88",blockId:"status-compacting"}))):(status2==null||status2===""||status2==="null")&&(out.push(encodeA2p("route.status",{waitKind:null,thinking:!1})),out.push(encodeA2p("system.notice",{level:"info",text:"",blockId:"status-compacting",dismiss:!0}))),out}if(subtype==="informational"||subtype===""){let level=String(m3.level??"info").toLowerCase();if(level!=="debug"){let content=String(m3.content??m3.message??m3.text??"").trim();if(content)try{let fo=(init_slotFailover(),__toCommonJS(slotFailover_exports));for(let n4 of fo.drainSlotFailoverChromeNotices?.()??[])out.push(encodeA2p("system.notice",{level:n4.level,text:n4.text}));if(fo.looksLikeSlotFailoverNotice?.(content)){let noticeLevel=level==="warning"||level==="error"?"warning":"info";out.push(encodeA2p("system.notice",{level:noticeLevel,text:content.slice(0,200)}))}}catch{}}return out}if(subtype==="api_retry"||subtype==="api_error"){let attempt2=Number(m3.attempt??m3.retryAttempt??1),maxRetries=Number(m3.max_retries??m3.maxRetries??10),retryDelayMs=Number(m3.retry_delay_ms??m3.retryInMs??m3.retry_delay??0),errorStatusRaw=m3.error_status!=null?Number(m3.error_status):m3.error&&typeof m3.error=="object"?Number(m3.error.status):null,errorStatus=errorStatusRaw!=null&&Number.isFinite(errorStatusRaw)?errorStatusRaw:null,errorSummary=typeof m3.message=="string"&&m3.message.includes("waiting for model")?m3.message:typeof m3.error=="string"?m3.error:m3.error&&typeof m3.error=="object"?String(m3.error.message??m3.error.type??""):String(m3.message??m3.content??""),text3=formatApiRetryNotice({attempt:attempt2,maxRetries,retryDelayMs,errorStatus,errorSummary});return(attempt2<=1||attempt2%3===0||attempt2>=maxRetries)&&out.push(encodeA2p("system.notice",{level:"warning",text:text3,blockId:`api-retry-${errorStatus??"x"}-${attempt2}`})),out.push(encodeA2p("route.status",{thinking:!1,waitKind:"retrying",retryAttempt:attempt2,retryMax:maxRetries,routeHealth:"warn",routeHealthSummary:text3.slice(0,80)})),out}return out}if(type==="streamlined_tool_use_summary"){let summary=String(m3.summary??m3.text??"tools"),blockId=`sts-${Date.now()}`;return out.push(encodeA2p("tool.start",{blockId,tool:"Tools",summary,tier:1})),out.push(encodeA2p("tool.end",{blockId,ok:!0,summary})),out}if(type==="streamlined_text"){let text3=String(m3.text??"");if(text3.trim()){let blockId=ensureLiveTextBlockId(`st-${Date.now()}`);markAssistantTextEmitted(),pushAssistantFinal(out,blockId,text3),liveTextBlockId=null}return out}if(type==="tool_progress"){let parentId=String(m3.parent_tool_use_id??"").trim(),toolUseId2=String(m3.tool_use_id??"").trim(),blockId=parentId||toolUseId2;if(!blockId)return out;let toolName4=String(m3.tool_name??"Bash"),output2=String(m3.output??""),elapsed=typeof m3.elapsed_time_seconds=="number"?m3.elapsed_time_seconds:void 0,totalLines=typeof m3.total_lines=="number"?m3.total_lines:void 0,pending2=pendingToolById.get(blockId),cmd=pending2&&typeof pending2.input?.command=="string"?String(pending2.input.command).replace(/\s+/g," ").trim().slice(0,120):"",cmdLine=cmd?`$ ${cmd}${cmd.length>=120?"\u2026":""}`:"",tail2=output2?output2.split(`
11001
+ `)}let pending2=pendingToolById.get(id);pendingToolById.delete(id);let liveAgent=liveAgentByParentId.get(id);liveAgentByParentId.delete(id);let inputWithStart=pending2?{...pending2.input,__startedAt:pending2.startedAt,...pending2.fileContent?{__fileContent:pending2.fileContent,originalFile:pending2.fileContent}:{}}:null,{summary,detail,outputTokens:parsedTokens}=toolResultSummary(isError2,rawText,pending2?.name,inputWithStart),agentMetrics=parseAgentResultMetrics(rawText),elapsedMs=agentMetrics.durationMs&&agentMetrics.durationMs>0?agentMetrics.durationMs:pending2?.startedAt&&pending2.startedAt>0?Math.max(0,Date.now()-pending2.startedAt):liveAgent?Math.max(0,Date.now()-liveAgent.startedAt):void 0,outputTokens=agentMetrics.tokens&&agentMetrics.tokens>0?agentMetrics.tokens:liveAgent&&liveAgent.targetTokens>0?liveAgent.targetTokens:parsedTokens&&parsedTokens>0?parsedTokens:void 0,toolUses=agentMetrics.toolUses&&agentMetrics.toolUses>0?agentMetrics.toolUses:void 0,telemetry=formatClassicTurnTelemetry({elapsedMs:elapsedMs!=null&&elapsedMs>=1e3?elapsedMs:void 0,outputTokens:outputTokens!=null&&outputTokens>0?outputTokens:void 0,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}),isAgentEnd=pending2?.name==="Agent"||pending2?.name==="Task"||liveAgent!=null,agentDoneTally=isAgentEnd?formatClassicAgentLiveSummary({name:liveAgent?.name||agentDisplayName(pending2?.input??null,pending2?.name==="Task"?"Task":"Agent"),description:liveAgent?.description||taskDescription(pending2?.input??null),elapsedMs,outputTokens,toolUses,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}):"",classicEnd=isAgentEnd&&agentDoneTally?agentDoneTally:telemetry&&!summary.includes(telemetry)&&!summary.includes("\u2193")?`${summary} \xB7 ${telemetry}`:summary,endSummary=diaryToolWire({name:pending2?.name??"",input:inputWithStart,status:isError2?"fail":"ok",resultText:rawText,elapsedMs})??classicEnd;turnTrace.toolResults=[...turnTrace.toolResults,{toolUseId:id,isError:isError2,content:rawText,toolUseResult:rawText?{stdout:rawText,stderr:""}:void 0}],out.push(encodeA2p("tool.end",{blockId:id,ok:!isError2,summary:endSummary,...detail?{detail}:{},...elapsedMs!=null?{elapsedMs}:{},...outputTokens!=null&&outputTokens>0?{totalTokens:outputTokens}:{},...toolUses!=null&&toolUses>0?{toolCount:toolUses}:{},...agentMetrics.childAgents!=null&&agentMetrics.childAgents>1?{childAgents:agentMetrics.childAgents}:{},...telemetry?{classicTelemetry:telemetry}:{}}));let pendingCmd=String(pending2?.input?.command||pending2?.input?.cmd||"");if(!isError2&&(pendingCmd?isSuccessfulVerifyEvidence({command:pendingCmd,output:rawText,isError:!1}):/tests?\s+passed|✓|✔|pass(?:ed)?\s+\d+|all\s+tests?\s+pass|#\s*pass\s+\d+/i.test(rawText.slice(0,1200)))){let verifySummary=endSummary.startsWith("\u25C6")||endSummary.startsWith("verify ok")?endSummary:`verify ok \xB7 ${endSummary}`;out.push(encodeA2p("verify.result",{blockId:id,ok:!0,command:"verify",summary:verifySummary}))}}return out}if(type==="result"){let alreadyStreamedAssistant=turnHadAssistantText;liveTextBlockId=null,resetTurnThinking(),turnHadAssistantText=!1,turnAssistantFinalCount=0,turnAssistantFinalCanAppend=!1;let subtype=String(m3.subtype??""),ok2=isSuccessfulResultMessage(m3),usage3=asRecord15(m3.context_usage)??asRecord15(m3.usage)??asRecord15(m3.total_usage),modelHint=typeof m3.model=="string"?m3.model:typeof m3.model_id=="string"?m3.model_id:null;{let usageR=asRecord15(m3.usage)??asRecord15(m3.total_usage),contextR=asRecord15(m3.context_usage),ioSource=hasTokenSignal(usageR)?usageR:hasTokenSignal(contextR)?contextR:usageR??contextR,counted=tokenCounts(ioSource),inputTokens=counted.input,outputTokens=counted.output,est=estimateContextUsage(usage3,modelHint);out.push(encodeA2p("route.status",{provider:null,model:null,qualityTier:null,mode:null,ctxPct:est?.pct??null,...est?{ctxUsed:est.used,ctxWindow:est.window}:{},thinking:!1,...inputTokens>0?{inputTokens}:{},...outputTokens>0?{outputTokens}:{}}));let durationMs=typeof m3.duration_ms=="number"?m3.duration_ms:typeof m3.durationMs=="number"?m3.durationMs:void 0,costUsd=typeof m3.total_cost_usd=="number"?m3.total_cost_usd:typeof m3.totalCostUsd=="number"?m3.totalCostUsd:void 0,numTurns=typeof m3.num_turns=="number"?m3.num_turns:typeof m3.numTurns=="number"?m3.numTurns:void 0;if(pendingToolById.size>0){ok2=!1;for(let[blockId,pending2]of pendingToolById){let summary=`${pending2.name} \xB7 cancelled`;out.push(encodeA2p("tool.end",{blockId,ok:!1,summary,synthetic:!0,soft:!0})),turnTrace.toolResults=[...turnTrace.toolResults,{toolUseId:blockId,isError:!0,content:"interrupted \xB7 ended without tool result"}]}pendingToolById.clear(),streamingToolsByIndex.clear()}if(ok2){let resultText2=typeof m3.result=="string"?m3.result:typeof m3.result=="object"&&m3.result?JSON.stringify(m3.result).slice(0,400):"";resultText2&&!alreadyStreamedAssistant&&pushAssistantFinal(out,`result-${Date.now()}`,resultText2.slice(0,4e3)),resultText2&&!turnTrace.assistantText&&(turnTrace={...turnTrace,assistantText:resultText2.slice(0,4e3)});let baseSuccess={ok:!0,changes:"0 files",verify:turnTrace.toolResults.length>0?"skipped \xB7 tools completed (no verify asserted)":"not-run \xB7 no tools this turn",verifyStatus:turnTrace.toolResults.length>0?"skipped":"not-run",verifyItems:[{status:turnTrace.toolResults.length>0?"skipped":"not-run",summary:turnTrace.toolResults.length>0?"tools completed \xB7 no verify asserted":"no tools this turn"}],blockers:"none",next:"",durationMs,inputTokens:inputTokens||void 0,outputTokens:outputTokens||void 0,costUsd,numTurns,toolCount:turnTrace.toolUses.length||void 0},successPayload=baseSuccess;try{let nine26=aggregateTurnOutcomeFromTrace(turnTrace);successPayload=mergeNine26IntoOutcomePayload(baseSuccess,nine26)}catch{successPayload={...baseSuccess,changes:formatTurnOutcomeChangeLabel([])}}attachSessionTurnSummary(successPayload,{sessionId:streamSessionId||String(m3.session_id??m3.sessionId??""),persist:!0}),stampDiaryFooter(successPayload),out.push(encodeA2p("outcome.turn",successPayload)),resetTurnTrace(),out.push(encodeA2p("session.ended",{reason:"result_success"}))}else{let failureMessage=resultFailureMessage(m3,turnApiErrorText),emptyAssistant=isEmptyAssistantResponseError(failureMessage),failureCode=subtype&&subtype!=="success"?subtype:"result_error";out.push(encodeA2p("error",{code:failureCode,message:failureMessage,...emptyAssistant?{kind:"empty_assistant"}:{}}));let failToolCount=turnTrace.toolUses.length||0,toolNameById=new Map(turnTrace.toolUses.map(t7=>[t7.id,t7.name])),hardToolErrors=turnTrace.toolResults.filter(r2=>{if(!r2.isError||isInterruptToolResultMessage(String(r2.content??"")))return!1;let name=toolNameById.get(r2.toolUseId);return!isExploreScanToolError(name,String(r2.content??""))}).length,thrashOnlyErrors=hardToolErrors===0&&turnTrace.toolResults.some(r2=>r2.isError&&isInterruptToolResultMessage(String(r2.content??""))),verifyLaneFailed=hardToolErrors>0,baseFail={ok:!1,terminalState:"failed",changes:"0 files",verify:verifyLaneFailed?hardToolErrors===1?"1 tool failed":`${hardToolErrors} tools failed`:thrashOnlyErrors?"skipped \xB7 soft thrash only":failToolCount>0?`${failToolCount} tools ran \xB7 verify not asserted`:"not-run \xB7 turn failed before verify",verifyStatus:verifyLaneFailed?"failed":failToolCount>0||thrashOnlyErrors?"skipped":"not-run",verifyItems:[{status:verifyLaneFailed?"failed":failToolCount>0||thrashOnlyErrors?"skipped":"not-run",summary:thrashOnlyErrors?"soft thrash \xB7 not a verify fail":failureMessage.slice(0,400)}],blockers:thrashOnlyErrors?"interrupted":failureMessage,next:"",durationMs,inputTokens:inputTokens||void 0,outputTokens:outputTokens||void 0,costUsd,numTurns,toolCount:failToolCount||void 0,honestyClaimed:!1,honestyAllowSuccess:!0},failPayload=baseFail;try{let nine26=aggregateTurnOutcomeFromTrace(turnTrace);failPayload=mergeNine26IntoOutcomePayload(baseFail,nine26)}catch{failPayload={...baseFail,changes:formatTurnOutcomeChangeLabel([])}}attachSessionTurnSummary(failPayload,{sessionId:streamSessionId||String(m3.session_id??m3.sessionId??""),persist:!0}),stampDiaryFooter(failPayload),out.push(encodeA2p("outcome.turn",failPayload)),resetTurnTrace(),out.push(encodeA2p("session.ended",{reason:subtype||"error"}))}turnApiErrorText=""}return out}if(type==="system"){let subtype=String(m3.subtype??"");if(subtype==="init"){let sid=String(m3.session_id??m3.sessionId??"").trim();sid&&(streamSessionId=sid),out.push(encodeA2p("session.started",{sessionId:sid,cwd:String(m3.cwd??process.cwd())}));let model=String(m3.model??m3.main_loop_model??"");return model&&out.push(encodeA2p("route.status",{provider:null,model,qualityTier:null,mode:null,ctxPct:null,thinking:!1})),out}if(subtype==="status"){let status2=m3.status==null?null:String(m3.status);return status2==="compacting"?(out.push(encodeA2p("agent.running",{phase:"compacting",label:"Compacting conversation\u2026"})),out.push(encodeA2p("route.status",{waitKind:"compact",thinking:!1})),out.push(encodeA2p("system.notice",{level:"info",text:"Compacting conversation\u2026 \xB7 Ctrl+C / \u505C\u6B62 \u53D6\u6D88",blockId:"status-compacting"}))):(status2==null||status2===""||status2==="null")&&(out.push(encodeA2p("route.status",{waitKind:null,thinking:!1})),out.push(encodeA2p("system.notice",{level:"info",text:"",blockId:"status-compacting",dismiss:!0}))),out}if(subtype==="informational"||subtype===""){let level=String(m3.level??"info").toLowerCase();if(level!=="debug"){let content=String(m3.content??m3.message??m3.text??"").trim();if(content)try{let fo=(init_slotFailover(),__toCommonJS(slotFailover_exports));for(let n4 of fo.drainSlotFailoverChromeNotices?.()??[])out.push(encodeA2p("system.notice",{level:n4.level,text:n4.text}));if(fo.looksLikeSlotFailoverNotice?.(content)){let noticeLevel=level==="warning"||level==="error"?"warning":"info";out.push(encodeA2p("system.notice",{level:noticeLevel,text:content.slice(0,200)}))}}catch{}}return out}if(subtype==="api_retry"||subtype==="api_error"){let attempt2=Number(m3.attempt??m3.retryAttempt??1),maxRetries=Number(m3.max_retries??m3.maxRetries??10),retryDelayMs=Number(m3.retry_delay_ms??m3.retryInMs??m3.retry_delay??0),errorStatusRaw=m3.error_status!=null?Number(m3.error_status):m3.error&&typeof m3.error=="object"?Number(m3.error.status):null,errorStatus=errorStatusRaw!=null&&Number.isFinite(errorStatusRaw)?errorStatusRaw:null,errorSummary=typeof m3.message=="string"&&m3.message.includes("waiting for model")?m3.message:typeof m3.error=="string"?m3.error:m3.error&&typeof m3.error=="object"?String(m3.error.message??m3.error.type??""):String(m3.message??m3.content??""),text3=formatApiRetryNotice({attempt:attempt2,maxRetries,retryDelayMs,errorStatus,errorSummary});return(attempt2<=1||attempt2%3===0||attempt2>=maxRetries)&&out.push(encodeA2p("system.notice",{level:"warning",text:text3,blockId:`api-retry-${errorStatus??"x"}-${attempt2}`})),out.push(encodeA2p("route.status",{thinking:!1,waitKind:"retrying",retryAttempt:attempt2,retryMax:maxRetries,routeHealth:"warn",routeHealthSummary:text3.slice(0,80)})),out}return out}if(type==="streamlined_tool_use_summary"){let summary=String(m3.summary??m3.text??"tools"),blockId=`sts-${Date.now()}`;return out.push(encodeA2p("tool.start",{blockId,tool:"Tools",summary,tier:1})),out.push(encodeA2p("tool.end",{blockId,ok:!0,summary})),out}if(type==="streamlined_text"){let text3=String(m3.text??"");if(text3.trim()){let blockId=ensureLiveTextBlockId(`st-${Date.now()}`);markAssistantTextEmitted(),pushAssistantFinal(out,blockId,text3),liveTextBlockId=null}return out}if(type==="tool_progress"){let parentId=String(m3.parent_tool_use_id??"").trim(),toolUseId2=String(m3.tool_use_id??"").trim(),blockId=parentId||toolUseId2;if(!blockId)return out;let toolName4=String(m3.tool_name??"Bash"),output2=String(m3.output??""),elapsed=typeof m3.elapsed_time_seconds=="number"?m3.elapsed_time_seconds:void 0,totalLines=typeof m3.total_lines=="number"?m3.total_lines:void 0,pending2=pendingToolById.get(blockId),cmd=pending2&&typeof pending2.input?.command=="string"?String(pending2.input.command).replace(/\s+/g," ").trim().slice(0,120):"",cmdLine=cmd?`$ ${cmd}${cmd.length>=120?"\u2026":""}`:"",tail2=output2?output2.split(`
11002
11002
  `).map(l=>l.trimEnd()).filter(Boolean).slice(-12).join(`
11003
11003
  `):"",detail=[cmdLine,tail2].filter(Boolean).join(`
11004
- `),elapsedLabel2=typeof elapsed=="number"&&elapsed>0?formatClassicTurnTelemetry({elapsedMs:Math.floor(elapsed*1e3),locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}):"",linesLabel=typeof totalLines=="number"&&totalLines>0?`${totalLines} lines`:"",progressHint=toolName4==="Bash"||toolName4==="PowerShell"?shellProgressHint({command:cmd,elapsedSeconds:elapsed,hasOutput:!!output2,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}):"",meta=[elapsedLabel2,linesLabel,progressHint].filter(Boolean).join(" \xB7 "),summaryBase=classicToolPresentation(toolName4,pending2?.input??{command:cmd}).summary||(toolName4==="PowerShell"||toolName4==="Bash"?cmd?`Bash(${cmd.slice(0,64)}${cmd.length>64?"\u2026":""})`:"Bash":toolName4),totalTokensRaw=Number(m3.total_tokens??m3.totalTokens??m3.token_count??m3.tokenCount??0),totalTokens=Number.isFinite(totalTokensRaw)&&totalTokensRaw>0?Math.floor(totalTokensRaw):0,agentSummary="";if((toolName4==="Agent"||toolName4==="Task")&&(typeof elapsed=="number"||totalTokens>0)){let live=liveAgentByParentId.get(blockId);live&&totalTokens>0&&(live.targetTokens=Math.max(live.targetTokens,totalTokens),live.displayedTokens=stepClassicDisplayedTokens(live.displayedTokens,live.targetTokens));let desc=live?.description||taskDescription(pending2?.input??null)||toolName4,elapsedMs=typeof elapsed=="number"&&elapsed>0?Math.floor(elapsed*1e3):live?Math.max(0,Date.now()-live.startedAt):void 0,outTok=live&&live.displayedTokens>0?live.displayedTokens:totalTokens>0?totalTokens:null;agentSummary=formatClassicAgentLiveSummary({name:live?.name||agentDisplayName(pending2?.input??null,toolName4),description:desc,elapsedMs,outputTokens:outTok,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG})}let summary=agentSummary||(meta?`${summaryBase} \xB7 ${meta}`:summaryBase);return out.push(encodeA2p("tool.progress",{blockId,tool:toolName4,summary,...detail?{detail}:{},...typeof elapsed=="number"?{elapsedSeconds:elapsed}:{},...typeof totalLines=="number"?{totalLines}:{},...totalTokens>0?{totalTokens}:{}})),out}return out}function translateStdoutLine(line){let trimmed=line.trim();if(!trimmed||trimmed[0]!=="{")return[];try{let lines=streamJsonToA2pLines(JSON.parse(trimmed));try{let fo=(init_slotFailover(),__toCommonJS(slotFailover_exports));for(let n4 of fo.drainSlotFailoverChromeNotices?.()??[])lines.push(encodeA2p("system.notice",{level:n4.level,text:n4.text}))}catch{}return lines}catch{return[]}}var THINKING_TEXT_CAP,liveTextBlockId,liveThinkingByIndex,liveThinkingStartedAt,turnHadAssistantText,turnAssistantFinalCount,turnAssistantFinalCanAppend,turnApiErrorText,pendingToolById,liveAgentByParentId,AGENT_PROGRESS_MIN_INTERVAL_MS,streamingToolsByIndex,turnTrace,lastStreamUserText,streamSessionId,EDIT_DIFF_CONTEXT_LINES,init_fromStreamJson=__esm({"src/uiProtocol/fromStreamJson.ts"(){init_codec();init_ctxEstimate();init_usageAccounting();init_turnOutcomeAggregator();init_sessionTurnSummary();init_printResultText();init_verifyCommandClassify();init_toolBlockerClassification();init_toolJournalSummary();init_diaryLine();init_editCardTruncate();init_classicTelemetry();init_shellProgressLaw();init_planTodosPanel();init_journalDensityPreset();init_duplexLifecycle();init_errors8();init_mainlineTurnRuntime();THINKING_TEXT_CAP=8e3,liveTextBlockId=null,liveThinkingByIndex=new Map,liveThinkingStartedAt=new Map,turnHadAssistantText=!1,turnAssistantFinalCount=0,turnAssistantFinalCanAppend=!1,turnApiErrorText="",pendingToolById=new Map,liveAgentByParentId=new Map,AGENT_PROGRESS_MIN_INTERVAL_MS=1200,streamingToolsByIndex=new Map,turnTrace={toolUses:[],toolResults:[],assistantText:void 0},lastStreamUserText="";__name(resetTurnTrace,"resetTurnTrace");__name(rememberStreamUserText,"rememberStreamUserText");__name(resetFromStreamJsonLiveState,"resetFromStreamJsonLiveState");__name(isEditToolName2,"isEditToolName");__name(markAssistantTextEmitted,"markAssistantTextEmitted");__name(assistantFinalPayload,"assistantFinalPayload");__name(pushAssistantFinal,"pushAssistantFinal");__name(asRecord15,"asRecord");__name(ensureLiveTextBlockId,"ensureLiveTextBlockId");__name(ensureLiveThinkingId,"ensureLiveThinkingId");__name(noteThinkingActivity,"noteThinkingActivity");__name(resolveThinkingDurationMs,"resolveThinkingDurationMs");__name(toolSummary2,"toolSummary");__name(taskDescription,"taskDescription");__name(parseClassicTokenCountFromText,"parseClassicTokenCountFromText");__name(parseAgentResultMetrics,"parseAgentResultMetrics");__name(formatTaskCompleteSummary,"formatTaskCompleteSummary");__name(tryParsePartialToolInput,"tryParsePartialToolInput");__name(classifyPendingEditOp,"classifyPendingEditOp");__name(formatPendingEditSummary,"formatPendingEditSummary");EDIT_DIFF_CONTEXT_LINES=3;__name(formatEditDiffBody,"formatEditDiffBody");__name(enrichEditInputFromResult,"enrichEditInputFromResult");__name(tryReadEditFileContent,"tryReadEditFileContent");__name(extractStructuredPatchHunks,"extractStructuredPatchHunks");__name(formatHunksAsEditBody,"formatHunksAsEditBody");__name(buildContextedEditBody,"buildContextedEditBody");__name(buildPendingEditToolStart,"buildPendingEditToolStart");__name(toolResultSummary,"toolResultSummary");__name(toolTier,"toolTier");__name(capJournalDetail,"capJournalDetail");__name(extractIncrementalText,"extractIncrementalText");__name(thinkingDurationMs,"thinkingDurationMs");__name(blockIdFor,"blockIdFor");__name(contentBlockDeltaToA2p,"contentBlockDeltaToA2p");__name(streamJsonToA2pLines,"streamJsonToA2pLines");__name(translateStdoutLine,"translateStdoutLine")}});function autonomousFailReason(raw,zh2){let t7=String(raw||"").trim(),fb=t7.match(/model fallback triggered:\s*(\S+)\s*(?:->|→)\s*(\S+)/i);return fb?zh2?`${fb[1]} \u6682\u4E0D\u53EF\u7528\uFF0C\u5207\u5230 ${fb[2]} \u6CA1\u6709\u6210\u529F`:`${fb[1]} unavailable; switching to ${fb[2]} did not complete`:/首包超时|first[- ]token|timed? ?out/i.test(t7)?zh2?"\u6A21\u578B\u6CA1\u6709\u53CA\u65F6\u56DE\u5E94":"model did not respond in time":/econnreset|socket hang up|disconnect|fetch failed|network/i.test(t7)?zh2?"\u7F51\u5173\u8FDE\u63A5\u65AD\u5F00":"gateway connection dropped":zh2?"\u6A21\u578B\u8FD9\u6B21\u6CA1\u6709\u56DE\u5E94":"model did not respond"}function autonomousFailNotice(input2){let reason=autonomousFailReason(input2.raw,input2.zh),times2=input2.count>1?input2.zh?`\uFF08${input2.count} \u6B21\uFF09`:` (\xD7${input2.count})`:"";return{level:"info",text:input2.zh?`\u540E\u53F0\u4EFB\u52A1\u5DF2\u7ED3\u675F \xB7 \u6A21\u578B\u8DDF\u8FDB\u5931\u8D25${times2}\uFF1A${reason} \xB7 \u53D1\u300C\u7EE7\u7EED\u300D\u8BA9\u5B83\u67E5\u770B\u7ED3\u679C`:`Background task finished \xB7 follow-up failed${times2}: ${reason} \xB7 send "continue" to review`,blockId:AUTONOMOUS_FAIL_BLOCK_ID,journal:!0,surface:"journal"}}function shouldHoldAutonomousError(input2){return!input2.busy&&input2.isErrorFrame}function parseFallbackPair(raw){let m3=FALLBACK_RE.exec(raw);if(!m3)return null;let[,from,to]=m3;return{from,to}}function fallbackNoticeOnce(raw,zh2,seen2){let pair=parseFallbackPair(raw);if(!pair)return;let key3=`${pair.from}\0${pair.to}`;return seen2.has(key3)?null:(seen2.add(key3),zh2?`\u5DF2\u5207\u5230\u5907\u7528\u6A21\u578B ${pair.to}\uFF08${pair.from} \u4E0D\u53EF\u7528\uFF09`:`Switched to fallback ${pair.to} (${pair.from} unavailable)`)}function heldErrorMessage(env5){try{let payload=env5?.payload;return String(payload?.message??"")}catch{return""}}var AUTONOMOUS_FAIL_BLOCK_ID,FALLBACK_RE,init_autonomousTurnSurface=__esm({"src/uiProtocol/autonomousTurnSurface.ts"(){AUTONOMOUS_FAIL_BLOCK_ID="autonomous-followup-fail";__name(autonomousFailReason,"autonomousFailReason");__name(autonomousFailNotice,"autonomousFailNotice");__name(shouldHoldAutonomousError,"shouldHoldAutonomousError");FALLBACK_RE=/Model fallback triggered:\s*(\S+?)\s*(?:->|→)\s*([^\s"\\]+)/;__name(parseFallbackPair,"parseFallbackPair");__name(fallbackNoticeOnce,"fallbackNoticeOnce");__name(heldErrorMessage,"heldErrorMessage")}});import{EventEmitter as EventEmitter5}from"node:events";import{randomUUID as randomUUID77}from"node:crypto";var FakeChildAgent,init_fakeChildAgent=__esm({"src/uiProtocol/fakeChildAgent.ts"(){FakeChildAgent=class{static{__name(this,"FakeChildAgent")}id;stdout=new EventEmitter5;stderr=new EventEmitter5;stdin;written=[];closed=!1;exitCode=null;closeListeners=[];constructor(opts){this.id=opts?.id??randomUUID77().slice(0,8);let writable2=opts?.stdinWritable!==!1;this.stdin={destroyed:!1,get writable(){return writable2&&!this.destroyed},set writable(v2){writable2=v2},write:__name(chunk3=>{if(this.stdin.destroyed||!writable2)return!1;let lines=String(chunk3).split(`
11004
+ `),elapsedLabel2=typeof elapsed=="number"&&elapsed>0?formatClassicTurnTelemetry({elapsedMs:Math.floor(elapsed*1e3),locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}):"",linesLabel=typeof totalLines=="number"&&totalLines>0?`${totalLines} lines`:"",progressHint=toolName4==="Bash"||toolName4==="PowerShell"?shellProgressHint({command:cmd,elapsedSeconds:elapsed,hasOutput:!!output2,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG}):"",meta=[elapsedLabel2,linesLabel,progressHint].filter(Boolean).join(" \xB7 "),summaryBase=classicToolPresentation(toolName4,pending2?.input??{command:cmd}).summary||(toolName4==="PowerShell"||toolName4==="Bash"?cmd?`Bash(${cmd.slice(0,64)}${cmd.length>64?"\u2026":""})`:"Bash":toolName4),totalTokensRaw=Number(m3.total_tokens??m3.totalTokens??m3.token_count??m3.tokenCount??0),totalTokens=Number.isFinite(totalTokensRaw)&&totalTokensRaw>0?Math.floor(totalTokensRaw):0,agentSummary="";if((toolName4==="Agent"||toolName4==="Task")&&(typeof elapsed=="number"||totalTokens>0)){let live=liveAgentByParentId.get(blockId);live&&totalTokens>0&&(live.targetTokens=Math.max(live.targetTokens,totalTokens),live.displayedTokens=stepClassicDisplayedTokens(live.displayedTokens,live.targetTokens));let desc=live?.description||taskDescription(pending2?.input??null)||toolName4,elapsedMs=typeof elapsed=="number"&&elapsed>0?Math.floor(elapsed*1e3):live?Math.max(0,Date.now()-live.startedAt):void 0,outTok=live&&live.displayedTokens>0?live.displayedTokens:totalTokens>0?totalTokens:null;agentSummary=formatClassicAgentLiveSummary({name:live?.name||agentDisplayName(pending2?.input??null,toolName4),description:desc,elapsedMs,outputTokens:outTok,locale:process.env.CLAVUE_UI_LOCALE||process.env.LANG})}let summary=agentSummary||(meta?`${summaryBase} \xB7 ${meta}`:summaryBase);return out.push(encodeA2p("tool.progress",{blockId,tool:toolName4,summary,...detail?{detail}:{},...typeof elapsed=="number"?{elapsedSeconds:elapsed}:{},...typeof totalLines=="number"?{totalLines}:{},...totalTokens>0?{totalTokens}:{}})),out}return out}function translateStdoutLine(line){let trimmed=line.trim();if(!trimmed||trimmed[0]!=="{")return[];try{let lines=streamJsonToA2pLines(JSON.parse(trimmed));try{let fo=(init_slotFailover(),__toCommonJS(slotFailover_exports));for(let n4 of fo.drainSlotFailoverChromeNotices?.()??[])lines.push(encodeA2p("system.notice",{level:n4.level,text:n4.text}))}catch{}return lines}catch{return[]}}var THINKING_TEXT_CAP,liveTextBlockId,liveThinkingStartedAt,turnHadAssistantText,turnAssistantFinalCount,turnAssistantFinalCanAppend,turnApiErrorText,pendingToolById,liveAgentByParentId,AGENT_PROGRESS_MIN_INTERVAL_MS,streamingToolsByIndex,turnTrace,lastStreamUserText,streamSessionId,EDIT_DIFF_CONTEXT_LINES,init_fromStreamJson=__esm({"src/uiProtocol/fromStreamJson.ts"(){init_codec();init_streamThinkingCoalesce();init_ctxEstimate();init_usageAccounting();init_turnOutcomeAggregator();init_sessionTurnSummary();init_printResultText();init_verifyCommandClassify();init_toolBlockerClassification();init_toolJournalSummary();init_diaryLine();init_editCardTruncate();init_classicTelemetry();init_shellProgressLaw();init_planTodosPanel();init_journalDensityPreset();init_duplexLifecycle();init_errors8();init_mainlineTurnRuntime();THINKING_TEXT_CAP=8e3,liveTextBlockId=null,liveThinkingStartedAt=new Map,turnHadAssistantText=!1,turnAssistantFinalCount=0,turnAssistantFinalCanAppend=!1,turnApiErrorText="",pendingToolById=new Map,liveAgentByParentId=new Map,AGENT_PROGRESS_MIN_INTERVAL_MS=1200,streamingToolsByIndex=new Map,turnTrace={toolUses:[],toolResults:[],assistantText:void 0},lastStreamUserText="";__name(resetTurnTrace,"resetTurnTrace");__name(rememberStreamUserText,"rememberStreamUserText");__name(resetFromStreamJsonLiveState,"resetFromStreamJsonLiveState");__name(isEditToolName2,"isEditToolName");__name(markAssistantTextEmitted,"markAssistantTextEmitted");__name(assistantFinalPayload,"assistantFinalPayload");__name(pushAssistantFinal,"pushAssistantFinal");__name(asRecord15,"asRecord");__name(ensureLiveTextBlockId,"ensureLiveTextBlockId");__name(noteThinkingActivity,"noteThinkingActivity");__name(resolveThinkingDurationMs,"resolveThinkingDurationMs");__name(toolSummary2,"toolSummary");__name(taskDescription,"taskDescription");__name(parseClassicTokenCountFromText,"parseClassicTokenCountFromText");__name(parseAgentResultMetrics,"parseAgentResultMetrics");__name(formatTaskCompleteSummary,"formatTaskCompleteSummary");__name(tryParsePartialToolInput,"tryParsePartialToolInput");__name(classifyPendingEditOp,"classifyPendingEditOp");__name(formatPendingEditSummary,"formatPendingEditSummary");EDIT_DIFF_CONTEXT_LINES=3;__name(formatEditDiffBody,"formatEditDiffBody");__name(enrichEditInputFromResult,"enrichEditInputFromResult");__name(tryReadEditFileContent,"tryReadEditFileContent");__name(extractStructuredPatchHunks,"extractStructuredPatchHunks");__name(formatHunksAsEditBody,"formatHunksAsEditBody");__name(buildContextedEditBody,"buildContextedEditBody");__name(buildPendingEditToolStart,"buildPendingEditToolStart");__name(toolResultSummary,"toolResultSummary");__name(toolTier,"toolTier");__name(capJournalDetail,"capJournalDetail");__name(extractIncrementalText,"extractIncrementalText");__name(thinkingDurationMs,"thinkingDurationMs");__name(blockIdFor,"blockIdFor");__name(contentBlockDeltaToA2p,"contentBlockDeltaToA2p");__name(streamJsonToA2pLines,"streamJsonToA2pLines");__name(translateStdoutLine,"translateStdoutLine")}});function autonomousFailReason(raw,zh2){let t7=String(raw||"").trim(),fb=t7.match(/model fallback triggered:\s*(\S+)\s*(?:->|→)\s*(\S+)/i);return fb?zh2?`${fb[1]} \u6682\u4E0D\u53EF\u7528\uFF0C\u5207\u5230 ${fb[2]} \u6CA1\u6709\u6210\u529F`:`${fb[1]} unavailable; switching to ${fb[2]} did not complete`:/首包超时|first[- ]token|timed? ?out/i.test(t7)?zh2?"\u6A21\u578B\u6CA1\u6709\u53CA\u65F6\u56DE\u5E94":"model did not respond in time":/econnreset|socket hang up|disconnect|fetch failed|network/i.test(t7)?zh2?"\u7F51\u5173\u8FDE\u63A5\u65AD\u5F00":"gateway connection dropped":zh2?"\u6A21\u578B\u8FD9\u6B21\u6CA1\u6709\u56DE\u5E94":"model did not respond"}function autonomousFailNotice(input2){let reason=autonomousFailReason(input2.raw,input2.zh),times2=input2.count>1?input2.zh?`\uFF08${input2.count} \u6B21\uFF09`:` (\xD7${input2.count})`:"";return{level:"info",text:input2.zh?`\u540E\u53F0\u4EFB\u52A1\u5DF2\u7ED3\u675F \xB7 \u6A21\u578B\u8DDF\u8FDB\u5931\u8D25${times2}\uFF1A${reason} \xB7 \u53D1\u300C\u7EE7\u7EED\u300D\u8BA9\u5B83\u67E5\u770B\u7ED3\u679C`:`Background task finished \xB7 follow-up failed${times2}: ${reason} \xB7 send "continue" to review`,blockId:AUTONOMOUS_FAIL_BLOCK_ID,journal:!0,surface:"journal"}}function shouldHoldAutonomousError(input2){return!input2.busy&&input2.isErrorFrame}function parseFallbackPair(raw){let m3=FALLBACK_RE.exec(raw);if(!m3)return null;let[,from,to]=m3;return{from,to}}function fallbackNoticeOnce(raw,zh2,seen2){let pair=parseFallbackPair(raw);if(!pair)return;let key3=`${pair.from}\0${pair.to}`;return seen2.has(key3)?null:(seen2.add(key3),zh2?`\u5DF2\u5207\u5230\u5907\u7528\u6A21\u578B ${pair.to}\uFF08${pair.from} \u4E0D\u53EF\u7528\uFF09`:`Switched to fallback ${pair.to} (${pair.from} unavailable)`)}function heldErrorMessage(env5){try{let payload=env5?.payload;return String(payload?.message??"")}catch{return""}}var AUTONOMOUS_FAIL_BLOCK_ID,FALLBACK_RE,init_autonomousTurnSurface=__esm({"src/uiProtocol/autonomousTurnSurface.ts"(){AUTONOMOUS_FAIL_BLOCK_ID="autonomous-followup-fail";__name(autonomousFailReason,"autonomousFailReason");__name(autonomousFailNotice,"autonomousFailNotice");__name(shouldHoldAutonomousError,"shouldHoldAutonomousError");FALLBACK_RE=/Model fallback triggered:\s*(\S+?)\s*(?:->|→)\s*([^\s"\\]+)/;__name(parseFallbackPair,"parseFallbackPair");__name(fallbackNoticeOnce,"fallbackNoticeOnce");__name(heldErrorMessage,"heldErrorMessage")}});import{EventEmitter as EventEmitter5}from"node:events";import{randomUUID as randomUUID77}from"node:crypto";var FakeChildAgent,init_fakeChildAgent=__esm({"src/uiProtocol/fakeChildAgent.ts"(){FakeChildAgent=class{static{__name(this,"FakeChildAgent")}id;stdout=new EventEmitter5;stderr=new EventEmitter5;stdin;written=[];closed=!1;exitCode=null;closeListeners=[];constructor(opts){this.id=opts?.id??randomUUID77().slice(0,8);let writable2=opts?.stdinWritable!==!1;this.stdin={destroyed:!1,get writable(){return writable2&&!this.destroyed},set writable(v2){writable2=v2},write:__name(chunk3=>{if(this.stdin.destroyed||!writable2)return!1;let lines=String(chunk3).split(`
11005
11005
  `).filter(Boolean);for(let line of lines)try{this.written.push(JSON.parse(line))}catch{this.written.push({raw:line})}return!0},"write")}}emitStdout(msg){this.closed||this.stdout.emit("data",Buffer.from(`${JSON.stringify(msg)}
11006
11006
  `,"utf8"))}emitStdoutRaw(line){this.closed||this.stdout.emit("data",Buffer.from(line.endsWith(`
11007
11007
  `)?line:`${line}
@@ -11195,7 +11195,7 @@ ${deps.getTmuxInstallInstructions()}`}:{ok:!1,message:"Error: --tmux requires --
11195
11195
  `)+`
11196
11196
  Approve via: clavue settings / project .mcp.json trust flow.
11197
11197
 
11198
- `)}var init_mcpServerApproval=__esm({"src/services/mcpServerApproval.tsx"(){init_config9();init_utils10();__name(handleMcpjsonServerApprovals,"handleMcpjsonServerApprovals")}});function setSessionStateChangedListener(cb){stateListener=cb}function setSessionMetadataChangedListener(cb){metadataListener=cb}function setPermissionModeChangedListener(cb){permissionModeListener=cb}function getSessionState(){return currentState}function notifySessionStateChanged(state5,details){currentState=state5,stateListener?.(state5,details),state5==="requires_action"&&details?(hasPendingAction=!0,metadataListener?.({pending_action:details})):hasPendingAction&&(hasPendingAction=!1,metadataListener?.({pending_action:null})),state5==="idle"&&metadataListener?.({task_summary:null}),isEnvTruthy2(process.env.CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS)&&enqueueSdkEvent({type:"system",subtype:"session_state_changed",state:state5})}function notifySessionMetadataChanged(metadata){metadataListener?.(metadata)}function notifyPermissionModeChanged(mode2){permissionModeListener?.(mode2)}var stateListener,metadataListener,permissionModeListener,hasPendingAction,currentState,init_sessionState2=__esm({"src/utils/sessionState.ts"(){init_envUtils();init_sdkEventQueue();stateListener=null,metadataListener=null,permissionModeListener=null;__name(setSessionStateChangedListener,"setSessionStateChangedListener");__name(setSessionMetadataChangedListener,"setSessionMetadataChangedListener");__name(setPermissionModeChangedListener,"setPermissionModeChangedListener");hasPendingAction=!1,currentState="idle";__name(getSessionState,"getSessionState");__name(notifySessionStateChanged,"notifySessionStateChanged");__name(notifySessionMetadataChanged,"notifySessionMetadataChanged");__name(notifyPermissionModeChanged,"notifyPermissionModeChanged")}});function externalMetadataToAppState(metadata){return prev=>({...prev,...typeof metadata.permission_mode=="string"?{toolPermissionContext:{...prev.toolPermissionContext,mode:isDeprecatedPermissionMode(metadata.permission_mode)?"default":permissionModeFromString(metadata.permission_mode)}}:{},...typeof metadata.is_ultraplan_mode=="boolean"?{isUltraplanMode:metadata.is_ultraplan_mode}:{}})}function onChangeAppState({newState,oldState}){let prevMode=oldState.toolPermissionContext.mode,newMode=newState.toolPermissionContext.mode;if(prevMode!==newMode){let prevExternal=toExternalPermissionMode(prevMode),newExternal=toExternalPermissionMode(newMode);if(prevExternal!==newExternal){let isUltraplan=newExternal==="plan"&&newState.isUltraplanMode&&!oldState.isUltraplanMode?!0:null;notifySessionMetadataChanged({permission_mode:newExternal,is_ultraplan_mode:isUltraplan})}notifyPermissionModeChanged(newMode)}if(newState.mainLoopModel!==oldState.mainLoopModel&&newState.mainLoopModel===null&&(updateSettingsForSource("userSettings",{model:void 0}),setMainLoopModelOverride(null)),newState.mainLoopModel!==oldState.mainLoopModel&&newState.mainLoopModel!==null&&(updateSettingsForSource("userSettings",{model:newState.mainLoopModel}),setMainLoopModelOverride(newState.mainLoopModel),setModelLaunchMeta({requested:newState.mainLoopModel,effective:newState.mainLoopModel,source:"user"})),newState.expandedView!==oldState.expandedView){let showExpandedTodos=newState.expandedView==="tasks",showSpinnerTree=newState.expandedView==="teammates";(getGlobalConfig().showExpandedTodos!==showExpandedTodos||getGlobalConfig().showSpinnerTree!==showSpinnerTree)&&saveGlobalConfig(current=>({...current,showExpandedTodos,showSpinnerTree}))}if(newState.verbose!==oldState.verbose&&getGlobalConfig().verbose!==newState.verbose){let verbose=newState.verbose;saveGlobalConfig(current=>({...current,verbose}))}if(process.env.USER_TYPE==="ant"&&newState.tungstenPanelVisible!==oldState.tungstenPanelVisible&&newState.tungstenPanelVisible!==void 0&&getGlobalConfig().tungstenPanelVisible!==newState.tungstenPanelVisible){let tungstenPanelVisible=newState.tungstenPanelVisible;saveGlobalConfig(current=>({...current,tungstenPanelVisible}))}if(newState.settings!==oldState.settings)try{clearApiKeyHelperCache(),clearAwsCredentialsCache(),clearGcpCredentialsCache(),newState.settings.env!==oldState.settings.env&&applyConfigEnvironmentVariables()}catch(error40){logError2(toError(error40))}}var init_onChangeAppState=__esm({"src/state/onChangeAppState.ts"(){init_state();init_auth();init_config12();init_errors2();init_log3();init_managedEnv();init_PermissionMode();init_sessionState2();init_settings2();__name(externalMetadataToAppState,"externalMetadataToAppState");__name(onChangeAppState,"onChangeAppState")}});var init_terminalPreference=__esm({"src/utils/deepLink/terminalPreference.ts"(){init_config12();init_debug()}});var FpsTracker,init_fpsTracker=__esm({"src/utils/fpsTracker.ts"(){FpsTracker=class{static{__name(this,"FpsTracker")}frameDurations=[];firstRenderTime;lastRenderTime;record(durationMs){let now3=performance.now();this.firstRenderTime===void 0&&(this.firstRenderTime=now3),this.lastRenderTime=now3,this.frameDurations.push(durationMs)}getMetrics(){if(this.frameDurations.length===0||this.firstRenderTime===void 0||this.lastRenderTime===void 0)return;let totalTimeMs=this.lastRenderTime-this.firstRenderTime;if(totalTimeMs<=0)return;let averageFps=this.frameDurations.length/(totalTimeMs/1e3),sorted=this.frameDurations.slice().sort((a2,b3)=>b3-a2),p99Index=Math.max(0,Math.ceil(sorted.length*.01)-1),p99FrameTimeMs=sorted[p99Index],low1PctFps=p99FrameTimeMs>0?1e3/p99FrameTimeMs:0;return{averageFps:Math.round(averageFps*100)/100,low1PctFps:Math.round(low1PctFps*100)/100}}}}});import{realpath as realpath12}from"fs/promises";async function updateGithubRepoPathMapping(){try{let repo=await detectCurrentRepository();if(!repo){logForDebugging("Not in a GitHub repository, skipping path mapping update");return}let cwd6=getOriginalCwd(),basePath=findGitRoot(cwd6)??cwd6,currentPath;try{currentPath=(await realpath12(basePath)).normalize("NFC")}catch{currentPath=basePath}let repoKey=repo.toLowerCase(),existingPaths=getGlobalConfig().githubRepoPaths?.[repoKey]??[];if(existingPaths[0]===currentPath){logForDebugging(`Path ${currentPath} already tracked for repo ${repoKey}`);return}let withoutCurrent=existingPaths.filter(p=>p!==currentPath),updatedPaths=[currentPath,...withoutCurrent];saveGlobalConfig(current=>({...current,githubRepoPaths:{...current.githubRepoPaths,[repoKey]:updatedPaths}})),logForDebugging(`Added ${currentPath} to tracked paths for repo ${repoKey}`)}catch(error40){logForDebugging(`Error updating repo path mapping: ${error40}`)}}var init_githubRepoPathMapping=__esm({"src/utils/githubRepoPathMapping.ts"(){init_state();init_config12();init_debug();init_detectRepository();init_file();init_gitFilesystem();init_git();__name(updateGithubRepoPathMapping,"updateGithubRepoPathMapping")}});var BRAND_WORDMARK,TAGLINE_ZH,TAGLINE_EN,SLOGAN_ZH,BRAND_LOCKUP_COMPACT,BRAND_WORDMARK_BILINGUAL,FIRST_LAUNCH_TITLE_ZH,FIRST_LAUNCH_SUBTITLE,init_dragonArt=__esm({"src/constants/dragonArt.ts"(){BRAND_WORDMARK="CLAVUE",TAGLINE_ZH="\u9F8D\u884C\u4EE3\u7801 \xB7 \u6267\u884C\u4F18\u5148",TAGLINE_EN="Dragon code \xB7 execution-first",SLOGAN_ZH="\u7231\u6211\u4E2D\u534E \xB7 \u81EA\u5F3A\u4E0D\u606F",BRAND_LOCKUP_COMPACT=`\u9F8D ${BRAND_WORDMARK}`,BRAND_WORDMARK_BILINGUAL=`${BRAND_WORDMARK} \xB7 \u514B\u62C9\u7EF4`,FIRST_LAUNCH_TITLE_ZH=`\u9F8D ${BRAND_WORDMARK} \xB7 \u514B\u62C9\u7EF4`,FIRST_LAUNCH_SUBTITLE="Choose your language / \u9009\u62E9\u8BED\u8A00 / \u8A00\u8A9E\u3092\u9078\u3076"}});var LanguageOnboardingGate_exports={};__export(LanguageOnboardingGate_exports,{LanguageOnboardingGate:()=>LanguageOnboardingGate,shouldShowLanguageOnboarding:()=>shouldShowLanguageOnboarding});function LanguageOnboardingGate({onDone}){let[done,setDone]=(0,import_react170.useState)(!needsLanguageOnboarding());return done?null:(0,import_jsx_runtime290.jsxs)(ThemedBox_default,{flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[(0,import_jsx_runtime290.jsxs)(ThemedBox_default,{flexDirection:"column",alignItems:"center",marginY:1,gap:0,children:[(0,import_jsx_runtime290.jsx)(ThemedText,{color:"warning",bold:!0,children:"\u9F8D"}),(0,import_jsx_runtime290.jsx)(ThemedText,{children:" "}),(0,import_jsx_runtime290.jsx)(ThemedText,{bold:!0,color:"warning",children:BRAND_WORDMARK_BILINGUAL}),(0,import_jsx_runtime290.jsx)(ThemedText,{dimColor:!0,children:"\u2500".repeat(18)})]}),(0,import_jsx_runtime290.jsxs)(ThemedBox_default,{flexDirection:"column",alignItems:"center",gap:0,children:[(0,import_jsx_runtime290.jsx)(ThemedText,{color:"error",bold:!0,children:TAGLINE_ZH}),(0,import_jsx_runtime290.jsx)(ThemedText,{dimColor:!0,children:TAGLINE_EN}),(0,import_jsx_runtime290.jsx)(ThemedText,{dimColor:!0,children:SLOGAN_ZH})]}),(0,import_jsx_runtime290.jsx)(ThemedBox_default,{flexDirection:"column",alignItems:"center",gap:0,children:(0,import_jsx_runtime290.jsx)(ThemedText,{dimColor:!0,children:FIRST_LAUNCH_SUBTITLE})}),(0,import_jsx_runtime290.jsx)(LanguagePicker,{primaryOnly:!0,initialLanguage:void 0,onCancel:()=>{applyUiLocale("zh-CN"),setDone(!0),onDone()},onComplete:lang=>{applyUiLocale(lang||"zh-CN"),setDone(!0),onDone()}})]})}function shouldShowLanguageOnboarding(){return needsLanguageOnboarding()}var import_react170,import_jsx_runtime290,init_LanguageOnboardingGate=__esm({"src/components/LanguageOnboardingGate.tsx"(){import_react170=__toESM(require_react());init_ink();init_dragonArt();init_applyUiLocale();init_LanguagePicker();import_jsx_runtime290=__toESM(require_jsx_runtime());__name(LanguageOnboardingGate,"LanguageOnboardingGate");__name(shouldShowLanguageOnboarding,"shouldShowLanguageOnboarding")}});function centerPlaque(content,contentWidth){let total=Math.max(0,PLAQUE_WIDTH-contentWidth),left=Math.floor(total/2),right=total-left;return" ".repeat(left)+content+" ".repeat(right)}function WelcomeHeader({isZh:isZh7}){let title=isZh7?`${APP_NAME} \xB7 ${"\u514B\u62C9\u7EF4"}`:APP_NAME;return(0,import_jsx_runtime291.jsxs)(import_jsx_runtime291.Fragment,{children:[(0,import_jsx_runtime291.jsxs)(ThemedText,{children:[(0,import_jsx_runtime291.jsx)(ThemedText,{color:"brand",bold:!0,children:title}),(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:" v13.9.1"})]}),(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:isZh7?WELCOME_SUBTITLE:isZh7?APP_BRAND_TAGLINE_ZH:"Execution-first AI coding CLI"})]})}function WelcomeV2(){let[theme2]=useTheme(),isZh7=resolveUiLocale()==="zh-CN",isLightTheme=["light","light-daltonized","light-ansi"].includes(theme2),wordmarkContent=isZh7?`${"\u9F8D"} ${APP_NAME} \xB7 ${"\u514B\u62C9\u7EF4"} ${"\u9F8D"}`:`${"\u9F8D"} ${APP_NAME} ${"\u9F8D"}`,wordmarkWidth=isZh7?21:14,taglineContent=isZh7?WELCOME_TAGLINE_ZH:"rise \xB7 code \xB7 ship",taglineWidth=isZh7?19:18,decorTop=isLightTheme?" ~ \xB7 ~ ":" * ~ \xB7 ~ * ",decorBot=isLightTheme?" ~~~ \xB7 ~~~ ":" \xB7 ~~~ \xB7 ~~~ \xB7 ";return(0,import_jsx_runtime291.jsxs)(ThemedBox_default,{width:WELCOME_V2_WIDTH,flexDirection:"column",children:[(0,import_jsx_runtime291.jsx)(WelcomeHeader,{isZh:isZh7}),(0,import_jsx_runtime291.jsxs)(ThemedBox_default,{marginTop:1,flexDirection:"column",children:[(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:decorTop}),(0,import_jsx_runtime291.jsx)(ThemedText,{color:"mascot_body",children:centerPlaque(wordmarkContent,wordmarkWidth)}),(0,import_jsx_runtime291.jsx)(ThemedText,{color:"mascot_body",children:centerPlaque(taglineContent,taglineWidth)}),(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:decorBot})]}),(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:isZh7?`\xB7 ${WELCOME_BRAND_FULL}`:`\xB7 ${WELCOME_BRAND_FULL}`})]})}var import_jsx_runtime291,WELCOME_SUBTITLE,WELCOME_TAGLINE_ZH,WELCOME_BRAND_FULL,WELCOME_V2_WIDTH,PLAQUE_WIDTH,init_WelcomeV2=__esm({"src/components/LogoV2/WelcomeV2.tsx"(){init_ink();init_branding();init_uiLocale();import_jsx_runtime291=__toESM(require_jsx_runtime()),WELCOME_SUBTITLE="\u4E2D\u6587\u4F18\u5148\u7684 AI \u7F16\u7801\u63A7\u5236\u53F0",WELCOME_TAGLINE_ZH="\u4E91\u8D77\u4E1C\u65B9 \xB7 \u9F99\u884C\u4EE3\u7801",WELCOME_BRAND_FULL="Clavue \xB7 \u9F8D",WELCOME_V2_WIDTH=60,PLAQUE_WIDTH=32;__name(centerPlaque,"centerPlaque");__name(WelcomeHeader,"WelcomeHeader");__name(WelcomeV2,"WelcomeV2")}});async function getBypassPermissionsStartupBlockReason(){if(process.platform!=="win32"&&typeof process.getuid=="function"&&process.getuid()===0&&process.env.IS_SANDBOX!=="1"&&!isEnvTruthy2(process.env.CLAUDE_CODE_BUBBLEWRAP))return"--dangerously-skip-permissions cannot be used with root/sudo privileges for security reasons";if(process.env.USER_TYPE!=="ant"||process.env.CLAUDE_CODE_ENTRYPOINT==="local-agent"||process.env.CLAUDE_CODE_ENTRYPOINT==="claude-desktop")return null;let[isDocker,hasInternet]=await Promise.all([envDynamic.getIsDocker(),env4.hasInternetAccess()]),isBubblewrap=envDynamic.getIsBubblewrapSandbox(),isSandbox=process.env.IS_SANDBOX==="1";return!(isDocker||isBubblewrap||isSandbox)||hasInternet?`--dangerously-skip-permissions can only be used in Docker/sandbox containers with no internet access but got Docker: ${isDocker}, Bubblewrap: ${isBubblewrap}, IS_SANDBOX: ${isSandbox}, hasInternet: ${hasInternet}`:null}var init_bypassSafety=__esm({"src/utils/permissions/bypassSafety.ts"(){init_env2();init_envDynamic();init_envUtils();__name(getBypassPermissionsStartupBlockReason,"getBypassPermissionsStartupBlockReason")}});var Onboarding_exports={};__export(Onboarding_exports,{Onboarding:()=>Onboarding});function getRoutingDisplayValue2(value,fallback){return String(value||"").trim()||fallback}function getProviderSnapshot(){let activeSavedProfile=getSavedActiveProviderProfile(),currentEnvProfile=getCurrentProviderProfile(),currentProfile=activeSavedProfile??currentEnvProfile??getResolvedCurrentProviderProfile();return{activeSavedProfile,currentEnvProfile,currentProfile}}function isValidHttpUrl(value){try{let url3=new URL(value);return url3.protocol==="http:"||url3.protocol==="https:"}catch{return!1}}function getProviderStartupLocalIssues(profile){if(!profile)return[];let isZh7=resolveUiLocale()==="zh-CN",baseUrl=String(profile.baseUrl||"").trim(),credential=String(profile.credential||"").trim(),issues=[];return baseUrl?isValidHttpUrl(baseUrl)||issues.push(isZh7?"[\u9519\u8BEF] API base URL \u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934\u3002":"[ERROR] API base URL must start with http:// or https://."):issues.push(isZh7?"[\u9519\u8BEF] API base URL \u4E0D\u80FD\u4E3A\u7A7A\u3002":"[ERROR] API base URL is required."),credential?isPlaceholderProviderCredential(credential)&&issues.push(isZh7?"[\u9519\u8BEF] API \u51ED\u636E\u770B\u8D77\u6765\u50CF\u5360\u4F4D\u7B26,\u8BF7\u586B\u5165\u771F\u5B9E\u51ED\u636E\u3002":"[ERROR] API credential looks like a placeholder."):issues.push(isZh7?"[\u9519\u8BEF] API \u51ED\u636E\u4E0D\u80FD\u4E3A\u7A7A\u3002":"[ERROR] API credential is required."),[...issues,...getProviderLocalValidationWarnings(profile)]}function getReadiness(snapshot2){let isZh7=resolveUiLocale()==="zh-CN";if(!snapshot2.currentProfile)return{status:"error",label:isZh7?"\u9700\u8981\u914D\u7F6E":"Setup required",detail:isZh7?"Clavue \u5DF2\u5B89\u88C5,\u4F46\u8FD8\u6CA1\u6709\u53EF\u7528\u7684 Provider \u8DEF\u7531\u3002":"Clavue is installed, but no usable provider route is active yet.",canEnterChat:!1,issues:[]};let localIssues=getProviderStartupLocalIssues(snapshot2.currentProfile);return localIssues.length>0?{status:"error",label:isZh7?"\u9700\u8981\u4FEE\u590D":"Needs repair",detail:isZh7?"\u5DF2\u627E\u5230\u5F53\u524D Provider \u8DEF\u7531,\u4F46\u672C\u5730\u6821\u9A8C\u53D1\u73B0\u914D\u7F6E\u95EE\u9898\u3002\u8BF7\u5148\u4FEE\u590D\u518D\u8FDB\u5165\u4F1A\u8BDD\u3002":"The active provider route is present, but local checks found configuration problems. Fix it before entering chat.",canEnterChat:!1,issues:localIssues}:snapshot2.activeSavedProfile&&snapshot2.currentEnvProfile&&!areProviderProfilesEquivalent(snapshot2.activeSavedProfile,snapshot2.currentEnvProfile)?{status:"warning",label:isZh7?"\u9700\u8981\u590D\u6838":"Needs review",detail:isZh7?"\u5DF2\u4FDD\u5B58\u7684 Provider \u914D\u7F6E\u5DF2\u6FC0\u6D3B,\u4F46\u5F53\u524D\u73AF\u5883\u53D8\u91CF\u4E0E\u4E4B\u4E0D\u4E00\u81F4\u3002":"A saved profile is active, but the live environment currently differs from it.",issues:[isZh7?"[\u8B66\u544A] \u5DF2\u4FDD\u5B58\u7684 Provider \u914D\u7F6E\u4E0E\u5F53\u524D\u73AF\u5883\u4E0D\u5339\u914D\u3002":"[WARN] Saved provider profile and live API environment do not match."],canEnterChat:!0}:{status:"success",label:isZh7?"\u51C6\u5907\u5C31\u7EEA":"Ready",detail:isZh7?"\u5F53\u524D Provider \u8DEF\u7531\u5DF2\u6FC0\u6D3B\u3002Clavue \u5DF2\u6309\u5F00\u653E\u5DE5\u5177\u7B56\u7565\u52A0\u8F7D\u5B8C\u6574\u80FD\u529B\uFF1B\u6267\u884C\u8FB9\u754C\u7531 /permissions \u51B3\u5B9A\u3002":"A provider route is active. Clavue loads the full tool surface by default; /permissions controls execution approval.",canEnterChat:!0,issues:[]}}function ReadinessPanel({readiness}){let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8DEF\u7531\u72B6\u6001":"Route readiness"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{color:readiness.status,children:[(0,import_jsx_runtime292.jsx)(StatusIcon,{status:readiness.status,withSpace:!0}),readiness.label]}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:readiness.detail}),readiness.issues.slice(0,3).map(issue2=>(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:issue2},issue2))]})}function QuickStart({blocked,cloudAuto}){let isZh7=resolveUiLocale()==="zh-CN";if(cloudAuto){let bullets=officialAutoOnboardingBullets(isZh7?"zh-CN":"en");return(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:0,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u63A8\u8350\uFF1AAuto \u4E00\u952E\u4E0A\u624B":"Recommended: Auto in one step"}),(0,import_jsx_runtime292.jsx)(ThemedText,{color:"success",wrap:"wrap",children:isZh7?OFFICIAL_AUTO_COMBO.pitch.zh:OFFICIAL_AUTO_COMBO.pitch.en}),bullets.map((line,i3)=>(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsxs)(ThemedText,{dimColor:!0,children:[i3+1,". "]}),line]},line)),(0,import_jsx_runtime292.jsxs)(ThemedText,{dimColor:!0,wrap:"wrap",children:[isZh7?"Chrome \u663E\u793A\uFF1A":"Chrome shows: ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:OFFICIAL_AUTO_COMBO.modelsLineExample})]})]})}return(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:0,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5FEB\u901F\u4E0A\u624B":"Quick start"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"1. "}),blocked?isZh7?"Clavue Cloud \u767B\u5F55\uFF08Auto\uFF09\u6216\u914D\u7F6E\u7B2C\u4E09\u65B9 Key":"Sign in to Clavue Cloud (Auto) or add a third-party key":isZh7?"\u786E\u8BA4\u8DEF\u7531\uFF1BCloud \u7528\u6237\u4FDD\u6301 Auto \u5373\u53EF":"Confirm the route; Cloud users can stay on Auto"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"2. "}),isZh7?"\u9009 ":"Pick ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"}),isZh7?" \u6743\u9650\u6A21\u5F0F\u540E\u5F00\u59CB\u5199\u4EE3\u7801":" then start coding"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"3. "}),isZh7?"\u8FDB\u9636\u518D\u6539\u6A21\u578B\u69FD\u4F4D\uFF1B\u9ED8\u8BA4 Auto \u5DF2\u8DB3\u591F":"Only tweak model slots later \u2014 Auto is enough to start"]})]})}function SetupProgress({step:step2}){let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime292.jsx)(ThemedBox_default,{children:[{id:1,label:"Provider"},{id:2,label:isZh7?"\u6743\u9650":"Permissions"},{id:3,label:isZh7?"\u5F00\u59CB":"Start"}].map((item,index)=>(0,import_jsx_runtime292.jsxs)(ThemedText,{color:item.id===step2?"success":void 0,dimColor:item.id>step2,children:[index>0?" ":"",item.id<=step2?"\u25CF":"\u25CB"," ",item.id,". ",item.label]},item.id))})}function SetupComplete({onEnter}){let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(WelcomeV2,{}),(0,import_jsx_runtime292.jsx)(SetupProgress,{step:3}),(0,import_jsx_runtime292.jsxs)(ThemedText,{color:"success",children:[(0,import_jsx_runtime292.jsx)(StatusIcon,{status:"success",withSpace:!0}),isZh7?"\u914D\u7F6E\u5B8C\u6210 \xB7 Auto \u5C31\u7EEA":"Setup complete \xB7 Auto ready"]}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:isZh7?"\u9ED8\u8BA4 Auto \u7EC4\u5408\u5DF2\u5C31\u7EEA\uFF08\u5B98\u65B9\u4EA7\u54C1\u6A21\u578B\uFF09\u3002\u8FDB\u5165\u540E\u76F4\u63A5\u63D0\u9700\u6C42\u5373\u53EF\uFF1B\u4E0D\u5FC5\u5148\u8C03\u6A21\u578B\u77E9\u9635\u3002":"Default Auto combo is ready (official product models). Just ask for work \u2014 no model matrix first."}),(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:0,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5EFA\u8BAE\u4E0B\u4E00\u6B65":"Suggested next steps"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"1. "}),isZh7?"\u76F4\u63A5\u63CF\u8FF0\u4EFB\u52A1\uFF08\u68C0\u67E5 / \u6539\u4EE3\u7801 / \u8DD1\u6D4B\u8BD5\uFF09":"Describe a task (inspect / edit / run tests)"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"2. "}),(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/init"}),isZh7?" \u53EF\u9009\uFF1A\u5199\u9879\u76EE\u89C4\u5219":" optional: project rules"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"3. "}),isZh7?"\u989D\u5EA6\u7D27\u65F6 /account switch\uFF1B\u8FDB\u9636\u624D /provider":"If quota is low: /account switch; /provider only when advanced"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"4. "}),(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/provider current"}),isZh7?" \u67E5\u770B\u8DEF\u7531\uFF0C":" to inspect routing, ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"}),isZh7?" \u8C03\u6574\u6267\u884C\u8FB9\u754C":" to adjust execution approval"]})]}),(0,import_jsx_runtime292.jsx)(Select,{hideIndexes:!0,options:[{label:isZh7?"\u7528 Auto \u8FDB\u5165\u4F1A\u8BDD":"Enter with Auto",value:"enter",description:isZh7?"\u5B98\u65B9\u7EC4\u5408\u5DF2\u5C31\u7EEA \u2014 \u76F4\u63A5\u63D0\u9700\u6C42\u5373\u53EF\u3002":"Official Auto combo ready \u2014 just ask for work."}],layout:"compact-vertical",defaultValue:"enter",onChange:value=>{value==="enter"&&onEnter()},onCancel:onEnter})]})}function saveDefaultPermissionMode(mode2){return updateSettingsForSource("userSettings",{permissions:{defaultMode:mode2}}).error}function installFirstRunPermissionPreset(mode2,baseContext){try{if(mode2==="acceptEdits")return{context:applyZeroConfigPermissionPreset(baseContext).context};if(mode2==="bypassPermissions")return{context:applyAutonomousDevelopmentPermissionPreset(baseContext).context};let error40=saveDefaultPermissionMode(mode2);return error40?{error:error40}:{context:{...baseContext,mode:mode2}}}catch(error40){return{error:error40 instanceof Error?error40:new Error(String(error40))}}}function PermissionQuickSetup({onDone,initialToolPermissionContext}){let[status2,setStatus]=import_react171.default.useState(null),options=[{label:"\u9AD8\u6548\u5F00\u53D1\uFF08\u63A8\u8350\uFF09",value:"acceptEdits",description:"\u81EA\u52A8\u63A5\u53D7\u6587\u4EF6\u7F16\u8F91\uFF1B\u8FD0\u884C\u547D\u4EE4\u524D\u4ECD\u4F1A\u786E\u8BA4\uFF0C\u9002\u5408\u5927\u591A\u6570\u9879\u76EE\u3002"},{label:"\u901A\u7528\u6388\u6743\uFF08\u6700\u65B9\u4FBF\uFF09",value:"bypassPermissions",description:"\u81EA\u52A8\u5141\u8BB8 Tool use\uFF0C\u5305\u62EC Web Search\uFF1B\u4EC5\u7528\u4E8E\u4F60\u5B8C\u5168\u4FE1\u4EFB\u3001\u53EF\u6062\u590D\u7684\u73AF\u5883\u3002"},{label:"\u9ED8\u8BA4\u5B89\u5168\u6A21\u5F0F",value:"default",description:"\u6BCF\u6B21\u654F\u611F\u6587\u4EF6\u7F16\u8F91\u6216\u547D\u4EE4\u6267\u884C\u524D\u90FD\u5148\u8BE2\u95EE\u3002"},{label:"\u8BA1\u5212\u6A21\u5F0F",value:"plan",description:"\u9ED8\u8BA4\u5148\u5206\u6790\u548C\u89C4\u5212\uFF0C\u5B9E\u65BD\u524D\u518D\u786E\u8BA4\u3002"},{label:"\u8DF3\u8FC7\uFF08\u7A0D\u540E\u7528 /approvals \u8BBE\u7F6E\uFF09",value:"skip",description:"\u8FDB\u5165\u4F1A\u8BDD\u540E\u53EF\u8FD0\u884C /approvals \u6216 /permissions \u4FEE\u6539\u3002"},{label:"\u9000\u51FA",value:"exit",description:"\u6682\u4E0D\u8FDB\u5165 Clavue\u3002"}];async function handleSelection(value){if(value==="exit"){onDone({type:"exit"});return}if(value==="skip"){onDone({type:"continue"});return}if(value==="bypassPermissions"){let blockReason=await getBypassPermissionsStartupBlockReason();if(blockReason){setStatus(`\u6700\u5927\u6743\u9650\u5F53\u524D\u4E0D\u53EF\u7528\uFF1A${blockReason}`);return}if(await shouldDisableBypassPermissions()){setStatus("\u6700\u5927\u6743\u9650\u5F53\u524D\u5DF2\u88AB\u7EC4\u7EC7\u7B56\u7565\u7981\u7528\u3002\u8BF7\u9009\u62E9\u9AD8\u6548\u5F00\u53D1\u6216\u9ED8\u8BA4\u5B89\u5168\u6A21\u5F0F\u3002");return}}let result2=installFirstRunPermissionPreset(value,initialToolPermissionContext??getEmptyToolPermissionContext());if(result2.error){setStatus(`\u6743\u9650\u6A21\u5F0F\u4FDD\u5B58\u5931\u8D25\uFF1A${result2.error.message}`);return}onDone({type:"continue",permissionMode:value,permissionNotice:value==="bypassPermissions"?"\u5DF2\u542F\u7528\u6700\u5927\u6743\u9650\u6A21\u5F0F\u3002\u53EA\u5728\u5B8C\u5168\u4FE1\u4EFB\u7684\u9879\u76EE\u548C\u73AF\u5883\u4E2D\u4F7F\u7528\u3002":value==="acceptEdits"?"\u5DF2\u5B89\u88C5\u96F6\u914D\u7F6E\u5F00\u53D1\u6743\u9650\uFF0C\u5E76\u5C06\u9ED8\u8BA4\u6743\u9650\u6A21\u5F0F\u8BBE\u4E3A acceptEdits\u3002":`\u5DF2\u5C06\u9ED8\u8BA4\u6743\u9650\u6A21\u5F0F\u8BBE\u4E3A ${value}\u3002`,toolPermissionContext:result2.context})}return __name(handleSelection,"handleSelection"),(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(WelcomeV2,{}),(0,import_jsx_runtime292.jsx)(SetupProgress,{step:2}),(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:"\u{1F6E1} \u6743\u9650\u914D\u7F6E\u7BA1\u7406"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{dimColor:!0,wrap:"wrap",children:["\u9009\u62E9 Clavue \u9ED8\u8BA4\u5982\u4F55\u5904\u7406\u6587\u4EF6\u7F16\u8F91\u548C\u547D\u4EE4\u6267\u884C\u6743\u9650\u3002\u540E\u7EED\u53EF\u5728\u4F1A\u8BDD\u4E2D\u4F7F\u7528"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/approvals"})," \u6216"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"})," \u968F\u65F6\u8C03\u6574\u3002"]}),(0,import_jsx_runtime292.jsx)(ThemedText,{wrap:"wrap",children:"? \u8BF7\u9009\u62E9\u9ED8\u8BA4\u6743\u9650\u6A21\u5F0F:"}),status2?(0,import_jsx_runtime292.jsx)(ThemedText,{color:"warning",wrap:"wrap",children:status2}):null,(0,import_jsx_runtime292.jsx)(Select,{hideIndexes:!0,options,layout:"compact-vertical",defaultValue:"acceptEdits",onChange:value=>{handleSelection(value)},onCancel:()=>onDone({type:"exit"})})]})}function RouteSummary({snapshot:snapshot2}){let isZh7=resolveUiLocale()==="zh-CN",routeProfile=snapshot2.currentEnvProfile??snapshot2.currentProfile,currentSlots=routeProfile?getProviderModelSlotDefaults(routeProfile.modelRouting):null,migrationHint=getProviderMigrationHint(snapshot2.currentEnvProfile??snapshot2.activeSavedProfile??snapshot2.currentProfile,{hasSavedProfile:snapshot2.activeSavedProfile!==null}),fallback=isZh7?"Provider \u9ED8\u8BA4":"provider default",noneText=isZh7?"\u65E0":"none";return routeProfile?(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8DEF\u7531\u6458\u8981":"Route summary"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5DF2\u4FDD\u5B58\u7684\u5F53\u524D\u914D\u7F6E:":"Active saved profile:"})," ",snapshot2.activeSavedProfile?.name??noneText]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5F53\u524D API \u73AF\u5883:":"Live API config:"})," ",snapshot2.currentEnvProfile?.name??noneText]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6765\u6E90:":"Source:"})," ",getProviderSourceLabel(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6765\u6E90\u8BF4\u660E:":"Source detail:"})," ",getProviderSourceDescription(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6A21\u578B\u6A21\u5F0F:":"Model mode:"})," ",getProviderExperienceLabel(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6A21\u5F0F\u8BF4\u660E:":"Mode note:"})," ",getProviderExperienceDescription(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8DEF\u7531\u7B56\u7565:":"Routing strategy:"})," ",getProviderRoutingStrategyLabel(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u4E3B\u6A21\u578B:":"Primary:"})," ",getRoutingDisplayValue2(routeProfile.modelRouting.primaryModel,fallback)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:"Sonnet:"})," ",getRoutingDisplayValue2(currentSlots?.sonnetModel,fallback)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:"Haiku:"})," ",getRoutingDisplayValue2(currentSlots?.haikuModel,fallback)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:"Opus:"})," ",getRoutingDisplayValue2(currentSlots?.opusModel,fallback)]}),migrationHint?(0,import_jsx_runtime292.jsxs)(ThemedText,{dimColor:!0,wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8FC1\u79FB\u5EFA\u8BAE:":"Migration:"})," ",migrationHint]}):null]}):(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8DEF\u7531\u6458\u8981":"Route summary"}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u672A\u627E\u5230\u5F53\u524D\u8DEF\u7531\u3002":"No active route was found."})]})}function Onboarding({onDone,initialToolPermissionContext}){let isZh7=resolveUiLocale()==="zh-CN",[snapshot2,setSnapshot]=import_react171.default.useState(getProviderSnapshot),authDecision=import_react171.default.useMemo(()=>resolveAuthBootstrapDecision(isZh7?"zh-CN":"en"),[isZh7,snapshot2.currentProfile?.id,snapshot2.activeSavedProfile?.id]),[mode2,setMode]=import_react171.default.useState(()=>snapshot2.currentProfile||authDecision.skipLogin?"choice":"wizard"),[pendingResult,setPendingResult]=import_react171.default.useState(null),readiness=getReadiness(snapshot2),cloudAutoReady=isOfficialCloudAutoProfile(snapshot2.currentProfile),startupOptions=[{label:isZh7?cloudAutoReady?"\u4F7F\u7528 Auto \u8FDB\u5165\u4F1A\u8BDD\uFF08\u63A8\u8350\uFF09":"\u4F7F\u7528 Auto \u5F00\u59CB\uFF08\u63A8\u8350\uFF09":cloudAutoReady?"Enter with Auto (recommended)":"Start with Auto (recommended)",value:"auto",description:isZh7?cloudAutoReady?`${OFFICIAL_AUTO_COMBO.pitch.zh} \xB7 \u5DF2\u5C31\u7EEA\uFF0C\u76F4\u63A5\u8FDB\u5165\u3002`:`${OFFICIAL_AUTO_COMBO.pitch.zh} \xB7 \u767B\u5F55 Cloud \u540E\u9ED8\u8BA4 Auto \u7EC4\u5408\u3002`:cloudAutoReady?`${OFFICIAL_AUTO_COMBO.pitch.en} \xB7 ready, enter now.`:`${OFFICIAL_AUTO_COMBO.pitch.en} \xB7 Cloud login defaults to Auto combo.`},...authDecision.skipLogin&&readiness.canEnterChat&&!cloudAutoReady?[{label:isZh7?"\u8FDB\u5165\u4F1A\u8BDD\uFF08\u5F53\u524D\u8DEF\u7531\uFF09":"Enter chat (current route)",value:"continue",description:isZh7?`${authDecision.summary} \xB7 \u4FDD\u6301\u73B0\u6709 BYOK / \u81EA\u5B9A\u4E49\u69FD\u4F4D\u3002`:`${authDecision.summary} \xB7 keep current BYOK / custom slots.`}]:[],{label:isZh7?"Clavue Cloud \u767B\u5F55":"Clavue Cloud sign-in",value:"cloud",description:isZh7?"\u4F1A\u5458\u767B\u5F55\u540E\u81EA\u52A8\u5957\u7528 Auto \u7EC4\u5408\uFF08\u5B98\u65B9\u4EA7\u54C1\u6A21\u578B\uFF09\u3002\u4F1A\u8BDD\u5185\u4E5F\u53EF /account login\u3002":"After membership login, Auto combo is applied (official product models). Or /account login in chat."},{label:isZh7?"\u7B2C\u4E09\u65B9 / API Key\uFF08\u8FDB\u9636\uFF09":"Third-party / API key (advanced)",value:"configure",description:isZh7?"\u81EA\u5907 OpenAI / Claude / Grok / \u7F51\u5173\u3002\u989D\u5EA6\u4E0D\u8DB3\u65F6\u7684\u5B89\u5168\u7F51\uFF1B\u975E\u5FC5\u586B\u3002":"Bring OpenAI / Claude / Grok / gateway keys. Safety net when quota is low \u2014 optional."},{label:isZh7?"\u9000\u51FA":"Exit",value:"exit",description:isZh7?"\u6682\u4E0D\u8FDB\u5165 Clavue\u3002":"Do not enter Clavue right now."}];function refreshSnapshot(){let nextSnapshot=getProviderSnapshot();return setSnapshot(nextSnapshot),nextSnapshot}return __name(refreshSnapshot,"refreshSnapshot"),mode2==="done"?(0,import_jsx_runtime292.jsx)(SetupComplete,{onEnter:()=>onDone(pendingResult??{type:"continue"})}):mode2==="permissions"?(0,import_jsx_runtime292.jsx)(PermissionQuickSetup,{onDone:result2=>{if(result2.type==="continue"){setPendingResult(result2),setMode("done");return}onDone(result2)},initialToolPermissionContext}):mode2==="wizard"?(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(WelcomeV2,{}),(0,import_jsx_runtime292.jsx)(SetupProgress,{step:1}),(0,import_jsx_runtime292.jsx)(ReadinessPanel,{readiness}),(0,import_jsx_runtime292.jsx)(QuickStart,{blocked:snapshot2.currentProfile===null,cloudAuto:!1}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:isZh7?(0,import_jsx_runtime292.jsxs)(import_jsx_runtime292.Fragment,{children:["\u8FDB\u9636\u8DEF\u5F84\uFF1A\u914D\u7F6E\u81EA\u6709 API\u3002\u65B0\u624B\u66F4\u63A8\u8350\u8FD4\u56DE\u9009\u300C\u4F7F\u7528 Auto\u300D\u5E76"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/account login"}),"\u3002\u540E\u7EED\u53EF\u7528"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"clavue provider"})," \u91CD\u5F00\u6B64\u9762\u677F\u3002"]}):(0,import_jsx_runtime292.jsxs)(import_jsx_runtime292.Fragment,{children:["Advanced path: bring your own API. New users should prefer Auto +"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/account login"}),". Reopen later with"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"clavue provider"}),"."]})}),(0,import_jsx_runtime292.jsx)(ProviderConfigManager,{onDone:configured=>{let nextSnapshot=refreshSnapshot();if(configured&&getReadiness(nextSnapshot).canEnterChat){setMode("permissions");return}if(nextSnapshot.currentProfile){setMode("choice");return}onDone({type:"exit"})}})]}):(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(WelcomeV2,{}),(0,import_jsx_runtime292.jsx)(SetupProgress,{step:1}),(0,import_jsx_runtime292.jsx)(ReadinessPanel,{readiness}),(0,import_jsx_runtime292.jsx)(RouteSummary,{snapshot:snapshot2}),(0,import_jsx_runtime292.jsx)(QuickStart,{blocked:snapshot2.currentProfile===null,cloudAuto:cloudAutoReady||authDecision.activeTrack==="membership"}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:isZh7?(0,import_jsx_runtime292.jsxs)(import_jsx_runtime292.Fragment,{children:["\u5FC3\u667A\uFF1A\u9ED8\u8BA4 ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"Auto"}),"\uFF08\u5B98\u65B9\u7EC4\u5408\u6A21\u578B\uFF09\u3002\u8FDB\u9636\u518D\u78B0 /provider\u3002\u6743\u9650\u7528"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"}),"\u3002"]}):(0,import_jsx_runtime292.jsxs)(import_jsx_runtime292.Fragment,{children:["Mental model: default ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"Auto"})," ","(official multi-model combo). Touch /provider only when advanced. Permissions: ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"}),"."]})}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:isZh7?`Cloud: ${membershipAccountWebUrl("zh")} \xB7 ${membershipPricingWebUrl("zh")}`:`Cloud: ${membershipAccountWebUrl("en")} \xB7 ${membershipPricingWebUrl("en")}`}),(0,import_jsx_runtime292.jsx)(Select,{hideIndexes:!0,options:startupOptions,layout:"compact-vertical",onChange:value=>{if(value==="auto"){ensureOfficialAutoOnCloudProfile({activate:!0});let next=refreshSnapshot();if(getReadiness(next).canEnterChat){setMode("permissions");return}if(authDecision.hasMembershipSession){setMode("permissions");return}if(next.currentProfile){setMode("permissions");return}setMode("wizard");return}if(value==="continue"){setMode("permissions");return}if(value==="cloud"){if(ensureOfficialAutoOnCloudProfile({activate:!0}),refreshSnapshot(),snapshot2.currentProfile?.id===MEMBERSHIP_CLOUD_PROFILE_ID&&readiness.canEnterChat){setMode("permissions");return}if(readiness.canEnterChat){setMode("permissions");return}refreshSnapshot(),setMode("wizard");return}if(value==="configure"){refreshSnapshot(),setMode("wizard");return}onDone({type:"exit"})},onCancel:()=>onDone({type:"exit"})})]})}var import_react171,import_jsx_runtime292,init_Onboarding=__esm({"src/components/Onboarding.tsx"(){import_react171=__toESM(require_react());init_select();init_ink();init_ProviderConfigManager();init_StatusIcon();init_WelcomeV2();init_bypassSafety();init_permissionSetup();init_zeroConfigPreset();init_uiLocale();init_settings2();init_Tool();init_providerProfileMetadata();init_providerCredentials();init_providerProfiles();init_authPolicy();init_config3();init_officialAutoCombo();import_jsx_runtime292=__toESM(require_jsx_runtime());__name(getRoutingDisplayValue2,"getRoutingDisplayValue");__name(getProviderSnapshot,"getProviderSnapshot");__name(isValidHttpUrl,"isValidHttpUrl");__name(getProviderStartupLocalIssues,"getProviderStartupLocalIssues");__name(getReadiness,"getReadiness");__name(ReadinessPanel,"ReadinessPanel");__name(QuickStart,"QuickStart");__name(SetupProgress,"SetupProgress");__name(SetupComplete,"SetupComplete");__name(saveDefaultPermissionMode,"saveDefaultPermissionMode");__name(installFirstRunPermissionPreset,"installFirstRunPermissionPreset");__name(PermissionQuickSetup,"PermissionQuickSetup");__name(RouteSummary,"RouteSummary");__name(Onboarding,"Onboarding")}});function PermissionRequestTitle({title,subtitle,color:color3="permission",workerBadge}){return(0,import_jsx_runtime293.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime293.jsxs)(ThemedBox_default,{flexDirection:"row",gap:1,children:[(0,import_jsx_runtime293.jsx)(ThemedText,{bold:!0,color:color3,children:title}),workerBadge&&(0,import_jsx_runtime293.jsxs)(ThemedText,{dimColor:!0,children:["\xB7 ","@",workerBadge.name]})]}),subtitle!=null&&(typeof subtitle=="string"?(0,import_jsx_runtime293.jsx)(ThemedText,{dimColor:!0,wrap:"truncate-start",children:subtitle}):subtitle)]})}var import_jsx_runtime293,init_PermissionRequestTitle=__esm({"src/components/permissions/PermissionRequestTitle.tsx"(){init_ink();import_jsx_runtime293=__toESM(require_jsx_runtime());__name(PermissionRequestTitle,"PermissionRequestTitle")}});function PermissionDialog({title,subtitle,color:color3="permission",titleColor,innerPaddingX=1,workerBadge,titleRight,children}){return(0,import_jsx_runtime294.jsxs)(ThemedBox_default,{flexDirection:"column",borderStyle:"round",borderColor:color3,borderLeft:!1,borderRight:!1,borderBottom:!1,marginTop:1,children:[(0,import_jsx_runtime294.jsx)(ThemedBox_default,{paddingX:1,flexDirection:"column",children:(0,import_jsx_runtime294.jsxs)(ThemedBox_default,{justifyContent:"space-between",children:[(0,import_jsx_runtime294.jsx)(PermissionRequestTitle,{title,subtitle,color:titleColor,workerBadge}),titleRight]})}),(0,import_jsx_runtime294.jsx)(ThemedBox_default,{flexDirection:"column",paddingX:innerPaddingX,children})]})}var import_jsx_runtime294,init_PermissionDialog=__esm({"src/components/permissions/PermissionDialog.tsx"(){init_ink();init_PermissionRequestTitle();import_jsx_runtime294=__toESM(require_jsx_runtime());__name(PermissionDialog,"PermissionDialog")}});function hasHooks(settings){if(settings===null||settings.disableAllHooks)return!1;if(settings.statusLine||settings.fileSuggestion)return!0;if(!settings.hooks)return!1;for(let hookConfig of Object.values(settings.hooks))if(hookConfig.length>0)return!0;return!1}function getHooksSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasHooks(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasHooks(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasBashPermission(rules){return rules.some(rule=>rule.ruleBehavior==="allow"&&(rule.ruleValue.toolName===BASH_TOOL_NAME||rule.ruleValue.toolName.startsWith(BASH_TOOL_NAME+"(")))}function getBashPermissionSources(){let sources=[],projectRules=getPermissionRulesForSource("projectSettings");hasBashPermission(projectRules)&&sources.push(".clavue/settings.json");let localRules=getPermissionRulesForSource("localSettings");return hasBashPermission(localRules)&&sources.push(".clavue/settings.local.json"),sources}function hasOtelHeadersHelper(settings){return!!settings?.otelHeadersHelper}function getOtelHeadersHelperSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasOtelHeadersHelper(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasOtelHeadersHelper(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasApiKeyHelper(settings){return!!settings?.apiKeyHelper}function getApiKeyHelperSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasApiKeyHelper(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasApiKeyHelper(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasAwsCommands(settings){return!!(settings?.awsAuthRefresh||settings?.awsCredentialExport)}function getAwsCommandsSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasAwsCommands(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasAwsCommands(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasGcpCommands(settings){return!!settings?.gcpAuthRefresh}function getGcpCommandsSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasGcpCommands(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasGcpCommands(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasDangerousEnvVars(settings){return settings?.env?Object.keys(settings.env).some(key3=>!SAFE_ENV_VARS3.has(key3.toUpperCase())):!1}function getDangerousEnvVarsSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasDangerousEnvVars(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasDangerousEnvVars(localSettings)&&sources.push(".clavue/settings.local.json"),sources}var init_utils14=__esm({"src/components/TrustDialog/utils.ts"(){init_settings2();init_toolName();init_managedEnvConstants();init_permissionsLoader();__name(hasHooks,"hasHooks");__name(getHooksSources,"getHooksSources");__name(hasBashPermission,"hasBashPermission");__name(getBashPermissionSources,"getBashPermissionSources");__name(hasOtelHeadersHelper,"hasOtelHeadersHelper");__name(getOtelHeadersHelperSources,"getOtelHeadersHelperSources");__name(hasApiKeyHelper,"hasApiKeyHelper");__name(getApiKeyHelperSources,"getApiKeyHelperSources");__name(hasAwsCommands,"hasAwsCommands");__name(getAwsCommandsSources,"getAwsCommandsSources");__name(hasGcpCommands,"hasGcpCommands");__name(getGcpCommandsSources,"getGcpCommandsSources");__name(hasDangerousEnvVars,"hasDangerousEnvVars");__name(getDangerousEnvVarsSources,"getDangerousEnvVarsSources")}});var TrustDialog_exports={};__export(TrustDialog_exports,{TrustDialog:()=>TrustDialog});import{homedir as homedir49}from"os";function TrustDialog({onDone,commands}){let{servers:projectServers}=getMcpConfigsByScope("project"),hasMcpServers=Object.keys(projectServers).length>0,hasHooks2=getHooksSources().length>0,bashSettingSources=getBashPermissionSources(),hasApiKeyHelper2=getApiKeyHelperSources().length>0,hasAwsCommands2=getAwsCommandsSources().length>0,hasGcpCommands2=getGcpCommandsSources().length>0,hasOtelHeadersHelper2=getOtelHeadersHelperSources().length>0,hasDangerousEnvVars2=getDangerousEnvVarsSources().length>0,hasSlashCommandBash=commands?.some(command7=>command7.type==="prompt"&&command7.loadedFrom==="commands"&&(command7.source==="projectSettings"||command7.source==="localSettings")&&command7.allowedTools?.some(tool=>tool===BASH_TOOL_NAME||tool.startsWith(BASH_TOOL_NAME+"(")))??!1,hasSkillsBash=commands?.some(command7=>command7.type==="prompt"&&(command7.loadedFrom==="skills"||command7.loadedFrom==="plugin")&&(command7.source==="projectSettings"||command7.source==="localSettings"||command7.source==="plugin")&&command7.allowedTools?.some(tool=>tool===BASH_TOOL_NAME||tool.startsWith(BASH_TOOL_NAME+"(")))??!1,hasAnyBashExecution=bashSettingSources.length>0||hasSlashCommandBash||hasSkillsBash,hasTrustDialogAccepted=checkHasTrustDialogAccepted();import_react172.default.useEffect(()=>{let isHomeDir=homedir49()===getCwd();logEvent("tengu_trust_dialog_shown",{isHomeDir,hasMcpServers,hasHooks:hasHooks2,hasBashExecution:hasAnyBashExecution,hasApiKeyHelper:hasApiKeyHelper2,hasAwsCommands:hasAwsCommands2,hasGcpCommands:hasGcpCommands2,hasOtelHeadersHelper:hasOtelHeadersHelper2,hasDangerousEnvVars:hasDangerousEnvVars2})},[hasMcpServers,hasHooks2,hasAnyBashExecution,hasApiKeyHelper2,hasAwsCommands2,hasGcpCommands2,hasOtelHeadersHelper2,hasDangerousEnvVars2]);function onChange(value){if(value==="exit"){gracefulShutdownSync(1);return}let isHomeDir=homedir49()===getCwd();logEvent("tengu_trust_dialog_accept",{isHomeDir,hasMcpServers,hasHooks:hasHooks2,hasBashExecution:hasAnyBashExecution,hasApiKeyHelper:hasApiKeyHelper2,hasAwsCommands:hasAwsCommands2,hasGcpCommands:hasGcpCommands2,hasOtelHeadersHelper:hasOtelHeadersHelper2,hasDangerousEnvVars:hasDangerousEnvVars2}),isHomeDir?setSessionTrustAccepted(!0):saveCurrentProjectConfig(current=>({...current,hasTrustDialogAccepted:!0})),onDone()}__name(onChange,"onChange");let exitState=useExitOnCtrlCDWithKeybindings(()=>gracefulShutdownSync(1));return useKeybinding("confirm:no",()=>{gracefulShutdownSync(0)},{context:"Confirmation"}),hasTrustDialogAccepted?(setTimeout(onDone),null):(0,import_jsx_runtime295.jsx)(PermissionDialog,{color:"warning",titleColor:"warning",title:"Accessing workspace:",children:(0,import_jsx_runtime295.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,paddingTop:1,children:[(0,import_jsx_runtime295.jsx)(ThemedText,{bold:!0,children:getFsImplementation().cwd()}),(0,import_jsx_runtime295.jsxs)(ThemedText,{children:["Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, take a moment to review what","'","s in this folder first."]}),(0,import_jsx_runtime295.jsx)(ThemedText,{children:"Clavue will be able to read, edit, and execute files here."}),(0,import_jsx_runtime295.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime295.jsx)(Link,{url:"https://www.clavue.com",children:"Security guide"})}),(0,import_jsx_runtime295.jsx)(Select,{options:[{label:"Yes, I trust this folder",value:"enable_all"},{label:"No, exit",value:"exit"}],onChange:value=>onChange(value),onCancel:()=>onChange("exit")}),(0,import_jsx_runtime295.jsx)(ThemedText,{dimColor:!0,children:exitState.pending?(0,import_jsx_runtime295.jsxs)(import_jsx_runtime295.Fragment,{children:["Press ",exitState.keyName," again to exit"]}):(0,import_jsx_runtime295.jsx)(import_jsx_runtime295.Fragment,{children:"Enter to confirm \xB7 Esc to cancel"})})]})})}var import_react172,import_jsx_runtime295,init_TrustDialog=__esm({"src/components/TrustDialog/TrustDialog.tsx"(){import_react172=__toESM(require_react());init_analytics();init_state();init_useExitOnCtrlCDWithKeybindings();init_ink();init_useKeybinding();init_config9();init_toolName();init_config12();init_cwd2();init_fsOperations();init_gracefulShutdown();init_CustomSelect();init_PermissionDialog();init_utils14();import_jsx_runtime295=__toESM(require_jsx_runtime());__name(TrustDialog,"TrustDialog")}});import{appendFileSync as appendFileSync12}from"fs";function completeOnboarding(){saveGlobalConfig(current=>({...current,hasCompletedOnboarding:!0,lastOnboardingVersion:"13.9.1"}))}function showDialog(root2,renderer){return new Promise(resolve67=>{let done=__name(result2=>{resolve67(result2)},"done");root2.render(renderer(done))})}async function exitWithError2(root2,message,beforeExit){return exitWithMessage(root2,message,{color:"error",beforeExit})}async function exitWithMessage(root2,message,options){let{Text:Text2}=await Promise.resolve().then(()=>(init_ink(),ink_exports)),color3=options?.color,exitCode=options?.exitCode??1;root2.render(color3?(0,import_jsx_runtime296.jsx)(Text2,{color:color3,children:message}):(0,import_jsx_runtime296.jsx)(Text2,{children:message})),root2.unmount(),await options?.beforeExit?.(),process.exit(exitCode)}function showSetupDialog(root2,renderer,options){return showDialog(root2,done=>(0,import_jsx_runtime296.jsx)(AppStateProvider,{onChangeAppState:options?.onChangeAppState,children:(0,import_jsx_runtime296.jsx)(KeybindingSetup,{children:renderer(done)})}))}async function renderAndRun(root2,element){root2.render(element),startDeferredPrefetches(),await root2.waitUntilExit(),await gracefulShutdown(0)}async function showSetupScreens(root2,permissionMode,initialToolPermissionContext,allowDangerouslySkipPermissions,commands,devChannels,explicitModelOverride=!1,userSpecifiedModel=null){if(isEnvTruthy2(!1)||process.env.IS_DEMO)return{onboardingShown:!1,providerProfileChanged:!1,resolvedProviderProfile:getResolvedCurrentProviderProfile(),nextMainLoopModel:null,nextPermissionMode:void 0,permissionModeNotice:void 0,nextToolPermissionContext:void 0};let config3=getGlobalConfig(),onboardingShown=!1,onboardingResult="continue",nextPermissionMode,permissionModeNotice,nextToolPermissionContext,providerProfileBeforeOnboarding=getResolvedCurrentProviderProfile(),providerProfileChanged=!1,resolvedProviderProfile=providerProfileBeforeOnboarding,nextMainLoopModel=null;{let{needsLanguageOnboarding:needsLanguageOnboarding2}=await Promise.resolve().then(()=>(init_applyUiLocale(),applyUiLocale_exports));if(needsLanguageOnboarding2()){onboardingShown=!0;let{LanguageOnboardingGate:LanguageOnboardingGate2}=await Promise.resolve().then(()=>(init_LanguageOnboardingGate(),LanguageOnboardingGate_exports));await showSetupDialog(root2,done=>(0,import_jsx_runtime296.jsx)(LanguageOnboardingGate2,{onDone:()=>{done(void 0)}}))}}if(!config3.theme||!config3.hasCompletedOnboarding){onboardingShown=!0;let{Onboarding:Onboarding2}=await Promise.resolve().then(()=>(init_Onboarding(),Onboarding_exports)),onboardingScreenResult=await showSetupDialog(root2,done=>(0,import_jsx_runtime296.jsx)(Onboarding2,{initialToolPermissionContext,onDone:result2=>{result2.type==="continue"&&completeOnboarding(),done(result2)}}),{onChangeAppState});onboardingResult=onboardingScreenResult.type,onboardingScreenResult.type==="continue"&&(nextPermissionMode=onboardingScreenResult.permissionMode,permissionModeNotice=onboardingScreenResult.permissionNotice,nextToolPermissionContext=onboardingScreenResult.toolPermissionContext),nextPermissionMode&&(permissionMode=nextPermissionMode),resolvedProviderProfile=getResolvedCurrentProviderProfile();let refreshPlan=getProviderSetupRefreshPlan({providerProfileBeforeOnboarding,resolvedProviderProfile,onboardingResult,explicitModelOverride,userSpecifiedModel});if(providerProfileChanged=refreshPlan.providerProfileChanged,nextMainLoopModel=refreshPlan.nextMainLoopModel,onboardingResult==="exit")return gracefulShutdownSync(0),{onboardingShown,providerProfileChanged,resolvedProviderProfile,nextMainLoopModel,nextPermissionMode,permissionModeNotice,nextToolPermissionContext}}if(!isEnvTruthy2(process.env.CLAUBBIT)){if(!checkHasTrustDialogAccepted()){let{TrustDialog:TrustDialog2}=await Promise.resolve().then(()=>(init_TrustDialog(),TrustDialog_exports));await showSetupDialog(root2,done=>(0,import_jsx_runtime296.jsx)(TrustDialog2,{commands,onDone:done}))}setSessionTrustAccepted(!0),resetGrowthBook(),initializeGrowthBook(),getSystemContext();let{errors:allErrors}=getSettingsWithAllErrors();if(allErrors.length===0&&await handleMcpjsonServerApprovals(root2),await shouldShowClaudeMdExternalIncludesWarning()){let externalIncludes=getExternalClaudeMdIncludes(await getMemoryFiles(!0)),{ClaudeMdExternalIncludesDialog:ClaudeMdExternalIncludesDialog2}=await Promise.resolve().then(()=>(init_ClaudeMdExternalIncludesDialog(),ClaudeMdExternalIncludesDialog_exports));await showSetupDialog(root2,done=>(0,import_jsx_runtime296.jsx)(ClaudeMdExternalIncludesDialog2,{onDone:done,isStandaloneDialog:!0,externalIncludes}))}}return updateGithubRepoPathMapping(),applyConfigEnvironmentVariables(),setImmediate(()=>initializeTelemetryAfterTrust()),{onboardingShown,providerProfileChanged,resolvedProviderProfile,nextMainLoopModel,nextPermissionMode,permissionModeNotice,nextToolPermissionContext}}function getRenderContext(exitOnCtrlC){let lastFlickerTime=0,baseOptions=getBaseRenderOptions(exitOnCtrlC);baseOptions.stdin&&logEvent("tengu_stdin_interactive",{});let fpsTracker=new FpsTracker,stats3=createStatsStore();setStatsStore(stats3);let frameTimingLogPath=process.env.CLAUDE_CODE_FRAME_TIMING_LOG;return{getFpsMetrics:__name(()=>fpsTracker.getMetrics(),"getFpsMetrics"),stats:stats3,renderOptions:{...baseOptions,onFrame:__name(event=>{if(fpsTracker.record(event.durationMs),stats3.observe("frame_duration_ms",event.durationMs),frameTimingLogPath&&event.phases){let line=JSON.stringify({total:event.durationMs,...event.phases,rss:process.memoryUsage.rss(),cpu:process.cpuUsage()})+`
11198
+ `)}var init_mcpServerApproval=__esm({"src/services/mcpServerApproval.tsx"(){init_config9();init_utils10();__name(handleMcpjsonServerApprovals,"handleMcpjsonServerApprovals")}});function setSessionStateChangedListener(cb){stateListener=cb}function setSessionMetadataChangedListener(cb){metadataListener=cb}function setPermissionModeChangedListener(cb){permissionModeListener=cb}function getSessionState(){return currentState}function notifySessionStateChanged(state5,details){currentState=state5,stateListener?.(state5,details),state5==="requires_action"&&details?(hasPendingAction=!0,metadataListener?.({pending_action:details})):hasPendingAction&&(hasPendingAction=!1,metadataListener?.({pending_action:null})),state5==="idle"&&metadataListener?.({task_summary:null}),isEnvTruthy2(process.env.CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS)&&enqueueSdkEvent({type:"system",subtype:"session_state_changed",state:state5})}function notifySessionMetadataChanged(metadata){metadataListener?.(metadata)}function notifyPermissionModeChanged(mode2){permissionModeListener?.(mode2)}var stateListener,metadataListener,permissionModeListener,hasPendingAction,currentState,init_sessionState2=__esm({"src/utils/sessionState.ts"(){init_envUtils();init_sdkEventQueue();stateListener=null,metadataListener=null,permissionModeListener=null;__name(setSessionStateChangedListener,"setSessionStateChangedListener");__name(setSessionMetadataChangedListener,"setSessionMetadataChangedListener");__name(setPermissionModeChangedListener,"setPermissionModeChangedListener");hasPendingAction=!1,currentState="idle";__name(getSessionState,"getSessionState");__name(notifySessionStateChanged,"notifySessionStateChanged");__name(notifySessionMetadataChanged,"notifySessionMetadataChanged");__name(notifyPermissionModeChanged,"notifyPermissionModeChanged")}});function externalMetadataToAppState(metadata){return prev=>({...prev,...typeof metadata.permission_mode=="string"?{toolPermissionContext:{...prev.toolPermissionContext,mode:isDeprecatedPermissionMode(metadata.permission_mode)?"default":permissionModeFromString(metadata.permission_mode)}}:{},...typeof metadata.is_ultraplan_mode=="boolean"?{isUltraplanMode:metadata.is_ultraplan_mode}:{}})}function onChangeAppState({newState,oldState}){let prevMode=oldState.toolPermissionContext.mode,newMode=newState.toolPermissionContext.mode;if(prevMode!==newMode){let prevExternal=toExternalPermissionMode(prevMode),newExternal=toExternalPermissionMode(newMode);if(prevExternal!==newExternal){let isUltraplan=newExternal==="plan"&&newState.isUltraplanMode&&!oldState.isUltraplanMode?!0:null;notifySessionMetadataChanged({permission_mode:newExternal,is_ultraplan_mode:isUltraplan})}notifyPermissionModeChanged(newMode)}if(newState.mainLoopModel!==oldState.mainLoopModel&&newState.mainLoopModel===null&&(updateSettingsForSource("userSettings",{model:void 0}),setMainLoopModelOverride(null)),newState.mainLoopModel!==oldState.mainLoopModel&&newState.mainLoopModel!==null&&(updateSettingsForSource("userSettings",{model:newState.mainLoopModel}),setMainLoopModelOverride(newState.mainLoopModel),setModelLaunchMeta({requested:newState.mainLoopModel,effective:newState.mainLoopModel,source:"user"})),newState.expandedView!==oldState.expandedView){let showExpandedTodos=newState.expandedView==="tasks",showSpinnerTree=newState.expandedView==="teammates";(getGlobalConfig().showExpandedTodos!==showExpandedTodos||getGlobalConfig().showSpinnerTree!==showSpinnerTree)&&saveGlobalConfig(current=>({...current,showExpandedTodos,showSpinnerTree}))}if(newState.verbose!==oldState.verbose&&getGlobalConfig().verbose!==newState.verbose){let verbose=newState.verbose;saveGlobalConfig(current=>({...current,verbose}))}if(process.env.USER_TYPE==="ant"&&newState.tungstenPanelVisible!==oldState.tungstenPanelVisible&&newState.tungstenPanelVisible!==void 0&&getGlobalConfig().tungstenPanelVisible!==newState.tungstenPanelVisible){let tungstenPanelVisible=newState.tungstenPanelVisible;saveGlobalConfig(current=>({...current,tungstenPanelVisible}))}if(newState.settings!==oldState.settings)try{clearApiKeyHelperCache(),clearAwsCredentialsCache(),clearGcpCredentialsCache(),newState.settings.env!==oldState.settings.env&&applyConfigEnvironmentVariables()}catch(error40){logError2(toError(error40))}}var init_onChangeAppState=__esm({"src/state/onChangeAppState.ts"(){init_state();init_auth();init_config12();init_errors2();init_log3();init_managedEnv();init_PermissionMode();init_sessionState2();init_settings2();__name(externalMetadataToAppState,"externalMetadataToAppState");__name(onChangeAppState,"onChangeAppState")}});var init_terminalPreference=__esm({"src/utils/deepLink/terminalPreference.ts"(){init_config12();init_debug()}});var FpsTracker,init_fpsTracker=__esm({"src/utils/fpsTracker.ts"(){FpsTracker=class{static{__name(this,"FpsTracker")}frameDurations=[];firstRenderTime;lastRenderTime;record(durationMs){let now3=performance.now();this.firstRenderTime===void 0&&(this.firstRenderTime=now3),this.lastRenderTime=now3,this.frameDurations.push(durationMs)}getMetrics(){if(this.frameDurations.length===0||this.firstRenderTime===void 0||this.lastRenderTime===void 0)return;let totalTimeMs=this.lastRenderTime-this.firstRenderTime;if(totalTimeMs<=0)return;let averageFps=this.frameDurations.length/(totalTimeMs/1e3),sorted=this.frameDurations.slice().sort((a2,b3)=>b3-a2),p99Index=Math.max(0,Math.ceil(sorted.length*.01)-1),p99FrameTimeMs=sorted[p99Index],low1PctFps=p99FrameTimeMs>0?1e3/p99FrameTimeMs:0;return{averageFps:Math.round(averageFps*100)/100,low1PctFps:Math.round(low1PctFps*100)/100}}}}});import{realpath as realpath12}from"fs/promises";async function updateGithubRepoPathMapping(){try{let repo=await detectCurrentRepository();if(!repo){logForDebugging("Not in a GitHub repository, skipping path mapping update");return}let cwd6=getOriginalCwd(),basePath=findGitRoot(cwd6)??cwd6,currentPath;try{currentPath=(await realpath12(basePath)).normalize("NFC")}catch{currentPath=basePath}let repoKey=repo.toLowerCase(),existingPaths=getGlobalConfig().githubRepoPaths?.[repoKey]??[];if(existingPaths[0]===currentPath){logForDebugging(`Path ${currentPath} already tracked for repo ${repoKey}`);return}let withoutCurrent=existingPaths.filter(p=>p!==currentPath),updatedPaths=[currentPath,...withoutCurrent];saveGlobalConfig(current=>({...current,githubRepoPaths:{...current.githubRepoPaths,[repoKey]:updatedPaths}})),logForDebugging(`Added ${currentPath} to tracked paths for repo ${repoKey}`)}catch(error40){logForDebugging(`Error updating repo path mapping: ${error40}`)}}var init_githubRepoPathMapping=__esm({"src/utils/githubRepoPathMapping.ts"(){init_state();init_config12();init_debug();init_detectRepository();init_file();init_gitFilesystem();init_git();__name(updateGithubRepoPathMapping,"updateGithubRepoPathMapping")}});var BRAND_WORDMARK,TAGLINE_ZH,TAGLINE_EN,SLOGAN_ZH,BRAND_LOCKUP_COMPACT,BRAND_WORDMARK_BILINGUAL,FIRST_LAUNCH_TITLE_ZH,FIRST_LAUNCH_SUBTITLE,init_dragonArt=__esm({"src/constants/dragonArt.ts"(){BRAND_WORDMARK="CLAVUE",TAGLINE_ZH="\u9F8D\u884C\u4EE3\u7801 \xB7 \u6267\u884C\u4F18\u5148",TAGLINE_EN="Dragon code \xB7 execution-first",SLOGAN_ZH="\u7231\u6211\u4E2D\u534E \xB7 \u81EA\u5F3A\u4E0D\u606F",BRAND_LOCKUP_COMPACT=`\u9F8D ${BRAND_WORDMARK}`,BRAND_WORDMARK_BILINGUAL=`${BRAND_WORDMARK} \xB7 \u514B\u62C9\u7EF4`,FIRST_LAUNCH_TITLE_ZH=`\u9F8D ${BRAND_WORDMARK} \xB7 \u514B\u62C9\u7EF4`,FIRST_LAUNCH_SUBTITLE="Choose your language / \u9009\u62E9\u8BED\u8A00 / \u8A00\u8A9E\u3092\u9078\u3076"}});var LanguageOnboardingGate_exports={};__export(LanguageOnboardingGate_exports,{LanguageOnboardingGate:()=>LanguageOnboardingGate,shouldShowLanguageOnboarding:()=>shouldShowLanguageOnboarding});function LanguageOnboardingGate({onDone}){let[done,setDone]=(0,import_react170.useState)(!needsLanguageOnboarding());return done?null:(0,import_jsx_runtime290.jsxs)(ThemedBox_default,{flexDirection:"column",paddingX:1,paddingY:1,gap:1,children:[(0,import_jsx_runtime290.jsxs)(ThemedBox_default,{flexDirection:"column",alignItems:"center",marginY:1,gap:0,children:[(0,import_jsx_runtime290.jsx)(ThemedText,{color:"warning",bold:!0,children:"\u9F8D"}),(0,import_jsx_runtime290.jsx)(ThemedText,{children:" "}),(0,import_jsx_runtime290.jsx)(ThemedText,{bold:!0,color:"warning",children:BRAND_WORDMARK_BILINGUAL}),(0,import_jsx_runtime290.jsx)(ThemedText,{dimColor:!0,children:"\u2500".repeat(18)})]}),(0,import_jsx_runtime290.jsxs)(ThemedBox_default,{flexDirection:"column",alignItems:"center",gap:0,children:[(0,import_jsx_runtime290.jsx)(ThemedText,{color:"error",bold:!0,children:TAGLINE_ZH}),(0,import_jsx_runtime290.jsx)(ThemedText,{dimColor:!0,children:TAGLINE_EN}),(0,import_jsx_runtime290.jsx)(ThemedText,{dimColor:!0,children:SLOGAN_ZH})]}),(0,import_jsx_runtime290.jsx)(ThemedBox_default,{flexDirection:"column",alignItems:"center",gap:0,children:(0,import_jsx_runtime290.jsx)(ThemedText,{dimColor:!0,children:FIRST_LAUNCH_SUBTITLE})}),(0,import_jsx_runtime290.jsx)(LanguagePicker,{primaryOnly:!0,initialLanguage:void 0,onCancel:()=>{applyUiLocale("zh-CN"),setDone(!0),onDone()},onComplete:lang=>{applyUiLocale(lang||"zh-CN"),setDone(!0),onDone()}})]})}function shouldShowLanguageOnboarding(){return needsLanguageOnboarding()}var import_react170,import_jsx_runtime290,init_LanguageOnboardingGate=__esm({"src/components/LanguageOnboardingGate.tsx"(){import_react170=__toESM(require_react());init_ink();init_dragonArt();init_applyUiLocale();init_LanguagePicker();import_jsx_runtime290=__toESM(require_jsx_runtime());__name(LanguageOnboardingGate,"LanguageOnboardingGate");__name(shouldShowLanguageOnboarding,"shouldShowLanguageOnboarding")}});function centerPlaque(content,contentWidth){let total=Math.max(0,PLAQUE_WIDTH-contentWidth),left=Math.floor(total/2),right=total-left;return" ".repeat(left)+content+" ".repeat(right)}function WelcomeHeader({isZh:isZh7}){let title=isZh7?`${APP_NAME} \xB7 ${"\u514B\u62C9\u7EF4"}`:APP_NAME;return(0,import_jsx_runtime291.jsxs)(import_jsx_runtime291.Fragment,{children:[(0,import_jsx_runtime291.jsxs)(ThemedText,{children:[(0,import_jsx_runtime291.jsx)(ThemedText,{color:"brand",bold:!0,children:title}),(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:" v13.9.2"})]}),(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:isZh7?WELCOME_SUBTITLE:isZh7?APP_BRAND_TAGLINE_ZH:"Execution-first AI coding CLI"})]})}function WelcomeV2(){let[theme2]=useTheme(),isZh7=resolveUiLocale()==="zh-CN",isLightTheme=["light","light-daltonized","light-ansi"].includes(theme2),wordmarkContent=isZh7?`${"\u9F8D"} ${APP_NAME} \xB7 ${"\u514B\u62C9\u7EF4"} ${"\u9F8D"}`:`${"\u9F8D"} ${APP_NAME} ${"\u9F8D"}`,wordmarkWidth=isZh7?21:14,taglineContent=isZh7?WELCOME_TAGLINE_ZH:"rise \xB7 code \xB7 ship",taglineWidth=isZh7?19:18,decorTop=isLightTheme?" ~ \xB7 ~ ":" * ~ \xB7 ~ * ",decorBot=isLightTheme?" ~~~ \xB7 ~~~ ":" \xB7 ~~~ \xB7 ~~~ \xB7 ";return(0,import_jsx_runtime291.jsxs)(ThemedBox_default,{width:WELCOME_V2_WIDTH,flexDirection:"column",children:[(0,import_jsx_runtime291.jsx)(WelcomeHeader,{isZh:isZh7}),(0,import_jsx_runtime291.jsxs)(ThemedBox_default,{marginTop:1,flexDirection:"column",children:[(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:decorTop}),(0,import_jsx_runtime291.jsx)(ThemedText,{color:"mascot_body",children:centerPlaque(wordmarkContent,wordmarkWidth)}),(0,import_jsx_runtime291.jsx)(ThemedText,{color:"mascot_body",children:centerPlaque(taglineContent,taglineWidth)}),(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:decorBot})]}),(0,import_jsx_runtime291.jsx)(ThemedText,{dimColor:!0,children:isZh7?`\xB7 ${WELCOME_BRAND_FULL}`:`\xB7 ${WELCOME_BRAND_FULL}`})]})}var import_jsx_runtime291,WELCOME_SUBTITLE,WELCOME_TAGLINE_ZH,WELCOME_BRAND_FULL,WELCOME_V2_WIDTH,PLAQUE_WIDTH,init_WelcomeV2=__esm({"src/components/LogoV2/WelcomeV2.tsx"(){init_ink();init_branding();init_uiLocale();import_jsx_runtime291=__toESM(require_jsx_runtime()),WELCOME_SUBTITLE="\u4E2D\u6587\u4F18\u5148\u7684 AI \u7F16\u7801\u63A7\u5236\u53F0",WELCOME_TAGLINE_ZH="\u4E91\u8D77\u4E1C\u65B9 \xB7 \u9F99\u884C\u4EE3\u7801",WELCOME_BRAND_FULL="Clavue \xB7 \u9F8D",WELCOME_V2_WIDTH=60,PLAQUE_WIDTH=32;__name(centerPlaque,"centerPlaque");__name(WelcomeHeader,"WelcomeHeader");__name(WelcomeV2,"WelcomeV2")}});async function getBypassPermissionsStartupBlockReason(){if(process.platform!=="win32"&&typeof process.getuid=="function"&&process.getuid()===0&&process.env.IS_SANDBOX!=="1"&&!isEnvTruthy2(process.env.CLAUDE_CODE_BUBBLEWRAP))return"--dangerously-skip-permissions cannot be used with root/sudo privileges for security reasons";if(process.env.USER_TYPE!=="ant"||process.env.CLAUDE_CODE_ENTRYPOINT==="local-agent"||process.env.CLAUDE_CODE_ENTRYPOINT==="claude-desktop")return null;let[isDocker,hasInternet]=await Promise.all([envDynamic.getIsDocker(),env4.hasInternetAccess()]),isBubblewrap=envDynamic.getIsBubblewrapSandbox(),isSandbox=process.env.IS_SANDBOX==="1";return!(isDocker||isBubblewrap||isSandbox)||hasInternet?`--dangerously-skip-permissions can only be used in Docker/sandbox containers with no internet access but got Docker: ${isDocker}, Bubblewrap: ${isBubblewrap}, IS_SANDBOX: ${isSandbox}, hasInternet: ${hasInternet}`:null}var init_bypassSafety=__esm({"src/utils/permissions/bypassSafety.ts"(){init_env2();init_envDynamic();init_envUtils();__name(getBypassPermissionsStartupBlockReason,"getBypassPermissionsStartupBlockReason")}});var Onboarding_exports={};__export(Onboarding_exports,{Onboarding:()=>Onboarding});function getRoutingDisplayValue2(value,fallback){return String(value||"").trim()||fallback}function getProviderSnapshot(){let activeSavedProfile=getSavedActiveProviderProfile(),currentEnvProfile=getCurrentProviderProfile(),currentProfile=activeSavedProfile??currentEnvProfile??getResolvedCurrentProviderProfile();return{activeSavedProfile,currentEnvProfile,currentProfile}}function isValidHttpUrl(value){try{let url3=new URL(value);return url3.protocol==="http:"||url3.protocol==="https:"}catch{return!1}}function getProviderStartupLocalIssues(profile){if(!profile)return[];let isZh7=resolveUiLocale()==="zh-CN",baseUrl=String(profile.baseUrl||"").trim(),credential=String(profile.credential||"").trim(),issues=[];return baseUrl?isValidHttpUrl(baseUrl)||issues.push(isZh7?"[\u9519\u8BEF] API base URL \u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934\u3002":"[ERROR] API base URL must start with http:// or https://."):issues.push(isZh7?"[\u9519\u8BEF] API base URL \u4E0D\u80FD\u4E3A\u7A7A\u3002":"[ERROR] API base URL is required."),credential?isPlaceholderProviderCredential(credential)&&issues.push(isZh7?"[\u9519\u8BEF] API \u51ED\u636E\u770B\u8D77\u6765\u50CF\u5360\u4F4D\u7B26,\u8BF7\u586B\u5165\u771F\u5B9E\u51ED\u636E\u3002":"[ERROR] API credential looks like a placeholder."):issues.push(isZh7?"[\u9519\u8BEF] API \u51ED\u636E\u4E0D\u80FD\u4E3A\u7A7A\u3002":"[ERROR] API credential is required."),[...issues,...getProviderLocalValidationWarnings(profile)]}function getReadiness(snapshot2){let isZh7=resolveUiLocale()==="zh-CN";if(!snapshot2.currentProfile)return{status:"error",label:isZh7?"\u9700\u8981\u914D\u7F6E":"Setup required",detail:isZh7?"Clavue \u5DF2\u5B89\u88C5,\u4F46\u8FD8\u6CA1\u6709\u53EF\u7528\u7684 Provider \u8DEF\u7531\u3002":"Clavue is installed, but no usable provider route is active yet.",canEnterChat:!1,issues:[]};let localIssues=getProviderStartupLocalIssues(snapshot2.currentProfile);return localIssues.length>0?{status:"error",label:isZh7?"\u9700\u8981\u4FEE\u590D":"Needs repair",detail:isZh7?"\u5DF2\u627E\u5230\u5F53\u524D Provider \u8DEF\u7531,\u4F46\u672C\u5730\u6821\u9A8C\u53D1\u73B0\u914D\u7F6E\u95EE\u9898\u3002\u8BF7\u5148\u4FEE\u590D\u518D\u8FDB\u5165\u4F1A\u8BDD\u3002":"The active provider route is present, but local checks found configuration problems. Fix it before entering chat.",canEnterChat:!1,issues:localIssues}:snapshot2.activeSavedProfile&&snapshot2.currentEnvProfile&&!areProviderProfilesEquivalent(snapshot2.activeSavedProfile,snapshot2.currentEnvProfile)?{status:"warning",label:isZh7?"\u9700\u8981\u590D\u6838":"Needs review",detail:isZh7?"\u5DF2\u4FDD\u5B58\u7684 Provider \u914D\u7F6E\u5DF2\u6FC0\u6D3B,\u4F46\u5F53\u524D\u73AF\u5883\u53D8\u91CF\u4E0E\u4E4B\u4E0D\u4E00\u81F4\u3002":"A saved profile is active, but the live environment currently differs from it.",issues:[isZh7?"[\u8B66\u544A] \u5DF2\u4FDD\u5B58\u7684 Provider \u914D\u7F6E\u4E0E\u5F53\u524D\u73AF\u5883\u4E0D\u5339\u914D\u3002":"[WARN] Saved provider profile and live API environment do not match."],canEnterChat:!0}:{status:"success",label:isZh7?"\u51C6\u5907\u5C31\u7EEA":"Ready",detail:isZh7?"\u5F53\u524D Provider \u8DEF\u7531\u5DF2\u6FC0\u6D3B\u3002Clavue \u5DF2\u6309\u5F00\u653E\u5DE5\u5177\u7B56\u7565\u52A0\u8F7D\u5B8C\u6574\u80FD\u529B\uFF1B\u6267\u884C\u8FB9\u754C\u7531 /permissions \u51B3\u5B9A\u3002":"A provider route is active. Clavue loads the full tool surface by default; /permissions controls execution approval.",canEnterChat:!0,issues:[]}}function ReadinessPanel({readiness}){let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8DEF\u7531\u72B6\u6001":"Route readiness"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{color:readiness.status,children:[(0,import_jsx_runtime292.jsx)(StatusIcon,{status:readiness.status,withSpace:!0}),readiness.label]}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:readiness.detail}),readiness.issues.slice(0,3).map(issue2=>(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:issue2},issue2))]})}function QuickStart({blocked,cloudAuto}){let isZh7=resolveUiLocale()==="zh-CN";if(cloudAuto){let bullets=officialAutoOnboardingBullets(isZh7?"zh-CN":"en");return(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:0,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u63A8\u8350\uFF1AAuto \u4E00\u952E\u4E0A\u624B":"Recommended: Auto in one step"}),(0,import_jsx_runtime292.jsx)(ThemedText,{color:"success",wrap:"wrap",children:isZh7?OFFICIAL_AUTO_COMBO.pitch.zh:OFFICIAL_AUTO_COMBO.pitch.en}),bullets.map((line,i3)=>(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsxs)(ThemedText,{dimColor:!0,children:[i3+1,". "]}),line]},line)),(0,import_jsx_runtime292.jsxs)(ThemedText,{dimColor:!0,wrap:"wrap",children:[isZh7?"Chrome \u663E\u793A\uFF1A":"Chrome shows: ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:OFFICIAL_AUTO_COMBO.modelsLineExample})]})]})}return(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:0,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5FEB\u901F\u4E0A\u624B":"Quick start"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"1. "}),blocked?isZh7?"Clavue Cloud \u767B\u5F55\uFF08Auto\uFF09\u6216\u914D\u7F6E\u7B2C\u4E09\u65B9 Key":"Sign in to Clavue Cloud (Auto) or add a third-party key":isZh7?"\u786E\u8BA4\u8DEF\u7531\uFF1BCloud \u7528\u6237\u4FDD\u6301 Auto \u5373\u53EF":"Confirm the route; Cloud users can stay on Auto"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"2. "}),isZh7?"\u9009 ":"Pick ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"}),isZh7?" \u6743\u9650\u6A21\u5F0F\u540E\u5F00\u59CB\u5199\u4EE3\u7801":" then start coding"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"3. "}),isZh7?"\u8FDB\u9636\u518D\u6539\u6A21\u578B\u69FD\u4F4D\uFF1B\u9ED8\u8BA4 Auto \u5DF2\u8DB3\u591F":"Only tweak model slots later \u2014 Auto is enough to start"]})]})}function SetupProgress({step:step2}){let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime292.jsx)(ThemedBox_default,{children:[{id:1,label:"Provider"},{id:2,label:isZh7?"\u6743\u9650":"Permissions"},{id:3,label:isZh7?"\u5F00\u59CB":"Start"}].map((item,index)=>(0,import_jsx_runtime292.jsxs)(ThemedText,{color:item.id===step2?"success":void 0,dimColor:item.id>step2,children:[index>0?" ":"",item.id<=step2?"\u25CF":"\u25CB"," ",item.id,". ",item.label]},item.id))})}function SetupComplete({onEnter}){let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(WelcomeV2,{}),(0,import_jsx_runtime292.jsx)(SetupProgress,{step:3}),(0,import_jsx_runtime292.jsxs)(ThemedText,{color:"success",children:[(0,import_jsx_runtime292.jsx)(StatusIcon,{status:"success",withSpace:!0}),isZh7?"\u914D\u7F6E\u5B8C\u6210 \xB7 Auto \u5C31\u7EEA":"Setup complete \xB7 Auto ready"]}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:isZh7?"\u9ED8\u8BA4 Auto \u7EC4\u5408\u5DF2\u5C31\u7EEA\uFF08\u5B98\u65B9\u4EA7\u54C1\u6A21\u578B\uFF09\u3002\u8FDB\u5165\u540E\u76F4\u63A5\u63D0\u9700\u6C42\u5373\u53EF\uFF1B\u4E0D\u5FC5\u5148\u8C03\u6A21\u578B\u77E9\u9635\u3002":"Default Auto combo is ready (official product models). Just ask for work \u2014 no model matrix first."}),(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:0,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5EFA\u8BAE\u4E0B\u4E00\u6B65":"Suggested next steps"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"1. "}),isZh7?"\u76F4\u63A5\u63CF\u8FF0\u4EFB\u52A1\uFF08\u68C0\u67E5 / \u6539\u4EE3\u7801 / \u8DD1\u6D4B\u8BD5\uFF09":"Describe a task (inspect / edit / run tests)"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"2. "}),(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/init"}),isZh7?" \u53EF\u9009\uFF1A\u5199\u9879\u76EE\u89C4\u5219":" optional: project rules"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"3. "}),isZh7?"\u989D\u5EA6\u7D27\u65F6 /account switch\uFF1B\u8FDB\u9636\u624D /provider":"If quota is low: /account switch; /provider only when advanced"]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:"4. "}),(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/provider current"}),isZh7?" \u67E5\u770B\u8DEF\u7531\uFF0C":" to inspect routing, ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"}),isZh7?" \u8C03\u6574\u6267\u884C\u8FB9\u754C":" to adjust execution approval"]})]}),(0,import_jsx_runtime292.jsx)(Select,{hideIndexes:!0,options:[{label:isZh7?"\u7528 Auto \u8FDB\u5165\u4F1A\u8BDD":"Enter with Auto",value:"enter",description:isZh7?"\u5B98\u65B9\u7EC4\u5408\u5DF2\u5C31\u7EEA \u2014 \u76F4\u63A5\u63D0\u9700\u6C42\u5373\u53EF\u3002":"Official Auto combo ready \u2014 just ask for work."}],layout:"compact-vertical",defaultValue:"enter",onChange:value=>{value==="enter"&&onEnter()},onCancel:onEnter})]})}function saveDefaultPermissionMode(mode2){return updateSettingsForSource("userSettings",{permissions:{defaultMode:mode2}}).error}function installFirstRunPermissionPreset(mode2,baseContext){try{if(mode2==="acceptEdits")return{context:applyZeroConfigPermissionPreset(baseContext).context};if(mode2==="bypassPermissions")return{context:applyAutonomousDevelopmentPermissionPreset(baseContext).context};let error40=saveDefaultPermissionMode(mode2);return error40?{error:error40}:{context:{...baseContext,mode:mode2}}}catch(error40){return{error:error40 instanceof Error?error40:new Error(String(error40))}}}function PermissionQuickSetup({onDone,initialToolPermissionContext}){let[status2,setStatus]=import_react171.default.useState(null),options=[{label:"\u9AD8\u6548\u5F00\u53D1\uFF08\u63A8\u8350\uFF09",value:"acceptEdits",description:"\u81EA\u52A8\u63A5\u53D7\u6587\u4EF6\u7F16\u8F91\uFF1B\u8FD0\u884C\u547D\u4EE4\u524D\u4ECD\u4F1A\u786E\u8BA4\uFF0C\u9002\u5408\u5927\u591A\u6570\u9879\u76EE\u3002"},{label:"\u901A\u7528\u6388\u6743\uFF08\u6700\u65B9\u4FBF\uFF09",value:"bypassPermissions",description:"\u81EA\u52A8\u5141\u8BB8 Tool use\uFF0C\u5305\u62EC Web Search\uFF1B\u4EC5\u7528\u4E8E\u4F60\u5B8C\u5168\u4FE1\u4EFB\u3001\u53EF\u6062\u590D\u7684\u73AF\u5883\u3002"},{label:"\u9ED8\u8BA4\u5B89\u5168\u6A21\u5F0F",value:"default",description:"\u6BCF\u6B21\u654F\u611F\u6587\u4EF6\u7F16\u8F91\u6216\u547D\u4EE4\u6267\u884C\u524D\u90FD\u5148\u8BE2\u95EE\u3002"},{label:"\u8BA1\u5212\u6A21\u5F0F",value:"plan",description:"\u9ED8\u8BA4\u5148\u5206\u6790\u548C\u89C4\u5212\uFF0C\u5B9E\u65BD\u524D\u518D\u786E\u8BA4\u3002"},{label:"\u8DF3\u8FC7\uFF08\u7A0D\u540E\u7528 /approvals \u8BBE\u7F6E\uFF09",value:"skip",description:"\u8FDB\u5165\u4F1A\u8BDD\u540E\u53EF\u8FD0\u884C /approvals \u6216 /permissions \u4FEE\u6539\u3002"},{label:"\u9000\u51FA",value:"exit",description:"\u6682\u4E0D\u8FDB\u5165 Clavue\u3002"}];async function handleSelection(value){if(value==="exit"){onDone({type:"exit"});return}if(value==="skip"){onDone({type:"continue"});return}if(value==="bypassPermissions"){let blockReason=await getBypassPermissionsStartupBlockReason();if(blockReason){setStatus(`\u6700\u5927\u6743\u9650\u5F53\u524D\u4E0D\u53EF\u7528\uFF1A${blockReason}`);return}if(await shouldDisableBypassPermissions()){setStatus("\u6700\u5927\u6743\u9650\u5F53\u524D\u5DF2\u88AB\u7EC4\u7EC7\u7B56\u7565\u7981\u7528\u3002\u8BF7\u9009\u62E9\u9AD8\u6548\u5F00\u53D1\u6216\u9ED8\u8BA4\u5B89\u5168\u6A21\u5F0F\u3002");return}}let result2=installFirstRunPermissionPreset(value,initialToolPermissionContext??getEmptyToolPermissionContext());if(result2.error){setStatus(`\u6743\u9650\u6A21\u5F0F\u4FDD\u5B58\u5931\u8D25\uFF1A${result2.error.message}`);return}onDone({type:"continue",permissionMode:value,permissionNotice:value==="bypassPermissions"?"\u5DF2\u542F\u7528\u6700\u5927\u6743\u9650\u6A21\u5F0F\u3002\u53EA\u5728\u5B8C\u5168\u4FE1\u4EFB\u7684\u9879\u76EE\u548C\u73AF\u5883\u4E2D\u4F7F\u7528\u3002":value==="acceptEdits"?"\u5DF2\u5B89\u88C5\u96F6\u914D\u7F6E\u5F00\u53D1\u6743\u9650\uFF0C\u5E76\u5C06\u9ED8\u8BA4\u6743\u9650\u6A21\u5F0F\u8BBE\u4E3A acceptEdits\u3002":`\u5DF2\u5C06\u9ED8\u8BA4\u6743\u9650\u6A21\u5F0F\u8BBE\u4E3A ${value}\u3002`,toolPermissionContext:result2.context})}return __name(handleSelection,"handleSelection"),(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(WelcomeV2,{}),(0,import_jsx_runtime292.jsx)(SetupProgress,{step:2}),(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:"\u{1F6E1} \u6743\u9650\u914D\u7F6E\u7BA1\u7406"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{dimColor:!0,wrap:"wrap",children:["\u9009\u62E9 Clavue \u9ED8\u8BA4\u5982\u4F55\u5904\u7406\u6587\u4EF6\u7F16\u8F91\u548C\u547D\u4EE4\u6267\u884C\u6743\u9650\u3002\u540E\u7EED\u53EF\u5728\u4F1A\u8BDD\u4E2D\u4F7F\u7528"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/approvals"})," \u6216"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"})," \u968F\u65F6\u8C03\u6574\u3002"]}),(0,import_jsx_runtime292.jsx)(ThemedText,{wrap:"wrap",children:"? \u8BF7\u9009\u62E9\u9ED8\u8BA4\u6743\u9650\u6A21\u5F0F:"}),status2?(0,import_jsx_runtime292.jsx)(ThemedText,{color:"warning",wrap:"wrap",children:status2}):null,(0,import_jsx_runtime292.jsx)(Select,{hideIndexes:!0,options,layout:"compact-vertical",defaultValue:"acceptEdits",onChange:value=>{handleSelection(value)},onCancel:()=>onDone({type:"exit"})})]})}function RouteSummary({snapshot:snapshot2}){let isZh7=resolveUiLocale()==="zh-CN",routeProfile=snapshot2.currentEnvProfile??snapshot2.currentProfile,currentSlots=routeProfile?getProviderModelSlotDefaults(routeProfile.modelRouting):null,migrationHint=getProviderMigrationHint(snapshot2.currentEnvProfile??snapshot2.activeSavedProfile??snapshot2.currentProfile,{hasSavedProfile:snapshot2.activeSavedProfile!==null}),fallback=isZh7?"Provider \u9ED8\u8BA4":"provider default",noneText=isZh7?"\u65E0":"none";return routeProfile?(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8DEF\u7531\u6458\u8981":"Route summary"}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5DF2\u4FDD\u5B58\u7684\u5F53\u524D\u914D\u7F6E:":"Active saved profile:"})," ",snapshot2.activeSavedProfile?.name??noneText]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u5F53\u524D API \u73AF\u5883:":"Live API config:"})," ",snapshot2.currentEnvProfile?.name??noneText]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6765\u6E90:":"Source:"})," ",getProviderSourceLabel(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6765\u6E90\u8BF4\u660E:":"Source detail:"})," ",getProviderSourceDescription(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6A21\u578B\u6A21\u5F0F:":"Model mode:"})," ",getProviderExperienceLabel(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u6A21\u5F0F\u8BF4\u660E:":"Mode note:"})," ",getProviderExperienceDescription(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8DEF\u7531\u7B56\u7565:":"Routing strategy:"})," ",getProviderRoutingStrategyLabel(routeProfile)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u4E3B\u6A21\u578B:":"Primary:"})," ",getRoutingDisplayValue2(routeProfile.modelRouting.primaryModel,fallback)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:"Sonnet:"})," ",getRoutingDisplayValue2(currentSlots?.sonnetModel,fallback)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:"Haiku:"})," ",getRoutingDisplayValue2(currentSlots?.haikuModel,fallback)]}),(0,import_jsx_runtime292.jsxs)(ThemedText,{wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:"Opus:"})," ",getRoutingDisplayValue2(currentSlots?.opusModel,fallback)]}),migrationHint?(0,import_jsx_runtime292.jsxs)(ThemedText,{dimColor:!0,wrap:"wrap",children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8FC1\u79FB\u5EFA\u8BAE:":"Migration:"})," ",migrationHint]}):null]}):(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(ThemedText,{bold:!0,children:isZh7?"\u8DEF\u7531\u6458\u8981":"Route summary"}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u672A\u627E\u5230\u5F53\u524D\u8DEF\u7531\u3002":"No active route was found."})]})}function Onboarding({onDone,initialToolPermissionContext}){let isZh7=resolveUiLocale()==="zh-CN",[snapshot2,setSnapshot]=import_react171.default.useState(getProviderSnapshot),authDecision=import_react171.default.useMemo(()=>resolveAuthBootstrapDecision(isZh7?"zh-CN":"en"),[isZh7,snapshot2.currentProfile?.id,snapshot2.activeSavedProfile?.id]),[mode2,setMode]=import_react171.default.useState(()=>snapshot2.currentProfile||authDecision.skipLogin?"choice":"wizard"),[pendingResult,setPendingResult]=import_react171.default.useState(null),readiness=getReadiness(snapshot2),cloudAutoReady=isOfficialCloudAutoProfile(snapshot2.currentProfile),startupOptions=[{label:isZh7?cloudAutoReady?"\u4F7F\u7528 Auto \u8FDB\u5165\u4F1A\u8BDD\uFF08\u63A8\u8350\uFF09":"\u4F7F\u7528 Auto \u5F00\u59CB\uFF08\u63A8\u8350\uFF09":cloudAutoReady?"Enter with Auto (recommended)":"Start with Auto (recommended)",value:"auto",description:isZh7?cloudAutoReady?`${OFFICIAL_AUTO_COMBO.pitch.zh} \xB7 \u5DF2\u5C31\u7EEA\uFF0C\u76F4\u63A5\u8FDB\u5165\u3002`:`${OFFICIAL_AUTO_COMBO.pitch.zh} \xB7 \u767B\u5F55 Cloud \u540E\u9ED8\u8BA4 Auto \u7EC4\u5408\u3002`:cloudAutoReady?`${OFFICIAL_AUTO_COMBO.pitch.en} \xB7 ready, enter now.`:`${OFFICIAL_AUTO_COMBO.pitch.en} \xB7 Cloud login defaults to Auto combo.`},...authDecision.skipLogin&&readiness.canEnterChat&&!cloudAutoReady?[{label:isZh7?"\u8FDB\u5165\u4F1A\u8BDD\uFF08\u5F53\u524D\u8DEF\u7531\uFF09":"Enter chat (current route)",value:"continue",description:isZh7?`${authDecision.summary} \xB7 \u4FDD\u6301\u73B0\u6709 BYOK / \u81EA\u5B9A\u4E49\u69FD\u4F4D\u3002`:`${authDecision.summary} \xB7 keep current BYOK / custom slots.`}]:[],{label:isZh7?"Clavue Cloud \u767B\u5F55":"Clavue Cloud sign-in",value:"cloud",description:isZh7?"\u4F1A\u5458\u767B\u5F55\u540E\u81EA\u52A8\u5957\u7528 Auto \u7EC4\u5408\uFF08\u5B98\u65B9\u4EA7\u54C1\u6A21\u578B\uFF09\u3002\u4F1A\u8BDD\u5185\u4E5F\u53EF /account login\u3002":"After membership login, Auto combo is applied (official product models). Or /account login in chat."},{label:isZh7?"\u7B2C\u4E09\u65B9 / API Key\uFF08\u8FDB\u9636\uFF09":"Third-party / API key (advanced)",value:"configure",description:isZh7?"\u81EA\u5907 OpenAI / Claude / Grok / \u7F51\u5173\u3002\u989D\u5EA6\u4E0D\u8DB3\u65F6\u7684\u5B89\u5168\u7F51\uFF1B\u975E\u5FC5\u586B\u3002":"Bring OpenAI / Claude / Grok / gateway keys. Safety net when quota is low \u2014 optional."},{label:isZh7?"\u9000\u51FA":"Exit",value:"exit",description:isZh7?"\u6682\u4E0D\u8FDB\u5165 Clavue\u3002":"Do not enter Clavue right now."}];function refreshSnapshot(){let nextSnapshot=getProviderSnapshot();return setSnapshot(nextSnapshot),nextSnapshot}return __name(refreshSnapshot,"refreshSnapshot"),mode2==="done"?(0,import_jsx_runtime292.jsx)(SetupComplete,{onEnter:()=>onDone(pendingResult??{type:"continue"})}):mode2==="permissions"?(0,import_jsx_runtime292.jsx)(PermissionQuickSetup,{onDone:result2=>{if(result2.type==="continue"){setPendingResult(result2),setMode("done");return}onDone(result2)},initialToolPermissionContext}):mode2==="wizard"?(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(WelcomeV2,{}),(0,import_jsx_runtime292.jsx)(SetupProgress,{step:1}),(0,import_jsx_runtime292.jsx)(ReadinessPanel,{readiness}),(0,import_jsx_runtime292.jsx)(QuickStart,{blocked:snapshot2.currentProfile===null,cloudAuto:!1}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:isZh7?(0,import_jsx_runtime292.jsxs)(import_jsx_runtime292.Fragment,{children:["\u8FDB\u9636\u8DEF\u5F84\uFF1A\u914D\u7F6E\u81EA\u6709 API\u3002\u65B0\u624B\u66F4\u63A8\u8350\u8FD4\u56DE\u9009\u300C\u4F7F\u7528 Auto\u300D\u5E76"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/account login"}),"\u3002\u540E\u7EED\u53EF\u7528"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"clavue provider"})," \u91CD\u5F00\u6B64\u9762\u677F\u3002"]}):(0,import_jsx_runtime292.jsxs)(import_jsx_runtime292.Fragment,{children:["Advanced path: bring your own API. New users should prefer Auto +"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/account login"}),". Reopen later with"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"clavue provider"}),"."]})}),(0,import_jsx_runtime292.jsx)(ProviderConfigManager,{onDone:configured=>{let nextSnapshot=refreshSnapshot();if(configured&&getReadiness(nextSnapshot).canEnterChat){setMode("permissions");return}if(nextSnapshot.currentProfile){setMode("choice");return}onDone({type:"exit"})}})]}):(0,import_jsx_runtime292.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,children:[(0,import_jsx_runtime292.jsx)(WelcomeV2,{}),(0,import_jsx_runtime292.jsx)(SetupProgress,{step:1}),(0,import_jsx_runtime292.jsx)(ReadinessPanel,{readiness}),(0,import_jsx_runtime292.jsx)(RouteSummary,{snapshot:snapshot2}),(0,import_jsx_runtime292.jsx)(QuickStart,{blocked:snapshot2.currentProfile===null,cloudAuto:cloudAutoReady||authDecision.activeTrack==="membership"}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:isZh7?(0,import_jsx_runtime292.jsxs)(import_jsx_runtime292.Fragment,{children:["\u5FC3\u667A\uFF1A\u9ED8\u8BA4 ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"Auto"}),"\uFF08\u5B98\u65B9\u7EC4\u5408\u6A21\u578B\uFF09\u3002\u8FDB\u9636\u518D\u78B0 /provider\u3002\u6743\u9650\u7528"," ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"}),"\u3002"]}):(0,import_jsx_runtime292.jsxs)(import_jsx_runtime292.Fragment,{children:["Mental model: default ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"Auto"})," ","(official multi-model combo). Touch /provider only when advanced. Permissions: ",(0,import_jsx_runtime292.jsx)(ThemedText,{color:"permission",children:"/permissions"}),"."]})}),(0,import_jsx_runtime292.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:isZh7?`Cloud: ${membershipAccountWebUrl("zh")} \xB7 ${membershipPricingWebUrl("zh")}`:`Cloud: ${membershipAccountWebUrl("en")} \xB7 ${membershipPricingWebUrl("en")}`}),(0,import_jsx_runtime292.jsx)(Select,{hideIndexes:!0,options:startupOptions,layout:"compact-vertical",onChange:value=>{if(value==="auto"){ensureOfficialAutoOnCloudProfile({activate:!0});let next=refreshSnapshot();if(getReadiness(next).canEnterChat){setMode("permissions");return}if(authDecision.hasMembershipSession){setMode("permissions");return}if(next.currentProfile){setMode("permissions");return}setMode("wizard");return}if(value==="continue"){setMode("permissions");return}if(value==="cloud"){if(ensureOfficialAutoOnCloudProfile({activate:!0}),refreshSnapshot(),snapshot2.currentProfile?.id===MEMBERSHIP_CLOUD_PROFILE_ID&&readiness.canEnterChat){setMode("permissions");return}if(readiness.canEnterChat){setMode("permissions");return}refreshSnapshot(),setMode("wizard");return}if(value==="configure"){refreshSnapshot(),setMode("wizard");return}onDone({type:"exit"})},onCancel:()=>onDone({type:"exit"})})]})}var import_react171,import_jsx_runtime292,init_Onboarding=__esm({"src/components/Onboarding.tsx"(){import_react171=__toESM(require_react());init_select();init_ink();init_ProviderConfigManager();init_StatusIcon();init_WelcomeV2();init_bypassSafety();init_permissionSetup();init_zeroConfigPreset();init_uiLocale();init_settings2();init_Tool();init_providerProfileMetadata();init_providerCredentials();init_providerProfiles();init_authPolicy();init_config3();init_officialAutoCombo();import_jsx_runtime292=__toESM(require_jsx_runtime());__name(getRoutingDisplayValue2,"getRoutingDisplayValue");__name(getProviderSnapshot,"getProviderSnapshot");__name(isValidHttpUrl,"isValidHttpUrl");__name(getProviderStartupLocalIssues,"getProviderStartupLocalIssues");__name(getReadiness,"getReadiness");__name(ReadinessPanel,"ReadinessPanel");__name(QuickStart,"QuickStart");__name(SetupProgress,"SetupProgress");__name(SetupComplete,"SetupComplete");__name(saveDefaultPermissionMode,"saveDefaultPermissionMode");__name(installFirstRunPermissionPreset,"installFirstRunPermissionPreset");__name(PermissionQuickSetup,"PermissionQuickSetup");__name(RouteSummary,"RouteSummary");__name(Onboarding,"Onboarding")}});function PermissionRequestTitle({title,subtitle,color:color3="permission",workerBadge}){return(0,import_jsx_runtime293.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime293.jsxs)(ThemedBox_default,{flexDirection:"row",gap:1,children:[(0,import_jsx_runtime293.jsx)(ThemedText,{bold:!0,color:color3,children:title}),workerBadge&&(0,import_jsx_runtime293.jsxs)(ThemedText,{dimColor:!0,children:["\xB7 ","@",workerBadge.name]})]}),subtitle!=null&&(typeof subtitle=="string"?(0,import_jsx_runtime293.jsx)(ThemedText,{dimColor:!0,wrap:"truncate-start",children:subtitle}):subtitle)]})}var import_jsx_runtime293,init_PermissionRequestTitle=__esm({"src/components/permissions/PermissionRequestTitle.tsx"(){init_ink();import_jsx_runtime293=__toESM(require_jsx_runtime());__name(PermissionRequestTitle,"PermissionRequestTitle")}});function PermissionDialog({title,subtitle,color:color3="permission",titleColor,innerPaddingX=1,workerBadge,titleRight,children}){return(0,import_jsx_runtime294.jsxs)(ThemedBox_default,{flexDirection:"column",borderStyle:"round",borderColor:color3,borderLeft:!1,borderRight:!1,borderBottom:!1,marginTop:1,children:[(0,import_jsx_runtime294.jsx)(ThemedBox_default,{paddingX:1,flexDirection:"column",children:(0,import_jsx_runtime294.jsxs)(ThemedBox_default,{justifyContent:"space-between",children:[(0,import_jsx_runtime294.jsx)(PermissionRequestTitle,{title,subtitle,color:titleColor,workerBadge}),titleRight]})}),(0,import_jsx_runtime294.jsx)(ThemedBox_default,{flexDirection:"column",paddingX:innerPaddingX,children})]})}var import_jsx_runtime294,init_PermissionDialog=__esm({"src/components/permissions/PermissionDialog.tsx"(){init_ink();init_PermissionRequestTitle();import_jsx_runtime294=__toESM(require_jsx_runtime());__name(PermissionDialog,"PermissionDialog")}});function hasHooks(settings){if(settings===null||settings.disableAllHooks)return!1;if(settings.statusLine||settings.fileSuggestion)return!0;if(!settings.hooks)return!1;for(let hookConfig of Object.values(settings.hooks))if(hookConfig.length>0)return!0;return!1}function getHooksSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasHooks(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasHooks(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasBashPermission(rules){return rules.some(rule=>rule.ruleBehavior==="allow"&&(rule.ruleValue.toolName===BASH_TOOL_NAME||rule.ruleValue.toolName.startsWith(BASH_TOOL_NAME+"(")))}function getBashPermissionSources(){let sources=[],projectRules=getPermissionRulesForSource("projectSettings");hasBashPermission(projectRules)&&sources.push(".clavue/settings.json");let localRules=getPermissionRulesForSource("localSettings");return hasBashPermission(localRules)&&sources.push(".clavue/settings.local.json"),sources}function hasOtelHeadersHelper(settings){return!!settings?.otelHeadersHelper}function getOtelHeadersHelperSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasOtelHeadersHelper(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasOtelHeadersHelper(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasApiKeyHelper(settings){return!!settings?.apiKeyHelper}function getApiKeyHelperSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasApiKeyHelper(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasApiKeyHelper(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasAwsCommands(settings){return!!(settings?.awsAuthRefresh||settings?.awsCredentialExport)}function getAwsCommandsSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasAwsCommands(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasAwsCommands(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasGcpCommands(settings){return!!settings?.gcpAuthRefresh}function getGcpCommandsSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasGcpCommands(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasGcpCommands(localSettings)&&sources.push(".clavue/settings.local.json"),sources}function hasDangerousEnvVars(settings){return settings?.env?Object.keys(settings.env).some(key3=>!SAFE_ENV_VARS3.has(key3.toUpperCase())):!1}function getDangerousEnvVarsSources(){let sources=[],projectSettings=getSettingsForSource("projectSettings");hasDangerousEnvVars(projectSettings)&&sources.push(".clavue/settings.json");let localSettings=getSettingsForSource("localSettings");return hasDangerousEnvVars(localSettings)&&sources.push(".clavue/settings.local.json"),sources}var init_utils14=__esm({"src/components/TrustDialog/utils.ts"(){init_settings2();init_toolName();init_managedEnvConstants();init_permissionsLoader();__name(hasHooks,"hasHooks");__name(getHooksSources,"getHooksSources");__name(hasBashPermission,"hasBashPermission");__name(getBashPermissionSources,"getBashPermissionSources");__name(hasOtelHeadersHelper,"hasOtelHeadersHelper");__name(getOtelHeadersHelperSources,"getOtelHeadersHelperSources");__name(hasApiKeyHelper,"hasApiKeyHelper");__name(getApiKeyHelperSources,"getApiKeyHelperSources");__name(hasAwsCommands,"hasAwsCommands");__name(getAwsCommandsSources,"getAwsCommandsSources");__name(hasGcpCommands,"hasGcpCommands");__name(getGcpCommandsSources,"getGcpCommandsSources");__name(hasDangerousEnvVars,"hasDangerousEnvVars");__name(getDangerousEnvVarsSources,"getDangerousEnvVarsSources")}});var TrustDialog_exports={};__export(TrustDialog_exports,{TrustDialog:()=>TrustDialog});import{homedir as homedir49}from"os";function TrustDialog({onDone,commands}){let{servers:projectServers}=getMcpConfigsByScope("project"),hasMcpServers=Object.keys(projectServers).length>0,hasHooks2=getHooksSources().length>0,bashSettingSources=getBashPermissionSources(),hasApiKeyHelper2=getApiKeyHelperSources().length>0,hasAwsCommands2=getAwsCommandsSources().length>0,hasGcpCommands2=getGcpCommandsSources().length>0,hasOtelHeadersHelper2=getOtelHeadersHelperSources().length>0,hasDangerousEnvVars2=getDangerousEnvVarsSources().length>0,hasSlashCommandBash=commands?.some(command7=>command7.type==="prompt"&&command7.loadedFrom==="commands"&&(command7.source==="projectSettings"||command7.source==="localSettings")&&command7.allowedTools?.some(tool=>tool===BASH_TOOL_NAME||tool.startsWith(BASH_TOOL_NAME+"(")))??!1,hasSkillsBash=commands?.some(command7=>command7.type==="prompt"&&(command7.loadedFrom==="skills"||command7.loadedFrom==="plugin")&&(command7.source==="projectSettings"||command7.source==="localSettings"||command7.source==="plugin")&&command7.allowedTools?.some(tool=>tool===BASH_TOOL_NAME||tool.startsWith(BASH_TOOL_NAME+"(")))??!1,hasAnyBashExecution=bashSettingSources.length>0||hasSlashCommandBash||hasSkillsBash,hasTrustDialogAccepted=checkHasTrustDialogAccepted();import_react172.default.useEffect(()=>{let isHomeDir=homedir49()===getCwd();logEvent("tengu_trust_dialog_shown",{isHomeDir,hasMcpServers,hasHooks:hasHooks2,hasBashExecution:hasAnyBashExecution,hasApiKeyHelper:hasApiKeyHelper2,hasAwsCommands:hasAwsCommands2,hasGcpCommands:hasGcpCommands2,hasOtelHeadersHelper:hasOtelHeadersHelper2,hasDangerousEnvVars:hasDangerousEnvVars2})},[hasMcpServers,hasHooks2,hasAnyBashExecution,hasApiKeyHelper2,hasAwsCommands2,hasGcpCommands2,hasOtelHeadersHelper2,hasDangerousEnvVars2]);function onChange(value){if(value==="exit"){gracefulShutdownSync(1);return}let isHomeDir=homedir49()===getCwd();logEvent("tengu_trust_dialog_accept",{isHomeDir,hasMcpServers,hasHooks:hasHooks2,hasBashExecution:hasAnyBashExecution,hasApiKeyHelper:hasApiKeyHelper2,hasAwsCommands:hasAwsCommands2,hasGcpCommands:hasGcpCommands2,hasOtelHeadersHelper:hasOtelHeadersHelper2,hasDangerousEnvVars:hasDangerousEnvVars2}),isHomeDir?setSessionTrustAccepted(!0):saveCurrentProjectConfig(current=>({...current,hasTrustDialogAccepted:!0})),onDone()}__name(onChange,"onChange");let exitState=useExitOnCtrlCDWithKeybindings(()=>gracefulShutdownSync(1));return useKeybinding("confirm:no",()=>{gracefulShutdownSync(0)},{context:"Confirmation"}),hasTrustDialogAccepted?(setTimeout(onDone),null):(0,import_jsx_runtime295.jsx)(PermissionDialog,{color:"warning",titleColor:"warning",title:"Accessing workspace:",children:(0,import_jsx_runtime295.jsxs)(ThemedBox_default,{flexDirection:"column",gap:1,paddingTop:1,children:[(0,import_jsx_runtime295.jsx)(ThemedText,{bold:!0,children:getFsImplementation().cwd()}),(0,import_jsx_runtime295.jsxs)(ThemedText,{children:["Quick safety check: Is this a project you created or one you trust? (Like your own code, a well-known open source project, or work from your team). If not, take a moment to review what","'","s in this folder first."]}),(0,import_jsx_runtime295.jsx)(ThemedText,{children:"Clavue will be able to read, edit, and execute files here."}),(0,import_jsx_runtime295.jsx)(ThemedText,{dimColor:!0,children:(0,import_jsx_runtime295.jsx)(Link,{url:"https://www.clavue.com",children:"Security guide"})}),(0,import_jsx_runtime295.jsx)(Select,{options:[{label:"Yes, I trust this folder",value:"enable_all"},{label:"No, exit",value:"exit"}],onChange:value=>onChange(value),onCancel:()=>onChange("exit")}),(0,import_jsx_runtime295.jsx)(ThemedText,{dimColor:!0,children:exitState.pending?(0,import_jsx_runtime295.jsxs)(import_jsx_runtime295.Fragment,{children:["Press ",exitState.keyName," again to exit"]}):(0,import_jsx_runtime295.jsx)(import_jsx_runtime295.Fragment,{children:"Enter to confirm \xB7 Esc to cancel"})})]})})}var import_react172,import_jsx_runtime295,init_TrustDialog=__esm({"src/components/TrustDialog/TrustDialog.tsx"(){import_react172=__toESM(require_react());init_analytics();init_state();init_useExitOnCtrlCDWithKeybindings();init_ink();init_useKeybinding();init_config9();init_toolName();init_config12();init_cwd2();init_fsOperations();init_gracefulShutdown();init_CustomSelect();init_PermissionDialog();init_utils14();import_jsx_runtime295=__toESM(require_jsx_runtime());__name(TrustDialog,"TrustDialog")}});import{appendFileSync as appendFileSync12}from"fs";function completeOnboarding(){saveGlobalConfig(current=>({...current,hasCompletedOnboarding:!0,lastOnboardingVersion:"13.9.2"}))}function showDialog(root2,renderer){return new Promise(resolve67=>{let done=__name(result2=>{resolve67(result2)},"done");root2.render(renderer(done))})}async function exitWithError2(root2,message,beforeExit){return exitWithMessage(root2,message,{color:"error",beforeExit})}async function exitWithMessage(root2,message,options){let{Text:Text2}=await Promise.resolve().then(()=>(init_ink(),ink_exports)),color3=options?.color,exitCode=options?.exitCode??1;root2.render(color3?(0,import_jsx_runtime296.jsx)(Text2,{color:color3,children:message}):(0,import_jsx_runtime296.jsx)(Text2,{children:message})),root2.unmount(),await options?.beforeExit?.(),process.exit(exitCode)}function showSetupDialog(root2,renderer,options){return showDialog(root2,done=>(0,import_jsx_runtime296.jsx)(AppStateProvider,{onChangeAppState:options?.onChangeAppState,children:(0,import_jsx_runtime296.jsx)(KeybindingSetup,{children:renderer(done)})}))}async function renderAndRun(root2,element){root2.render(element),startDeferredPrefetches(),await root2.waitUntilExit(),await gracefulShutdown(0)}async function showSetupScreens(root2,permissionMode,initialToolPermissionContext,allowDangerouslySkipPermissions,commands,devChannels,explicitModelOverride=!1,userSpecifiedModel=null){if(isEnvTruthy2(!1)||process.env.IS_DEMO)return{onboardingShown:!1,providerProfileChanged:!1,resolvedProviderProfile:getResolvedCurrentProviderProfile(),nextMainLoopModel:null,nextPermissionMode:void 0,permissionModeNotice:void 0,nextToolPermissionContext:void 0};let config3=getGlobalConfig(),onboardingShown=!1,onboardingResult="continue",nextPermissionMode,permissionModeNotice,nextToolPermissionContext,providerProfileBeforeOnboarding=getResolvedCurrentProviderProfile(),providerProfileChanged=!1,resolvedProviderProfile=providerProfileBeforeOnboarding,nextMainLoopModel=null;{let{needsLanguageOnboarding:needsLanguageOnboarding2}=await Promise.resolve().then(()=>(init_applyUiLocale(),applyUiLocale_exports));if(needsLanguageOnboarding2()){onboardingShown=!0;let{LanguageOnboardingGate:LanguageOnboardingGate2}=await Promise.resolve().then(()=>(init_LanguageOnboardingGate(),LanguageOnboardingGate_exports));await showSetupDialog(root2,done=>(0,import_jsx_runtime296.jsx)(LanguageOnboardingGate2,{onDone:()=>{done(void 0)}}))}}if(!config3.theme||!config3.hasCompletedOnboarding){onboardingShown=!0;let{Onboarding:Onboarding2}=await Promise.resolve().then(()=>(init_Onboarding(),Onboarding_exports)),onboardingScreenResult=await showSetupDialog(root2,done=>(0,import_jsx_runtime296.jsx)(Onboarding2,{initialToolPermissionContext,onDone:result2=>{result2.type==="continue"&&completeOnboarding(),done(result2)}}),{onChangeAppState});onboardingResult=onboardingScreenResult.type,onboardingScreenResult.type==="continue"&&(nextPermissionMode=onboardingScreenResult.permissionMode,permissionModeNotice=onboardingScreenResult.permissionNotice,nextToolPermissionContext=onboardingScreenResult.toolPermissionContext),nextPermissionMode&&(permissionMode=nextPermissionMode),resolvedProviderProfile=getResolvedCurrentProviderProfile();let refreshPlan=getProviderSetupRefreshPlan({providerProfileBeforeOnboarding,resolvedProviderProfile,onboardingResult,explicitModelOverride,userSpecifiedModel});if(providerProfileChanged=refreshPlan.providerProfileChanged,nextMainLoopModel=refreshPlan.nextMainLoopModel,onboardingResult==="exit")return gracefulShutdownSync(0),{onboardingShown,providerProfileChanged,resolvedProviderProfile,nextMainLoopModel,nextPermissionMode,permissionModeNotice,nextToolPermissionContext}}if(!isEnvTruthy2(process.env.CLAUBBIT)){if(!checkHasTrustDialogAccepted()){let{TrustDialog:TrustDialog2}=await Promise.resolve().then(()=>(init_TrustDialog(),TrustDialog_exports));await showSetupDialog(root2,done=>(0,import_jsx_runtime296.jsx)(TrustDialog2,{commands,onDone:done}))}setSessionTrustAccepted(!0),resetGrowthBook(),initializeGrowthBook(),getSystemContext();let{errors:allErrors}=getSettingsWithAllErrors();if(allErrors.length===0&&await handleMcpjsonServerApprovals(root2),await shouldShowClaudeMdExternalIncludesWarning()){let externalIncludes=getExternalClaudeMdIncludes(await getMemoryFiles(!0)),{ClaudeMdExternalIncludesDialog:ClaudeMdExternalIncludesDialog2}=await Promise.resolve().then(()=>(init_ClaudeMdExternalIncludesDialog(),ClaudeMdExternalIncludesDialog_exports));await showSetupDialog(root2,done=>(0,import_jsx_runtime296.jsx)(ClaudeMdExternalIncludesDialog2,{onDone:done,isStandaloneDialog:!0,externalIncludes}))}}return updateGithubRepoPathMapping(),applyConfigEnvironmentVariables(),setImmediate(()=>initializeTelemetryAfterTrust()),{onboardingShown,providerProfileChanged,resolvedProviderProfile,nextMainLoopModel,nextPermissionMode,permissionModeNotice,nextToolPermissionContext}}function getRenderContext(exitOnCtrlC){let lastFlickerTime=0,baseOptions=getBaseRenderOptions(exitOnCtrlC);baseOptions.stdin&&logEvent("tengu_stdin_interactive",{});let fpsTracker=new FpsTracker,stats3=createStatsStore();setStatsStore(stats3);let frameTimingLogPath=process.env.CLAUDE_CODE_FRAME_TIMING_LOG;return{getFpsMetrics:__name(()=>fpsTracker.getMetrics(),"getFpsMetrics"),stats:stats3,renderOptions:{...baseOptions,onFrame:__name(event=>{if(fpsTracker.record(event.durationMs),stats3.observe("frame_duration_ms",event.durationMs),frameTimingLogPath&&event.phases){let line=JSON.stringify({total:event.durationMs,...event.phases,rss:process.memoryUsage.rss(),cpu:process.cpuUsage()})+`
11199
11199
  `;appendFileSync12(frameTimingLogPath,line)}if(!isSynchronizedOutputSupported())for(let flicker of event.flickers){if(flicker.reason==="resize")continue;let now3=Date.now();now3-lastFlickerTime<1e3&&logEvent("tengu_flicker",{desiredHeight:flicker.desiredHeight,actualHeight:flicker.availableHeight,reason:flicker.reason}),lastFlickerTime=now3}},"onFrame")}}}var import_jsx_runtime296,init_interactiveHelpers=__esm({"src/interactiveHelpers.tsx"(){init_analytics();init_gracefulShutdown();init_state();init_stats4();init_context2();init_init2();init_capabilities();init_KeybindingProviderSetup();init_main3();init_growthbook();init_mcpServerApproval();init_AppState();init_onChangeAppState();init_claudemd();init_config12();init_terminalPreference();init_envUtils();init_fpsTracker();init_githubRepoPathMapping();init_managedEnv();init_providerProfiles();init_providerStartup();init_renderOptions();init_allErrors();import_jsx_runtime296=__toESM(require_jsx_runtime());__name(completeOnboarding,"completeOnboarding");__name(showDialog,"showDialog");__name(exitWithError2,"exitWithError");__name(exitWithMessage,"exitWithMessage");__name(showSetupDialog,"showSetupDialog");__name(renderAndRun,"renderAndRun");__name(showSetupScreens,"showSetupScreens");__name(getRenderContext,"getRenderContext")}});function treeify(obj,options={}){let{showValues=!0,hideFunctions=!1,themeName="dark",treeCharColors={}}=options,lines=[],visited=new WeakSet;function colorize2(text3,colorKey){return colorKey?color(colorKey,themeName)(text3):text3}__name(colorize2,"colorize");function growBranch(node,prefix,_isLast,depth=0){if(typeof node=="string"){lines.push(prefix+colorize2(node,treeCharColors.value));return}if(typeof node!="object"||node===null){if(showValues){let valueStr=String(node);lines.push(prefix+colorize2(valueStr,treeCharColors.value))}return}if(visited.has(node)){lines.push(prefix+colorize2("[Circular]",treeCharColors.value));return}visited.add(node);let keys3=Object.keys(node).filter(key3=>{let value=node[key3];return!(hideFunctions&&typeof value=="function")});keys3.forEach((key3,index)=>{let value=node[key3],isLastKey=index===keys3.length-1,nodePrefix=depth===0&&index===0?"":prefix,treeChar=isLastKey?DEFAULT_TREE_CHARS.lastBranch:DEFAULT_TREE_CHARS.branch,coloredTreeChar=colorize2(treeChar,treeCharColors.treeChar),coloredKey=key3.trim()===""?"":colorize2(key3,treeCharColors.key),line=nodePrefix+coloredTreeChar+(coloredKey?" "+coloredKey:""),shouldAddColon=key3.trim()!=="";if(value&&typeof value=="object"&&visited.has(value)){let coloredValue=colorize2("[Circular]",treeCharColors.value);lines.push(line+(shouldAddColon?": ":line?" ":"")+coloredValue)}else if(value&&typeof value=="object"&&!Array.isArray(value)){lines.push(line);let continuationChar=isLastKey?DEFAULT_TREE_CHARS.empty:DEFAULT_TREE_CHARS.line,coloredContinuation=colorize2(continuationChar,treeCharColors.treeChar),nextPrefix=nodePrefix+coloredContinuation+" ";growBranch(value,nextPrefix,isLastKey,depth+1)}else if(Array.isArray(value))lines.push(line+(shouldAddColon?": ":line?" ":"")+"[Array("+value.length+")]");else if(showValues){let valueStr=typeof value=="function"?"[Function]":String(value),coloredValue=colorize2(valueStr,treeCharColors.value);line+=(shouldAddColon?": ":line?" ":"")+coloredValue,lines.push(line)}else lines.push(line)})}__name(growBranch,"growBranch");let keys2=Object.keys(obj);if(keys2.length===0)return colorize2("(empty)",treeCharColors.value);if(keys2.length===1&&keys2[0]!==void 0&&keys2[0].trim()===""&&typeof obj[keys2[0]]=="string"){let firstKey=keys2[0],coloredTreeChar=colorize2(DEFAULT_TREE_CHARS.lastBranch,treeCharColors.treeChar),coloredValue=colorize2(obj[firstKey],treeCharColors.value);return coloredTreeChar+" "+coloredValue}return growBranch(obj,"",!0),lines.join(`
11200
11200
  `)}var DEFAULT_TREE_CHARS,init_treeify=__esm({"src/utils/treeify.ts"(){init_figures();init_color();DEFAULT_TREE_CHARS={branch:figures_default.lineUpDownRight,lastBranch:figures_default.lineUpRight,line:figures_default.lineVertical,empty:" "};__name(treeify,"treeify")}});function buildNestedTree(errors2){let tree={};return errors2.forEach(error40=>{if(!error40.path){tree[""]=error40.message;return}let pathParts=error40.path.split("."),modifiedPath=error40.path;if(error40.invalidValue!==null&&error40.invalidValue!==void 0&&pathParts.length>0){let newPathParts=[];for(let i3=0;i3<pathParts.length;i3++){let part=pathParts[i3];if(!part)continue;let numericPart=parseInt(part,10);if(!isNaN(numericPart)&&i3===pathParts.length-1){let displayValue;typeof error40.invalidValue=="string"?displayValue=`"${error40.invalidValue}"`:error40.invalidValue===null?displayValue="null":error40.invalidValue===void 0?displayValue="undefined":displayValue=String(error40.invalidValue),newPathParts.push(displayValue)}else newPathParts.push(part)}modifiedPath=newPathParts.join(".")}setWith_default(tree,modifiedPath,error40.message,Object)}),tree}function ValidationErrorsList({errors:errors2}){let[themeName]=useTheme();if(errors2.length===0)return null;let errorsByFile=errors2.reduce((acc,error40)=>{let file2=error40.file||"(file not specified)";return acc[file2]||(acc[file2]=[]),acc[file2].push(error40),acc},{}),sortedFiles=Object.keys(errorsByFile).sort();return(0,import_jsx_runtime297.jsx)(ThemedBox_default,{flexDirection:"column",children:sortedFiles.map(file2=>{let fileErrors=errorsByFile[file2]||[];fileErrors.sort((a2,b3)=>!a2.path&&b3.path?-1:a2.path&&!b3.path?1:(a2.path||"").localeCompare(b3.path||""));let errorTree=buildNestedTree(fileErrors),suggestionPairs=new Map;fileErrors.forEach(error40=>{if(error40.suggestion||error40.docLink){let key3=`${error40.suggestion||""}|${error40.docLink||""}`;suggestionPairs.has(key3)||suggestionPairs.set(key3,{suggestion:error40.suggestion,docLink:error40.docLink})}});let treeOutput=treeify(errorTree,{showValues:!0,themeName,treeCharColors:{treeChar:"inactive",key:"text",value:"inactive"}});return(0,import_jsx_runtime297.jsxs)(ThemedBox_default,{flexDirection:"column",children:[(0,import_jsx_runtime297.jsx)(ThemedText,{children:file2}),(0,import_jsx_runtime297.jsx)(ThemedBox_default,{marginLeft:1,children:(0,import_jsx_runtime297.jsx)(ThemedText,{dimColor:!0,children:treeOutput})}),suggestionPairs.size>0&&(0,import_jsx_runtime297.jsx)(ThemedBox_default,{flexDirection:"column",marginTop:1,children:Array.from(suggestionPairs.values()).map((pair,index)=>(0,import_jsx_runtime297.jsxs)(ThemedBox_default,{flexDirection:"column",marginBottom:1,children:[pair.suggestion&&(0,import_jsx_runtime297.jsx)(ThemedText,{dimColor:!0,wrap:"wrap",children:pair.suggestion}),pair.docLink&&(0,import_jsx_runtime297.jsxs)(ThemedText,{dimColor:!0,wrap:"wrap",children:["Learn more: ",pair.docLink]})]},`suggestion-pair-${index}`))})]},file2)})})}var import_jsx_runtime297,init_ValidationErrorsList=__esm({"src/components/ValidationErrorsList.tsx"(){init_setWith();init_ink();init_treeify();import_jsx_runtime297=__toESM(require_jsx_runtime());__name(buildNestedTree,"buildNestedTree");__name(ValidationErrorsList,"ValidationErrorsList")}});var InvalidSettingsDialog_exports={};__export(InvalidSettingsDialog_exports,{InvalidSettingsDialog:()=>InvalidSettingsDialog});function InvalidSettingsDialog({settingsErrors,onContinue,onExit:onExit2}){function handleSelect(value){value==="exit"?onExit2():onContinue()}__name(handleSelect,"handleSelect");let isZh7=resolveUiLocale()==="zh-CN";return(0,import_jsx_runtime298.jsxs)(Dialog,{title:isZh7?"\u8BBE\u7F6E\u9519\u8BEF":"Settings Error",onCancel:onExit2,color:"warning",children:[(0,import_jsx_runtime298.jsx)(ValidationErrorsList,{errors:settingsErrors}),(0,import_jsx_runtime298.jsx)(ThemedText,{dimColor:!0,children:isZh7?"\u51FA\u9519\u7684\u6587\u4EF6\u4F1A\u88AB\u6574\u4F53\u8DF3\u8FC7,\u800C\u4E0D\u662F\u53EA\u8DF3\u8FC7\u5176\u4E2D\u9519\u8BEF\u7684\u8BBE\u7F6E\u9879\u3002":"Files with errors are skipped entirely, not just the invalid settings."}),(0,import_jsx_runtime298.jsx)(Select,{options:[{label:isZh7?"\u9000\u51FA\u5E76\u624B\u52A8\u4FEE\u590D":"Exit and fix manually",value:"exit"},{label:isZh7?"\u4E0D\u52A0\u8F7D\u8FD9\u4E9B\u8BBE\u7F6E\u7EE7\u7EED":"Continue without these settings",value:"continue"}],onChange:handleSelect})]})}var import_jsx_runtime298,init_InvalidSettingsDialog=__esm({"src/components/InvalidSettingsDialog.tsx"(){init_ink();init_uiLocale();init_CustomSelect();init_Dialog();init_ValidationErrorsList();import_jsx_runtime298=__toESM(require_jsx_runtime());__name(InvalidSettingsDialog,"InvalidSettingsDialog")}});async function launchInvalidSettingsDialog(root2,props){let{InvalidSettingsDialog:InvalidSettingsDialog2}=await Promise.resolve().then(()=>(init_InvalidSettingsDialog(),InvalidSettingsDialog_exports));return showSetupDialog(root2,done=>(0,import_jsx_runtime299.jsx)(InvalidSettingsDialog2,{settingsErrors:props.settingsErrors,onContinue:done,onExit:props.onExit}))}var import_jsx_runtime299,init_dialogLaunchers=__esm({"src/dialogLaunchers.tsx"(){init_interactiveHelpers();import_jsx_runtime299=__toESM(require_jsx_runtime());__name(launchInvalidSettingsDialog,"launchInvalidSettingsDialog")}});var init_bundled2=__esm({"src/plugins/bundled/index.ts"(){}});function resolveMcpStartupWaitMs(env5=process.env){let raw=env5.CLAVUE_MCP_STARTUP_WAIT_MS;if(raw===void 0||raw.trim()==="")return 500;let trimmed=raw.trim().toLowerCase();if(trimmed==="0"||trimmed==="off"||trimmed==="false")return 0;let parsed=Number.parseInt(trimmed,10);return!Number.isFinite(parsed)||parsed<0?500:parsed}function resolveHeadlessMcpStartup(env5=process.env){let raw=env5.CLAVUE_HEADLESS_MCP_BUDGET_MS;if(raw===void 0||raw.trim()===""){let startupWait=resolveMcpStartupWaitMs(env5);return startupWait<=0?{mode:"background",blockMs:0}:{mode:"budget",blockMs:startupWait}}let trimmed=raw.trim().toLowerCase();if(trimmed==="0"||trimmed==="full"||trimmed==="wait")return{mode:"full",blockMs:null};let parsed=Number.parseInt(trimmed,10);return!Number.isFinite(parsed)||parsed<0?{mode:"background",blockMs:0}:{mode:"budget",blockMs:parsed}}async function awaitHeadlessMcpGate(connect3,policy2=resolveHeadlessMcpStartup()){let started=Date.now();if(policy2.mode==="background")return connect3().catch(()=>{}),{waitedMs:Date.now()-started,blocked:!1};if(policy2.mode==="full")return await connect3(),{waitedMs:Date.now()-started,blocked:!0};let timer2,timedOut=await Promise.race([connect3().then(()=>!1),new Promise(resolve67=>{timer2=setTimeout(()=>resolve67(!0),policy2.blockMs)})]);return timer2&&clearTimeout(timer2),{waitedMs:Date.now()-started,blocked:!timedOut}}var init_headlessConnectPolicy=__esm({"src/services/mcp/headlessConnectPolicy.ts"(){__name(resolveMcpStartupWaitMs,"resolveMcpStartupWaitMs");__name(resolveHeadlessMcpStartup,"resolveHeadlessMcpStartup");__name(awaitHeadlessMcpGate,"awaitHeadlessMcpGate")}});function handlePluginCommandError(error40,command7,plugin2){logError2(error40);let operation=plugin2?`${command7} plugin "${plugin2}"`:command7==="disable-all"?"disable all plugins":`${command7} plugins`;console.error(`${figures_default.cross} Failed to ${operation}: ${errorMessage2(error40)}`);let telemetryFields=plugin2?(()=>{let{name,marketplace}=parsePluginIdentifier(plugin2);return{_PROTO_plugin_name:name,...marketplace&&{_PROTO_marketplace_name:marketplace},...buildPluginTelemetryFields(name,marketplace,getManagedPluginNames())}})():{};logEvent("tengu_plugin_command_failed",{command:command7,error_category:classifyPluginCommandError(error40),...telemetryFields}),process.exit(1)}async function installPlugin(plugin2,scope="user"){try{console.log(`Installing plugin "${plugin2}"...`);let result2=await installPluginOp(plugin2,scope);if(!result2.success)throw new Error(result2.message);console.log(`${figures_default.tick} ${result2.message}`);let{name,marketplace}=parsePluginIdentifier(result2.pluginId||plugin2);logEvent("tengu_plugin_installed_cli",{_PROTO_plugin_name:name,...marketplace&&{_PROTO_marketplace_name:marketplace},scope:result2.scope||scope,install_source:"cli-explicit",...buildPluginTelemetryFields(name,marketplace,getManagedPluginNames())}),process.exit(0)}catch(error40){handlePluginCommandError(error40,"install",plugin2)}}async function uninstallPlugin(plugin2,scope="user",keepData=!1){try{let result2=await uninstallPluginOp(plugin2,scope,!keepData);if(!result2.success)throw new Error(result2.message);console.log(`${figures_default.tick} ${result2.message}`);let{name,marketplace}=parsePluginIdentifier(result2.pluginId||plugin2);logEvent("tengu_plugin_uninstalled_cli",{_PROTO_plugin_name:name,...marketplace&&{_PROTO_marketplace_name:marketplace},scope:result2.scope||scope,...buildPluginTelemetryFields(name,marketplace,getManagedPluginNames())}),process.exit(0)}catch(error40){handlePluginCommandError(error40,"uninstall",plugin2)}}async function enablePlugin(plugin2,scope){try{let result2=await enablePluginOp(plugin2,scope);if(!result2.success)throw new Error(result2.message);console.log(`${figures_default.tick} ${result2.message}`);let{name,marketplace}=parsePluginIdentifier(result2.pluginId||plugin2);logEvent("tengu_plugin_enabled_cli",{_PROTO_plugin_name:name,...marketplace&&{_PROTO_marketplace_name:marketplace},scope:result2.scope,...buildPluginTelemetryFields(name,marketplace,getManagedPluginNames())}),process.exit(0)}catch(error40){handlePluginCommandError(error40,"enable",plugin2)}}async function disablePlugin(plugin2,scope){try{let result2=await disablePluginOp(plugin2,scope);if(!result2.success)throw new Error(result2.message);console.log(`${figures_default.tick} ${result2.message}`);let{name,marketplace}=parsePluginIdentifier(result2.pluginId||plugin2);logEvent("tengu_plugin_disabled_cli",{_PROTO_plugin_name:name,...marketplace&&{_PROTO_marketplace_name:marketplace},scope:result2.scope,...buildPluginTelemetryFields(name,marketplace,getManagedPluginNames())}),process.exit(0)}catch(error40){handlePluginCommandError(error40,"disable",plugin2)}}async function disableAllPlugins(){try{let result2=await disableAllPluginsOp();if(!result2.success)throw new Error(result2.message);console.log(`${figures_default.tick} ${result2.message}`),logEvent("tengu_plugin_disabled_all_cli",{}),process.exit(0)}catch(error40){handlePluginCommandError(error40,"disable-all")}}async function updatePluginCli(plugin2,scope){try{writeToStdout(`Checking for updates for plugin "${plugin2}" at ${scope} scope\u2026
11201
11201
  `);let result2=await updatePluginOp(plugin2,scope);if(!result2.success)throw new Error(result2.message);if(writeToStdout(`${figures_default.tick} ${result2.message}
@@ -12535,13 +12535,13 @@ ${customInstructions}`:customInstructions}}else logForDebugging(`[teammate] Cust
12535
12535
  Remote/SSH/teleport are not available as an Ink shell.
12536
12536
  Plan: docs/ink-to-pager-migration-plan.md
12537
12537
 
12538
- `),await gracefulShutdown(1);return}if(process.exitCode!==void 0){logForDebugging("Graceful shutdown initiated, skipping further initialization");return}if(initializeLspServerManager(),!isNonInteractiveSession){let{errors:errors2}=getSettingsWithErrors(),nonMcpErrors=errors2.filter(e2=>!e2.mcpErrorMetadata);nonMcpErrors.length>0&&await launchInvalidSettingsDialog(root2,{settingsErrors:nonMcpErrors,onExit:__name(()=>gracefulShutdownSync(1),"onExit")})}let bgRefreshThrottleMs=getFeatureValue_CACHED_MAY_BE_STALE("tengu_cicada_nap_ms",0),lastPrefetched=getGlobalConfig().startupPrefetchedAt??0;if(isBareMode()||bgRefreshThrottleMs>0&&Date.now()-lastPrefetched<bgRefreshThrottleMs)logForDebugging(`Skipping startup prefetches, last ran ${Math.round((Date.now()-lastPrefetched)/1e3)}s ago`),resolveFastModeStatusFromCache();else{let lastPrefetchedInfo=lastPrefetched>0?` last ran ${Math.round((Date.now()-lastPrefetched)/1e3)}s ago`:"";logForDebugging(`Starting background startup prefetches${lastPrefetchedInfo}`),checkQuotaStatus().catch(error40=>logError2(error40)),fetchBootstrapData(),getFeatureValue_CACHED_MAY_BE_STALE("tengu_miraculo_the_bard",!1)?resolveFastModeStatusFromCache():prefetchFastModeStatus(),bgRefreshThrottleMs>0&&saveGlobalConfig(current=>({...current,startupPrefetchedAt:Date.now()}))}isNonInteractiveSession||refreshExampleCommands();let{servers:existingMcpConfigs}=await mcpConfigPromise;logForDebugging(`[STARTUP] MCP configs resolved in ${mcpConfigResolvedMs}ms (awaited at +${Date.now()-mcpConfigStart}ms)`);let allMcpConfigs={...existingMcpConfigs,...dynamicMcpConfig},sdkMcpConfigs={},regularMcpConfigs={};for(let[name,config3]of Object.entries(allMcpConfigs)){let typedConfig=config3;typedConfig.type==="sdk"?sdkMcpConfigs[name]=typedConfig:regularMcpConfigs[name]=typedConfig}profileCheckpoint("action_mcp_configs_loaded");let mcpPromise=(isNonInteractiveSession?Promise.resolve({clients:[],tools:[],commands:[]}):prefetchAllMcpResources(regularMcpConfigs)).then(local=>({clients:local.clients,tools:uniqBy_default(local.tools,"name"),commands:uniqBy_default(local.commands,"name")})),hooksPromise=initOnly||init2||maintenance||isNonInteractiveSession||options.continue||options.resume?null:processSessionStartHooks("startup",{agentType:mainThreadAgentDefinition?.agentType,model:resolvedInitialModel}),hookMessages=[];mcpPromise.catch(()=>{});let mcpClients=[],mcpTools=[],mcpCommands=[],{thinkingEnabled,thinkingConfig}=resolveThinkingConfig({thinkingOption:options.thinking,maxThinkingTokensOption:options.maxThinkingTokens,env:process.env},shouldEnableThinkingByDefault);logForDiagnosticsNoPII("info","started",{version:"13.9.1",is_native_binary:isInBundledMode()}),registerCleanup(async()=>{logForDiagnosticsNoPII("info","exited")}),logTenguInit({hasInitialPrompt:!!prompt,hasStdin:!!inputPrompt,verbose,debug:debug4,debugToStderr,print:print??!1,outputFormat:outputFormat??"text",inputFormat:inputFormat??"text",numAllowedTools:allowedTools.length,numDisallowedTools:disallowedTools.length,mcpClientCount:Object.keys(allMcpConfigs).length,worktreeEnabled,skipWebFetchPreflight:getInitialSettings().skipWebFetchPreflight,githubActionInputs:process.env.GITHUB_ACTION_INPUTS,dangerouslySkipPermissionsPassed:dangerouslySkipPermissions??!1,permissionMode,modeIsBypass:permissionMode==="bypassPermissions",allowDangerouslySkipPermissionsPassed:allowDangerouslySkipPermissions,systemPromptFlag:systemPrompt?options.systemPromptFile?"file":"flag":void 0,appendSystemPromptFlag:appendSystemPrompt?options.appendSystemPromptFile?"file":"flag":void 0,thinkingConfig,assistantActivationPath:void 0}),logContextMetrics(regularMcpConfigs,toolPermissionContext),logPermissionContextForAnts(null,"initialization"),logManagedSettings(),registerSession().then(registered2=>{registered2&&(sessionNameArg&&updateSessionName(sessionNameArg),countConcurrentSessions().then(count4=>{count4>=2&&logEvent("tengu_concurrent_sessions",{num_sessions:count4})}))}),isBareMode()||(isNonInteractiveSession?(await initializeVersionedPlugins(),profileCheckpoint("action_after_plugins_init"),cleanupOrphanedPluginVersionsInBackground().then(()=>getGlobExclusionsForPluginCache())):initializeVersionedPlugins().then(async()=>{profileCheckpoint("action_after_plugins_init"),await cleanupOrphanedPluginVersionsInBackground(),getGlobExclusionsForPluginCache()}));let setupTrigger=initOnly||init2?"init":maintenance?"maintenance":null;if(initOnly){applyConfigEnvironmentVariables(),await processSetupHooks("init",{forceSyncExecution:!0}),await processSessionStartHooks("startup",{forceSyncExecution:!0}),gracefulShutdownSync(0);return}if(isNonInteractiveSession){shouldSetFormattedOutputFlag({outputFormat})&&setHasFormattedOutput(!0),applyConfigEnvironmentVariables(),initializeTelemetryAfterTrust();let sessionStartHooksPromise=options.continue||options.resume||setupTrigger?void 0:processSessionStartHooks("startup");sessionStartHooksPromise?.catch(()=>{}),profileCheckpoint("before_validateForceLoginOrg");let orgValidation=await validateForceLoginOrg();orgValidation.valid===!1&&(process.stderr.write(orgValidation.message+`
12538
+ `),await gracefulShutdown(1);return}if(process.exitCode!==void 0){logForDebugging("Graceful shutdown initiated, skipping further initialization");return}if(initializeLspServerManager(),!isNonInteractiveSession){let{errors:errors2}=getSettingsWithErrors(),nonMcpErrors=errors2.filter(e2=>!e2.mcpErrorMetadata);nonMcpErrors.length>0&&await launchInvalidSettingsDialog(root2,{settingsErrors:nonMcpErrors,onExit:__name(()=>gracefulShutdownSync(1),"onExit")})}let bgRefreshThrottleMs=getFeatureValue_CACHED_MAY_BE_STALE("tengu_cicada_nap_ms",0),lastPrefetched=getGlobalConfig().startupPrefetchedAt??0;if(isBareMode()||bgRefreshThrottleMs>0&&Date.now()-lastPrefetched<bgRefreshThrottleMs)logForDebugging(`Skipping startup prefetches, last ran ${Math.round((Date.now()-lastPrefetched)/1e3)}s ago`),resolveFastModeStatusFromCache();else{let lastPrefetchedInfo=lastPrefetched>0?` last ran ${Math.round((Date.now()-lastPrefetched)/1e3)}s ago`:"";logForDebugging(`Starting background startup prefetches${lastPrefetchedInfo}`),checkQuotaStatus().catch(error40=>logError2(error40)),fetchBootstrapData(),getFeatureValue_CACHED_MAY_BE_STALE("tengu_miraculo_the_bard",!1)?resolveFastModeStatusFromCache():prefetchFastModeStatus(),bgRefreshThrottleMs>0&&saveGlobalConfig(current=>({...current,startupPrefetchedAt:Date.now()}))}isNonInteractiveSession||refreshExampleCommands();let{servers:existingMcpConfigs}=await mcpConfigPromise;logForDebugging(`[STARTUP] MCP configs resolved in ${mcpConfigResolvedMs}ms (awaited at +${Date.now()-mcpConfigStart}ms)`);let allMcpConfigs={...existingMcpConfigs,...dynamicMcpConfig},sdkMcpConfigs={},regularMcpConfigs={};for(let[name,config3]of Object.entries(allMcpConfigs)){let typedConfig=config3;typedConfig.type==="sdk"?sdkMcpConfigs[name]=typedConfig:regularMcpConfigs[name]=typedConfig}profileCheckpoint("action_mcp_configs_loaded");let mcpPromise=(isNonInteractiveSession?Promise.resolve({clients:[],tools:[],commands:[]}):prefetchAllMcpResources(regularMcpConfigs)).then(local=>({clients:local.clients,tools:uniqBy_default(local.tools,"name"),commands:uniqBy_default(local.commands,"name")})),hooksPromise=initOnly||init2||maintenance||isNonInteractiveSession||options.continue||options.resume?null:processSessionStartHooks("startup",{agentType:mainThreadAgentDefinition?.agentType,model:resolvedInitialModel}),hookMessages=[];mcpPromise.catch(()=>{});let mcpClients=[],mcpTools=[],mcpCommands=[],{thinkingEnabled,thinkingConfig}=resolveThinkingConfig({thinkingOption:options.thinking,maxThinkingTokensOption:options.maxThinkingTokens,env:process.env},shouldEnableThinkingByDefault);logForDiagnosticsNoPII("info","started",{version:"13.9.2",is_native_binary:isInBundledMode()}),registerCleanup(async()=>{logForDiagnosticsNoPII("info","exited")}),logTenguInit({hasInitialPrompt:!!prompt,hasStdin:!!inputPrompt,verbose,debug:debug4,debugToStderr,print:print??!1,outputFormat:outputFormat??"text",inputFormat:inputFormat??"text",numAllowedTools:allowedTools.length,numDisallowedTools:disallowedTools.length,mcpClientCount:Object.keys(allMcpConfigs).length,worktreeEnabled,skipWebFetchPreflight:getInitialSettings().skipWebFetchPreflight,githubActionInputs:process.env.GITHUB_ACTION_INPUTS,dangerouslySkipPermissionsPassed:dangerouslySkipPermissions??!1,permissionMode,modeIsBypass:permissionMode==="bypassPermissions",allowDangerouslySkipPermissionsPassed:allowDangerouslySkipPermissions,systemPromptFlag:systemPrompt?options.systemPromptFile?"file":"flag":void 0,appendSystemPromptFlag:appendSystemPrompt?options.appendSystemPromptFile?"file":"flag":void 0,thinkingConfig,assistantActivationPath:void 0}),logContextMetrics(regularMcpConfigs,toolPermissionContext),logPermissionContextForAnts(null,"initialization"),logManagedSettings(),registerSession().then(registered2=>{registered2&&(sessionNameArg&&updateSessionName(sessionNameArg),countConcurrentSessions().then(count4=>{count4>=2&&logEvent("tengu_concurrent_sessions",{num_sessions:count4})}))}),isBareMode()||(isNonInteractiveSession?(await initializeVersionedPlugins(),profileCheckpoint("action_after_plugins_init"),cleanupOrphanedPluginVersionsInBackground().then(()=>getGlobExclusionsForPluginCache())):initializeVersionedPlugins().then(async()=>{profileCheckpoint("action_after_plugins_init"),await cleanupOrphanedPluginVersionsInBackground(),getGlobExclusionsForPluginCache()}));let setupTrigger=initOnly||init2?"init":maintenance?"maintenance":null;if(initOnly){applyConfigEnvironmentVariables(),await processSetupHooks("init",{forceSyncExecution:!0}),await processSessionStartHooks("startup",{forceSyncExecution:!0}),gracefulShutdownSync(0);return}if(isNonInteractiveSession){shouldSetFormattedOutputFlag({outputFormat})&&setHasFormattedOutput(!0),applyConfigEnvironmentVariables(),initializeTelemetryAfterTrust();let sessionStartHooksPromise=options.continue||options.resume||setupTrigger?void 0:processSessionStartHooks("startup");sessionStartHooksPromise?.catch(()=>{}),profileCheckpoint("before_validateForceLoginOrg");let orgValidation=await validateForceLoginOrg();orgValidation.valid===!1&&(process.stderr.write(orgValidation.message+`
12539
12539
  `),process.exit(1));let commandsHeadless=filterCommandsForHeadless(commands,{disableSlashCommands}),defaultState=getDefaultAppState(),headlessInitialState={...defaultState,mcp:{...defaultState.mcp,clients:mcpClients,commands:mcpCommands,tools:mcpTools},toolPermissionContext,effortValue:parseEffortValue(options.effort)??getInitialEffortSetting(),...isFastModeEnabled()&&{fastMode:getInitialFastModeSetting(effectiveModel??null)},...isAdvisorEnabled()&&advisorModel&&{advisorModel}},headlessStore=createStore(headlessInitialState,onChangeAppState);(toolPermissionContext.mode==="bypassPermissions"||allowDangerouslySkipPermissions)&&checkAndDisableBypassPermissions(toolPermissionContext),verifyAutoModeGateAccess(toolPermissionContext,headlessStore.getState().fastMode).then(({updateContext})=>{headlessStore.setState(prev=>{let nextCtx=updateContext(prev.toolPermissionContext);return nextCtx===prev.toolPermissionContext?prev:{...prev,toolPermissionContext:nextCtx}})}),options.sessionPersistence===!1&&setSessionPersistenceDisabled(!0),setSdkBetas(filterAllowedSdkBetas(betas));let connectMcpBatch=__name((configs,label2)=>Object.keys(configs).length===0?Promise.resolve():(headlessStore.setState(prev=>({...prev,mcp:{...prev.mcp,clients:[...prev.mcp.clients,...Object.entries(configs).map(([name,config3])=>({name,type:"pending",config:config3}))]}})),getMcpToolsCommandsAndResources(({client:client2,tools:tools2,commands:commands2})=>{headlessStore.setState(prev=>({...prev,mcp:{...prev.mcp,clients:prev.mcp.clients.some(c4=>c4.name===client2.name)?prev.mcp.clients.map(c4=>c4.name===client2.name?client2:c4):[...prev.mcp.clients,client2],tools:uniqBy_default([...prev.mcp.tools,...tools2],"name"),commands:uniqBy_default([...prev.mcp.commands,...commands2],"name")}}))},configs).catch(err2=>logForDebugging(`[MCP] ${label2} connect error: ${err2}`))),"connectMcpBatch");profileCheckpoint("before_connectMcp");{let policy2=resolveHeadlessMcpStartup(),gate=await awaitHeadlessMcpGate(()=>connectMcpBatch(regularMcpConfigs,"regular"),policy2);logForDebugging(`[MCP] headless gate mode=${policy2.mode} waited ${gate.waitedMs}ms (13.4.1 default block was 8000ms)`)}profileCheckpoint("after_connectMcp"),isBareMode()||(startDeferredPrefetches(),Promise.resolve().then(()=>(init_backgroundHousekeeping(),backgroundHousekeeping_exports)).then(m3=>m3.startBackgroundHousekeeping())),logSessionTelemetry(),profileCheckpoint("before_print_import");let{runHeadless:runHeadless2}=await Promise.resolve().then(()=>(init_print(),print_exports));profileCheckpoint("after_print_import"),await runHeadless2(inputPrompt,()=>headlessStore.getState(),headlessStore.setState,commandsHeadless,tools,sdkMcpConfigs,agentDefinitions.activeAgents,{continue:options.continue,resume:options.resume,verbose,outputFormat,jsonSchema,permissionPromptToolName:options.permissionPromptTool,allowedTools,thinkingConfig,maxTurns:options.maxTurns,outputLastMessage:options.outputLastMessage,maxBudgetUsd:options.maxBudgetUsd,taskBudget:options.taskBudget?{total:options.taskBudget}:void 0,systemPrompt,appendSystemPrompt,userSpecifiedModel:effectiveModel,fallbackModel:userSpecifiedFallbackModel,sdkUrl,replayUserMessages:effectiveReplayUserMessages,includePartialMessages:effectiveIncludePartialMessages,forkSession:options.forkSession||!1,resumeSessionAt:options.resumeSessionAt||void 0,rewindFiles:options.rewindFiles,enableAuthStatus:options.enableAuthStatus,agent:agentCli,workload:options.workload,setupTrigger:setupTrigger??void 0,sessionStartHooksPromise});return}logEvent("tengu_startup_manual_model_config",{cli_flag:options.model,env_var:process.env.ANTHROPIC_MODEL,settings_file:(getInitialSettings()||{}).model,subscriptionType:getSubscriptionType(),agent:agentSetting});let deprecationWarning=getModelDeprecationWarning(resolvedInitialModel),initialNotifications=buildInitialNotifications({permissionModeNotification,deprecationWarning,overlyBroadBashPermissions},{uniq:uniq3,plural}),agentSwarmsEnabled=isAgentSwarmsEnabled(),effectiveToolPermissionContext=resolveEffectiveToolPermissionContext({toolPermissionContext,agentSwarmsEnabled,planModeRequired:agentSwarmsEnabled&&getTeammateUtils().isPlanModeRequired()}),initialIsBriefOnly=!1,fullRemoteControlCcrMirror=resolveReplBridgeFlags({remoteControl,remoteControlAtStartup:getRemoteControlAtStartup2(),kairosEnabled,ccrMirrorFeatureEnabled:!1,isCcrMirrorEnabledImpl:__name(()=>{let{isCcrMirrorEnabled:isCcrMirrorEnabled2}=(init_bridgeEnabled(),__toCommonJS(bridgeEnabled_exports));return isCcrMirrorEnabled2()},"isCcrMirrorEnabledImpl")}),fullRemoteControl=fullRemoteControlCcrMirror.fullRemoteControl,ccrMirrorEnabled=fullRemoteControlCcrMirror.ccrMirrorEnabled,initialState={settings:getInitialSettings(),tasks:{},agentNameRegistry:new Map,verbose:verbose??getGlobalConfig().verbose??!1,mainLoopModel:initialMainLoopModel,mainLoopModelForSession:null,providerContinuity:null,isBriefOnly:initialIsBriefOnly,expandedView:getGlobalConfig().showSpinnerTree?"teammates":getGlobalConfig().showExpandedTodos?"tasks":"none",showTeammateMessagePreview:isAgentSwarmsEnabled()?!1:void 0,selectedIPAgentIndex:-1,coordinatorTaskIndex:-1,viewSelectionMode:"none",footerSelection:null,toolPermissionContext:effectiveToolPermissionContext,agent:mainThreadAgentDefinition?.agentType,agentDefinitions,mcp:{clients:[],tools:[],commands:[],resources:{},pluginReconnectKey:0},plugins:{enabled:[],disabled:[],commands:[],errors:[],installationStatus:{marketplaces:[],plugins:[]},needsRefresh:!1},statusLineText:void 0,kairosEnabled,remoteSessionUrl:void 0,remoteCwd:void 0,remoteConnectionStatus:"connecting",remoteBackgroundTaskCount:0,replBridgeEnabled:fullRemoteControl||ccrMirrorEnabled,replBridgeExplicit:remoteControl,replBridgeOutboundOnly:ccrMirrorEnabled,replBridgeConnected:!1,replBridgeSessionActive:!1,replBridgeReconnecting:!1,replBridgeConnectUrl:void 0,replBridgeSessionUrl:void 0,replBridgeEnvironmentId:void 0,replBridgeSessionId:void 0,replBridgeError:void 0,replBridgeInitialName:remoteControlName,showRemoteCallout:!1,notifications:{current:null,queue:initialNotifications},elicitation:{queue:[]},todos:{},remoteAgentTaskSuggestions:[],fileHistory:{snapshots:[],trackedFiles:new Set,snapshotSequence:0},attribution:createEmptyAttributionState(),thinkingEnabled,promptSuggestionEnabled:shouldEnablePromptSuggestion(),sessionHooks:new Map,inbox:{messages:[]},promptSuggestion:{text:null,promptId:null,shownAt:0,acceptedAt:0,generationRequestId:null},speculation:IDLE_SPECULATION_STATE,speculationSessionTimeSavedMs:0,skillImprovement:{suggestion:null},workerSandboxPermissions:{queue:[],selectedIndex:0},pendingWorkerRequest:null,pendingSandboxRequest:null,authVersion:0,initialMessage:inputPrompt?{message:createUserMessage({content:String(inputPrompt)})}:null,effortValue:parseEffortValue(options.effort)??getInitialEffortSetting(),activeOverlays:new Set,fastMode:getInitialFastModeSetting(resolvedInitialModel),...isAdvisorEnabled()&&advisorModel&&{advisorModel},teamContext:computeInitialTeamContext?.()};inputPrompt&&addToHistory(String(inputPrompt));let initialTools=mcpTools;saveGlobalConfig(current=>({...current,numStartups:(current.numStartups??0)+1})),setImmediate(()=>{logStartupTelemetry(),logSessionTelemetry()});let sessionUploaderPromise=null,uploaderReady=sessionUploaderPromise?sessionUploaderPromise.then(mod=>mod.createSessionTurnUploader()).catch(()=>null):null,sessionConfig={debug:debug4||debugToStderr,commands:[...commands,...mcpCommands],initialTools,mcpClients,autoConnectIdeFlag:ide2,mainThreadAgentDefinition,disableSlashCommands,dynamicMcpConfig,strictMcpConfig,systemPrompt,appendSystemPrompt,taskListId,thinkingConfig,...uploaderReady&&{onTurnComplete:__name(messages=>{uploaderReady.then(uploader=>uploader?.(messages))},"onTurnComplete")}},resumeContext={modeApi:coordinatorModeModule,mainThreadAgentDefinition,agentDefinitions,currentCwd:currentCwd2,cliAgents,initialState};if(options.continue){let resumeSucceeded=!1;try{let resumeStart=performance.now(),{clearSessionCaches:clearSessionCaches2}=await Promise.resolve().then(()=>(init_caches(),caches_exports));clearSessionCaches2();let result2=await loadConversationForResume(void 0,void 0);if(!result2)return logEvent("tengu_continue",{success:!1}),await exitWithError2(root2,"No conversation found to continue");let loaded=await processResumedConversation(result2,{forkSession:!!options.forkSession,includeAttribution:!0,transcriptPath:result2.fullPath},resumeContext);loaded.restoredAgentDef&&(mainThreadAgentDefinition=loaded.restoredAgentDef),logEvent("tengu_continue",{success:!0,resume_duration_ms:Math.round(performance.now()-resumeStart)}),resumeSucceeded=!0,await launchRepl(root2,{getFpsMetrics,stats:stats3,initialState:loaded.initialState},{...sessionConfig,mainThreadAgentDefinition:loaded.restoredAgentDef??mainThreadAgentDefinition,initialMessages:loaded.messages,initialFileHistorySnapshots:loaded.fileHistorySnapshots,initialContentReplacements:loaded.contentReplacements,initialAgentName:loaded.agentName,initialAgentColor:loaded.agentColor},renderAndRun)}catch(error40){resumeSucceeded||logEvent("tengu_continue",{success:!1}),logError2(error40),process.exit(1)}}else if(options.resume||options.fromPr){let{clearSessionCaches:clearSessionCaches2}=await Promise.resolve().then(()=>(init_caches(),caches_exports));clearSessionCaches2();let messages=null,processedResume,maybeSessionId=validateUuid2(options.resume),searchTerm,matchedLog=null,filterByPr;if(options.fromPr&&(options.fromPr===!0?filterByPr=!0:typeof options.fromPr=="string"&&(filterByPr=options.fromPr)),options.resume&&typeof options.resume=="string"&&!maybeSessionId){let trimmedValue=options.resume.trim();if(trimmedValue){let matches2=await searchSessionsByCustomTitle(trimmedValue,{exact:!0});matches2.length===1?(matchedLog=matches2[0],maybeSessionId=getSessionIdFromLog(matchedLog)??null):searchTerm=trimmedValue}}if(maybeSessionId){let sessionId2=maybeSessionId;try{let resumeStart=performance.now(),result2=await loadConversationForResume(matchedLog??sessionId2,void 0);if(!result2)return logEvent("tengu_session_resumed",{entrypoint:"cli_flag",success:!1}),await exitWithError2(root2,`No conversation found with session ID: ${sessionId2}`);let fullPath=matchedLog?.fullPath??result2.fullPath;processedResume=await processResumedConversation(result2,{forkSession:!!options.forkSession,sessionIdOverride:sessionId2,transcriptPath:fullPath},resumeContext),processedResume.restoredAgentDef&&(mainThreadAgentDefinition=processedResume.restoredAgentDef),logEvent("tengu_session_resumed",{entrypoint:"cli_flag",success:!0,resume_duration_ms:Math.round(performance.now()-resumeStart)})}catch(error40){logEvent("tengu_session_resumed",{entrypoint:"cli_flag",success:!1}),logError2(error40),await exitWithError2(root2,`Failed to resume session ${sessionId2}`)}}if(fileDownloadPromise)try{let results=await fileDownloadPromise,failedCount=count2(results,r2=>!r2.success);failedCount>0&&process.stderr.write(source_default.yellow(`Warning: ${failedCount}/${results.length} file(s) failed to download.
12540
12540
  `))}catch(error40){return await exitWithError2(root2,`Error downloading files: ${errorMessage2(error40)}`)}let resumeData=processedResume??(Array.isArray(messages)?{messages,fileHistorySnapshots:void 0,agentName:void 0,agentColor:void 0,restoredAgentDef:mainThreadAgentDefinition,initialState,contentReplacements:void 0}:void 0);if(resumeData)await launchRepl(root2,{getFpsMetrics,stats:stats3,initialState:resumeData.initialState},{...sessionConfig,mainThreadAgentDefinition:resumeData.restoredAgentDef??mainThreadAgentDefinition,initialMessages:resumeData.messages,initialFileHistorySnapshots:resumeData.fileHistorySnapshots,initialContentReplacements:resumeData.contentReplacements,initialAgentName:resumeData.agentName,initialAgentColor:resumeData.agentColor},renderAndRun);else{process.stderr.write(source_default.yellow(`[clavue] Session picker is native pager only.
12541
12541
  Run: clavue --resume
12542
12542
  Or: clavue --resume <session-uuid>
12543
12543
  Plan: docs/ink-to-pager-migration-plan.md (Phase 1b)
12544
- `)),await gracefulShutdown(1);return}}else{let pendingHookMessages=hooksPromise&&hookMessages.length===0?hooksPromise:void 0;profileCheckpoint("action_after_hooks");let deepLinkBanner=null,initialMessages=deepLinkBanner?[deepLinkBanner,...hookMessages]:hookMessages.length>0?hookMessages:void 0;await launchRepl(root2,{getFpsMetrics,stats:stats3,initialState},{...sessionConfig,initialMessages,pendingHookMessages},renderAndRun)}}).version("13.9.1 (Clavue)","-v, --version","Output the version number"),program2.option("-w, --worktree [name]","Create a new git worktree for this session (optionally specify a name)"),program2.option("--tmux","Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux."),program2.option("--split <direction>","Open Clavue in a tmux/zellij/wezterm pane: right, left, down, up"),program2.option("--size <fraction>","Fraction a --split pane takes (0.2 to 0.95)"),program2.option("-g, --goto [file:line:column]","Queue a file for the pager / CLAVUE_IPC; omit the path to reseed the last mutation"),program2.option("--status","Print whether a clavue window is live (ipc / phase / last mutation) and exit"),program2.option("--timing","Record pager launch stages; alone, print the last recording"),canUserConfigureAdvisor()&&program2.addOption(new Option("--advisor <model>","Enable the server-side advisor tool with the specified model (alias or full ID).").hideHelp()),program2.addOption(new Option("--enable-auto-mode","Opt in to auto mode")),program2.addOption(new Option("--messaging-socket-path <path>","Unix domain socket path for the UDS messaging server (defaults to a tmp path)")),program2.addOption(new Option("--agent-id <id>","Teammate agent ID").hideHelp()),program2.addOption(new Option("--agent-name <name>","Teammate display name").hideHelp()),program2.addOption(new Option("--team-name <name>","Team name for swarm coordination").hideHelp()),program2.addOption(new Option("--agent-color <color>","Teammate UI color").hideHelp()),program2.addOption(new Option("--plan-mode-required","Require plan mode before implementation").hideHelp()),program2.addOption(new Option("--parent-session-id <id>","Parent session ID for analytics correlation").hideHelp()),program2.addOption(new Option("--teammate-mode <mode>",'How to spawn teammates: "tmux", "in-process", or "auto"').choices(["auto","tmux","in-process"]).hideHelp()),program2.addOption(new Option("--agent-type <type>","Custom agent type for this teammate").hideHelp()),program2.addOption(new Option("--sdk-url <url>","Use remote WebSocket endpoint for SDK I/O streaming (only with -p and stream-json format)").hideHelp()),profileCheckpoint("run_main_options_built");let isPrintMode=process.argv.includes("-p")||process.argv.includes("--print"),isCcUrl=process.argv.some(a2=>a2.startsWith("cc://")||a2.startsWith("cc+unix://"));if(isPrintMode&&!isCcUrl)return profileCheckpoint("run_before_parse"),await program2.parseAsync(process.argv),profileCheckpoint("run_after_parse"),program2;let mcp2=program2.command("mcp").description("Configure and manage MCP servers").configureHelp(createSortedHelpConfig()).enablePositionalOptions();mcp2.command("serve").description("Start the Clavue MCP server").option("-d, --debug","Enable debug mode",()=>!0).option("--verbose","Override verbose mode setting from config",()=>!0).action(async({debug:debug4,verbose})=>{let{mcpServeHandler:mcpServeHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpServeHandler2({debug:debug4,verbose})}),registerMcpAddCommand(mcp2),isXaaEnabled()&&registerMcpXaaIdpCommand(mcp2),mcp2.command("remove <name>").description("Remove an MCP server").option("-s, --scope <scope>","Configuration scope (local, user, or project) - if not specified, removes from whichever scope it exists in").action(async(name,options)=>{let{mcpRemoveHandler:mcpRemoveHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpRemoveHandler2(name,options)}),mcp2.command("list").description("List configured MCP servers. Note: The workspace trust dialog is skipped and stdio servers from .mcp.json are spawned for health checks. Only use this command in directories you trust.").action(async()=>{let{mcpListHandler:mcpListHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpListHandler2()}),mcp2.command("get <name>").description("Get details about an MCP server. Note: The workspace trust dialog is skipped and stdio servers from .mcp.json are spawned for health checks. Only use this command in directories you trust.").action(async name=>{let{mcpGetHandler:mcpGetHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpGetHandler2(name)}),mcp2.command("doctor [name]").description("Diagnose MCP server configuration and connectivity (connect + tools/list). Note: stdio servers are spawned for health checks \u2014 only use in directories you trust.").option("--json","Machine-readable JSON report",()=>!0).action(async(name,options)=>{let{mcpDoctorHandler:mcpDoctorHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpDoctorHandler2(name,options)}),mcp2.command("add-json <name> <json>").description("Add an MCP server (stdio or SSE) with a JSON string").option("-s, --scope <scope>","Configuration scope (local, user, or project)","local").option("--client-secret","Prompt for OAuth client secret (or set MCP_CLIENT_SECRET env var)").action(async(name,json2,options)=>{let{mcpAddJsonHandler:mcpAddJsonHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpAddJsonHandler2(name,json2,options)});let addFromDesktopAction=__name(async options=>{let{mcpAddFromDesktopHandler:mcpAddFromDesktopHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpAddFromDesktopHandler2(options)},"addFromDesktopAction");mcp2.command("add-from-clavue-desktop").description("Import MCP servers from Clavue Desktop (Mac and WSL only)").option("-s, --scope <scope>","Configuration scope (local, user, or project)","local").action(addFromDesktopAction),mcp2.command("add-from-claude-desktop",{hidden:!0}).description("Import MCP servers from Clavue Desktop (Mac and WSL only)").option("-s, --scope <scope>","Configuration scope (local, user, or project)","local").action(addFromDesktopAction),mcp2.command("reset-project-choices").description("Reset all approved and rejected project-scoped (.mcp.json) servers within this project").action(async()=>{let{mcpResetChoicesHandler:mcpResetChoicesHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpResetChoicesHandler2()});let auth2=program2.command("auth").description("Manage authentication").configureHelp(createSortedHelpConfig());auth2.command("login").description("Sign in with the official account flow").option("--email <email>","Pre-populate email address on the login page").option("--sso","Force SSO login flow").option("--console","Use direct API billing instead of subscription auth").option("--claudeai","Use official account subscription auth (default)").action(async({email:email3,sso,console:useConsole,claudeai})=>{let{authLogin:authLogin2}=await Promise.resolve().then(()=>(init_auth5(),auth_exports2));await authLogin2({email:email3,sso,console:useConsole,claudeai})}),auth2.command("status").description("Show authentication status").option("--json","Output as JSON (default)").option("--text","Output as human-readable text").action(async opts=>{let{authStatus:authStatus2}=await Promise.resolve().then(()=>(init_auth5(),auth_exports2));await authStatus2(opts)}),auth2.command("logout").description("Log out from Clavue").action(async()=>{let{authLogout:authLogout2}=await Promise.resolve().then(()=>(init_auth5(),auth_exports2));await authLogout2()});let browserCmd=program2.command("browser").description("Clavue Browser Runtime: native agent browser start/stop/status/doctor").configureHelp(createSortedHelpConfig());browserCmd.command("start").description("Launch agent-owned Chromium (dedicated profile) and write runtime.json").action(async()=>{let{browserCliStart:browserCliStart2}=await Promise.resolve().then(()=>(init_cli(),cli_exports));console.log(await browserCliStart2())}),browserCmd.command("stop").description("Stop agent-owned native browser if runtime.json pid is ours").action(async()=>{let{browserCliStop:browserCliStop2}=await Promise.resolve().then(()=>(init_cli(),cli_exports));console.log(browserCliStop2())}),browserCmd.command("status").description("Show browser backend status (host:port only, no cookies)").action(async()=>{let{browserCliStatus:browserCliStatus2}=await Promise.resolve().then(()=>(init_cli(),cli_exports));console.log(browserCliStatus2())}),browserCmd.command("doctor").description("Diagnose gate, binary discovery, and env matrix").action(async()=>{let{browserCliDoctor:browserCliDoctor2}=await Promise.resolve().then(()=>(init_cli(),cli_exports));console.log(browserCliDoctor2())});let coworkOption=__name(()=>new Option("--cowork","Use cowork_plugins directory").hideHelp(),"coworkOption"),pluginCmd=program2.command("plugin").alias("plugins").description("Manage Clavue plugins").configureHelp(createSortedHelpConfig());pluginCmd.command("validate <path>").description("Validate a plugin or marketplace manifest").addOption(coworkOption()).action(async(manifestPath,options)=>{let{pluginValidateHandler:pluginValidateHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginValidateHandler2(manifestPath,options)}),pluginCmd.command("list").description("List installed plugins").option("--json","Output as JSON").option("--available","Include available plugins from marketplaces (requires --json)").addOption(coworkOption()).action(async options=>{let{pluginListHandler:pluginListHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginListHandler2(options)}),pluginCmd.command("discover").description("Browse the curated Discover plugin catalog (localized; cached under ~/.clavue/cache/plugin-discover)").option("--json","Output catalog document as JSON").option("--refresh","Force network fetch (ignore disk cache TTL)").option("--locale <locale>","Catalog locale: zh (default), zh-TW, or en").action(async options=>{let{pluginDiscoverHandler:pluginDiscoverHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginDiscoverHandler2(options)});let marketplaceCmd=pluginCmd.command("marketplace").description("Manage Clavue marketplaces").configureHelp(createSortedHelpConfig());marketplaceCmd.command("add <source>").description("Add a marketplace from a URL, path, or GitHub repo").addOption(coworkOption()).option("--sparse <paths...>","Limit checkout to specific directories via git sparse-checkout (for monorepos). Example: --sparse .clavue-plugin plugins").option("--scope <scope>","Where to declare the marketplace: user (default), project, or local").action(async(source,options)=>{let{marketplaceAddHandler:marketplaceAddHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await marketplaceAddHandler2(source,options)}),marketplaceCmd.command("list").description("List all configured marketplaces").option("--json","Output as JSON").addOption(coworkOption()).action(async options=>{let{marketplaceListHandler:marketplaceListHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await marketplaceListHandler2(options)}),marketplaceCmd.command("remove <name>").alias("rm").description("Remove a configured marketplace").addOption(coworkOption()).action(async(name,options)=>{let{marketplaceRemoveHandler:marketplaceRemoveHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await marketplaceRemoveHandler2(name,options)}),marketplaceCmd.command("update [name]").description("Update marketplace(s) from their source - updates all if no name specified").addOption(coworkOption()).action(async(name,options)=>{let{marketplaceUpdateHandler:marketplaceUpdateHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await marketplaceUpdateHandler2(name,options)}),pluginCmd.command("install <plugin>").alias("i").description("Install a plugin from available marketplaces (use plugin@marketplace for specific marketplace)").option("-s, --scope <scope>","Installation scope: user, project, or local","user").addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginInstallHandler:pluginInstallHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginInstallHandler2(plugin2,options)}),pluginCmd.command("uninstall <plugin>").alias("remove").alias("rm").description("Uninstall an installed plugin").option("-s, --scope <scope>","Uninstall from scope: user, project, or local","user").option("--keep-data","Preserve the plugin's persistent data directory (~/.clavue/plugins/data/{id}/)").addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginUninstallHandler:pluginUninstallHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginUninstallHandler2(plugin2,options)}),pluginCmd.command("enable <plugin>").description("Enable a disabled plugin").option("-s, --scope <scope>",`Installation scope: ${VALID_INSTALLABLE_SCOPES.join(", ")} (default: auto-detect)`).addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginEnableHandler:pluginEnableHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginEnableHandler2(plugin2,options)}),pluginCmd.command("disable [plugin]").description("Disable an enabled plugin").option("-a, --all","Disable all enabled plugins").option("-s, --scope <scope>",`Installation scope: ${VALID_INSTALLABLE_SCOPES.join(", ")} (default: auto-detect)`).addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginDisableHandler:pluginDisableHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginDisableHandler2(plugin2,options)}),pluginCmd.command("update <plugin>").description("Update a plugin to the latest version (restart required to apply)").option("-s, --scope <scope>",`Installation scope: ${VALID_UPDATE_SCOPES.join(", ")} (default: user)`).addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginUpdateHandler:pluginUpdateHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginUpdateHandler2(plugin2,options)}),program2.command("provider [args...]").allowUnknownOption(!0).description("Open provider setup or run non-interactive provider profile actions").action(async args=>{let providerArgs=Array.isArray(args)?args:[];if(providerArgs.length>0){let{providerCommandHandler:providerCommandHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await providerCommandHandler2(providerArgs);return}let{providerSetupHandler:providerSetupHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await providerSetupHandler2()}),program2.command("team [args...]").description("Inspect local agent-team readiness and status").action(async args=>{let{teamCommandHandler:teamCommandHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await teamCommandHandler2(Array.isArray(args)?args:[])}),program2.command("repair [args...]").allowUnknownOption(!0).description("Repair Clavue setup, permissions, and CCJK compatibility").action(async args=>{let{repairCommandHandler:repairCommandHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await repairCommandHandler2(Array.isArray(args)?args:[])}),program2.command("setup-token").description("Set up a long-lived authentication token (requires official account subscription)").action(async()=>{let{setupTokenHandler:setupTokenHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await setupTokenHandler2()});let worktreeCmd=program2.command("worktree").description("Inspect and clean up agent worktrees").configureHelp(createSortedHelpConfig());worktreeCmd.command("list").alias("ls").description("List agent worktrees with their branch and cleanliness").option("--json","Output as JSON").action(async options=>{let{worktreeListHandler:worktreeListHandler2}=await Promise.resolve().then(()=>(init_worktree2(),worktree_exports2));await worktreeListHandler2({json:options.json}),process.exit(process.exitCode??0)}),worktreeCmd.command("rm <slug>").alias("remove").description("Remove one agent worktree by slug").option("--force","Remove even with uncommitted or unpushed work").action(async(slug,options)=>{let{worktreeRemoveHandler:worktreeRemoveHandler2}=await Promise.resolve().then(()=>(init_worktree2(),worktree_exports2));await worktreeRemoveHandler2(slug,{force:options.force}),process.exit(process.exitCode??0)}),worktreeCmd.command("gc").description("Remove stale auto-created worktrees that are clean and fully pushed").option("--days <number>","Age threshold in days","30").option("--dry-run","Show what would be removed without removing it").action(async options=>{let{worktreeGcHandler:worktreeGcHandler2}=await Promise.resolve().then(()=>(init_worktree2(),worktree_exports2));await worktreeGcHandler2({days:options.days,dryRun:options.dryRun}),process.exit(process.exitCode??0)});let trajectoryCmd=program2.command("trajectory").description("Export per-turn session records for offline evaluation").configureHelp(createSortedHelpConfig());if(trajectoryCmd.command("list").alias("ls").description("List sessions in this project that have turn evidence").action(async()=>{let{trajectoryListHandler:trajectoryListHandler2}=await Promise.resolve().then(()=>(init_trajectory(),trajectory_exports));await trajectoryListHandler2(),process.exit(process.exitCode??0)}),trajectoryCmd.command("export").description("Write one JSONL row per turn (prompt, tools, changes, verdict)").option("--session <id>","Session to export (default: the only one)").option("--out <path>","Write to a file instead of stdout").option("--limit <number>","Export at most this many recent turns").action(async options=>{let{trajectoryExportHandler:trajectoryExportHandler2}=await Promise.resolve().then(()=>(init_trajectory(),trajectory_exports));await trajectoryExportHandler2(options),process.exit(process.exitCode??0)}),program2.command("agents").description("List configured agents").option("--setting-sources <sources>","Comma-separated list of setting sources to load (user, project, local).").option("--cwd <path>","Resolve project-scoped agents relative to this directory instead of the current shell cwd. Useful when introspecting a workspace from a script.").action(async options=>{let{agentsHandler:agentsHandler2}=await Promise.resolve().then(()=>(init_agents3(),agents_exports2));await agentsHandler2({cwdOverride:options.cwd}),process.exit(0)}),getAutoModeEnabledStateIfCached()!=="disabled"){let autoModeCmd=program2.command("auto-mode").description("Inspect auto mode classifier configuration");autoModeCmd.command("defaults").description("Print the default auto mode environment, allow, and deny rules as JSON").action(async()=>{let{autoModeDefaultsHandler:autoModeDefaultsHandler2}=await Promise.resolve().then(()=>(init_autoMode(),autoMode_exports));autoModeDefaultsHandler2(),process.exit(0)}),autoModeCmd.command("config").description("Print the effective auto mode config as JSON: your settings where set, defaults otherwise").action(async()=>{let{autoModeConfigHandler:autoModeConfigHandler2}=await Promise.resolve().then(()=>(init_autoMode(),autoMode_exports));autoModeConfigHandler2(),process.exit(0)}),autoModeCmd.command("critique").description("Get AI feedback on your custom auto mode rules").option("--model <model>","Override which model is used").action(async options=>{let{autoModeCritiqueHandler:autoModeCritiqueHandler2}=await Promise.resolve().then(()=>(init_autoMode(),autoMode_exports));await autoModeCritiqueHandler2(options),process.exit()})}return program2.command("doctor").description("Check the health of your Clavue auto-updater. Note: The workspace trust dialog is skipped and stdio servers from .mcp.json are spawned for health checks. Only use this command in directories you trust.").action(async()=>{let{doctorHandler:doctorHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await doctorHandler2()}),program2.command("skill").description("Print a live machine-state skill dump (paths, owned vs seeded keys). Regenerate; do not cache.").action(async()=>{let{dispatchTerminalCitizenCli:dispatchTerminalCitizenCli2}=await Promise.resolve().then(()=>(init_terminalCitizen(),terminalCitizen_exports)),result2=await dispatchTerminalCitizenCli2(["skill"]);process.exit(result2.kind==="exit"?result2.code:0)}),program2.command("shortcut-setup").description("Resolve shortcut conflicts between Clavue and Ghostty/Kitty (include-only terminal files)").option("--scan","Print contested chords without writing").option("--apply","Write include-only terminal overrides").option("--undo","Remove Clavue-owned terminal include files").action(async opts=>{let extra=[...opts.scan?["--scan"]:[],...opts.apply?["--apply"]:[],...opts.undo?["--undo"]:[]],{dispatchTerminalCitizenCli:dispatchTerminalCitizenCli2}=await Promise.resolve().then(()=>(init_terminalCitizen(),terminalCitizen_exports)),result2=await dispatchTerminalCitizenCli2(["shortcut-setup",...extra]);process.exit(result2.kind==="exit"?result2.code:0)}),program2.command("update").alias("upgrade").description("Check for updates and install if available").action(async()=>{let{update:update3}=await Promise.resolve().then(()=>(init_update3(),update_exports));await update3()}),program2.command("install [target]").description("Install Clavue native build. Use [target] to specify version (stable, latest, or specific version)").option("--force","Force installation even if already installed").action(async(target,options)=>{let{installHandler:installHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await installHandler2(target,options)}),profileCheckpoint("run_before_parse"),await program2.parseAsync(process.argv),profileCheckpoint("run_after_parse"),profileCheckpoint("main_after_run"),profileReport(),program2}async function logTenguInit({hasInitialPrompt,hasStdin,verbose,debug:debug4,debugToStderr,print,outputFormat,inputFormat,numAllowedTools,numDisallowedTools,mcpClientCount,worktreeEnabled,skipWebFetchPreflight,githubActionInputs,dangerouslySkipPermissionsPassed,permissionMode,modeIsBypass,allowDangerouslySkipPermissionsPassed,systemPromptFlag,appendSystemPromptFlag,thinkingConfig,assistantActivationPath}){try{logEvent("tengu_init",{entrypoint:"claude",hasInitialPrompt,hasStdin,verbose,debug:debug4,debugToStderr,print,outputFormat,inputFormat,numAllowedTools,numDisallowedTools,mcpClientCount,worktree:worktreeEnabled,skipWebFetchPreflight,...githubActionInputs&&{githubActionInputs},dangerouslySkipPermissionsPassed,permissionMode,modeIsBypass,inProtectedNamespace:isInProtectedNamespace(),allowDangerouslySkipPermissionsPassed,thinkingType:thinkingConfig.type,...systemPromptFlag&&{systemPromptFlag},...appendSystemPromptFlag&&{appendSystemPromptFlag},is_simple:isBareMode()||void 0,is_coordinator:void 0,...assistantActivationPath&&{assistantActivationPath},autoUpdatesChannel:getInitialSettings().autoUpdatesChannel??"latest"})}catch(error40){logError2(error40)}}var getTeammateUtils,getTeammatePromptAddendum,getTeammateModeSnapshot,coordinatorModeModule,autoModeStateModule6,_pendingAssistantChat,init_main3=__esm({"src/main.tsx"(){init_startupProfiler();init_rawRead();init_keychainPrefetch();init_featureFlags();init_esm4();init_source();init_mapValues();init_uniqBy();init_branding();init_oauth();init_context2();init_init2();init_history();init_replLauncher();init_growthbook();init_bootstrap();init_filesApi();init_policyLimits();init_remoteManagedSettings();init_SyntheticOutputTool();init_tools3();init_advisor();init_agentSwarmsEnabled();init_array4();init_asciicast();init_state();init_auth();init_config12();init_earlyInput();init_effort();init_fastMode();init_managedEnv();init_messages4();init_platform2();init_validateTmuxOption();init_validateTeammateIdentityOptions();init_applySdkUrlDefaults();init_validateSessionIdOption();init_validateEnterpriseMcpConfig();init_buildFileDownloadConfig();init_filterCommandsForHeadless();init_determineClientType();init_resolveQuestionPreviewFormat();init_resolveIncludeOptions();init_resolveWorktreeOption();init_shouldSetAutoModeFlagCli();init_resolveEffectiveModel();init_validateAdvisorOption();init_buildInitialNotifications();init_resolveThinkingConfig();init_resolveReplayUserMessages();init_resolveEffectiveToolPermissionContext();init_resolveReplBridgeFlags();init_shouldSetFormattedOutputFlag();init_mergeAgentDefinitions();init_parseChannelEntries();init_resolveSystemPromptOption();init_validateStreamFormatOptions();init_sessionIngressAuth();init_slowOperations();init_reconnection();init_warningHandler();init_worktreeModeEnabled();init_growthbook();init_analytics();init_state();init_commands2();init_dialogLaunchers();init_interactiveHelpers();init_bundled2();init_claudeAiLimits();init_client9();init_headlessConnectPolicy();init_pluginCliCommands();init_bundled3();init_loadAgentsDir();init_autoUpdater();init_conversationRecovery();init_banner();init_envUtils();init_exampleCommands();init_git();init_json();init_log3();init_deprecation();init_model();init_modelRoles();init_nativeWorkflowCompatibility();init_modelStrings();init_providerProfiles();init_providerStartup();init_PermissionMode();init_restrictedMode();init_permissionSetup();init_cacheUtils();init_installedPluginsManager();init_orphanedPluginFilter();init_sessionStart();init_sessionStorage();init_settings();init_settings2();init_tasks();init_uuid2();init_addCommand();init_xaaIdpCommand();init_internalLogging();init_officialClavueMcp();init_officialBrowserMcp();init_browser4();init_config9();init_xaaIdpLogin();init_api3();init_cleanupRegistry();init_commitAttribution();init_concurrentSessions();init_cwd2();init_debug();init_errors2();init_gracefulShutdown();init_hookEvents();init_process();init_sessionRestore();init_stringUtils();init_state();init_entrypoint();init_migrations();init_deferredPrefetches();init_runtimeActivations();init_sessionTelemetry();init_settingsBootstrap();init_telemetry();init_RemoteSessionManager();init_createDirectConnectSession();init_manager();init_promptSuggestion();init_AppStateStore();init_onChangeAppState();init_store();init_betas2();init_bundledMode();init_diagLogs();init_pluginLoader();init_api2();init_thinking();init_user();init_worktree();init_resumeFromHandoff();init_foreignContinueSeed();profileCheckpoint("main_tsx_entry");startMdmRawRead();startKeychainPrefetch();getTeammateUtils=__name(()=>(init_teammate(),__toCommonJS(teammate_exports)),"getTeammateUtils"),getTeammatePromptAddendum=__name(()=>(init_teammatePromptAddendum(),__toCommonJS(teammatePromptAddendum_exports)),"getTeammatePromptAddendum"),getTeammateModeSnapshot=__name(()=>(init_teammateModeSnapshot(),__toCommonJS(teammateModeSnapshot_exports)),"getTeammateModeSnapshot"),coordinatorModeModule=null,autoModeStateModule6=(init_autoModeState(),__toCommonJS(autoModeState_exports));profileCheckpoint("main_tsx_imports_loaded");__name(resolveAndBuildImportSessionSeed,"resolveAndBuildImportSessionSeed");__name(isBeingDebugged,"isBeingDebugged");isBeingDebugged()&&process.exit(1);__name(runMigrations,"runMigrations");_pendingAssistantChat=feature("KAIROS")?{sessionId:void 0,discover:!1}:void 0;__name(main,"main");__name(getInputPrompt,"getInputPrompt");__name(run2,"run");__name(logTenguInit,"logTenguInit")}});process.env.COREPACK_ENABLE_AUTO_PIN="0";async function main2(){let args=process.argv.slice(2);if(args.length===1&&(args[0]==="--version"||args[0]==="-v"||args[0]==="-V")){console.log("13.9.1 (Clavue)");return}let{nodePreflightMessage:nodePreflightMessage2,nodePreflightShouldExit:nodePreflightShouldExit2}=await Promise.resolve().then(()=>(init_nodePreflight(),nodePreflight_exports));nodePreflightShouldExit2()&&(process.stderr.write(nodePreflightMessage2(process.versions.node)),process.exit(1));let{feature:feature2}=await Promise.resolve().then(()=>(init_featureFlags(),featureFlags_exports)),{normalizeClavueBrandEnv:normalizeClavueBrandEnv2}=await Promise.resolve().then(()=>(init_clavueEnv(),clavueEnv_exports));normalizeClavueBrandEnv2();let{applyNormalizedArgv:applyNormalizedArgv2}=await Promise.resolve().then(()=>(init_launchFlags(),launchFlags_exports));process.argv=applyNormalizedArgv2(process.argv),args=process.argv.slice(2);let{reexecWithLargerHeapIfNeeded:reexecWithLargerHeapIfNeeded2}=await Promise.resolve().then(()=>(init_nodeHeapBootstrap(),nodeHeapBootstrap_exports));if(reexecWithLargerHeapIfNeeded2({args}))return;{let{dispatchTerminalCitizenCli:dispatchTerminalCitizenCli2}=await Promise.resolve().then(()=>(init_terminalCitizen(),terminalCitizen_exports)),citizen=await dispatchTerminalCitizenCli2(args);citizen.kind==="exit"&&process.exit(citizen.code),args=citizen.argv,process.argv=[process.argv[0],process.argv[1],...args]}if(args[0]==="agent"){let{rewriteAgentAliasArgv:rewriteAgentAliasArgv2}=await Promise.resolve().then(()=>(init_agentAlias(),agentAlias_exports)),rewrite=rewriteAgentAliasArgv2(args);rewrite?.kind==="help"&&(process.stdout.write(rewrite.text.endsWith(`
12544
+ `)),await gracefulShutdown(1);return}}else{let pendingHookMessages=hooksPromise&&hookMessages.length===0?hooksPromise:void 0;profileCheckpoint("action_after_hooks");let deepLinkBanner=null,initialMessages=deepLinkBanner?[deepLinkBanner,...hookMessages]:hookMessages.length>0?hookMessages:void 0;await launchRepl(root2,{getFpsMetrics,stats:stats3,initialState},{...sessionConfig,initialMessages,pendingHookMessages},renderAndRun)}}).version("13.9.2 (Clavue)","-v, --version","Output the version number"),program2.option("-w, --worktree [name]","Create a new git worktree for this session (optionally specify a name)"),program2.option("--tmux","Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux."),program2.option("--split <direction>","Open Clavue in a tmux/zellij/wezterm pane: right, left, down, up"),program2.option("--size <fraction>","Fraction a --split pane takes (0.2 to 0.95)"),program2.option("-g, --goto [file:line:column]","Queue a file for the pager / CLAVUE_IPC; omit the path to reseed the last mutation"),program2.option("--status","Print whether a clavue window is live (ipc / phase / last mutation) and exit"),program2.option("--timing","Record pager launch stages; alone, print the last recording"),canUserConfigureAdvisor()&&program2.addOption(new Option("--advisor <model>","Enable the server-side advisor tool with the specified model (alias or full ID).").hideHelp()),program2.addOption(new Option("--enable-auto-mode","Opt in to auto mode")),program2.addOption(new Option("--messaging-socket-path <path>","Unix domain socket path for the UDS messaging server (defaults to a tmp path)")),program2.addOption(new Option("--agent-id <id>","Teammate agent ID").hideHelp()),program2.addOption(new Option("--agent-name <name>","Teammate display name").hideHelp()),program2.addOption(new Option("--team-name <name>","Team name for swarm coordination").hideHelp()),program2.addOption(new Option("--agent-color <color>","Teammate UI color").hideHelp()),program2.addOption(new Option("--plan-mode-required","Require plan mode before implementation").hideHelp()),program2.addOption(new Option("--parent-session-id <id>","Parent session ID for analytics correlation").hideHelp()),program2.addOption(new Option("--teammate-mode <mode>",'How to spawn teammates: "tmux", "in-process", or "auto"').choices(["auto","tmux","in-process"]).hideHelp()),program2.addOption(new Option("--agent-type <type>","Custom agent type for this teammate").hideHelp()),program2.addOption(new Option("--sdk-url <url>","Use remote WebSocket endpoint for SDK I/O streaming (only with -p and stream-json format)").hideHelp()),profileCheckpoint("run_main_options_built");let isPrintMode=process.argv.includes("-p")||process.argv.includes("--print"),isCcUrl=process.argv.some(a2=>a2.startsWith("cc://")||a2.startsWith("cc+unix://"));if(isPrintMode&&!isCcUrl)return profileCheckpoint("run_before_parse"),await program2.parseAsync(process.argv),profileCheckpoint("run_after_parse"),program2;let mcp2=program2.command("mcp").description("Configure and manage MCP servers").configureHelp(createSortedHelpConfig()).enablePositionalOptions();mcp2.command("serve").description("Start the Clavue MCP server").option("-d, --debug","Enable debug mode",()=>!0).option("--verbose","Override verbose mode setting from config",()=>!0).action(async({debug:debug4,verbose})=>{let{mcpServeHandler:mcpServeHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpServeHandler2({debug:debug4,verbose})}),registerMcpAddCommand(mcp2),isXaaEnabled()&&registerMcpXaaIdpCommand(mcp2),mcp2.command("remove <name>").description("Remove an MCP server").option("-s, --scope <scope>","Configuration scope (local, user, or project) - if not specified, removes from whichever scope it exists in").action(async(name,options)=>{let{mcpRemoveHandler:mcpRemoveHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpRemoveHandler2(name,options)}),mcp2.command("list").description("List configured MCP servers. Note: The workspace trust dialog is skipped and stdio servers from .mcp.json are spawned for health checks. Only use this command in directories you trust.").action(async()=>{let{mcpListHandler:mcpListHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpListHandler2()}),mcp2.command("get <name>").description("Get details about an MCP server. Note: The workspace trust dialog is skipped and stdio servers from .mcp.json are spawned for health checks. Only use this command in directories you trust.").action(async name=>{let{mcpGetHandler:mcpGetHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpGetHandler2(name)}),mcp2.command("doctor [name]").description("Diagnose MCP server configuration and connectivity (connect + tools/list). Note: stdio servers are spawned for health checks \u2014 only use in directories you trust.").option("--json","Machine-readable JSON report",()=>!0).action(async(name,options)=>{let{mcpDoctorHandler:mcpDoctorHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpDoctorHandler2(name,options)}),mcp2.command("add-json <name> <json>").description("Add an MCP server (stdio or SSE) with a JSON string").option("-s, --scope <scope>","Configuration scope (local, user, or project)","local").option("--client-secret","Prompt for OAuth client secret (or set MCP_CLIENT_SECRET env var)").action(async(name,json2,options)=>{let{mcpAddJsonHandler:mcpAddJsonHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpAddJsonHandler2(name,json2,options)});let addFromDesktopAction=__name(async options=>{let{mcpAddFromDesktopHandler:mcpAddFromDesktopHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpAddFromDesktopHandler2(options)},"addFromDesktopAction");mcp2.command("add-from-clavue-desktop").description("Import MCP servers from Clavue Desktop (Mac and WSL only)").option("-s, --scope <scope>","Configuration scope (local, user, or project)","local").action(addFromDesktopAction),mcp2.command("add-from-claude-desktop",{hidden:!0}).description("Import MCP servers from Clavue Desktop (Mac and WSL only)").option("-s, --scope <scope>","Configuration scope (local, user, or project)","local").action(addFromDesktopAction),mcp2.command("reset-project-choices").description("Reset all approved and rejected project-scoped (.mcp.json) servers within this project").action(async()=>{let{mcpResetChoicesHandler:mcpResetChoicesHandler2}=await Promise.resolve().then(()=>(init_mcp6(),mcp_exports3));await mcpResetChoicesHandler2()});let auth2=program2.command("auth").description("Manage authentication").configureHelp(createSortedHelpConfig());auth2.command("login").description("Sign in with the official account flow").option("--email <email>","Pre-populate email address on the login page").option("--sso","Force SSO login flow").option("--console","Use direct API billing instead of subscription auth").option("--claudeai","Use official account subscription auth (default)").action(async({email:email3,sso,console:useConsole,claudeai})=>{let{authLogin:authLogin2}=await Promise.resolve().then(()=>(init_auth5(),auth_exports2));await authLogin2({email:email3,sso,console:useConsole,claudeai})}),auth2.command("status").description("Show authentication status").option("--json","Output as JSON (default)").option("--text","Output as human-readable text").action(async opts=>{let{authStatus:authStatus2}=await Promise.resolve().then(()=>(init_auth5(),auth_exports2));await authStatus2(opts)}),auth2.command("logout").description("Log out from Clavue").action(async()=>{let{authLogout:authLogout2}=await Promise.resolve().then(()=>(init_auth5(),auth_exports2));await authLogout2()});let browserCmd=program2.command("browser").description("Clavue Browser Runtime: native agent browser start/stop/status/doctor").configureHelp(createSortedHelpConfig());browserCmd.command("start").description("Launch agent-owned Chromium (dedicated profile) and write runtime.json").action(async()=>{let{browserCliStart:browserCliStart2}=await Promise.resolve().then(()=>(init_cli(),cli_exports));console.log(await browserCliStart2())}),browserCmd.command("stop").description("Stop agent-owned native browser if runtime.json pid is ours").action(async()=>{let{browserCliStop:browserCliStop2}=await Promise.resolve().then(()=>(init_cli(),cli_exports));console.log(browserCliStop2())}),browserCmd.command("status").description("Show browser backend status (host:port only, no cookies)").action(async()=>{let{browserCliStatus:browserCliStatus2}=await Promise.resolve().then(()=>(init_cli(),cli_exports));console.log(browserCliStatus2())}),browserCmd.command("doctor").description("Diagnose gate, binary discovery, and env matrix").action(async()=>{let{browserCliDoctor:browserCliDoctor2}=await Promise.resolve().then(()=>(init_cli(),cli_exports));console.log(browserCliDoctor2())});let coworkOption=__name(()=>new Option("--cowork","Use cowork_plugins directory").hideHelp(),"coworkOption"),pluginCmd=program2.command("plugin").alias("plugins").description("Manage Clavue plugins").configureHelp(createSortedHelpConfig());pluginCmd.command("validate <path>").description("Validate a plugin or marketplace manifest").addOption(coworkOption()).action(async(manifestPath,options)=>{let{pluginValidateHandler:pluginValidateHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginValidateHandler2(manifestPath,options)}),pluginCmd.command("list").description("List installed plugins").option("--json","Output as JSON").option("--available","Include available plugins from marketplaces (requires --json)").addOption(coworkOption()).action(async options=>{let{pluginListHandler:pluginListHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginListHandler2(options)}),pluginCmd.command("discover").description("Browse the curated Discover plugin catalog (localized; cached under ~/.clavue/cache/plugin-discover)").option("--json","Output catalog document as JSON").option("--refresh","Force network fetch (ignore disk cache TTL)").option("--locale <locale>","Catalog locale: zh (default), zh-TW, or en").action(async options=>{let{pluginDiscoverHandler:pluginDiscoverHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginDiscoverHandler2(options)});let marketplaceCmd=pluginCmd.command("marketplace").description("Manage Clavue marketplaces").configureHelp(createSortedHelpConfig());marketplaceCmd.command("add <source>").description("Add a marketplace from a URL, path, or GitHub repo").addOption(coworkOption()).option("--sparse <paths...>","Limit checkout to specific directories via git sparse-checkout (for monorepos). Example: --sparse .clavue-plugin plugins").option("--scope <scope>","Where to declare the marketplace: user (default), project, or local").action(async(source,options)=>{let{marketplaceAddHandler:marketplaceAddHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await marketplaceAddHandler2(source,options)}),marketplaceCmd.command("list").description("List all configured marketplaces").option("--json","Output as JSON").addOption(coworkOption()).action(async options=>{let{marketplaceListHandler:marketplaceListHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await marketplaceListHandler2(options)}),marketplaceCmd.command("remove <name>").alias("rm").description("Remove a configured marketplace").addOption(coworkOption()).action(async(name,options)=>{let{marketplaceRemoveHandler:marketplaceRemoveHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await marketplaceRemoveHandler2(name,options)}),marketplaceCmd.command("update [name]").description("Update marketplace(s) from their source - updates all if no name specified").addOption(coworkOption()).action(async(name,options)=>{let{marketplaceUpdateHandler:marketplaceUpdateHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await marketplaceUpdateHandler2(name,options)}),pluginCmd.command("install <plugin>").alias("i").description("Install a plugin from available marketplaces (use plugin@marketplace for specific marketplace)").option("-s, --scope <scope>","Installation scope: user, project, or local","user").addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginInstallHandler:pluginInstallHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginInstallHandler2(plugin2,options)}),pluginCmd.command("uninstall <plugin>").alias("remove").alias("rm").description("Uninstall an installed plugin").option("-s, --scope <scope>","Uninstall from scope: user, project, or local","user").option("--keep-data","Preserve the plugin's persistent data directory (~/.clavue/plugins/data/{id}/)").addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginUninstallHandler:pluginUninstallHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginUninstallHandler2(plugin2,options)}),pluginCmd.command("enable <plugin>").description("Enable a disabled plugin").option("-s, --scope <scope>",`Installation scope: ${VALID_INSTALLABLE_SCOPES.join(", ")} (default: auto-detect)`).addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginEnableHandler:pluginEnableHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginEnableHandler2(plugin2,options)}),pluginCmd.command("disable [plugin]").description("Disable an enabled plugin").option("-a, --all","Disable all enabled plugins").option("-s, --scope <scope>",`Installation scope: ${VALID_INSTALLABLE_SCOPES.join(", ")} (default: auto-detect)`).addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginDisableHandler:pluginDisableHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginDisableHandler2(plugin2,options)}),pluginCmd.command("update <plugin>").description("Update a plugin to the latest version (restart required to apply)").option("-s, --scope <scope>",`Installation scope: ${VALID_UPDATE_SCOPES.join(", ")} (default: user)`).addOption(coworkOption()).action(async(plugin2,options)=>{let{pluginUpdateHandler:pluginUpdateHandler2}=await Promise.resolve().then(()=>(init_plugins(),plugins_exports));await pluginUpdateHandler2(plugin2,options)}),program2.command("provider [args...]").allowUnknownOption(!0).description("Open provider setup or run non-interactive provider profile actions").action(async args=>{let providerArgs=Array.isArray(args)?args:[];if(providerArgs.length>0){let{providerCommandHandler:providerCommandHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await providerCommandHandler2(providerArgs);return}let{providerSetupHandler:providerSetupHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await providerSetupHandler2()}),program2.command("team [args...]").description("Inspect local agent-team readiness and status").action(async args=>{let{teamCommandHandler:teamCommandHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await teamCommandHandler2(Array.isArray(args)?args:[])}),program2.command("repair [args...]").allowUnknownOption(!0).description("Repair Clavue setup, permissions, and CCJK compatibility").action(async args=>{let{repairCommandHandler:repairCommandHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await repairCommandHandler2(Array.isArray(args)?args:[])}),program2.command("setup-token").description("Set up a long-lived authentication token (requires official account subscription)").action(async()=>{let{setupTokenHandler:setupTokenHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await setupTokenHandler2()});let worktreeCmd=program2.command("worktree").description("Inspect and clean up agent worktrees").configureHelp(createSortedHelpConfig());worktreeCmd.command("list").alias("ls").description("List agent worktrees with their branch and cleanliness").option("--json","Output as JSON").action(async options=>{let{worktreeListHandler:worktreeListHandler2}=await Promise.resolve().then(()=>(init_worktree2(),worktree_exports2));await worktreeListHandler2({json:options.json}),process.exit(process.exitCode??0)}),worktreeCmd.command("rm <slug>").alias("remove").description("Remove one agent worktree by slug").option("--force","Remove even with uncommitted or unpushed work").action(async(slug,options)=>{let{worktreeRemoveHandler:worktreeRemoveHandler2}=await Promise.resolve().then(()=>(init_worktree2(),worktree_exports2));await worktreeRemoveHandler2(slug,{force:options.force}),process.exit(process.exitCode??0)}),worktreeCmd.command("gc").description("Remove stale auto-created worktrees that are clean and fully pushed").option("--days <number>","Age threshold in days","30").option("--dry-run","Show what would be removed without removing it").action(async options=>{let{worktreeGcHandler:worktreeGcHandler2}=await Promise.resolve().then(()=>(init_worktree2(),worktree_exports2));await worktreeGcHandler2({days:options.days,dryRun:options.dryRun}),process.exit(process.exitCode??0)});let trajectoryCmd=program2.command("trajectory").description("Export per-turn session records for offline evaluation").configureHelp(createSortedHelpConfig());if(trajectoryCmd.command("list").alias("ls").description("List sessions in this project that have turn evidence").action(async()=>{let{trajectoryListHandler:trajectoryListHandler2}=await Promise.resolve().then(()=>(init_trajectory(),trajectory_exports));await trajectoryListHandler2(),process.exit(process.exitCode??0)}),trajectoryCmd.command("export").description("Write one JSONL row per turn (prompt, tools, changes, verdict)").option("--session <id>","Session to export (default: the only one)").option("--out <path>","Write to a file instead of stdout").option("--limit <number>","Export at most this many recent turns").action(async options=>{let{trajectoryExportHandler:trajectoryExportHandler2}=await Promise.resolve().then(()=>(init_trajectory(),trajectory_exports));await trajectoryExportHandler2(options),process.exit(process.exitCode??0)}),program2.command("agents").description("List configured agents").option("--setting-sources <sources>","Comma-separated list of setting sources to load (user, project, local).").option("--cwd <path>","Resolve project-scoped agents relative to this directory instead of the current shell cwd. Useful when introspecting a workspace from a script.").action(async options=>{let{agentsHandler:agentsHandler2}=await Promise.resolve().then(()=>(init_agents3(),agents_exports2));await agentsHandler2({cwdOverride:options.cwd}),process.exit(0)}),getAutoModeEnabledStateIfCached()!=="disabled"){let autoModeCmd=program2.command("auto-mode").description("Inspect auto mode classifier configuration");autoModeCmd.command("defaults").description("Print the default auto mode environment, allow, and deny rules as JSON").action(async()=>{let{autoModeDefaultsHandler:autoModeDefaultsHandler2}=await Promise.resolve().then(()=>(init_autoMode(),autoMode_exports));autoModeDefaultsHandler2(),process.exit(0)}),autoModeCmd.command("config").description("Print the effective auto mode config as JSON: your settings where set, defaults otherwise").action(async()=>{let{autoModeConfigHandler:autoModeConfigHandler2}=await Promise.resolve().then(()=>(init_autoMode(),autoMode_exports));autoModeConfigHandler2(),process.exit(0)}),autoModeCmd.command("critique").description("Get AI feedback on your custom auto mode rules").option("--model <model>","Override which model is used").action(async options=>{let{autoModeCritiqueHandler:autoModeCritiqueHandler2}=await Promise.resolve().then(()=>(init_autoMode(),autoMode_exports));await autoModeCritiqueHandler2(options),process.exit()})}return program2.command("doctor").description("Check the health of your Clavue auto-updater. Note: The workspace trust dialog is skipped and stdio servers from .mcp.json are spawned for health checks. Only use this command in directories you trust.").action(async()=>{let{doctorHandler:doctorHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await doctorHandler2()}),program2.command("skill").description("Print a live machine-state skill dump (paths, owned vs seeded keys). Regenerate; do not cache.").action(async()=>{let{dispatchTerminalCitizenCli:dispatchTerminalCitizenCli2}=await Promise.resolve().then(()=>(init_terminalCitizen(),terminalCitizen_exports)),result2=await dispatchTerminalCitizenCli2(["skill"]);process.exit(result2.kind==="exit"?result2.code:0)}),program2.command("shortcut-setup").description("Resolve shortcut conflicts between Clavue and Ghostty/Kitty (include-only terminal files)").option("--scan","Print contested chords without writing").option("--apply","Write include-only terminal overrides").option("--undo","Remove Clavue-owned terminal include files").action(async opts=>{let extra=[...opts.scan?["--scan"]:[],...opts.apply?["--apply"]:[],...opts.undo?["--undo"]:[]],{dispatchTerminalCitizenCli:dispatchTerminalCitizenCli2}=await Promise.resolve().then(()=>(init_terminalCitizen(),terminalCitizen_exports)),result2=await dispatchTerminalCitizenCli2(["shortcut-setup",...extra]);process.exit(result2.kind==="exit"?result2.code:0)}),program2.command("update").alias("upgrade").description("Check for updates and install if available").action(async()=>{let{update:update3}=await Promise.resolve().then(()=>(init_update3(),update_exports));await update3()}),program2.command("install [target]").description("Install Clavue native build. Use [target] to specify version (stable, latest, or specific version)").option("--force","Force installation even if already installed").action(async(target,options)=>{let{installHandler:installHandler2}=await Promise.resolve().then(()=>(init_util5(),util_exports2));await installHandler2(target,options)}),profileCheckpoint("run_before_parse"),await program2.parseAsync(process.argv),profileCheckpoint("run_after_parse"),profileCheckpoint("main_after_run"),profileReport(),program2}async function logTenguInit({hasInitialPrompt,hasStdin,verbose,debug:debug4,debugToStderr,print,outputFormat,inputFormat,numAllowedTools,numDisallowedTools,mcpClientCount,worktreeEnabled,skipWebFetchPreflight,githubActionInputs,dangerouslySkipPermissionsPassed,permissionMode,modeIsBypass,allowDangerouslySkipPermissionsPassed,systemPromptFlag,appendSystemPromptFlag,thinkingConfig,assistantActivationPath}){try{logEvent("tengu_init",{entrypoint:"claude",hasInitialPrompt,hasStdin,verbose,debug:debug4,debugToStderr,print,outputFormat,inputFormat,numAllowedTools,numDisallowedTools,mcpClientCount,worktree:worktreeEnabled,skipWebFetchPreflight,...githubActionInputs&&{githubActionInputs},dangerouslySkipPermissionsPassed,permissionMode,modeIsBypass,inProtectedNamespace:isInProtectedNamespace(),allowDangerouslySkipPermissionsPassed,thinkingType:thinkingConfig.type,...systemPromptFlag&&{systemPromptFlag},...appendSystemPromptFlag&&{appendSystemPromptFlag},is_simple:isBareMode()||void 0,is_coordinator:void 0,...assistantActivationPath&&{assistantActivationPath},autoUpdatesChannel:getInitialSettings().autoUpdatesChannel??"latest"})}catch(error40){logError2(error40)}}var getTeammateUtils,getTeammatePromptAddendum,getTeammateModeSnapshot,coordinatorModeModule,autoModeStateModule6,_pendingAssistantChat,init_main3=__esm({"src/main.tsx"(){init_startupProfiler();init_rawRead();init_keychainPrefetch();init_featureFlags();init_esm4();init_source();init_mapValues();init_uniqBy();init_branding();init_oauth();init_context2();init_init2();init_history();init_replLauncher();init_growthbook();init_bootstrap();init_filesApi();init_policyLimits();init_remoteManagedSettings();init_SyntheticOutputTool();init_tools3();init_advisor();init_agentSwarmsEnabled();init_array4();init_asciicast();init_state();init_auth();init_config12();init_earlyInput();init_effort();init_fastMode();init_managedEnv();init_messages4();init_platform2();init_validateTmuxOption();init_validateTeammateIdentityOptions();init_applySdkUrlDefaults();init_validateSessionIdOption();init_validateEnterpriseMcpConfig();init_buildFileDownloadConfig();init_filterCommandsForHeadless();init_determineClientType();init_resolveQuestionPreviewFormat();init_resolveIncludeOptions();init_resolveWorktreeOption();init_shouldSetAutoModeFlagCli();init_resolveEffectiveModel();init_validateAdvisorOption();init_buildInitialNotifications();init_resolveThinkingConfig();init_resolveReplayUserMessages();init_resolveEffectiveToolPermissionContext();init_resolveReplBridgeFlags();init_shouldSetFormattedOutputFlag();init_mergeAgentDefinitions();init_parseChannelEntries();init_resolveSystemPromptOption();init_validateStreamFormatOptions();init_sessionIngressAuth();init_slowOperations();init_reconnection();init_warningHandler();init_worktreeModeEnabled();init_growthbook();init_analytics();init_state();init_commands2();init_dialogLaunchers();init_interactiveHelpers();init_bundled2();init_claudeAiLimits();init_client9();init_headlessConnectPolicy();init_pluginCliCommands();init_bundled3();init_loadAgentsDir();init_autoUpdater();init_conversationRecovery();init_banner();init_envUtils();init_exampleCommands();init_git();init_json();init_log3();init_deprecation();init_model();init_modelRoles();init_nativeWorkflowCompatibility();init_modelStrings();init_providerProfiles();init_providerStartup();init_PermissionMode();init_restrictedMode();init_permissionSetup();init_cacheUtils();init_installedPluginsManager();init_orphanedPluginFilter();init_sessionStart();init_sessionStorage();init_settings();init_settings2();init_tasks();init_uuid2();init_addCommand();init_xaaIdpCommand();init_internalLogging();init_officialClavueMcp();init_officialBrowserMcp();init_browser4();init_config9();init_xaaIdpLogin();init_api3();init_cleanupRegistry();init_commitAttribution();init_concurrentSessions();init_cwd2();init_debug();init_errors2();init_gracefulShutdown();init_hookEvents();init_process();init_sessionRestore();init_stringUtils();init_state();init_entrypoint();init_migrations();init_deferredPrefetches();init_runtimeActivations();init_sessionTelemetry();init_settingsBootstrap();init_telemetry();init_RemoteSessionManager();init_createDirectConnectSession();init_manager();init_promptSuggestion();init_AppStateStore();init_onChangeAppState();init_store();init_betas2();init_bundledMode();init_diagLogs();init_pluginLoader();init_api2();init_thinking();init_user();init_worktree();init_resumeFromHandoff();init_foreignContinueSeed();profileCheckpoint("main_tsx_entry");startMdmRawRead();startKeychainPrefetch();getTeammateUtils=__name(()=>(init_teammate(),__toCommonJS(teammate_exports)),"getTeammateUtils"),getTeammatePromptAddendum=__name(()=>(init_teammatePromptAddendum(),__toCommonJS(teammatePromptAddendum_exports)),"getTeammatePromptAddendum"),getTeammateModeSnapshot=__name(()=>(init_teammateModeSnapshot(),__toCommonJS(teammateModeSnapshot_exports)),"getTeammateModeSnapshot"),coordinatorModeModule=null,autoModeStateModule6=(init_autoModeState(),__toCommonJS(autoModeState_exports));profileCheckpoint("main_tsx_imports_loaded");__name(resolveAndBuildImportSessionSeed,"resolveAndBuildImportSessionSeed");__name(isBeingDebugged,"isBeingDebugged");isBeingDebugged()&&process.exit(1);__name(runMigrations,"runMigrations");_pendingAssistantChat=feature("KAIROS")?{sessionId:void 0,discover:!1}:void 0;__name(main,"main");__name(getInputPrompt,"getInputPrompt");__name(run2,"run");__name(logTenguInit,"logTenguInit")}});process.env.COREPACK_ENABLE_AUTO_PIN="0";async function main2(){let args=process.argv.slice(2);if(args.length===1&&(args[0]==="--version"||args[0]==="-v"||args[0]==="-V")){console.log("13.9.2 (Clavue)");return}let{nodePreflightMessage:nodePreflightMessage2,nodePreflightShouldExit:nodePreflightShouldExit2}=await Promise.resolve().then(()=>(init_nodePreflight(),nodePreflight_exports));nodePreflightShouldExit2()&&(process.stderr.write(nodePreflightMessage2(process.versions.node)),process.exit(1));let{feature:feature2}=await Promise.resolve().then(()=>(init_featureFlags(),featureFlags_exports)),{normalizeClavueBrandEnv:normalizeClavueBrandEnv2}=await Promise.resolve().then(()=>(init_clavueEnv(),clavueEnv_exports));normalizeClavueBrandEnv2();let{applyNormalizedArgv:applyNormalizedArgv2}=await Promise.resolve().then(()=>(init_launchFlags(),launchFlags_exports));process.argv=applyNormalizedArgv2(process.argv),args=process.argv.slice(2);let{reexecWithLargerHeapIfNeeded:reexecWithLargerHeapIfNeeded2}=await Promise.resolve().then(()=>(init_nodeHeapBootstrap(),nodeHeapBootstrap_exports));if(reexecWithLargerHeapIfNeeded2({args}))return;{let{dispatchTerminalCitizenCli:dispatchTerminalCitizenCli2}=await Promise.resolve().then(()=>(init_terminalCitizen(),terminalCitizen_exports)),citizen=await dispatchTerminalCitizenCli2(args);citizen.kind==="exit"&&process.exit(citizen.code),args=citizen.argv,process.argv=[process.argv[0],process.argv[1],...args]}if(args[0]==="agent"){let{rewriteAgentAliasArgv:rewriteAgentAliasArgv2}=await Promise.resolve().then(()=>(init_agentAlias(),agentAlias_exports)),rewrite=rewriteAgentAliasArgv2(args);rewrite?.kind==="help"&&(process.stdout.write(rewrite.text.endsWith(`
12545
12545
  `)?rewrite.text:`${rewrite.text}
12546
12546
  `),process.exit(0)),rewrite&&(args=rewrite.argv,process.argv=[process.argv[0],process.argv[1],...args])}if(args[0]==="acp"&&args[1]==="connect"){let{enableConfigs:enableConfigs2}=await Promise.resolve().then(()=>(init_config12(),config_exports4));enableConfigs2();let{runAcpConnectCli:runAcpConnectCli2}=await Promise.resolve().then(()=>(init_acpClient(),acpClient_exports)),code=await runAcpConnectCli2(args.slice(2));process.exit(code)}if(args[0]==="acp"||args[0]==="--acp"){let{runAcpStdioServer:runAcpStdioServer2}=await Promise.resolve().then(()=>(init_acpStdio(),acpStdio_exports)),execute=args.includes("--execute")||args.includes("--acp-execute")||/^(1|true|yes|on)$/i.test(process.env.CLAVUE_ACP_EXECUTE??""),executeMode=args.includes("--subprocess")?"subprocess":args.includes("--inprocess")?"inprocess":void 0;await runAcpStdioServer2({execute,...executeMode?{executeMode}:{}}),process.exit(0)}if(args[0]==="tui"||args[0]==="grok-tui"){try{process.stderr.write('[clavue] opt-in Grok substrate (`clavue tui`)\n Welcome / upgrade copy may still say "Grok Build".\n Clavue home \xB7 version \xB7 changelog: bare `clavue` (native pager).\n')}catch{}let{runGrokTuiCli:runGrokTuiCli2}=await Promise.resolve().then(()=>(init_grokTuiCli(),grokTuiCli_exports)),code=await runGrokTuiCli2(args.slice(1));process.exit(code)}if(args[0]==="pager"||args[0]==="ui-pager"){let{enableConfigs:enableConfigs2}=await Promise.resolve().then(()=>(init_config12(),config_exports4));enableConfigs2();let{runPagerCli:runPagerCli2}=await Promise.resolve().then(()=>(init_pagerCli(),pagerCli_exports)),code=await runPagerCli2(args.slice(1));process.exit(code)}{let{shouldLaunchNativePagerInteractive:shouldLaunchNativePagerInteractive2}=await Promise.resolve().then(()=>(init_uiMode(),uiMode_exports)),decision=shouldLaunchNativePagerInteractive2({argv:args});if(decision.deprecatedInkFlag)try{process.stderr.write(`[clavue] note: --ui=ink / CLAVUE_UI=ink are removed; using native pager.
12547
12547
  `)}catch{}if(decision.launchGrokTui)try{process.stderr.write(`[clavue] opt-in Grok substrate (${decision.reason})