@sma1lboy/kobe 0.8.105 → 0.8.106

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -288,7 +288,7 @@ trust_level = "trusted"
288
288
  `)){if(!J.trim())continue;try{let{sessionId:X,sessionDir:z,workDir:G}=JSON.parse(J);if(X&&z&&G)Z.push({sessionId:X,sessionDir:z,workDir:G})}catch{}}return Z}async function ck($){let Z=await $.readFile(hL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return qX0(Z)}function dk($){return hL.join($,"agents","main","wire.jsonl")}async function _R($,Z=VR){if(!$)return[];let J=[];for(let X of await ck(Z)){if(X.workDir!==$)continue;let z=await Z.stat(dk(X.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;J.push({id:X.sessionId,mtimeMs:z})}return J.sort((X,z)=>X.mtimeMs-z.mtimeMs).map((X)=>X.id)}async function lk($,Z=VR){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function CR($,Z=VR){if(!$)return null;let J=(await ck(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=dk(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var VR;var pk=a(()=>{AQ();VR={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||hL.join(HX0(),".kimi-code")},async readFile($){return await DQ($)},stat:WX0}});import BX0 from"path";var uL,nk,ik,ok,ak;var rk=a(()=>{MR();bL();uk();pk();uL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},nk={async listSessionIdsForWorktree($){return[...await hH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>yk($),async transcriptPath($,Z){return(await hH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>gk($)},ik={listSessionIdsForWorktree:($)=>Lk($),readHistory:($)=>Vk($),transcriptPath:async($)=>await UR($)??null,latestTranscriptMtimeForWorktree:($)=>jk($)},ok={listSessionIdsForWorktree:($)=>vk($),readHistory:($)=>hk($),async transcriptPath($){let Z=await LR($);return Z?BX0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>mk($)},ak={listSessionIdsForWorktree:($)=>_R($),readHistory:uL.readHistory,transcriptPath:($)=>CR($),async latestTranscriptMtimeForWorktree($){let J=(await _R($)).at(-1);if(!J)return 0;let X=await CR(J);return X?await lk(X):0}}});import{createHash as KX0}from"crypto";import{existsSync as FX0,mkdirSync as MX0,writeFileSync as NX0}from"fs";import{homedir as sk}from"os";import DR from"path";function OX0($,Z=sk()){let J=KX0("sha256").update($).digest("hex").slice(0,12);return DR.join(Z,".kimi-code","workspace-trust",`wd_${DR.basename($)}_${J}`)}function tk($,Z=sk()){let J=OX0($,Z);if(FX0(J))return;MX0(DR.dirname(J),{recursive:!0,mode:448}),NX0(J,JSON.stringify({root:$,trustedAt:Date.now()}),{mode:384})}var ek=()=>{};import{readFile as Zv,stat as LX0}from"fs/promises";class cL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function Jv($){return E$($).createTurnDetector()}function $v($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
289
289
  `)){z++;let W=Qv(G);if(!W)continue;let H=RR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=zv(W,J),B={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||B.timestampMs>=X.timestampMs)X=B}return X}function CX0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=RR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&_X0.has(Z.type)}function DX0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
290
290
  `)){X++;let G=Qv(z);if(!G||!CX0(G))continue;let W=zv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function Qv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return RR(J)?J:null}catch{return null}}function zv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function RR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var Xv=($)=>LX0($).then((Z)=>Z.mtimeMs,()=>0),jX0,AR,VX0,PR,uK,_X0;var TR=a(()=>{MR();bL();A2();jX0={listSessionFiles:($)=>hH($),readFile:($)=>Zv($,"utf8"),statMtimeMs:Xv};AR=class AR extends cL{deps;vendor="claude";cache=new Map;constructor($=jX0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=$v(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??Xv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:$v(J,$,Z),mtimeMs:Z}}};VX0={findLatestRollout:($)=>BR($),readFile:($)=>Zv($,"utf8")};PR=class PR extends cL{deps;vendor="codex";cache=null;constructor($=VX0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=DX0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};uK=class uK extends cL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};_X0=new Set(["task_complete","turn_complete","turn_aborted"])});function AX0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:uL,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new cK($),createTurnDetector:()=>new uK($)}}function E$($){return u2($)?SR[$]:AX0($)}function Yv($){return E$($).history.readHistory!==uL.readHistory}function IR($){let Z=E$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:Gv}function SQ($,Z){let J=Z?IR(Z):Gv;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function dL($,Z){let J=E$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function Wv(){return Object.values(SR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var SR,Gv;var A2=a(()=>{c2();IJ();hb();ib();eb();Zk();Qk();Yk();Ak();Tk();rk();ER();ek();TR();SR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:nk,detectAccount:($)=>fH($),createHookAdapter:()=>new eP,createTurnDetector:()=>new AR,capabilities:vb,identity:mb,trustWorktree:$k,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>tb()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:ik,detectAccount:($)=>gH($),createHookAdapter:()=>new XR,createTurnDetector:()=>new PR,capabilities:Jk,identity:Xk,trustWorktree:Rk,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:()=>Dk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:ok,detectAccount:($)=>yH($),createHookAdapter:()=>new cK("copilot"),createTurnDetector:()=>new uK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:tk,history:ak,detectAccount:($)=>EL($),createHookAdapter:()=>new cK("kimi"),createTurnDetector:()=>new uK("kimi")}};Gv=[...new Set(Object.values(SR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function wR($){return E$($).createHookAdapter()}class cK{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 ER=a(()=>{A2()});function lL($){return PX0.includes($)}function Hv($){return RX0.includes($)}var PX0,RX0;var xR=a(()=>{PX0=["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"];RX0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var _v={};g$(_v,{runHookSubcommand:()=>xX0,readTextWithTimeout:()=>Kv,parseWorktreeRemovePath:()=>Ov,parseWorktreeAddPath:()=>Nv,ensureGlobalKobeHooks:()=>gR});import{homedir as TX0}from"os";import{join as Bv,resolve as fR}from"path";async function Kv($,Z=SX0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function Fv(){try{let $=await Kv(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function qv($,Z){for(let J=0;J<$.length;J++){if($[J]===Z)return $[J+1];if($[J].startsWith(`${Z}=`))return $[J].slice(Z.length+1)}return}function EX0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function Mv($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function Nv($){let Z=Mv($),J=new Set(["-b","-B","--reason"]);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="add")continue;let z=X+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=J.has(G)?2:1;continue}return G}}return}function Ov($){let Z=Mv($);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="remove")continue;let X=J+2;while(X<Z.length){let z=Z[X];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){X+=1;continue}return z}}return}async function wX0(){let $=await Fv(),Z=EX0($.tool_input)?$.tool_input:{},J=typeof Z.command==="string"?Z.command:"";if(!J.includes("worktree"))return;let X=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=Nv(J),G=z?void 0:Ov(J);if(!z&&!G)return;let W=await BQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:fR(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:fR(X,G)})}finally{W.close()}}async function xX0($){let[Z,...J]=$;if(Z==="setup"){await bX0(J);return}if(Z===IX0){try{await wX0()}catch{}return}try{if(!Z||!lL(Z))return;let X=await Fv(),z=qv(J,"--task-id"),G=typeof X.cwd==="string"&&X.cwd?X.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=qv(J,"--engine"),B=Lv().filter((V)=>!U||V.vendor===U),N;for(let V of B)if(N=V.activityDetailFromPayload(Z,X),N)break;let L;for(let V of B)if(L=V.sessionFromPayload(X),L)break;let M=await BQ();if(!M)return;try{let V=z??W;await M.request("engine.reportEvent",{...V?{taskId:V}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...N?{detail:N}:{},...L?{sessionId:L.sessionId}:{},...L?.transcriptPath?{transcriptPath:L.transcriptPath}:{}})}finally{M.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function fX0(){return T8.map(($)=>wR($)).filter(($)=>$.supportsWorktreeSync())}function Lv(){return T8.map(($)=>wR($)).filter(($)=>$.supportsHooks())}function jv(){return Bv(TX0(),".claude","settings.json")}function gX0($){if(!$||$==="off")return;if($==="global")return jv();if($.startsWith("repo:"))return Bv(fR($.slice(5)),".claude","settings.json");return $}async function gR(){try{let $=yX0();for(let Z of Lv()){let J=Z.globalSettingsPath();if(!J)continue;await Z.installActivityHooks(J,{toolEvents:$}),await Z.installWorktreeWatchHook(J)}await Vv()}catch{}}function yX0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(XZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Vv(){let $=fX0();if($.length===0)return;let Z=d2(Uv),J=new Set([jv()]),X=gX0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(Uv,"off")}async function bX0($){await Vv(),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(`
291
- `))}var SX0=500,IX0="worktree-created",Uv="externalWorktreeSync";var yR=a(()=>{D7();jQ();TJ();ER();xR();b4();c2()});var pL;var Cv=a(()=>{pL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.105",description:"Rove \u2014 the terminal-native agent multiplexer",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.14","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var Av={};g$(Av,{repoSlug:()=>_Y,releasePageUrl:()=>uR,recommendedGlobalInstallCommand:()=>vR,isNewerSemver:()=>bR,fetchReleaseSummaries:()=>lK,fetchReleaseNotesRange:()=>hR,fetchReleaseNotes:()=>mR,compareSemver:()=>K3,checkLatestVersion:()=>CY,breakingVersionsCrossed:()=>dK,UPDATE_SCRIPT_URL:()=>nL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>kR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>wJ});function _Y(){let $=pL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function vR(){return`npm install -g ${kR}@latest`}function dK($,Z,J=wJ){let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}async function vX0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),iL);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function bR($,Z){return K3($,Z)>0}function K3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function CY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:D$,latest:Z,hasUpdate:bR(Z,D$)};if(BH()&&!$.force)return null;let J=await vX0(kR);if(!J)return null;return{current:D$,latest:J,hasUpdate:bR(J,D$)}}function Dv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function mR($){let Z=_Y();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),iL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function hR($){let Z=_Y();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),iL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Dv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(K3(U,$.current)<=0)return null;if(K3(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 lK($=12){let Z=_Y();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),iL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Dv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function uR($){let Z=_Y();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,kR,nL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,wJ,iL=3000;var x8=a(()=>{Cv();L5();D$=pL.version,kR=pL.name;WZ=`curl -fsSL ${nL} | sh`;wJ=[]});var Rv={};g$(Rv,{stampResetGate:()=>oL,resetGateBlockers:()=>Pv,enforceResetGate:()=>dR,LAST_RUN_VERSION_KEY:()=>cR});function Pv($,Z=D$,J=wJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}function dR(){let $=Q$(),Z=M4()[cR],J=Pv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
291
+ `))}var SX0=500,IX0="worktree-created",Uv="externalWorktreeSync";var yR=a(()=>{D7();jQ();TJ();ER();xR();b4();c2()});var pL;var Cv=a(()=>{pL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.106",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.14","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var Av={};g$(Av,{repoSlug:()=>_Y,releasePageUrl:()=>uR,recommendedGlobalInstallCommand:()=>vR,isNewerSemver:()=>bR,fetchReleaseSummaries:()=>lK,fetchReleaseNotesRange:()=>hR,fetchReleaseNotes:()=>mR,compareSemver:()=>K3,checkLatestVersion:()=>CY,breakingVersionsCrossed:()=>dK,UPDATE_SCRIPT_URL:()=>nL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>kR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>wJ});function _Y(){let $=pL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function vR(){return`npm install -g ${kR}@latest`}function dK($,Z,J=wJ){let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}async function vX0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),iL);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function bR($,Z){return K3($,Z)>0}function K3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function CY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:D$,latest:Z,hasUpdate:bR(Z,D$)};if(BH()&&!$.force)return null;let J=await vX0(kR);if(!J)return null;return{current:D$,latest:J,hasUpdate:bR(J,D$)}}function Dv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function mR($){let Z=_Y();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),iL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function hR($){let Z=_Y();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),iL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Dv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(K3(U,$.current)<=0)return null;if(K3(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 lK($=12){let Z=_Y();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),iL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Dv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function uR($){let Z=_Y();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,kR,nL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,wJ,iL=3000;var x8=a(()=>{Cv();L5();D$=pL.version,kR=pL.name;WZ=`curl -fsSL ${nL} | sh`;wJ=[]});var Rv={};g$(Rv,{stampResetGate:()=>oL,resetGateBlockers:()=>Pv,enforceResetGate:()=>dR,LAST_RUN_VERSION_KEY:()=>cR});function Pv($,Z=D$,J=wJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}function dR(){let $=Q$(),Z=M4()[cR],J=Pv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
292
292
  `)),process.exit(1)}if(Z!==D$)oL()}function oL(){try{A7({[cR]:D$})}catch{}}var cR="app.lastRunVersion";var aL=a(()=>{P7();x8();o4()});import{existsSync as Sv,readFileSync as mX0}from"fs";import{homedir as hX0}from"os";import{join as Iv,resolve as Tv}from"path";import{fileURLToPath as uX0}from"url";function nR($=process.env){return`${Q$($)} skill install`}function rL(){let $=uX0(import.meta.url);return[Tv($,"../../../../../.agents/skills/kobe"),Tv($,"../../skills/rove")].find((J)=>Sv(Iv(J,"SKILL.md")))??null}function sL($={}){let Z=$.source!==void 0?$.source:rL(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??dX0,"--skill",p3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function DY($={}){return`npx ${sL($).join(" ")}`}async function iR($,Z){return await Bun.spawn(["npx",...sL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function tL($={}){let Z=$.home??hX0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>cX0.map((z)=>Iv(X,z)))}function lX0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function pK($){let Z=tL($).find((z)=>Sv(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:lR,stale:!1};let J=null;try{J=lX0(mX0(Z,"utf8"))}catch{J=null}let X=J===null||J<lR;return{installed:!0,installedVersion:J,currentVersion:lR,stale:X}}function pX0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function Ev($={}){let Z=Q$(),J=nR(),X=pK();if(!X.installed){if(d2(pR)==="1")return;o3(pR,"1"),process.stderr.write(`
293
293
  ${Z}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${Z} api\`:
294
294
  ${J}
@@ -936,7 +936,7 @@ Options:
936
936
  -h, --help Show this help.
937
937
  `});import{spawnSync as G80}from"child_process";import{existsSync as h_0,mkdirSync as Uf,readFileSync as W80,renameSync as u_0,rmSync as Y80}from"fs";import{mkdtempSync as c_0}from"fs";import{tmpdir as d_0}from"os";import{basename as l_0,join as yC,resolve as p_0}from"path";import{createInterface as n_0}from"readline/promises";function c8($){throw new r4($)}function H80($){let Z=IH($);if(!Z)c8(`no ${_L.join(" or ")} found at ${$}`);let J=W80(Z,"utf8");return{...wK(J,l_0(Z)),manifestPath:Z,manifestSource:J}}function q80($){let Z=$.manifest.minKobeVersion;if(K3(D$,Z)<0)c8(`plugin requires Rove >= ${Z} (this is ${D$}); update Rove first`)}function o_0($,Z){let J=$.manifest;console.log(`
938
938
  ${J.name} (${J.id}) v${J.version} \u2014 ${J.description??"no description"}`),console.log(`source: ${Z}`);let X=(z,G)=>{for(let W of G)console.log(` ${z}: ${W.command.join(" ")}`)};X("build",J.build),X("startup",J.startup);for(let z of J.actions)console.log(` action ${z.id}: ${z.command.join(" ")}`);for(let z of J.events)console.log(` on ${z.on}: ${z.command.join(" ")}`);for(let z of $.warnings)console.log(` warning: ${z}`);console.log("")}async function a_0($){if($)return;if(!process.stdin.isTTY)c8("refusing to install without confirmation in a non-interactive terminal; pass --yes");let Z=n_0({input:process.stdin,output:process.stdout}),J=(await Z.question("Install this plugin and run its build commands? [y/N] ")).trim().toLowerCase();if(Z.close(),J!=="y"&&J!=="yes")c8("aborted")}function qf($,Z){if(G80("git",$,{cwd:Z,stdio:["ignore","inherit","inherit"]}).status!==0)c8(`git ${$[0]} failed`)}function r_0($,Z){let J=RJ();for(let[X,z]of $.manifest.build.entries()){if(!QZ(z,$.manifest,J))continue;let[G,...W]=z.command;console.log(`build[${X}]: ${z.command.join(" ")}`);let H=G80(G,W,{cwd:Z,stdio:["ignore","inherit","inherit"]});if(H.status!==0)c8(`build[${X}] failed (exit ${H.status??"spawn error"}); plugin not registered`)}}function U80($){YZ(Lb(j5(),$)),Uf(B3($.id),{recursive:!0}),Uf(_Q($.id),{recursive:!0})}async function bC($,Z){let J=$.match(i_0);if(!J)c8(`install takes GitHub shorthand (owner/repo[/subdir]), got \`${$}\``);let[,X,z,G]=J,W=G?.replace(/^\//,""),H=c_0(yC(d_0(),"kobe-plugin-"));try{let U=`https://github.com/${X}/${z}.git`;if(console.log(`cloning ${U}${Z.ref?` @ ${Z.ref}`:""}`),Z.ref)qf(["clone","--quiet",U,H]),qf(["checkout","--quiet",Z.ref],H);else qf(["clone","--quiet","--depth","1",U,H]);let B=W?yC(H,W):H,N=H80(B);q80(N);let L=N.manifest.id,M=j5().plugins.find((C)=>C.id===L);if(M?.source.kind==="link")c8(`\`${L}\` is locally linked at ${M.root}; unlink it first`);if(!QZ({},N.manifest,RJ()))c8(`plugin declares platforms [${N.manifest.platforms?.join(", ")}]; this machine is unsupported`);o_0(N,`github.com/${X}/${z}${W?`/${W}`:""}`),await a_0(Z.yes),r_0(N,B);let V=IH(B);if(!V)c8("manifest disappeared during build; aborting");if(V!==N.manifestPath)c8("manifest changed during build; aborting");if(W80(V,"utf8")!==N.manifestSource)c8("manifest changed during build; aborting");let _=wH(L);return Y80(_,{recursive:!0,force:!0}),Uf(yC(_,".."),{recursive:!0}),u_0(H,_),U80({id:L,source:{kind:"github",spec:$},root:W?yC(_,W):_,enabled:!0,version:N.manifest.version,installedAt:Date.now()}),console.log(`installed ${L} v${N.manifest.version}`),L}finally{Y80(H,{recursive:!0,force:!0})}}function B80($){let Z=p_0($);if(!h_0(Z))c8(`no such directory: ${Z}`);let J=H80(Z);q80(J);let X=J.manifest.id;if(j5().plugins.find((G)=>G.id===X)?.source.kind==="github")c8(`\`${X}\` is installed from GitHub; uninstall it before linking a local copy`);for(let G of J.warnings)console.log(`warning: ${G}`);U80({id:X,source:{kind:"link"},root:Z,enabled:!0,version:J.manifest.version,installedAt:Date.now()}),console.log(`linked ${X} v${J.manifest.version} \u2192 ${Z}`)}var i_0,r4;var Bf=a(()=>{jQ();zZ();TJ();x8();i_0=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)(\/.+)?$/;r4=class r4 extends Error{}});var F80={};g$(F80,{searchMarketplace:()=>$C0});async function K80($,Z){let J=encodeURIComponent(`topic:${$}${Z?` ${Z}`:""}`),X=new AbortController,z=setTimeout(()=>X.abort(),s_0);try{let G=await fetch(`https://api.github.com/search/repositories?q=${J}&sort=stars&order=desc&per_page=50`,{signal:X.signal,headers:{accept:"application/vnd.github+json"}});if(!G.ok)return null;let W=await G.json();if(!Array.isArray(W.items))return null;return W.items.filter((H)=>typeof H.full_name==="string").map((H)=>({ref:H.full_name,desc:H.description??"",stars:H.stargazers_count}))}catch{return null}finally{clearTimeout(z)}}async function $C0($){let Z=await Promise.all([K80("rove-plugin",$),K80("kobe-plugin",$)]),J=$?.toLowerCase(),X=e_0.filter((W)=>!J||`${W.ref} ${W.desc}`.toLowerCase().includes(J)).map((W)=>({...W,firstParty:!0})),z=ZC0([...X,...Z.flatMap((W)=>W??[])]);if(Z.every((W)=>W===null))console.error("(GitHub search unreachable \u2014 showing first-party plugins only)");if(z.length===0){console.log($?`no plugins match \`${$}\``:"no plugins found");return}let G=Math.min(48,Math.max(...z.map((W)=>W.ref.length))+2);for(let W of z){let H=W.stars!==void 0?`\u2605${W.stars}`:W.firstParty?"first-party":"";console.log(`${W.ref.padEnd(G)}${H.padEnd(12)}${W.desc}`)}console.log(`
939
- install: ${t_0} plugin install <owner/repo[/subdir]> \u2014 browse: https://kobe.sma1lboy.me/plugins`)}function ZC0($){let Z=new Set;return $.filter((J)=>{let X=J.ref.toLowerCase();if(Z.has(X))return!1;return Z.add(X),!0})}var s_0=5000,t_0,e_0;var M80=a(()=>{o4();t_0=Q$(),e_0=[{ref:"Sma1lboy/kobe-plugins/notify",desc:"Desktop/ntfy notifications when an agent finishes or needs input"},{ref:"Sma1lboy/kobe-plugins/github-start",desc:"Start a Rove task from a GitHub issue or PR"},{ref:"Sma1lboy/kobe-plugins/worktree-include",desc:"Copy .worktreeinclude-matched files into new worktrees"},{ref:"Sma1lboy/kobe-plugins/linear-start",desc:"Pick a Linear issue (fzf) and start a task on its branch"},{ref:"Sma1lboy/kobe-plugins/lazygit",desc:"lazygit on the task worktree, as a pane tab"},{ref:"Sma1lboy/kobe-plugins/browser",desc:"Chromium rendered as terminal cells (carbonyl) in a pane tab"}]});var Ff={};g$(Ff,{updatePlugins:()=>HC0,printOutdated:()=>GC0,listOutdated:()=>kC});import{execFileSync as JC0}from"child_process";import{existsSync as N80,mkdirSync as XC0,readdirSync as QC0,renameSync as zC0}from"fs";import{join as Kf}from"path";function O80($,Z){try{return JC0("git",$,{cwd:Z,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function YC0($){let Z=$.source.spec.split("/").slice(0,2).join("/"),J=O80(["rev-parse","HEAD"],wH($.id)),X=O80(["ls-remote",`https://github.com/${Z}.git`,"HEAD"]),z=X?X.split(/\s+/)[0]??null:null;return{id:$.id,spec:$.source.spec,version:$.version,localSha:J,remoteSha:z,behind:Boolean(J&&z&&J!==z)}}function kC(){let $=j5().plugins.filter((Z)=>Z.source.kind==="github").map(YC0);return sl($.filter((Z)=>Z.behind).map((Z)=>Z.id)),$}function GC0(){let $=kC();if($.length===0){console.log("no GitHub-installed plugins.");return}for(let Z of $){let J=Z.behind?"update available":Z.remoteSha===null?"remote unreachable":Z.localSha===null?"local sha unreadable":"up to date";console.log(`${Z.id} v${Z.version} ${J}`)}}function WC0($,Z){for(let J of[B3,_Q]){let X=J($),z=J(Z);if(!N80(X))continue;XC0(z,{recursive:!0});for(let G of QC0(X)){if(N80(Kf(z,G)))continue;zC0(Kf(X,G),Kf(z,G))}}YZ(fK(j5(),$)),console.log(`renamed ${$} \u2192 ${Z}: settings and state carried over, old entry unregistered`),console.log(` leftover checkout (safe to remove): ${EH($)}`)}async function HC0($,Z){let J=kC(),X;if(Z.all){if(X=J.filter((z)=>z.behind),X.length===0){console.log("all plugins up to date.");return}}else{if($.length===0)throw new r4("update takes plugin ids or --all");X=$.map((z)=>{let G=J.find((W)=>W.id===z);if(!G)throw new r4(`\`${z}\` is not a GitHub-installed plugin; see \`${Q$()} plugin list\``);return G})}for(let z of X){if(!z.behind&&!$.includes(z.id))continue;console.log(`updating ${z.id} (${z.spec})\u2026`);let G=await bC(z.spec,{yes:Z.yes});if(G!==z.id)WC0(z.id,G)}kC()}var Mf=a(()=>{ZI();zZ();TJ();Bf();o4()});var L80={};g$(L80,{runPluginSubcommand:()=>CC0});import{spawnSync as qC0}from"child_process";import{readFileSync as UC0,rmSync as BC0}from"fs";function Nf($){$.write([`usage: ${HX} plugin <command>`,""," install <owner/repo[/subdir]> [--yes] [--ref <rev>] clone from GitHub, preview, build, register"," link <dir> register a local plugin directory (dev)"," list installed + linked plugins"," search [query] browse the marketplace (GitHub topic rove-plugin)"," outdated check GitHub-installed plugins against upstream"," update <id\u2026> | --all [--yes] reinstall stale plugins from GitHub"," enable <id> | disable <id> toggle a plugin without unregistering it"," unlink <id> unregister a linked plugin (files untouched)"," uninstall <id-or-spec> unregister + remove the managed checkout"," config-dir <id> print the plugin's config directory"," log <id> [-n <count>] tail the plugin's command-run log"," action list [--plugin <id>] declared actions"," action invoke <plugin-id.action-id> run an action now"," pane open --plugin <id> --entrypoint <pane-id> open a plugin pane as a terminal tab","","Marketplace: https://github.com/topics/rove-plugin (legacy kobe-plugin is included)",""].join(`
939
+ install: ${t_0} plugin install <owner/repo[/subdir]> \u2014 browse: https://rove.sma1lboy.me/plugins`)}function ZC0($){let Z=new Set;return $.filter((J)=>{let X=J.ref.toLowerCase();if(Z.has(X))return!1;return Z.add(X),!0})}var s_0=5000,t_0,e_0;var M80=a(()=>{o4();t_0=Q$(),e_0=[{ref:"Sma1lboy/kobe-plugins/notify",desc:"Desktop/ntfy notifications when an agent finishes or needs input"},{ref:"Sma1lboy/kobe-plugins/github-start",desc:"Start a Rove task from a GitHub issue or PR"},{ref:"Sma1lboy/kobe-plugins/worktree-include",desc:"Copy .worktreeinclude-matched files into new worktrees"},{ref:"Sma1lboy/kobe-plugins/linear-start",desc:"Pick a Linear issue (fzf) and start a task on its branch"},{ref:"Sma1lboy/kobe-plugins/lazygit",desc:"lazygit on the task worktree, as a pane tab"},{ref:"Sma1lboy/kobe-plugins/browser",desc:"Chromium rendered as terminal cells (carbonyl) in a pane tab"}]});var Ff={};g$(Ff,{updatePlugins:()=>HC0,printOutdated:()=>GC0,listOutdated:()=>kC});import{execFileSync as JC0}from"child_process";import{existsSync as N80,mkdirSync as XC0,readdirSync as QC0,renameSync as zC0}from"fs";import{join as Kf}from"path";function O80($,Z){try{return JC0("git",$,{cwd:Z,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function YC0($){let Z=$.source.spec.split("/").slice(0,2).join("/"),J=O80(["rev-parse","HEAD"],wH($.id)),X=O80(["ls-remote",`https://github.com/${Z}.git`,"HEAD"]),z=X?X.split(/\s+/)[0]??null:null;return{id:$.id,spec:$.source.spec,version:$.version,localSha:J,remoteSha:z,behind:Boolean(J&&z&&J!==z)}}function kC(){let $=j5().plugins.filter((Z)=>Z.source.kind==="github").map(YC0);return sl($.filter((Z)=>Z.behind).map((Z)=>Z.id)),$}function GC0(){let $=kC();if($.length===0){console.log("no GitHub-installed plugins.");return}for(let Z of $){let J=Z.behind?"update available":Z.remoteSha===null?"remote unreachable":Z.localSha===null?"local sha unreadable":"up to date";console.log(`${Z.id} v${Z.version} ${J}`)}}function WC0($,Z){for(let J of[B3,_Q]){let X=J($),z=J(Z);if(!N80(X))continue;XC0(z,{recursive:!0});for(let G of QC0(X)){if(N80(Kf(z,G)))continue;zC0(Kf(X,G),Kf(z,G))}}YZ(fK(j5(),$)),console.log(`renamed ${$} \u2192 ${Z}: settings and state carried over, old entry unregistered`),console.log(` leftover checkout (safe to remove): ${EH($)}`)}async function HC0($,Z){let J=kC(),X;if(Z.all){if(X=J.filter((z)=>z.behind),X.length===0){console.log("all plugins up to date.");return}}else{if($.length===0)throw new r4("update takes plugin ids or --all");X=$.map((z)=>{let G=J.find((W)=>W.id===z);if(!G)throw new r4(`\`${z}\` is not a GitHub-installed plugin; see \`${Q$()} plugin list\``);return G})}for(let z of X){if(!z.behind&&!$.includes(z.id))continue;console.log(`updating ${z.id} (${z.spec})\u2026`);let G=await bC(z.spec,{yes:Z.yes});if(G!==z.id)WC0(z.id,G)}kC()}var Mf=a(()=>{ZI();zZ();TJ();Bf();o4()});var L80={};g$(L80,{runPluginSubcommand:()=>CC0});import{spawnSync as qC0}from"child_process";import{readFileSync as UC0,rmSync as BC0}from"fs";function Nf($){$.write([`usage: ${HX} plugin <command>`,""," install <owner/repo[/subdir]> [--yes] [--ref <rev>] clone from GitHub, preview, build, register"," link <dir> register a local plugin directory (dev)"," list installed + linked plugins"," search [query] browse the marketplace (GitHub topic rove-plugin)"," outdated check GitHub-installed plugins against upstream"," update <id\u2026> | --all [--yes] reinstall stale plugins from GitHub"," enable <id> | disable <id> toggle a plugin without unregistering it"," unlink <id> unregister a linked plugin (files untouched)"," uninstall <id-or-spec> unregister + remove the managed checkout"," config-dir <id> print the plugin's config directory"," log <id> [-n <count>] tail the plugin's command-run log"," action list [--plugin <id>] declared actions"," action invoke <plugin-id.action-id> run an action now"," pane open --plugin <id> --entrypoint <pane-id> open a plugin pane as a terminal tab","","Marketplace: https://github.com/topics/rove-plugin (legacy kobe-plugin is included)",""].join(`
940
940
  `))}function DM(){return j5().plugins.map(($)=>{try{return{entry:$,manifest:XZ($.root).manifest}}catch{return{entry:$,manifest:void 0}}})}function vC($){let Z=j5().plugins.find((J)=>J.id===$);if(!Z)throw new r4(`no plugin registered as \`${$}\`; see \`${HX} plugin list\``);return Z}function KC0(){let $=DM();if($.length===0){console.log(`no plugins installed. Try: ${HX} plugin install <owner/repo> \u2014 browse the \`rove-plugin\` GitHub topic.`);return}for(let{entry:Z,manifest:J}of $){let X=Z.enabled?"enabled":"disabled",z=Z.source.kind==="link"?`linked ${Z.root}`:Z.source.spec,G=J?"":" [manifest unreadable]";console.log(`${Z.id} v${Z.version} ${X} (${z})${G}`)}}function FC0($,Z){let J=vC($),X=j5();YZ({plugins:X.plugins.map((z)=>z.id===$?{...J,enabled:Z}:z)}),console.log(`${Z?"enabled":"disabled"} ${$}`)}function MC0($){let Z=vC($);if(Z.source.kind!=="link")throw new r4(`\`${$}\` is a GitHub install; use uninstall`);YZ(fK(j5(),$)),console.log(`unlinked ${$} (files untouched at ${Z.root})`)}function NC0($){let Z=j5(),J=Z.plugins.find((X)=>X.id===$||X.source.kind==="github"&&X.source.spec===$);if(!J)throw new r4(`no plugin registered as \`${$}\``);if(J.source.kind==="link")throw new r4(`\`${J.id}\` is linked; use unlink`);YZ(fK(Z,J.id)),BC0(wH(J.id),{recursive:!0,force:!0}),console.log(`uninstalled ${J.id} (config/state kept under ~/.kobe/plugins/${J.id}/)`)}function OC0($){for(let{entry:Z,manifest:J}of DM()){if(!J||$&&Z.id!==$)continue;for(let X of J.actions)console.log(`${CL(Z.id,X.id)} ${X.title}`)}}function LC0($,Z){let X=DM().filter(({entry:H,manifest:U})=>U&&H.enabled&&$.startsWith(`${H.id}.`)).sort((H,U)=>U.entry.id.length-H.entry.id.length).map(({entry:H,manifest:U})=>{let B=$.slice(H.id.length+1),N=U.actions.find((L)=>L.id===B);return N?{entry:H,action:N}:void 0}).find(Boolean);if(!X)throw new r4(`no action \`${$}\`; see \`${HX} plugin action list\``);let[z,...G]=[...X.action.command,...Z],W=qC0(z,G,{cwd:X.entry.root,stdio:"inherit",env:pq({socketPath:Q7(),binPath:HX,pluginId:X.entry.id,pluginRoot:X.entry.root,extra:{ROVE_PLUGIN_ACTION_ID:X.action.id,ROVE_PLUGIN_INVOKE_CWD:process.cwd()}})});process.exit(W.status??1)}function jC0($){let Z=DM().filter(({entry:J,manifest:X})=>X&&$.startsWith(`${J.id}.`)).sort((J,X)=>X.entry.id.length-J.entry.id.length).find(({entry:J,manifest:X})=>X.panes.some((z)=>z.id===$.slice(J.id.length+1)));if(!Z)throw new r4(`no pane \`${$}\`; see \`${HX} plugin list\``);return{pluginId:Z.entry.id,entrypoint:$.slice(Z.entry.id.length+1)}}async function VC0($,Z,J){let X=DM().find(({entry:B})=>B.id===$);if(!X?.manifest)throw new r4(`no plugin \`${$}\` (or its manifest is unreadable)`);if(!X.entry.enabled)throw new r4(`\`${$}\` is disabled`);let z=X.manifest.panes.find((B)=>B.id===Z);if(!z)throw new r4(`no pane \`${Z}\` in \`${$}\`; declare it under [[panes]]`);let G=aE(X.entry.id,X.entry.root,z,{socketPath:Q7(),binPath:HX}),{openDaemonSession:W}=await Promise.resolve().then(() => (fw(),u10)),{resolveActiveTaskId:H}=await Promise.resolve().then(() => (sq(),l00)),U=await W({mode:"start"});try{let B=J??await H(U.client);if(!B)throw new r4("no active task; pass --task <id>");await U.client.request("tab.open",{taskId:B,argv:G,title:z.title,placement:z.placement}),console.log(`opened pane ${$}.${z.id} in task ${B}`)}finally{U.close()}}function _C0($,Z){vC($);let J;try{J=UC0(xH($),"utf8")}catch{console.log("(no runs logged yet)");return}let X=J.trimEnd().split(`
941
941
  `);for(let z of X.slice(-Z))console.log(z)}function NG($,Z){let J=$.indexOf(Z);return J>=0?$[J+1]:void 0}async function CC0($){let[Z,...J]=$;try{switch(Z){case"install":{let X=J.find((z)=>!z.startsWith("-"));if(!X)throw new r4("install needs <owner/repo[/subdir]>");await bC(X,{yes:J.includes("--yes"),ref:NG(J,"--ref")});return}case"link":{if(!J[0])throw new r4("link needs a directory");B80(J[0]);return}case"list":KC0();return;case"search":{let{searchMarketplace:X}=await Promise.resolve().then(() => (M80(),F80));await X(J.find((z)=>!z.startsWith("-")));return}case"outdated":{let{printOutdated:X}=await Promise.resolve().then(() => (Mf(),Ff));X();return}case"update":{let{updatePlugins:X}=await Promise.resolve().then(() => (Mf(),Ff));await X(J.filter((z)=>!z.startsWith("-")),{all:J.includes("--all"),yes:J.includes("--yes")});return}case"enable":case"disable":{if(!J[0])throw new r4(`${Z} needs a plugin id`);FC0(J[0],Z==="enable");return}case"unlink":{if(!J[0])throw new r4("unlink needs a plugin id");MC0(J[0]);return}case"uninstall":{if(!J[0])throw new r4("uninstall needs a plugin id or owner/repo spec");NC0(J[0]);return}case"config-dir":{if(!J[0])throw new r4("config-dir needs a plugin id");vC(J[0]),console.log(B3(J[0]));return}case"log":{if(!J[0])throw new r4("log needs a plugin id");_C0(J[0],Number.parseInt(NG(J,"-n")??"20",10)||20);return}case"pane":{let[X,...z]=J;if(X==="open"){let G=z.find((U)=>!U.startsWith("-")&&U!==NG(z,"--task")),W=NG(z,"--plugin"),H=NG(z,"--entrypoint");if(!W||!H){if(!G)throw new r4("pane open needs <plugin-id.pane-id> (or --plugin <id> --entrypoint <pane-id>) [--task <task-id>]");({pluginId:W,entrypoint:H}=jC0(G))}await VC0(W,H,NG(z,"--task"));return}Nf(process.stderr),process.exit(2);return}case"action":{let[X,...z]=J;if(X==="list"){OC0(NG(z,"--plugin"));return}if(X==="invoke"){if(!z[0])throw new r4("action invoke needs <plugin-id.action-id>");LC0(z[0],z.slice(1));return}Nf(process.stderr),process.exit(2);return}default:{let X=Z===void 0||Z==="help"||Z==="--help"||Z==="-h";if(Nf(X?process.stdout:process.stderr),!X)process.exit(2);return}}}catch(X){if(X instanceof r4)console.error(`${HX} plugin: ${X.message}`),process.exit(1);console.error(`${HX} plugin: ${N1(X)}`),process.exit(1)}}var HX;var j80=a(()=>{C2();S_();jQ();rE();zZ();TJ();Bf();o4();HX=Q$()});var _80={};g$(_80,{runOnboardingWizard:()=>AC0,WizardPage:()=>V80});import{TextAttributes as AM}from"@opentui/core";function V80($){let{theme:Z}=l0(),J=Z1(),X=I4(),z=$.shell===null?["skill"]:["completions","skill"],[G,W]=PM.useState(0),[H,U]=PM.useState(!0),[B,N]=PM.useState({}),[L,M]=PM.useState(!1),V=z[G];function A(E){X?.destroy(),$.onDone({completions:E.completions??!1,skill:E.skill??!1})}function _(E=H){if(L){A(B);return}let S={...B,[V]:E};if(N(S),G+1>=z.length){M(!0);return}W(G+1),U(!0)}g1(()=>({bindings:[{key:"up",cmd:()=>U(!0)},{key:"k",cmd:()=>U(!0)},{key:"down",cmd:()=>U(!1)},{key:"j",cmd:()=>U(!1)},{key:"return",cmd:()=>_()},...o2(()=>A(B))]}));function C(E){return E==="completions"?J("onboarding.completionsQuestion",{shell:$.shell??""}):J("onboarding.skillQuestion")}let y=V==="completions"?J("onboarding.completionsExplain"):J("onboarding.skillExplain");return T.jsxDEV("box",{flexDirection:"column",flexGrow:1,paddingTop:1,paddingLeft:2,paddingRight:2,children:[T.jsxDEV("text",{fg:Z.primary,attributes:AM.BOLD,wrapMode:"none",children:J("onboarding.title")},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:J("onboarding.subtitle")},void 0,!1,void 0,this),T.jsxDEV("box",{flexDirection:"column",paddingTop:1,children:[z.slice(0,L?z.length:G).map((E)=>T.jsxDEV("box",{flexDirection:"row",gap:1,children:[T.jsxDEV("text",{fg:Z.success,wrapMode:"none",children:"\u2713"},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"none",children:C(E)},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.text,wrapMode:"none",children:B[E]?J("onboarding.optionYes"):J("onboarding.optionNo")},void 0,!1,void 0,this)]},E,!0,void 0,this)),L?T.jsxDEV("box",{flexDirection:"column",onMouseUp:()=>_(),children:[T.jsxDEV("text",{fg:Z.text,attributes:AM.BOLD,wrapMode:"word",children:J("onboarding.keysTitle")},void 0,!1,void 0,this),hd(t3().key).map((E)=>T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:J(`onboarding.${E.msg}`,E.params)},E.msg,!1,void 0,this))]},void 0,!0,void 0,this):T.jsxDEV(T.Fragment,{children:[T.jsxDEV("text",{fg:Z.text,attributes:AM.BOLD,wrapMode:"word",children:C(V)},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:y},void 0,!1,void 0,this),[!0,!1].map((E)=>{let S=H===E;return T.jsxDEV("box",{flexDirection:"row",gap:1,paddingLeft:1,onMouseUp:()=>_(E),children:[T.jsxDEV("text",{fg:S?Z.primary:Z.textMuted,wrapMode:"none",children:S?"\u276F":" "},void 0,!1,void 0,this),T.jsxDEV("text",{fg:S?Z.primary:Z.textMuted,attributes:S?AM.BOLD:void 0,wrapMode:"none",children:E?J("onboarding.optionYes"):J("onboarding.optionNo")},void 0,!1,void 0,this)]},String(E),!0,void 0,this)})]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T.jsxDEV("box",{paddingTop:1,children:T.jsxDEV("text",{fg:Z.textMuted,attributes:AM.DIM,wrapMode:"none",children:J(L?"onboarding.keysLegend":"onboarding.legend")},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}async function AC0($){return await new Promise((Z)=>{oY({inlineRows:DC0,setup:()=>({root:()=>T.jsxDEV(V80,{shell:$,onDone:Z},void 0,!1,void 0,this)})})})}var PM,DC0=15;var C80=a(async()=>{FF();UZ();z$();r0();await e1([h4(),$$(),PF(),_4()]);PM=H1(q1(),1)});var I80={};g$(I80,{maybeRunOnboarding:()=>gC0,markOnboarded:()=>T80,isOnboarded:()=>R80,installCompletions:()=>P80,detectShell:()=>A80,applyOnboardingChoices:()=>S80});import{spawnSync as PC0}from"child_process";import{appendFileSync as RC0,existsSync as TC0,mkdirSync as SC0,readFileSync as IC0,writeFileSync as EC0}from"fs";import{homedir as wC0}from"os";import{basename as xC0,join as Of}from"path";function A80($=process.env){let Z=xC0($.SHELL??"");return Z==="zsh"||Z==="bash"||Z==="fish"?Z:null}function P80($,Z=wC0()){if($==="fish"){let z=Of(Z,".config","fish","completions"),G=Of(z,"rove.fish");return SC0(z,{recursive:!0}),EC0(G,`rove completions fish | source
942
942
  `),G}let J=Of(Z,$==="zsh"?".zshrc":".bashrc");if(!(TC0(J)?IC0(J,"utf8"):"").includes(fC0)){let z=`
package/dist/cli/kobe.js CHANGED
@@ -288,7 +288,7 @@ trust_level = "trusted"
288
288
  `)){if(!J.trim())continue;try{let{sessionId:X,sessionDir:z,workDir:G}=JSON.parse(J);if(X&&z&&G)Z.push({sessionId:X,sessionDir:z,workDir:G})}catch{}}return Z}async function lk($){let Z=await $.readFile(uL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return KX0(Z)}function pk($){return uL.join($,"agents","main","wire.jsonl")}async function CR($,Z=_R){if(!$)return[];let J=[];for(let X of await lk(Z)){if(X.workDir!==$)continue;let z=await Z.stat(pk(X.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;J.push({id:X.sessionId,mtimeMs:z})}return J.sort((X,z)=>X.mtimeMs-z.mtimeMs).map((X)=>X.id)}async function nk($,Z=_R){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function DR($,Z=_R){if(!$)return null;let J=(await lk(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=pk(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var _R;var ik=a(()=>{AQ();_R={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||uL.join(BX0(),".kimi-code")},async readFile($){return await DQ($)},stat:UX0}});import MX0 from"path";var cL,ok,ak,rk,sk;var tk=a(()=>{NR();kL();dk();ik();cL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},ok={async listSessionIdsForWorktree($){return[...await hH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>kk($),async transcriptPath($,Z){return(await hH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>bk($)},ak={listSessionIdsForWorktree:($)=>Vk($),readHistory:($)=>Ck($),transcriptPath:async($)=>await BR($)??null,latestTranscriptMtimeForWorktree:($)=>_k($)},rk={listSessionIdsForWorktree:($)=>hk($),readHistory:($)=>ck($),async transcriptPath($){let Z=await jR($);return Z?MX0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>uk($)},sk={listSessionIdsForWorktree:($)=>CR($),readHistory:cL.readHistory,transcriptPath:($)=>DR($),async latestTranscriptMtimeForWorktree($){let J=(await CR($)).at(-1);if(!J)return 0;let X=await DR(J);return X?await nk(X):0}}});import{createHash as NX0}from"crypto";import{existsSync as OX0,mkdirSync as LX0,writeFileSync as jX0}from"fs";import{homedir as ek}from"os";import AR from"path";function VX0($,Z=ek()){let J=NX0("sha256").update($).digest("hex").slice(0,12);return AR.join(Z,".kimi-code","workspace-trust",`wd_${AR.basename($)}_${J}`)}function $v($,Z=ek()){let J=VX0($,Z);if(OX0(J))return;LX0(AR.dirname(J),{recursive:!0,mode:448}),jX0(J,JSON.stringify({root:$,trustedAt:Date.now()}),{mode:384})}var Zv=()=>{};import{readFile as Xv,stat as _X0}from"fs/promises";class dL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function Qv($){return E$($).createTurnDetector()}function Jv($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
289
289
  `)){z++;let W=Yv(G);if(!W)continue;let H=TR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=Gv(W,J),B={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||B.timestampMs>=X.timestampMs)X=B}return X}function PX0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=TR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&AX0.has(Z.type)}function RX0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
290
290
  `)){X++;let G=Yv(z);if(!G||!PX0(G))continue;let W=Gv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function Yv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return TR(J)?J:null}catch{return null}}function Gv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function TR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var zv=($)=>_X0($).then((Z)=>Z.mtimeMs,()=>0),CX0,PR,DX0,RR,uK,AX0;var SR=a(()=>{NR();kL();A2();CX0={listSessionFiles:($)=>hH($),readFile:($)=>Xv($,"utf8"),statMtimeMs:zv};PR=class PR extends dL{deps;vendor="claude";cache=new Map;constructor($=CX0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=Jv(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??zv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:Jv(J,$,Z),mtimeMs:Z}}};DX0={findLatestRollout:($)=>KR($),readFile:($)=>Xv($,"utf8")};RR=class RR extends dL{deps;vendor="codex";cache=null;constructor($=DX0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=RX0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};uK=class uK extends dL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};AX0=new Set(["task_complete","turn_complete","turn_aborted"])});function TX0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:cL,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new cK($),createTurnDetector:()=>new uK($)}}function E$($){return u2($)?IR[$]:TX0($)}function Wv($){return E$($).history.readHistory!==cL.readHistory}function ER($){let Z=E$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:Hv}function SQ($,Z){let J=Z?ER(Z):Hv;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function lL($,Z){let J=E$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function qv(){return Object.values(IR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var IR,Hv;var A2=a(()=>{c2();IJ();cb();ab();Zk();Xk();Yk();Wk();Rk();Ik();tk();wR();Zv();SR();IR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:ok,detectAccount:($)=>fH($),createHookAdapter:()=>new $R,createTurnDetector:()=>new PR,capabilities:hb,identity:ub,trustWorktree:Jk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>$k()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:ak,detectAccount:($)=>gH($),createHookAdapter:()=>new QR,createTurnDetector:()=>new RR,capabilities:Qk,identity:zk,trustWorktree:Sk,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:()=>Pk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:rk,detectAccount:($)=>yH($),createHookAdapter:()=>new cK("copilot"),createTurnDetector:()=>new uK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:$v,history:sk,detectAccount:($)=>wL($),createHookAdapter:()=>new cK("kimi"),createTurnDetector:()=>new uK("kimi")}};Hv=[...new Set(Object.values(IR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function xR($){return E$($).createHookAdapter()}class cK{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 wR=a(()=>{A2()});function pL($){return SX0.includes($)}function Uv($){return IX0.includes($)}var SX0,IX0;var fR=a(()=>{SX0=["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"];IX0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Dv={};g$(Dv,{runHookSubcommand:()=>yX0,readTextWithTimeout:()=>Mv,parseWorktreeRemovePath:()=>jv,parseWorktreeAddPath:()=>Lv,ensureGlobalKobeHooks:()=>yR});import{homedir as EX0}from"os";import{join as Fv,resolve as gR}from"path";async function Mv($,Z=wX0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function Nv(){try{let $=await Mv(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function Bv($,Z){for(let J=0;J<$.length;J++){if($[J]===Z)return $[J+1];if($[J].startsWith(`${Z}=`))return $[J].slice(Z.length+1)}return}function fX0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function Ov($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function Lv($){let Z=Ov($),J=new Set(["-b","-B","--reason"]);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="add")continue;let z=X+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=J.has(G)?2:1;continue}return G}}return}function jv($){let Z=Ov($);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="remove")continue;let X=J+2;while(X<Z.length){let z=Z[X];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){X+=1;continue}return z}}return}async function gX0(){let $=await Nv(),Z=fX0($.tool_input)?$.tool_input:{},J=typeof Z.command==="string"?Z.command:"";if(!J.includes("worktree"))return;let X=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=Lv(J),G=z?void 0:jv(J);if(!z&&!G)return;let W=await BQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:gR(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:gR(X,G)})}finally{W.close()}}async function yX0($){let[Z,...J]=$;if(Z==="setup"){await mX0(J);return}if(Z===xX0){try{await gX0()}catch{}return}try{if(!Z||!pL(Z))return;let X=await Nv(),z=Bv(J,"--task-id"),G=typeof X.cwd==="string"&&X.cwd?X.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=Bv(J,"--engine"),B=Vv().filter((V)=>!U||V.vendor===U),N;for(let V of B)if(N=V.activityDetailFromPayload(Z,X),N)break;let L;for(let V of B)if(L=V.sessionFromPayload(X),L)break;let M=await BQ();if(!M)return;try{let V=z??W;await M.request("engine.reportEvent",{...V?{taskId:V}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...N?{detail:N}:{},...L?{sessionId:L.sessionId}:{},...L?.transcriptPath?{transcriptPath:L.transcriptPath}:{}})}finally{M.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function bX0(){return T8.map(($)=>xR($)).filter(($)=>$.supportsWorktreeSync())}function Vv(){return T8.map(($)=>xR($)).filter(($)=>$.supportsHooks())}function _v(){return Fv(EX0(),".claude","settings.json")}function kX0($){if(!$||$==="off")return;if($==="global")return _v();if($.startsWith("repo:"))return Fv(gR($.slice(5)),".claude","settings.json");return $}async function yR(){try{let $=vX0();for(let Z of Vv()){let J=Z.globalSettingsPath();if(!J)continue;await Z.installActivityHooks(J,{toolEvents:$}),await Z.installWorktreeWatchHook(J)}await Cv()}catch{}}function vX0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(XZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Cv(){let $=bX0();if($.length===0)return;let Z=d2(Kv),J=new Set([_v()]),X=kX0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(Kv,"off")}async function mX0($){await Cv(),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(`
291
- `))}var wX0=500,xX0="worktree-created",Kv="externalWorktreeSync";var bR=a(()=>{D7();jQ();TJ();wR();fR();b4();c2()});var nL;var Av=a(()=>{nL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.105",description:"Rove \u2014 the terminal-native agent multiplexer",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.14","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var Rv={};g$(Rv,{repoSlug:()=>_Y,releasePageUrl:()=>cR,recommendedGlobalInstallCommand:()=>mR,isNewerSemver:()=>kR,fetchReleaseSummaries:()=>lK,fetchReleaseNotesRange:()=>uR,fetchReleaseNotes:()=>hR,compareSemver:()=>K3,checkLatestVersion:()=>CY,breakingVersionsCrossed:()=>dK,UPDATE_SCRIPT_URL:()=>iL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>vR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>wJ});function _Y(){let $=nL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function mR(){return`npm install -g ${vR}@latest`}function dK($,Z,J=wJ){let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}async function uX0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),oL);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function kR($,Z){return K3($,Z)>0}function K3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function CY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:D$,latest:Z,hasUpdate:kR(Z,D$)};if(BH()&&!$.force)return null;let J=await uX0(vR);if(!J)return null;return{current:D$,latest:J,hasUpdate:kR(J,D$)}}function Pv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function hR($){let Z=_Y();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),oL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function uR($){let Z=_Y();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),oL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Pv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(K3(U,$.current)<=0)return null;if(K3(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 lK($=12){let Z=_Y();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),oL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Pv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function cR($){let Z=_Y();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,vR,iL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,wJ,oL=3000;var x8=a(()=>{Av();L5();D$=nL.version,vR=nL.name;WZ=`curl -fsSL ${iL} | sh`;wJ=[]});var Sv={};g$(Sv,{stampResetGate:()=>aL,resetGateBlockers:()=>Tv,enforceResetGate:()=>lR,LAST_RUN_VERSION_KEY:()=>dR});function Tv($,Z=D$,J=wJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}function lR(){let $=Q$(),Z=M4()[dR],J=Tv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
291
+ `))}var wX0=500,xX0="worktree-created",Kv="externalWorktreeSync";var bR=a(()=>{D7();jQ();TJ();wR();fR();b4();c2()});var nL;var Av=a(()=>{nL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.106",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.14","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var Rv={};g$(Rv,{repoSlug:()=>_Y,releasePageUrl:()=>cR,recommendedGlobalInstallCommand:()=>mR,isNewerSemver:()=>kR,fetchReleaseSummaries:()=>lK,fetchReleaseNotesRange:()=>uR,fetchReleaseNotes:()=>hR,compareSemver:()=>K3,checkLatestVersion:()=>CY,breakingVersionsCrossed:()=>dK,UPDATE_SCRIPT_URL:()=>iL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>vR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>wJ});function _Y(){let $=nL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function mR(){return`npm install -g ${vR}@latest`}function dK($,Z,J=wJ){let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}async function uX0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),oL);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function kR($,Z){return K3($,Z)>0}function K3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function CY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:D$,latest:Z,hasUpdate:kR(Z,D$)};if(BH()&&!$.force)return null;let J=await uX0(vR);if(!J)return null;return{current:D$,latest:J,hasUpdate:kR(J,D$)}}function Pv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function hR($){let Z=_Y();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),oL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function uR($){let Z=_Y();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),oL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Pv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(K3(U,$.current)<=0)return null;if(K3(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 lK($=12){let Z=_Y();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),oL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Pv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function cR($){let Z=_Y();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,vR,iL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,wJ,oL=3000;var x8=a(()=>{Av();L5();D$=nL.version,vR=nL.name;WZ=`curl -fsSL ${iL} | sh`;wJ=[]});var Sv={};g$(Sv,{stampResetGate:()=>aL,resetGateBlockers:()=>Tv,enforceResetGate:()=>lR,LAST_RUN_VERSION_KEY:()=>dR});function Tv($,Z=D$,J=wJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}function lR(){let $=Q$(),Z=M4()[dR],J=Tv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
292
292
  `)),process.exit(1)}if(Z!==D$)aL()}function aL(){try{A7({[dR]:D$})}catch{}}var dR="app.lastRunVersion";var rL=a(()=>{P7();x8();h4()});import{existsSync as Ev,readFileSync as cX0}from"fs";import{homedir as dX0}from"os";import{join as wv,resolve as Iv}from"path";import{fileURLToPath as lX0}from"url";function iR($=process.env){return`${Q$($)} skill install`}function sL(){let $=lX0(import.meta.url);return[Iv($,"../../../../../.agents/skills/kobe"),Iv($,"../../skills/rove")].find((J)=>Ev(wv(J,"SKILL.md")))??null}function tL($={}){let Z=$.source!==void 0?$.source:sL(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??nX0,"--skill",p3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function DY($={}){return`npx ${tL($).join(" ")}`}async function oR($,Z){return await Bun.spawn(["npx",...tL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function eL($={}){let Z=$.home??dX0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>pX0.map((z)=>wv(X,z)))}function iX0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function pK($){let Z=eL($).find((z)=>Ev(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:pR,stale:!1};let J=null;try{J=iX0(cX0(Z,"utf8"))}catch{J=null}let X=J===null||J<pR;return{installed:!0,installedVersion:J,currentVersion:pR,stale:X}}function oX0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function xv($={}){let Z=Q$(),J=iR(),X=pK();if(!X.installed){if(d2(nR)==="1")return;o3(nR,"1"),process.stderr.write(`
293
293
  ${Z}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${Z} api\`:
294
294
  ${J}
@@ -936,7 +936,7 @@ Options:
936
936
  -h, --help Show this help.
937
937
  `});import{spawnSync as H80}from"child_process";import{existsSync as d_0,mkdirSync as Bf,readFileSync as q80,renameSync as l_0,rmSync as W80}from"fs";import{mkdtempSync as p_0}from"fs";import{tmpdir as n_0}from"os";import{basename as i_0,join as bC,resolve as o_0}from"path";import{createInterface as a_0}from"readline/promises";function c8($){throw new r4($)}function U80($){let Z=IH($);if(!Z)c8(`no ${CL.join(" or ")} found at ${$}`);let J=q80(Z,"utf8");return{...wK(J,i_0(Z)),manifestPath:Z,manifestSource:J}}function B80($){let Z=$.manifest.minKobeVersion;if(K3(D$,Z)<0)c8(`plugin requires Rove >= ${Z} (this is ${D$}); update Rove first`)}function s_0($,Z){let J=$.manifest;console.log(`
938
938
  ${J.name} (${J.id}) v${J.version} \u2014 ${J.description??"no description"}`),console.log(`source: ${Z}`);let X=(z,G)=>{for(let W of G)console.log(` ${z}: ${W.command.join(" ")}`)};X("build",J.build),X("startup",J.startup);for(let z of J.actions)console.log(` action ${z.id}: ${z.command.join(" ")}`);for(let z of J.events)console.log(` on ${z.on}: ${z.command.join(" ")}`);for(let z of $.warnings)console.log(` warning: ${z}`);console.log("")}async function t_0($){if($)return;if(!process.stdin.isTTY)c8("refusing to install without confirmation in a non-interactive terminal; pass --yes");let Z=a_0({input:process.stdin,output:process.stdout}),J=(await Z.question("Install this plugin and run its build commands? [y/N] ")).trim().toLowerCase();if(Z.close(),J!=="y"&&J!=="yes")c8("aborted")}function Uf($,Z){if(H80("git",$,{cwd:Z,stdio:["ignore","inherit","inherit"]}).status!==0)c8(`git ${$[0]} failed`)}function e_0($,Z){let J=RJ();for(let[X,z]of $.manifest.build.entries()){if(!QZ(z,$.manifest,J))continue;let[G,...W]=z.command;console.log(`build[${X}]: ${z.command.join(" ")}`);let H=H80(G,W,{cwd:Z,stdio:["ignore","inherit","inherit"]});if(H.status!==0)c8(`build[${X}] failed (exit ${H.status??"spawn error"}); plugin not registered`)}}function K80($){YZ(Vb(j5(),$)),Bf(B3($.id),{recursive:!0}),Bf(_Q($.id),{recursive:!0})}async function kC($,Z){let J=$.match(r_0);if(!J)c8(`install takes GitHub shorthand (owner/repo[/subdir]), got \`${$}\``);let[,X,z,G]=J,W=G?.replace(/^\//,""),H=p_0(bC(n_0(),"kobe-plugin-"));try{let U=`https://github.com/${X}/${z}.git`;if(console.log(`cloning ${U}${Z.ref?` @ ${Z.ref}`:""}`),Z.ref)Uf(["clone","--quiet",U,H]),Uf(["checkout","--quiet",Z.ref],H);else Uf(["clone","--quiet","--depth","1",U,H]);let B=W?bC(H,W):H,N=U80(B);B80(N);let L=N.manifest.id,M=j5().plugins.find((C)=>C.id===L);if(M?.source.kind==="link")c8(`\`${L}\` is locally linked at ${M.root}; unlink it first`);if(!QZ({},N.manifest,RJ()))c8(`plugin declares platforms [${N.manifest.platforms?.join(", ")}]; this machine is unsupported`);s_0(N,`github.com/${X}/${z}${W?`/${W}`:""}`),await t_0(Z.yes),e_0(N,B);let V=IH(B);if(!V)c8("manifest disappeared during build; aborting");if(V!==N.manifestPath)c8("manifest changed during build; aborting");if(q80(V,"utf8")!==N.manifestSource)c8("manifest changed during build; aborting");let _=wH(L);return W80(_,{recursive:!0,force:!0}),Bf(bC(_,".."),{recursive:!0}),l_0(H,_),K80({id:L,source:{kind:"github",spec:$},root:W?bC(_,W):_,enabled:!0,version:N.manifest.version,installedAt:Date.now()}),console.log(`installed ${L} v${N.manifest.version}`),L}finally{W80(H,{recursive:!0,force:!0})}}function F80($){let Z=o_0($);if(!d_0(Z))c8(`no such directory: ${Z}`);let J=U80(Z);B80(J);let X=J.manifest.id;if(j5().plugins.find((G)=>G.id===X)?.source.kind==="github")c8(`\`${X}\` is installed from GitHub; uninstall it before linking a local copy`);for(let G of J.warnings)console.log(`warning: ${G}`);K80({id:X,source:{kind:"link"},root:Z,enabled:!0,version:J.manifest.version,installedAt:Date.now()}),console.log(`linked ${X} v${J.manifest.version} \u2192 ${Z}`)}var r_0,r4;var Kf=a(()=>{jQ();zZ();TJ();x8();r_0=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)(\/.+)?$/;r4=class r4 extends Error{}});var N80={};g$(N80,{searchMarketplace:()=>XC0});async function M80($,Z){let J=encodeURIComponent(`topic:${$}${Z?` ${Z}`:""}`),X=new AbortController,z=setTimeout(()=>X.abort(),$C0);try{let G=await fetch(`https://api.github.com/search/repositories?q=${J}&sort=stars&order=desc&per_page=50`,{signal:X.signal,headers:{accept:"application/vnd.github+json"}});if(!G.ok)return null;let W=await G.json();if(!Array.isArray(W.items))return null;return W.items.filter((H)=>typeof H.full_name==="string").map((H)=>({ref:H.full_name,desc:H.description??"",stars:H.stargazers_count}))}catch{return null}finally{clearTimeout(z)}}async function XC0($){let Z=await Promise.all([M80("rove-plugin",$),M80("kobe-plugin",$)]),J=$?.toLowerCase(),X=JC0.filter((W)=>!J||`${W.ref} ${W.desc}`.toLowerCase().includes(J)).map((W)=>({...W,firstParty:!0})),z=QC0([...X,...Z.flatMap((W)=>W??[])]);if(Z.every((W)=>W===null))console.error("(GitHub search unreachable \u2014 showing first-party plugins only)");if(z.length===0){console.log($?`no plugins match \`${$}\``:"no plugins found");return}let G=Math.min(48,Math.max(...z.map((W)=>W.ref.length))+2);for(let W of z){let H=W.stars!==void 0?`\u2605${W.stars}`:W.firstParty?"first-party":"";console.log(`${W.ref.padEnd(G)}${H.padEnd(12)}${W.desc}`)}console.log(`
939
- install: ${ZC0} plugin install <owner/repo[/subdir]> \u2014 browse: https://kobe.sma1lboy.me/plugins`)}function QC0($){let Z=new Set;return $.filter((J)=>{let X=J.ref.toLowerCase();if(Z.has(X))return!1;return Z.add(X),!0})}var $C0=5000,ZC0,JC0;var O80=a(()=>{h4();ZC0=Q$(),JC0=[{ref:"Sma1lboy/kobe-plugins/notify",desc:"Desktop/ntfy notifications when an agent finishes or needs input"},{ref:"Sma1lboy/kobe-plugins/github-start",desc:"Start a Rove task from a GitHub issue or PR"},{ref:"Sma1lboy/kobe-plugins/worktree-include",desc:"Copy .worktreeinclude-matched files into new worktrees"},{ref:"Sma1lboy/kobe-plugins/linear-start",desc:"Pick a Linear issue (fzf) and start a task on its branch"},{ref:"Sma1lboy/kobe-plugins/lazygit",desc:"lazygit on the task worktree, as a pane tab"},{ref:"Sma1lboy/kobe-plugins/browser",desc:"Chromium rendered as terminal cells (carbonyl) in a pane tab"}]});var Mf={};g$(Mf,{updatePlugins:()=>BC0,printOutdated:()=>qC0,listOutdated:()=>vC});import{execFileSync as zC0}from"child_process";import{existsSync as L80,mkdirSync as YC0,readdirSync as GC0,renameSync as WC0}from"fs";import{join as Ff}from"path";function j80($,Z){try{return zC0("git",$,{cwd:Z,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function HC0($){let Z=$.source.spec.split("/").slice(0,2).join("/"),J=j80(["rev-parse","HEAD"],wH($.id)),X=j80(["ls-remote",`https://github.com/${Z}.git`,"HEAD"]),z=X?X.split(/\s+/)[0]??null:null;return{id:$.id,spec:$.source.spec,version:$.version,localSha:J,remoteSha:z,behind:Boolean(J&&z&&J!==z)}}function vC(){let $=j5().plugins.filter((Z)=>Z.source.kind==="github").map(HC0);return el($.filter((Z)=>Z.behind).map((Z)=>Z.id)),$}function qC0(){let $=vC();if($.length===0){console.log("no GitHub-installed plugins.");return}for(let Z of $){let J=Z.behind?"update available":Z.remoteSha===null?"remote unreachable":Z.localSha===null?"local sha unreadable":"up to date";console.log(`${Z.id} v${Z.version} ${J}`)}}function UC0($,Z){for(let J of[B3,_Q]){let X=J($),z=J(Z);if(!L80(X))continue;YC0(z,{recursive:!0});for(let G of GC0(X)){if(L80(Ff(z,G)))continue;WC0(Ff(X,G),Ff(z,G))}}YZ(fK(j5(),$)),console.log(`renamed ${$} \u2192 ${Z}: settings and state carried over, old entry unregistered`),console.log(` leftover checkout (safe to remove): ${EH($)}`)}async function BC0($,Z){let J=vC(),X;if(Z.all){if(X=J.filter((z)=>z.behind),X.length===0){console.log("all plugins up to date.");return}}else{if($.length===0)throw new r4("update takes plugin ids or --all");X=$.map((z)=>{let G=J.find((W)=>W.id===z);if(!G)throw new r4(`\`${z}\` is not a GitHub-installed plugin; see \`${Q$()} plugin list\``);return G})}for(let z of X){if(!z.behind&&!$.includes(z.id))continue;console.log(`updating ${z.id} (${z.spec})\u2026`);let G=await kC(z.spec,{yes:Z.yes});if(G!==z.id)UC0(z.id,G)}vC()}var Nf=a(()=>{JI();zZ();TJ();Kf();h4()});var V80={};g$(V80,{runPluginSubcommand:()=>PC0});import{spawnSync as KC0}from"child_process";import{readFileSync as FC0,rmSync as MC0}from"fs";function Of($){$.write([`usage: ${HX} plugin <command>`,""," install <owner/repo[/subdir]> [--yes] [--ref <rev>] clone from GitHub, preview, build, register"," link <dir> register a local plugin directory (dev)"," list installed + linked plugins"," search [query] browse the marketplace (GitHub topic rove-plugin)"," outdated check GitHub-installed plugins against upstream"," update <id\u2026> | --all [--yes] reinstall stale plugins from GitHub"," enable <id> | disable <id> toggle a plugin without unregistering it"," unlink <id> unregister a linked plugin (files untouched)"," uninstall <id-or-spec> unregister + remove the managed checkout"," config-dir <id> print the plugin's config directory"," log <id> [-n <count>] tail the plugin's command-run log"," action list [--plugin <id>] declared actions"," action invoke <plugin-id.action-id> run an action now"," pane open --plugin <id> --entrypoint <pane-id> open a plugin pane as a terminal tab","","Marketplace: https://github.com/topics/rove-plugin (legacy kobe-plugin is included)",""].join(`
939
+ install: ${ZC0} plugin install <owner/repo[/subdir]> \u2014 browse: https://rove.sma1lboy.me/plugins`)}function QC0($){let Z=new Set;return $.filter((J)=>{let X=J.ref.toLowerCase();if(Z.has(X))return!1;return Z.add(X),!0})}var $C0=5000,ZC0,JC0;var O80=a(()=>{h4();ZC0=Q$(),JC0=[{ref:"Sma1lboy/kobe-plugins/notify",desc:"Desktop/ntfy notifications when an agent finishes or needs input"},{ref:"Sma1lboy/kobe-plugins/github-start",desc:"Start a Rove task from a GitHub issue or PR"},{ref:"Sma1lboy/kobe-plugins/worktree-include",desc:"Copy .worktreeinclude-matched files into new worktrees"},{ref:"Sma1lboy/kobe-plugins/linear-start",desc:"Pick a Linear issue (fzf) and start a task on its branch"},{ref:"Sma1lboy/kobe-plugins/lazygit",desc:"lazygit on the task worktree, as a pane tab"},{ref:"Sma1lboy/kobe-plugins/browser",desc:"Chromium rendered as terminal cells (carbonyl) in a pane tab"}]});var Mf={};g$(Mf,{updatePlugins:()=>BC0,printOutdated:()=>qC0,listOutdated:()=>vC});import{execFileSync as zC0}from"child_process";import{existsSync as L80,mkdirSync as YC0,readdirSync as GC0,renameSync as WC0}from"fs";import{join as Ff}from"path";function j80($,Z){try{return zC0("git",$,{cwd:Z,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function HC0($){let Z=$.source.spec.split("/").slice(0,2).join("/"),J=j80(["rev-parse","HEAD"],wH($.id)),X=j80(["ls-remote",`https://github.com/${Z}.git`,"HEAD"]),z=X?X.split(/\s+/)[0]??null:null;return{id:$.id,spec:$.source.spec,version:$.version,localSha:J,remoteSha:z,behind:Boolean(J&&z&&J!==z)}}function vC(){let $=j5().plugins.filter((Z)=>Z.source.kind==="github").map(HC0);return el($.filter((Z)=>Z.behind).map((Z)=>Z.id)),$}function qC0(){let $=vC();if($.length===0){console.log("no GitHub-installed plugins.");return}for(let Z of $){let J=Z.behind?"update available":Z.remoteSha===null?"remote unreachable":Z.localSha===null?"local sha unreadable":"up to date";console.log(`${Z.id} v${Z.version} ${J}`)}}function UC0($,Z){for(let J of[B3,_Q]){let X=J($),z=J(Z);if(!L80(X))continue;YC0(z,{recursive:!0});for(let G of GC0(X)){if(L80(Ff(z,G)))continue;WC0(Ff(X,G),Ff(z,G))}}YZ(fK(j5(),$)),console.log(`renamed ${$} \u2192 ${Z}: settings and state carried over, old entry unregistered`),console.log(` leftover checkout (safe to remove): ${EH($)}`)}async function BC0($,Z){let J=vC(),X;if(Z.all){if(X=J.filter((z)=>z.behind),X.length===0){console.log("all plugins up to date.");return}}else{if($.length===0)throw new r4("update takes plugin ids or --all");X=$.map((z)=>{let G=J.find((W)=>W.id===z);if(!G)throw new r4(`\`${z}\` is not a GitHub-installed plugin; see \`${Q$()} plugin list\``);return G})}for(let z of X){if(!z.behind&&!$.includes(z.id))continue;console.log(`updating ${z.id} (${z.spec})\u2026`);let G=await kC(z.spec,{yes:Z.yes});if(G!==z.id)UC0(z.id,G)}vC()}var Nf=a(()=>{JI();zZ();TJ();Kf();h4()});var V80={};g$(V80,{runPluginSubcommand:()=>PC0});import{spawnSync as KC0}from"child_process";import{readFileSync as FC0,rmSync as MC0}from"fs";function Of($){$.write([`usage: ${HX} plugin <command>`,""," install <owner/repo[/subdir]> [--yes] [--ref <rev>] clone from GitHub, preview, build, register"," link <dir> register a local plugin directory (dev)"," list installed + linked plugins"," search [query] browse the marketplace (GitHub topic rove-plugin)"," outdated check GitHub-installed plugins against upstream"," update <id\u2026> | --all [--yes] reinstall stale plugins from GitHub"," enable <id> | disable <id> toggle a plugin without unregistering it"," unlink <id> unregister a linked plugin (files untouched)"," uninstall <id-or-spec> unregister + remove the managed checkout"," config-dir <id> print the plugin's config directory"," log <id> [-n <count>] tail the plugin's command-run log"," action list [--plugin <id>] declared actions"," action invoke <plugin-id.action-id> run an action now"," pane open --plugin <id> --entrypoint <pane-id> open a plugin pane as a terminal tab","","Marketplace: https://github.com/topics/rove-plugin (legacy kobe-plugin is included)",""].join(`
940
940
  `))}function DM(){return j5().plugins.map(($)=>{try{return{entry:$,manifest:XZ($.root).manifest}}catch{return{entry:$,manifest:void 0}}})}function mC($){let Z=j5().plugins.find((J)=>J.id===$);if(!Z)throw new r4(`no plugin registered as \`${$}\`; see \`${HX} plugin list\``);return Z}function NC0(){let $=DM();if($.length===0){console.log(`no plugins installed. Try: ${HX} plugin install <owner/repo> \u2014 browse the \`rove-plugin\` GitHub topic.`);return}for(let{entry:Z,manifest:J}of $){let X=Z.enabled?"enabled":"disabled",z=Z.source.kind==="link"?`linked ${Z.root}`:Z.source.spec,G=J?"":" [manifest unreadable]";console.log(`${Z.id} v${Z.version} ${X} (${z})${G}`)}}function OC0($,Z){let J=mC($),X=j5();YZ({plugins:X.plugins.map((z)=>z.id===$?{...J,enabled:Z}:z)}),console.log(`${Z?"enabled":"disabled"} ${$}`)}function LC0($){let Z=mC($);if(Z.source.kind!=="link")throw new r4(`\`${$}\` is a GitHub install; use uninstall`);YZ(fK(j5(),$)),console.log(`unlinked ${$} (files untouched at ${Z.root})`)}function jC0($){let Z=j5(),J=Z.plugins.find((X)=>X.id===$||X.source.kind==="github"&&X.source.spec===$);if(!J)throw new r4(`no plugin registered as \`${$}\``);if(J.source.kind==="link")throw new r4(`\`${J.id}\` is linked; use unlink`);YZ(fK(Z,J.id)),MC0(wH(J.id),{recursive:!0,force:!0}),console.log(`uninstalled ${J.id} (config/state kept under ~/.kobe/plugins/${J.id}/)`)}function VC0($){for(let{entry:Z,manifest:J}of DM()){if(!J||$&&Z.id!==$)continue;for(let X of J.actions)console.log(`${DL(Z.id,X.id)} ${X.title}`)}}function _C0($,Z){let X=DM().filter(({entry:H,manifest:U})=>U&&H.enabled&&$.startsWith(`${H.id}.`)).sort((H,U)=>U.entry.id.length-H.entry.id.length).map(({entry:H,manifest:U})=>{let B=$.slice(H.id.length+1),N=U.actions.find((L)=>L.id===B);return N?{entry:H,action:N}:void 0}).find(Boolean);if(!X)throw new r4(`no action \`${$}\`; see \`${HX} plugin action list\``);let[z,...G]=[...X.action.command,...Z],W=KC0(z,G,{cwd:X.entry.root,stdio:"inherit",env:pq({socketPath:Q7(),binPath:HX,pluginId:X.entry.id,pluginRoot:X.entry.root,extra:{ROVE_PLUGIN_ACTION_ID:X.action.id,ROVE_PLUGIN_INVOKE_CWD:process.cwd()}})});process.exit(W.status??1)}function CC0($){let Z=DM().filter(({entry:J,manifest:X})=>X&&$.startsWith(`${J.id}.`)).sort((J,X)=>X.entry.id.length-J.entry.id.length).find(({entry:J,manifest:X})=>X.panes.some((z)=>z.id===$.slice(J.id.length+1)));if(!Z)throw new r4(`no pane \`${$}\`; see \`${HX} plugin list\``);return{pluginId:Z.entry.id,entrypoint:$.slice(Z.entry.id.length+1)}}async function DC0($,Z,J){let X=DM().find(({entry:B})=>B.id===$);if(!X?.manifest)throw new r4(`no plugin \`${$}\` (or its manifest is unreadable)`);if(!X.entry.enabled)throw new r4(`\`${$}\` is disabled`);let z=X.manifest.panes.find((B)=>B.id===Z);if(!z)throw new r4(`no pane \`${Z}\` in \`${$}\`; declare it under [[panes]]`);let G=rE(X.entry.id,X.entry.root,z,{socketPath:Q7(),binPath:HX}),{openDaemonSession:W}=await Promise.resolve().then(() => (gw(),d10)),{resolveActiveTaskId:H}=await Promise.resolve().then(() => (sq(),n00)),U=await W({mode:"start"});try{let B=J??await H(U.client);if(!B)throw new r4("no active task; pass --task <id>");await U.client.request("tab.open",{taskId:B,argv:G,title:z.title,placement:z.placement}),console.log(`opened pane ${$}.${z.id} in task ${B}`)}finally{U.close()}}function AC0($,Z){mC($);let J;try{J=FC0(xH($),"utf8")}catch{console.log("(no runs logged yet)");return}let X=J.trimEnd().split(`
941
941
  `);for(let z of X.slice(-Z))console.log(z)}function NG($,Z){let J=$.indexOf(Z);return J>=0?$[J+1]:void 0}async function PC0($){let[Z,...J]=$;try{switch(Z){case"install":{let X=J.find((z)=>!z.startsWith("-"));if(!X)throw new r4("install needs <owner/repo[/subdir]>");await kC(X,{yes:J.includes("--yes"),ref:NG(J,"--ref")});return}case"link":{if(!J[0])throw new r4("link needs a directory");F80(J[0]);return}case"list":NC0();return;case"search":{let{searchMarketplace:X}=await Promise.resolve().then(() => (O80(),N80));await X(J.find((z)=>!z.startsWith("-")));return}case"outdated":{let{printOutdated:X}=await Promise.resolve().then(() => (Nf(),Mf));X();return}case"update":{let{updatePlugins:X}=await Promise.resolve().then(() => (Nf(),Mf));await X(J.filter((z)=>!z.startsWith("-")),{all:J.includes("--all"),yes:J.includes("--yes")});return}case"enable":case"disable":{if(!J[0])throw new r4(`${Z} needs a plugin id`);OC0(J[0],Z==="enable");return}case"unlink":{if(!J[0])throw new r4("unlink needs a plugin id");LC0(J[0]);return}case"uninstall":{if(!J[0])throw new r4("uninstall needs a plugin id or owner/repo spec");jC0(J[0]);return}case"config-dir":{if(!J[0])throw new r4("config-dir needs a plugin id");mC(J[0]),console.log(B3(J[0]));return}case"log":{if(!J[0])throw new r4("log needs a plugin id");AC0(J[0],Number.parseInt(NG(J,"-n")??"20",10)||20);return}case"pane":{let[X,...z]=J;if(X==="open"){let G=z.find((U)=>!U.startsWith("-")&&U!==NG(z,"--task")),W=NG(z,"--plugin"),H=NG(z,"--entrypoint");if(!W||!H){if(!G)throw new r4("pane open needs <plugin-id.pane-id> (or --plugin <id> --entrypoint <pane-id>) [--task <task-id>]");({pluginId:W,entrypoint:H}=CC0(G))}await DC0(W,H,NG(z,"--task"));return}Of(process.stderr),process.exit(2);return}case"action":{let[X,...z]=J;if(X==="list"){VC0(NG(z,"--plugin"));return}if(X==="invoke"){if(!z[0])throw new r4("action invoke needs <plugin-id.action-id>");_C0(z[0],z.slice(1));return}Of(process.stderr),process.exit(2);return}default:{let X=Z===void 0||Z==="help"||Z==="--help"||Z==="-h";if(Of(X?process.stdout:process.stderr),!X)process.exit(2);return}}}catch(X){if(X instanceof r4)console.error(`${HX} plugin: ${X.message}`),process.exit(1);console.error(`${HX} plugin: ${N1(X)}`),process.exit(1)}}var HX;var _80=a(()=>{C2();I_();jQ();sE();zZ();TJ();Kf();h4();HX=Q$()});var D80={};g$(D80,{runOnboardingWizard:()=>TC0,WizardPage:()=>C80});import{TextAttributes as AM}from"@opentui/core";function C80($){let{theme:Z}=l0(),J=Z1(),X=I4(),z=$.shell===null?["skill"]:["completions","skill"],[G,W]=PM.useState(0),[H,U]=PM.useState(!0),[B,N]=PM.useState({}),[L,M]=PM.useState(!1),V=z[G];function A(E){X?.destroy(),$.onDone({completions:E.completions??!1,skill:E.skill??!1})}function _(E=H){if(L){A(B);return}let S={...B,[V]:E};if(N(S),G+1>=z.length){M(!0);return}W(G+1),U(!0)}g1(()=>({bindings:[{key:"up",cmd:()=>U(!0)},{key:"k",cmd:()=>U(!0)},{key:"down",cmd:()=>U(!1)},{key:"j",cmd:()=>U(!1)},{key:"return",cmd:()=>_()},...o2(()=>A(B))]}));function C(E){return E==="completions"?J("onboarding.completionsQuestion",{shell:$.shell??""}):J("onboarding.skillQuestion")}let y=V==="completions"?J("onboarding.completionsExplain"):J("onboarding.skillExplain");return T.jsxDEV("box",{flexDirection:"column",flexGrow:1,paddingTop:1,paddingLeft:2,paddingRight:2,children:[T.jsxDEV("text",{fg:Z.primary,attributes:AM.BOLD,wrapMode:"none",children:J("onboarding.title")},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:J("onboarding.subtitle")},void 0,!1,void 0,this),T.jsxDEV("box",{flexDirection:"column",paddingTop:1,children:[z.slice(0,L?z.length:G).map((E)=>T.jsxDEV("box",{flexDirection:"row",gap:1,children:[T.jsxDEV("text",{fg:Z.success,wrapMode:"none",children:"\u2713"},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"none",children:C(E)},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.text,wrapMode:"none",children:B[E]?J("onboarding.optionYes"):J("onboarding.optionNo")},void 0,!1,void 0,this)]},E,!0,void 0,this)),L?T.jsxDEV("box",{flexDirection:"column",onMouseUp:()=>_(),children:[T.jsxDEV("text",{fg:Z.text,attributes:AM.BOLD,wrapMode:"word",children:J("onboarding.keysTitle")},void 0,!1,void 0,this),cd(t3().key).map((E)=>T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:J(`onboarding.${E.msg}`,E.params)},E.msg,!1,void 0,this))]},void 0,!0,void 0,this):T.jsxDEV(T.Fragment,{children:[T.jsxDEV("text",{fg:Z.text,attributes:AM.BOLD,wrapMode:"word",children:C(V)},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:y},void 0,!1,void 0,this),[!0,!1].map((E)=>{let S=H===E;return T.jsxDEV("box",{flexDirection:"row",gap:1,paddingLeft:1,onMouseUp:()=>_(E),children:[T.jsxDEV("text",{fg:S?Z.primary:Z.textMuted,wrapMode:"none",children:S?"\u276F":" "},void 0,!1,void 0,this),T.jsxDEV("text",{fg:S?Z.primary:Z.textMuted,attributes:S?AM.BOLD:void 0,wrapMode:"none",children:E?J("onboarding.optionYes"):J("onboarding.optionNo")},void 0,!1,void 0,this)]},String(E),!0,void 0,this)})]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T.jsxDEV("box",{paddingTop:1,children:T.jsxDEV("text",{fg:Z.textMuted,attributes:AM.DIM,wrapMode:"none",children:J(L?"onboarding.keysLegend":"onboarding.legend")},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}async function TC0($){return await new Promise((Z)=>{oY({inlineRows:RC0,setup:()=>({root:()=>T.jsxDEV(C80,{shell:$,onDone:Z},void 0,!1,void 0,this)})})})}var PM,RC0=15;var A80=a(async()=>{FF();UZ();z$();r0();await e1([u4(),$$(),PF(),_4()]);PM=H1(q1(),1)});var w80={};g$(w80,{maybeRunOnboarding:()=>kC0,markOnboarded:()=>I80,isOnboarded:()=>S80,installCompletions:()=>T80,detectShell:()=>R80,applyOnboardingChoices:()=>E80});import{spawnSync as SC0}from"child_process";import{appendFileSync as IC0,existsSync as EC0,mkdirSync as wC0,readFileSync as xC0,writeFileSync as fC0}from"fs";import{homedir as gC0}from"os";import{basename as yC0,join as Lf}from"path";function R80($=process.env){let Z=yC0($.SHELL??"");return Z==="zsh"||Z==="bash"||Z==="fish"?Z:null}function T80($,Z=gC0()){if($==="fish"){let z=Lf(Z,".config","fish","completions"),G=Lf(z,"rove.fish");return wC0(z,{recursive:!0}),fC0(G,`rove completions fish | source
942
942
  `),G}let J=Lf(Z,$==="zsh"?".zshrc":".bashrc");if(!(EC0(J)?xC0(J,"utf8"):"").includes(bC0)){let z=`
package/dist/cli/rove.js CHANGED
@@ -288,7 +288,7 @@ trust_level = "trusted"
288
288
  `)){if(!J.trim())continue;try{let{sessionId:X,sessionDir:z,workDir:G}=JSON.parse(J);if(X&&z&&G)Z.push({sessionId:X,sessionDir:z,workDir:G})}catch{}}return Z}async function lk($){let Z=await $.readFile(uL.join($.kimiDir(),"session_index.jsonl")).catch(()=>"");return KX0(Z)}function pk($){return uL.join($,"agents","main","wire.jsonl")}async function CR($,Z=_R){if(!$)return[];let J=[];for(let X of await lk(Z)){if(X.workDir!==$)continue;let z=await Z.stat(pk(X.sessionDir)).then((G)=>G.mtimeMs).catch(()=>null);if(z===null)continue;J.push({id:X.sessionId,mtimeMs:z})}return J.sort((X,z)=>X.mtimeMs-z.mtimeMs).map((X)=>X.id)}async function nk($,Z=_R){return await Z.stat($).then((J)=>J.mtimeMs).catch(()=>0)}async function DR($,Z=_R){if(!$)return null;let J=(await lk(Z)).find((z)=>z.sessionId===$);if(!J)return null;let X=pk(J.sessionDir);return await Z.stat(X).then(()=>X).catch(()=>null)}var _R;var ik=a(()=>{AQ();_R={kimiDir(){return process.env.KIMI_CODE_HOME?.trim()||uL.join(BX0(),".kimi-code")},async readFile($){return await DQ($)},stat:UX0}});import MX0 from"path";var cL,ok,ak,rk,sk;var tk=a(()=>{NR();kL();dk();ik();cL={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},ok={async listSessionIdsForWorktree($){return[...await hH($)].sort((J,X)=>J.mtimeMs-X.mtimeMs).map((J)=>J.sessionId)},readHistory:($)=>kk($),async transcriptPath($,Z){return(await hH(Z)).find((X)=>X.sessionId===$)?.path??null},latestTranscriptMtimeForWorktree:($)=>bk($)},ak={listSessionIdsForWorktree:($)=>Vk($),readHistory:($)=>Ck($),transcriptPath:async($)=>await BR($)??null,latestTranscriptMtimeForWorktree:($)=>_k($)},rk={listSessionIdsForWorktree:($)=>hk($),readHistory:($)=>ck($),async transcriptPath($){let Z=await jR($);return Z?MX0.join(Z,"events.jsonl"):null},latestTranscriptMtimeForWorktree:($)=>uk($)},sk={listSessionIdsForWorktree:($)=>CR($),readHistory:cL.readHistory,transcriptPath:($)=>DR($),async latestTranscriptMtimeForWorktree($){let J=(await CR($)).at(-1);if(!J)return 0;let X=await DR(J);return X?await nk(X):0}}});import{createHash as NX0}from"crypto";import{existsSync as OX0,mkdirSync as LX0,writeFileSync as jX0}from"fs";import{homedir as ek}from"os";import AR from"path";function VX0($,Z=ek()){let J=NX0("sha256").update($).digest("hex").slice(0,12);return AR.join(Z,".kimi-code","workspace-trust",`wd_${AR.basename($)}_${J}`)}function $v($,Z=ek()){let J=VX0($,Z);if(OX0(J))return;LX0(AR.dirname(J),{recursive:!0,mode:448}),jX0(J,JSON.stringify({root:$,trustedAt:Date.now()}),{mode:384})}var Zv=()=>{};import{readFile as Xv,stat as _X0}from"fs/promises";class dL{supportsCompletionMarkers(){return!0}async latestCompletion($){return(await this.latestActivity($)).marker}async latestActivityInFile($){return null}}function Qv($){return E$($).createTurnDetector()}function Jv($,Z="claude",J=0){let X=null,z=0;for(let G of $.split(`
289
289
  `)){z++;let W=Yv(G);if(!W)continue;let H=TR(W.message)?W.message:W;if(H.role!=="assistant")continue;if(!("content"in H))continue;let U=Gv(W,J),B={id:`claude:${Z}:${U}:${z}`,timestampMs:U,source:"claude"};if(!X||B.timestampMs>=X.timestampMs)X=B}return X}function PX0($){if($.type==="turn.completed")return!0;if($.type!=="event_msg")return!1;let Z=TR($.payload)?$.payload:void 0;return typeof Z?.type==="string"&&AX0.has(Z.type)}function RX0($,Z="codex"){let J=null,X=0;for(let z of $.split(`
290
290
  `)){X++;let G=Yv(z);if(!G||!PX0(G))continue;let W=Gv(G,0),H={id:`codex:${Z}:${W}:${X}`,timestampMs:W,source:"codex"};if(!J||H.timestampMs>=J.timestampMs)J=H}return J}function Yv($){let Z=$.trim();if(!Z)return null;try{let J=JSON.parse(Z);return TR(J)?J:null}catch{return null}}function Gv($,Z){let J=typeof $.timestamp==="string"?Date.parse($.timestamp):Number.NaN;return Number.isFinite(J)?J:Z}function TR($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var zv=($)=>_X0($).then((Z)=>Z.mtimeMs,()=>0),CX0,PR,DX0,RR,uK,AX0;var SR=a(()=>{NR();kL();A2();CX0={listSessionFiles:($)=>hH($),readFile:($)=>Xv($,"utf8"),statMtimeMs:zv};PR=class PR extends dL{deps;vendor="claude";cache=new Map;constructor($=CX0){super();this.deps=$}async latestActivity($){let Z=await this.deps.listSessionFiles($),J=Z[0]?.mtimeMs??0,X=null,z=new Map;for(let G of Z.slice(0,4)){let W=this.cache.get(G.path),H;if(W&&G.mtimeMs>0&&W.mtimeMs===G.mtimeMs)H=W.marker;else{let U=await this.deps.readFile(G.path).catch(()=>"");H=Jv(U,G.path,G.mtimeMs)}if(z.set(G.path,{mtimeMs:G.mtimeMs,marker:H}),H&&(!X||H.timestampMs>X.timestampMs))X=H}return this.cache=z,{marker:X,mtimeMs:J}}async latestActivityInFile($){let Z=await(this.deps.statMtimeMs??zv)($);if(Z===0)return null;let J=await this.deps.readFile($).catch(()=>"");return{marker:Jv(J,$,Z),mtimeMs:Z}}};DX0={findLatestRollout:($)=>KR($),readFile:($)=>Xv($,"utf8")};RR=class RR extends dL{deps;vendor="codex";cache=null;constructor($=DX0){super();this.deps=$}async latestActivity($){if(!$)return{marker:null,mtimeMs:0};let Z=await this.deps.findLatestRollout($);if(!Z)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===Z.path&&Z.mtimeMs>0&&this.cache.mtimeMs===Z.mtimeMs)return{marker:this.cache.marker,mtimeMs:Z.mtimeMs};let J=await this.deps.readFile(Z.path).catch(()=>"");if(!J)return{marker:null,mtimeMs:Z.mtimeMs};let X=RX0(J,Z.path);return this.cache={path:Z.path,mtimeMs:Z.mtimeMs,marker:X},{marker:X,mtimeMs:Z.mtimeMs}}};uK=class uK extends dL{vendor;constructor($){super();this.vendor=$}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};AX0=new Set(["task_complete","turn_complete","turn_aborted"])});function TX0($){return{vendor:$,builtin:!1,displayName:$,defaultCommand:[$],history:cL,detectAccount:async()=>({binary:{found:!1,error:"custom engine: Rove has no account detector for it"},account:{kind:"none"}}),createHookAdapter:()=>new cK($),createTurnDetector:()=>new uK($)}}function E$($){return u2($)?IR[$]:TX0($)}function Wv($){return E$($).history.readHistory!==cL.readHistory}function ER($){let Z=E$($).terminalTitle?.statusPrefixes;return Z&&Z.length>0?Z:Hv}function SQ($,Z){let J=Z?ER(Z):Hv;for(let X of[...J].sort((z,G)=>G.length-z.length)){if(!$.startsWith(X))continue;let z=$.slice(X.length).trimStart();if(z.length===0)return $;return z}return $}function lL($,Z){let J=E$($).terminalTitle,X=J?.workingPrefixes;if(J?.ownsStatus!==!0||!X||X.length===0)return null;let z=Z.trim();if(z.length===0)return null;return X.some((G)=>z.startsWith(G))?"working":"rest"}function qv(){return Object.values(IR).filter(($)=>$.quotaUsage).map(($)=>$.vendor)}var IR,Hv;var A2=a(()=>{c2();IJ();cb();ab();Zk();Xk();Yk();Wk();Rk();Ik();tk();wR();Zv();SR();IR={claude:{vendor:"claude",builtin:!0,displayName:"Claude",defaultCommand:["claude"],history:ok,detectAccount:($)=>fH($),createHookAdapter:()=>new $R,createTurnDetector:()=>new PR,capabilities:hb,identity:ub,trustWorktree:Jk,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},quotaUsage:()=>$k()},codex:{vendor:"codex",builtin:!0,displayName:"Codex",defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],history:ak,detectAccount:($)=>gH($),createHookAdapter:()=>new QR,createTurnDetector:()=>new RR,capabilities:Qk,identity:zk,trustWorktree:Sk,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:()=>Pk()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:rk,detectAccount:($)=>yH($),createHookAdapter:()=>new cK("copilot"),createTurnDetector:()=>new uK("copilot")},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:$v,history:sk,detectAccount:($)=>wL($),createHookAdapter:()=>new cK("kimi"),createTurnDetector:()=>new uK("kimi")}};Hv=[...new Set(Object.values(IR).flatMap(($)=>$.terminalTitle?.statusPrefixes??[]))]});function xR($){return E$($).createHookAdapter()}class cK{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 wR=a(()=>{A2()});function pL($){return SX0.includes($)}function Uv($){return IX0.includes($)}var SX0,IX0;var fR=a(()=>{SX0=["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"];IX0=["session-start","turn-start","turn-complete","turn-failed","turn-interrupted","awaiting-input","session-end"]});var Dv={};g$(Dv,{runHookSubcommand:()=>yX0,readTextWithTimeout:()=>Mv,parseWorktreeRemovePath:()=>jv,parseWorktreeAddPath:()=>Lv,ensureGlobalKobeHooks:()=>yR});import{homedir as EX0}from"os";import{join as Fv,resolve as gR}from"path";async function Mv($,Z=wX0){let J;try{return await Promise.race([$(),new Promise((X)=>{J=setTimeout(()=>X(""),Z)})])}finally{if(J!==void 0)clearTimeout(J)}}async function Nv(){try{let $=await Mv(()=>Bun.stdin.text());if(!$.trim())return{};let Z=JSON.parse($);return Z&&typeof Z==="object"&&!Array.isArray(Z)?Z:{}}catch{return{}}}function Bv($,Z){for(let J=0;J<$.length;J++){if($[J]===Z)return $[J+1];if($[J].startsWith(`${Z}=`))return $[J].slice(Z.length+1)}return}function fX0($){return!!$&&typeof $==="object"&&!Array.isArray($)}function Ov($){let Z=[],J=/"([^"]*)"|'([^']*)'|(\S+)/g,X;while((X=J.exec($))!==null)Z.push(X[1]??X[2]??X[3]??"");return Z}function Lv($){let Z=Ov($),J=new Set(["-b","-B","--reason"]);for(let X=0;X+1<Z.length;X++){if(Z[X]!=="worktree"||Z[X+1]!=="add")continue;let z=X+2;while(z<Z.length){let G=Z[z];if(G==="&&"||G==="||"||G===";"||G==="|"||G===">"||G===">>")break;if(G.startsWith("-")){z+=J.has(G)?2:1;continue}return G}}return}function jv($){let Z=Ov($);for(let J=0;J+1<Z.length;J++){if(Z[J]!=="worktree"||Z[J+1]!=="remove")continue;let X=J+2;while(X<Z.length){let z=Z[X];if(z==="&&"||z==="||"||z===";"||z==="|"||z===">"||z===">>")break;if(z.startsWith("-")){X+=1;continue}return z}}return}async function gX0(){let $=await Nv(),Z=fX0($.tool_input)?$.tool_input:{},J=typeof Z.command==="string"?Z.command:"";if(!J.includes("worktree"))return;let X=typeof $.cwd==="string"&&$.cwd?$.cwd:process.cwd(),z=Lv(J),G=z?void 0:jv(J);if(!z&&!G)return;let W=await BQ();if(!W)return;try{if(z)await W.request("worktree.reconcile",{cwd:X,worktreePath:gR(X,z)});else if(G)await W.request("worktree.archiveRemoved",{worktreePath:gR(X,G)})}finally{W.close()}}async function yX0($){let[Z,...J]=$;if(Z==="setup"){await mX0(J);return}if(Z===xX0){try{await gX0()}catch{}return}try{if(!Z||!pL(Z))return;let X=await Nv(),z=Bv(J,"--task-id"),G=typeof X.cwd==="string"&&X.cwd?X.cwd:process.cwd(),W=process.env.KOBE_TASK_ID,H=process.env.KOBE_TAB_ID,U=Bv(J,"--engine"),B=Vv().filter((V)=>!U||V.vendor===U),N;for(let V of B)if(N=V.activityDetailFromPayload(Z,X),N)break;let L;for(let V of B)if(L=V.sessionFromPayload(X),L)break;let M=await BQ();if(!M)return;try{let V=z??W;await M.request("engine.reportEvent",{...V?{taskId:V}:{cwd:G},kind:Z,...U?{engine:U}:{},...H?{tabId:H}:{},...N?{detail:N}:{},...L?{sessionId:L.sessionId}:{},...L?.transcriptPath?{transcriptPath:L.transcriptPath}:{}})}finally{M.close()}}catch(X){if(process.env.KOBE_HOOK_DEBUG)console.error(`[rove hook] ${Z} failed:`,X instanceof Error?X.message:String(X))}}function bX0(){return T8.map(($)=>xR($)).filter(($)=>$.supportsWorktreeSync())}function Vv(){return T8.map(($)=>xR($)).filter(($)=>$.supportsHooks())}function _v(){return Fv(EX0(),".claude","settings.json")}function kX0($){if(!$||$==="off")return;if($==="global")return _v();if($.startsWith("repo:"))return Fv(gR($.slice(5)),".claude","settings.json");return $}async function yR(){try{let $=vX0();for(let Z of Vv()){let J=Z.globalSettingsPath();if(!J)continue;await Z.installActivityHooks(J,{toolEvents:$}),await Z.installWorktreeWatchHook(J)}await Cv()}catch{}}function vX0(){try{for(let $ of j5().plugins){if(!$.enabled)continue;try{if(XZ($.root).manifest.events.some((Z)=>Z.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function Cv(){let $=bX0();if($.length===0)return;let Z=d2(Kv),J=new Set([_v()]),X=kX0(Z);if(X)J.add(X);for(let z of $)for(let G of J)await z.removeWorktreeSyncHook(G);if(Z!=="off")o3(Kv,"off")}async function mX0($){await Cv(),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(`
291
- `))}var wX0=500,xX0="worktree-created",Kv="externalWorktreeSync";var bR=a(()=>{D7();jQ();TJ();wR();fR();b4();c2()});var nL;var Av=a(()=>{nL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.105",description:"Rove \u2014 the terminal-native agent multiplexer",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.14","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var Rv={};g$(Rv,{repoSlug:()=>_Y,releasePageUrl:()=>cR,recommendedGlobalInstallCommand:()=>mR,isNewerSemver:()=>kR,fetchReleaseSummaries:()=>lK,fetchReleaseNotesRange:()=>uR,fetchReleaseNotes:()=>hR,compareSemver:()=>K3,checkLatestVersion:()=>CY,breakingVersionsCrossed:()=>dK,UPDATE_SCRIPT_URL:()=>iL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>vR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>wJ});function _Y(){let $=nL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function mR(){return`npm install -g ${vR}@latest`}function dK($,Z,J=wJ){let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}async function uX0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),oL);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function kR($,Z){return K3($,Z)>0}function K3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function CY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:D$,latest:Z,hasUpdate:kR(Z,D$)};if(BH()&&!$.force)return null;let J=await uX0(vR);if(!J)return null;return{current:D$,latest:J,hasUpdate:kR(J,D$)}}function Pv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function hR($){let Z=_Y();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),oL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function uR($){let Z=_Y();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),oL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Pv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(K3(U,$.current)<=0)return null;if(K3(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 lK($=12){let Z=_Y();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),oL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Pv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function cR($){let Z=_Y();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,vR,iL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,wJ,oL=3000;var x8=a(()=>{Av();L5();D$=nL.version,vR=nL.name;WZ=`curl -fsSL ${iL} | sh`;wJ=[]});var Sv={};g$(Sv,{stampResetGate:()=>aL,resetGateBlockers:()=>Tv,enforceResetGate:()=>lR,LAST_RUN_VERSION_KEY:()=>dR});function Tv($,Z=D$,J=wJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}function lR(){let $=Q$(),Z=M4()[dR],J=Tv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
291
+ `))}var wX0=500,xX0="worktree-created",Kv="externalWorktreeSync";var bR=a(()=>{D7();jQ();TJ();wR();fR();b4();c2()});var nL;var Av=a(()=>{nL={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.8.106",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",type:"module",packageManager:"bun@1.3.13",bin:{kobe:"dist/cli/kobe.js",rove:"dist/cli/rove.js"},files:["dist/cli","dist/web-ui","dist/skills","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://github.com/Sma1lboy/rove#readme",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:kobe":"KOBE_DEV=1 bun --conditions=browser ./src/cli/kobe.ts","dev:mock":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react":"KOBE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:mock-react-task-dialogs":"KOBE_DEV=1 bun ./src/tui-react/component/mock-dialogs-host.tsx","dev:mock-react-filetree":"KOBE_DEV=1 bun ./src/tui-react/panes/filetree/mock-host.tsx","dev:mock-react-sidebar":"KOBE_DEV=1 bun ./src/tui-react/panes/sidebar/mock-host.tsx","dev:mock-react-terminal":"KOBE_DEV=1 bun ./src/tui-react/panes/terminal/mock-host.tsx","dev:mock-react-dialogs":"KOBE_DEV=1 bun ./src/tui-react/mock/dialogs-host.tsx","dev:mock-react-workspace":"KOBE_DEV=1 bun ./src/tui-react/workspace/mock-host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:with-web":"bun run build",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"KOBE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"KOBE_INCLUDE_SOCKET=1 KOBE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"KOBE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun test test/render --coverage --coverage-reporter=text --coverage-reporter=lcov --coverage-dir=coverage-render",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0","node-pty":"^1.1.0",react:"^19.2.8",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.14","@tsconfig/bun":"1.0.10","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","kobe-web":"workspace:*","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var Rv={};g$(Rv,{repoSlug:()=>_Y,releasePageUrl:()=>cR,recommendedGlobalInstallCommand:()=>mR,isNewerSemver:()=>kR,fetchReleaseSummaries:()=>lK,fetchReleaseNotesRange:()=>uR,fetchReleaseNotes:()=>hR,compareSemver:()=>K3,checkLatestVersion:()=>CY,breakingVersionsCrossed:()=>dK,UPDATE_SCRIPT_URL:()=>iL,UPDATE_COMMAND:()=>WZ,PACKAGE_NAME:()=>vR,CURRENT_VERSION:()=>D$,BREAKING_VERSIONS:()=>wJ});function _Y(){let $=nL.repository?.url;if(!$)return null;let Z=$.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!Z||!Z[1]||!Z[2])return null;return`${Z[1]}/${Z[2]}`}function mR(){return`npm install -g ${vR}@latest`}function dK($,Z,J=wJ){let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}async function uX0($){let Z=new AbortController,J=setTimeout(()=>Z.abort(),oL);try{let X=$.replace("/","%2F"),z=await fetch(`https://registry.npmjs.org/${X}/latest`,{signal:Z.signal,headers:{accept:"application/json"}});if(!z.ok)return null;let G=await z.json();if(typeof G.version!=="string")return null;return G.version}catch{return null}finally{clearTimeout(J)}}function kR($,Z){return K3($,Z)>0}function K3($,Z){let J=(G)=>G.split("-")[0]??G,X=J($).split(".").map((G)=>Number.parseInt(G,10)),z=J(Z).split(".").map((G)=>Number.parseInt(G,10));for(let G=0;G<3;G++){let W=X[G]??0,H=z[G]??0;if(Number.isNaN(W)||Number.isNaN(H))return 0;if(W>H)return 1;if(W<H)return-1}return 0}async function CY($={}){let Z=process.env.KOBE_FAKE_UPDATE;if(Z)return{current:D$,latest:Z,hasUpdate:kR(Z,D$)};if(BH()&&!$.force)return null;let J=await uX0(vR);if(!J)return null;return{current:D$,latest:J,hasUpdate:kR(J,D$)}}function Pv($){if(typeof $!=="string")return null;return $.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function hR($){let Z=_Y();if(!Z)return null;let J=`v${$}`,X=new AbortController,z=setTimeout(()=>X.abort(),oL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases/tags/${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return null;let W=await G.json();if(typeof W.body!=="string"||typeof W.html_url!=="string")return null;return{body:W.body,url:W.html_url,version:$}}catch{return null}finally{clearTimeout(z)}}async function uR($){let Z=_Y();if(!Z)return[];let J=$.limit??100,X=new AbortController,z=setTimeout(()=>X.abort(),oL);try{let G=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${J}`,{signal:X.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!G.ok)return[];let W=await G.json();if(!Array.isArray(W))return[];return W.map((H)=>{let U=Pv(H.tag_name);if(!U||typeof H.html_url!=="string"||typeof H.body!=="string")return null;if(K3(U,$.current)<=0)return null;if(K3(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 lK($=12){let Z=_Y();if(!Z)return[];let J=new AbortController,X=setTimeout(()=>J.abort(),oL);try{let z=await fetch(`https://api.github.com/repos/${Z}/releases?per_page=${$}`,{signal:J.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!z.ok)return[];let G=await z.json();if(!Array.isArray(G))return[];return G.map((W)=>{let H=Pv(W.tag_name);if(!H||typeof W.html_url!=="string")return null;return{version:H,url:W.html_url}}).filter((W)=>W!==null)}catch{return[]}finally{clearTimeout(X)}}function cR($){let Z=_Y();if(!Z)return null;return`https://github.com/${Z}/releases/tag/v${$}`}var D$,vR,iL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",WZ,wJ,oL=3000;var x8=a(()=>{Av();L5();D$=nL.version,vR=nL.name;WZ=`curl -fsSL ${iL} | sh`;wJ=[]});var Sv={};g$(Sv,{stampResetGate:()=>aL,resetGateBlockers:()=>Tv,enforceResetGate:()=>lR,LAST_RUN_VERSION_KEY:()=>dR});function Tv($,Z=D$,J=wJ){if(typeof $!=="string"||$.length===0)return[];let[X,z]=K3($,Z)<=0?[$,Z]:[Z,$];return J.filter((G)=>K3(G,X)>0&&K3(G,z)<=0)}function lR(){let $=Q$(),Z=M4()[dR],J=Tv(Z);if(J.length>0){let X=typeof Z==="string"?Z:"unknown";console.error([`${$} ${D$}: cannot start \u2014 version ${J.join(", ")} introduced breaking changes`,`(last run: ${X}). Your daemon/session state may be incompatible.`,"","Run:",` ${$} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${$} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
292
292
  `)),process.exit(1)}if(Z!==D$)aL()}function aL(){try{A7({[dR]:D$})}catch{}}var dR="app.lastRunVersion";var rL=a(()=>{P7();x8();h4()});import{existsSync as Ev,readFileSync as cX0}from"fs";import{homedir as dX0}from"os";import{join as wv,resolve as Iv}from"path";import{fileURLToPath as lX0}from"url";function iR($=process.env){return`${Q$($)} skill install`}function sL(){let $=lX0(import.meta.url);return[Iv($,"../../../../../.agents/skills/kobe"),Iv($,"../../skills/rove")].find((J)=>Ev(wv(J,"SKILL.md")))??null}function tL($={}){let Z=$.source!==void 0?$.source:sL(),J=$.agent===void 0?[]:typeof $.agent==="string"?[$.agent]:$.agent;return["skills","add",Z??nX0,"--skill",p3,...$.global===!1?[]:["--global"],...J.flatMap((X)=>["--agent",X])]}function DY($={}){return`npx ${tL($).join(" ")}`}async function oR($,Z){return await Bun.spawn(["npx",...tL({...$===void 0?{}:{agent:$},global:Z})],{stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited}function eL($={}){let Z=$.home??dX0(),J=$.cwd??process.cwd();return[Z,J].flatMap((X)=>pX0.map((z)=>wv(X,z)))}function iX0($){let Z=$.match(/(?:rove|kobe)-skill-version:\s*(\d+)/);return Z?Number.parseInt(Z[1],10):null}function pK($){let Z=eL($).find((z)=>Ev(z));if(!Z)return{installed:!1,installedVersion:null,currentVersion:pR,stale:!1};let J=null;try{J=iX0(cX0(Z,"utf8"))}catch{J=null}let X=J===null||J<pR;return{installed:!0,installedVersion:J,currentVersion:pR,stale:X}}function oX0(){return new Promise(($)=>{process.stdin.resume(),process.stdin.once("data",(Z)=>{process.stdin.pause(),$(String(Z))})})}async function xv($={}){let Z=Q$(),J=iR(),X=pK();if(!X.installed){if(d2(nR)==="1")return;o3(nR,"1"),process.stderr.write(`
293
293
  ${Z}: the Rove agent skill isn't installed \u2014 install it so your coding agent can drive Rove via \`${Z} api\`:
294
294
  ${J}
@@ -936,7 +936,7 @@ Options:
936
936
  -h, --help Show this help.
937
937
  `});import{spawnSync as H80}from"child_process";import{existsSync as d_0,mkdirSync as Bf,readFileSync as q80,renameSync as l_0,rmSync as W80}from"fs";import{mkdtempSync as p_0}from"fs";import{tmpdir as n_0}from"os";import{basename as i_0,join as bC,resolve as o_0}from"path";import{createInterface as a_0}from"readline/promises";function c8($){throw new r4($)}function U80($){let Z=IH($);if(!Z)c8(`no ${CL.join(" or ")} found at ${$}`);let J=q80(Z,"utf8");return{...wK(J,i_0(Z)),manifestPath:Z,manifestSource:J}}function B80($){let Z=$.manifest.minKobeVersion;if(K3(D$,Z)<0)c8(`plugin requires Rove >= ${Z} (this is ${D$}); update Rove first`)}function s_0($,Z){let J=$.manifest;console.log(`
938
938
  ${J.name} (${J.id}) v${J.version} \u2014 ${J.description??"no description"}`),console.log(`source: ${Z}`);let X=(z,G)=>{for(let W of G)console.log(` ${z}: ${W.command.join(" ")}`)};X("build",J.build),X("startup",J.startup);for(let z of J.actions)console.log(` action ${z.id}: ${z.command.join(" ")}`);for(let z of J.events)console.log(` on ${z.on}: ${z.command.join(" ")}`);for(let z of $.warnings)console.log(` warning: ${z}`);console.log("")}async function t_0($){if($)return;if(!process.stdin.isTTY)c8("refusing to install without confirmation in a non-interactive terminal; pass --yes");let Z=a_0({input:process.stdin,output:process.stdout}),J=(await Z.question("Install this plugin and run its build commands? [y/N] ")).trim().toLowerCase();if(Z.close(),J!=="y"&&J!=="yes")c8("aborted")}function Uf($,Z){if(H80("git",$,{cwd:Z,stdio:["ignore","inherit","inherit"]}).status!==0)c8(`git ${$[0]} failed`)}function e_0($,Z){let J=RJ();for(let[X,z]of $.manifest.build.entries()){if(!QZ(z,$.manifest,J))continue;let[G,...W]=z.command;console.log(`build[${X}]: ${z.command.join(" ")}`);let H=H80(G,W,{cwd:Z,stdio:["ignore","inherit","inherit"]});if(H.status!==0)c8(`build[${X}] failed (exit ${H.status??"spawn error"}); plugin not registered`)}}function K80($){YZ(Vb(j5(),$)),Bf(B3($.id),{recursive:!0}),Bf(_Q($.id),{recursive:!0})}async function kC($,Z){let J=$.match(r_0);if(!J)c8(`install takes GitHub shorthand (owner/repo[/subdir]), got \`${$}\``);let[,X,z,G]=J,W=G?.replace(/^\//,""),H=p_0(bC(n_0(),"kobe-plugin-"));try{let U=`https://github.com/${X}/${z}.git`;if(console.log(`cloning ${U}${Z.ref?` @ ${Z.ref}`:""}`),Z.ref)Uf(["clone","--quiet",U,H]),Uf(["checkout","--quiet",Z.ref],H);else Uf(["clone","--quiet","--depth","1",U,H]);let B=W?bC(H,W):H,N=U80(B);B80(N);let L=N.manifest.id,M=j5().plugins.find((C)=>C.id===L);if(M?.source.kind==="link")c8(`\`${L}\` is locally linked at ${M.root}; unlink it first`);if(!QZ({},N.manifest,RJ()))c8(`plugin declares platforms [${N.manifest.platforms?.join(", ")}]; this machine is unsupported`);s_0(N,`github.com/${X}/${z}${W?`/${W}`:""}`),await t_0(Z.yes),e_0(N,B);let V=IH(B);if(!V)c8("manifest disappeared during build; aborting");if(V!==N.manifestPath)c8("manifest changed during build; aborting");if(q80(V,"utf8")!==N.manifestSource)c8("manifest changed during build; aborting");let _=wH(L);return W80(_,{recursive:!0,force:!0}),Bf(bC(_,".."),{recursive:!0}),l_0(H,_),K80({id:L,source:{kind:"github",spec:$},root:W?bC(_,W):_,enabled:!0,version:N.manifest.version,installedAt:Date.now()}),console.log(`installed ${L} v${N.manifest.version}`),L}finally{W80(H,{recursive:!0,force:!0})}}function F80($){let Z=o_0($);if(!d_0(Z))c8(`no such directory: ${Z}`);let J=U80(Z);B80(J);let X=J.manifest.id;if(j5().plugins.find((G)=>G.id===X)?.source.kind==="github")c8(`\`${X}\` is installed from GitHub; uninstall it before linking a local copy`);for(let G of J.warnings)console.log(`warning: ${G}`);K80({id:X,source:{kind:"link"},root:Z,enabled:!0,version:J.manifest.version,installedAt:Date.now()}),console.log(`linked ${X} v${J.manifest.version} \u2192 ${Z}`)}var r_0,r4;var Kf=a(()=>{jQ();zZ();TJ();x8();r_0=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)(\/.+)?$/;r4=class r4 extends Error{}});var N80={};g$(N80,{searchMarketplace:()=>XC0});async function M80($,Z){let J=encodeURIComponent(`topic:${$}${Z?` ${Z}`:""}`),X=new AbortController,z=setTimeout(()=>X.abort(),$C0);try{let G=await fetch(`https://api.github.com/search/repositories?q=${J}&sort=stars&order=desc&per_page=50`,{signal:X.signal,headers:{accept:"application/vnd.github+json"}});if(!G.ok)return null;let W=await G.json();if(!Array.isArray(W.items))return null;return W.items.filter((H)=>typeof H.full_name==="string").map((H)=>({ref:H.full_name,desc:H.description??"",stars:H.stargazers_count}))}catch{return null}finally{clearTimeout(z)}}async function XC0($){let Z=await Promise.all([M80("rove-plugin",$),M80("kobe-plugin",$)]),J=$?.toLowerCase(),X=JC0.filter((W)=>!J||`${W.ref} ${W.desc}`.toLowerCase().includes(J)).map((W)=>({...W,firstParty:!0})),z=QC0([...X,...Z.flatMap((W)=>W??[])]);if(Z.every((W)=>W===null))console.error("(GitHub search unreachable \u2014 showing first-party plugins only)");if(z.length===0){console.log($?`no plugins match \`${$}\``:"no plugins found");return}let G=Math.min(48,Math.max(...z.map((W)=>W.ref.length))+2);for(let W of z){let H=W.stars!==void 0?`\u2605${W.stars}`:W.firstParty?"first-party":"";console.log(`${W.ref.padEnd(G)}${H.padEnd(12)}${W.desc}`)}console.log(`
939
- install: ${ZC0} plugin install <owner/repo[/subdir]> \u2014 browse: https://kobe.sma1lboy.me/plugins`)}function QC0($){let Z=new Set;return $.filter((J)=>{let X=J.ref.toLowerCase();if(Z.has(X))return!1;return Z.add(X),!0})}var $C0=5000,ZC0,JC0;var O80=a(()=>{h4();ZC0=Q$(),JC0=[{ref:"Sma1lboy/kobe-plugins/notify",desc:"Desktop/ntfy notifications when an agent finishes or needs input"},{ref:"Sma1lboy/kobe-plugins/github-start",desc:"Start a Rove task from a GitHub issue or PR"},{ref:"Sma1lboy/kobe-plugins/worktree-include",desc:"Copy .worktreeinclude-matched files into new worktrees"},{ref:"Sma1lboy/kobe-plugins/linear-start",desc:"Pick a Linear issue (fzf) and start a task on its branch"},{ref:"Sma1lboy/kobe-plugins/lazygit",desc:"lazygit on the task worktree, as a pane tab"},{ref:"Sma1lboy/kobe-plugins/browser",desc:"Chromium rendered as terminal cells (carbonyl) in a pane tab"}]});var Mf={};g$(Mf,{updatePlugins:()=>BC0,printOutdated:()=>qC0,listOutdated:()=>vC});import{execFileSync as zC0}from"child_process";import{existsSync as L80,mkdirSync as YC0,readdirSync as GC0,renameSync as WC0}from"fs";import{join as Ff}from"path";function j80($,Z){try{return zC0("git",$,{cwd:Z,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function HC0($){let Z=$.source.spec.split("/").slice(0,2).join("/"),J=j80(["rev-parse","HEAD"],wH($.id)),X=j80(["ls-remote",`https://github.com/${Z}.git`,"HEAD"]),z=X?X.split(/\s+/)[0]??null:null;return{id:$.id,spec:$.source.spec,version:$.version,localSha:J,remoteSha:z,behind:Boolean(J&&z&&J!==z)}}function vC(){let $=j5().plugins.filter((Z)=>Z.source.kind==="github").map(HC0);return el($.filter((Z)=>Z.behind).map((Z)=>Z.id)),$}function qC0(){let $=vC();if($.length===0){console.log("no GitHub-installed plugins.");return}for(let Z of $){let J=Z.behind?"update available":Z.remoteSha===null?"remote unreachable":Z.localSha===null?"local sha unreadable":"up to date";console.log(`${Z.id} v${Z.version} ${J}`)}}function UC0($,Z){for(let J of[B3,_Q]){let X=J($),z=J(Z);if(!L80(X))continue;YC0(z,{recursive:!0});for(let G of GC0(X)){if(L80(Ff(z,G)))continue;WC0(Ff(X,G),Ff(z,G))}}YZ(fK(j5(),$)),console.log(`renamed ${$} \u2192 ${Z}: settings and state carried over, old entry unregistered`),console.log(` leftover checkout (safe to remove): ${EH($)}`)}async function BC0($,Z){let J=vC(),X;if(Z.all){if(X=J.filter((z)=>z.behind),X.length===0){console.log("all plugins up to date.");return}}else{if($.length===0)throw new r4("update takes plugin ids or --all");X=$.map((z)=>{let G=J.find((W)=>W.id===z);if(!G)throw new r4(`\`${z}\` is not a GitHub-installed plugin; see \`${Q$()} plugin list\``);return G})}for(let z of X){if(!z.behind&&!$.includes(z.id))continue;console.log(`updating ${z.id} (${z.spec})\u2026`);let G=await kC(z.spec,{yes:Z.yes});if(G!==z.id)UC0(z.id,G)}vC()}var Nf=a(()=>{JI();zZ();TJ();Kf();h4()});var V80={};g$(V80,{runPluginSubcommand:()=>PC0});import{spawnSync as KC0}from"child_process";import{readFileSync as FC0,rmSync as MC0}from"fs";function Of($){$.write([`usage: ${HX} plugin <command>`,""," install <owner/repo[/subdir]> [--yes] [--ref <rev>] clone from GitHub, preview, build, register"," link <dir> register a local plugin directory (dev)"," list installed + linked plugins"," search [query] browse the marketplace (GitHub topic rove-plugin)"," outdated check GitHub-installed plugins against upstream"," update <id\u2026> | --all [--yes] reinstall stale plugins from GitHub"," enable <id> | disable <id> toggle a plugin without unregistering it"," unlink <id> unregister a linked plugin (files untouched)"," uninstall <id-or-spec> unregister + remove the managed checkout"," config-dir <id> print the plugin's config directory"," log <id> [-n <count>] tail the plugin's command-run log"," action list [--plugin <id>] declared actions"," action invoke <plugin-id.action-id> run an action now"," pane open --plugin <id> --entrypoint <pane-id> open a plugin pane as a terminal tab","","Marketplace: https://github.com/topics/rove-plugin (legacy kobe-plugin is included)",""].join(`
939
+ install: ${ZC0} plugin install <owner/repo[/subdir]> \u2014 browse: https://rove.sma1lboy.me/plugins`)}function QC0($){let Z=new Set;return $.filter((J)=>{let X=J.ref.toLowerCase();if(Z.has(X))return!1;return Z.add(X),!0})}var $C0=5000,ZC0,JC0;var O80=a(()=>{h4();ZC0=Q$(),JC0=[{ref:"Sma1lboy/kobe-plugins/notify",desc:"Desktop/ntfy notifications when an agent finishes or needs input"},{ref:"Sma1lboy/kobe-plugins/github-start",desc:"Start a Rove task from a GitHub issue or PR"},{ref:"Sma1lboy/kobe-plugins/worktree-include",desc:"Copy .worktreeinclude-matched files into new worktrees"},{ref:"Sma1lboy/kobe-plugins/linear-start",desc:"Pick a Linear issue (fzf) and start a task on its branch"},{ref:"Sma1lboy/kobe-plugins/lazygit",desc:"lazygit on the task worktree, as a pane tab"},{ref:"Sma1lboy/kobe-plugins/browser",desc:"Chromium rendered as terminal cells (carbonyl) in a pane tab"}]});var Mf={};g$(Mf,{updatePlugins:()=>BC0,printOutdated:()=>qC0,listOutdated:()=>vC});import{execFileSync as zC0}from"child_process";import{existsSync as L80,mkdirSync as YC0,readdirSync as GC0,renameSync as WC0}from"fs";import{join as Ff}from"path";function j80($,Z){try{return zC0("git",$,{cwd:Z,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function HC0($){let Z=$.source.spec.split("/").slice(0,2).join("/"),J=j80(["rev-parse","HEAD"],wH($.id)),X=j80(["ls-remote",`https://github.com/${Z}.git`,"HEAD"]),z=X?X.split(/\s+/)[0]??null:null;return{id:$.id,spec:$.source.spec,version:$.version,localSha:J,remoteSha:z,behind:Boolean(J&&z&&J!==z)}}function vC(){let $=j5().plugins.filter((Z)=>Z.source.kind==="github").map(HC0);return el($.filter((Z)=>Z.behind).map((Z)=>Z.id)),$}function qC0(){let $=vC();if($.length===0){console.log("no GitHub-installed plugins.");return}for(let Z of $){let J=Z.behind?"update available":Z.remoteSha===null?"remote unreachable":Z.localSha===null?"local sha unreadable":"up to date";console.log(`${Z.id} v${Z.version} ${J}`)}}function UC0($,Z){for(let J of[B3,_Q]){let X=J($),z=J(Z);if(!L80(X))continue;YC0(z,{recursive:!0});for(let G of GC0(X)){if(L80(Ff(z,G)))continue;WC0(Ff(X,G),Ff(z,G))}}YZ(fK(j5(),$)),console.log(`renamed ${$} \u2192 ${Z}: settings and state carried over, old entry unregistered`),console.log(` leftover checkout (safe to remove): ${EH($)}`)}async function BC0($,Z){let J=vC(),X;if(Z.all){if(X=J.filter((z)=>z.behind),X.length===0){console.log("all plugins up to date.");return}}else{if($.length===0)throw new r4("update takes plugin ids or --all");X=$.map((z)=>{let G=J.find((W)=>W.id===z);if(!G)throw new r4(`\`${z}\` is not a GitHub-installed plugin; see \`${Q$()} plugin list\``);return G})}for(let z of X){if(!z.behind&&!$.includes(z.id))continue;console.log(`updating ${z.id} (${z.spec})\u2026`);let G=await kC(z.spec,{yes:Z.yes});if(G!==z.id)UC0(z.id,G)}vC()}var Nf=a(()=>{JI();zZ();TJ();Kf();h4()});var V80={};g$(V80,{runPluginSubcommand:()=>PC0});import{spawnSync as KC0}from"child_process";import{readFileSync as FC0,rmSync as MC0}from"fs";function Of($){$.write([`usage: ${HX} plugin <command>`,""," install <owner/repo[/subdir]> [--yes] [--ref <rev>] clone from GitHub, preview, build, register"," link <dir> register a local plugin directory (dev)"," list installed + linked plugins"," search [query] browse the marketplace (GitHub topic rove-plugin)"," outdated check GitHub-installed plugins against upstream"," update <id\u2026> | --all [--yes] reinstall stale plugins from GitHub"," enable <id> | disable <id> toggle a plugin without unregistering it"," unlink <id> unregister a linked plugin (files untouched)"," uninstall <id-or-spec> unregister + remove the managed checkout"," config-dir <id> print the plugin's config directory"," log <id> [-n <count>] tail the plugin's command-run log"," action list [--plugin <id>] declared actions"," action invoke <plugin-id.action-id> run an action now"," pane open --plugin <id> --entrypoint <pane-id> open a plugin pane as a terminal tab","","Marketplace: https://github.com/topics/rove-plugin (legacy kobe-plugin is included)",""].join(`
940
940
  `))}function DM(){return j5().plugins.map(($)=>{try{return{entry:$,manifest:XZ($.root).manifest}}catch{return{entry:$,manifest:void 0}}})}function mC($){let Z=j5().plugins.find((J)=>J.id===$);if(!Z)throw new r4(`no plugin registered as \`${$}\`; see \`${HX} plugin list\``);return Z}function NC0(){let $=DM();if($.length===0){console.log(`no plugins installed. Try: ${HX} plugin install <owner/repo> \u2014 browse the \`rove-plugin\` GitHub topic.`);return}for(let{entry:Z,manifest:J}of $){let X=Z.enabled?"enabled":"disabled",z=Z.source.kind==="link"?`linked ${Z.root}`:Z.source.spec,G=J?"":" [manifest unreadable]";console.log(`${Z.id} v${Z.version} ${X} (${z})${G}`)}}function OC0($,Z){let J=mC($),X=j5();YZ({plugins:X.plugins.map((z)=>z.id===$?{...J,enabled:Z}:z)}),console.log(`${Z?"enabled":"disabled"} ${$}`)}function LC0($){let Z=mC($);if(Z.source.kind!=="link")throw new r4(`\`${$}\` is a GitHub install; use uninstall`);YZ(fK(j5(),$)),console.log(`unlinked ${$} (files untouched at ${Z.root})`)}function jC0($){let Z=j5(),J=Z.plugins.find((X)=>X.id===$||X.source.kind==="github"&&X.source.spec===$);if(!J)throw new r4(`no plugin registered as \`${$}\``);if(J.source.kind==="link")throw new r4(`\`${J.id}\` is linked; use unlink`);YZ(fK(Z,J.id)),MC0(wH(J.id),{recursive:!0,force:!0}),console.log(`uninstalled ${J.id} (config/state kept under ~/.kobe/plugins/${J.id}/)`)}function VC0($){for(let{entry:Z,manifest:J}of DM()){if(!J||$&&Z.id!==$)continue;for(let X of J.actions)console.log(`${DL(Z.id,X.id)} ${X.title}`)}}function _C0($,Z){let X=DM().filter(({entry:H,manifest:U})=>U&&H.enabled&&$.startsWith(`${H.id}.`)).sort((H,U)=>U.entry.id.length-H.entry.id.length).map(({entry:H,manifest:U})=>{let B=$.slice(H.id.length+1),N=U.actions.find((L)=>L.id===B);return N?{entry:H,action:N}:void 0}).find(Boolean);if(!X)throw new r4(`no action \`${$}\`; see \`${HX} plugin action list\``);let[z,...G]=[...X.action.command,...Z],W=KC0(z,G,{cwd:X.entry.root,stdio:"inherit",env:pq({socketPath:Q7(),binPath:HX,pluginId:X.entry.id,pluginRoot:X.entry.root,extra:{ROVE_PLUGIN_ACTION_ID:X.action.id,ROVE_PLUGIN_INVOKE_CWD:process.cwd()}})});process.exit(W.status??1)}function CC0($){let Z=DM().filter(({entry:J,manifest:X})=>X&&$.startsWith(`${J.id}.`)).sort((J,X)=>X.entry.id.length-J.entry.id.length).find(({entry:J,manifest:X})=>X.panes.some((z)=>z.id===$.slice(J.id.length+1)));if(!Z)throw new r4(`no pane \`${$}\`; see \`${HX} plugin list\``);return{pluginId:Z.entry.id,entrypoint:$.slice(Z.entry.id.length+1)}}async function DC0($,Z,J){let X=DM().find(({entry:B})=>B.id===$);if(!X?.manifest)throw new r4(`no plugin \`${$}\` (or its manifest is unreadable)`);if(!X.entry.enabled)throw new r4(`\`${$}\` is disabled`);let z=X.manifest.panes.find((B)=>B.id===Z);if(!z)throw new r4(`no pane \`${Z}\` in \`${$}\`; declare it under [[panes]]`);let G=rE(X.entry.id,X.entry.root,z,{socketPath:Q7(),binPath:HX}),{openDaemonSession:W}=await Promise.resolve().then(() => (gw(),d10)),{resolveActiveTaskId:H}=await Promise.resolve().then(() => (sq(),n00)),U=await W({mode:"start"});try{let B=J??await H(U.client);if(!B)throw new r4("no active task; pass --task <id>");await U.client.request("tab.open",{taskId:B,argv:G,title:z.title,placement:z.placement}),console.log(`opened pane ${$}.${z.id} in task ${B}`)}finally{U.close()}}function AC0($,Z){mC($);let J;try{J=FC0(xH($),"utf8")}catch{console.log("(no runs logged yet)");return}let X=J.trimEnd().split(`
941
941
  `);for(let z of X.slice(-Z))console.log(z)}function NG($,Z){let J=$.indexOf(Z);return J>=0?$[J+1]:void 0}async function PC0($){let[Z,...J]=$;try{switch(Z){case"install":{let X=J.find((z)=>!z.startsWith("-"));if(!X)throw new r4("install needs <owner/repo[/subdir]>");await kC(X,{yes:J.includes("--yes"),ref:NG(J,"--ref")});return}case"link":{if(!J[0])throw new r4("link needs a directory");F80(J[0]);return}case"list":NC0();return;case"search":{let{searchMarketplace:X}=await Promise.resolve().then(() => (O80(),N80));await X(J.find((z)=>!z.startsWith("-")));return}case"outdated":{let{printOutdated:X}=await Promise.resolve().then(() => (Nf(),Mf));X();return}case"update":{let{updatePlugins:X}=await Promise.resolve().then(() => (Nf(),Mf));await X(J.filter((z)=>!z.startsWith("-")),{all:J.includes("--all"),yes:J.includes("--yes")});return}case"enable":case"disable":{if(!J[0])throw new r4(`${Z} needs a plugin id`);OC0(J[0],Z==="enable");return}case"unlink":{if(!J[0])throw new r4("unlink needs a plugin id");LC0(J[0]);return}case"uninstall":{if(!J[0])throw new r4("uninstall needs a plugin id or owner/repo spec");jC0(J[0]);return}case"config-dir":{if(!J[0])throw new r4("config-dir needs a plugin id");mC(J[0]),console.log(B3(J[0]));return}case"log":{if(!J[0])throw new r4("log needs a plugin id");AC0(J[0],Number.parseInt(NG(J,"-n")??"20",10)||20);return}case"pane":{let[X,...z]=J;if(X==="open"){let G=z.find((U)=>!U.startsWith("-")&&U!==NG(z,"--task")),W=NG(z,"--plugin"),H=NG(z,"--entrypoint");if(!W||!H){if(!G)throw new r4("pane open needs <plugin-id.pane-id> (or --plugin <id> --entrypoint <pane-id>) [--task <task-id>]");({pluginId:W,entrypoint:H}=CC0(G))}await DC0(W,H,NG(z,"--task"));return}Of(process.stderr),process.exit(2);return}case"action":{let[X,...z]=J;if(X==="list"){VC0(NG(z,"--plugin"));return}if(X==="invoke"){if(!z[0])throw new r4("action invoke needs <plugin-id.action-id>");_C0(z[0],z.slice(1));return}Of(process.stderr),process.exit(2);return}default:{let X=Z===void 0||Z==="help"||Z==="--help"||Z==="-h";if(Of(X?process.stdout:process.stderr),!X)process.exit(2);return}}}catch(X){if(X instanceof r4)console.error(`${HX} plugin: ${X.message}`),process.exit(1);console.error(`${HX} plugin: ${N1(X)}`),process.exit(1)}}var HX;var _80=a(()=>{C2();I_();jQ();sE();zZ();TJ();Kf();h4();HX=Q$()});var D80={};g$(D80,{runOnboardingWizard:()=>TC0,WizardPage:()=>C80});import{TextAttributes as AM}from"@opentui/core";function C80($){let{theme:Z}=l0(),J=Z1(),X=I4(),z=$.shell===null?["skill"]:["completions","skill"],[G,W]=PM.useState(0),[H,U]=PM.useState(!0),[B,N]=PM.useState({}),[L,M]=PM.useState(!1),V=z[G];function A(E){X?.destroy(),$.onDone({completions:E.completions??!1,skill:E.skill??!1})}function _(E=H){if(L){A(B);return}let S={...B,[V]:E};if(N(S),G+1>=z.length){M(!0);return}W(G+1),U(!0)}g1(()=>({bindings:[{key:"up",cmd:()=>U(!0)},{key:"k",cmd:()=>U(!0)},{key:"down",cmd:()=>U(!1)},{key:"j",cmd:()=>U(!1)},{key:"return",cmd:()=>_()},...o2(()=>A(B))]}));function C(E){return E==="completions"?J("onboarding.completionsQuestion",{shell:$.shell??""}):J("onboarding.skillQuestion")}let y=V==="completions"?J("onboarding.completionsExplain"):J("onboarding.skillExplain");return T.jsxDEV("box",{flexDirection:"column",flexGrow:1,paddingTop:1,paddingLeft:2,paddingRight:2,children:[T.jsxDEV("text",{fg:Z.primary,attributes:AM.BOLD,wrapMode:"none",children:J("onboarding.title")},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:J("onboarding.subtitle")},void 0,!1,void 0,this),T.jsxDEV("box",{flexDirection:"column",paddingTop:1,children:[z.slice(0,L?z.length:G).map((E)=>T.jsxDEV("box",{flexDirection:"row",gap:1,children:[T.jsxDEV("text",{fg:Z.success,wrapMode:"none",children:"\u2713"},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"none",children:C(E)},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.text,wrapMode:"none",children:B[E]?J("onboarding.optionYes"):J("onboarding.optionNo")},void 0,!1,void 0,this)]},E,!0,void 0,this)),L?T.jsxDEV("box",{flexDirection:"column",onMouseUp:()=>_(),children:[T.jsxDEV("text",{fg:Z.text,attributes:AM.BOLD,wrapMode:"word",children:J("onboarding.keysTitle")},void 0,!1,void 0,this),cd(t3().key).map((E)=>T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:J(`onboarding.${E.msg}`,E.params)},E.msg,!1,void 0,this))]},void 0,!0,void 0,this):T.jsxDEV(T.Fragment,{children:[T.jsxDEV("text",{fg:Z.text,attributes:AM.BOLD,wrapMode:"word",children:C(V)},void 0,!1,void 0,this),T.jsxDEV("text",{fg:Z.textMuted,wrapMode:"word",children:y},void 0,!1,void 0,this),[!0,!1].map((E)=>{let S=H===E;return T.jsxDEV("box",{flexDirection:"row",gap:1,paddingLeft:1,onMouseUp:()=>_(E),children:[T.jsxDEV("text",{fg:S?Z.primary:Z.textMuted,wrapMode:"none",children:S?"\u276F":" "},void 0,!1,void 0,this),T.jsxDEV("text",{fg:S?Z.primary:Z.textMuted,attributes:S?AM.BOLD:void 0,wrapMode:"none",children:E?J("onboarding.optionYes"):J("onboarding.optionNo")},void 0,!1,void 0,this)]},String(E),!0,void 0,this)})]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),T.jsxDEV("box",{paddingTop:1,children:T.jsxDEV("text",{fg:Z.textMuted,attributes:AM.DIM,wrapMode:"none",children:J(L?"onboarding.keysLegend":"onboarding.legend")},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}async function TC0($){return await new Promise((Z)=>{oY({inlineRows:RC0,setup:()=>({root:()=>T.jsxDEV(C80,{shell:$,onDone:Z},void 0,!1,void 0,this)})})})}var PM,RC0=15;var A80=a(async()=>{FF();UZ();z$();r0();await e1([u4(),$$(),PF(),_4()]);PM=H1(q1(),1)});var w80={};g$(w80,{maybeRunOnboarding:()=>kC0,markOnboarded:()=>I80,isOnboarded:()=>S80,installCompletions:()=>T80,detectShell:()=>R80,applyOnboardingChoices:()=>E80});import{spawnSync as SC0}from"child_process";import{appendFileSync as IC0,existsSync as EC0,mkdirSync as wC0,readFileSync as xC0,writeFileSync as fC0}from"fs";import{homedir as gC0}from"os";import{basename as yC0,join as Lf}from"path";function R80($=process.env){let Z=yC0($.SHELL??"");return Z==="zsh"||Z==="bash"||Z==="fish"?Z:null}function T80($,Z=gC0()){if($==="fish"){let z=Lf(Z,".config","fish","completions"),G=Lf(z,"rove.fish");return wC0(z,{recursive:!0}),fC0(G,`rove completions fish | source
942
942
  `),G}let J=Lf(Z,$==="zsh"?".zshrc":".bashrc");if(!(EC0(J)?xC0(J,"utf8"):"").includes(bC0)){let z=`
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "@sma1lboy/kobe",
4
- "version": "0.8.105",
5
- "description": "Rove — the terminal-native agent multiplexer",
4
+ "version": "0.8.106",
5
+ "description": "Rove — the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",
6
6
  "type": "module",
7
7
  "packageManager": "bun@1.3.13",
8
8
  "bin": {