@sma1lboy/kobe 0.8.125 → 0.8.127
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 +3 -3
- package/dist/cli/kobe.js +3 -3
- package/dist/cli/rove.js +3 -3
- package/dist/skills/rove/SKILL.md +8 -1
- package/package.json +1 -1
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
|
|
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.
|
|
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.127",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}
|
|
@@ -309,7 +309,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
|
|
|
309
309
|
${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
|
|
310
310
|
Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??Kz0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??OT)();if(B===0)process.stderr.write(`${J}: skill updated.
|
|
311
311
|
`);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
|
|
312
|
-
`)}else if(U.startsWith("d"))J6(G,"1")}var MT=
|
|
312
|
+
`)}else if(U.startsWith("d"))J6(G,"1")}var MT=29,qz0,Uz0="Sma1lboy/rove",NT="skillHintSeen";var XF=n(()=>{h4();NQ();_4();qz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var Oj=()=>{};var q1=FY((Fz0,jj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
|
|
313
313
|
|
|
314
314
|
Your code should look like:
|
|
315
315
|
const MyComponent = lazy(() => import('./MyComponent'))
|
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
|
|
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.
|
|
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.127",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}
|
|
@@ -309,7 +309,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
|
|
|
309
309
|
${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
|
|
310
310
|
Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??Nz0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??jT)();if(B===0)process.stderr.write(`${J}: skill updated.
|
|
311
311
|
`);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
|
|
312
|
-
`)}else if(U.startsWith("d"))J6(G,"1")}var NT=
|
|
312
|
+
`)}else if(U.startsWith("d"))J6(G,"1")}var NT=29,Kz0,Fz0="Sma1lboy/rove",LT="skillHintSeen";var XF=n(()=>{g4();NQ();_4();Kz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var jj=()=>{};var q1=FY((Lz0,Vj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
|
|
313
313
|
|
|
314
314
|
Your code should look like:
|
|
315
315
|
const MyComponent = lazy(() => import('./MyComponent'))
|
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
|
|
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.
|
|
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.127",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}
|
|
@@ -309,7 +309,7 @@ ${J}: your Rove agent skill is out of date (${W}; this Rove wants v${z.currentVe
|
|
|
309
309
|
${J}: a new version of the Rove agent skill is available (${W} \u2192 v${z.currentVersion}).
|
|
310
310
|
Update now? [y]es / [n]o / [d]on't notify for this version: `);let U=(await($.ask??Nz0)()).trim().toLowerCase();if(U==="y"||U==="yes"){let B=await($.install??jT)();if(B===0)process.stderr.write(`${J}: skill updated.
|
|
311
311
|
`);else process.stderr.write(`${J}: skill update failed (exit ${B}) \u2014 run \`${X}\` manually.
|
|
312
|
-
`)}else if(U.startsWith("d"))J6(G,"1")}var NT=
|
|
312
|
+
`)}else if(U.startsWith("d"))J6(G,"1")}var NT=29,Kz0,Fz0="Sma1lboy/rove",LT="skillHintSeen";var XF=n(()=>{g4();NQ();_4();Kz0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var jj=()=>{};var q1=FY((Lz0,Vj)=>{(function(){function $($0,S0){Object.defineProperty(X.prototype,$0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z($0){if($0===null||typeof $0!=="object")return null;return $0=D0&&$0[D0]||$0["@@iterator"],typeof $0==="function"?$0:null}function J($0,S0){$0=($0=$0.constructor)&&($0.displayName||$0.name)||"ReactClass";var e0=$0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,$0),u0[e0]=!0)}function X($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function z(){}function G($0,S0,e0){this.props=$0,this.context=S0,this.refs=W1,this.updater=e0||O0}function W(){}function H($0){return""+$0}function U($0){try{H($0);var S0=!1}catch(n1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&$0[Symbol.toStringTag]||$0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H($0)}}function B($0){if($0==null)return null;if(typeof $0==="function")return $0.$$typeof===c0?null:$0.displayName||$0.name||null;if(typeof $0==="string")return $0;switch($0){case c:return"Fragment";case p:return"Profiler";case h:return"StrictMode";case Z0:return"Suspense";case C0:return"SuspenseList";case g0:return"Activity"}if(typeof $0==="object")switch(typeof $0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),$0.$$typeof){case v:return"Portal";case X0:return $0.displayName||"Context";case q0:return($0._context.displayName||"Context")+".Consumer";case r:var S0=$0.render;return $0=$0.displayName,$0||($0=S0.displayName||S0.name||"",$0=$0!==""?"ForwardRef("+$0+")":"ForwardRef"),$0;case Q0:return S0=$0.displayName||null,S0!==null?S0:B($0.type)||"Memo";case w0:S0=$0._payload,$0=$0._init;try{return B($0(S0))}catch(e0){}}return null}function M($0){if($0===c)return"<>";if(typeof $0==="object"&&$0!==null&&$0.$$typeof===w0)return"<...>";try{var S0=B($0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function O(){var $0=Z1.A;return $0===null?null:$0.getOwner()}function N(){return Error("react-stack-top-frame")}function j($0){if(u1.call($0,"key")){var S0=Object.getOwnPropertyDescriptor($0,"key").get;if(S0&&S0.isReactWarning)return!1}return $0.key!==void 0}function A($0,S0){function e0(){B$||(B$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty($0,"key",{get:e0,configurable:!0})}function _(){var $0=B(this.type);return o5[$0]||(o5[$0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),$0=this.props.ref,$0!==void 0?$0:null}function C($0,S0,e0,U1,n1,x$){var D$=e0.ref;return $0={$$typeof:Y0,type:$0,key:S0,props:e0,_owner:U1},(D$!==void 0?D$:null)!==null?Object.defineProperty($0,"ref",{enumerable:!1,get:_}):Object.defineProperty($0,"ref",{enumerable:!1,value:null}),$0._store={},Object.defineProperty($0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty($0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty($0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:n1}),Object.defineProperty($0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:x$}),Object.freeze&&(Object.freeze($0.props),Object.freeze($0)),$0}function y($0,S0){return S0=C($0.type,S0,$0.props,$0._owner,$0._debugStack,$0._debugTask),$0._store&&(S0._store.validated=$0._store.validated),S0}function E($0){T($0)?$0._store&&($0._store.validated=1):typeof $0==="object"&&$0!==null&&$0.$$typeof===w0&&($0._payload.status==="fulfilled"?T($0._payload.value)&&$0._payload.value._store&&($0._payload.value._store.validated=1):$0._store&&($0._store.validated=1))}function T($0){return typeof $0==="object"&&$0!==null&&$0.$$typeof===Y0}function R($0){var S0={"=":"=0",":":"=2"};return"$"+$0.replace(/[=:]/g,function(e0){return S0[e0]})}function w($0,S0){return typeof $0==="object"&&$0!==null&&$0.key!=null?(U($0.key),R(""+$0.key)):S0.toString(36)}function k($0){switch($0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason;default:switch(typeof $0.status==="string"?$0.then(W,W):($0.status="pending",$0.then(function(S0){$0.status==="pending"&&($0.status="fulfilled",$0.value=S0)},function(S0){$0.status==="pending"&&($0.status="rejected",$0.reason=S0)})),$0.status){case"fulfilled":return $0.value;case"rejected":throw $0.reason}}throw $0}function b($0,S0,e0,U1,n1){var x$=typeof $0;if(x$==="undefined"||x$==="boolean")$0=null;var D$=!1;if($0===null)D$=!0;else switch(x$){case"bigint":case"string":case"number":D$=!0;break;case"object":switch($0.$$typeof){case Y0:case v:D$=!0;break;case w0:return D$=$0._init,b(D$($0._payload),S0,e0,U1,n1)}}if(D$){D$=$0,n1=n1(D$);var K4=U1===""?"."+w(D$,0):U1;return N0(n1)?(e0="",K4!=null&&(e0=K4.replace(jX,"$&/")+"/"),b(n1,S0,e0,"",function(E7){return E7})):n1!=null&&(T(n1)&&(n1.key!=null&&(D$&&D$.key===n1.key||U(n1.key)),e0=y(n1,e0+(n1.key==null||D$&&D$.key===n1.key?"":(""+n1.key).replace(jX,"$&/")+"/")+K4),U1!==""&&D$!=null&&T(D$)&&D$.key==null&&D$._store&&!D$._store.validated&&(e0._store.validated=2),n1=e0),S0.push(n1)),1}if(D$=0,K4=U1===""?".":U1+":",N0($0))for(var b$=0;b$<$0.length;b$++)U1=$0[b$],x$=K4+w(U1,b$),D$+=b(U1,S0,e0,x$,n1);else if(b$=Z($0),typeof b$==="function")for(b$===$0.entries&&(r8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),r8=!0),$0=b$.call($0),b$=0;!(U1=$0.next()).done;)U1=U1.value,x$=K4+w(U1,b$++),D$+=b(U1,S0,e0,x$,n1);else if(x$==="object"){if(typeof $0.then==="function")return b(k($0),S0,e0,U1,n1);throw S0=String($0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys($0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return D$}function u($0,S0,e0){if($0==null)return $0;var U1=[],n1=0;return b($0,U1,"","",function(x$){return S0.call(e0,x$,n1++)}),U1}function a($0){if($0._status===-1){var S0=$0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=$0._result;var e0=S0();if(e0.then(function(n1){if($0._status===0||$0._status===-1){$0._status=1,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=n1)}},function(n1){if($0._status===0||$0._status===-1){$0._status=2,$0._result=n1;var x$=$0._ioInfo;x$!=null&&(x$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=n1)}}),S0=$0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}$0._status===-1&&($0._status=0,$0._result=e0)}if($0._status===1)return S0=$0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
|
|
313
313
|
|
|
314
314
|
Your code should look like:
|
|
315
315
|
const MyComponent = lazy(() => import('./MyComponent'))
|
|
@@ -3,7 +3,7 @@ name: rove
|
|
|
3
3
|
description: Use when controlling Rove tasks, parallel coding attempts, hosted agent sessions, task lifecycle, or the daemon-owned issue tracker from a shell. Also the ONLY channel for messaging another agent session on this machine — `rove api send`, never a peer/MCP side channel.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
<!-- rove-skill-version:
|
|
6
|
+
<!-- rove-skill-version: 29 — bump in lockstep with KOBE_SKILL_VERSION (src/lib/skill-install.ts). -->
|
|
7
7
|
|
|
8
8
|
# Rove shell control
|
|
9
9
|
|
|
@@ -394,6 +394,13 @@ branch>)"` routes the outcome back to that exact tab. Include the final
|
|
|
394
394
|
branch name — the spawner needs it to `land`. The first-prompt coda still
|
|
395
395
|
names the spawner for an explicit `--task-id` send.
|
|
396
396
|
|
|
397
|
+
**"Succeeded" means COMMITTED.** Green tests in your working tree are not a
|
|
398
|
+
deliverable — the only thing `land` can merge is commits on your branch.
|
|
399
|
+
Before reporting success: `git status` clean, your work committed with a
|
|
400
|
+
real message (you wrote the code; you write its message). A worker that ran
|
|
401
|
+
everything, passed everything, and committed nothing has delivered nothing —
|
|
402
|
+
that exact mismatch has shipped empty merges before.
|
|
403
|
+
|
|
397
404
|
**Coordinator side** — do NOT block or poll. Keep working (or end your
|
|
398
405
|
turn); each worker's outcome arrives in your chat as a `[KOBE PEER]` message
|
|
399
406
|
with its task id. What arrives is the worker's claim, not Rove-verified —
|
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.
|
|
4
|
+
"version": "0.8.127",
|
|
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",
|