@sma1lboy/rove 0.8.92 → 0.8.93

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=X,this.column=J,this.codeblock=z}}});function KL($,Z){let X=$
283
283
  `)){if(!X.trim())continue;try{let{sessionId:J,sessionDir:z,workDir:G}=JSON.parse(X);if(J&&z&&G)Z.push({sessionId:J,sessionDir:z,workDir:G})}catch{}}return Z}async function Ck($){let Z=await $.readFile(bL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return _X0(Z)}function Dk($){return bL.join($,"agents","main","wire.jsonl")}async function qR($,Z=HR){if(!$)return[];let X=[];for(let J of await Ck(Z)){if(J.workDir!==$)continue;let z=await Z.stat(Dk(J.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;X.push({id:J.sessionId,mtimeMs:z})}return X.sort((J,z)=>J.mtimeMs-z.mtimeMs).map((J)=>J.id)}async function Ak($,Z=HR){return await Z.stat($).then((X)=>X.mtimeMs).catch(()=>0)}async function UR($,Z=HR){if(!$)return null;let X=(await Ck(Z)).find((z)=>z.sessionId===$);if(!X)return null;let J=Dk(X.sessionDir);return await Z.stat(J).then(()=>J).catch(()=>null)}var HR;var Pk=a(()=>{CQ();HR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||bL.join(VX0(),".kimi-code")},async readFile($){return await _Q($)},stat:jX0}});import DX0 from"path";var kL,Rk,Tk,Sk,Ik;var Ek=a(()=>{QR();xL();_k();Pk();kL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},Rk={async listSessionIdsForWorktree($){return[...await bH($)].sort((X,J)=>X.mtimeMs-J.mtimeMs).map((X)=>X.sessionId)},readHistory:($)=>Mk($),async transcriptPath($,Z){return(await bH(Z)).find((J)=>J.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>Fk($)},Tk={listSessionIdsForWorktree:($)=>Zk($),readHistory:($)=>Jk($),transcriptPath:async($)=>await $R($)??null,latestTranscriptMtimeForWorktree:($)=>Xk($)},Sk={listSessionIdsForWorktree:($)=>Lk($),readHistory:($)=>Vk($),async transcriptPath($){let Z=await GR($);return Z?DX0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>jk($)},Ik={listSessionIdsForWorktree:($)=>qR($),readHistory:kL.readHistory,transcriptPath:($)=>UR($),async latestTranscriptMtimeForWorktree($){let X=(await qR($)).at(-1);if(!X)return 0;let J=await UR(X);return J?await Ak(J):0}}});var vL,wk,xk;var mL=a(()=>{vL=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],wk=["\xB7","\u2722","\u2731","\u2736","\u273B","\u273D"],xk=[...wk,...[...wk].reverse()]});import{readFile as gk,stat as AX0}from"fs/promises";class hL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function yk($){return E$($).createTurnDetector()}function fk($,Z="claude",X=0){let J=null,z=0;for(let G of $.split(`
284
284
  `)){z++;let W=kk(G);if(!W)continue;let H=FR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=vk(W,X),K={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!J||K.timestampMs>=J.timestampMs)J=K}return J}function SX0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=FR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&TX0.has(Z.type)}function IX0($,Z="codex"){let X=null,J=0;for(let z of $.split(`
285
285
  `)){J++;let G=kk(z);if(!G||!SX0(G))continue;let W=vk(G,0),H={id:`codex:${Z}:${W}:${J}`,timestampMs:W,source:"codex"};if(!X||H.timestampMs>=X.timestampMs)X=H}return X}function kk($){let Z=$.trim();if(!Z)return null;try{let X=JSON.parse(Z);return FR(X)?X:null}catch{return null}}function vk($,Z){let X=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(X)?X:Z}function FR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var bk=($)=>AX0($).then((Z)=>Z.mtimeMs,()=>0),PX0,BR,RX0,KR,vK,TX0;var MR=a(()=>{QR();xL();d7();PX0={listSessionFiles:($)=>bH($),readFile:($)=>gk($,"utf8"),statMtimeMs:bk};BR=class BR extends hL{deps;vendor="claude";cache=new Map;constructor($=PX0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),X=Z[0]?.mtimeMs??0,J=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=fk(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!J||H.timestampMs>J.timestampMs))J=H}return this.cache=z,{marker:J,mtimeMs:X}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??bk)($);if(Z===0)return null;let X=await this.deps.readFile($).catch(()=>"");return{marker:fk(X,$,Z),mtimeMs:Z}}};RX0={findLatestRollout:($)=>ZR($),readFile:($)=>gk($,"utf8")};KR=class KR extends hL{deps;vendor="codex";cache=null;constructor($=RX0){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 X=await this.deps.readFile(Z.path).catch(()=>"");if(!X)return{marker:null,mtimeMs:Z.mtimeMs};let J=IX0(X,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:J},{marker:J,mtimeMs:Z.mtimeMs}}};vK=class vK extends hL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};TX0=new Set(["task_complete","turn_complete","turn_aborted"])});function EX0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:kL,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new mK($),createTurnDetector:()=>new vK($)}}function E$($){return v7($)?NR[$]:EX0($)}function mk($){return E$($).history.readHistory!==kL.readHistory}function OR($){let Z=E$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:hk}function kH($,Z){let X=Z?OR(Z):hk;for(let J of[...X].sort((z,G)=>G.length-z.length)){if(!$.startsWith(J))continue;let z=$.slice(J.length).trimStart();if(z.length===0)return $;return z}return $}function uL($,Z){let X=E$($).terminalTitle,J=X?.workingPrefixes;if(X?.ownsStatus!==!0||!J||J.length===0)return null;let z=Z.trim();if(z.length===0)return null;return J.some((G)=>z.startsWith(G))?"working":"rest"}function uk(){return Object.values(NR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var NR,hk;var d7=a(()=>{m7();RX();Pb();xb();vb();ub();db();Gk();Ek();LR();mL();MR();NR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:Rk,detectAccount:($)=>IH($),createHookAdapter:()=>new cP,createTurnDetector:()=>new BR,capabilities:Db,identity:Ab,spinnerFrames:xk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>kb()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:Tk,detectAccount:($)=>EH($),createHookAdapter:()=>new nP,createTurnDetector:()=>new KR,capabilities:mb,identity:hb,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:()=>Yk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:Sk,detectAccount:($)=>wH($),createHookAdapter:()=>new mK("copilot"),createTurnDetector:()=>new vK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],history:Ik,detectAccount:($)=>RL($),createHookAdapter:()=>new mK("kimi"),createTurnDetector:()=>new vK("kimi")}};hk=[...new Set(Object.values(NR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function jR($){return E$($).createHookAdapter()}class mK{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 LR=a(()=>{d7()});function cL($){return wX0.includes($)}function ck($){return xX0.includes($)}var wX0,xX0;var VR=a(()=>{wX0=["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"];xX0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var $v={};g$($v,{runHookSubcommand:()=>vX0,readTextWithTimeout:()=>nk,parseWorktreeRemovePath:()=>rk,parseWorktreeAddPath:()=>ak,ensureGlobalKobeHooks:()=>CR});import{homedir as fX0}from"os";import{join as pk,resolve as _R}from"path";async function nk($,Z=gX0){let X;try{return await Promise.race([$(),new Promise((J)=>{X=setTimeout(()=>J(""),Z)})])}finally{if(X!==void 0)clearTimeout(X)}}async function ik(){try{let $=await nk(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function dk($,Z){for(let X=0;X<$.length;X++){if($[X]===Z)return $[X+1];if($[X].startsWith(`${Z}=`))return $[X].slice(Z.length+1)}return}function bX0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function ok($){let Z=[],X=/"([^"]*)"|'([^']*)'|(\S+)/g,J;while((J=X.exec($))!==null)Z.push(J[1]??J[2]??J[3]??"");return Z}function ak($){let Z=ok($),X=new Set(["-b","-B","--reason"]);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="add")continue;let z=J+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=X.has(G)?2:1;continue}return G}}return}function rk($){let Z=ok($);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="remove")continue;let J=X+2;while(J<Z.length){let z=Z[J];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){J+=1;continue}return z}}return}async function kX0(){let $=await ik(),Z=bX0($.tool_input)?$.tool_input:{},X=typeof Z.command==="string"?Z.command:"";if(!X.includes("worktree"))return;let J=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=ak(X),G=z?void 0:rk(X);if(!z&&!G)return;let W=await qQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:J,worktreePath:_R(J,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:_R(J,G)})}finally{W.close()}}async function vX0($){let[Z,...X]=$;if(Z==="setup"){await cX0(X);return}if(Z===yX0){try{await kX0()}catch{}return}try{if(!Z||!cL(Z))return;let J=await ik(),z=dk(X,"--task-id"),G=typeof J.cwd==="string"&&J.cwd?J.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=dk(X,"--engine"),K=sk().filter((V)=>!U||V.vendor===U),N;for(let V of K)if(N=V.activityDetailFromPayload(Z,J),N)break;let L;for(let V of K)if(L=V.sessionFromPayload(J),L)break;let M=await qQ();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(J){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,J instanceof Error?J.message:String(J))}}function mX0(){return T8.map(($)=>jR($)).filter(($)=>$.supportsWorktreeSync())}function sk(){return T8.map(($)=>jR($)).filter(($)=>$.supportsHooks())}function tk(){return pk(fX0(),".claude","settings.json")}function hX0($){if(!$||$==="off")return;if($==="global")return tk();if($.startsWith("repo:"))return pk(_R($.slice(5)),".claude","settings.json");return $}async function CR(){try{let $=uX0();for(let Z of sk()){let X=Z.globalSettingsPath();if(!X)continue;await Z.installActivityHooks(X,{toolEvents:$}),await Z.installWorktreeWatchHook(X)}await ek()}catch{}}function uX0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(JZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function ek(){let $=mX0();if($.length===0)return;let Z=c7(lk),X=new Set([tk()]),J=hX0(Z);if(J)X.add(J);for(let z of $)for(let G of X)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(lk,"off")}async function cX0($){await ek(),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 gX0=500,yX0="worktree-created",lk="externalWorktreeSync";var DR=a(()=>{C2();OQ();AX();LR();VR();b4();m7()});var dL;var Zv=a(()=>{dL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.92",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:"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:rove":"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.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.13","@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 Jv={};g$(Jv,{repoSlug:()=>LY,releasePageUrl:()=>IR,recommendedGlobalInstallCommand:()=>RR,isNewerSemver:()=>AR,fetchReleaseSummaries:()=>uK,fetchReleaseNotesRange:()=>SR,fetchReleaseNotes:()=>TR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>hK,UPDATE_SCRIPT_URL:()=>lL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>PR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>SX});function LY(){let $=dL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function RR(){return`npm install -g ${PR}@latest`}function hK($,Z,X=SX){let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}async function lX0($){let Z=new AbortController,X=setTimeout(()=>Z.abort(),pL);try{let J=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${J}/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(X)}}function AR($,Z){return B3($,Z)>0}function B3($,Z){let X=(G)=>G.split("-")[0]??G,J=X($).split(".").map((G)=>Number.parseInt(G,10)),z=X(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=J[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:D$,latest:Z,hasUpdate:AR(Z,D$)};if(WH()&&!$.force)return null;let X=await lX0(PR);if(!X)return null;return{current:D$,latest:X,hasUpdate:AR(X,D$)}}function Xv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function TR($){let Z=LY();if(!Z)return null;let X=`v${$}`,J=new AbortController,z=setTimeout(()=>J.abort(),pL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${X}`,{signal:J.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 SR($){let Z=LY();if(!Z)return[];let X=$.limit??100,J=new AbortController,z=setTimeout(()=>J.abort(),pL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${X}`,{signal:J.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=Xv(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 uK($=12){let Z=LY();if(!Z)return[];let X=new AbortController,J=setTimeout(()=>X.abort(),pL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:X.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=Xv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(J)}}function IR($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,PR,lL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,SX,pL=3000;var w8=a(()=>{Zv();L5();D$=dL.version,PR=dL.name;WZ=`curl -fsSL ${lL} | sh`;SX=[]});var zv={};g$(zv,{stampResetGate:()=>nL,resetGateBlockers:()=>Qv,enforceResetGate:()=>wR,LAST_RUN_VERSION_KEY:()=>ER});function Qv($,Z=D$,X=SX){if(typeof $!=="string"||$.length===0)return[];let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}function wR(){let $=J$(),Z=_4()[ER],X=Qv(Z);if(X.length>0){let J=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${X.join(", ")} introduced breaking changes`,`(last run: ${J}). 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 gX0=500,yX0="worktree-created",lk="externalWorktreeSync";var DR=a(()=>{C2();OQ();AX();LR();VR();b4();m7()});var dL;var Zv=a(()=>{dL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.93",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:"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:rove":"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.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 Jv={};g$(Jv,{repoSlug:()=>LY,releasePageUrl:()=>IR,recommendedGlobalInstallCommand:()=>RR,isNewerSemver:()=>AR,fetchReleaseSummaries:()=>uK,fetchReleaseNotesRange:()=>SR,fetchReleaseNotes:()=>TR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>hK,UPDATE_SCRIPT_URL:()=>lL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>PR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>SX});function LY(){let $=dL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function RR(){return`npm install -g ${PR}@latest`}function hK($,Z,X=SX){let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}async function lX0($){let Z=new AbortController,X=setTimeout(()=>Z.abort(),pL);try{let J=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${J}/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(X)}}function AR($,Z){return B3($,Z)>0}function B3($,Z){let X=(G)=>G.split("-")[0]??G,J=X($).split(".").map((G)=>Number.parseInt(G,10)),z=X(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=J[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:D$,latest:Z,hasUpdate:AR(Z,D$)};if(WH()&&!$.force)return null;let X=await lX0(PR);if(!X)return null;return{current:D$,latest:X,hasUpdate:AR(X,D$)}}function Xv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function TR($){let Z=LY();if(!Z)return null;let X=`v${$}`,J=new AbortController,z=setTimeout(()=>J.abort(),pL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${X}`,{signal:J.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 SR($){let Z=LY();if(!Z)return[];let X=$.limit??100,J=new AbortController,z=setTimeout(()=>J.abort(),pL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${X}`,{signal:J.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=Xv(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 uK($=12){let Z=LY();if(!Z)return[];let X=new AbortController,J=setTimeout(()=>X.abort(),pL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:X.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=Xv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(J)}}function IR($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,PR,lL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,SX,pL=3000;var w8=a(()=>{Zv();L5();D$=dL.version,PR=dL.name;WZ=`curl -fsSL ${lL} | sh`;SX=[]});var zv={};g$(zv,{stampResetGate:()=>nL,resetGateBlockers:()=>Qv,enforceResetGate:()=>wR,LAST_RUN_VERSION_KEY:()=>ER});function Qv($,Z=D$,X=SX){if(typeof $!=="string"||$.length===0)return[];let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}function wR(){let $=J$(),Z=_4()[ER],X=Qv(Z);if(X.length>0){let J=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${X.join(", ")} introduced breaking changes`,`(last run: ${J}). 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!==D$)nL()}function nL(){try{n2({[ER]:D$})}catch{}}var ER="app.lastRunVersion";var iL=a(()=>{D2();w8();o4()});import{existsSync as Gv,readFileSync as pX0}from"fs";import{homedir as nX0}from"os";import{join as Wv,resolve as Yv}from"path";import{fileURLToPath as iX0}from"url";function gR($=process.env){return`${J$($)} skill install`}function oL(){let $=iX0(import.meta.url);return[Yv($,"../../../../../.agents/skills/kobe"),Yv($,"../../skills/rove")].find((X)=>Gv(Wv(X,"SKILL.md")))??null}function aL($={}){let Z=$.source!==void 0?$.source:oL(),X=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??aX0,"--skill",p3,...$.global===!1?[]:["--global"],...X.flatMap((J)=>["--agent",J])]}function VY($={}){return`npx ${aL($).join(" ")}`}async function yR($,Z){return await Bun.spawn(["npx",...aL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function rL($={}){let Z=$.home??nX0(),X=$.cwd??process.cwd();return[Z,X].flatMap((J)=>oX0.map((z)=>Wv(J,z)))}function rX0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function cK($){let Z=rL($).find((z)=>Gv(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:xR,stale:!1};let X=null;try{X=rX0(pX0(Z,"utf8"))}catch{X=null}let J=X===null||X<xR;return{installed:!0,installedVersion:X,currentVersion:xR,stale:J}}function sX0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Hv($={}){let Z=J$(),X=gR(),J=cK();if(!J.installed){if(c7(fR)==="1")return;o3(fR,"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
  ${X}
@@ -297,7 +297,7 @@ ${Z}: your Rove agent skill is out of date (${G}; this Rove wants v${J.currentVe
297
297
  ${Z}: a new version of the Rove agent skill is available (${G} \u2192 v${J.currentVersion}).
298
298
  Update now? [y]es / [n]o / [d]on't notify for this version: `);let H=(await($.ask??sX0)()).trim().toLowerCase();if(H==="y"||H==="yes"){let U=await($.install??yR)();if(U===0)process.stderr.write(`${Z}: skill updated.
299
299
  `);else process.stderr.write(`${Z}: skill update failed (exit ${U}) \u2014 run \`${X}\` manually.
300
- `)}else if(H.startsWith("d"))o3(z,"1")}var xR=22,oX0,aX0="Sma1lboy/kobe",fR="skillHintSeen";var dK=a(()=>{o4();zQ();b4();oX0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var sL=()=>{};var q1=JY((tX0,tL)=>{(function(){function $(Z0,S0){Object.defineProperty(J.prototype,Z0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(Z0){if(Z0===null||typeof Z0!=="object")return null;return Z0=P0&&Z0[P0]||Z0["@@iterator"],typeof Z0==="function"?Z0:null}function X(Z0,S0){Z0=(Z0=Z0.constructor)&&(Z0.displayName||Z0.name)||"ReactClass";var e0=Z0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,Z0),u0[e0]=!0)}function J(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function z(){}function G(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function W(){}function H(Z0){return""+Z0}function U(Z0){try{H(Z0);var S0=!1}catch(l1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&Z0[Symbol.toStringTag]||Z0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(Z0)}}function K(Z0){if(Z0==null)return null;if(typeof Z0==="function")return Z0.$$typeof===c0?null:Z0.displayName||Z0.name||null;if(typeof Z0==="string")return Z0;switch(Z0){case l:return"Fragment";case n:return"Profiler";case d:return"StrictMode";case X0:return"Suspense";case C0:return"SuspenseList";case v0:return"Activity"}if(typeof Z0==="object")switch(typeof Z0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),Z0.$$typeof){case k:return"Portal";case s:return Z0.displayName||"Context";case G0:return(Z0._context.displayName||"Context")+".Consumer";case r:var S0=Z0.render;return Z0=Z0.displayName,Z0||(Z0=S0.displayName||S0.name||"",Z0=Z0!==""?"ForwardRef("+Z0+")":"ForwardRef"),Z0;case Q0:return S0=Z0.displayName||null,S0!==null?S0:K(Z0.type)||"Memo";case w0:S0=Z0._payload,Z0=Z0._init;try{return K(Z0(S0))}catch(e0){}}return null}function N(Z0){if(Z0===l)return"<>";if(typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0)return"<...>";try{var S0=K(Z0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function L(){var Z0=X1.A;return Z0===null?null:Z0.getOwner()}function M(){return Error("react-stack-top-frame")}function V(Z0){if(u1.call(Z0,"key")){var S0=Object.getOwnPropertyDescriptor(Z0,"key").get;if(S0&&S0.isReactWarning)return!1}return Z0.key!==void 0}function P(Z0,S0){function e0(){q$||(q$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty(Z0,"key",{get:e0,configurable:!0})}function _(){var Z0=K(this.type);return n5[Z0]||(n5[Z0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),Z0=this.props.ref,Z0!==void 0?Z0:null}function C(Z0,S0,e0,U1,l1,w$){var _$=e0.ref;return Z0={$$typeof:H0,type:Z0,key:S0,props:e0,_owner:U1},(_$!==void 0?_$:null)!==null?Object.defineProperty(Z0,"ref",{enumerable:!1,get:_}):Object.defineProperty(Z0,"ref",{enumerable:!1,value:null}),Z0._store={},Object.defineProperty(Z0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(Z0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(Z0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:l1}),Object.defineProperty(Z0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:w$}),Object.freeze&&(Object.freeze(Z0.props),Object.freeze(Z0)),Z0}function f(Z0,S0){return S0=C(Z0.type,S0,Z0.props,Z0._owner,Z0._debugStack,Z0._debugTask),Z0._store&&(S0._store.validated=Z0._store.validated),S0}function E(Z0){S(Z0)?Z0._store&&(Z0._store.validated=1):typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0&&(Z0._payload.status==="fulfilled"?S(Z0._payload.value)&&Z0._payload.value._store&&(Z0._payload.value._store.validated=1):Z0._store&&(Z0._store.validated=1))}function S(Z0){return typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===H0}function T(Z0){var S0={"=":"=0",":":"=2"};return"$"+Z0.replace(/[=:]/g,function(e0){return S0[e0]})}function x(Z0,S0){return typeof Z0==="object"&&Z0!==null&&Z0.key!=null?(U(Z0.key),T(""+Z0.key)):S0.toString(36)}function b(Z0){switch(Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason;default:switch(typeof Z0.status==="string"?Z0.then(W,W):(Z0.status="pending",Z0.then(function(S0){Z0.status==="pending"&&(Z0.status="fulfilled",Z0.value=S0)},function(S0){Z0.status==="pending"&&(Z0.status="rejected",Z0.reason=S0)})),Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason}}throw Z0}function v(Z0,S0,e0,U1,l1){var w$=typeof Z0;if(w$==="undefined"||w$==="boolean")Z0=null;var _$=!1;if(Z0===null)_$=!0;else switch(w$){case"bigint":case"string":case"number":_$=!0;break;case"object":switch(Z0.$$typeof){case H0:case k:_$=!0;break;case w0:return _$=Z0._init,v(_$(Z0._payload),S0,e0,U1,l1)}}if(_$){_$=Z0,l1=l1(_$);var K4=U1===""?"."+x(_$,0):U1;return N0(l1)?(e0="",K4!=null&&(e0=K4.replace(WJ,"$&/")+"/"),v(l1,S0,e0,"",function(P7){return P7})):l1!=null&&(S(l1)&&(l1.key!=null&&(_$&&_$.key===l1.key||U(l1.key)),e0=f(l1,e0+(l1.key==null||_$&&_$.key===l1.key?"":(""+l1.key).replace(WJ,"$&/")+"/")+K4),U1!==""&&_$!=null&&S(_$)&&_$.key==null&&_$._store&&!_$._store.validated&&(e0._store.validated=2),l1=e0),S0.push(l1)),1}if(_$=0,K4=U1===""?".":U1+":",N0(Z0))for(var y$=0;y$<Z0.length;y$++)U1=Z0[y$],w$=K4+x(U1,y$),_$+=v(U1,S0,e0,w$,l1);else if(y$=Z(Z0),typeof y$==="function")for(y$===Z0.entries&&(c8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),c8=!0),Z0=y$.call(Z0),y$=0;!(U1=Z0.next()).done;)U1=U1.value,w$=K4+x(U1,y$++),_$+=v(U1,S0,e0,w$,l1);else if(w$==="object"){if(typeof Z0.then==="function")return v(b(Z0),S0,e0,U1,l1);throw S0=String(Z0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(Z0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return _$}function u(Z0,S0,e0){if(Z0==null)return Z0;var U1=[],l1=0;return v(Z0,U1,"","",function(w$){return S0.call(e0,w$,l1++)}),U1}function o(Z0){if(Z0._status===-1){var S0=Z0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=Z0._result;var e0=S0();if(e0.then(function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=1,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=l1)}},function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=2,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=l1)}}),S0=Z0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}Z0._status===-1&&(Z0._status=0,Z0._result=e0)}if(Z0._status===1)return S0=Z0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
300
+ `)}else if(H.startsWith("d"))o3(z,"1")}var xR=22,oX0,aX0="Sma1lboy/rove",fR="skillHintSeen";var dK=a(()=>{o4();zQ();b4();oX0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var sL=()=>{};var q1=JY((tX0,tL)=>{(function(){function $(Z0,S0){Object.defineProperty(J.prototype,Z0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(Z0){if(Z0===null||typeof Z0!=="object")return null;return Z0=P0&&Z0[P0]||Z0["@@iterator"],typeof Z0==="function"?Z0:null}function X(Z0,S0){Z0=(Z0=Z0.constructor)&&(Z0.displayName||Z0.name)||"ReactClass";var e0=Z0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,Z0),u0[e0]=!0)}function J(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function z(){}function G(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function W(){}function H(Z0){return""+Z0}function U(Z0){try{H(Z0);var S0=!1}catch(l1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&Z0[Symbol.toStringTag]||Z0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(Z0)}}function K(Z0){if(Z0==null)return null;if(typeof Z0==="function")return Z0.$$typeof===c0?null:Z0.displayName||Z0.name||null;if(typeof Z0==="string")return Z0;switch(Z0){case l:return"Fragment";case n:return"Profiler";case d:return"StrictMode";case X0:return"Suspense";case C0:return"SuspenseList";case v0:return"Activity"}if(typeof Z0==="object")switch(typeof Z0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),Z0.$$typeof){case k:return"Portal";case s:return Z0.displayName||"Context";case G0:return(Z0._context.displayName||"Context")+".Consumer";case r:var S0=Z0.render;return Z0=Z0.displayName,Z0||(Z0=S0.displayName||S0.name||"",Z0=Z0!==""?"ForwardRef("+Z0+")":"ForwardRef"),Z0;case Q0:return S0=Z0.displayName||null,S0!==null?S0:K(Z0.type)||"Memo";case w0:S0=Z0._payload,Z0=Z0._init;try{return K(Z0(S0))}catch(e0){}}return null}function N(Z0){if(Z0===l)return"<>";if(typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0)return"<...>";try{var S0=K(Z0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function L(){var Z0=X1.A;return Z0===null?null:Z0.getOwner()}function M(){return Error("react-stack-top-frame")}function V(Z0){if(u1.call(Z0,"key")){var S0=Object.getOwnPropertyDescriptor(Z0,"key").get;if(S0&&S0.isReactWarning)return!1}return Z0.key!==void 0}function P(Z0,S0){function e0(){q$||(q$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty(Z0,"key",{get:e0,configurable:!0})}function _(){var Z0=K(this.type);return n5[Z0]||(n5[Z0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),Z0=this.props.ref,Z0!==void 0?Z0:null}function C(Z0,S0,e0,U1,l1,w$){var _$=e0.ref;return Z0={$$typeof:H0,type:Z0,key:S0,props:e0,_owner:U1},(_$!==void 0?_$:null)!==null?Object.defineProperty(Z0,"ref",{enumerable:!1,get:_}):Object.defineProperty(Z0,"ref",{enumerable:!1,value:null}),Z0._store={},Object.defineProperty(Z0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(Z0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(Z0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:l1}),Object.defineProperty(Z0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:w$}),Object.freeze&&(Object.freeze(Z0.props),Object.freeze(Z0)),Z0}function f(Z0,S0){return S0=C(Z0.type,S0,Z0.props,Z0._owner,Z0._debugStack,Z0._debugTask),Z0._store&&(S0._store.validated=Z0._store.validated),S0}function E(Z0){S(Z0)?Z0._store&&(Z0._store.validated=1):typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0&&(Z0._payload.status==="fulfilled"?S(Z0._payload.value)&&Z0._payload.value._store&&(Z0._payload.value._store.validated=1):Z0._store&&(Z0._store.validated=1))}function S(Z0){return typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===H0}function T(Z0){var S0={"=":"=0",":":"=2"};return"$"+Z0.replace(/[=:]/g,function(e0){return S0[e0]})}function x(Z0,S0){return typeof Z0==="object"&&Z0!==null&&Z0.key!=null?(U(Z0.key),T(""+Z0.key)):S0.toString(36)}function b(Z0){switch(Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason;default:switch(typeof Z0.status==="string"?Z0.then(W,W):(Z0.status="pending",Z0.then(function(S0){Z0.status==="pending"&&(Z0.status="fulfilled",Z0.value=S0)},function(S0){Z0.status==="pending"&&(Z0.status="rejected",Z0.reason=S0)})),Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason}}throw Z0}function v(Z0,S0,e0,U1,l1){var w$=typeof Z0;if(w$==="undefined"||w$==="boolean")Z0=null;var _$=!1;if(Z0===null)_$=!0;else switch(w$){case"bigint":case"string":case"number":_$=!0;break;case"object":switch(Z0.$$typeof){case H0:case k:_$=!0;break;case w0:return _$=Z0._init,v(_$(Z0._payload),S0,e0,U1,l1)}}if(_$){_$=Z0,l1=l1(_$);var K4=U1===""?"."+x(_$,0):U1;return N0(l1)?(e0="",K4!=null&&(e0=K4.replace(WJ,"$&/")+"/"),v(l1,S0,e0,"",function(P7){return P7})):l1!=null&&(S(l1)&&(l1.key!=null&&(_$&&_$.key===l1.key||U(l1.key)),e0=f(l1,e0+(l1.key==null||_$&&_$.key===l1.key?"":(""+l1.key).replace(WJ,"$&/")+"/")+K4),U1!==""&&_$!=null&&S(_$)&&_$.key==null&&_$._store&&!_$._store.validated&&(e0._store.validated=2),l1=e0),S0.push(l1)),1}if(_$=0,K4=U1===""?".":U1+":",N0(Z0))for(var y$=0;y$<Z0.length;y$++)U1=Z0[y$],w$=K4+x(U1,y$),_$+=v(U1,S0,e0,w$,l1);else if(y$=Z(Z0),typeof y$==="function")for(y$===Z0.entries&&(c8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),c8=!0),Z0=y$.call(Z0),y$=0;!(U1=Z0.next()).done;)U1=U1.value,w$=K4+x(U1,y$++),_$+=v(U1,S0,e0,w$,l1);else if(w$==="object"){if(typeof Z0.then==="function")return v(b(Z0),S0,e0,U1,l1);throw S0=String(Z0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(Z0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return _$}function u(Z0,S0,e0){if(Z0==null)return Z0;var U1=[],l1=0;return v(Z0,U1,"","",function(w$){return S0.call(e0,w$,l1++)}),U1}function o(Z0){if(Z0._status===-1){var S0=Z0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=Z0._result;var e0=S0();if(e0.then(function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=1,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=l1)}},function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=2,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=l1)}}),S0=Z0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}Z0._status===-1&&(Z0._status=0,Z0._result=e0)}if(Z0._status===1)return S0=Z0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
301
301
 
302
302
  Your code should look like:
303
303
  const MyComponent = lazy(() => import('./MyComponent'))
@@ -844,7 +844,7 @@ install one with: ${H6} update <version>
844
844
  `)}async function wF0($){if(/^https?:\/\//i.test($)){let G;try{G=await fetch($)}catch(N){JJ(`failed to fetch ${$}: ${N1(N)}`)}if(!G.ok)JJ(`failed to fetch ${$}: HTTP ${G.status} ${G.statusText}`);let W=await G.text(),H=$.split(/[?#]/)[0]??$,U=k10(H)||"theme.json",K=U.endsWith(".json")?U.slice(0,-5):U;return{text:W,defaultName:K}}let Z=IF0(process.cwd(),_2($)),X;try{X=PF0(Z,"utf8")}catch(G){JJ(`failed to read ${Z}: ${N1(G)}`)}let J=k10(Z),z=J.endsWith(".json")?J.slice(0,-5):J;return{text:X,defaultName:z}}function xF0($){let Z=null,X,J=!1;for(let z=0;z<$.length;z+=1){let G=$[z];if(G==="--force"||G==="-f"){J=!0;continue}if(G==="--name"||G==="-n"){let W=$[z+1];if(W===void 0)eQ("--name requires a value");X=W,z+=1;continue}if(G.startsWith("--name=")){X=G.slice(7);continue}if(G.startsWith("--"))eQ(`unknown flag: ${G}`);if(Z===null){Z=G;continue}eQ(`unexpected positional argument: ${G}`)}if(Z===null)eQ("missing <source> (URL or path to theme JSON)");return{source:Z,opts:{name:X,force:J}}}async function fF0($){let{source:Z,opts:X}=xF0($),{text:J,defaultName:z}=await wF0(Z),G;try{G=JSON.parse(J)}catch(N){JJ(`source is not valid JSON: ${N1(N)}`)}let W=OV(G);if(!W.ok)JJ(`source is not a valid Rove theme: ${W.reason}`);let H=X.name??z;if(!H||!/^[a-zA-Z0-9._-]+$/.test(H))JJ(`invalid theme name "${H}" (use letters, digits, '.', '_', '-')`);let U=Bq();AF0(U,{recursive:!0});let K=Dw(U,`${H}.json`);if(v10(K)&&!X.force)JJ(`${K} already exists (pass --force to overwrite)`);SF0(K,`${JSON.stringify(W.theme,null,2)}
845
845
  `,"utf8"),process.stdout.write(`installed theme "${H}" -> ${K}
846
846
  `)}function gF0($){let Z=$[0];if(!Z)eQ("missing <name>");if($.length>1)eQ(`unexpected extra arguments after "${Z}"`);if(Cw.includes(Z))JJ(`"${Z}" is a built-in theme and cannot be removed`);let X=Dw(Bq(),`${Z}.json`);if(!v10(X))JJ(`no user theme named "${Z}" (looked for ${X})`);TF0(X),process.stdout.write(`removed theme "${Z}" (${X})
847
- `)}function m10($=process.stderr){$.write([`Usage: ${Aw} theme <command> [args]`,"","Commands:"," list List bundled and user-installed themes"," add <source> [--name <name>] Install a theme from a URL or local path"," Pass --force to overwrite an existing user theme"," remove <name> Remove a user-installed theme","",`User themes live under: ${Bq()}`,"Schema: https://raw.githubusercontent.com/sma1lboy/kobe/main/packages/kobe/src/tui/context/theme/theme.schema.json",""].join(`
847
+ `)}function m10($=process.stderr){$.write([`Usage: ${Aw} theme <command> [args]`,"","Commands:"," list List bundled and user-installed themes"," add <source> [--name <name>] Install a theme from a URL or local path"," Pass --force to overwrite an existing user theme"," remove <name> Remove a user-installed theme","",`User themes live under: ${Bq()}`,"Schema: https://raw.githubusercontent.com/sma1lboy/rove/main/packages/kobe/src/tui/context/theme/theme.schema.json",""].join(`
848
848
  `))}async function yF0($){let[Z,...X]=$;if(!Z||Z==="--help"||Z==="-h"||Z==="help"){if(m10(Z?process.stdout:process.stderr),!Z)process.exit(2);return}if(Z==="list"||Z==="ls"){if(X.length>0)eQ(`"${Z}" takes no arguments`);EF0();return}if(Z==="add"){await fF0(X);return}if(Z==="remove"||Z==="rm"){gF0(X);return}eQ(`unknown action "${Z}" (try "list", "add", or "remove")`)}var Aw,Cw;var u10=a(()=>{HH();ZI();eS();o4();Aw=J$(),Cw=["claude","conductor","tokyonight"]});var n10={};g$(n10,{runFeedbackSubcommand:()=>kF0,parseFeedbackArgs:()=>p10});import{readFileSync as c10}from"fs";function $z($){process.stderr.write(`${d10} feedback: ${$}
849
849
 
850
850
  ${l10}
package/dist/cli/kobe.js CHANGED
@@ -283,7 +283,7 @@ ${z}`,Z);this.line=X,this.column=J,this.codeblock=z}}});function FL($,Z){let X=$
283
283
  `)){if(!X.trim())continue;try{let{sessionId:J,sessionDir:z,workDir:G}=JSON.parse(X);if(J&&z&&G)Z.push({sessionId:J,sessionDir:z,workDir:G})}catch{}}return Z}async function Ak($){let Z=await $.readFile(kL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return AX0(Z)}function Pk($){return kL.join($,"agents","main","wire.jsonl")}async function UR($,Z=qR){if(!$)return[];let X=[];for(let J of await Ak(Z)){if(J.workDir!==$)continue;let z=await Z.stat(Pk(J.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;X.push({id:J.sessionId,mtimeMs:z})}return X.sort((J,z)=>J.mtimeMs-z.mtimeMs).map((J)=>J.id)}async function Rk($,Z=qR){return await Z.stat($).then((X)=>X.mtimeMs).catch(()=>0)}async function BR($,Z=qR){if(!$)return null;let X=(await Ak(Z)).find((z)=>z.sessionId===$);if(!X)return null;let J=Pk(X.sessionDir);return await Z.stat(J).then(()=>J).catch(()=>null)}var qR;var Tk=a(()=>{CQ();qR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||kL.join(DX0(),".kimi-code")},async readFile($){return await _Q($)},stat:CX0}});import RX0 from"path";var vL,Sk,Ik,Ek,wk;var xk=a(()=>{zR();fL();Dk();Tk();vL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},Sk={async listSessionIdsForWorktree($){return[...await bH($)].sort((X,J)=>X.mtimeMs-J.mtimeMs).map((X)=>X.sessionId)},readHistory:($)=>Ok($),async transcriptPath($,Z){return(await bH(Z)).find((J)=>J.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>Nk($)},Ik={listSessionIdsForWorktree:($)=>Jk($),readHistory:($)=>zk($),transcriptPath:async($)=>await ZR($)??null,latestTranscriptMtimeForWorktree:($)=>Qk($)},Ek={listSessionIdsForWorktree:($)=>Vk($),readHistory:($)=>Ck($),async transcriptPath($){let Z=await WR($);return Z?RX0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>_k($)},wk={listSessionIdsForWorktree:($)=>UR($),readHistory:vL.readHistory,transcriptPath:($)=>BR($),async latestTranscriptMtimeForWorktree($){let X=(await UR($)).at(-1);if(!X)return 0;let J=await BR(X);return J?await Rk(J):0}}});var mL,fk,gk;var hL=a(()=>{mL=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],fk=["\xB7","\u2722","\u2731","\u2736","\u273B","\u273D"],gk=[...fk,...[...fk].reverse()]});import{readFile as bk,stat as TX0}from"fs/promises";class uL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function kk($){return E$($).createTurnDetector()}function yk($,Z="claude",X=0){let J=null,z=0;for(let G of $.split(`
284
284
  `)){z++;let W=mk(G);if(!W)continue;let H=MR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=hk(W,X),K={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!J||K.timestampMs>=J.timestampMs)J=K}return J}function wX0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=MR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&EX0.has(Z.type)}function xX0($,Z="codex"){let X=null,J=0;for(let z of $.split(`
285
285
  `)){J++;let G=mk(z);if(!G||!wX0(G))continue;let W=hk(G,0),H={id:`codex:${Z}:${W}:${J}`,timestampMs:W,source:"codex"};if(!X||H.timestampMs>=X.timestampMs)X=H}return X}function mk($){let Z=$.trim();if(!Z)return null;try{let X=JSON.parse(Z);return MR(X)?X:null}catch{return null}}function hk($,Z){let X=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(X)?X:Z}function MR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var vk=($)=>TX0($).then((Z)=>Z.mtimeMs,()=>0),SX0,KR,IX0,FR,vK,EX0;var NR=a(()=>{zR();fL();d7();SX0={listSessionFiles:($)=>bH($),readFile:($)=>bk($,"utf8"),statMtimeMs:vk};KR=class KR extends uL{deps;vendor="claude";cache=new Map;constructor($=SX0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),X=Z[0]?.mtimeMs??0,J=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=yk(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!J||H.timestampMs>J.timestampMs))J=H}return this.cache=z,{marker:J,mtimeMs:X}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??vk)($);if(Z===0)return null;let X=await this.deps.readFile($).catch(()=>"");return{marker:yk(X,$,Z),mtimeMs:Z}}};IX0={findLatestRollout:($)=>XR($),readFile:($)=>bk($,"utf8")};FR=class FR extends uL{deps;vendor="codex";cache=null;constructor($=IX0){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 X=await this.deps.readFile(Z.path).catch(()=>"");if(!X)return{marker:null,mtimeMs:Z.mtimeMs};let J=xX0(X,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:J},{marker:J,mtimeMs:Z.mtimeMs}}};vK=class vK extends uL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};EX0=new Set(["task_complete","turn_complete","turn_aborted"])});function fX0($){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 mK($),createTurnDetector:()=>new vK($)}}function E$($){return v7($)?OR[$]:fX0($)}function uk($){return E$($).history.readHistory!==vL.readHistory}function LR($){let Z=E$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:ck}function kH($,Z){let X=Z?LR(Z):ck;for(let J of[...X].sort((z,G)=>G.length-z.length)){if(!$.startsWith(J))continue;let z=$.slice(J.length).trimStart();if(z.length===0)return $;return z}return $}function cL($,Z){let X=E$($).terminalTitle,J=X?.workingPrefixes;if(X?.ownsStatus!==!0||!J||J.length===0)return null;let z=Z.trim();if(z.length===0)return null;return J.some((G)=>z.startsWith(G))?"working":"rest"}function dk(){return Object.values(OR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var OR,ck;var d7=a(()=>{m7();RX();Tb();gb();hb();db();pb();Hk();xk();jR();hL();NR();OR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:Sk,detectAccount:($)=>IH($),createHookAdapter:()=>new dP,createTurnDetector:()=>new KR,capabilities:Pb,identity:Rb,spinnerFrames:gk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>mb()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:Ik,detectAccount:($)=>EH($),createHookAdapter:()=>new iP,createTurnDetector:()=>new FR,capabilities:ub,identity:cb,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:()=>Wk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:Ek,detectAccount:($)=>wH($),createHookAdapter:()=>new mK("copilot"),createTurnDetector:()=>new vK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],history:wk,detectAccount:($)=>TL($),createHookAdapter:()=>new mK("kimi"),createTurnDetector:()=>new vK("kimi")}};ck=[...new Set(Object.values(OR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function VR($){return E$($).createHookAdapter()}class mK{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 jR=a(()=>{d7()});function dL($){return gX0.includes($)}function lk($){return yX0.includes($)}var gX0,yX0;var _R=a(()=>{gX0=["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"];yX0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Xv={};g$(Xv,{runHookSubcommand:()=>uX0,readTextWithTimeout:()=>ok,parseWorktreeRemovePath:()=>tk,parseWorktreeAddPath:()=>sk,ensureGlobalKobeHooks:()=>DR});import{homedir as bX0}from"os";import{join as ik,resolve as CR}from"path";async function ok($,Z=kX0){let X;try{return await Promise.race([$(),new Promise((J)=>{X=setTimeout(()=>J(""),Z)})])}finally{if(X!==void 0)clearTimeout(X)}}async function ak(){try{let $=await ok(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function pk($,Z){for(let X=0;X<$.length;X++){if($[X]===Z)return $[X+1];if($[X].startsWith(`${Z}=`))return $[X].slice(Z.length+1)}return}function mX0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function rk($){let Z=[],X=/"([^"]*)"|'([^']*)'|(\S+)/g,J;while((J=X.exec($))!==null)Z.push(J[1]??J[2]??J[3]??"");return Z}function sk($){let Z=rk($),X=new Set(["-b","-B","--reason"]);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="add")continue;let z=J+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=X.has(G)?2:1;continue}return G}}return}function tk($){let Z=rk($);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="remove")continue;let J=X+2;while(J<Z.length){let z=Z[J];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){J+=1;continue}return z}}return}async function hX0(){let $=await ak(),Z=mX0($.tool_input)?$.tool_input:{},X=typeof Z.command==="string"?Z.command:"";if(!X.includes("worktree"))return;let J=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=sk(X),G=z?void 0:tk(X);if(!z&&!G)return;let W=await qQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:J,worktreePath:CR(J,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:CR(J,G)})}finally{W.close()}}async function uX0($){let[Z,...X]=$;if(Z==="setup"){await pX0(X);return}if(Z===vX0){try{await hX0()}catch{}return}try{if(!Z||!dL(Z))return;let J=await ak(),z=pk(X,"--task-id"),G=typeof J.cwd==="string"&&J.cwd?J.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=pk(X,"--engine"),K=ek().filter((V)=>!U||V.vendor===U),N;for(let V of K)if(N=V.activityDetailFromPayload(Z,J),N)break;let L;for(let V of K)if(L=V.sessionFromPayload(J),L)break;let M=await qQ();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(J){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,J instanceof Error?J.message:String(J))}}function cX0(){return T8.map(($)=>VR($)).filter(($)=>$.supportsWorktreeSync())}function ek(){return T8.map(($)=>VR($)).filter(($)=>$.supportsHooks())}function $v(){return ik(bX0(),".claude","settings.json")}function dX0($){if(!$||$==="off")return;if($==="global")return $v();if($.startsWith("repo:"))return ik(CR($.slice(5)),".claude","settings.json");return $}async function DR(){try{let $=lX0();for(let Z of ek()){let X=Z.globalSettingsPath();if(!X)continue;await Z.installActivityHooks(X,{toolEvents:$}),await Z.installWorktreeWatchHook(X)}await Zv()}catch{}}function lX0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(JZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Zv(){let $=cX0();if($.length===0)return;let Z=c7(nk),X=new Set([$v()]),J=dX0(Z);if(J)X.add(J);for(let z of $)for(let G of X)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(nk,"off")}async function pX0($){await Zv(),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 kX0=500,vX0="worktree-created",nk="externalWorktreeSync";var AR=a(()=>{C2();OQ();AX();jR();_R();b4();m7()});var lL;var Jv=a(()=>{lL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.92",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:"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:rove":"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.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.13","@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 zv={};g$(zv,{repoSlug:()=>LY,releasePageUrl:()=>ER,recommendedGlobalInstallCommand:()=>TR,isNewerSemver:()=>PR,fetchReleaseSummaries:()=>uK,fetchReleaseNotesRange:()=>IR,fetchReleaseNotes:()=>SR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>hK,UPDATE_SCRIPT_URL:()=>pL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>RR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>SX});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 TR(){return`npm install -g ${RR}@latest`}function hK($,Z,X=SX){let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}async function iX0($){let Z=new AbortController,X=setTimeout(()=>Z.abort(),nL);try{let J=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${J}/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(X)}}function PR($,Z){return B3($,Z)>0}function B3($,Z){let X=(G)=>G.split("-")[0]??G,J=X($).split(".").map((G)=>Number.parseInt(G,10)),z=X(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=J[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:D$,latest:Z,hasUpdate:PR(Z,D$)};if(WH()&&!$.force)return null;let X=await iX0(RR);if(!X)return null;return{current:D$,latest:X,hasUpdate:PR(X,D$)}}function Qv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function SR($){let Z=LY();if(!Z)return null;let X=`v${$}`,J=new AbortController,z=setTimeout(()=>J.abort(),nL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${X}`,{signal:J.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 IR($){let Z=LY();if(!Z)return[];let X=$.limit??100,J=new AbortController,z=setTimeout(()=>J.abort(),nL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${X}`,{signal:J.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=Qv(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 uK($=12){let Z=LY();if(!Z)return[];let X=new AbortController,J=setTimeout(()=>X.abort(),nL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:X.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=Qv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(J)}}function ER($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,RR,pL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,SX,nL=3000;var w8=a(()=>{Jv();L5();D$=lL.version,RR=lL.name;WZ=`curl -fsSL ${pL} | sh`;SX=[]});var Gv={};g$(Gv,{stampResetGate:()=>iL,resetGateBlockers:()=>Yv,enforceResetGate:()=>xR,LAST_RUN_VERSION_KEY:()=>wR});function Yv($,Z=D$,X=SX){if(typeof $!=="string"||$.length===0)return[];let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}function xR(){let $=J$(),Z=_4()[wR],X=Yv(Z);if(X.length>0){let J=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${X.join(", ")} introduced breaking changes`,`(last run: ${J}). 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 kX0=500,vX0="worktree-created",nk="externalWorktreeSync";var AR=a(()=>{C2();OQ();AX();jR();_R();b4();m7()});var lL;var Jv=a(()=>{lL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.93",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:"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:rove":"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.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 zv={};g$(zv,{repoSlug:()=>LY,releasePageUrl:()=>ER,recommendedGlobalInstallCommand:()=>TR,isNewerSemver:()=>PR,fetchReleaseSummaries:()=>uK,fetchReleaseNotesRange:()=>IR,fetchReleaseNotes:()=>SR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>hK,UPDATE_SCRIPT_URL:()=>pL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>RR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>SX});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 TR(){return`npm install -g ${RR}@latest`}function hK($,Z,X=SX){let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}async function iX0($){let Z=new AbortController,X=setTimeout(()=>Z.abort(),nL);try{let J=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${J}/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(X)}}function PR($,Z){return B3($,Z)>0}function B3($,Z){let X=(G)=>G.split("-")[0]??G,J=X($).split(".").map((G)=>Number.parseInt(G,10)),z=X(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=J[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:D$,latest:Z,hasUpdate:PR(Z,D$)};if(WH()&&!$.force)return null;let X=await iX0(RR);if(!X)return null;return{current:D$,latest:X,hasUpdate:PR(X,D$)}}function Qv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function SR($){let Z=LY();if(!Z)return null;let X=`v${$}`,J=new AbortController,z=setTimeout(()=>J.abort(),nL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${X}`,{signal:J.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 IR($){let Z=LY();if(!Z)return[];let X=$.limit??100,J=new AbortController,z=setTimeout(()=>J.abort(),nL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${X}`,{signal:J.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=Qv(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 uK($=12){let Z=LY();if(!Z)return[];let X=new AbortController,J=setTimeout(()=>X.abort(),nL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:X.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=Qv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(J)}}function ER($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,RR,pL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,SX,nL=3000;var w8=a(()=>{Jv();L5();D$=lL.version,RR=lL.name;WZ=`curl -fsSL ${pL} | sh`;SX=[]});var Gv={};g$(Gv,{stampResetGate:()=>iL,resetGateBlockers:()=>Yv,enforceResetGate:()=>xR,LAST_RUN_VERSION_KEY:()=>wR});function Yv($,Z=D$,X=SX){if(typeof $!=="string"||$.length===0)return[];let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}function xR(){let $=J$(),Z=_4()[wR],X=Yv(Z);if(X.length>0){let J=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${X.join(", ")} introduced breaking changes`,`(last run: ${J}). 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!==D$)iL()}function iL(){try{n2({[wR]:D$})}catch{}}var wR="app.lastRunVersion";var oL=a(()=>{D2();w8();h4()});import{existsSync as Hv,readFileSync as oX0}from"fs";import{homedir as aX0}from"os";import{join as qv,resolve as Wv}from"path";import{fileURLToPath as rX0}from"url";function yR($=process.env){return`${J$($)} skill install`}function aL(){let $=rX0(import.meta.url);return[Wv($,"../../../../../.agents/skills/kobe"),Wv($,"../../skills/rove")].find((X)=>Hv(qv(X,"SKILL.md")))??null}function rL($={}){let Z=$.source!==void 0?$.source:aL(),X=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??tX0,"--skill",p3,...$.global===!1?[]:["--global"],...X.flatMap((J)=>["--agent",J])]}function VY($={}){return`npx ${rL($).join(" ")}`}async function bR($,Z){return await Bun.spawn(["npx",...rL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function sL($={}){let Z=$.home??aX0(),X=$.cwd??process.cwd();return[Z,X].flatMap((J)=>sX0.map((z)=>qv(J,z)))}function eX0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function cK($){let Z=sL($).find((z)=>Hv(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:fR,stale:!1};let X=null;try{X=eX0(oX0(Z,"utf8"))}catch{X=null}let J=X===null||X<fR;return{installed:!0,installedVersion:X,currentVersion:fR,stale:J}}function $J0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Uv($={}){let Z=J$(),X=yR(),J=cK();if(!J.installed){if(c7(gR)==="1")return;o3(gR,"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
  ${X}
@@ -297,7 +297,7 @@ ${Z}: your Rove agent skill is out of date (${G}; this Rove wants v${J.currentVe
297
297
  ${Z}: a new version of the Rove agent skill is available (${G} \u2192 v${J.currentVersion}).
298
298
  Update now? [y]es / [n]o / [d]on't notify for this version: `);let H=(await($.ask??$J0)()).trim().toLowerCase();if(H==="y"||H==="yes"){let U=await($.install??bR)();if(U===0)process.stderr.write(`${Z}: skill updated.
299
299
  `);else process.stderr.write(`${Z}: skill update failed (exit ${U}) \u2014 run \`${X}\` manually.
300
- `)}else if(H.startsWith("d"))o3(z,"1")}var fR=22,sX0,tX0="Sma1lboy/kobe",gR="skillHintSeen";var dK=a(()=>{h4();zQ();b4();sX0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var tL=()=>{};var q1=JY((ZJ0,eL)=>{(function(){function $(Z0,S0){Object.defineProperty(J.prototype,Z0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(Z0){if(Z0===null||typeof Z0!=="object")return null;return Z0=P0&&Z0[P0]||Z0["@@iterator"],typeof Z0==="function"?Z0:null}function X(Z0,S0){Z0=(Z0=Z0.constructor)&&(Z0.displayName||Z0.name)||"ReactClass";var e0=Z0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,Z0),u0[e0]=!0)}function J(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function z(){}function G(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function W(){}function H(Z0){return""+Z0}function U(Z0){try{H(Z0);var S0=!1}catch(l1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&Z0[Symbol.toStringTag]||Z0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(Z0)}}function K(Z0){if(Z0==null)return null;if(typeof Z0==="function")return Z0.$$typeof===c0?null:Z0.displayName||Z0.name||null;if(typeof Z0==="string")return Z0;switch(Z0){case l:return"Fragment";case n:return"Profiler";case d:return"StrictMode";case X0:return"Suspense";case C0:return"SuspenseList";case v0:return"Activity"}if(typeof Z0==="object")switch(typeof Z0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),Z0.$$typeof){case k:return"Portal";case s:return Z0.displayName||"Context";case G0:return(Z0._context.displayName||"Context")+".Consumer";case r:var S0=Z0.render;return Z0=Z0.displayName,Z0||(Z0=S0.displayName||S0.name||"",Z0=Z0!==""?"ForwardRef("+Z0+")":"ForwardRef"),Z0;case Q0:return S0=Z0.displayName||null,S0!==null?S0:K(Z0.type)||"Memo";case w0:S0=Z0._payload,Z0=Z0._init;try{return K(Z0(S0))}catch(e0){}}return null}function N(Z0){if(Z0===l)return"<>";if(typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0)return"<...>";try{var S0=K(Z0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function L(){var Z0=X1.A;return Z0===null?null:Z0.getOwner()}function M(){return Error("react-stack-top-frame")}function V(Z0){if(u1.call(Z0,"key")){var S0=Object.getOwnPropertyDescriptor(Z0,"key").get;if(S0&&S0.isReactWarning)return!1}return Z0.key!==void 0}function P(Z0,S0){function e0(){q$||(q$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty(Z0,"key",{get:e0,configurable:!0})}function _(){var Z0=K(this.type);return n5[Z0]||(n5[Z0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),Z0=this.props.ref,Z0!==void 0?Z0:null}function C(Z0,S0,e0,U1,l1,w$){var _$=e0.ref;return Z0={$$typeof:H0,type:Z0,key:S0,props:e0,_owner:U1},(_$!==void 0?_$:null)!==null?Object.defineProperty(Z0,"ref",{enumerable:!1,get:_}):Object.defineProperty(Z0,"ref",{enumerable:!1,value:null}),Z0._store={},Object.defineProperty(Z0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(Z0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(Z0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:l1}),Object.defineProperty(Z0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:w$}),Object.freeze&&(Object.freeze(Z0.props),Object.freeze(Z0)),Z0}function f(Z0,S0){return S0=C(Z0.type,S0,Z0.props,Z0._owner,Z0._debugStack,Z0._debugTask),Z0._store&&(S0._store.validated=Z0._store.validated),S0}function E(Z0){S(Z0)?Z0._store&&(Z0._store.validated=1):typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0&&(Z0._payload.status==="fulfilled"?S(Z0._payload.value)&&Z0._payload.value._store&&(Z0._payload.value._store.validated=1):Z0._store&&(Z0._store.validated=1))}function S(Z0){return typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===H0}function T(Z0){var S0={"=":"=0",":":"=2"};return"$"+Z0.replace(/[=:]/g,function(e0){return S0[e0]})}function x(Z0,S0){return typeof Z0==="object"&&Z0!==null&&Z0.key!=null?(U(Z0.key),T(""+Z0.key)):S0.toString(36)}function b(Z0){switch(Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason;default:switch(typeof Z0.status==="string"?Z0.then(W,W):(Z0.status="pending",Z0.then(function(S0){Z0.status==="pending"&&(Z0.status="fulfilled",Z0.value=S0)},function(S0){Z0.status==="pending"&&(Z0.status="rejected",Z0.reason=S0)})),Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason}}throw Z0}function v(Z0,S0,e0,U1,l1){var w$=typeof Z0;if(w$==="undefined"||w$==="boolean")Z0=null;var _$=!1;if(Z0===null)_$=!0;else switch(w$){case"bigint":case"string":case"number":_$=!0;break;case"object":switch(Z0.$$typeof){case H0:case k:_$=!0;break;case w0:return _$=Z0._init,v(_$(Z0._payload),S0,e0,U1,l1)}}if(_$){_$=Z0,l1=l1(_$);var K4=U1===""?"."+x(_$,0):U1;return N0(l1)?(e0="",K4!=null&&(e0=K4.replace(WJ,"$&/")+"/"),v(l1,S0,e0,"",function(P7){return P7})):l1!=null&&(S(l1)&&(l1.key!=null&&(_$&&_$.key===l1.key||U(l1.key)),e0=f(l1,e0+(l1.key==null||_$&&_$.key===l1.key?"":(""+l1.key).replace(WJ,"$&/")+"/")+K4),U1!==""&&_$!=null&&S(_$)&&_$.key==null&&_$._store&&!_$._store.validated&&(e0._store.validated=2),l1=e0),S0.push(l1)),1}if(_$=0,K4=U1===""?".":U1+":",N0(Z0))for(var y$=0;y$<Z0.length;y$++)U1=Z0[y$],w$=K4+x(U1,y$),_$+=v(U1,S0,e0,w$,l1);else if(y$=Z(Z0),typeof y$==="function")for(y$===Z0.entries&&(c8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),c8=!0),Z0=y$.call(Z0),y$=0;!(U1=Z0.next()).done;)U1=U1.value,w$=K4+x(U1,y$++),_$+=v(U1,S0,e0,w$,l1);else if(w$==="object"){if(typeof Z0.then==="function")return v(b(Z0),S0,e0,U1,l1);throw S0=String(Z0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(Z0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return _$}function u(Z0,S0,e0){if(Z0==null)return Z0;var U1=[],l1=0;return v(Z0,U1,"","",function(w$){return S0.call(e0,w$,l1++)}),U1}function o(Z0){if(Z0._status===-1){var S0=Z0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=Z0._result;var e0=S0();if(e0.then(function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=1,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=l1)}},function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=2,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=l1)}}),S0=Z0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}Z0._status===-1&&(Z0._status=0,Z0._result=e0)}if(Z0._status===1)return S0=Z0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
300
+ `)}else if(H.startsWith("d"))o3(z,"1")}var fR=22,sX0,tX0="Sma1lboy/rove",gR="skillHintSeen";var dK=a(()=>{h4();zQ();b4();sX0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var tL=()=>{};var q1=JY((ZJ0,eL)=>{(function(){function $(Z0,S0){Object.defineProperty(J.prototype,Z0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(Z0){if(Z0===null||typeof Z0!=="object")return null;return Z0=P0&&Z0[P0]||Z0["@@iterator"],typeof Z0==="function"?Z0:null}function X(Z0,S0){Z0=(Z0=Z0.constructor)&&(Z0.displayName||Z0.name)||"ReactClass";var e0=Z0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,Z0),u0[e0]=!0)}function J(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function z(){}function G(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function W(){}function H(Z0){return""+Z0}function U(Z0){try{H(Z0);var S0=!1}catch(l1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&Z0[Symbol.toStringTag]||Z0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(Z0)}}function K(Z0){if(Z0==null)return null;if(typeof Z0==="function")return Z0.$$typeof===c0?null:Z0.displayName||Z0.name||null;if(typeof Z0==="string")return Z0;switch(Z0){case l:return"Fragment";case n:return"Profiler";case d:return"StrictMode";case X0:return"Suspense";case C0:return"SuspenseList";case v0:return"Activity"}if(typeof Z0==="object")switch(typeof Z0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),Z0.$$typeof){case k:return"Portal";case s:return Z0.displayName||"Context";case G0:return(Z0._context.displayName||"Context")+".Consumer";case r:var S0=Z0.render;return Z0=Z0.displayName,Z0||(Z0=S0.displayName||S0.name||"",Z0=Z0!==""?"ForwardRef("+Z0+")":"ForwardRef"),Z0;case Q0:return S0=Z0.displayName||null,S0!==null?S0:K(Z0.type)||"Memo";case w0:S0=Z0._payload,Z0=Z0._init;try{return K(Z0(S0))}catch(e0){}}return null}function N(Z0){if(Z0===l)return"<>";if(typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0)return"<...>";try{var S0=K(Z0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function L(){var Z0=X1.A;return Z0===null?null:Z0.getOwner()}function M(){return Error("react-stack-top-frame")}function V(Z0){if(u1.call(Z0,"key")){var S0=Object.getOwnPropertyDescriptor(Z0,"key").get;if(S0&&S0.isReactWarning)return!1}return Z0.key!==void 0}function P(Z0,S0){function e0(){q$||(q$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty(Z0,"key",{get:e0,configurable:!0})}function _(){var Z0=K(this.type);return n5[Z0]||(n5[Z0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),Z0=this.props.ref,Z0!==void 0?Z0:null}function C(Z0,S0,e0,U1,l1,w$){var _$=e0.ref;return Z0={$$typeof:H0,type:Z0,key:S0,props:e0,_owner:U1},(_$!==void 0?_$:null)!==null?Object.defineProperty(Z0,"ref",{enumerable:!1,get:_}):Object.defineProperty(Z0,"ref",{enumerable:!1,value:null}),Z0._store={},Object.defineProperty(Z0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(Z0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(Z0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:l1}),Object.defineProperty(Z0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:w$}),Object.freeze&&(Object.freeze(Z0.props),Object.freeze(Z0)),Z0}function f(Z0,S0){return S0=C(Z0.type,S0,Z0.props,Z0._owner,Z0._debugStack,Z0._debugTask),Z0._store&&(S0._store.validated=Z0._store.validated),S0}function E(Z0){S(Z0)?Z0._store&&(Z0._store.validated=1):typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0&&(Z0._payload.status==="fulfilled"?S(Z0._payload.value)&&Z0._payload.value._store&&(Z0._payload.value._store.validated=1):Z0._store&&(Z0._store.validated=1))}function S(Z0){return typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===H0}function T(Z0){var S0={"=":"=0",":":"=2"};return"$"+Z0.replace(/[=:]/g,function(e0){return S0[e0]})}function x(Z0,S0){return typeof Z0==="object"&&Z0!==null&&Z0.key!=null?(U(Z0.key),T(""+Z0.key)):S0.toString(36)}function b(Z0){switch(Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason;default:switch(typeof Z0.status==="string"?Z0.then(W,W):(Z0.status="pending",Z0.then(function(S0){Z0.status==="pending"&&(Z0.status="fulfilled",Z0.value=S0)},function(S0){Z0.status==="pending"&&(Z0.status="rejected",Z0.reason=S0)})),Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason}}throw Z0}function v(Z0,S0,e0,U1,l1){var w$=typeof Z0;if(w$==="undefined"||w$==="boolean")Z0=null;var _$=!1;if(Z0===null)_$=!0;else switch(w$){case"bigint":case"string":case"number":_$=!0;break;case"object":switch(Z0.$$typeof){case H0:case k:_$=!0;break;case w0:return _$=Z0._init,v(_$(Z0._payload),S0,e0,U1,l1)}}if(_$){_$=Z0,l1=l1(_$);var K4=U1===""?"."+x(_$,0):U1;return N0(l1)?(e0="",K4!=null&&(e0=K4.replace(WJ,"$&/")+"/"),v(l1,S0,e0,"",function(P7){return P7})):l1!=null&&(S(l1)&&(l1.key!=null&&(_$&&_$.key===l1.key||U(l1.key)),e0=f(l1,e0+(l1.key==null||_$&&_$.key===l1.key?"":(""+l1.key).replace(WJ,"$&/")+"/")+K4),U1!==""&&_$!=null&&S(_$)&&_$.key==null&&_$._store&&!_$._store.validated&&(e0._store.validated=2),l1=e0),S0.push(l1)),1}if(_$=0,K4=U1===""?".":U1+":",N0(Z0))for(var y$=0;y$<Z0.length;y$++)U1=Z0[y$],w$=K4+x(U1,y$),_$+=v(U1,S0,e0,w$,l1);else if(y$=Z(Z0),typeof y$==="function")for(y$===Z0.entries&&(c8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),c8=!0),Z0=y$.call(Z0),y$=0;!(U1=Z0.next()).done;)U1=U1.value,w$=K4+x(U1,y$++),_$+=v(U1,S0,e0,w$,l1);else if(w$==="object"){if(typeof Z0.then==="function")return v(b(Z0),S0,e0,U1,l1);throw S0=String(Z0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(Z0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return _$}function u(Z0,S0,e0){if(Z0==null)return Z0;var U1=[],l1=0;return v(Z0,U1,"","",function(w$){return S0.call(e0,w$,l1++)}),U1}function o(Z0){if(Z0._status===-1){var S0=Z0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=Z0._result;var e0=S0();if(e0.then(function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=1,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=l1)}},function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=2,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=l1)}}),S0=Z0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}Z0._status===-1&&(Z0._status=0,Z0._result=e0)}if(Z0._status===1)return S0=Z0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
301
301
 
302
302
  Your code should look like:
303
303
  const MyComponent = lazy(() => import('./MyComponent'))
@@ -844,7 +844,7 @@ install one with: ${H6} update <version>
844
844
  `)}async function gF0($){if(/^https?:\/\//i.test($)){let G;try{G=await fetch($)}catch(N){JJ(`failed to fetch ${$}: ${N1(N)}`)}if(!G.ok)JJ(`failed to fetch ${$}: HTTP ${G.status} ${G.statusText}`);let W=await G.text(),H=$.split(/[?#]/)[0]??$,U=m10(H)||"theme.json",K=U.endsWith(".json")?U.slice(0,-5):U;return{text:W,defaultName:K}}let Z=xF0(process.cwd(),_2($)),X;try{X=SF0(Z,"utf8")}catch(G){JJ(`failed to read ${Z}: ${N1(G)}`)}let J=m10(Z),z=J.endsWith(".json")?J.slice(0,-5):J;return{text:X,defaultName:z}}function yF0($){let Z=null,X,J=!1;for(let z=0;z<$.length;z+=1){let G=$[z];if(G==="--force"||G==="-f"){J=!0;continue}if(G==="--name"||G==="-n"){let W=$[z+1];if(W===void 0)eQ("--name requires a value");X=W,z+=1;continue}if(G.startsWith("--name=")){X=G.slice(7);continue}if(G.startsWith("--"))eQ(`unknown flag: ${G}`);if(Z===null){Z=G;continue}eQ(`unexpected positional argument: ${G}`)}if(Z===null)eQ("missing <source> (URL or path to theme JSON)");return{source:Z,opts:{name:X,force:J}}}async function bF0($){let{source:Z,opts:X}=yF0($),{text:J,defaultName:z}=await gF0(Z),G;try{G=JSON.parse(J)}catch(N){JJ(`source is not valid JSON: ${N1(N)}`)}let W=LV(G);if(!W.ok)JJ(`source is not a valid Rove theme: ${W.reason}`);let H=X.name??z;if(!H||!/^[a-zA-Z0-9._-]+$/.test(H))JJ(`invalid theme name "${H}" (use letters, digits, '.', '_', '-')`);let U=Bq();TF0(U,{recursive:!0});let K=Aw(U,`${H}.json`);if(h10(K)&&!X.force)JJ(`${K} already exists (pass --force to overwrite)`);wF0(K,`${JSON.stringify(W.theme,null,2)}
845
845
  `,"utf8"),process.stdout.write(`installed theme "${H}" -> ${K}
846
846
  `)}function kF0($){let Z=$[0];if(!Z)eQ("missing <name>");if($.length>1)eQ(`unexpected extra arguments after "${Z}"`);if(Dw.includes(Z))JJ(`"${Z}" is a built-in theme and cannot be removed`);let X=Aw(Bq(),`${Z}.json`);if(!h10(X))JJ(`no user theme named "${Z}" (looked for ${X})`);EF0(X),process.stdout.write(`removed theme "${Z}" (${X})
847
- `)}function u10($=process.stderr){$.write([`Usage: ${Pw} theme <command> [args]`,"","Commands:"," list List bundled and user-installed themes"," add <source> [--name <name>] Install a theme from a URL or local path"," Pass --force to overwrite an existing user theme"," remove <name> Remove a user-installed theme","",`User themes live under: ${Bq()}`,"Schema: https://raw.githubusercontent.com/sma1lboy/kobe/main/packages/kobe/src/tui/context/theme/theme.schema.json",""].join(`
847
+ `)}function u10($=process.stderr){$.write([`Usage: ${Pw} theme <command> [args]`,"","Commands:"," list List bundled and user-installed themes"," add <source> [--name <name>] Install a theme from a URL or local path"," Pass --force to overwrite an existing user theme"," remove <name> Remove a user-installed theme","",`User themes live under: ${Bq()}`,"Schema: https://raw.githubusercontent.com/sma1lboy/rove/main/packages/kobe/src/tui/context/theme/theme.schema.json",""].join(`
848
848
  `))}async function vF0($){let[Z,...X]=$;if(!Z||Z==="--help"||Z==="-h"||Z==="help"){if(u10(Z?process.stdout:process.stderr),!Z)process.exit(2);return}if(Z==="list"||Z==="ls"){if(X.length>0)eQ(`"${Z}" takes no arguments`);fF0();return}if(Z==="add"){await bF0(X);return}if(Z==="remove"||Z==="rm"){kF0(X);return}eQ(`unknown action "${Z}" (try "list", "add", or "remove")`)}var Pw,Dw;var d10=a(()=>{HH();XI();$I();h4();Pw=J$(),Dw=["claude","conductor","tokyonight"]});var o10={};g$(o10,{runFeedbackSubcommand:()=>hF0,parseFeedbackArgs:()=>i10});import{readFileSync as l10}from"fs";function $z($){process.stderr.write(`${p10} feedback: ${$}
849
849
 
850
850
  ${n10}
package/dist/cli/rove.js CHANGED
@@ -283,7 +283,7 @@ ${z}`,Z);this.line=X,this.column=J,this.codeblock=z}}});function FL($,Z){let X=$
283
283
  `)){if(!X.trim())continue;try{let{sessionId:J,sessionDir:z,workDir:G}=JSON.parse(X);if(J&&z&&G)Z.push({sessionId:J,sessionDir:z,workDir:G})}catch{}}return Z}async function Ak($){let Z=await $.readFile(kL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return AX0(Z)}function Pk($){return kL.join($,"agents","main","wire.jsonl")}async function UR($,Z=qR){if(!$)return[];let X=[];for(let J of await Ak(Z)){if(J.workDir!==$)continue;let z=await Z.stat(Pk(J.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;X.push({id:J.sessionId,mtimeMs:z})}return X.sort((J,z)=>J.mtimeMs-z.mtimeMs).map((J)=>J.id)}async function Rk($,Z=qR){return await Z.stat($).then((X)=>X.mtimeMs).catch(()=>0)}async function BR($,Z=qR){if(!$)return null;let X=(await Ak(Z)).find((z)=>z.sessionId===$);if(!X)return null;let J=Pk(X.sessionDir);return await Z.stat(J).then(()=>J).catch(()=>null)}var qR;var Tk=a(()=>{CQ();qR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||kL.join(DX0(),".kimi-code")},async readFile($){return await _Q($)},stat:CX0}});import RX0 from"path";var vL,Sk,Ik,Ek,wk;var xk=a(()=>{zR();fL();Dk();Tk();vL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},Sk={async listSessionIdsForWorktree($){return[...await bH($)].sort((X,J)=>X.mtimeMs-J.mtimeMs).map((X)=>X.sessionId)},readHistory:($)=>Ok($),async transcriptPath($,Z){return(await bH(Z)).find((J)=>J.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>Nk($)},Ik={listSessionIdsForWorktree:($)=>Jk($),readHistory:($)=>zk($),transcriptPath:async($)=>await ZR($)??null,latestTranscriptMtimeForWorktree:($)=>Qk($)},Ek={listSessionIdsForWorktree:($)=>Vk($),readHistory:($)=>Ck($),async transcriptPath($){let Z=await WR($);return Z?RX0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>_k($)},wk={listSessionIdsForWorktree:($)=>UR($),readHistory:vL.readHistory,transcriptPath:($)=>BR($),async latestTranscriptMtimeForWorktree($){let X=(await UR($)).at(-1);if(!X)return 0;let J=await BR(X);return J?await Rk(J):0}}});var mL,fk,gk;var hL=a(()=>{mL=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],fk=["\xB7","\u2722","\u2731","\u2736","\u273B","\u273D"],gk=[...fk,...[...fk].reverse()]});import{readFile as bk,stat as TX0}from"fs/promises";class uL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function kk($){return E$($).createTurnDetector()}function yk($,Z="claude",X=0){let J=null,z=0;for(let G of $.split(`
284
284
  `)){z++;let W=mk(G);if(!W)continue;let H=MR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=hk(W,X),K={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!J||K.timestampMs>=J.timestampMs)J=K}return J}function wX0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=MR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&EX0.has(Z.type)}function xX0($,Z="codex"){let X=null,J=0;for(let z of $.split(`
285
285
  `)){J++;let G=mk(z);if(!G||!wX0(G))continue;let W=hk(G,0),H={id:`codex:${Z}:${W}:${J}`,timestampMs:W,source:"codex"};if(!X||H.timestampMs>=X.timestampMs)X=H}return X}function mk($){let Z=$.trim();if(!Z)return null;try{let X=JSON.parse(Z);return MR(X)?X:null}catch{return null}}function hk($,Z){let X=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(X)?X:Z}function MR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var vk=($)=>TX0($).then((Z)=>Z.mtimeMs,()=>0),SX0,KR,IX0,FR,vK,EX0;var NR=a(()=>{zR();fL();d7();SX0={listSessionFiles:($)=>bH($),readFile:($)=>bk($,"utf8"),statMtimeMs:vk};KR=class KR extends uL{deps;vendor="claude";cache=new Map;constructor($=SX0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),X=Z[0]?.mtimeMs??0,J=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=yk(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!J||H.timestampMs>J.timestampMs))J=H}return this.cache=z,{marker:J,mtimeMs:X}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??vk)($);if(Z===0)return null;let X=await this.deps.readFile($).catch(()=>"");return{marker:yk(X,$,Z),mtimeMs:Z}}};IX0={findLatestRollout:($)=>XR($),readFile:($)=>bk($,"utf8")};FR=class FR extends uL{deps;vendor="codex";cache=null;constructor($=IX0){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 X=await this.deps.readFile(Z.path).catch(()=>"");if(!X)return{marker:null,mtimeMs:Z.mtimeMs};let J=xX0(X,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:J},{marker:J,mtimeMs:Z.mtimeMs}}};vK=class vK extends uL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};EX0=new Set(["task_complete","turn_complete","turn_aborted"])});function fX0($){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 mK($),createTurnDetector:()=>new vK($)}}function E$($){return v7($)?OR[$]:fX0($)}function uk($){return E$($).history.readHistory!==vL.readHistory}function LR($){let Z=E$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:ck}function kH($,Z){let X=Z?LR(Z):ck;for(let J of[...X].sort((z,G)=>G.length-z.length)){if(!$.startsWith(J))continue;let z=$.slice(J.length).trimStart();if(z.length===0)return $;return z}return $}function cL($,Z){let X=E$($).terminalTitle,J=X?.workingPrefixes;if(X?.ownsStatus!==!0||!J||J.length===0)return null;let z=Z.trim();if(z.length===0)return null;return J.some((G)=>z.startsWith(G))?"working":"rest"}function dk(){return Object.values(OR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var OR,ck;var d7=a(()=>{m7();RX();Tb();gb();hb();db();pb();Hk();xk();jR();hL();NR();OR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:Sk,detectAccount:($)=>IH($),createHookAdapter:()=>new dP,createTurnDetector:()=>new KR,capabilities:Pb,identity:Rb,spinnerFrames:gk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>mb()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:Ik,detectAccount:($)=>EH($),createHookAdapter:()=>new iP,createTurnDetector:()=>new FR,capabilities:ub,identity:cb,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:()=>Wk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:Ek,detectAccount:($)=>wH($),createHookAdapter:()=>new mK("copilot"),createTurnDetector:()=>new vK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],history:wk,detectAccount:($)=>TL($),createHookAdapter:()=>new mK("kimi"),createTurnDetector:()=>new vK("kimi")}};ck=[...new Set(Object.values(OR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function VR($){return E$($).createHookAdapter()}class mK{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 jR=a(()=>{d7()});function dL($){return gX0.includes($)}function lk($){return yX0.includes($)}var gX0,yX0;var _R=a(()=>{gX0=["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"];yX0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Xv={};g$(Xv,{runHookSubcommand:()=>uX0,readTextWithTimeout:()=>ok,parseWorktreeRemovePath:()=>tk,parseWorktreeAddPath:()=>sk,ensureGlobalKobeHooks:()=>DR});import{homedir as bX0}from"os";import{join as ik,resolve as CR}from"path";async function ok($,Z=kX0){let X;try{return await Promise.race([$(),new Promise((J)=>{X=setTimeout(()=>J(""),Z)})])}finally{if(X!==void 0)clearTimeout(X)}}async function ak(){try{let $=await ok(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function pk($,Z){for(let X=0;X<$.length;X++){if($[X]===Z)return $[X+1];if($[X].startsWith(`${Z}=`))return $[X].slice(Z.length+1)}return}function mX0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function rk($){let Z=[],X=/"([^"]*)"|'([^']*)'|(\S+)/g,J;while((J=X.exec($))!==null)Z.push(J[1]??J[2]??J[3]??"");return Z}function sk($){let Z=rk($),X=new Set(["-b","-B","--reason"]);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="add")continue;let z=J+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=X.has(G)?2:1;continue}return G}}return}function tk($){let Z=rk($);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="remove")continue;let J=X+2;while(J<Z.length){let z=Z[J];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){J+=1;continue}return z}}return}async function hX0(){let $=await ak(),Z=mX0($.tool_input)?$.tool_input:{},X=typeof Z.command==="string"?Z.command:"";if(!X.includes("worktree"))return;let J=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=sk(X),G=z?void 0:tk(X);if(!z&&!G)return;let W=await qQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:J,worktreePath:CR(J,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:CR(J,G)})}finally{W.close()}}async function uX0($){let[Z,...X]=$;if(Z==="setup"){await pX0(X);return}if(Z===vX0){try{await hX0()}catch{}return}try{if(!Z||!dL(Z))return;let J=await ak(),z=pk(X,"--task-id"),G=typeof J.cwd==="string"&&J.cwd?J.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=pk(X,"--engine"),K=ek().filter((V)=>!U||V.vendor===U),N;for(let V of K)if(N=V.activityDetailFromPayload(Z,J),N)break;let L;for(let V of K)if(L=V.sessionFromPayload(J),L)break;let M=await qQ();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(J){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,J instanceof Error?J.message:String(J))}}function cX0(){return T8.map(($)=>VR($)).filter(($)=>$.supportsWorktreeSync())}function ek(){return T8.map(($)=>VR($)).filter(($)=>$.supportsHooks())}function $v(){return ik(bX0(),".claude","settings.json")}function dX0($){if(!$||$==="off")return;if($==="global")return $v();if($.startsWith("repo:"))return ik(CR($.slice(5)),".claude","settings.json");return $}async function DR(){try{let $=lX0();for(let Z of ek()){let X=Z.globalSettingsPath();if(!X)continue;await Z.installActivityHooks(X,{toolEvents:$}),await Z.installWorktreeWatchHook(X)}await Zv()}catch{}}function lX0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(JZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Zv(){let $=cX0();if($.length===0)return;let Z=c7(nk),X=new Set([$v()]),J=dX0(Z);if(J)X.add(J);for(let z of $)for(let G of X)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(nk,"off")}async function pX0($){await Zv(),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 kX0=500,vX0="worktree-created",nk="externalWorktreeSync";var AR=a(()=>{C2();OQ();AX();jR();_R();b4();m7()});var lL;var Jv=a(()=>{lL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.92",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:"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:rove":"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.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.13","@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 zv={};g$(zv,{repoSlug:()=>LY,releasePageUrl:()=>ER,recommendedGlobalInstallCommand:()=>TR,isNewerSemver:()=>PR,fetchReleaseSummaries:()=>uK,fetchReleaseNotesRange:()=>IR,fetchReleaseNotes:()=>SR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>hK,UPDATE_SCRIPT_URL:()=>pL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>RR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>SX});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 TR(){return`npm install -g ${RR}@latest`}function hK($,Z,X=SX){let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}async function iX0($){let Z=new AbortController,X=setTimeout(()=>Z.abort(),nL);try{let J=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${J}/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(X)}}function PR($,Z){return B3($,Z)>0}function B3($,Z){let X=(G)=>G.split("-")[0]??G,J=X($).split(".").map((G)=>Number.parseInt(G,10)),z=X(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=J[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:D$,latest:Z,hasUpdate:PR(Z,D$)};if(WH()&&!$.force)return null;let X=await iX0(RR);if(!X)return null;return{current:D$,latest:X,hasUpdate:PR(X,D$)}}function Qv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function SR($){let Z=LY();if(!Z)return null;let X=`v${$}`,J=new AbortController,z=setTimeout(()=>J.abort(),nL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${X}`,{signal:J.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 IR($){let Z=LY();if(!Z)return[];let X=$.limit??100,J=new AbortController,z=setTimeout(()=>J.abort(),nL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${X}`,{signal:J.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=Qv(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 uK($=12){let Z=LY();if(!Z)return[];let X=new AbortController,J=setTimeout(()=>X.abort(),nL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:X.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=Qv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(J)}}function ER($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,RR,pL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,SX,nL=3000;var w8=a(()=>{Jv();L5();D$=lL.version,RR=lL.name;WZ=`curl -fsSL ${pL} | sh`;SX=[]});var Gv={};g$(Gv,{stampResetGate:()=>iL,resetGateBlockers:()=>Yv,enforceResetGate:()=>xR,LAST_RUN_VERSION_KEY:()=>wR});function Yv($,Z=D$,X=SX){if(typeof $!=="string"||$.length===0)return[];let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}function xR(){let $=J$(),Z=_4()[wR],X=Yv(Z);if(X.length>0){let J=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${X.join(", ")} introduced breaking changes`,`(last run: ${J}). 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 kX0=500,vX0="worktree-created",nk="externalWorktreeSync";var AR=a(()=>{C2();OQ();AX();jR();_R();b4();m7()});var lL;var Jv=a(()=>{lL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.93",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:"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:rove":"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.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 zv={};g$(zv,{repoSlug:()=>LY,releasePageUrl:()=>ER,recommendedGlobalInstallCommand:()=>TR,isNewerSemver:()=>PR,fetchReleaseSummaries:()=>uK,fetchReleaseNotesRange:()=>IR,fetchReleaseNotes:()=>SR,compareSemver:()=>B3,checkLatestVersion:()=>jY,breakingVersionsCrossed:()=>hK,UPDATE_SCRIPT_URL:()=>pL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>RR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>SX});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 TR(){return`npm install -g ${RR}@latest`}function hK($,Z,X=SX){let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}async function iX0($){let Z=new AbortController,X=setTimeout(()=>Z.abort(),nL);try{let J=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${J}/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(X)}}function PR($,Z){return B3($,Z)>0}function B3($,Z){let X=(G)=>G.split("-")[0]??G,J=X($).split(".").map((G)=>Number.parseInt(G,10)),z=X(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=J[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:D$,latest:Z,hasUpdate:PR(Z,D$)};if(WH()&&!$.force)return null;let X=await iX0(RR);if(!X)return null;return{current:D$,latest:X,hasUpdate:PR(X,D$)}}function Qv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function SR($){let Z=LY();if(!Z)return null;let X=`v${$}`,J=new AbortController,z=setTimeout(()=>J.abort(),nL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${X}`,{signal:J.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 IR($){let Z=LY();if(!Z)return[];let X=$.limit??100,J=new AbortController,z=setTimeout(()=>J.abort(),nL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${X}`,{signal:J.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=Qv(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 uK($=12){let Z=LY();if(!Z)return[];let X=new AbortController,J=setTimeout(()=>X.abort(),nL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:X.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=Qv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(J)}}function ER($){let Z=LY();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,RR,pL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,SX,nL=3000;var w8=a(()=>{Jv();L5();D$=lL.version,RR=lL.name;WZ=`curl -fsSL ${pL} | sh`;SX=[]});var Gv={};g$(Gv,{stampResetGate:()=>iL,resetGateBlockers:()=>Yv,enforceResetGate:()=>xR,LAST_RUN_VERSION_KEY:()=>wR});function Yv($,Z=D$,X=SX){if(typeof $!=="string"||$.length===0)return[];let[J,z]=B3($,Z)<=0?[$,Z]:[Z,$];return X.filter((G)=>B3(G,J)>0&&B3(G,z)<=0)}function xR(){let $=J$(),Z=_4()[wR],X=Yv(Z);if(X.length>0){let J=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${X.join(", ")} introduced breaking changes`,`(last run: ${J}). 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!==D$)iL()}function iL(){try{n2({[wR]:D$})}catch{}}var wR="app.lastRunVersion";var oL=a(()=>{D2();w8();h4()});import{existsSync as Hv,readFileSync as oX0}from"fs";import{homedir as aX0}from"os";import{join as qv,resolve as Wv}from"path";import{fileURLToPath as rX0}from"url";function yR($=process.env){return`${J$($)} skill install`}function aL(){let $=rX0(import.meta.url);return[Wv($,"../../../../../.agents/skills/kobe"),Wv($,"../../skills/rove")].find((X)=>Hv(qv(X,"SKILL.md")))??null}function rL($={}){let Z=$.source!==void 0?$.source:aL(),X=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??tX0,"--skill",p3,...$.global===!1?[]:["--global"],...X.flatMap((J)=>["--agent",J])]}function VY($={}){return`npx ${rL($).join(" ")}`}async function bR($,Z){return await Bun.spawn(["npx",...rL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function sL($={}){let Z=$.home??aX0(),X=$.cwd??process.cwd();return[Z,X].flatMap((J)=>sX0.map((z)=>qv(J,z)))}function eX0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function cK($){let Z=sL($).find((z)=>Hv(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:fR,stale:!1};let X=null;try{X=eX0(oX0(Z,"utf8"))}catch{X=null}let J=X===null||X<fR;return{installed:!0,installedVersion:X,currentVersion:fR,stale:J}}function $J0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Uv($={}){let Z=J$(),X=yR(),J=cK();if(!J.installed){if(c7(gR)==="1")return;o3(gR,"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
  ${X}
@@ -297,7 +297,7 @@ ${Z}: your Rove agent skill is out of date (${G}; this Rove wants v${J.currentVe
297
297
  ${Z}: a new version of the Rove agent skill is available (${G} \u2192 v${J.currentVersion}).
298
298
  Update now? [y]es / [n]o / [d]on't notify for this version: `);let H=(await($.ask??$J0)()).trim().toLowerCase();if(H==="y"||H==="yes"){let U=await($.install??bR)();if(U===0)process.stderr.write(`${Z}: skill updated.
299
299
  `);else process.stderr.write(`${Z}: skill update failed (exit ${U}) \u2014 run \`${X}\` manually.
300
- `)}else if(H.startsWith("d"))o3(z,"1")}var fR=22,sX0,tX0="Sma1lboy/kobe",gR="skillHintSeen";var dK=a(()=>{h4();zQ();b4();sX0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var tL=()=>{};var q1=JY((ZJ0,eL)=>{(function(){function $(Z0,S0){Object.defineProperty(J.prototype,Z0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(Z0){if(Z0===null||typeof Z0!=="object")return null;return Z0=P0&&Z0[P0]||Z0["@@iterator"],typeof Z0==="function"?Z0:null}function X(Z0,S0){Z0=(Z0=Z0.constructor)&&(Z0.displayName||Z0.name)||"ReactClass";var e0=Z0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,Z0),u0[e0]=!0)}function J(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function z(){}function G(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function W(){}function H(Z0){return""+Z0}function U(Z0){try{H(Z0);var S0=!1}catch(l1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&Z0[Symbol.toStringTag]||Z0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(Z0)}}function K(Z0){if(Z0==null)return null;if(typeof Z0==="function")return Z0.$$typeof===c0?null:Z0.displayName||Z0.name||null;if(typeof Z0==="string")return Z0;switch(Z0){case l:return"Fragment";case n:return"Profiler";case d:return"StrictMode";case X0:return"Suspense";case C0:return"SuspenseList";case v0:return"Activity"}if(typeof Z0==="object")switch(typeof Z0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),Z0.$$typeof){case k:return"Portal";case s:return Z0.displayName||"Context";case G0:return(Z0._context.displayName||"Context")+".Consumer";case r:var S0=Z0.render;return Z0=Z0.displayName,Z0||(Z0=S0.displayName||S0.name||"",Z0=Z0!==""?"ForwardRef("+Z0+")":"ForwardRef"),Z0;case Q0:return S0=Z0.displayName||null,S0!==null?S0:K(Z0.type)||"Memo";case w0:S0=Z0._payload,Z0=Z0._init;try{return K(Z0(S0))}catch(e0){}}return null}function N(Z0){if(Z0===l)return"<>";if(typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0)return"<...>";try{var S0=K(Z0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function L(){var Z0=X1.A;return Z0===null?null:Z0.getOwner()}function M(){return Error("react-stack-top-frame")}function V(Z0){if(u1.call(Z0,"key")){var S0=Object.getOwnPropertyDescriptor(Z0,"key").get;if(S0&&S0.isReactWarning)return!1}return Z0.key!==void 0}function P(Z0,S0){function e0(){q$||(q$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty(Z0,"key",{get:e0,configurable:!0})}function _(){var Z0=K(this.type);return n5[Z0]||(n5[Z0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),Z0=this.props.ref,Z0!==void 0?Z0:null}function C(Z0,S0,e0,U1,l1,w$){var _$=e0.ref;return Z0={$$typeof:H0,type:Z0,key:S0,props:e0,_owner:U1},(_$!==void 0?_$:null)!==null?Object.defineProperty(Z0,"ref",{enumerable:!1,get:_}):Object.defineProperty(Z0,"ref",{enumerable:!1,value:null}),Z0._store={},Object.defineProperty(Z0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(Z0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(Z0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:l1}),Object.defineProperty(Z0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:w$}),Object.freeze&&(Object.freeze(Z0.props),Object.freeze(Z0)),Z0}function f(Z0,S0){return S0=C(Z0.type,S0,Z0.props,Z0._owner,Z0._debugStack,Z0._debugTask),Z0._store&&(S0._store.validated=Z0._store.validated),S0}function E(Z0){S(Z0)?Z0._store&&(Z0._store.validated=1):typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0&&(Z0._payload.status==="fulfilled"?S(Z0._payload.value)&&Z0._payload.value._store&&(Z0._payload.value._store.validated=1):Z0._store&&(Z0._store.validated=1))}function S(Z0){return typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===H0}function T(Z0){var S0={"=":"=0",":":"=2"};return"$"+Z0.replace(/[=:]/g,function(e0){return S0[e0]})}function x(Z0,S0){return typeof Z0==="object"&&Z0!==null&&Z0.key!=null?(U(Z0.key),T(""+Z0.key)):S0.toString(36)}function b(Z0){switch(Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason;default:switch(typeof Z0.status==="string"?Z0.then(W,W):(Z0.status="pending",Z0.then(function(S0){Z0.status==="pending"&&(Z0.status="fulfilled",Z0.value=S0)},function(S0){Z0.status==="pending"&&(Z0.status="rejected",Z0.reason=S0)})),Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason}}throw Z0}function v(Z0,S0,e0,U1,l1){var w$=typeof Z0;if(w$==="undefined"||w$==="boolean")Z0=null;var _$=!1;if(Z0===null)_$=!0;else switch(w$){case"bigint":case"string":case"number":_$=!0;break;case"object":switch(Z0.$$typeof){case H0:case k:_$=!0;break;case w0:return _$=Z0._init,v(_$(Z0._payload),S0,e0,U1,l1)}}if(_$){_$=Z0,l1=l1(_$);var K4=U1===""?"."+x(_$,0):U1;return N0(l1)?(e0="",K4!=null&&(e0=K4.replace(WJ,"$&/")+"/"),v(l1,S0,e0,"",function(P7){return P7})):l1!=null&&(S(l1)&&(l1.key!=null&&(_$&&_$.key===l1.key||U(l1.key)),e0=f(l1,e0+(l1.key==null||_$&&_$.key===l1.key?"":(""+l1.key).replace(WJ,"$&/")+"/")+K4),U1!==""&&_$!=null&&S(_$)&&_$.key==null&&_$._store&&!_$._store.validated&&(e0._store.validated=2),l1=e0),S0.push(l1)),1}if(_$=0,K4=U1===""?".":U1+":",N0(Z0))for(var y$=0;y$<Z0.length;y$++)U1=Z0[y$],w$=K4+x(U1,y$),_$+=v(U1,S0,e0,w$,l1);else if(y$=Z(Z0),typeof y$==="function")for(y$===Z0.entries&&(c8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),c8=!0),Z0=y$.call(Z0),y$=0;!(U1=Z0.next()).done;)U1=U1.value,w$=K4+x(U1,y$++),_$+=v(U1,S0,e0,w$,l1);else if(w$==="object"){if(typeof Z0.then==="function")return v(b(Z0),S0,e0,U1,l1);throw S0=String(Z0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(Z0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return _$}function u(Z0,S0,e0){if(Z0==null)return Z0;var U1=[],l1=0;return v(Z0,U1,"","",function(w$){return S0.call(e0,w$,l1++)}),U1}function o(Z0){if(Z0._status===-1){var S0=Z0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=Z0._result;var e0=S0();if(e0.then(function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=1,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=l1)}},function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=2,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=l1)}}),S0=Z0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}Z0._status===-1&&(Z0._status=0,Z0._result=e0)}if(Z0._status===1)return S0=Z0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
300
+ `)}else if(H.startsWith("d"))o3(z,"1")}var fR=22,sX0,tX0="Sma1lboy/rove",gR="skillHintSeen";var dK=a(()=>{h4();zQ();b4();sX0=[".agents/skills/rove/SKILL.md",".claude/skills/rove/SKILL.md",".agents/skills/kobe/SKILL.md",".claude/skills/kobe/SKILL.md"]});var tL=()=>{};var q1=JY((ZJ0,eL)=>{(function(){function $(Z0,S0){Object.defineProperty(J.prototype,Z0,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",S0[0],S0[1])}})}function Z(Z0){if(Z0===null||typeof Z0!=="object")return null;return Z0=P0&&Z0[P0]||Z0["@@iterator"],typeof Z0==="function"?Z0:null}function X(Z0,S0){Z0=(Z0=Z0.constructor)&&(Z0.displayName||Z0.name)||"ReactClass";var e0=Z0+"."+S0;u0[e0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",S0,Z0),u0[e0]=!0)}function J(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function z(){}function G(Z0,S0,e0){this.props=Z0,this.context=S0,this.refs=G1,this.updater=e0||L0}function W(){}function H(Z0){return""+Z0}function U(Z0){try{H(Z0);var S0=!1}catch(l1){S0=!0}if(S0){S0=console;var e0=S0.error,U1=typeof Symbol==="function"&&Symbol.toStringTag&&Z0[Symbol.toStringTag]||Z0.constructor.name||"Object";return e0.call(S0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",U1),H(Z0)}}function K(Z0){if(Z0==null)return null;if(typeof Z0==="function")return Z0.$$typeof===c0?null:Z0.displayName||Z0.name||null;if(typeof Z0==="string")return Z0;switch(Z0){case l:return"Fragment";case n:return"Profiler";case d:return"StrictMode";case X0:return"Suspense";case C0:return"SuspenseList";case v0:return"Activity"}if(typeof Z0==="object")switch(typeof Z0.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),Z0.$$typeof){case k:return"Portal";case s:return Z0.displayName||"Context";case G0:return(Z0._context.displayName||"Context")+".Consumer";case r:var S0=Z0.render;return Z0=Z0.displayName,Z0||(Z0=S0.displayName||S0.name||"",Z0=Z0!==""?"ForwardRef("+Z0+")":"ForwardRef"),Z0;case Q0:return S0=Z0.displayName||null,S0!==null?S0:K(Z0.type)||"Memo";case w0:S0=Z0._payload,Z0=Z0._init;try{return K(Z0(S0))}catch(e0){}}return null}function N(Z0){if(Z0===l)return"<>";if(typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0)return"<...>";try{var S0=K(Z0);return S0?"<"+S0+">":"<...>"}catch(e0){return"<...>"}}function L(){var Z0=X1.A;return Z0===null?null:Z0.getOwner()}function M(){return Error("react-stack-top-frame")}function V(Z0){if(u1.call(Z0,"key")){var S0=Object.getOwnPropertyDescriptor(Z0,"key").get;if(S0&&S0.isReactWarning)return!1}return Z0.key!==void 0}function P(Z0,S0){function e0(){q$||(q$=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",S0))}e0.isReactWarning=!0,Object.defineProperty(Z0,"key",{get:e0,configurable:!0})}function _(){var Z0=K(this.type);return n5[Z0]||(n5[Z0]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),Z0=this.props.ref,Z0!==void 0?Z0:null}function C(Z0,S0,e0,U1,l1,w$){var _$=e0.ref;return Z0={$$typeof:H0,type:Z0,key:S0,props:e0,_owner:U1},(_$!==void 0?_$:null)!==null?Object.defineProperty(Z0,"ref",{enumerable:!1,get:_}):Object.defineProperty(Z0,"ref",{enumerable:!1,value:null}),Z0._store={},Object.defineProperty(Z0._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(Z0,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(Z0,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:l1}),Object.defineProperty(Z0,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:w$}),Object.freeze&&(Object.freeze(Z0.props),Object.freeze(Z0)),Z0}function f(Z0,S0){return S0=C(Z0.type,S0,Z0.props,Z0._owner,Z0._debugStack,Z0._debugTask),Z0._store&&(S0._store.validated=Z0._store.validated),S0}function E(Z0){S(Z0)?Z0._store&&(Z0._store.validated=1):typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===w0&&(Z0._payload.status==="fulfilled"?S(Z0._payload.value)&&Z0._payload.value._store&&(Z0._payload.value._store.validated=1):Z0._store&&(Z0._store.validated=1))}function S(Z0){return typeof Z0==="object"&&Z0!==null&&Z0.$$typeof===H0}function T(Z0){var S0={"=":"=0",":":"=2"};return"$"+Z0.replace(/[=:]/g,function(e0){return S0[e0]})}function x(Z0,S0){return typeof Z0==="object"&&Z0!==null&&Z0.key!=null?(U(Z0.key),T(""+Z0.key)):S0.toString(36)}function b(Z0){switch(Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason;default:switch(typeof Z0.status==="string"?Z0.then(W,W):(Z0.status="pending",Z0.then(function(S0){Z0.status==="pending"&&(Z0.status="fulfilled",Z0.value=S0)},function(S0){Z0.status==="pending"&&(Z0.status="rejected",Z0.reason=S0)})),Z0.status){case"fulfilled":return Z0.value;case"rejected":throw Z0.reason}}throw Z0}function v(Z0,S0,e0,U1,l1){var w$=typeof Z0;if(w$==="undefined"||w$==="boolean")Z0=null;var _$=!1;if(Z0===null)_$=!0;else switch(w$){case"bigint":case"string":case"number":_$=!0;break;case"object":switch(Z0.$$typeof){case H0:case k:_$=!0;break;case w0:return _$=Z0._init,v(_$(Z0._payload),S0,e0,U1,l1)}}if(_$){_$=Z0,l1=l1(_$);var K4=U1===""?"."+x(_$,0):U1;return N0(l1)?(e0="",K4!=null&&(e0=K4.replace(WJ,"$&/")+"/"),v(l1,S0,e0,"",function(P7){return P7})):l1!=null&&(S(l1)&&(l1.key!=null&&(_$&&_$.key===l1.key||U(l1.key)),e0=f(l1,e0+(l1.key==null||_$&&_$.key===l1.key?"":(""+l1.key).replace(WJ,"$&/")+"/")+K4),U1!==""&&_$!=null&&S(_$)&&_$.key==null&&_$._store&&!_$._store.validated&&(e0._store.validated=2),l1=e0),S0.push(l1)),1}if(_$=0,K4=U1===""?".":U1+":",N0(Z0))for(var y$=0;y$<Z0.length;y$++)U1=Z0[y$],w$=K4+x(U1,y$),_$+=v(U1,S0,e0,w$,l1);else if(y$=Z(Z0),typeof y$==="function")for(y$===Z0.entries&&(c8||console.warn("Using Maps as children is not supported. Use an array of keyed ReactElements instead."),c8=!0),Z0=y$.call(Z0),y$=0;!(U1=Z0.next()).done;)U1=U1.value,w$=K4+x(U1,y$++),_$+=v(U1,S0,e0,w$,l1);else if(w$==="object"){if(typeof Z0.then==="function")return v(b(Z0),S0,e0,U1,l1);throw S0=String(Z0),Error("Objects are not valid as a React child (found: "+(S0==="[object Object]"?"object with keys {"+Object.keys(Z0).join(", ")+"}":S0)+"). If you meant to render a collection of children, use an array instead.")}return _$}function u(Z0,S0,e0){if(Z0==null)return Z0;var U1=[],l1=0;return v(Z0,U1,"","",function(w$){return S0.call(e0,w$,l1++)}),U1}function o(Z0){if(Z0._status===-1){var S0=Z0._ioInfo;S0!=null&&(S0.start=S0.end=performance.now()),S0=Z0._result;var e0=S0();if(e0.then(function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=1,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="fulfilled",e0.value=l1)}},function(l1){if(Z0._status===0||Z0._status===-1){Z0._status=2,Z0._result=l1;var w$=Z0._ioInfo;w$!=null&&(w$.end=performance.now()),e0.status===void 0&&(e0.status="rejected",e0.reason=l1)}}),S0=Z0._ioInfo,S0!=null){S0.value=e0;var U1=e0.displayName;typeof U1==="string"&&(S0.name=U1)}Z0._status===-1&&(Z0._status=0,Z0._result=e0)}if(Z0._status===1)return S0=Z0._result,S0===void 0&&console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s
301
301
 
302
302
  Your code should look like:
303
303
  const MyComponent = lazy(() => import('./MyComponent'))
@@ -844,7 +844,7 @@ install one with: ${H6} update <version>
844
844
  `)}async function gF0($){if(/^https?:\/\//i.test($)){let G;try{G=await fetch($)}catch(N){JJ(`failed to fetch ${$}: ${N1(N)}`)}if(!G.ok)JJ(`failed to fetch ${$}: HTTP ${G.status} ${G.statusText}`);let W=await G.text(),H=$.split(/[?#]/)[0]??$,U=m10(H)||"theme.json",K=U.endsWith(".json")?U.slice(0,-5):U;return{text:W,defaultName:K}}let Z=xF0(process.cwd(),_2($)),X;try{X=SF0(Z,"utf8")}catch(G){JJ(`failed to read ${Z}: ${N1(G)}`)}let J=m10(Z),z=J.endsWith(".json")?J.slice(0,-5):J;return{text:X,defaultName:z}}function yF0($){let Z=null,X,J=!1;for(let z=0;z<$.length;z+=1){let G=$[z];if(G==="--force"||G==="-f"){J=!0;continue}if(G==="--name"||G==="-n"){let W=$[z+1];if(W===void 0)eQ("--name requires a value");X=W,z+=1;continue}if(G.startsWith("--name=")){X=G.slice(7);continue}if(G.startsWith("--"))eQ(`unknown flag: ${G}`);if(Z===null){Z=G;continue}eQ(`unexpected positional argument: ${G}`)}if(Z===null)eQ("missing <source> (URL or path to theme JSON)");return{source:Z,opts:{name:X,force:J}}}async function bF0($){let{source:Z,opts:X}=yF0($),{text:J,defaultName:z}=await gF0(Z),G;try{G=JSON.parse(J)}catch(N){JJ(`source is not valid JSON: ${N1(N)}`)}let W=LV(G);if(!W.ok)JJ(`source is not a valid Rove theme: ${W.reason}`);let H=X.name??z;if(!H||!/^[a-zA-Z0-9._-]+$/.test(H))JJ(`invalid theme name "${H}" (use letters, digits, '.', '_', '-')`);let U=Bq();TF0(U,{recursive:!0});let K=Aw(U,`${H}.json`);if(h10(K)&&!X.force)JJ(`${K} already exists (pass --force to overwrite)`);wF0(K,`${JSON.stringify(W.theme,null,2)}
845
845
  `,"utf8"),process.stdout.write(`installed theme "${H}" -> ${K}
846
846
  `)}function kF0($){let Z=$[0];if(!Z)eQ("missing <name>");if($.length>1)eQ(`unexpected extra arguments after "${Z}"`);if(Dw.includes(Z))JJ(`"${Z}" is a built-in theme and cannot be removed`);let X=Aw(Bq(),`${Z}.json`);if(!h10(X))JJ(`no user theme named "${Z}" (looked for ${X})`);EF0(X),process.stdout.write(`removed theme "${Z}" (${X})
847
- `)}function u10($=process.stderr){$.write([`Usage: ${Pw} theme <command> [args]`,"","Commands:"," list List bundled and user-installed themes"," add <source> [--name <name>] Install a theme from a URL or local path"," Pass --force to overwrite an existing user theme"," remove <name> Remove a user-installed theme","",`User themes live under: ${Bq()}`,"Schema: https://raw.githubusercontent.com/sma1lboy/kobe/main/packages/kobe/src/tui/context/theme/theme.schema.json",""].join(`
847
+ `)}function u10($=process.stderr){$.write([`Usage: ${Pw} theme <command> [args]`,"","Commands:"," list List bundled and user-installed themes"," add <source> [--name <name>] Install a theme from a URL or local path"," Pass --force to overwrite an existing user theme"," remove <name> Remove a user-installed theme","",`User themes live under: ${Bq()}`,"Schema: https://raw.githubusercontent.com/sma1lboy/rove/main/packages/kobe/src/tui/context/theme/theme.schema.json",""].join(`
848
848
  `))}async function vF0($){let[Z,...X]=$;if(!Z||Z==="--help"||Z==="-h"||Z==="help"){if(u10(Z?process.stdout:process.stderr),!Z)process.exit(2);return}if(Z==="list"||Z==="ls"){if(X.length>0)eQ(`"${Z}" takes no arguments`);fF0();return}if(Z==="add"){await bF0(X);return}if(Z==="remove"||Z==="rm"){kF0(X);return}eQ(`unknown action "${Z}" (try "list", "add", or "remove")`)}var Pw,Dw;var d10=a(()=>{HH();XI();$I();h4();Pw=J$(),Dw=["claude","conductor","tokyonight"]});var o10={};g$(o10,{runFeedbackSubcommand:()=>hF0,parseFeedbackArgs:()=>i10});import{readFileSync as l10}from"fs";function $z($){process.stderr.write(`${p10} feedback: ${$}
849
849
 
850
850
  ${n10}
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.92",
4
+ "version": "0.8.93",
5
5
  "description": "Rove — the terminal-native agent multiplexer",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "devDependencies": {
73
73
  "@biomejs/biome": "1.9.4",
74
- "@sma1lboy/kobe-daemon": "0.7.13",
74
+ "@sma1lboy/kobe-daemon": "0.7.14",
75
75
  "@tsconfig/bun": "1.0.10",
76
76
  "@types/bun": "1.3.14",
77
77
  "@types/node": "25.6.2",