@sma1lboy/rove 0.8.96 → 0.8.97

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -283,7 +283,7 @@ ${z}`,Z);this.line=J,this.column=X,this.codeblock=z}}});function FL($,Z){let J=$
283
283
  `)){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 Pk($){let Z=await $.readFile(kL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return CJ0(Z)}function Rk($){return kL.join($,"agents","main","wire.jsonl")}async function KR($,Z=BR){if(!$)return[];let J=[];for(let X of await Pk(Z)){if(X.workDir!==$)continue;let z=await Z.stat(Rk(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 Tk($,Z=BR){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function FR($,Z=BR){if(!$)return null;let J=(await Pk(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=Rk(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var BR;var Sk=a(()=>{AQ();BR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||kL.join(_J0(),".kimi-code")},async readFile($){return await DQ($)},stat:VJ0}});import AJ0 from"path";var vL,Ik,Ek,wk,xk;var fk=a(()=>{GR();fL();Ak();Sk();vL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},Ik={async listSessionIdsForWorktree($){return[...await bH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>Lk($),async transcriptPath($,Z){return(await bH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>Ok($)},Ek={listSessionIdsForWorktree:($)=>Qk($),readHistory:($)=>Yk($),transcriptPath:async($)=>await XR($)??null,latestTranscriptMtimeForWorktree:($)=>zk($)},wk={listSessionIdsForWorktree:($)=>_k($),readHistory:($)=>Dk($),async transcriptPath($){let Z=await qR($);return Z?AJ0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>Ck($)},xk={listSessionIdsForWorktree:($)=>KR($),readHistory:vL.readHistory,transcriptPath:($)=>FR($),async latestTranscriptMtimeForWorktree($){let J=(await KR($)).at(-1);if(!J)return 0;let X=await FR(J);return X?await Tk(X):0}}});var mL,gk,yk;var hL=a(()=>{mL=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],gk=["\xB7","\u2722","\u2731","\u2736","\u273B","\u273D"],yk=[...gk,...[...gk].reverse()]});import{readFile as kk,stat as PJ0}from"fs/promises";class uL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function vk($){return D$($).createTurnDetector()}function bk($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
284
284
  `)){z++;let W=hk(G);if(!W)continue;let H=OR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=uk(W,J),K={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||K.timestampMs>=X.timestampMs)X=K}return X}function IJ0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=OR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&SJ0.has(Z.type)}function EJ0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
285
285
  `)){X++;let G=hk(z);if(!G||!IJ0(G))continue;let W=uk(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function hk($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return OR(J)?J:null}catch{return null}}function uk($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function OR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var mk=($)=>PJ0($).then((Z)=>Z.mtimeMs,()=>0),RJ0,MR,TJ0,NR,mK,SJ0;var LR=a(()=>{GR();fL();C7();RJ0={listSessionFiles:($)=>bH($),readFile:($)=>kk($,"utf8"),statMtimeMs:mk};MR=class MR extends uL{deps;vendor="claude";cache=new Map;constructor($=RJ0){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=bk(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??mk)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:bk(J,$,Z),mtimeMs:Z}}};TJ0={findLatestRollout:($)=>QR($),readFile:($)=>kk($,"utf8")};NR=class NR extends uL{deps;vendor="codex";cache=null;constructor($=TJ0){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=EJ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};mK=class mK extends uL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};SJ0=new Set(["task_complete","turn_complete","turn_aborted"])});function wJ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:vL,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new hK($),createTurnDetector:()=>new mK($)}}function D$($){return h7($)?jR[$]:wJ0($)}function ck($){return D$($).history.readHistory!==vL.readHistory}function VR($){let Z=D$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:dk}function kH($,Z){let J=Z?VR(Z):dk;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 cL($,Z){let J=D$($).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 lk(){return Object.values(jR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var jR,dk;var C7=a(()=>{u7();SJ();Sb();yb();ub();lb();nb();qk();fk();_R();hL();LR();jR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:Ik,detectAccount:($)=>IH($),createHookAdapter:()=>new pP,createTurnDetector:()=>new MR,capabilities:Rb,identity:Tb,spinnerFrames:yk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>hb()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:Ek,detectAccount:($)=>EH($),createHookAdapter:()=>new aP,createTurnDetector:()=>new NR,capabilities:cb,identity:db,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:()=>Hk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:wk,detectAccount:($)=>wH($),createHookAdapter:()=>new hK("copilot"),createTurnDetector:()=>new mK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],history:xk,detectAccount:($)=>TL($),createHookAdapter:()=>new hK("kimi"),createTurnDetector:()=>new mK("kimi")}};dk=[...new Set(Object.values(jR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function CR($){return D$($).createHookAdapter()}class hK{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 _R=a(()=>{C7()});function dL($){return xJ0.includes($)}function pk($){return fJ0.includes($)}var xJ0,fJ0;var DR=a(()=>{xJ0=["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"];fJ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Xv={};g$(Xv,{runHookSubcommand:()=>mJ0,readTextWithTimeout:()=>ak,parseWorktreeRemovePath:()=>ek,parseWorktreeAddPath:()=>tk,ensureGlobalKobeHooks:()=>PR});import{homedir as gJ0}from"os";import{join as ok,resolve as AR}from"path";async function ak($,Z=yJ0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function rk(){try{let $=await ak(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function nk($,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 kJ0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function sk($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function tk($){let Z=sk($),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 ek($){let Z=sk($);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 vJ0(){let $=await rk(),Z=kJ0($.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=tk(J),G=z?void 0:ek(J);if(!z&&!G)return;let W=await BQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:AR(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:AR(X,G)})}finally{W.close()}}async function mJ0($){let[Z,...J]=$;if(Z==="setup"){await dJ0(J);return}if(Z===bJ0){try{await vJ0()}catch{}return}try{if(!Z||!dL(Z))return;let X=await rk(),z=nk(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=nk(J,"--engine"),K=$v().filter((V)=>!U||V.vendor===U),N;for(let V of K)if(N=V.activityDetailFromPayload(Z,X),N)break;let L;for(let V of K)if(L=V.sessionFromPayload(X),L)break;let M=await BQ();if(!M)return;try{let V=z??W;await M.request("engine.reportEvent",{...V?{taskId:V}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...N?{detail:N}:{},...L?{sessionId:L.sessionId}:{},...L?.transcriptPath?{transcriptPath:L.transcriptPath}:{}})}finally{M.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function hJ0(){return T8.map(($)=>CR($)).filter(($)=>$.supportsWorktreeSync())}function $v(){return T8.map(($)=>CR($)).filter(($)=>$.supportsHooks())}function Zv(){return ok(gJ0(),".claude","settings.json")}function uJ0($){if(!$||$==="off")return;if($==="global")return Zv();if($.startsWith("repo:"))return ok(AR($.slice(5)),".claude","settings.json");return $}async function PR(){try{let $=cJ0();for(let Z of $v()){let J=Z.globalSettingsPath();if(!J)continue;await Z.installActivityHooks(J,{toolEvents:$}),await Z.installWorktreeWatchHook(J)}await Jv()}catch{}}function cJ0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(XZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Jv(){let $=hJ0();if($.length===0)return;let Z=l7(ik),J=new Set([Zv()]),X=uJ0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(ik,"off")}async function dJ0($){await Jv(),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(`
286
- `))}var yJ0=500,bJ0="worktree-created",ik="externalWorktreeSync";var RR=a(()=>{C2();jQ();RJ();_R();DR();b4();u7()});var lL;var Qv=a(()=>{lL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.96",description:"Rove \u2014 the terminal-native agent multiplexer",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 Yv={};g$(Yv,{repoSlug:()=>LY,releasePageUrl:()=>xR,recommendedGlobalInstallCommand:()=>IR,isNewerSemver:()=>TR,fetchReleaseSummaries:()=>cK,fetchReleaseNotesRange:()=>wR,fetchReleaseNotes:()=>ER,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>uK,UPDATE_SCRIPT_URL:()=>pL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>SR,CURRENT_VERSION:()=>A$,BREAKING_VERSIONS:()=>EJ});function LY(){let $=lL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function IR(){return`npm install -g ${SR}@latest`}function uK($,Z,J=EJ){let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}async function pJ0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),nL);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 TR($,Z){return B3($,Z)>0}function B3($,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 jY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:A$,latest:Z,hasUpdate:TR(Z,A$)};if(WH()&&!$.force)return null;let J=await pJ0(SR);if(!J)return null;return{current:A$,latest:J,hasUpdate:TR(J,A$)}}function zv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function ER($){let Z=LY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),nL);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 wR($){let Z=LY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),nL);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=zv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(B3(U,$.current)<=0)return null;if(B3(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 cK($=12){let Z=LY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),nL);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=zv(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 xR($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var A$,SR,pL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,EJ,nL=3000;var w8=a(()=>{Qv();L5();A$=lL.version,SR=lL.name;WZ=`curl -fsSL ${pL} | sh`;EJ=[]});var Wv={};g$(Wv,{stampResetGate:()=>iL,resetGateBlockers:()=>Gv,enforceResetGate:()=>gR,LAST_RUN_VERSION_KEY:()=>fR});function Gv($,Z=A$,J=EJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}function gR(){let $=X$(),Z=_4()[fR],J=Gv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${A$}: 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(`
286
+ `))}var yJ0=500,bJ0="worktree-created",ik="externalWorktreeSync";var RR=a(()=>{C2();jQ();RJ();_R();DR();b4();u7()});var lL;var Qv=a(()=>{lL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.97",description:"Rove \u2014 the terminal-native agent multiplexer",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 Yv={};g$(Yv,{repoSlug:()=>LY,releasePageUrl:()=>xR,recommendedGlobalInstallCommand:()=>IR,isNewerSemver:()=>TR,fetchReleaseSummaries:()=>cK,fetchReleaseNotesRange:()=>wR,fetchReleaseNotes:()=>ER,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>uK,UPDATE_SCRIPT_URL:()=>pL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>SR,CURRENT_VERSION:()=>A$,BREAKING_VERSIONS:()=>EJ});function LY(){let $=lL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function IR(){return`npm install -g ${SR}@latest`}function uK($,Z,J=EJ){let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}async function pJ0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),nL);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 TR($,Z){return B3($,Z)>0}function B3($,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 jY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:A$,latest:Z,hasUpdate:TR(Z,A$)};if(WH()&&!$.force)return null;let J=await pJ0(SR);if(!J)return null;return{current:A$,latest:J,hasUpdate:TR(J,A$)}}function zv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function ER($){let Z=LY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),nL);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 wR($){let Z=LY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),nL);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=zv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(B3(U,$.current)<=0)return null;if(B3(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 cK($=12){let Z=LY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),nL);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=zv(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 xR($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var A$,SR,pL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,EJ,nL=3000;var w8=a(()=>{Qv();L5();A$=lL.version,SR=lL.name;WZ=`curl -fsSL ${pL} | sh`;EJ=[]});var Wv={};g$(Wv,{stampResetGate:()=>iL,resetGateBlockers:()=>Gv,enforceResetGate:()=>gR,LAST_RUN_VERSION_KEY:()=>fR});function Gv($,Z=A$,J=EJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}function gR(){let $=X$(),Z=_4()[fR],J=Gv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${A$}: 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(`
287
287
  `)),process.exit(1)}if(Z!==A$)iL()}function iL(){try{n2({[fR]:A$})}catch{}}var fR="app.lastRunVersion";var oL=a(()=>{D2();w8();o4()});import{existsSync as qv,readFileSync as nJ0}from"fs";import{homedir as iJ0}from"os";import{join as Uv,resolve as Hv}from"path";import{fileURLToPath as oJ0}from"url";function kR($=process.env){return`${X$($)} skill install`}function aL(){let $=oJ0(import.meta.url);return[Hv($,"../../../../../.agents/skills/kobe"),Hv($,"../../skills/rove")].find((J)=>qv(Uv(J,"SKILL.md")))??null}function rL($={}){let Z=$.source!==void 0?$.source:aL(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??rJ0,"--skill",p3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function VY($={}){return`npx ${rL($).join(" ")}`}async function vR($,Z){return await Bun.spawn(["npx",...rL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function sL($={}){let Z=$.home??iJ0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>aJ0.map((z)=>Uv(X,z)))}function sJ0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function dK($){let Z=sL($).find((z)=>qv(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:yR,stale:!1};let J=null;try{J=sJ0(nJ0(Z,"utf8"))}catch{J=null}let X=J===null||J<yR;return{installed:!0,installedVersion:J,currentVersion:yR,stale:X}}function tJ0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Bv($={}){let Z=X$(),J=kR(),X=dK();if(!X.installed){if(l7(bR)==="1")return;o3(bR,"1"),process.stderr.write(`
288
288
  ${Z}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${Z} api\`:
289
289
  ${J}
package/dist/cli/kobe.js CHANGED
@@ -283,7 +283,7 @@ ${z}`,Z);this.line=J,this.column=X,this.codeblock=z}}});function ML($,Z){let J=$
283
283
  `)){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 Tk($){let Z=await $.readFile(vL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return PJ0(Z)}function Sk($){return vL.join($,"agents","main","wire.jsonl")}async function FR($,Z=KR){if(!$)return[];let J=[];for(let X of await Tk(Z)){if(X.workDir!==$)continue;let z=await Z.stat(Sk(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 Ik($,Z=KR){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function MR($,Z=KR){if(!$)return null;let J=(await Tk(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=Sk(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var KR;var Ek=a(()=>{AQ();KR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||vL.join(AJ0(),".kimi-code")},async readFile($){return await DQ($)},stat:DJ0}});import TJ0 from"path";var mL,wk,xk,fk,gk;var yk=a(()=>{WR();gL();Rk();Ek();mL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},wk={async listSessionIdsForWorktree($){return[...await bH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>Vk($),async transcriptPath($,Z){return(await bH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>jk($)},xk={listSessionIdsForWorktree:($)=>Yk($),readHistory:($)=>Wk($),transcriptPath:async($)=>await QR($)??null,latestTranscriptMtimeForWorktree:($)=>Gk($)},fk={listSessionIdsForWorktree:($)=>Dk($),readHistory:($)=>Pk($),async transcriptPath($){let Z=await UR($);return Z?TJ0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>Ak($)},gk={listSessionIdsForWorktree:($)=>FR($),readHistory:mL.readHistory,transcriptPath:($)=>MR($),async latestTranscriptMtimeForWorktree($){let J=(await FR($)).at(-1);if(!J)return 0;let X=await MR(J);return X?await Ik(X):0}}});var hL,bk,kk;var uL=a(()=>{hL=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],bk=["\xB7","\u2722","\u2731","\u2736","\u273B","\u273D"],kk=[...bk,...[...bk].reverse()]});import{readFile as mk,stat as SJ0}from"fs/promises";class cL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function hk($){return D$($).createTurnDetector()}function vk($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
284
284
  `)){z++;let W=ck(G);if(!W)continue;let H=LR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=dk(W,J),K={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||K.timestampMs>=X.timestampMs)X=K}return X}function xJ0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=LR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&wJ0.has(Z.type)}function fJ0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
285
285
  `)){X++;let G=ck(z);if(!G||!xJ0(G))continue;let W=dk(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function ck($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return LR(J)?J:null}catch{return null}}function dk($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function LR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var uk=($)=>SJ0($).then((Z)=>Z.mtimeMs,()=>0),IJ0,NR,EJ0,OR,mK,wJ0;var jR=a(()=>{WR();gL();C7();IJ0={listSessionFiles:($)=>bH($),readFile:($)=>mk($,"utf8"),statMtimeMs:uk};NR=class NR extends cL{deps;vendor="claude";cache=new Map;constructor($=IJ0){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=vk(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??uk)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:vk(J,$,Z),mtimeMs:Z}}};EJ0={findLatestRollout:($)=>zR($),readFile:($)=>mk($,"utf8")};OR=class OR extends cL{deps;vendor="codex";cache=null;constructor($=EJ0){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=fJ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};mK=class mK extends cL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};wJ0=new Set(["task_complete","turn_complete","turn_aborted"])});function gJ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:mL,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new hK($),createTurnDetector:()=>new mK($)}}function D$($){return h7($)?VR[$]:gJ0($)}function lk($){return D$($).history.readHistory!==mL.readHistory}function _R($){let Z=D$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:pk}function kH($,Z){let J=Z?_R(Z):pk;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 dL($,Z){let J=D$($).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 nk(){return Object.values(VR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var VR,pk;var C7=a(()=>{u7();SJ();Eb();kb();db();nb();ob();Bk();yk();CR();uL();jR();VR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:wk,detectAccount:($)=>IH($),createHookAdapter:()=>new nP,createTurnDetector:()=>new NR,capabilities:Sb,identity:Ib,spinnerFrames:kk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>cb()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:xk,detectAccount:($)=>EH($),createHookAdapter:()=>new rP,createTurnDetector:()=>new OR,capabilities:lb,identity:pb,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:()=>Uk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:fk,detectAccount:($)=>wH($),createHookAdapter:()=>new hK("copilot"),createTurnDetector:()=>new mK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],history:gk,detectAccount:($)=>SL($),createHookAdapter:()=>new hK("kimi"),createTurnDetector:()=>new mK("kimi")}};pk=[...new Set(Object.values(VR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function DR($){return D$($).createHookAdapter()}class hK{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 CR=a(()=>{C7()});function lL($){return yJ0.includes($)}function ik($){return bJ0.includes($)}var yJ0,bJ0;var AR=a(()=>{yJ0=["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"];bJ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var zv={};g$(zv,{runHookSubcommand:()=>cJ0,readTextWithTimeout:()=>sk,parseWorktreeRemovePath:()=>Zv,parseWorktreeAddPath:()=>$v,ensureGlobalKobeHooks:()=>RR});import{homedir as kJ0}from"os";import{join as rk,resolve as PR}from"path";async function sk($,Z=vJ0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function tk(){try{let $=await sk(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function ok($,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 hJ0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function ek($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function $v($){let Z=ek($),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 Zv($){let Z=ek($);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 uJ0(){let $=await tk(),Z=hJ0($.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=$v(J),G=z?void 0:Zv(J);if(!z&&!G)return;let W=await BQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:PR(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:PR(X,G)})}finally{W.close()}}async function cJ0($){let[Z,...J]=$;if(Z==="setup"){await nJ0(J);return}if(Z===mJ0){try{await uJ0()}catch{}return}try{if(!Z||!lL(Z))return;let X=await tk(),z=ok(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=ok(J,"--engine"),K=Jv().filter((V)=>!U||V.vendor===U),N;for(let V of K)if(N=V.activityDetailFromPayload(Z,X),N)break;let L;for(let V of K)if(L=V.sessionFromPayload(X),L)break;let M=await BQ();if(!M)return;try{let V=z??W;await M.request("engine.reportEvent",{...V?{taskId:V}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...N?{detail:N}:{},...L?{sessionId:L.sessionId}:{},...L?.transcriptPath?{transcriptPath:L.transcriptPath}:{}})}finally{M.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function dJ0(){return T8.map(($)=>DR($)).filter(($)=>$.supportsWorktreeSync())}function Jv(){return T8.map(($)=>DR($)).filter(($)=>$.supportsHooks())}function Xv(){return rk(kJ0(),".claude","settings.json")}function lJ0($){if(!$||$==="off")return;if($==="global")return Xv();if($.startsWith("repo:"))return rk(PR($.slice(5)),".claude","settings.json");return $}async function RR(){try{let $=pJ0();for(let Z of Jv()){let J=Z.globalSettingsPath();if(!J)continue;await Z.installActivityHooks(J,{toolEvents:$}),await Z.installWorktreeWatchHook(J)}await Qv()}catch{}}function pJ0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(XZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Qv(){let $=dJ0();if($.length===0)return;let Z=l7(ak),J=new Set([Xv()]),X=lJ0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(ak,"off")}async function nJ0($){await Qv(),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(`
286
- `))}var vJ0=500,mJ0="worktree-created",ak="externalWorktreeSync";var TR=a(()=>{C2();jQ();RJ();CR();AR();b4();u7()});var pL;var Yv=a(()=>{pL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.96",description:"Rove \u2014 the terminal-native agent multiplexer",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 Wv={};g$(Wv,{repoSlug:()=>LY,releasePageUrl:()=>fR,recommendedGlobalInstallCommand:()=>ER,isNewerSemver:()=>SR,fetchReleaseSummaries:()=>cK,fetchReleaseNotesRange:()=>xR,fetchReleaseNotes:()=>wR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>uK,UPDATE_SCRIPT_URL:()=>nL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>IR,CURRENT_VERSION:()=>A$,BREAKING_VERSIONS:()=>EJ});function LY(){let $=pL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function ER(){return`npm install -g ${IR}@latest`}function uK($,Z,J=EJ){let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}async function oJ0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),iL);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 SR($,Z){return B3($,Z)>0}function B3($,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 jY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:A$,latest:Z,hasUpdate:SR(Z,A$)};if(WH()&&!$.force)return null;let J=await oJ0(IR);if(!J)return null;return{current:A$,latest:J,hasUpdate:SR(J,A$)}}function Gv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function wR($){let Z=LY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),iL);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 xR($){let Z=LY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),iL);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=Gv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(B3(U,$.current)<=0)return null;if(B3(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 cK($=12){let Z=LY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),iL);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=Gv(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 fR($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var A$,IR,nL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,EJ,iL=3000;var w8=a(()=>{Yv();L5();A$=pL.version,IR=pL.name;WZ=`curl -fsSL ${nL} | sh`;EJ=[]});var qv={};g$(qv,{stampResetGate:()=>oL,resetGateBlockers:()=>Hv,enforceResetGate:()=>yR,LAST_RUN_VERSION_KEY:()=>gR});function Hv($,Z=A$,J=EJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}function yR(){let $=X$(),Z=_4()[gR],J=Hv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${A$}: 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(`
286
+ `))}var vJ0=500,mJ0="worktree-created",ak="externalWorktreeSync";var TR=a(()=>{C2();jQ();RJ();CR();AR();b4();u7()});var pL;var Yv=a(()=>{pL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.97",description:"Rove \u2014 the terminal-native agent multiplexer",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 Wv={};g$(Wv,{repoSlug:()=>LY,releasePageUrl:()=>fR,recommendedGlobalInstallCommand:()=>ER,isNewerSemver:()=>SR,fetchReleaseSummaries:()=>cK,fetchReleaseNotesRange:()=>xR,fetchReleaseNotes:()=>wR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>uK,UPDATE_SCRIPT_URL:()=>nL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>IR,CURRENT_VERSION:()=>A$,BREAKING_VERSIONS:()=>EJ});function LY(){let $=pL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function ER(){return`npm install -g ${IR}@latest`}function uK($,Z,J=EJ){let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}async function oJ0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),iL);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 SR($,Z){return B3($,Z)>0}function B3($,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 jY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:A$,latest:Z,hasUpdate:SR(Z,A$)};if(WH()&&!$.force)return null;let J=await oJ0(IR);if(!J)return null;return{current:A$,latest:J,hasUpdate:SR(J,A$)}}function Gv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function wR($){let Z=LY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),iL);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 xR($){let Z=LY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),iL);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=Gv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(B3(U,$.current)<=0)return null;if(B3(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 cK($=12){let Z=LY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),iL);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=Gv(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 fR($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var A$,IR,nL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,EJ,iL=3000;var w8=a(()=>{Yv();L5();A$=pL.version,IR=pL.name;WZ=`curl -fsSL ${nL} | sh`;EJ=[]});var qv={};g$(qv,{stampResetGate:()=>oL,resetGateBlockers:()=>Hv,enforceResetGate:()=>yR,LAST_RUN_VERSION_KEY:()=>gR});function Hv($,Z=A$,J=EJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}function yR(){let $=X$(),Z=_4()[gR],J=Hv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${A$}: 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(`
287
287
  `)),process.exit(1)}if(Z!==A$)oL()}function oL(){try{n2({[gR]:A$})}catch{}}var gR="app.lastRunVersion";var aL=a(()=>{D2();w8();h4()});import{existsSync as Bv,readFileSync as aJ0}from"fs";import{homedir as rJ0}from"os";import{join as Kv,resolve as Uv}from"path";import{fileURLToPath as sJ0}from"url";function vR($=process.env){return`${X$($)} skill install`}function rL(){let $=sJ0(import.meta.url);return[Uv($,"../../../../../.agents/skills/kobe"),Uv($,"../../skills/rove")].find((J)=>Bv(Kv(J,"SKILL.md")))??null}function sL($={}){let Z=$.source!==void 0?$.source:rL(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??eJ0,"--skill",p3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function VY($={}){return`npx ${sL($).join(" ")}`}async function mR($,Z){return await Bun.spawn(["npx",...sL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function tL($={}){let Z=$.home??rJ0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>tJ0.map((z)=>Kv(X,z)))}function $X0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function dK($){let Z=tL($).find((z)=>Bv(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:bR,stale:!1};let J=null;try{J=$X0(aJ0(Z,"utf8"))}catch{J=null}let X=J===null||J<bR;return{installed:!0,installedVersion:J,currentVersion:bR,stale:X}}function ZX0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Fv($={}){let Z=X$(),J=vR(),X=dK();if(!X.installed){if(l7(kR)==="1")return;o3(kR,"1"),process.stderr.write(`
288
288
  ${Z}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${Z} api\`:
289
289
  ${J}
package/dist/cli/rove.js CHANGED
@@ -283,7 +283,7 @@ ${z}`,Z);this.line=J,this.column=X,this.codeblock=z}}});function ML($,Z){let J=$
283
283
  `)){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 Tk($){let Z=await $.readFile(vL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return PJ0(Z)}function Sk($){return vL.join($,"agents","main","wire.jsonl")}async function FR($,Z=KR){if(!$)return[];let J=[];for(let X of await Tk(Z)){if(X.workDir!==$)continue;let z=await Z.stat(Sk(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 Ik($,Z=KR){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function MR($,Z=KR){if(!$)return null;let J=(await Tk(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=Sk(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var KR;var Ek=a(()=>{AQ();KR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||vL.join(AJ0(),".kimi-code")},async readFile($){return await DQ($)},stat:DJ0}});import TJ0 from"path";var mL,wk,xk,fk,gk;var yk=a(()=>{WR();gL();Rk();Ek();mL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},wk={async listSessionIdsForWorktree($){return[...await bH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>Vk($),async transcriptPath($,Z){return(await bH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>jk($)},xk={listSessionIdsForWorktree:($)=>Yk($),readHistory:($)=>Wk($),transcriptPath:async($)=>await QR($)??null,latestTranscriptMtimeForWorktree:($)=>Gk($)},fk={listSessionIdsForWorktree:($)=>Dk($),readHistory:($)=>Pk($),async transcriptPath($){let Z=await UR($);return Z?TJ0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>Ak($)},gk={listSessionIdsForWorktree:($)=>FR($),readHistory:mL.readHistory,transcriptPath:($)=>MR($),async latestTranscriptMtimeForWorktree($){let J=(await FR($)).at(-1);if(!J)return 0;let X=await MR(J);return X?await Ik(X):0}}});var hL,bk,kk;var uL=a(()=>{hL=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],bk=["\xB7","\u2722","\u2731","\u2736","\u273B","\u273D"],kk=[...bk,...[...bk].reverse()]});import{readFile as mk,stat as SJ0}from"fs/promises";class cL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function hk($){return D$($).createTurnDetector()}function vk($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
284
284
  `)){z++;let W=ck(G);if(!W)continue;let H=LR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=dk(W,J),K={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||K.timestampMs>=X.timestampMs)X=K}return X}function xJ0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=LR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&wJ0.has(Z.type)}function fJ0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
285
285
  `)){X++;let G=ck(z);if(!G||!xJ0(G))continue;let W=dk(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function ck($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return LR(J)?J:null}catch{return null}}function dk($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function LR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var uk=($)=>SJ0($).then((Z)=>Z.mtimeMs,()=>0),IJ0,NR,EJ0,OR,mK,wJ0;var jR=a(()=>{WR();gL();C7();IJ0={listSessionFiles:($)=>bH($),readFile:($)=>mk($,"utf8"),statMtimeMs:uk};NR=class NR extends cL{deps;vendor="claude";cache=new Map;constructor($=IJ0){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=vk(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??uk)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:vk(J,$,Z),mtimeMs:Z}}};EJ0={findLatestRollout:($)=>zR($),readFile:($)=>mk($,"utf8")};OR=class OR extends cL{deps;vendor="codex";cache=null;constructor($=EJ0){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=fJ0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};mK=class mK extends cL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};wJ0=new Set(["task_complete","turn_complete","turn_aborted"])});function gJ0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:mL,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new hK($),createTurnDetector:()=>new mK($)}}function D$($){return h7($)?VR[$]:gJ0($)}function lk($){return D$($).history.readHistory!==mL.readHistory}function _R($){let Z=D$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:pk}function kH($,Z){let J=Z?_R(Z):pk;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 dL($,Z){let J=D$($).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 nk(){return Object.values(VR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var VR,pk;var C7=a(()=>{u7();SJ();Eb();kb();db();nb();ob();Bk();yk();CR();uL();jR();VR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:wk,detectAccount:($)=>IH($),createHookAdapter:()=>new nP,createTurnDetector:()=>new NR,capabilities:Sb,identity:Ib,spinnerFrames:kk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>cb()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:xk,detectAccount:($)=>EH($),createHookAdapter:()=>new rP,createTurnDetector:()=>new OR,capabilities:lb,identity:pb,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:()=>Uk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:fk,detectAccount:($)=>wH($),createHookAdapter:()=>new hK("copilot"),createTurnDetector:()=>new mK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],history:gk,detectAccount:($)=>SL($),createHookAdapter:()=>new hK("kimi"),createTurnDetector:()=>new mK("kimi")}};pk=[...new Set(Object.values(VR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function DR($){return D$($).createHookAdapter()}class hK{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 CR=a(()=>{C7()});function lL($){return yJ0.includes($)}function ik($){return bJ0.includes($)}var yJ0,bJ0;var AR=a(()=>{yJ0=["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"];bJ0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var zv={};g$(zv,{runHookSubcommand:()=>cJ0,readTextWithTimeout:()=>sk,parseWorktreeRemovePath:()=>Zv,parseWorktreeAddPath:()=>$v,ensureGlobalKobeHooks:()=>RR});import{homedir as kJ0}from"os";import{join as rk,resolve as PR}from"path";async function sk($,Z=vJ0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function tk(){try{let $=await sk(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function ok($,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 hJ0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function ek($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function $v($){let Z=ek($),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 Zv($){let Z=ek($);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 uJ0(){let $=await tk(),Z=hJ0($.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=$v(J),G=z?void 0:Zv(J);if(!z&&!G)return;let W=await BQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:PR(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:PR(X,G)})}finally{W.close()}}async function cJ0($){let[Z,...J]=$;if(Z==="setup"){await nJ0(J);return}if(Z===mJ0){try{await uJ0()}catch{}return}try{if(!Z||!lL(Z))return;let X=await tk(),z=ok(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=ok(J,"--engine"),K=Jv().filter((V)=>!U||V.vendor===U),N;for(let V of K)if(N=V.activityDetailFromPayload(Z,X),N)break;let L;for(let V of K)if(L=V.sessionFromPayload(X),L)break;let M=await BQ();if(!M)return;try{let V=z??W;await M.request("engine.reportEvent",{...V?{taskId:V}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...N?{detail:N}:{},...L?{sessionId:L.sessionId}:{},...L?.transcriptPath?{transcriptPath:L.transcriptPath}:{}})}finally{M.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function dJ0(){return T8.map(($)=>DR($)).filter(($)=>$.supportsWorktreeSync())}function Jv(){return T8.map(($)=>DR($)).filter(($)=>$.supportsHooks())}function Xv(){return rk(kJ0(),".claude","settings.json")}function lJ0($){if(!$||$==="off")return;if($==="global")return Xv();if($.startsWith("repo:"))return rk(PR($.slice(5)),".claude","settings.json");return $}async function RR(){try{let $=pJ0();for(let Z of Jv()){let J=Z.globalSettingsPath();if(!J)continue;await Z.installActivityHooks(J,{toolEvents:$}),await Z.installWorktreeWatchHook(J)}await Qv()}catch{}}function pJ0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(XZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Qv(){let $=dJ0();if($.length===0)return;let Z=l7(ak),J=new Set([Xv()]),X=lJ0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(ak,"off")}async function nJ0($){await Qv(),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(`
286
- `))}var vJ0=500,mJ0="worktree-created",ak="externalWorktreeSync";var TR=a(()=>{C2();jQ();RJ();CR();AR();b4();u7()});var pL;var Yv=a(()=>{pL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.96",description:"Rove \u2014 the terminal-native agent multiplexer",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 Wv={};g$(Wv,{repoSlug:()=>LY,releasePageUrl:()=>fR,recommendedGlobalInstallCommand:()=>ER,isNewerSemver:()=>SR,fetchReleaseSummaries:()=>cK,fetchReleaseNotesRange:()=>xR,fetchReleaseNotes:()=>wR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>uK,UPDATE_SCRIPT_URL:()=>nL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>IR,CURRENT_VERSION:()=>A$,BREAKING_VERSIONS:()=>EJ});function LY(){let $=pL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function ER(){return`npm install -g ${IR}@latest`}function uK($,Z,J=EJ){let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}async function oJ0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),iL);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 SR($,Z){return B3($,Z)>0}function B3($,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 jY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:A$,latest:Z,hasUpdate:SR(Z,A$)};if(WH()&&!$.force)return null;let J=await oJ0(IR);if(!J)return null;return{current:A$,latest:J,hasUpdate:SR(J,A$)}}function Gv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function wR($){let Z=LY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),iL);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 xR($){let Z=LY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),iL);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=Gv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(B3(U,$.current)<=0)return null;if(B3(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 cK($=12){let Z=LY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),iL);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=Gv(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 fR($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var A$,IR,nL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,EJ,iL=3000;var w8=a(()=>{Yv();L5();A$=pL.version,IR=pL.name;WZ=`curl -fsSL ${nL} | sh`;EJ=[]});var qv={};g$(qv,{stampResetGate:()=>oL,resetGateBlockers:()=>Hv,enforceResetGate:()=>yR,LAST_RUN_VERSION_KEY:()=>gR});function Hv($,Z=A$,J=EJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}function yR(){let $=X$(),Z=_4()[gR],J=Hv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${A$}: 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(`
286
+ `))}var vJ0=500,mJ0="worktree-created",ak="externalWorktreeSync";var TR=a(()=>{C2();jQ();RJ();CR();AR();b4();u7()});var pL;var Yv=a(()=>{pL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.97",description:"Rove \u2014 the terminal-native agent multiplexer",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 Wv={};g$(Wv,{repoSlug:()=>LY,releasePageUrl:()=>fR,recommendedGlobalInstallCommand:()=>ER,isNewerSemver:()=>SR,fetchReleaseSummaries:()=>cK,fetchReleaseNotesRange:()=>xR,fetchReleaseNotes:()=>wR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>uK,UPDATE_SCRIPT_URL:()=>nL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>IR,CURRENT_VERSION:()=>A$,BREAKING_VERSIONS:()=>EJ});function LY(){let $=pL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function ER(){return`npm install -g ${IR}@latest`}function uK($,Z,J=EJ){let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}async function oJ0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),iL);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 SR($,Z){return B3($,Z)>0}function B3($,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 jY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:A$,latest:Z,hasUpdate:SR(Z,A$)};if(WH()&&!$.force)return null;let J=await oJ0(IR);if(!J)return null;return{current:A$,latest:J,hasUpdate:SR(J,A$)}}function Gv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function wR($){let Z=LY();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),iL);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 xR($){let Z=LY();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),iL);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=Gv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(B3(U,$.current)<=0)return null;if(B3(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 cK($=12){let Z=LY();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),iL);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=Gv(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 fR($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var A$,IR,nL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,EJ,iL=3000;var w8=a(()=>{Yv();L5();A$=pL.version,IR=pL.name;WZ=`curl -fsSL ${nL} | sh`;EJ=[]});var qv={};g$(qv,{stampResetGate:()=>oL,resetGateBlockers:()=>Hv,enforceResetGate:()=>yR,LAST_RUN_VERSION_KEY:()=>gR});function Hv($,Z=A$,J=EJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=B3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>B3(G,X)>0&&B3(G,z)<=0)}function yR(){let $=X$(),Z=_4()[gR],J=Hv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${A$}: 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(`
287
287
  `)),process.exit(1)}if(Z!==A$)oL()}function oL(){try{n2({[gR]:A$})}catch{}}var gR="app.lastRunVersion";var aL=a(()=>{D2();w8();h4()});import{existsSync as Bv,readFileSync as aJ0}from"fs";import{homedir as rJ0}from"os";import{join as Kv,resolve as Uv}from"path";import{fileURLToPath as sJ0}from"url";function vR($=process.env){return`${X$($)} skill install`}function rL(){let $=sJ0(import.meta.url);return[Uv($,"../../../../../.agents/skills/kobe"),Uv($,"../../skills/rove")].find((J)=>Bv(Kv(J,"SKILL.md")))??null}function sL($={}){let Z=$.source!==void 0?$.source:rL(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??eJ0,"--skill",p3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function VY($={}){return`npx ${sL($).join(" ")}`}async function mR($,Z){return await Bun.spawn(["npx",...sL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function tL($={}){let Z=$.home??rJ0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>tJ0.map((z)=>Kv(X,z)))}function $X0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function dK($){let Z=tL($).find((z)=>Bv(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:bR,stale:!1};let J=null;try{J=$X0(aJ0(Z,"utf8"))}catch{J=null}let X=J===null||J<bR;return{installed:!0,installedVersion:J,currentVersion:bR,stale:X}}function ZX0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Fv($={}){let Z=X$(),J=vR(),X=dK();if(!X.installed){if(l7(kR)==="1")return;o3(kR,"1"),process.stderr.write(`
288
288
  ${Z}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${Z} api\`:
289
289
  ${J}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@sma1lboy/rove",
4
- "version": "0.8.96",
4
+ "version": "0.8.97",
5
5
  "description": "Rove — the terminal-native agent multiplexer",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",