@sma1lboy/kobe 0.8.125 → 0.8.126

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
@@ -288,14 +288,14 @@ trust_level = "trusted"
288
288
  `)){let U=H.trim();if(!U)continue;if(!G9(U))continue;let B;try{B=JSON.parse(U)}catch{continue}if(!hR(B)||typeof B.type!=="string")continue;let M=typeof B.timestamp==="string"?B.timestamp:new Date().toISOString(),O=hR(B.data)?B.data:{};if(B.type==="session.start"){let N=typeof O.sessionId==="string"?O.sessionId:void 0;if(N)z=N;continue}if(B.type==="user.message"){let N=typeof O.content==="string"?O.content:"";if(!N)continue;if(!W)W=Buffer.from(N.slice(0,jQ0),"utf8").toString("utf8");J.push({role:"user",blocks:[{type:"text",text:N}],timestamp:M,sessionId:z});continue}if(B.type==="assistant.message"){let N=[],j=typeof O.content==="string"?O.content:"";if(j)N.push({type:"text",text:j});let A=Array.isArray(O.toolRequests)?O.toolRequests:[];for(let _ of A){if(!hR(_))continue;let C=typeof _.id==="string"?_.id:typeof _.toolCallId==="string"?_.toolCallId:"tool",y=typeof _.name==="string"?_.name:typeof _.toolName==="string"?_.toolName:"tool";N.push({type:"tool_call",callId:C,name:y,input:_.arguments??{}})}if(N.length>0)J.push({role:"assistant",blocks:N,timestamp:M,sessionId:z});continue}if(B.type==="tool.execution_start"){let N=typeof O.toolCallId==="string"?O.toolCallId:void 0,j=typeof O.toolName==="string"?O.toolName:"tool";if(N)X.set(N,j);continue}if(B.type==="tool.execution_complete"){let N=typeof O.toolCallId==="string"?O.toolCallId:void 0;if(!N)continue;let j=X.get(N)??(typeof O.toolName==="string"?O.toolName:"tool"),A=O.result??(O.success===!1?{success:!1}:void 0);J.push({role:"assistant",blocks:[{type:"tool_result",callId:N,output:A,isError:O.success===!1}],timestamp:M,sessionId:z});continue}if(B.type==="session.shutdown")G=Dv(O)}return{messages:J,toolNameById:X,sessionId:z,usageMetrics:G,firstUserMessage:W}}function hR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var IY,LQ0,jQ0=200;var Tv=n(()=>{bJ();sO();IY={copilotDir(){let $=process.env.COPILOT_HOME?.trim();if($)return $;return yQ.join(KQ0(),".copilot")},async readdir($){try{return await qQ0($)}catch{return[]}},async readFile($){return await NZ($)},stat:BQ0,async rm($){await UQ0($,{recursive:!0,force:!0})}};LQ0=lH({initial:NQ0,parseChunk:($,Z)=>OQ0($,Z)})});import{stat as _Q0}from"fs/promises";import{homedir as CQ0}from"os";import Xj from"path";function DQ0($){let Z=[];for(let J of $.split(`
289
289
  `)){if(!J.trim())continue;try{let{sessionId:X,sessionDir:z,workDir:G}=JSON.parse(J);if(X&&z&&G)Z.push({sessionId:X,sessionDir:z,workDir:G})}catch{}}return Z}async function Sv($){let Z=await $.readFile(Xj.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return DQ0(Z)}function Iv($){return Xj.join($,"agents","main","wire.jsonl")}async function pR($,Z=lR){if(!$)return[];let J=[];for(let X of await Sv(Z)){if(X.workDir!==$)continue;let z=await Z.stat(Iv(X.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;J.push({id:X.sessionId,mtimeMs:z})}return J.sort((X,z)=>X.mtimeMs-z.mtimeMs).map((X)=>X.id)}async function Ev($,Z=lR){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function nR($,Z=lR){if(!$)return null;let J=(await Sv(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=Iv(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var lR;var wv=n(()=>{bJ();lR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||Xj.join(CQ0(),".kimi-code")},async readFile($){return await NZ($)},stat:_Q0}});import PQ0 from"path";var Qj,xv,fv,yv,bv;var gv=n(()=>{mR();eO();Tv();wv();Qj={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},xv={async listSessionIdsForWorktree($){return[...await pH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>_v($),async transcriptPath($,Z){return(await pH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>Vv($)},fv={listSessionIdsForWorktree:($)=>Yv($),readHistory:($)=>Wv($),transcriptPath:async($)=>await bR($)??null,latestTranscriptMtimeForWorktree:($)=>Gv($)},yv={listSessionIdsForWorktree:($)=>Av($),readHistory:($)=>Rv($),async transcriptPath($){let Z=await cR($);return Z?PQ0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>Pv($)},bv={listSessionIdsForWorktree:($)=>pR($),readHistory:Qj.readHistory,transcriptPath:($)=>nR($),async latestTranscriptMtimeForWorktree($){let J=(await pR($)).at(-1);if(!J)return 0;let X=await nR(J);return X?await Ev(X):0}}});import{createHash as RQ0}from"crypto";import{existsSync as TQ0,mkdirSync as SQ0,writeFileSync as IQ0}from"fs";import{homedir as kv}from"os";import iR from"path";function EQ0($,Z=kv()){let J=RQ0("sha256").update($).digest("hex").slice(0,12);return iR.join(Z,".kimi-code","workspace-trust",`wd_${iR.basename($)}_${J}`)}function vv($,Z=kv()){let J=EQ0($,Z);if(TQ0(J))return;SQ0(iR.dirname(J),{recursive:!0,mode:448}),IQ0(J,JSON.stringify({root:$,trustedAt:Date.now()}),{mode:384})}var mv=()=>{};import{readFile as uv,stat as wQ0}from"fs/promises";class zj{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function cv($){return I$($).createTurnDetector()}function hv($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
290
290
  `)){z++;let W=lv(G);if(!W)continue;let H=rR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=pv(W,J),B={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||B.timestampMs>=X.timestampMs)X=B}return X}function bQ0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=rR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&yQ0.has(Z.type)}function gQ0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
291
- `)){X++;let G=lv(z);if(!G||!bQ0(G))continue;let W=pv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function lv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return rR(J)?J:null}catch{return null}}function pv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function rR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var dv=($)=>wQ0($).then((Z)=>Z.mtimeMs,()=>0),xQ0,oR,fQ0,aR,tK,yQ0;var sR=n(()=>{mR();eO();R7();xQ0={listSessionFiles:($)=>pH($),readFile:($)=>uv($,"utf8"),statMtimeMs:dv};oR=class oR extends zj{deps;vendor="claude";cache=new Map;constructor($=xQ0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=hv(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??dv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:hv(J,$,Z),mtimeMs:Z}}};fQ0={findLatestRollout:($)=>gR($),readFile:($)=>uv($,"utf8")};aR=class aR extends zj{deps;vendor="codex";cache=null;constructor($=fQ0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=gQ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};tK=class tK extends zj{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};yQ0=new Set(["task_complete","turn_complete","turn_aborted"])});function kQ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:Qj,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new eK($),createTurnDetector:()=>new tK($)}}function I$($){return d5($)?tR[$]:kQ0($)}function nv($){return I$($).history.readHistory!==Qj.readHistory}function eR($){let Z=I$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:iv}function bQ($,Z){let J=Z?eR(Z):iv;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function Yj($,Z){let J=I$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function ov(){return Object.values(tR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var tR,iv;var R7=n(()=>{C7();gJ();Dk();DR();kk();mk();dk();nk();ok();Bv();Mv();gv();$T();mv();sR();tR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:xv,detectAccount:($)=>vH($),createHookAdapter:()=>new CR,createTurnDetector:()=>new oR,capabilities:_k,identity:Ck,trustWorktree:vk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>gk(),readTurns:ck},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:fv,detectAccount:($)=>mH($),createHookAdapter:()=>new TR,createTurnDetector:()=>new aR,capabilities:lk,identity:pk,trustWorktree:Fv,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]'],statusPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],workingPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]},quotaUsage:()=>Uv()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:yv,detectAccount:($)=>hH($),createHookAdapter:()=>new eK("copilot"),createTurnDetector:()=>new tK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:vv,history:bv,detectAccount:($)=>uO($),createHookAdapter:()=>new eK("kimi"),createTurnDetector:()=>new tK("kimi")}};iv=[...new Set(Object.values(tR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function ZT($){return I$($).createHookAdapter()}class eK{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 $T=n(()=>{R7()});function Gj($){return vQ0.includes($)}function av($){return mQ0.includes($)}var vQ0,mQ0;var JT=n(()=>{vQ0=["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"];mQ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Wj={};A$(Wj,{migrationHint:()=>iQ0,isRovePluginEnabled:()=>lQ0,detectLegacyInstalls:()=>pQ0});import{existsSync as hQ0,readFileSync as uQ0}from"fs";import{homedir as cQ0}from"os";import{join as rv}from"path";function sv($){try{let Z=JSON.parse(uQ0($,"utf8"));return P7(Z)?Z:null}catch{return null}}function lQ0($=nO()){let Z=sv($);if(!Z||!P7(Z.enabledPlugins))return!1;return Object.entries(Z.enabledPlugins).some(([J,X])=>X===!0&&J.split("@")[0]===dQ0)}function pQ0($={}){let Z=$.settingsFilePath??nO(),J=$.home??cQ0(),X=sv(Z),z=X!==null&&(Ik(X,pO)||nQ0(X)),G=["rove","kobe"].map((W)=>rv(J,".claude","skills",W)).filter((W)=>hQ0(rv(W,"SKILL.md")));return{legacyHooks:z,legacySkillDirs:G}}function nQ0($){let Z=P7($.hooks)?$.hooks:{};return Object.values(Z).some((J)=>Array.isArray(J)&&J.some((X)=>P7(X)&&Array.isArray(X.hooks)&&X.hooks.some((z)=>P7(z)&&typeof z.command==="string"&&z.command.includes("worktree-created")&&!z.command.includes("CLAUDE_PLUGIN_ROOT"))))}function iQ0($,Z){if(!$.legacyHooks&&$.legacySkillDirs.length===0)return null;let J=[`${Z}: the Rove Claude Code plugin is enabled, but legacy installs remain:`];if($.legacyHooks)J.push(" \u2022 ~/.claude/settings.json still has the settings-managed Rove hooks (every event fires TWICE).",` Run \`${Z} hook cleanup\` to remove them (only Rove's own entries are touched).`);for(let X of $.legacySkillDirs)J.push(` \u2022 legacy skill copy at ${X} (the plugin bundles the skill \u2014 two copies double-register).`," Remove that directory to keep the plugin's copy only.");return`${J.join(`
291
+ `)){X++;let G=lv(z);if(!G||!bQ0(G))continue;let W=pv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function lv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return rR(J)?J:null}catch{return null}}function pv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function rR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var dv=($)=>wQ0($).then((Z)=>Z.mtimeMs,()=>0),xQ0,oR,fQ0,aR,tK,yQ0;var sR=n(()=>{mR();eO();R7();xQ0={listSessionFiles:($)=>pH($),readFile:($)=>uv($,"utf8"),statMtimeMs:dv};oR=class oR extends zj{deps;vendor="claude";cache=new Map;constructor($=xQ0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=hv(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??dv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:hv(J,$,Z),mtimeMs:Z}}};fQ0={findLatestRollout:($)=>gR($),readFile:($)=>uv($,"utf8")};aR=class aR extends zj{deps;vendor="codex";cache=null;constructor($=fQ0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=gQ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};tK=class tK extends zj{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};yQ0=new Set(["task_complete","turn_complete","turn_aborted"])});function kQ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:Qj,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new eK($),createTurnDetector:()=>new tK($)}}function I$($){return d5($)?tR[$]:kQ0($)}function nv($){return I$($).history.readHistory!==Qj.readHistory}function eR($){let Z=I$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:iv}function bQ($,Z){let J=Z?eR(Z):iv;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function Yj($,Z){let J=I$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function ov(){return Object.values(tR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var tR,iv;var R7=n(()=>{C7();gJ();Dk();DR();kk();mk();dk();nk();ok();Bv();Mv();gv();$T();mv();sR();tR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:xv,detectAccount:($)=>vH($),createHookAdapter:()=>new CR,createTurnDetector:()=>new oR,capabilities:_k,identity:Ck,trustWorktree:vk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>gk(),readTurns:ck},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:fv,detectAccount:($)=>mH($),createHookAdapter:()=>new TR,createTurnDetector:()=>new aR,capabilities:lk,identity:pk,trustWorktree:Fv,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]'],statusPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],workingPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]},quotaUsage:()=>Uv()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:yv,detectAccount:($)=>hH($),createHookAdapter:()=>new eK("copilot"),createTurnDetector:()=>new tK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:vv,history:bv,detectAccount:($)=>uO($),createHookAdapter:()=>new eK("kimi"),createTurnDetector:()=>new tK("kimi")}};iv=[...new Set(Object.values(tR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function ZT($){return I$($).createHookAdapter()}class eK{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 $T=n(()=>{R7()});function Gj($){return vQ0.includes($)}function av($){return mQ0.includes($)}var vQ0,mQ0;var JT=n(()=>{vQ0=["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"];mQ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Wj={};A$(Wj,{migrationHint:()=>iQ0,isRovePluginEnabled:()=>lQ0,detectLegacyInstalls:()=>pQ0});import{existsSync as hQ0,readFileSync as uQ0}from"fs";import{homedir as cQ0}from"os";import{join as rv}from"path";function sv($){try{let Z=JSON.parse(uQ0($,"utf8"));return P7(Z)?Z:null}catch{return null}}function lQ0($=nO()){let Z=sv($);if(!Z||!P7(Z.enabledPlugins))return!1;return Object.entries(Z.enabledPlugins).some(([J,X])=>X===!0&&J.split("@")[0]===dQ0)}function pQ0($={}){let Z=$.settingsFilePath??nO(),J=$.home??cQ0(),X=sv(Z),z=X!==null&&(Ik(X,pO)||nQ0(X)),G=["rove","kobe"].map((W)=>rv(J,".claude","skills",W)).filter((W)=>hQ0(rv(W,"SKILL.md")));return{legacyHooks:z,legacySkillDirs:G}}function nQ0($){let Z=P7($.hooks)?$.hooks:{};return Object.values(Z).some((J)=>Array.isArray(J)&&J.some((X)=>P7(X)&&Array.isArray(X.hooks)&&X.hooks.some((z)=>P7(z)&&typeof z.command==="string"&&z.command.includes("worktree-created")&&!z.command.includes("CLAUDE_PLUGIN_ROOT"))))}function iQ0($,Z){if(!$.legacyHooks&&$.legacySkillDirs.length===0)return null;let J=[`${Z}: the Rove Claude Code plugin is enabled, but legacy installs remain:`];if($.legacyHooks)J.push(" \u2022 ~/.claude/settings.json still has the settings-managed Rove hooks (every event fires TWICE).",` Run \`${Z} hook cleanup\` to remove them (only Rove's own entries are touched).`);for(let X of $.legacySkillDirs)J.push(` \u2022 legacy skill copy at ${X} (the plugin bundles the skill \u2014 two copies double-register).`," Remove that directory to keep the plugin's copy only.");return J.push(" Reading this inside a session? Just ask your agent to run the cleanup for you."),`${J.join(`
292
292
  `)}
293
293
  `}var dQ0="rove";var Hj=n(()=>{lO();DR()});var Wm={};A$(Wm,{runHookSubcommand:()=>eQ0,readTextWithTimeout:()=>Zm,parseWorktreeRemovePath:()=>zm,parseWorktreeAddPath:()=>Qm,ensureGlobalKobeHooks:()=>zT});import{homedir as oQ0}from"os";import{join as $m,resolve as XT}from"path";async function Zm($,Z=aQ0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function Jm(){try{let $=await Zm(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function tv($,Z){for(let J=0;J<$.length;J++){if($[J]===Z)return $[J+1];if($[J].startsWith(`${Z}=`))return $[J].slice(Z.length+1)}return}function sQ0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function Xm($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function Qm($){let Z=Xm($),J=new Set(["-b","-B","--reason"]);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="add")continue;let z=X+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=J.has(G)?2:1;continue}return G}}return}function zm($){let Z=Xm($);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="remove")continue;let X=J+2;while(X<Z.length){let z=Z[X];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){X+=1;continue}return z}}return}async function tQ0(){let $=await Jm(),Z=sQ0($.tool_input)?$.tool_input:{},J=typeof Z.command==="string"?Z.command:"";if(!J.includes("worktree"))return;let X=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=Qm(J),G=z?void 0:zm(J);if(!z&&!G)return;let W=await VQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:XT(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:XT(X,G)})}finally{W.close()}}async function eQ0($){let[Z,...J]=$;if(Z==="setup"){await Qz0(J);return}if(Z==="cleanup"){await Xz0();return}if(Z===rQ0){try{await tQ0()}catch{}return}try{if(!Z||!Gj(Z))return;let X=await Jm(),z=tv(J,"--task-id"),G=typeof X.cwd==="string"&&X.cwd?X.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=tv(J,"--engine"),B=QT().filter((j)=>!U||j.vendor===U),M;for(let j of B)if(M=j.activityDetailFromPayload(Z,X),M)break;let O;for(let j of B)if(O=j.sessionFromPayload(X),O)break;let N=await VQ();if(!N)return;try{let j=z??W;await N.request("engine.reportEvent",{...j?{taskId:j}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...M?{detail:M}:{},...O?{sessionId:O.sessionId}:{},...O?.transcriptPath?{transcriptPath:O.transcriptPath}:{}})}finally{N.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function $z0(){return b8.map(($)=>ZT($)).filter(($)=>$.supportsWorktreeSync())}function QT(){return b8.map(($)=>ZT($)).filter(($)=>$.supportsHooks())}function Ym(){return $m(oQ0(),".claude","settings.json")}function Zz0($){if(!$||$==="off")return;if($==="global")return Ym();if($.startsWith("repo:"))return $m(XT($.slice(5)),".claude","settings.json");return $}async function zT(){try{let{isRovePluginEnabled:$,detectLegacyInstalls:Z,migrationHint:J}=await Promise.resolve().then(() => (Hj(),Wj)),X=$();if(X){let G=J(Z(),$$());if(G)process.stderr.write(`
294
294
  ${G}
295
295
  `)}let z=Jz0();for(let G of QT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await Gm()}catch{}}function Jz0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Gm(){let $=$z0();if($.length===0)return;let Z=w5(ev),J=new Set([Ym()]),X=Zz0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")J6(ev,"off")}async function Xz0(){let $=QT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
296
296
  `);return}await $.removeActivityHooks(Z),await $.removeWorktreeWatchHook(Z),process.stdout.write([`rove hook cleanup: removed Rove's settings-managed hooks from ${Z}.`,"Only Rove's own entries were touched; your other hooks are intact.","The Claude Code plugin's hooks.json now carries these events (if the plugin","is not installed, the next Rove launch reinstalls the settings-managed set).",""].join(`
297
297
  `))}async function Qz0($){await Gm(),process.stdout.write(["rove 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 Rove previously installed has been removed.","","Sync is now automatic: a `claude --worktree` (or any session) started in a","worktree under a repo Rove already tracks is adopted as a task on launch.","To adopt existing worktrees on demand, use the New Task dialog or `rove adopt`.",""].join(`
298
- `))}var aQ0=500,rQ0="worktree-created",ev="externalWorktreeSync";var YT=n(()=>{P2();SQ();yJ();$T();JT();_4();C7();h4()});var qj;var Hm=n(()=>{qj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.125",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.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/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.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 --retry=2 --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.14","@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 Um={};A$(Um,{repoSlug:()=>EY,releasePageUrl:()=>BT,recommendedGlobalInstallCommand:()=>HT,isNewerSemver:()=>GT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>UT,fetchReleaseNotes:()=>qT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Uj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>WT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=qj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function HT(){return`npm install -g ${WT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Yz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Bj);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function GT($,Z){return j3($,Z)>0}function j3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:GT(Z,P$)};if(OH()&&!$.force)return null;let J=await Yz0(WT);if(!J)return null;return{current:P$,latest:J,hasUpdate:GT(J,P$)}}function qm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function qT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Bj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.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(z)}}async function UT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Bj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=qm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Bj);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=qm(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(X)}}function BT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,WT,Uj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Bj=3000;var h8=n(()=>{Hm();O5();P$=qj.version,WT=qj.name;OZ=`curl -fsSL ${Uj} | sh`;vJ=[]});var Km={};A$(Km,{stampResetGate:()=>Kj,resetGateBlockers:()=>Bm,enforceResetGate:()=>FT,LAST_RUN_VERSION_KEY:()=>KT});function Bm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function FT(){let $=$$(),Z=N4()[KT],J=Bm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
298
+ `))}var aQ0=500,rQ0="worktree-created",ev="externalWorktreeSync";var YT=n(()=>{P2();SQ();yJ();$T();JT();_4();C7();h4()});var qj;var Hm=n(()=>{qj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.126",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.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/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.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 --retry=2 --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.14","@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 Um={};A$(Um,{repoSlug:()=>EY,releasePageUrl:()=>BT,recommendedGlobalInstallCommand:()=>HT,isNewerSemver:()=>GT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>UT,fetchReleaseNotes:()=>qT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Uj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>WT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=qj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function HT(){return`npm install -g ${WT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Yz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Bj);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function GT($,Z){return j3($,Z)>0}function j3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:GT(Z,P$)};if(OH()&&!$.force)return null;let J=await Yz0(WT);if(!J)return null;return{current:P$,latest:J,hasUpdate:GT(J,P$)}}function qm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function qT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Bj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.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(z)}}async function UT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Bj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=qm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Bj);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=qm(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(X)}}function BT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,WT,Uj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Bj=3000;var h8=n(()=>{Hm();O5();P$=qj.version,WT=qj.name;OZ=`curl -fsSL ${Uj} | sh`;vJ=[]});var Km={};A$(Km,{stampResetGate:()=>Kj,resetGateBlockers:()=>Bm,enforceResetGate:()=>FT,LAST_RUN_VERSION_KEY:()=>KT});function Bm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function FT(){let $=$$(),Z=N4()[KT],J=Bm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
299
299
  `)),process.exit(1)}if(Z!==P$)Kj()}function Kj(){try{R2({[KT]:P$})}catch{}}var KT="app.lastRunVersion";var Fj=n(()=>{T2();h8();h4()});import{existsSync as Mm,readFileSync as Gz0}from"fs";import{homedir as Wz0}from"os";import{join as Nm,resolve as Fm}from"path";import{fileURLToPath as Hz0}from"url";function LT($=process.env){return`${$$($)} skill install`}function Mj(){let $=Hz0(import.meta.url);return[Fm($,"../../../../../.agents/skills/kobe"),Fm($,"../../skills/rove")].find((J)=>Mm(Nm(J,"SKILL.md")))??null}function Nj($={}){let Z=$.source!==void 0?$.source:Mj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??Uz0,"--skill",t3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function xY($={}){return`npx ${Nj($).join(" ")}`}async function OT($,Z){return await Bun.spawn(["npx",...Nj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Lj($={}){let Z=$.home??Wz0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>qz0.map((z)=>Nm(X,z)))}function Bz0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function JF($){let Z=Lj($).find((z)=>Mm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:MT,stale:!1};let J=null;try{J=Bz0(Gz0(Z,"utf8"))}catch{J=null}let X=J===null||J<MT;return{installed:!0,installedVersion:J,currentVersion:MT,stale:X}}function Kz0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Lm($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (Hj(),Wj));if(Z())return;let J=$$(),X=LT(),z=JF();if(!z.installed){if(w5(NT)==="1")return;J6(NT,"1"),process.stderr.write(`
300
300
  ${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
301
301
  ${X}
package/dist/cli/kobe.js CHANGED
@@ -288,14 +288,14 @@ trust_level = "trusted"
288
288
  `)){let U=H.trim();if(!U)continue;if(!G9(U))continue;let B;try{B=JSON.parse(U)}catch{continue}if(!uR(B)||typeof B.type!=="string")continue;let M=typeof B.timestamp==="string"?B.timestamp:new Date().toISOString(),O=uR(B.data)?B.data:{};if(B.type==="session.start"){let N=typeof O.sessionId==="string"?O.sessionId:void 0;if(N)z=N;continue}if(B.type==="user.message"){let N=typeof O.content==="string"?O.content:"";if(!N)continue;if(!W)W=Buffer.from(N.slice(0,CQ0),"utf8").toString("utf8");J.push({role:"user",blocks:[{type:"text",text:N}],timestamp:M,sessionId:z});continue}if(B.type==="assistant.message"){let N=[],j=typeof O.content==="string"?O.content:"";if(j)N.push({type:"text",text:j});let A=Array.isArray(O.toolRequests)?O.toolRequests:[];for(let _ of A){if(!uR(_))continue;let C=typeof _.id==="string"?_.id:typeof _.toolCallId==="string"?_.toolCallId:"tool",y=typeof _.name==="string"?_.name:typeof _.toolName==="string"?_.toolName:"tool";N.push({type:"tool_call",callId:C,name:y,input:_.arguments??{}})}if(N.length>0)J.push({role:"assistant",blocks:N,timestamp:M,sessionId:z});continue}if(B.type==="tool.execution_start"){let N=typeof O.toolCallId==="string"?O.toolCallId:void 0,j=typeof O.toolName==="string"?O.toolName:"tool";if(N)X.set(N,j);continue}if(B.type==="tool.execution_complete"){let N=typeof O.toolCallId==="string"?O.toolCallId:void 0;if(!N)continue;let j=X.get(N)??(typeof O.toolName==="string"?O.toolName:"tool"),A=O.result??(O.success===!1?{success:!1}:void 0);J.push({role:"assistant",blocks:[{type:"tool_result",callId:N,output:A,isError:O.success===!1}],timestamp:M,sessionId:z});continue}if(B.type==="session.shutdown")G=Pv(O)}return{messages:J,toolNameById:X,sessionId:z,usageMetrics:G,firstUserMessage:W}}function uR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var IY,VQ0,CQ0=200;var Iv=n(()=>{bJ();tO();IY={copilotDir(){let $=process.env.COPILOT_HOME?.trim();if($)return $;return yQ.join(NQ0(),".copilot")},async readdir($){try{return await KQ0($)}catch{return[]}},async readFile($){return await NZ($)},stat:MQ0,async rm($){await FQ0($,{recursive:!0,force:!0})}};VQ0=lH({initial:jQ0,parseChunk:($,Z)=>_Q0($,Z)})});import{stat as AQ0}from"fs/promises";import{homedir as PQ0}from"os";import Qj from"path";function RQ0($){let Z=[];for(let J of $.split(`
289
289
  `)){if(!J.trim())continue;try{let{sessionId:X,sessionDir:z,workDir:G}=JSON.parse(J);if(X&&z&&G)Z.push({sessionId:X,sessionDir:z,workDir:G})}catch{}}return Z}async function Ev($){let Z=await $.readFile(Qj.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return RQ0(Z)}function wv($){return Qj.join($,"agents","main","wire.jsonl")}async function nR($,Z=pR){if(!$)return[];let J=[];for(let X of await Ev(Z)){if(X.workDir!==$)continue;let z=await Z.stat(wv(X.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;J.push({id:X.sessionId,mtimeMs:z})}return J.sort((X,z)=>X.mtimeMs-z.mtimeMs).map((X)=>X.id)}async function xv($,Z=pR){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function iR($,Z=pR){if(!$)return null;let J=(await Ev(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=wv(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var pR;var fv=n(()=>{bJ();pR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||Qj.join(PQ0(),".kimi-code")},async readFile($){return await NZ($)},stat:AQ0}});import SQ0 from"path";var zj,yv,bv,gv,kv;var vv=n(()=>{hR();$j();Iv();fv();zj={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},yv={async listSessionIdsForWorktree($){return[...await pH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>Dv($),async transcriptPath($,Z){return(await pH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>Cv($)},bv={listSessionIdsForWorktree:($)=>Wv($),readHistory:($)=>qv($),transcriptPath:async($)=>await gR($)??null,latestTranscriptMtimeForWorktree:($)=>Hv($)},gv={listSessionIdsForWorktree:($)=>Rv($),readHistory:($)=>Sv($),async transcriptPath($){let Z=await dR($);return Z?SQ0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>Tv($)},kv={listSessionIdsForWorktree:($)=>nR($),readHistory:zj.readHistory,transcriptPath:($)=>iR($),async latestTranscriptMtimeForWorktree($){let J=(await nR($)).at(-1);if(!J)return 0;let X=await iR(J);return X?await xv(X):0}}});import{createHash as IQ0}from"crypto";import{existsSync as EQ0,mkdirSync as wQ0,writeFileSync as xQ0}from"fs";import{homedir as mv}from"os";import oR from"path";function fQ0($,Z=mv()){let J=IQ0("sha256").update($).digest("hex").slice(0,12);return oR.join(Z,".kimi-code","workspace-trust",`wd_${oR.basename($)}_${J}`)}function hv($,Z=mv()){let J=fQ0($,Z);if(EQ0(J))return;wQ0(oR.dirname(J),{recursive:!0,mode:448}),xQ0(J,JSON.stringify({root:$,trustedAt:Date.now()}),{mode:384})}var uv=()=>{};import{readFile as dv,stat as yQ0}from"fs/promises";class Yj{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function lv($){return I$($).createTurnDetector()}function cv($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
290
290
  `)){z++;let W=nv(G);if(!W)continue;let H=sR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=iv(W,J),B={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||B.timestampMs>=X.timestampMs)X=B}return X}function vQ0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=sR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&kQ0.has(Z.type)}function mQ0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
291
- `)){X++;let G=nv(z);if(!G||!vQ0(G))continue;let W=iv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function nv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return sR(J)?J:null}catch{return null}}function iv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function sR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var pv=($)=>yQ0($).then((Z)=>Z.mtimeMs,()=>0),bQ0,aR,gQ0,rR,tK,kQ0;var tR=n(()=>{hR();$j();R7();bQ0={listSessionFiles:($)=>pH($),readFile:($)=>dv($,"utf8"),statMtimeMs:pv};aR=class aR extends Yj{deps;vendor="claude";cache=new Map;constructor($=bQ0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=cv(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??pv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:cv(J,$,Z),mtimeMs:Z}}};gQ0={findLatestRollout:($)=>kR($),readFile:($)=>dv($,"utf8")};rR=class rR extends Yj{deps;vendor="codex";cache=null;constructor($=gQ0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=mQ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};tK=class tK extends Yj{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};kQ0=new Set(["task_complete","turn_complete","turn_aborted"])});function hQ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:zj,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new eK($),createTurnDetector:()=>new tK($)}}function I$($){return d5($)?eR[$]:hQ0($)}function ov($){return I$($).history.readHistory!==zj.readHistory}function $T($){let Z=I$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:av}function bQ($,Z){let J=Z?$T(Z):av;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function Gj($,Z){let J=I$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function rv(){return Object.values(eR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var eR,av;var R7=n(()=>{C7();gJ();Pk();AR();mk();uk();pk();ok();rk();Fv();Lv();vv();ZT();uv();tR();eR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:yv,detectAccount:($)=>vH($),createHookAdapter:()=>new DR,createTurnDetector:()=>new aR,capabilities:Dk,identity:Ak,trustWorktree:hk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>vk(),readTurns:lk},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:bv,detectAccount:($)=>mH($),createHookAdapter:()=>new SR,createTurnDetector:()=>new rR,capabilities:nk,identity:ik,trustWorktree:Nv,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]'],statusPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],workingPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]},quotaUsage:()=>Kv()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:gv,detectAccount:($)=>hH($),createHookAdapter:()=>new eK("copilot"),createTurnDetector:()=>new tK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:hv,history:kv,detectAccount:($)=>cO($),createHookAdapter:()=>new eK("kimi"),createTurnDetector:()=>new tK("kimi")}};av=[...new Set(Object.values(eR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function JT($){return I$($).createHookAdapter()}class eK{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 ZT=n(()=>{R7()});function Wj($){return uQ0.includes($)}function sv($){return cQ0.includes($)}var uQ0,cQ0;var XT=n(()=>{uQ0=["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"];cQ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Hj={};A$(Hj,{migrationHint:()=>rQ0,isRovePluginEnabled:()=>iQ0,detectLegacyInstalls:()=>oQ0});import{existsSync as dQ0,readFileSync as lQ0}from"fs";import{homedir as pQ0}from"os";import{join as tv}from"path";function ev($){try{let Z=JSON.parse(lQ0($,"utf8"));return P7(Z)?Z:null}catch{return null}}function iQ0($=iO()){let Z=ev($);if(!Z||!P7(Z.enabledPlugins))return!1;return Object.entries(Z.enabledPlugins).some(([J,X])=>X===!0&&J.split("@")[0]===nQ0)}function oQ0($={}){let Z=$.settingsFilePath??iO(),J=$.home??pQ0(),X=ev(Z),z=X!==null&&(wk(X,nO)||aQ0(X)),G=["rove","kobe"].map((W)=>tv(J,".claude","skills",W)).filter((W)=>dQ0(tv(W,"SKILL.md")));return{legacyHooks:z,legacySkillDirs:G}}function aQ0($){let Z=P7($.hooks)?$.hooks:{};return Object.values(Z).some((J)=>Array.isArray(J)&&J.some((X)=>P7(X)&&Array.isArray(X.hooks)&&X.hooks.some((z)=>P7(z)&&typeof z.command==="string"&&z.command.includes("worktree-created")&&!z.command.includes("CLAUDE_PLUGIN_ROOT"))))}function rQ0($,Z){if(!$.legacyHooks&&$.legacySkillDirs.length===0)return null;let J=[`${Z}: the Rove Claude Code plugin is enabled, but legacy installs remain:`];if($.legacyHooks)J.push(" \u2022 ~/.claude/settings.json still has the settings-managed Rove hooks (every event fires TWICE).",` Run \`${Z} hook cleanup\` to remove them (only Rove's own entries are touched).`);for(let X of $.legacySkillDirs)J.push(` \u2022 legacy skill copy at ${X} (the plugin bundles the skill \u2014 two copies double-register).`," Remove that directory to keep the plugin's copy only.");return`${J.join(`
291
+ `)){X++;let G=nv(z);if(!G||!vQ0(G))continue;let W=iv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function nv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return sR(J)?J:null}catch{return null}}function iv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function sR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var pv=($)=>yQ0($).then((Z)=>Z.mtimeMs,()=>0),bQ0,aR,gQ0,rR,tK,kQ0;var tR=n(()=>{hR();$j();R7();bQ0={listSessionFiles:($)=>pH($),readFile:($)=>dv($,"utf8"),statMtimeMs:pv};aR=class aR extends Yj{deps;vendor="claude";cache=new Map;constructor($=bQ0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=cv(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??pv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:cv(J,$,Z),mtimeMs:Z}}};gQ0={findLatestRollout:($)=>kR($),readFile:($)=>dv($,"utf8")};rR=class rR extends Yj{deps;vendor="codex";cache=null;constructor($=gQ0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=mQ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};tK=class tK extends Yj{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};kQ0=new Set(["task_complete","turn_complete","turn_aborted"])});function hQ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:zj,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new eK($),createTurnDetector:()=>new tK($)}}function I$($){return d5($)?eR[$]:hQ0($)}function ov($){return I$($).history.readHistory!==zj.readHistory}function $T($){let Z=I$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:av}function bQ($,Z){let J=Z?$T(Z):av;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function Gj($,Z){let J=I$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function rv(){return Object.values(eR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var eR,av;var R7=n(()=>{C7();gJ();Pk();AR();mk();uk();pk();ok();rk();Fv();Lv();vv();ZT();uv();tR();eR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:yv,detectAccount:($)=>vH($),createHookAdapter:()=>new DR,createTurnDetector:()=>new aR,capabilities:Dk,identity:Ak,trustWorktree:hk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>vk(),readTurns:lk},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:bv,detectAccount:($)=>mH($),createHookAdapter:()=>new SR,createTurnDetector:()=>new rR,capabilities:nk,identity:ik,trustWorktree:Nv,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]'],statusPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],workingPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]},quotaUsage:()=>Kv()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:gv,detectAccount:($)=>hH($),createHookAdapter:()=>new eK("copilot"),createTurnDetector:()=>new tK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:hv,history:kv,detectAccount:($)=>cO($),createHookAdapter:()=>new eK("kimi"),createTurnDetector:()=>new tK("kimi")}};av=[...new Set(Object.values(eR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function JT($){return I$($).createHookAdapter()}class eK{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 ZT=n(()=>{R7()});function Wj($){return uQ0.includes($)}function sv($){return cQ0.includes($)}var uQ0,cQ0;var XT=n(()=>{uQ0=["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"];cQ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Hj={};A$(Hj,{migrationHint:()=>rQ0,isRovePluginEnabled:()=>iQ0,detectLegacyInstalls:()=>oQ0});import{existsSync as dQ0,readFileSync as lQ0}from"fs";import{homedir as pQ0}from"os";import{join as tv}from"path";function ev($){try{let Z=JSON.parse(lQ0($,"utf8"));return P7(Z)?Z:null}catch{return null}}function iQ0($=iO()){let Z=ev($);if(!Z||!P7(Z.enabledPlugins))return!1;return Object.entries(Z.enabledPlugins).some(([J,X])=>X===!0&&J.split("@")[0]===nQ0)}function oQ0($={}){let Z=$.settingsFilePath??iO(),J=$.home??pQ0(),X=ev(Z),z=X!==null&&(wk(X,nO)||aQ0(X)),G=["rove","kobe"].map((W)=>tv(J,".claude","skills",W)).filter((W)=>dQ0(tv(W,"SKILL.md")));return{legacyHooks:z,legacySkillDirs:G}}function aQ0($){let Z=P7($.hooks)?$.hooks:{};return Object.values(Z).some((J)=>Array.isArray(J)&&J.some((X)=>P7(X)&&Array.isArray(X.hooks)&&X.hooks.some((z)=>P7(z)&&typeof z.command==="string"&&z.command.includes("worktree-created")&&!z.command.includes("CLAUDE_PLUGIN_ROOT"))))}function rQ0($,Z){if(!$.legacyHooks&&$.legacySkillDirs.length===0)return null;let J=[`${Z}: the Rove Claude Code plugin is enabled, but legacy installs remain:`];if($.legacyHooks)J.push(" \u2022 ~/.claude/settings.json still has the settings-managed Rove hooks (every event fires TWICE).",` Run \`${Z} hook cleanup\` to remove them (only Rove's own entries are touched).`);for(let X of $.legacySkillDirs)J.push(` \u2022 legacy skill copy at ${X} (the plugin bundles the skill \u2014 two copies double-register).`," Remove that directory to keep the plugin's copy only.");return J.push(" Reading this inside a session? Just ask your agent to run the cleanup for you."),`${J.join(`
292
292
  `)}
293
293
  `}var nQ0="rove";var qj=n(()=>{pO();AR()});var qm={};A$(qm,{runHookSubcommand:()=>Jz0,readTextWithTimeout:()=>Xm,parseWorktreeRemovePath:()=>Gm,parseWorktreeAddPath:()=>Ym,ensureGlobalKobeHooks:()=>YT});import{homedir as sQ0}from"os";import{join as Jm,resolve as QT}from"path";async function Xm($,Z=tQ0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function Qm(){try{let $=await Xm(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function $m($,Z){for(let J=0;J<$.length;J++){if($[J]===Z)return $[J+1];if($[J].startsWith(`${Z}=`))return $[J].slice(Z.length+1)}return}function $z0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function zm($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function Ym($){let Z=zm($),J=new Set(["-b","-B","--reason"]);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="add")continue;let z=X+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=J.has(G)?2:1;continue}return G}}return}function Gm($){let Z=zm($);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="remove")continue;let X=J+2;while(X<Z.length){let z=Z[X];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){X+=1;continue}return z}}return}async function Zz0(){let $=await Qm(),Z=$z0($.tool_input)?$.tool_input:{},J=typeof Z.command==="string"?Z.command:"";if(!J.includes("worktree"))return;let X=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=Ym(J),G=z?void 0:Gm(J);if(!z&&!G)return;let W=await VQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:QT(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:QT(X,G)})}finally{W.close()}}async function Jz0($){let[Z,...J]=$;if(Z==="setup"){await Gz0(J);return}if(Z==="cleanup"){await Yz0();return}if(Z===eQ0){try{await Zz0()}catch{}return}try{if(!Z||!Wj(Z))return;let X=await Qm(),z=$m(J,"--task-id"),G=typeof X.cwd==="string"&&X.cwd?X.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=$m(J,"--engine"),B=zT().filter((j)=>!U||j.vendor===U),M;for(let j of B)if(M=j.activityDetailFromPayload(Z,X),M)break;let O;for(let j of B)if(O=j.sessionFromPayload(X),O)break;let N=await VQ();if(!N)return;try{let j=z??W;await N.request("engine.reportEvent",{...j?{taskId:j}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...M?{detail:M}:{},...O?{sessionId:O.sessionId}:{},...O?.transcriptPath?{transcriptPath:O.transcriptPath}:{}})}finally{N.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function Xz0(){return b8.map(($)=>JT($)).filter(($)=>$.supportsWorktreeSync())}function zT(){return b8.map(($)=>JT($)).filter(($)=>$.supportsHooks())}function Wm(){return Jm(sQ0(),".claude","settings.json")}function Qz0($){if(!$||$==="off")return;if($==="global")return Wm();if($.startsWith("repo:"))return Jm(QT($.slice(5)),".claude","settings.json");return $}async function YT(){try{let{isRovePluginEnabled:$,detectLegacyInstalls:Z,migrationHint:J}=await Promise.resolve().then(() => (qj(),Hj)),X=$();if(X){let G=J(Z(),$$());if(G)process.stderr.write(`
294
294
  ${G}
295
295
  `)}let z=zz0();for(let G of zT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await Hm()}catch{}}function zz0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Hm(){let $=Xz0();if($.length===0)return;let Z=w5(Zm),J=new Set([Wm()]),X=Qz0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")J6(Zm,"off")}async function Yz0(){let $=zT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
296
296
  `);return}await $.removeActivityHooks(Z),await $.removeWorktreeWatchHook(Z),process.stdout.write([`rove hook cleanup: removed Rove's settings-managed hooks from ${Z}.`,"Only Rove's own entries were touched; your other hooks are intact.","The Claude Code plugin's hooks.json now carries these events (if the plugin","is not installed, the next Rove launch reinstalls the settings-managed set).",""].join(`
297
297
  `))}async function Gz0($){await Hm(),process.stdout.write(["rove 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 Rove previously installed has been removed.","","Sync is now automatic: a `claude --worktree` (or any session) started in a","worktree under a repo Rove already tracks is adopted as a task on launch.","To adopt existing worktrees on demand, use the New Task dialog or `rove adopt`.",""].join(`
298
- `))}var tQ0=500,eQ0="worktree-created",Zm="externalWorktreeSync";var GT=n(()=>{P2();SQ();yJ();ZT();XT();_4();C7();g4()});var Uj;var Um=n(()=>{Uj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.125",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.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/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.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 --retry=2 --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.14","@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 Km={};A$(Km,{repoSlug:()=>EY,releasePageUrl:()=>KT,recommendedGlobalInstallCommand:()=>qT,isNewerSemver:()=>WT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>BT,fetchReleaseNotes:()=>UT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Bj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>HT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=Uj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function qT(){return`npm install -g ${HT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Hz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Kj);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function WT($,Z){return j3($,Z)>0}function j3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:WT(Z,P$)};if(OH()&&!$.force)return null;let J=await Hz0(HT);if(!J)return null;return{current:P$,latest:J,hasUpdate:WT(J,P$)}}function Bm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function UT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.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(z)}}async function BT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Bm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Kj);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Bm(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(X)}}function KT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,HT,Bj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Kj=3000;var h8=n(()=>{Um();O5();P$=Uj.version,HT=Uj.name;OZ=`curl -fsSL ${Bj} | sh`;vJ=[]});var Mm={};A$(Mm,{stampResetGate:()=>Fj,resetGateBlockers:()=>Fm,enforceResetGate:()=>MT,LAST_RUN_VERSION_KEY:()=>FT});function Fm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function MT(){let $=$$(),Z=N4()[FT],J=Fm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
298
+ `))}var tQ0=500,eQ0="worktree-created",Zm="externalWorktreeSync";var GT=n(()=>{P2();SQ();yJ();ZT();XT();_4();C7();g4()});var Uj;var Um=n(()=>{Uj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.126",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.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/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.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 --retry=2 --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.14","@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 Km={};A$(Km,{repoSlug:()=>EY,releasePageUrl:()=>KT,recommendedGlobalInstallCommand:()=>qT,isNewerSemver:()=>WT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>BT,fetchReleaseNotes:()=>UT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Bj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>HT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=Uj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function qT(){return`npm install -g ${HT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Hz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Kj);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function WT($,Z){return j3($,Z)>0}function j3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:WT(Z,P$)};if(OH()&&!$.force)return null;let J=await Hz0(HT);if(!J)return null;return{current:P$,latest:J,hasUpdate:WT(J,P$)}}function Bm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function UT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.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(z)}}async function BT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Bm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Kj);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Bm(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(X)}}function KT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,HT,Bj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Kj=3000;var h8=n(()=>{Um();O5();P$=Uj.version,HT=Uj.name;OZ=`curl -fsSL ${Bj} | sh`;vJ=[]});var Mm={};A$(Mm,{stampResetGate:()=>Fj,resetGateBlockers:()=>Fm,enforceResetGate:()=>MT,LAST_RUN_VERSION_KEY:()=>FT});function Fm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function MT(){let $=$$(),Z=N4()[FT],J=Fm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
299
299
  `)),process.exit(1)}if(Z!==P$)Fj()}function Fj(){try{R2({[FT]:P$})}catch{}}var FT="app.lastRunVersion";var Mj=n(()=>{T2();h8();g4()});import{existsSync as Lm,readFileSync as qz0}from"fs";import{homedir as Uz0}from"os";import{join as Om,resolve as Nm}from"path";import{fileURLToPath as Bz0}from"url";function OT($=process.env){return`${$$($)} skill install`}function Nj(){let $=Bz0(import.meta.url);return[Nm($,"../../../../../.agents/skills/kobe"),Nm($,"../../skills/rove")].find((J)=>Lm(Om(J,"SKILL.md")))??null}function Lj($={}){let Z=$.source!==void 0?$.source:Nj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??Fz0,"--skill",t3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function xY($={}){return`npx ${Lj($).join(" ")}`}async function jT($,Z){return await Bun.spawn(["npx",...Lj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Oj($={}){let Z=$.home??Uz0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>Kz0.map((z)=>Om(X,z)))}function Mz0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function JF($){let Z=Oj($).find((z)=>Lm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:NT,stale:!1};let J=null;try{J=Mz0(qz0(Z,"utf8"))}catch{J=null}let X=J===null||J<NT;return{installed:!0,installedVersion:J,currentVersion:NT,stale:X}}function Nz0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function jm($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (qj(),Hj));if(Z())return;let J=$$(),X=OT(),z=JF();if(!z.installed){if(w5(LT)==="1")return;J6(LT,"1"),process.stderr.write(`
300
300
  ${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
301
301
  ${X}
package/dist/cli/rove.js CHANGED
@@ -288,14 +288,14 @@ trust_level = "trusted"
288
288
  `)){let U=H.trim();if(!U)continue;if(!G9(U))continue;let B;try{B=JSON.parse(U)}catch{continue}if(!uR(B)||typeof B.type!=="string")continue;let M=typeof B.timestamp==="string"?B.timestamp:new Date().toISOString(),O=uR(B.data)?B.data:{};if(B.type==="session.start"){let N=typeof O.sessionId==="string"?O.sessionId:void 0;if(N)z=N;continue}if(B.type==="user.message"){let N=typeof O.content==="string"?O.content:"";if(!N)continue;if(!W)W=Buffer.from(N.slice(0,CQ0),"utf8").toString("utf8");J.push({role:"user",blocks:[{type:"text",text:N}],timestamp:M,sessionId:z});continue}if(B.type==="assistant.message"){let N=[],j=typeof O.content==="string"?O.content:"";if(j)N.push({type:"text",text:j});let A=Array.isArray(O.toolRequests)?O.toolRequests:[];for(let _ of A){if(!uR(_))continue;let C=typeof _.id==="string"?_.id:typeof _.toolCallId==="string"?_.toolCallId:"tool",y=typeof _.name==="string"?_.name:typeof _.toolName==="string"?_.toolName:"tool";N.push({type:"tool_call",callId:C,name:y,input:_.arguments??{}})}if(N.length>0)J.push({role:"assistant",blocks:N,timestamp:M,sessionId:z});continue}if(B.type==="tool.execution_start"){let N=typeof O.toolCallId==="string"?O.toolCallId:void 0,j=typeof O.toolName==="string"?O.toolName:"tool";if(N)X.set(N,j);continue}if(B.type==="tool.execution_complete"){let N=typeof O.toolCallId==="string"?O.toolCallId:void 0;if(!N)continue;let j=X.get(N)??(typeof O.toolName==="string"?O.toolName:"tool"),A=O.result??(O.success===!1?{success:!1}:void 0);J.push({role:"assistant",blocks:[{type:"tool_result",callId:N,output:A,isError:O.success===!1}],timestamp:M,sessionId:z});continue}if(B.type==="session.shutdown")G=Pv(O)}return{messages:J,toolNameById:X,sessionId:z,usageMetrics:G,firstUserMessage:W}}function uR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var IY,VQ0,CQ0=200;var Iv=n(()=>{bJ();tO();IY={copilotDir(){let $=process.env.COPILOT_HOME?.trim();if($)return $;return yQ.join(NQ0(),".copilot")},async readdir($){try{return await KQ0($)}catch{return[]}},async readFile($){return await NZ($)},stat:MQ0,async rm($){await FQ0($,{recursive:!0,force:!0})}};VQ0=lH({initial:jQ0,parseChunk:($,Z)=>_Q0($,Z)})});import{stat as AQ0}from"fs/promises";import{homedir as PQ0}from"os";import Qj from"path";function RQ0($){let Z=[];for(let J of $.split(`
289
289
  `)){if(!J.trim())continue;try{let{sessionId:X,sessionDir:z,workDir:G}=JSON.parse(J);if(X&&z&&G)Z.push({sessionId:X,sessionDir:z,workDir:G})}catch{}}return Z}async function Ev($){let Z=await $.readFile(Qj.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return RQ0(Z)}function wv($){return Qj.join($,"agents","main","wire.jsonl")}async function nR($,Z=pR){if(!$)return[];let J=[];for(let X of await Ev(Z)){if(X.workDir!==$)continue;let z=await Z.stat(wv(X.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;J.push({id:X.sessionId,mtimeMs:z})}return J.sort((X,z)=>X.mtimeMs-z.mtimeMs).map((X)=>X.id)}async function xv($,Z=pR){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function iR($,Z=pR){if(!$)return null;let J=(await Ev(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=wv(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var pR;var fv=n(()=>{bJ();pR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||Qj.join(PQ0(),".kimi-code")},async readFile($){return await NZ($)},stat:AQ0}});import SQ0 from"path";var zj,yv,bv,gv,kv;var vv=n(()=>{hR();$j();Iv();fv();zj={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},yv={async listSessionIdsForWorktree($){return[...await pH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>Dv($),async transcriptPath($,Z){return(await pH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>Cv($)},bv={listSessionIdsForWorktree:($)=>Wv($),readHistory:($)=>qv($),transcriptPath:async($)=>await gR($)??null,latestTranscriptMtimeForWorktree:($)=>Hv($)},gv={listSessionIdsForWorktree:($)=>Rv($),readHistory:($)=>Sv($),async transcriptPath($){let Z=await dR($);return Z?SQ0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>Tv($)},kv={listSessionIdsForWorktree:($)=>nR($),readHistory:zj.readHistory,transcriptPath:($)=>iR($),async latestTranscriptMtimeForWorktree($){let J=(await nR($)).at(-1);if(!J)return 0;let X=await iR(J);return X?await xv(X):0}}});import{createHash as IQ0}from"crypto";import{existsSync as EQ0,mkdirSync as wQ0,writeFileSync as xQ0}from"fs";import{homedir as mv}from"os";import oR from"path";function fQ0($,Z=mv()){let J=IQ0("sha256").update($).digest("hex").slice(0,12);return oR.join(Z,".kimi-code","workspace-trust",`wd_${oR.basename($)}_${J}`)}function hv($,Z=mv()){let J=fQ0($,Z);if(EQ0(J))return;wQ0(oR.dirname(J),{recursive:!0,mode:448}),xQ0(J,JSON.stringify({root:$,trustedAt:Date.now()}),{mode:384})}var uv=()=>{};import{readFile as dv,stat as yQ0}from"fs/promises";class Yj{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function lv($){return I$($).createTurnDetector()}function cv($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
290
290
  `)){z++;let W=nv(G);if(!W)continue;let H=sR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=iv(W,J),B={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||B.timestampMs>=X.timestampMs)X=B}return X}function vQ0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=sR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&kQ0.has(Z.type)}function mQ0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
291
- `)){X++;let G=nv(z);if(!G||!vQ0(G))continue;let W=iv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function nv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return sR(J)?J:null}catch{return null}}function iv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function sR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var pv=($)=>yQ0($).then((Z)=>Z.mtimeMs,()=>0),bQ0,aR,gQ0,rR,tK,kQ0;var tR=n(()=>{hR();$j();R7();bQ0={listSessionFiles:($)=>pH($),readFile:($)=>dv($,"utf8"),statMtimeMs:pv};aR=class aR extends Yj{deps;vendor="claude";cache=new Map;constructor($=bQ0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=cv(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??pv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:cv(J,$,Z),mtimeMs:Z}}};gQ0={findLatestRollout:($)=>kR($),readFile:($)=>dv($,"utf8")};rR=class rR extends Yj{deps;vendor="codex";cache=null;constructor($=gQ0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=mQ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};tK=class tK extends Yj{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};kQ0=new Set(["task_complete","turn_complete","turn_aborted"])});function hQ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:zj,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new eK($),createTurnDetector:()=>new tK($)}}function I$($){return d5($)?eR[$]:hQ0($)}function ov($){return I$($).history.readHistory!==zj.readHistory}function $T($){let Z=I$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:av}function bQ($,Z){let J=Z?$T(Z):av;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function Gj($,Z){let J=I$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function rv(){return Object.values(eR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var eR,av;var R7=n(()=>{C7();gJ();Pk();AR();mk();uk();pk();ok();rk();Fv();Lv();vv();ZT();uv();tR();eR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:yv,detectAccount:($)=>vH($),createHookAdapter:()=>new DR,createTurnDetector:()=>new aR,capabilities:Dk,identity:Ak,trustWorktree:hk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>vk(),readTurns:lk},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:bv,detectAccount:($)=>mH($),createHookAdapter:()=>new SR,createTurnDetector:()=>new rR,capabilities:nk,identity:ik,trustWorktree:Nv,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]'],statusPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],workingPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]},quotaUsage:()=>Kv()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:gv,detectAccount:($)=>hH($),createHookAdapter:()=>new eK("copilot"),createTurnDetector:()=>new tK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:hv,history:kv,detectAccount:($)=>cO($),createHookAdapter:()=>new eK("kimi"),createTurnDetector:()=>new tK("kimi")}};av=[...new Set(Object.values(eR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function JT($){return I$($).createHookAdapter()}class eK{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 ZT=n(()=>{R7()});function Wj($){return uQ0.includes($)}function sv($){return cQ0.includes($)}var uQ0,cQ0;var XT=n(()=>{uQ0=["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"];cQ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Hj={};A$(Hj,{migrationHint:()=>rQ0,isRovePluginEnabled:()=>iQ0,detectLegacyInstalls:()=>oQ0});import{existsSync as dQ0,readFileSync as lQ0}from"fs";import{homedir as pQ0}from"os";import{join as tv}from"path";function ev($){try{let Z=JSON.parse(lQ0($,"utf8"));return P7(Z)?Z:null}catch{return null}}function iQ0($=iO()){let Z=ev($);if(!Z||!P7(Z.enabledPlugins))return!1;return Object.entries(Z.enabledPlugins).some(([J,X])=>X===!0&&J.split("@")[0]===nQ0)}function oQ0($={}){let Z=$.settingsFilePath??iO(),J=$.home??pQ0(),X=ev(Z),z=X!==null&&(wk(X,nO)||aQ0(X)),G=["rove","kobe"].map((W)=>tv(J,".claude","skills",W)).filter((W)=>dQ0(tv(W,"SKILL.md")));return{legacyHooks:z,legacySkillDirs:G}}function aQ0($){let Z=P7($.hooks)?$.hooks:{};return Object.values(Z).some((J)=>Array.isArray(J)&&J.some((X)=>P7(X)&&Array.isArray(X.hooks)&&X.hooks.some((z)=>P7(z)&&typeof z.command==="string"&&z.command.includes("worktree-created")&&!z.command.includes("CLAUDE_PLUGIN_ROOT"))))}function rQ0($,Z){if(!$.legacyHooks&&$.legacySkillDirs.length===0)return null;let J=[`${Z}: the Rove Claude Code plugin is enabled, but legacy installs remain:`];if($.legacyHooks)J.push(" \u2022 ~/.claude/settings.json still has the settings-managed Rove hooks (every event fires TWICE).",` Run \`${Z} hook cleanup\` to remove them (only Rove's own entries are touched).`);for(let X of $.legacySkillDirs)J.push(` \u2022 legacy skill copy at ${X} (the plugin bundles the skill \u2014 two copies double-register).`," Remove that directory to keep the plugin's copy only.");return`${J.join(`
291
+ `)){X++;let G=nv(z);if(!G||!vQ0(G))continue;let W=iv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function nv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return sR(J)?J:null}catch{return null}}function iv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function sR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var pv=($)=>yQ0($).then((Z)=>Z.mtimeMs,()=>0),bQ0,aR,gQ0,rR,tK,kQ0;var tR=n(()=>{hR();$j();R7();bQ0={listSessionFiles:($)=>pH($),readFile:($)=>dv($,"utf8"),statMtimeMs:pv};aR=class aR extends Yj{deps;vendor="claude";cache=new Map;constructor($=bQ0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=cv(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??pv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:cv(J,$,Z),mtimeMs:Z}}};gQ0={findLatestRollout:($)=>kR($),readFile:($)=>dv($,"utf8")};rR=class rR extends Yj{deps;vendor="codex";cache=null;constructor($=gQ0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=mQ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};tK=class tK extends Yj{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};kQ0=new Set(["task_complete","turn_complete","turn_aborted"])});function hQ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:zj,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new eK($),createTurnDetector:()=>new tK($)}}function I$($){return d5($)?eR[$]:hQ0($)}function ov($){return I$($).history.readHistory!==zj.readHistory}function $T($){let Z=I$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:av}function bQ($,Z){let J=Z?$T(Z):av;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function Gj($,Z){let J=I$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function rv(){return Object.values(eR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var eR,av;var R7=n(()=>{C7();gJ();Pk();AR();mk();uk();pk();ok();rk();Fv();Lv();vv();ZT();uv();tR();eR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:yv,detectAccount:($)=>vH($),createHookAdapter:()=>new DR,createTurnDetector:()=>new aR,capabilities:Dk,identity:Ak,trustWorktree:hk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>vk(),readTurns:lk},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:bv,detectAccount:($)=>mH($),createHookAdapter:()=>new SR,createTurnDetector:()=>new rR,capabilities:nk,identity:ik,trustWorktree:Nv,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]'],statusPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],workingPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]},quotaUsage:()=>Kv()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:gv,detectAccount:($)=>hH($),createHookAdapter:()=>new eK("copilot"),createTurnDetector:()=>new tK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:hv,history:kv,detectAccount:($)=>cO($),createHookAdapter:()=>new eK("kimi"),createTurnDetector:()=>new tK("kimi")}};av=[...new Set(Object.values(eR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function JT($){return I$($).createHookAdapter()}class eK{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 ZT=n(()=>{R7()});function Wj($){return uQ0.includes($)}function sv($){return cQ0.includes($)}var uQ0,cQ0;var XT=n(()=>{uQ0=["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"];cQ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Hj={};A$(Hj,{migrationHint:()=>rQ0,isRovePluginEnabled:()=>iQ0,detectLegacyInstalls:()=>oQ0});import{existsSync as dQ0,readFileSync as lQ0}from"fs";import{homedir as pQ0}from"os";import{join as tv}from"path";function ev($){try{let Z=JSON.parse(lQ0($,"utf8"));return P7(Z)?Z:null}catch{return null}}function iQ0($=iO()){let Z=ev($);if(!Z||!P7(Z.enabledPlugins))return!1;return Object.entries(Z.enabledPlugins).some(([J,X])=>X===!0&&J.split("@")[0]===nQ0)}function oQ0($={}){let Z=$.settingsFilePath??iO(),J=$.home??pQ0(),X=ev(Z),z=X!==null&&(wk(X,nO)||aQ0(X)),G=["rove","kobe"].map((W)=>tv(J,".claude","skills",W)).filter((W)=>dQ0(tv(W,"SKILL.md")));return{legacyHooks:z,legacySkillDirs:G}}function aQ0($){let Z=P7($.hooks)?$.hooks:{};return Object.values(Z).some((J)=>Array.isArray(J)&&J.some((X)=>P7(X)&&Array.isArray(X.hooks)&&X.hooks.some((z)=>P7(z)&&typeof z.command==="string"&&z.command.includes("worktree-created")&&!z.command.includes("CLAUDE_PLUGIN_ROOT"))))}function rQ0($,Z){if(!$.legacyHooks&&$.legacySkillDirs.length===0)return null;let J=[`${Z}: the Rove Claude Code plugin is enabled, but legacy installs remain:`];if($.legacyHooks)J.push(" \u2022 ~/.claude/settings.json still has the settings-managed Rove hooks (every event fires TWICE).",` Run \`${Z} hook cleanup\` to remove them (only Rove's own entries are touched).`);for(let X of $.legacySkillDirs)J.push(` \u2022 legacy skill copy at ${X} (the plugin bundles the skill \u2014 two copies double-register).`," Remove that directory to keep the plugin's copy only.");return J.push(" Reading this inside a session? Just ask your agent to run the cleanup for you."),`${J.join(`
292
292
  `)}
293
293
  `}var nQ0="rove";var qj=n(()=>{pO();AR()});var qm={};A$(qm,{runHookSubcommand:()=>Jz0,readTextWithTimeout:()=>Xm,parseWorktreeRemovePath:()=>Gm,parseWorktreeAddPath:()=>Ym,ensureGlobalKobeHooks:()=>YT});import{homedir as sQ0}from"os";import{join as Jm,resolve as QT}from"path";async function Xm($,Z=tQ0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function Qm(){try{let $=await Xm(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function $m($,Z){for(let J=0;J<$.length;J++){if($[J]===Z)return $[J+1];if($[J].startsWith(`${Z}=`))return $[J].slice(Z.length+1)}return}function $z0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function zm($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function Ym($){let Z=zm($),J=new Set(["-b","-B","--reason"]);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="add")continue;let z=X+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=J.has(G)?2:1;continue}return G}}return}function Gm($){let Z=zm($);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="remove")continue;let X=J+2;while(X<Z.length){let z=Z[X];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){X+=1;continue}return z}}return}async function Zz0(){let $=await Qm(),Z=$z0($.tool_input)?$.tool_input:{},J=typeof Z.command==="string"?Z.command:"";if(!J.includes("worktree"))return;let X=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=Ym(J),G=z?void 0:Gm(J);if(!z&&!G)return;let W=await VQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:QT(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:QT(X,G)})}finally{W.close()}}async function Jz0($){let[Z,...J]=$;if(Z==="setup"){await Gz0(J);return}if(Z==="cleanup"){await Yz0();return}if(Z===eQ0){try{await Zz0()}catch{}return}try{if(!Z||!Wj(Z))return;let X=await Qm(),z=$m(J,"--task-id"),G=typeof X.cwd==="string"&&X.cwd?X.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=$m(J,"--engine"),B=zT().filter((j)=>!U||j.vendor===U),M;for(let j of B)if(M=j.activityDetailFromPayload(Z,X),M)break;let O;for(let j of B)if(O=j.sessionFromPayload(X),O)break;let N=await VQ();if(!N)return;try{let j=z??W;await N.request("engine.reportEvent",{...j?{taskId:j}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...M?{detail:M}:{},...O?{sessionId:O.sessionId}:{},...O?.transcriptPath?{transcriptPath:O.transcriptPath}:{}})}finally{N.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function Xz0(){return b8.map(($)=>JT($)).filter(($)=>$.supportsWorktreeSync())}function zT(){return b8.map(($)=>JT($)).filter(($)=>$.supportsHooks())}function Wm(){return Jm(sQ0(),".claude","settings.json")}function Qz0($){if(!$||$==="off")return;if($==="global")return Wm();if($.startsWith("repo:"))return Jm(QT($.slice(5)),".claude","settings.json");return $}async function YT(){try{let{isRovePluginEnabled:$,detectLegacyInstalls:Z,migrationHint:J}=await Promise.resolve().then(() => (qj(),Hj)),X=$();if(X){let G=J(Z(),$$());if(G)process.stderr.write(`
294
294
  ${G}
295
295
  `)}let z=zz0();for(let G of zT()){if(X&&G.vendor==="claude")continue;let W=G.globalSettingsPath();if(!W)continue;await G.installActivityHooks(W,{toolEvents:z}),await G.installWorktreeWatchHook(W)}await Hm()}catch{}}function zz0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(BZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Hm(){let $=Xz0();if($.length===0)return;let Z=w5(Zm),J=new Set([Wm()]),X=Qz0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")J6(Zm,"off")}async function Yz0(){let $=zT().find((J)=>J.vendor==="claude"),Z=$?.globalSettingsPath();if(!$||!Z){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
296
296
  `);return}await $.removeActivityHooks(Z),await $.removeWorktreeWatchHook(Z),process.stdout.write([`rove hook cleanup: removed Rove's settings-managed hooks from ${Z}.`,"Only Rove's own entries were touched; your other hooks are intact.","The Claude Code plugin's hooks.json now carries these events (if the plugin","is not installed, the next Rove launch reinstalls the settings-managed set).",""].join(`
297
297
  `))}async function Gz0($){await Hm(),process.stdout.write(["rove 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 Rove previously installed has been removed.","","Sync is now automatic: a `claude --worktree` (or any session) started in a","worktree under a repo Rove already tracks is adopted as a task on launch.","To adopt existing worktrees on demand, use the New Task dialog or `rove adopt`.",""].join(`
298
- `))}var tQ0=500,eQ0="worktree-created",Zm="externalWorktreeSync";var GT=n(()=>{P2();SQ();yJ();ZT();XT();_4();C7();g4()});var Uj;var Um=n(()=>{Uj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.125",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.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/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.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 --retry=2 --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.14","@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 Km={};A$(Km,{repoSlug:()=>EY,releasePageUrl:()=>KT,recommendedGlobalInstallCommand:()=>qT,isNewerSemver:()=>WT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>BT,fetchReleaseNotes:()=>UT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Bj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>HT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=Uj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function qT(){return`npm install -g ${HT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Hz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Kj);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function WT($,Z){return j3($,Z)>0}function j3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:WT(Z,P$)};if(OH()&&!$.force)return null;let J=await Hz0(HT);if(!J)return null;return{current:P$,latest:J,hasUpdate:WT(J,P$)}}function Bm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function UT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.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(z)}}async function BT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Bm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Kj);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Bm(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(X)}}function KT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,HT,Bj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Kj=3000;var h8=n(()=>{Um();O5();P$=Uj.version,HT=Uj.name;OZ=`curl -fsSL ${Bj} | sh`;vJ=[]});var Mm={};A$(Mm,{stampResetGate:()=>Fj,resetGateBlockers:()=>Fm,enforceResetGate:()=>MT,LAST_RUN_VERSION_KEY:()=>FT});function Fm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function MT(){let $=$$(),Z=N4()[FT],J=Fm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
298
+ `))}var tQ0=500,eQ0="worktree-created",Zm="externalWorktreeSync";var GT=n(()=>{P2();SQ();yJ();ZT();XT();_4();C7();g4()});var Uj;var Um=n(()=>{Uj={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.126",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.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/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.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 --retry=2 --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.14","@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 Km={};A$(Km,{repoSlug:()=>EY,releasePageUrl:()=>KT,recommendedGlobalInstallCommand:()=>qT,isNewerSemver:()=>WT,fetchReleaseSummaries:()=>ZF,fetchReleaseNotesRange:()=>BT,fetchReleaseNotes:()=>UT,compareSemver:()=>j3,checkLatestVersion:()=>wY,breakingVersionsCrossed:()=>$F,UPDATE_SCRIPT_URL:()=>Bj,UPDATE_COMMAND:()=>OZ,PACKAGE_NAME:()=>HT,CURRENT_VERSION:()=>P$,BREAKING_VERSIONS:()=>vJ});function EY(){let $=Uj.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function qT(){return`npm install -g ${HT}@latest`}function $F($,Z,J=vJ){let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}async function Hz0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),Kj);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function WT($,Z){return j3($,Z)>0}function j3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function wY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:P$,latest:Z,hasUpdate:WT(Z,P$)};if(OH()&&!$.force)return null;let J=await Hz0(HT);if(!J)return null;return{current:P$,latest:J,hasUpdate:WT(J,P$)}}function Bm($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function UT($){let Z=EY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.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(z)}}async function BT($){let Z=EY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),Kj);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Bm(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(j3(U,$.current)<=0)return null;if(j3(U,$.latest)>0)return null;return{version:U,url:H.html_url,body:H.body}}).filter((H)=>H!==null)}catch{return[]}finally{clearTimeout(z)}}async function ZF($=12){let Z=EY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),Kj);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Bm(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(X)}}function KT($){let Z=EY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var P$,HT,Bj="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",OZ,vJ,Kj=3000;var h8=n(()=>{Um();O5();P$=Uj.version,HT=Uj.name;OZ=`curl -fsSL ${Bj} | sh`;vJ=[]});var Mm={};A$(Mm,{stampResetGate:()=>Fj,resetGateBlockers:()=>Fm,enforceResetGate:()=>MT,LAST_RUN_VERSION_KEY:()=>FT});function Fm($,Z=P$,J=vJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=j3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>j3(G,X)>0&&j3(G,z)<=0)}function MT(){let $=$$(),Z=N4()[FT],J=Fm(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${P$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
299
299
  `)),process.exit(1)}if(Z!==P$)Fj()}function Fj(){try{R2({[FT]:P$})}catch{}}var FT="app.lastRunVersion";var Mj=n(()=>{T2();h8();g4()});import{existsSync as Lm,readFileSync as qz0}from"fs";import{homedir as Uz0}from"os";import{join as Om,resolve as Nm}from"path";import{fileURLToPath as Bz0}from"url";function OT($=process.env){return`${$$($)} skill install`}function Nj(){let $=Bz0(import.meta.url);return[Nm($,"../../../../../.agents/skills/kobe"),Nm($,"../../skills/rove")].find((J)=>Lm(Om(J,"SKILL.md")))??null}function Lj($={}){let Z=$.source!==void 0?$.source:Nj(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??Fz0,"--skill",t3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function xY($={}){return`npx ${Lj($).join(" ")}`}async function jT($,Z){return await Bun.spawn(["npx",...Lj({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function Oj($={}){let Z=$.home??Uz0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>Kz0.map((z)=>Om(X,z)))}function Mz0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function JF($){let Z=Oj($).find((z)=>Lm(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:NT,stale:!1};let J=null;try{J=Mz0(qz0(Z,"utf8"))}catch{J=null}let X=J===null||J<NT;return{installed:!0,installedVersion:J,currentVersion:NT,stale:X}}function Nz0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function jm($={}){let{isRovePluginEnabled:Z}=await Promise.resolve().then(() => (qj(),Hj));if(Z())return;let J=$$(),X=OT(),z=JF();if(!z.installed){if(w5(LT)==="1")return;J6(LT,"1"),process.stderr.write(`
300
300
  ${J}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${J} api\`:
301
301
  ${X}
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.125",
4
+ "version": "0.8.126",
5
5
  "description": "Rove — the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",