@sma1lboy/kobe 0.8.51 → 0.8.52

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/index.js CHANGED
@@ -261,7 +261,7 @@ ${G}`,X);this.line=Z,this.column=J,this.codeblock=G}}});function sF($,X){let Z=$
261
261
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
262
262
  */});function XL($,X){return`${$}.${X}`}function $Z($=process.platform){if($==="darwin")return"macos";if($==="linux")return"linux";if($==="win32")return"windows";return}function f9($,X,Z){let J=$.platforms??X.platforms;if(!J)return!0;return Z!==void 0&&J.includes(Z)}function v2($){throw new ax(`kobe-plugin.toml: ${$}`)}function F2($,X){if(typeof $!=="string"||$.length===0)v2(`\`${X}\` must be a non-empty string`);return $}function EK($,X){if(!Array.isArray($)||$.length===0||!$.every((Z)=>typeof Z==="string"&&Z.length>0))v2(`\`${X}\` must be a non-empty array of strings (argv form)`);return $}function yW($,X){if($===void 0)return;if(!Array.isArray($)||!$.every((Z)=>ix.includes(Z)))v2(`\`${X}\` must be an array drawn from ${ix.join(", ")}`);return $}function Ez($,X){if($===void 0)return[];if(!Array.isArray($)||!$.every((Z)=>typeof Z==="object"&&Z!==null&&!Array.isArray(Z)))v2(`\`[[${X}]]\` must be an array of tables`);return $}function m2($){let X;try{X=pA($)}catch(I){v2(`invalid TOML \u2014 ${I instanceof Error?I.message:String(I)}`)}let Z=[],J=F2(X.id,"id");if(!u$0.test(J))v2(`plugin id \`${J}\` may use ASCII letters, digits, dot, colon, underscore, hyphen`);let G=F2(X.name,"name"),Y=F2(X.version,"version"),W=F2(X.min_kobe_version,"min_kobe_version"),H=X.description===void 0?void 0:F2(X.description,"description"),U=yW(X.platforms,"platforms");if(!U)Z.push("no top-level `platforms` declared; assuming the plugin runs everywhere");let B=Ez(X.build,"build").map((I,P)=>({command:EK(I.command,`build[${P}].command`),platforms:yW(I.platforms,`build[${P}].platforms`)})),M=Ez(X.startup,"startup").map((I,P)=>({command:EK(I.command,`startup[${P}].command`),platforms:yW(I.platforms,`startup[${P}].platforms`)})),O=Ez(X.actions,"actions").map((I,P)=>{let T=F2(I.id,`actions[${P}].id`);if(!ox.test(T))v2(`action id \`${T}\` may not contain dots`);return{id:T,title:F2(I.title,`actions[${P}].title`),command:EK(I.command,`actions[${P}].command`),platforms:yW(I.platforms,`actions[${P}].platforms`)}}),F=new Set;for(let I of O){if(F.has(I.id))v2(`duplicate action id \`${I.id}\``);F.add(I.id)}let _=Ez(X.panes,"panes").map((I,P)=>{let T=F2(I.id,`panes[${P}].id`);if(!ox.test(T))v2(`pane id \`${T}\` may not contain dots`);if(I.placement!==void 0&&I.placement!=="tab"&&I.placement!=="split")Z.push(`pane \`${T}\` placement \`${String(I.placement)}\` is not supported yet; opening as a split`);return{id:T,title:F2(I.title,`panes[${P}].title`),placement:I.placement==="tab"?"tab":"split",command:EK(I.command,`panes[${P}].command`),platforms:yW(I.platforms,`panes[${P}].platforms`)}}),S=new Set;for(let I of _){if(S.has(I.id))v2(`duplicate pane id \`${I.id}\``);S.add(I.id)}let A=Ez(X.events,"events").flatMap((I,P)=>{let T=F2(I.on,`events[${P}].on`),g={on:T,command:EK(I.command,`events[${P}].command`),platforms:yW(I.platforms,`events[${P}].platforms`)};if(!Ox.includes(T))Z.push(`unknown event \`${T}\`; this hook will never fire on this kobe version`);return[g]}),V=Ez(X.settings,"settings").map((I,P)=>{let T=F2(I.type,`settings[${P}].type`);if(T!=="string"&&T!=="number"&&T!=="boolean"&&T!=="enum")v2(`settings[${P}].type must be string | number | boolean | enum`);let g=I.options===void 0?void 0:Array.isArray(I.options)&&I.options.every((f)=>typeof f==="string"&&f.length>0)?I.options:v2(`settings[${P}].options must be an array of strings`);if(T==="enum"&&(!g||g.length===0))v2(`settings[${P}] enum needs \`options\``);return{key:F2(I.key,`settings[${P}].key`),label:F2(I.label,`settings[${P}].label`),type:T,...g?{options:g}:{},...I.default===void 0?{}:{default:F2(I.default,`settings[${P}].default`)}}}),k=Ez(X.file_handlers,"file_handlers").map((I,P)=>{let T=F2(I.pattern,`file_handlers[${P}].pattern`);try{new RegExp(T)}catch{v2(`file_handlers[${P}].pattern is not a valid regex`)}let g=F2(I.action,`file_handlers[${P}].action`);if(!O.some((f)=>f.id===g))v2(`file_handlers[${P}] names unknown action \`${g}\``);return{pattern:T,action:g}});return{manifest:{id:J,name:G,version:Y,minKobeVersion:W,description:H,platforms:U,build:B,startup:M,actions:O,events:A,panes:_,settings:V,fileHandlers:k},warnings:Z}}var ix,L2="kobe-plugin.toml",u$0,ox,ax;var hJ=i(()=>{DA();nx();ix=["macos","linux","windows"],u$0=/^[A-Za-z0-9][A-Za-z0-9._:-]*$/,ox=/^[A-Za-z0-9][A-Za-z0-9_:-]*$/;ax=class ax extends Error{}});import{mkdirSync as c$0,readFileSync as d$0,writeFileSync as l$0}from"fs";import{dirname as p$0}from"path";function O$($){let X;try{X=d$0(TK($),"utf8")}catch{return nA}try{let Z=JSON.parse(X);if(!Array.isArray(Z.plugins))return nA;return{plugins:Z.plugins.filter(n$0)}}catch{return nA}}function n$0($){if(typeof $!=="object"||$===null)return!1;let X=$,Z=X.source;return typeof X.id==="string"&&typeof X.root==="string"&&typeof X.enabled==="boolean"&&typeof X.version==="string"&&typeof X.installedAt==="number"&&typeof Z==="object"&&Z!==null&&(Z.kind==="link"||Z.kind==="github"&&typeof Z.spec==="string")}function b9($,X){let Z=TK(X);c$0(p$0(Z),{recursive:!0}),l$0(Z,`${JSON.stringify($,null,2)}
263
263
  `)}function rx($,X){return{plugins:[...$.plugins.filter((Z)=>Z.id!==X.id),X]}}function wK($,X){return{plugins:$.plugins.filter((Z)=>Z.id!==X)}}var nA;var XZ=i(()=>{w9();nA={plugins:[]}});import{spawn as i$0}from"child_process";import{appendFileSync as o$0,mkdirSync as iA,readFileSync as a$0,watch as r$0}from"fs";import{dirname as sx}from"path";function t$0($,X){let Z=new ex(X);return $.onPublish((J)=>Z.handleChannel(J)),Z.start(),Z}function tx($,X,Z,J){if(!X.plugins)return null;return t$0($,{homeDir:X.homeDir,socketPath:Z,binPath:X.plugins.binPath,log:J})}class ex{opts;reducer=new hA;plugins=[];watcher;reloadTimer;stopped=!1;constructor($){this.opts=$}start(){this.plugins=this.loadPlugins();for(let $ of this.plugins)for(let[X,Z]of $.manifest.startup.entries()){if(!f9(Z,$.manifest,$Z()))continue;this.run($,Z,"startup",{KOBE_PLUGIN_EVENT:"startup"},`startup[${X}]`)}this.watchRegistry()}stop(){if(this.stopped=!0,this.reloadTimer)clearTimeout(this.reloadTimer);this.watcher?.close()}handleChannel($){if(this.stopped)return;for(let X of this.reducer.reduce($))this.dispatch(X)}handleUiReport($){if(this.stopped)return;this.dispatch({event:$.kind,...$.taskId?{taskId:$.taskId,task:this.reducer.contextFor($.taskId)}:{},...$.detail?{detail:$.detail}:{},at:Date.now()})}handleEngineReport($){if(this.stopped)return;let X=kx($.kind,$.detail);if(!X)return;this.dispatch({event:X,taskId:$.taskId,task:this.reducer.contextFor($.taskId),...$.vendor?{vendor:$.vendor}:{},...$.tabId?{tabId:$.tabId}:{},...$.sessionId?{sessionId:$.sessionId}:{},...$.detail?{detail:$.detail}:{},at:Date.now()})}dispatch($){let X=$Z();for(let Z of this.plugins)for(let J of Z.manifest.events){if(J.on!==$.event)continue;if(!f9(J,Z.manifest,X))continue;this.run(Z,J,"event",{KOBE_PLUGIN_EVENT:$.event,KOBE_PLUGIN_EVENT_JSON:JSON.stringify($),...$.taskId?{KOBE_PLUGIN_TASK_ID:$.taskId}:{},...$.task?.title?{KOBE_PLUGIN_TASK_TITLE:$.task.title}:{}},J.on)}}loadPlugins(){let $=O$(this.opts.homeDir),X=$Z(),Z=[];for(let J of $.plugins){if(!J.enabled)continue;let G;try{let Y=a$0(`${J.root}/${L2}`,"utf8");G=m2(Y).manifest}catch(Y){this.opts.log?.(`plugin ${J.id}: manifest unreadable, skipping \u2014 ${String(Y)}`);continue}if(!f9({},G,X))continue;Z.push({manifest:G,root:J.root})}return Z}watchRegistry(){let $=TK(this.opts.homeDir);try{iA(sx($),{recursive:!0}),this.watcher=r$0(sx($),(X,Z)=>{if(Z&&Z!=="plugins.json")return;if(this.reloadTimer)clearTimeout(this.reloadTimer);this.reloadTimer=setTimeout(()=>{if(this.stopped)return;this.plugins=this.loadPlugins(),this.opts.log?.(`plugin registry reloaded (${this.plugins.length} enabled)`)},s$0)})}catch(X){this.opts.log?.(`plugin registry watch failed \u2014 ${String(X)}`)}}async run($,X,Z,J,G){let Y=$.manifest.id,W=Date.now();iA(t8(Y,this.opts.homeDir),{recursive:!0}),iA(vJ(Y,this.opts.homeDir),{recursive:!0});let H=null,U="",B="",M;await new Promise((F)=>{let[_,...S]=X.command,A=i$0(_,S,{cwd:$.root,env:bW({homeDir:this.opts.homeDir,socketPath:this.opts.socketPath,binPath:this.opts.binPath,pluginId:$.manifest.id,pluginRoot:$.root,extra:J}),stdio:["ignore","pipe","pipe"]});A.stdout.on("data",(V)=>{if(U.length<ZL)U+=V.toString().slice(0,ZL-U.length)}),A.stderr.on("data",(V)=>{if(B.length<ZL)B+=V.toString().slice(0,ZL-B.length)}),A.on("error",(V)=>{M=String(V),F()}),A.on("close",(V)=>{H=V,F()})});let O={at:W,kind:Z,label:G,command:X.command,exitCode:H,durationMs:Date.now()-W,...U?{stdout:U}:{},...B?{stderr:B}:{},...M?{spawnError:M}:{}};try{o$0(fW(Y,this.opts.homeDir),`${JSON.stringify(O)}
264
- `)}catch{}if(M||H!==null&&H!==0)this.opts.log?.(`plugin ${Y} ${G}: ${M??`exit ${H}`}`)}}var ZL=8192,s$0=150;var $f=i(()=>{rF();vx();hJ();w9();XZ()});async function Xf($,X,Z){let J=$.getTask(Z);if(!J?.worktreePath)return;let G=J.vendor??X.defaultTaskVendor,Y=X.createEngineTurnDetector(G);if(!Y?.supportsCompletionMarkers()){let U=await X.latestTranscriptMtime(G,J.worktreePath);return U>0?{mtimeMs:U}:{}}let{marker:W,mtimeMs:H}=await Y.latestActivity(J.worktreePath);return{...H>0?{mtimeMs:H}:{},...W?{completedAt:W.timestampMs}:{}}}function e$0($,X,Z){switch(X){case"session-start":case"session-end":case"turn-interrupted":return"idle";case"turn-start":return"running";case"turn-complete":return $==="running"||$==="permission_needed"?"turn_complete":$??"idle";case"turn-failed":return Z?.failure==="rate_limit"||Z?.failure==="billing"?"rate_limited":"error";case"awaiting-input":return"permission_needed";default:return $??"idle"}}function $70(){let $=process.env.KOBE_ENGINE_STATE_TTL_MS;if($===void 0)return Zf;let X=Number($);return Number.isFinite(X)&&X>0?X:Zf}class oA{bus;staleMs;now;livenessAt;activity=new Map;tabActivity=new Map;constructor($,X=$70(),Z=()=>Date.now(),J=()=>Promise.resolve(void 0)){this.bus=$;this.staleMs=X;this.now=Z;this.livenessAt=J}report($,X,Z,J,G){let Y=this.activity.get($);if(Y?.lapse)clearTimeout(Y.lapse);let W=e$0(Y?.state,X,Z),H=this.now(),U={state:W,detail:Z,at:H,session:G??Y?.session};if(W!=="idle"&&!Jf.has(W))U.lapse=this.armLapse($,H);if(this.activity.set($,U),J){let B=this.tabActivity.get($)??new Map,M=B.get(J);if(M?.lapse)clearTimeout(M.lapse);if(W==="idle")B.delete(J);else{let O={state:W,detail:Z,at:H,session:G??M?.session};if(!Jf.has(W))O.lapse=this.armTabLapse($,J,H);B.set(J,O)}if(B.size>0)this.tabActivity.set($,B);else this.tabActivity.delete($)}this.bus.publish("engine-state",this.payload($,U,J))}async probe($){try{return await this.livenessAt($)}catch{return}}stillWorking($,X){if(!$)return!1;if($.completedAt!==void 0&&$.completedAt>=X)return!1;return $.mtimeMs!==void 0&&$.mtimeMs>this.now()-this.staleMs}armLapse($,X){let Z=setTimeout(()=>{this.handleLapse($,X)},this.staleMs);return Z.unref?.(),Z}armTabLapse($,X,Z){let J=setTimeout(()=>{this.handleTabLapse($,X,Z)},this.staleMs);return J.unref?.(),J}async handleTabLapse($,X,Z){let J=this.tabActivity.get($)?.get(X);if(!J||J.at!==Z)return;let G=await this.probe($),Y=this.tabActivity.get($),W=Y?.get(X);if(!Y||!W||W.at!==Z)return;if(this.stillWorking(G,Z)){W.lapse=this.armTabLapse($,X,Z);return}if(Y.delete(X),Y.size===0)this.tabActivity.delete($);this.bus.publish("engine-state",{taskId:$,tabId:X,state:"idle",at:this.now()})}async handleLapse($,X){let Z=this.activity.get($);if(!Z||Z.at!==X)return;let J=await this.probe($),G=this.activity.get($);if(!G||G.at!==X)return;if(this.stillWorking(J,X)){G.lapse=this.armLapse($,X);return}this.publishIdle($)}clearTask($){let X=this.activity.get($);if(X?.lapse)clearTimeout(X.lapse);this.activity.delete($);let Z=this.tabActivity.get($);if(this.tabActivity.delete($),Z)for(let[J,G]of Z){if(G.lapse)clearTimeout(G.lapse);this.bus.publish("engine-state",{taskId:$,tabId:J,state:"idle",at:this.now()})}if(X)this.bus.publish("engine-state",{taskId:$,state:"idle",at:this.now()})}snapshotByTask(){let $={};for(let[X,Z]of this.activity)$[X]=this.payload(X,Z);return $}currentNonIdle(){let $=[];for(let[X,Z]of this.activity)if(Z.state!=="idle")$.push(this.payload(X,Z));for(let[X,Z]of this.tabActivity)for(let[J,G]of Z)$.push(this.payload(X,G,J));return $}close(){for(let $ of this.activity.values())if($.lapse)clearTimeout($.lapse);for(let $ of this.tabActivity.values())for(let X of $.values())if(X.lapse)clearTimeout(X.lapse);this.activity.clear(),this.tabActivity.clear()}publishIdle($){let X={state:"idle",at:this.now()};this.activity.set($,X),this.bus.publish("engine-state",this.payload($,X))}payload($,X,Z){return{taskId:$,...Z?{tabId:Z}:{},state:X.state,...X.detail?{detail:X.detail}:{},...X.session?{sessionId:X.session.id}:{},...X.session?.transcriptPath?{transcriptPath:X.session.transcriptPath}:{},at:X.at}}}var Zf=600000,Jf;var Qf=i(()=>{Jf=new Set(["turn_complete","permission_needed","error","rate_limited"])});function Gf($){if($ instanceof Error)return $;let X;try{X=typeof $==="string"?$:JSON.stringify($)}catch{X=String($)}return Error(X)}function zf($,X,Z=new Date){let J=Gf(X);return`[${Z.toISOString()}] daemon ${$}: ${J.stack??`${J.name}: ${J.message}`}
264
+ `)}catch{}if(M||H!==null&&H!==0)this.opts.log?.(`plugin ${Y} ${G}: ${M??`exit ${H}`}`)}}var ZL=8192,s$0=150;var $f=i(()=>{rF();vx();hJ();w9();XZ()});async function Xf($,X,Z){let J=$.getTask(Z);if(!J?.worktreePath)return;let G=J.vendor??X.defaultTaskVendor,Y=X.createEngineTurnDetector(G);if(!Y?.supportsCompletionMarkers()){let U=await X.latestTranscriptMtime(G,J.worktreePath);return U>0?{mtimeMs:U}:{}}let{marker:W,mtimeMs:H}=await Y.latestActivity(J.worktreePath);return{...H>0?{mtimeMs:H}:{},...W?{completedAt:W.timestampMs}:{}}}function e$0($,X,Z){switch(X){case"session-start":case"session-end":case"turn-interrupted":return"idle";case"turn-start":return"running";case"turn-complete":return $==="running"||$==="permission_needed"?"turn_complete":$??"idle";case"turn-failed":return Z?.failure==="rate_limit"||Z?.failure==="billing"?"rate_limited":"error";case"awaiting-input":return"permission_needed";default:return $??"idle"}}function $70(){let $=process.env.KOBE_ENGINE_STATE_TTL_MS;if($===void 0)return Zf;let X=Number($);return Number.isFinite(X)&&X>0?X:Zf}class oA{bus;staleMs;now;livenessAt;activity=new Map;tabActivity=new Map;constructor($,X=$70(),Z=()=>Date.now(),J=()=>Promise.resolve(void 0)){this.bus=$;this.staleMs=X;this.now=Z;this.livenessAt=J}report($,X,Z,J,G){let Y=this.activity.get($);if(Y?.lapse)clearTimeout(Y.lapse);let W=e$0(Y?.state,X,Z),H=this.now(),U={state:W,detail:Z,at:H,session:G??Y?.session};if(W!=="idle"&&!Jf.has(W))U.lapse=this.armLapse($,H);this.activity.set($,U);let B=U;if(J){let M=this.tabActivity.get($)??new Map,O=M.get(J);if(O?.lapse)clearTimeout(O.lapse);let F=G??O?.session;if(B={state:W,detail:Z,at:H,session:F},W==="idle")M.delete(J);else{let _={state:W,detail:Z,at:H,session:F};if(!Jf.has(W))_.lapse=this.armTabLapse($,J,H);M.set(J,_)}if(M.size>0)this.tabActivity.set($,M);else this.tabActivity.delete($)}this.bus.publish("engine-state",this.payload($,B,J))}async probe($){try{return await this.livenessAt($)}catch{return}}stillWorking($,X){if(!$)return!1;if($.completedAt!==void 0&&$.completedAt>=X)return!1;return $.mtimeMs!==void 0&&$.mtimeMs>this.now()-this.staleMs}armLapse($,X){let Z=setTimeout(()=>{this.handleLapse($,X)},this.staleMs);return Z.unref?.(),Z}armTabLapse($,X,Z){let J=setTimeout(()=>{this.handleTabLapse($,X,Z)},this.staleMs);return J.unref?.(),J}async handleTabLapse($,X,Z){let J=this.tabActivity.get($)?.get(X);if(!J||J.at!==Z)return;let G=await this.probe($),Y=this.tabActivity.get($),W=Y?.get(X);if(!Y||!W||W.at!==Z)return;if(this.stillWorking(G,Z)){W.lapse=this.armTabLapse($,X,Z);return}if(Y.delete(X),Y.size===0)this.tabActivity.delete($);this.bus.publish("engine-state",{taskId:$,tabId:X,state:"idle",at:this.now()})}async handleLapse($,X){let Z=this.activity.get($);if(!Z||Z.at!==X)return;let J=await this.probe($),G=this.activity.get($);if(!G||G.at!==X)return;if(this.stillWorking(J,X)){G.lapse=this.armLapse($,X);return}this.publishIdle($)}clearTask($){let X=this.activity.get($);if(X?.lapse)clearTimeout(X.lapse);this.activity.delete($);let Z=this.tabActivity.get($);if(this.tabActivity.delete($),Z)for(let[J,G]of Z){if(G.lapse)clearTimeout(G.lapse);this.bus.publish("engine-state",{taskId:$,tabId:J,state:"idle",at:this.now()})}if(X)this.bus.publish("engine-state",{taskId:$,state:"idle",at:this.now()})}snapshotByTask(){let $={};for(let[X,Z]of this.activity)$[X]=this.payload(X,Z);return $}currentNonIdle(){let $=[];for(let[X,Z]of this.activity)if(Z.state!=="idle")$.push(this.payload(X,Z));for(let[X,Z]of this.tabActivity)for(let[J,G]of Z)$.push(this.payload(X,G,J));return $}close(){for(let $ of this.activity.values())if($.lapse)clearTimeout($.lapse);for(let $ of this.tabActivity.values())for(let X of $.values())if(X.lapse)clearTimeout(X.lapse);this.activity.clear(),this.tabActivity.clear()}publishIdle($){let X={state:"idle",at:this.now()};this.activity.set($,X),this.bus.publish("engine-state",this.payload($,X))}payload($,X,Z){return{taskId:$,...Z?{tabId:Z}:{},state:X.state,...X.detail?{detail:X.detail}:{},...X.session?{sessionId:X.session.id}:{},...X.session?.transcriptPath?{transcriptPath:X.session.transcriptPath}:{},at:X.at}}}var Zf=600000,Jf;var Qf=i(()=>{Jf=new Set(["turn_complete","permission_needed","error","rate_limited"])});function Gf($){if($ instanceof Error)return $;let X;try{X=typeof $==="string"?$:JSON.stringify($)}catch{X=String($)}return Error(X)}function zf($,X,Z=new Date){let J=Gf(X);return`[${Z.toISOString()}] daemon ${$}: ${J.stack??`${J.name}: ${J.message}`}
265
265
  `}function X70($,X,Z=new Date){let J=Gf(X);return`[${Z.toISOString()}] daemon error [${$}]: ${J.stack??`${J.name}: ${J.message}`}
266
266
  `}function X4($,X){process.stderr.write(X70($,X))}function Z70($,X,Z=new Date){return`[${Z.toISOString()}] daemon [${$}]: ${X}
267
267
  `}function K7($,X){process.stderr.write(Z70($,X))}function JL($=(X)=>process.stderr.write(X)){if(aA||rA)return;aA=(X)=>$(zf("unhandledRejection",X)),rA=(X)=>$(zf("uncaughtException",X)),process.on("unhandledRejection",aA),process.on("uncaughtException",rA)}var aA,rA;import{randomUUID as J70}from"crypto";import{mkdir as Q70,readFile as z70,rename as G70,writeFile as Y70}from"fs/promises";import{homedir as W70}from"os";import{dirname as H70,join as q70}from"path";function Wf($=process.env.KOBE_HOME_DIR??W70()){return q70($,".kobe","attention-inbox.json")}function U70($,X){if($==="turn-complete")return"turn_complete";if($==="awaiting-input")return"permission_needed";if($!=="turn-failed")return null;return X?.failure==="rate_limit"?"rate_limited":"error"}function K70($){if(!$||typeof $!=="object"||Array.isArray($))return null;let X=$;if(typeof X.taskId!=="string"||X.taskId.length===0)return null;if(X.tabId!==null&&typeof X.tabId!=="string")return null;if(!DK(X.state))return null;if(typeof X.at!=="number"||!Number.isFinite(X.at))return null;return{taskId:X.taskId,tabId:X.tabId,state:X.state,...X.detail?{detail:X.detail}:{},unread:X.unread!==!1,at:X.at}}async function B70($){try{let X=JSON.parse(await z70($,"utf8"));if(!Array.isArray(X.items))return[];return X.items.map(K70).filter((Z)=>Z!==null)}catch(X){if(X.code==="ENOENT")return[];return X4("attention-inbox-load",X),[]}}async function N70($,X){await Q70(H70($),{recursive:!0});let Z=`${$}.tmp-${process.pid}-${J70()}`,J={version:1,items:[...X]};await Y70(Z,`${JSON.stringify(J,null,2)}
@@ -301,7 +301,7 @@ data: ${JSON.stringify(O)}
301
301
  `)){let U=H.trim();if(!U)continue;if(!qZ(U))continue;let B;try{B=JSON.parse(U)}catch{continue}if(!LR(B)||typeof B.type!=="string")continue;let M=typeof B.timestamp==="string"?B.timestamp:new Date().toISOString(),O=LR(B.data)?B.data:{};if(B.type==="session.start"){let F=typeof O.sessionId==="string"?O.sessionId:void 0;if(F)G=F;continue}if(B.type==="user.message"){let F=typeof O.content==="string"?O.content:"";if(!F)continue;if(!W)W=Buffer.from(F.slice(0,rZ0),"utf8").toString("utf8");Z.push({role:"user",blocks:[{type:"text",text:F}],timestamp:M,sessionId:G});continue}if(B.type==="assistant.message"){let F=[],_=typeof O.content==="string"?O.content:"";if(_)F.push({type:"text",text:_});let S=Array.isArray(O.toolRequests)?O.toolRequests:[];for(let A of S){if(!LR(A))continue;let V=typeof A.id==="string"?A.id:typeof A.toolCallId==="string"?A.toolCallId:"tool",k=typeof A.name==="string"?A.name:typeof A.toolName==="string"?A.toolName:"tool";F.push({type:"tool_call",callId:V,name:k,input:A.arguments??{}})}if(F.length>0)Z.push({role:"assistant",blocks:F,timestamp:M,sessionId:G});continue}if(B.type==="tool.execution_start"){let F=typeof O.toolCallId==="string"?O.toolCallId:void 0,_=typeof O.toolName==="string"?O.toolName:"tool";if(F)J.set(F,_);continue}if(B.type==="tool.execution_complete"){let F=typeof O.toolCallId==="string"?O.toolCallId:void 0;if(!F)continue;let _=J.get(F)??(typeof O.toolName==="string"?O.toolName:"tool"),S=O.result??(O.success===!1?{success:!1}:void 0);Z.push({role:"assistant",blocks:[{type:"tool_result",callId:F,output:S,isError:O.success===!1}],timestamp:M,sessionId:G});continue}if(B.type==="session.shutdown")Y=Dv(O)}return{messages:Z,toolNameById:J,sessionId:G,usageMetrics:Y,firstUserMessage:W}}function LR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var hz,oZ0,rZ0=200;var Iv=i(()=>{yz();eL();hz={copilotDir(){let $=process.env.COPILOT_HOME?.trim();if($)return $;return rJ.join(dZ0(),".copilot")},async readdir($){try{return await hZ0($)}catch{return[]}},async readFile($){return await eW($)},stat:cZ0,async rm($){await uZ0($,{recursive:!0,force:!0})}};oZ0=QH({initial:iZ0,parseChunk:($,X)=>aZ0($,X)})});var WO,Sv,Ev;var HO=i(()=>{WO=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Sv=["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],Ev=[...Sv,...[...Sv].reverse()]});import{readFile as wv}from"fs/promises";class qO{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}}function xv($){return d4($).createTurnDetector()}function $J0($,X="claude",Z=0){let J=null,G=0;for(let Y of $.split(`
302
302
  `)){G++;let W=fv(Y);if(!W)continue;let H=CR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=bv(W,Z),B={id:`claude:${X}:${U}:${G}`,timestampMs:U,source:"claude"};if(!J||B.timestampMs>=J.timestampMs)J=B}return J}function ZJ0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let X=CR($.payload)?$.payload:void 0;return typeof X?.type==="string"&&XJ0.has(X.type)}function JJ0($,X="codex"){let Z=null,J=0;for(let G of $.split(`
303
303
  `)){J++;let Y=fv(G);if(!Y||!ZJ0(Y))continue;let W=bv(Y,0),H={id:`codex:${X}:${W}:${J}`,timestampMs:W,source:"codex"};if(!Z||H.timestampMs>=Z.timestampMs)Z=H}return Z}function fv($){let X=$.trim();if(!X)return null;try{let Z=JSON.parse(X);return CR(Z)?Z:null}catch{return null}}function bv($,X){let Z=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(Z)?Z:X}function CR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var tZ0,_R,eZ0,VR,zB,XJ0;var AR=i(()=>{$R();zO();j2();tZ0={listSessionFiles:($)=>zH($),readFile:($)=>wv($,"utf8")};_R=class _R extends qO{deps;vendor="claude";cache=new Map;constructor($=tZ0){super();this.deps=$}async latestActivity($){let X=await this.deps.listSessionFiles($),Z=X[0]?.mtimeMs??0,J=null,G=new Map;for(let Y of X.slice(0,4)){let W=this.cache.get(Y.path),H;if(W&&Y.mtimeMs>0&&W.mtimeMs===Y.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(Y.path).catch(()=>"");H=$J0(U,Y.path,Y.mtimeMs)}if(G.set(Y.path,{mtimeMs:Y.mtimeMs,marker:H}),H&&(!J||H.timestampMs>J.timestampMs))J=H}return this.cache=G,{marker:J,mtimeMs:Z}}};eZ0={findLatestRollout:($)=>MR($),readFile:($)=>wv($,"utf8")};VR=class VR extends qO{deps;vendor="codex";cache=null;constructor($=eZ0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let X=await this.deps.findLatestRollout($);if(!X)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===X.path&&X.mtimeMs>0&&this.cache.mtimeMs===X.mtimeMs)return{marker:this.cache.marker,mtimeMs:X.mtimeMs};let Z=await this.deps.readFile(X.path).catch(()=>"");if(!Z)return{marker:null,mtimeMs:X.mtimeMs};let J=JJ0(Z,X.path);return this.cache={path:X.path,mtimeMs:X.mtimeMs,marker:J},{marker:J,mtimeMs:X.mtimeMs}}};zB=class zB extends qO{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};XJ0=new Set(["task_complete","turn_complete","turn_aborted"])});function YJ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:DR,detectAccount:async()=>({binary:{found:!1,error:"custom engine: kobe has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new GB($),createTurnDetector:()=>new zB($)}}function d4($){return w7($)?gv[$]:YJ0($)}function yv($){return d4($).history!==DR}function kv(){return Object.values(gv).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var DR,QJ0,zJ0,GJ0,gv;var j2=i(()=>{x7();UZ();fk();$R();ok();$v();Jv();zO();_v();Av();Iv();PR();HO();AR();DR={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},QJ0={async listSessionIdsForWorktree($){return[...await zH($)].sort((Z,J)=>Z.mtimeMs-J.mtimeMs).map((Z)=>Z.sessionId)},readHistory:($)=>uk($),async transcriptPath($,X){return(await zH(X)).find((J)=>J.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>hk($)},zJ0={listSessionIdsForWorktree:($)=>Mv($),readHistory:($)=>Lv($),transcriptPath:async($)=>await NR($)??null,latestTranscriptMtimeForWorktree:($)=>Fv($)},GJ0={listSessionIdsForWorktree:($)=>Pv($),readHistory:($)=>Tv($),transcriptPath:async()=>null,latestTranscriptMtimeForWorktree:($)=>Rv($)},gv={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:QJ0,detectAccount:($)=>$H($),createHookAdapter:()=>new JR,createTurnDetector:()=>new _R,capabilities:wk,identity:xk,spinnerFrames:Ev,terminalTitle:{ownsStatus:!0},quotaUsage:()=>ek()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:zJ0,detectAccount:($)=>XH($),createHookAdapter:()=>new FR,createTurnDetector:()=>new VR,capabilities:Xv,identity:Zv,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]']},quotaUsage:()=>Cv()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:GJ0,detectAccount:($)=>ZH($),createHookAdapter:()=>new GB("copilot"),createTurnDetector:()=>new zB("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],history:DR,detectAccount:($)=>sL($),createHookAdapter:()=>new GB("kimi"),createTurnDetector:()=>new zB("kimi")}}});function RR($){return d4($).createHookAdapter()}class GB{vendor;constructor($){this.vendor=$}supportsHooks(){return!1}globalSettingsPath(){return""}activityDetailFromPayload(){return}sessionFromPayload(){return}async installActivityHooks(){}async removeActivityHooks(){}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async installWorktreeWatchHook(){}async removeWorktreeWatchHook(){}}var PR=i(()=>{j2()});function UO($){return WJ0.includes($)}function vv($){return HJ0.includes($)}var WJ0,HJ0;var TR=i(()=>{WJ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end","tool-pre","tool-post","tool-failed","pre-compact","post-compact","subagent-start","subagent-stop"];HJ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var av={};y4(av,{runHookSubcommand:()=>FJ0,readTextWithTimeout:()=>uv,parseWorktreeRemovePath:()=>pv,parseWorktreeAddPath:()=>lv,ensureGlobalKobeHooks:()=>ER});import{readFileSync as qJ0}from"fs";import{homedir as UJ0}from"os";import{join as SR,resolve as IR}from"path";async function uv($,X=KJ0){let Z;try{return await Promise.race([$(),new Promise((J)=>{Z=setTimeout(()=>J(""),X)})])}finally{if(Z!==void 0)clearTimeout(Z)}}async function cv(){try{let $=await uv(()=>Bun.stdin.text());if(!$.trim())return{};let X=JSON.parse($);return X&&typeof X==="object"&&!Array.isArray(X)?X:{}}catch{return{}}}function mv($,X){for(let Z=0;Z<$.length;Z++){if($[Z]===X)return $[Z+1];if($[Z].startsWith(`${X}=`))return $[Z].slice(X.length+1)}return}function NJ0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function dv($){let X=[],Z=/"([^"]*)"|'([^']*)'|(\S+)/g,J;while((J=Z.exec($))!==null)X.push(J[1]??J[2]??J[3]??"");return X}function lv($){let X=dv($),Z=new Set(["-b","-B","--reason"]);for(let J=0;J+1<X.length;J++){if(X[J]!=="worktree"||X[J+1]!=="add")continue;let G=J+2;while(G<X.length){let Y=X[G];if(Y==="&&"||Y==="||"||Y===";"||Y==="|"||Y===">"||Y===">>")break;if(Y.startsWith("-")){G+=Z.has(Y)?2:1;continue}return Y}}return}function pv($){let X=dv($);for(let Z=0;Z+1<X.length;Z++){if(X[Z]!=="worktree"||X[Z+1]!=="remove")continue;let J=Z+2;while(J<X.length){let G=X[J];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){J+=1;continue}return G}}return}async function MJ0(){let $=await cv(),X=NJ0($.tool_input)?$.tool_input:{},Z=typeof X.command==="string"?X.command:"";if(!Z.includes("worktree"))return;let J=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),G=lv(Z),Y=G?void 0:pv(Z);if(!G&&!Y)return;let W=await cJ();if(!W)return;try{if(G)await W.request("worktree.reconcile",{cwd:J,worktreePath:IR(J,G)});else if(Y)await W.request("worktree.archiveRemoved",{worktreePath:IR(J,Y)})}finally{W.close()}}async function FJ0($){let[X,...Z]=$;if(X==="setup"){await _J0(Z);return}if(X===BJ0){try{await MJ0()}catch{}return}try{if(!X||!UO(X))return;let J=await cv(),G=mv(Z,"--task-id"),Y=typeof J.cwd==="string"&&J.cwd?J.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=mv(Z,"--engine"),B=nv().filter((_)=>!U||_.vendor===U),M;for(let _ of B)if(M=_.activityDetailFromPayload(X,J),M)break;let O;for(let _ of B)if(O=_.sessionFromPayload(J),O)break;let F=await cJ();if(!F)return;try{let _=G??W;await F.request("engine.reportEvent",{..._?{taskId:_}:{cwd:Y},kind:X,...U?{engine:U}:{},...H?{tabId:H}:{},...M?{detail:M}:{},...O?{sessionId:O.sessionId}:{},...O?.transcriptPath?{transcriptPath:O.transcriptPath}:{}})}finally{F.close()}}catch(J){if(process.env.KOBE_HOOK_DEBUG)console.error(`[kobe hook] ${X} failed:`,J instanceof Error?J.message:String(J))}}function LJ0(){return F8.map(($)=>RR($)).filter(($)=>$.supportsWorktreeSync())}function nv(){return F8.map(($)=>RR($)).filter(($)=>$.supportsHooks())}function iv(){return SR(UJ0(),".claude","settings.json")}function OJ0($){if(!$||$==="off")return;if($==="global")return iv();if($.startsWith("repo:"))return SR(IR($.slice(5)),".claude","settings.json");return $}async function ER(){try{let $=jJ0();for(let X of nv()){let Z=X.globalSettingsPath();if(!Z)continue;await X.installActivityHooks(Z,{toolEvents:$}),await X.installWorktreeWatchHook(Z)}await ov()}catch{}}function jJ0(){try{for(let $ of O$().plugins){if(!$.enabled)continue;try{let X=qJ0(SR($.root,L2),"utf8");if(m2(X).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function ov(){let $=LJ0();if($.length===0)return;let X=f7(hv),Z=new Set([iv()]),J=OJ0(X);if(J)Z.add(J);for(let G of $)for(let Y of Z)await G.removeWorktreeSyncHook(Y);if(X!=="off")b3(hv,"off")}async function _J0($){await ov(),process.stdout.write(["kobe hook setup is deprecated and now a no-op (cleanup only).","","The old external-worktree sync used a global WorktreeCreate hook, which is","a VCS provider hook \u2014 its presence broke `claude --worktree` / EnterWorktree","in every repo. Any hook kobe previously installed has been removed.","","Sync is now automatic: a `claude --worktree` (or any session) started in a","worktree under a repo kobe already tracks is adopted as a task on launch.","To adopt existing worktrees on demand, use the New Task dialog or `kobe adopt`.",""].join(`
304
- `))}var KJ0=500,BJ0="worktree-created",hv="externalWorktreeSync";var wR=i(()=>{V8();hJ();XZ();PR();TR();h5();x7()});var KO;var rv=i(()=>{KO={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.8.51",description:"TUI orchestrator for Claude Code (codename)",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/index.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/kobe.git"},homepage:"https://github.com/Sma1lboy/kobe#readme",bugs:{url:"https://github.com/Sma1lboy/kobe/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"KOBE_DEV=1 bun --conditions=browser ./src/cli/index.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.12","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var tv={};y4(tv,{repoSlug:()=>uz,releasePageUrl:()=>kR,recommendedGlobalInstallCommand:()=>bR,isNewerSemver:()=>xR,fetchReleaseSummaries:()=>WB,fetchReleaseNotesRange:()=>yR,fetchReleaseNotes:()=>gR,compareSemver:()=>Z3,checkLatestVersion:()=>cz,breakingVersionsCrossed:()=>YB,UPDATE_SCRIPT_URL:()=>BO,UPDATE_COMMAND:()=>u9,PACKAGE_NAME:()=>fR,CURRENT_VERSION:()=>V4,BREAKING_VERSIONS:()=>BZ});function uz(){let $=KO.repository?.url;if(!$)return null;let X=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!X||!X[1]||!X[2])return null;return`${X[1]}/${X[2]}`}function bR(){return`npm install -g ${fR}@latest`}function YB($,X,Z=BZ){let[J,G]=Z3($,X)<=0?[$,X]:[X,$];return Z.filter((Y)=>Z3(Y,J)>0&&Z3(Y,G)<=0)}async function CJ0($){let X=new AbortController,Z=setTimeout(()=>X.abort(),NO);try{let J=$.replace("/","%2F"),G=await fetch(`https://registry.npmjs.org/${J}/latest`,{signal:X.signal,headers:{accept:"application/json"}});if(!G.ok)return null;let Y=await G.json();if(typeof Y.version!=="string")return null;return Y.version}catch{return null}finally{clearTimeout(Z)}}function xR($,X){return Z3($,X)>0}function Z3($,X){let Z=(Y)=>Y.split("-")[0]??Y,J=Z($).split(".").map((Y)=>Number.parseInt(Y,10)),G=Z(X).split(".").map((Y)=>Number.parseInt(Y,10));for(let Y=0;Y<3;Y++){let W=J[Y]??0,H=G[Y]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function cz($={}){let X=process.env.KOBE_FAKE_UPDATE;if(X)return{current:V4,latest:X,hasUpdate:xR(X,V4)};if(TW()&&!$.force)return null;let Z=await CJ0(fR);if(!Z)return null;return{current:V4,latest:Z,hasUpdate:xR(Z,V4)}}function sv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function gR($){let X=uz();if(!X)return null;let Z=`v${$}`,J=new AbortController,G=setTimeout(()=>J.abort(),NO);try{let Y=await fetch(`https://api.github.com/repos/${X}/releases/tags/${Z}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!Y.ok)return null;let W=await Y.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(G)}}async function yR($){let X=uz();if(!X)return[];let Z=$.limit??100,J=new AbortController,G=setTimeout(()=>J.abort(),NO);try{let Y=await fetch(`https://api.github.com/repos/${X}/releases?per_page=${Z}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!Y.ok)return[];let W=await Y.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=sv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(Z3(U,$.current)<=0)return null;if(Z3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(G)}}async function WB($=12){let X=uz();if(!X)return[];let Z=new AbortController,J=setTimeout(()=>Z.abort(),NO);try{let G=await fetch(`https://api.github.com/repos/${X}/releases?per_page=${$}`,{signal:Z.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let Y=await G.json();if(!Array.isArray(Y))return[];return Y.map((W)=>{let H=sv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(J)}}function kR($){let X=uz();if(!X)return null;return`https://github.com/${X}/releases/tag/v${$}`}var V4,fR,BO="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",u9,BZ,NO=3000;var D8=i(()=>{rv();T$();V4=KO.version,fR=KO.name;u9=`curl -fsSL ${BO} | sh`;BZ=[]});var $m={};y4($m,{stampResetGate:()=>MO,resetGateBlockers:()=>ev,enforceResetGate:()=>mR,LAST_RUN_VERSION_KEY:()=>vR});function ev($,X=V4,Z=BZ){if(typeof $!=="string"||$.length===0)return[];let[J,G]=Z3($,X)<=0?[$,X]:[X,$];return Z.filter((Y)=>Z3(Y,J)>0&&Z3(Y,G)<=0)}function mR(){let $=i5()[vR],X=ev($);if(X.length>0){let Z=typeof $==="string"?$:"unknown";console.error([`kobe ${V4}: cannot start \u2014 version ${X.join(", ")} introduced breaking changes`,`(last run: ${Z}). Your daemon/session state may be incompatible.`,"","Run:"," kobe reset # stop daemon + PTY host + sessions (tasks kept)"," kobe reset --hard # additionally wipe the task index + UI state","","Then relaunch kobe. Worktrees are never touched."].join(`
304
+ `))}var KJ0=500,BJ0="worktree-created",hv="externalWorktreeSync";var wR=i(()=>{V8();hJ();XZ();PR();TR();h5();x7()});var KO;var rv=i(()=>{KO={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/kobe",version:"0.8.52",description:"TUI orchestrator for Claude Code (codename)",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/index.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/kobe.git"},homepage:"https://github.com/Sma1lboy/kobe#readme",bugs:{url:"https://github.com/Sma1lboy/kobe/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"KOBE_DEV=1 bun --conditions=browser ./src/cli/index.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.12","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var tv={};y4(tv,{repoSlug:()=>uz,releasePageUrl:()=>kR,recommendedGlobalInstallCommand:()=>bR,isNewerSemver:()=>xR,fetchReleaseSummaries:()=>WB,fetchReleaseNotesRange:()=>yR,fetchReleaseNotes:()=>gR,compareSemver:()=>Z3,checkLatestVersion:()=>cz,breakingVersionsCrossed:()=>YB,UPDATE_SCRIPT_URL:()=>BO,UPDATE_COMMAND:()=>u9,PACKAGE_NAME:()=>fR,CURRENT_VERSION:()=>V4,BREAKING_VERSIONS:()=>BZ});function uz(){let $=KO.repository?.url;if(!$)return null;let X=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!X||!X[1]||!X[2])return null;return`${X[1]}/${X[2]}`}function bR(){return`npm install -g ${fR}@latest`}function YB($,X,Z=BZ){let[J,G]=Z3($,X)<=0?[$,X]:[X,$];return Z.filter((Y)=>Z3(Y,J)>0&&Z3(Y,G)<=0)}async function CJ0($){let X=new AbortController,Z=setTimeout(()=>X.abort(),NO);try{let J=$.replace("/","%2F"),G=await fetch(`https://registry.npmjs.org/${J}/latest`,{signal:X.signal,headers:{accept:"application/json"}});if(!G.ok)return null;let Y=await G.json();if(typeof Y.version!=="string")return null;return Y.version}catch{return null}finally{clearTimeout(Z)}}function xR($,X){return Z3($,X)>0}function Z3($,X){let Z=(Y)=>Y.split("-")[0]??Y,J=Z($).split(".").map((Y)=>Number.parseInt(Y,10)),G=Z(X).split(".").map((Y)=>Number.parseInt(Y,10));for(let Y=0;Y<3;Y++){let W=J[Y]??0,H=G[Y]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function cz($={}){let X=process.env.KOBE_FAKE_UPDATE;if(X)return{current:V4,latest:X,hasUpdate:xR(X,V4)};if(TW()&&!$.force)return null;let Z=await CJ0(fR);if(!Z)return null;return{current:V4,latest:Z,hasUpdate:xR(Z,V4)}}function sv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function gR($){let X=uz();if(!X)return null;let Z=`v${$}`,J=new AbortController,G=setTimeout(()=>J.abort(),NO);try{let Y=await fetch(`https://api.github.com/repos/${X}/releases/tags/${Z}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!Y.ok)return null;let W=await Y.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(G)}}async function yR($){let X=uz();if(!X)return[];let Z=$.limit??100,J=new AbortController,G=setTimeout(()=>J.abort(),NO);try{let Y=await fetch(`https://api.github.com/repos/${X}/releases?per_page=${Z}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!Y.ok)return[];let W=await Y.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=sv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(Z3(U,$.current)<=0)return null;if(Z3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(G)}}async function WB($=12){let X=uz();if(!X)return[];let Z=new AbortController,J=setTimeout(()=>Z.abort(),NO);try{let G=await fetch(`https://api.github.com/repos/${X}/releases?per_page=${$}`,{signal:Z.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let Y=await G.json();if(!Array.isArray(Y))return[];return Y.map((W)=>{let H=sv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(J)}}function kR($){let X=uz();if(!X)return null;return`https://github.com/${X}/releases/tag/v${$}`}var V4,fR,BO="https://raw.githubusercontent.com/Sma1lboy/kobe/main/scripts/update.sh",u9,BZ,NO=3000;var D8=i(()=>{rv();T$();V4=KO.version,fR=KO.name;u9=`curl -fsSL ${BO} | sh`;BZ=[]});var $m={};y4($m,{stampResetGate:()=>MO,resetGateBlockers:()=>ev,enforceResetGate:()=>mR,LAST_RUN_VERSION_KEY:()=>vR});function ev($,X=V4,Z=BZ){if(typeof $!=="string"||$.length===0)return[];let[J,G]=Z3($,X)<=0?[$,X]:[X,$];return Z.filter((Y)=>Z3(Y,J)>0&&Z3(Y,G)<=0)}function mR(){let $=i5()[vR],X=ev($);if(X.length>0){let Z=typeof $==="string"?$:"unknown";console.error([`kobe ${V4}: cannot start \u2014 version ${X.join(", ")} introduced breaking changes`,`(last run: ${Z}). Your daemon/session state may be incompatible.`,"","Run:"," kobe reset # stop daemon + PTY host + sessions (tasks kept)"," kobe reset --hard # additionally wipe the task index + UI state","","Then relaunch kobe. Worktrees are never touched."].join(`
305
305
  `)),process.exit(1)}if($!==V4)MO()}function MO(){try{A8({[vR]:V4})}catch{}}var vR="app.lastRunVersion";var FO=i(()=>{h2();D8()});import{existsSync as Zm,readFileSync as AJ0}from"fs";import{homedir as DJ0}from"os";import{join as Jm,resolve as Xm}from"path";import{fileURLToPath as PJ0}from"url";function cR(){let $=PJ0(import.meta.url);return[Xm($,"../../../../../.agents/skills/kobe"),Xm($,"../../skills/kobe")].find((Z)=>Zm(Jm(Z,"SKILL.md")))??null}function LO($={}){let X=$.source!==void 0?$.source:cR(),Z=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",X??TJ0,"--skill","kobe",...Z.flatMap((J)=>["--agent",J])]}function dz($={}){return`npx ${LO($).join(" ")}`}async function dR($){return await Bun.spawn(["npx",...LO($===void 0?{}:{agent:$})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function lR($={}){let X=$.home??DJ0(),Z=$.cwd??process.cwd();return[X,Z].flatMap((J)=>RJ0.map((G)=>Jm(J,G)))}function IJ0($){let X=$.match(/kobe-skill-version:\s*(\d+)/);return X?Number.parseInt(X[1],10):null}function HB($){let X=lR($).find((G)=>Zm(G));if(!X)return{installed:!1,installedVersion:null,currentVersion:hR,stale:!1};let Z=null;try{Z=IJ0(AJ0(X,"utf8"))}catch{Z=null}let J=Z===null||Z<hR;return{installed:!0,installedVersion:Z,currentVersion:hR,stale:J}}function SJ0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(X)=>{process.stdin.pause(),$(String(X))})})}async function Qm($={}){let X=HB();if(!X.installed){if(f7(uR)==="1")return;b3(uR,"1"),process.stderr.write(`
306
306
  kobe: the kobe agent skill isn't installed \u2014 install it so your coding agent can drive kobe via \`kobe api\`:
307
307
  ${YH}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@sma1lboy/kobe",
4
- "version": "0.8.51",
4
+ "version": "0.8.52",
5
5
  "description": "TUI orchestrator for Claude Code (codename)",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",