@sma1lboy/rove 0.9.94 → 0.9.95

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
@@ -5,7 +5,7 @@ var __create=Object.create;var{getPrototypeOf:__getProtoOf,defineProperty:__defP
5
5
  `).map((l)=>l.trim()).filter(Boolean)[0];if(!first)return;if(first.startsWith("claude:")&&first.includes("aliased to")){let aliasTarget=first.split("aliased to")[1]?.trim();return aliasTarget&&existsSync(aliasTarget)?aliasTarget:void 0}return first},readdir(p){try{return __require("fs").readdirSync(p)}catch{return[]}}}});import{spawnSync as spawnSync3}from"child_process";import{existsSync as existsSync2,statSync as statSync2}from"fs";import{homedir as homedir4}from"os";import path2 from"path";async function findCodexBinary(deps=defaultDeps2){let checked=[],tryPath=(p)=>{if(!p)return;return checked.push(p),deps.fileExists(p)?p:void 0},whichResult=deps.which("codex");if(whichResult){if(checked.push(`which:${whichResult}`),deps.fileExists(whichResult))return whichResult}let home=deps.home();for(let p of["/opt/homebrew/bin/codex","/usr/local/bin/codex","/usr/bin/codex","/bin/codex"]){let candidate=tryPath(p);if(candidate)return candidate}let nvmBin=deps.env("NVM_BIN");if(nvmBin){let candidate=tryPath(path2.join(nvmBin,"codex"));if(candidate)return candidate}for(let rel of[".local/bin/codex",".bun/bin/codex","bin/codex"]){let candidate=tryPath(path2.join(home,rel));if(candidate)return candidate}throw new CodexBinaryNotFoundError(checked)}var CodexBinaryNotFoundError,defaultDeps2;var init_binary2=__esm(()=>{CodexBinaryNotFoundError=class CodexBinaryNotFoundError extends Error{checkedPaths;constructor(checkedPaths){super(`Codex CLI binary not found. Checked: ${checkedPaths.join(", ")}. Ensure 'codex' is on PATH (e.g. \`brew install codex\` or the official installer).`);this.name="CodexBinaryNotFoundError",this.checkedPaths=checkedPaths}};defaultDeps2={fileExists(p){try{return statSync2(p).isFile()}catch{return!1}},env(name){return process.env[name]},home(){return homedir4()},which(name){let cmd=process.platform==="win32"?"where":"which",out=spawnSync3(cmd,[name],{encoding:"utf8"});if(out.status!==0)return;let first=out.stdout.split(`
6
6
  `).map((l)=>l.trim()).filter(Boolean)[0];if(!first)return;if(first.startsWith("codex:")&&first.includes("aliased to")){let aliasTarget=first.split("aliased to")[1]?.trim();return aliasTarget&&existsSync2(aliasTarget)?aliasTarget:void 0}return first},readdir(p){try{return __require("fs").readdirSync(p)}catch{return[]}}}});function registerPluginEngine(id,spec){if(Object.hasOwn(CONTRIB_ENGINES,id))return!1;return pluginEngines.set(id,spec),!0}function clearPluginEngines(){pluginEngines.clear()}function pluginEngineIds(){return[...pluginEngines.keys()]}function isContribEngine(id){return Object.hasOwn(CONTRIB_ENGINES,id)||pluginEngines.has(id)}function contribEngineEntry(id,base){let spec=CONTRIB_ENGINES[id]??pluginEngines.get(id);if(!spec)return base;return{...base,displayName:spec.displayName,defaultCommand:spec.defaultCommand,...spec.processNames?{processNames:spec.processNames}:{},screenManifest:spec.screenManifest,...spec.identity?{identity:spec.identity}:{}}}var pluginEngines,GEMINI,OPENCODE,CURSOR,GROK,DROID,AMP,CONTRIB_ENGINES,CONTRIB_ENGINE_IDS;var init_contrib_engines=__esm(()=>{pluginEngines=new Map;GEMINI={rules:[{state:"blocked",any:["\u2502 apply this change","\u2502 allow execution","waiting for user confirmation"]},{state:"blocked",all:["do you want to proceed"],any:["yes"]},{state:"working",any:["esc to cancel"]}]},OPENCODE={rules:[{state:"blocked",any:["\u25B3 permission required"]},{state:"blocked",all:["esc dismiss"],any:["enter confirm","enter submit","enter toggle"]},{state:"working",any:["esc to interrupt","ctrl+c to interrupt","esc again to interrupt"]}]},CURSOR={rules:[{state:"blocked",all:["proceed (y)"]},{state:"blocked",any:["run this command?","waiting for approval","skip (esc or n)","(y) (enter)"]},{state:"working",any:["esc to cancel","ctrl+c to stop"]}]},GROK={rules:[{state:"blocked",any:["\u26A0 action required","ctrl+o:yolo"]},{state:"blocked",all:["\u2503"],lineRegex:["^\\s*\u2503\\s+\\S+\\s+\\(\u25CB\\)"]},{state:"working",any:["[stop]"],lineRegex:["^\\s*[\\u2800-\\u28FF]"]}]},DROID={rules:[{state:"blocked",all:["enter to select","esc to cancel"],any:["> yes, allow","> no, cancel"]},{state:"blocked",all:["enter select","esc cancel"]},{state:"working",any:["esc to stop"]}]},AMP={rules:[{state:"blocked",any:["waiting for approval","run this command?","allow editing file:","allow creating file:","confirm tool call"]},{state:"working",lineRegex:["^\\s*\u2570\\s+\\S+\\s+(thinking|streaming|running tools|waiting)\\s+\u2500"]}]},CONTRIB_ENGINES={gemini:{displayName:"Gemini CLI",defaultCommand:["gemini"],screenManifest:GEMINI},opencode:{displayName:"OpenCode",defaultCommand:["opencode"],screenManifest:OPENCODE},cursor:{displayName:"Cursor Agent",defaultCommand:["cursor-agent"],screenManifest:CURSOR},grok:{displayName:"Grok CLI",defaultCommand:["grok"],screenManifest:GROK},droid:{displayName:"Droid",defaultCommand:["droid"],screenManifest:DROID},amp:{displayName:"Amp",defaultCommand:["amp"],screenManifest:AMP}};CONTRIB_ENGINE_IDS=Object.keys(CONTRIB_ENGINES)});import{spawnSync as spawnSync4}from"child_process";import{existsSync as existsSync3,statSync as statSync3}from"fs";import{homedir as homedir5}from"os";import path3 from"path";async function findCopilotBinary(deps=defaultDeps3){let checked=[],tryPath=(p)=>{if(!p)return;return checked.push(p),deps.fileExists(p)?p:void 0},whichResult=deps.which("copilot");if(whichResult){if(checked.push(`which:${whichResult}`),deps.fileExists(whichResult))return whichResult}let names=deps.platform()==="win32"?["copilot.exe","copilot.cmd","copilot"]:["copilot"],tryDir=(dir)=>{if(!dir)return;for(let name of names){let candidate=tryPath(path3.join(dir,name));if(candidate)return candidate}return};for(let dir of["/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"]){let candidate=tryDir(dir);if(candidate)return candidate}let nvmBin=deps.env("NVM_BIN"),nvmCandidate=tryDir(nvmBin);if(nvmCandidate)return nvmCandidate;let home=deps.home(),homeDirs=[path3.join(home,".npm-global/bin"),path3.join(home,".local/bin"),path3.join(home,".bun/bin"),path3.join(home,"bin")];if(deps.platform()==="win32"){let appData=deps.env("APPDATA"),localAppData=deps.env("LOCALAPPDATA");if(homeDirs.unshift(path3.join(home,"AppData/Roaming/npm")),appData)homeDirs.unshift(path3.join(appData,"npm"));if(localAppData)homeDirs.unshift(path3.join(localAppData,"npm"))}for(let dir of homeDirs){let candidate=tryDir(dir);if(candidate)return candidate}throw new CopilotBinaryNotFoundError(checked)}var CopilotBinaryNotFoundError,defaultDeps3;var init_binary3=__esm(()=>{CopilotBinaryNotFoundError=class CopilotBinaryNotFoundError extends Error{checkedPaths;constructor(checkedPaths){super(`GitHub Copilot CLI binary not found. Checked: ${checkedPaths.join(", ")}. Ensure 'copilot' is on PATH (for example \`npm install -g @github/copilot\` or \`brew install copilot-cli\`).`);this.name="CopilotBinaryNotFoundError",this.checkedPaths=checkedPaths}};defaultDeps3={fileExists(p){try{return statSync3(p).isFile()}catch{return!1}},env(name){return process.env[name]},home(){return homedir5()},which(name){let cmd=process.platform==="win32"?"where":"which",out=spawnSync4(cmd,[name],{encoding:"utf8"});if(out.status!==0)return;let first=out.stdout.split(`
7
7
  `).map((l)=>l.trim()).filter(Boolean)[0];if(!first)return;if(first.startsWith("copilot:")&&first.includes("aliased to")){let aliasTarget=first.split("aliased to")[1]?.trim();return aliasTarget&&existsSync3(aliasTarget)?aliasTarget:void 0}return first},platform(){return process.platform}}});import{readFileSync as readFileSync2,statSync as statSync4}from"fs";import{readFile,stat}from"fs/promises";async function readTextFileBounded(p,maxBytes=MAX_ENGINE_FILE_BYTES){let{size}=await stat(p);if(size>maxBytes)return"";return readFile(p,"utf8")}function readTextFileSyncBounded(p,maxBytes=MAX_ENGINE_FILE_BYTES){let st;try{st=statSync4(p)}catch(err){if(err.code==="ENOENT")return null;throw err}if(st.size>maxBytes)return null;return readFileSync2(p,"utf8")}function isJsonlLineWithinBound(line,maxChars=MAX_JSONL_LINE_CHARS){return line.length<=maxChars}var MAX_ENGINE_FILE_BYTES=104857600,MAX_JSONL_LINE_CHARS=8388608;var init_file_bounds=()=>{};import{spawnSync as spawnSync5}from"child_process";import{statSync as statSync5}from"fs";import{homedir as homedir6}from"os";import path4 from"path";async function findKimiBinary(deps=defaultDeps4){let checked=[],tryPath=(p)=>{if(!p)return;return checked.push(p),deps.fileExists(p)?p:void 0},whichResult=deps.which("kimi");if(whichResult){if(checked.push(`which:${whichResult}`),deps.fileExists(whichResult))return whichResult}let home=deps.home();for(let dir of[path4.join(home,".kimi-code/bin"),path4.join(home,".local/bin"),path4.join(home,"bin"),"/opt/homebrew/bin","/usr/local/bin"]){let candidate=tryPath(path4.join(dir,"kimi"));if(candidate)return candidate}throw new KimiBinaryNotFoundError(checked)}var KimiBinaryNotFoundError,defaultDeps4;var init_binary4=__esm(()=>{KimiBinaryNotFoundError=class KimiBinaryNotFoundError extends Error{checkedPaths;constructor(checkedPaths){super(`Kimi Code CLI binary not found. Checked: ${checkedPaths.join(", ")}. Ensure 'kimi' is on PATH or installed at ~/.kimi-code/bin/kimi.`);this.name="KimiBinaryNotFoundError",this.checkedPaths=checkedPaths}};defaultDeps4={fileExists(p){try{return statSync5(p).isFile()}catch{return!1}},env(name){return process.env[name]},home(){return homedir6()},which(name){let cmd=process.platform==="win32"?"where":"which",out=spawnSync5(cmd,[name],{encoding:"utf8"});if(out.status!==0)return;return out.stdout.split(`
8
- `).map((l)=>l.trim()).filter(Boolean)[0]||void 0}}});import{homedir as homedir7}from"os";import path5 from"path";function claudeGlobalConfigPath(env,home){let override=env("CLAUDE_CONFIG_DIR")?.trim();if(override)return path5.join(override,".claude.json");return path5.join(home,".claude.json")}function codexAuthPath(env,home){let dir=env("CODEX_HOME")?.trim()??path5.join(home,".codex");return path5.join(dir,"auth.json")}function copilotConfigPath(env,home){let dir=env("COPILOT_HOME")?.trim()??path5.join(home,".copilot");return path5.join(dir,"config.json")}function kimiCredentialsPath(env,home){let dir=env("KIMI_CODE_HOME")?.trim()??path5.join(home,".kimi-code");return path5.join(dir,"credentials","kimi-code.json")}function decodeJwtPayload(jwt){let parts=jwt.split(".");if(parts.length!==3)return null;let payload=parts[1];if(!payload)return null;let b64=payload.replace(/-/g,"+").replace(/_/g,"/"),padded=b64+"=".repeat((4-b64.length%4)%4);try{let json=Buffer.from(padded,"base64").toString("utf8"),obj=JSON.parse(json);return typeof obj==="object"&&obj!==null?obj:null}catch{return null}}async function probeBinary(probe){try{return{found:!0,path:await probe()}}catch(err){if(err instanceof ClaudeBinaryNotFoundError||err instanceof CodexBinaryNotFoundError||err instanceof CopilotBinaryNotFoundError||err instanceof KimiBinaryNotFoundError)return{found:!1,error:"not found on PATH"};return{found:!1,error:errorMessage(err)}}}async function probeAvailableVendors(deps){return(await Promise.all([["claude",()=>deps.findClaudeBinary()],["codex",()=>deps.findCodexBinary()],["copilot",()=>deps.findCopilotBinary()],["kimi",()=>deps.findKimiBinary()]].map(async([vendor,probe])=>(await probeBinary(probe)).found?vendor:null))).filter((v)=>v!==null)}function detectAvailableVendors(deps=defaultDeps5){if(deps!==defaultDeps5)return probeAvailableVendors(deps);if(cachedDefaultVendors)return cachedDefaultVendors;let pending=probeAvailableVendors(deps).catch((err)=>{throw cachedDefaultVendors=null,err});return cachedDefaultVendors=pending,pending}function resetAvailableVendorsCache(){cachedDefaultVendors=null,cachedContribEngines=null}async function installedEngineIds(deps=defaultDeps5){let builtins=await detectAvailableVendors(deps),contrib=await detectContribEngines();return[...new Set([...builtins,...getCustomEngineIds(),...contrib])]}async function availableEngineIds(deps=defaultDeps5){let disabled=new Set(getDisabledEngineIds());return(await installedEngineIds(deps)).filter((id)=>!disabled.has(id))}function detectContribEngines(){if(cachedContribEngines)return cachedContribEngines;let which=globalThis.Bun?.which;return cachedContribEngines=Promise.resolve([...which?CONTRIB_ENGINE_IDS.filter((id)=>{let bin=CONTRIB_ENGINES[id]?.defaultCommand[0];return bin?which(bin)!==null:!1}):[],...pluginEngineIds()]),cachedContribEngines}async function detectClaudeAccount(deps=defaultDeps5){let binary=await probeBinary(()=>deps.findClaudeBinary()),configPath=claudeGlobalConfigPath(deps.env,deps.home()),raw;try{raw=deps.readFile(configPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${configPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${configPath}: ${errorMessage(err)}`}}let oauth=parsed?.oauthAccount;if(!oauth||typeof oauth!=="object")return{binary,account:{kind:"none"}};let o=oauth,email=typeof o.emailAddress==="string"?o.emailAddress:void 0;if(!email)return{binary,account:{kind:"none"}};return{binary,account:{kind:"oauth",email,organization:typeof o.organizationName==="string"?o.organizationName:void 0,displayName:typeof o.displayName==="string"?o.displayName:void 0,billingType:typeof o.billingType==="string"?o.billingType:void 0}}}async function detectCodexAccount(deps=defaultDeps5){let binary=await probeBinary(()=>deps.findCodexBinary()),authPath=codexAuthPath(deps.env,deps.home()),raw;try{raw=deps.readFile(authPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${authPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${authPath}: ${errorMessage(err)}`}}let obj=parsed??{},tokens=obj.tokens,idToken=typeof tokens?.id_token==="string"?tokens.id_token:void 0;if(idToken){let payload=decodeJwtPayload(idToken);if(!payload)return{binary,account:{kind:"none"},accountError:"codex id_token: malformed JWT"};let email=typeof payload.email==="string"?payload.email:void 0,authClaimRaw=payload["https://api.openai.com/auth"],authClaim=typeof authClaimRaw==="object"&&authClaimRaw!==null&&!Array.isArray(authClaimRaw)?authClaimRaw:void 0,plan=typeof authClaim?.chatgpt_plan_type==="string"?authClaim.chatgpt_plan_type:void 0;if(email)return{binary,account:{kind:"chatgpt",email,plan}};return{binary,account:{kind:"none"},accountError:"codex id_token: no email claim"}}let apiKey=obj.OPENAI_API_KEY;if(typeof apiKey==="string"&&apiKey.length>0)return{binary,account:{kind:"apikey"}};return{binary,account:{kind:"none"}}}async function detectCopilotAccount(deps=defaultDeps5){let binary=await probeBinary(()=>deps.findCopilotBinary());for(let source of["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"])if(deps.env(source)?.trim())return{binary,account:{kind:"token",source}};let configPath=copilotConfigPath(deps.env,deps.home()),raw;try{raw=deps.readFile(configPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${configPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${configPath}: ${errorMessage(err)}`}}if(!isRecord(parsed))return{binary,account:{kind:"none"}};if(hasStringDeep(parsed,["github_token","oauth_token","access_token","token","selectedUser","currentUser","user"]))return{binary,account:{kind:"oauth"}};return{binary,account:{kind:"none"}}}async function detectKimiAccount(deps=defaultDeps5){let binary=await probeBinary(()=>deps.findKimiBinary()),credPath=kimiCredentialsPath(deps.env,deps.home()),raw;try{raw=deps.readFile(credPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${credPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${credPath}: ${errorMessage(err)}`}}if(!isRecord(parsed))return{binary,account:{kind:"none"}};let token=parsed.access_token;if(typeof token==="string"&&token.length>0)return{binary,account:{kind:"oauth"}};return{binary,account:{kind:"none"}}}function isRecord(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function hasStringDeep(value,interestingKeys,depth=0){if(depth>4||!isRecord(value))return!1;for(let[key,entry]of Object.entries(value)){if(interestingKeys.includes(key)&&typeof entry==="string"&&entry.length>0)return!0;if(isRecord(entry)&&hasStringDeep(entry,interestingKeys,depth+1))return!0}return!1}var defaultDeps5,cachedDefaultVendors=null,cachedContribEngines=null;var init_account_detect=__esm(()=>{init_repos();init_binary();init_binary2();init_contrib_engines();init_binary3();init_file_bounds();init_binary4();defaultDeps5={readFile(p){return readTextFileSyncBounded(p)},env(name){return process.env[name]},home(){return homedir7()},findClaudeBinary(){return findClaudeBinary()},findCodexBinary(){return findCodexBinary()},findCopilotBinary(){return findCopilotBinary()},findKimiBinary(){return findKimiBinary()}}});var claudeCapabilities,claudeIdentity;var init_capabilities=__esm(()=>{claudeCapabilities={},claudeIdentity={vendorId:"claude",shortName:"Claude"}});import{fileURLToPath}from"url";function roveCliInvocation(){let cliName=activeCliName();if(import.meta.url.endsWith(".js"))return[cliName];let entry=fileURLToPath(new URL(`./${cliName===ROVE_PRODUCT_NAME?"rove.ts":"kobe.ts"}`,import.meta.url));return[process.execPath,"--conditions=browser",entry]}function kobeHookInvocation(){if(import.meta.url.endsWith(".js"))return[LEGACY_KOBE_PRODUCT_NAME];if(Bun.which(LEGACY_KOBE_PRODUCT_NAME))return[LEGACY_KOBE_PRODUCT_NAME];return roveCliInvocation()}var kobeCliInvocation;var init_invocation=__esm(()=>{init_product();init_rename_compat();kobeCliInvocation=roveCliInvocation});function quoteShellArg(value,opts={}){if(opts.bareSafe&&SAFE_BARE_TOKEN.test(value))return value;return`'${value.replace(/'/g,"'\\''")}'`}function quoteShellArgv(argv,opts={}){return argv.map((arg)=>quoteShellArg(arg,opts)).join(" ")}var SAFE_BARE_TOKEN;var init_shell_command=__esm(()=>{SAFE_BARE_TOKEN=/^[A-Za-z0-9_/.:=-]+$/});function isObject(v){return!!v&&typeof v==="object"&&!Array.isArray(v)}function activityMarkers(eventMap){return eventMap.flatMap((e)=>[quoteShellArgv(["hook",e.verb]),`hook ${e.verb}`])}function isKobeActivityGroup(group,markers){if(!isObject(group)||!Array.isArray(group.hooks))return!1;return group.hooks.some((h)=>isObject(h)&&typeof h.command==="string"&&markers.some((m)=>h.command.includes(m)))}function hasKobeActivityHooks(current,eventMap){let markers=activityMarkers(eventMap),hooks=isObject(current.hooks)?current.hooks:{};return Object.values(hooks).some((groups)=>Array.isArray(groups)&&groups.some((g)=>isKobeActivityGroup(g,markers)))}function buildActivityHooks(eventMap,inv=kobeHookInvocation(),opts={}){let out={};for(let spec of eventMap){if(opts.buildFilter&&!opts.buildFilter(spec))continue;let{event,matcher,verb}=spec,group={hooks:[{type:"command",command:quoteShellArgv([...inv,"hook",verb,...opts.extraArgs??[]])}]};if(matcher)group.matcher=matcher;let groups=out[event]??[];groups.push(group),out[event]=groups}return out}function mergeActivityHooks(current,install,eventMap,inv=kobeHookInvocation(),opts={}){let markers=activityMarkers(eventMap),{hooks:rawHooks,...restSettings}=current,hooks=isObject(rawHooks)?{...rawHooks}:{},built=install?buildActivityHooks(eventMap,inv,opts):{};for(let{event}of eventMap){let kept=(Array.isArray(hooks[event])?hooks[event]:[]).filter((g)=>!isKobeActivityGroup(g,markers));if(install&&Array.isArray(built[event]))kept.push(...built[event]);if(kept.length>0)hooks[event]=kept;else delete hooks[event]}return Object.keys(hooks).length>0?{...restSettings,hooks}:{...restSettings}}function isRetiredWatchGroup(group){if(!isObject(group)||!Array.isArray(group.hooks))return!1;return group.hooks.some((h)=>isObject(h)&&typeof h.command==="string"&&h.command.includes(WORKTREE_WATCH_MARKER))}function removeWorktreeWatchHook(current){let{hooks:rawHooks,...restSettings}=current,hooks=isObject(rawHooks)?{...rawHooks}:{},kept=(Array.isArray(hooks[RETIRED_WATCH_EVENT])?hooks[RETIRED_WATCH_EVENT]:[]).filter((g)=>!isRetiredWatchGroup(g));if(kept.length>0)hooks[RETIRED_WATCH_EVENT]=kept;else delete hooks[RETIRED_WATCH_EVENT];return Object.keys(hooks).length>0?{...restSettings,hooks}:{...restSettings}}var GATED_TOOL_VERBS,RETIRED_WATCH_EVENT="PostToolUse",WORKTREE_WATCH_MARKER="worktree-created";var init_json_hooks=__esm(()=>{init_invocation();init_shell_command();GATED_TOOL_VERBS=new Set(["tool-pre","tool-post","tool-failed"])});import{randomBytes}from"crypto";import{linkSync as linkSync2,mkdirSync as mkdirSync3,readFileSync as readFileSync3,unlinkSync as unlinkSync2,writeFileSync as writeFileSync3}from"fs";import{link,mkdir,readFile as readFile2,unlink,writeFile}from"fs/promises";import{dirname as dirname3}from"path";function isProcessAlive(pid){if(!Number.isInteger(pid)||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(err){if(err.code==="ESRCH")return!1;return!0}}async function acquire(lockPath,opts={}){await mkdir(dirname3(lockPath),{recursive:!0});let token=`${process.pid}:${randomBytes(8).toString("hex")}`,sidecar=`${lockPath}.${token.replace(":","-")}`;for(;;){await writeFile(sidecar,token);try{return await link(sidecar,lockPath),token}catch(err){if(err.code!=="EEXIST")throw err}finally{await unlink(sidecar).catch(()=>{})}let holder;try{holder=(await readFile2(lockPath,"utf8")).trim()}catch(err){if(err.code!=="ENOENT")throw err;continue}let holderPid=Number.parseInt(holder,10),alive=Number.isFinite(holderPid)&&holderPid>0&&isProcessAlive(holderPid);if(alive&&!opts.forceTakeover)throw new LockfileError(`task index is locked by another Rove instance (pid ${holderPid})`,holderPid);console.warn(`[rove] removing stale lockfile at ${lockPath} (was held by pid ${holderPid}${alive?", forced":", process gone"})`);try{await unlink(lockPath)}catch(err){if(err.code!=="ENOENT")throw err}}}async function release(lockPath,token){let current;try{current=(await readFile2(lockPath,"utf8")).trim()}catch(err){if(err.code==="ENOENT")return;throw err}if(current!==token)return;try{await unlink(lockPath)}catch(err){if(err.code==="ENOENT")return;throw err}}function sleepSync(ms){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,ms)}function acquireSync(lockPath,timeoutMs=5000){mkdirSync3(dirname3(lockPath),{recursive:!0});let token=`${process.pid}:${randomBytes(8).toString("hex")}`,sidecar=`${lockPath}.${token.replace(":","-")}`,deadline=Date.now()+timeoutMs;for(;;){writeFileSync3(sidecar,token);try{return linkSync2(sidecar,lockPath),token}catch(err){if(err.code!=="EEXIST")throw err}finally{try{unlinkSync2(sidecar)}catch{}}let holder;try{holder=readFileSync3(lockPath,"utf8").trim()}catch(err){if(err.code!=="ENOENT")throw err;continue}let holderPid=Number.parseInt(holder,10);if(Number.isFinite(holderPid)&&holderPid>0&&isProcessAlive(holderPid)){if(Date.now()>=deadline)throw new LockfileError(`${lockPath} is locked by another Rove instance (pid ${holderPid})`,holderPid);sleepSync(25);continue}console.warn(`[rove] removing stale lockfile at ${lockPath} (was held by pid ${holderPid}, process gone)`);try{unlinkSync2(lockPath)}catch(err){if(err.code!=="ENOENT")throw err}}}function releaseSync(lockPath,token){try{if(readFileSync3(lockPath,"utf8").trim()!==token)return;unlinkSync2(lockPath)}catch(err){if(err.code!=="ENOENT")throw err}}var LockfileError;var init_lockfile=__esm(()=>{LockfileError=class LockfileError extends Error{heldByPid;constructor(message,heldByPid){super(message);this.name="LockfileError",this.heldByPid=heldByPid}}});import{existsSync as existsSync4,renameSync as renameSync3,statSync as statSync6}from"fs";function shouldRotateLog(sizeBytes,capBytes=DEFAULT_LOG_ROTATE_CAP_BYTES){return sizeBytes>capBytes}function rotateLogIfNeeded(path6,capBytes=DEFAULT_LOG_ROTATE_CAP_BYTES){try{if(!existsSync4(path6))return;let{size}=statSync6(path6);if(!shouldRotateLog(size,capBytes))return;renameSync3(path6,`${path6}.old`)}catch{}}var DEFAULT_LOG_ROTATE_CAP_BYTES=10485760;var init_log_rotate=()=>{};var exports_paths={};__export(exports_paths,{windowsPipePath:()=>windowsPipePath,shortHomeTag:()=>shortHomeTag,resolveDaemonHomeDir:()=>resolveDaemonHomeDir,legacyRuntimePath:()=>legacyRuntimePath,legacyPtyHostSocketPath:()=>legacyPtyHostSocketPath,legacyPtyHostPidPath:()=>legacyPtyHostPidPath,legacyDaemonSocketPath:()=>legacyDaemonSocketPath,legacyDaemonPidPath:()=>legacyDaemonPidPath,isWindowsPipePath:()=>isWindowsPipePath,fitSocketPath:()=>fitSocketPath,defaultWebTokenPath:()=>defaultWebTokenPath,defaultPtyHostSocketPath:()=>defaultPtyHostSocketPath,defaultPtyHostPidPath:()=>defaultPtyHostPidPath,defaultPtyHostLogPath:()=>defaultPtyHostLogPath,defaultPtyFreezeDir:()=>defaultPtyFreezeDir,defaultPtyExitsPath:()=>defaultPtyExitsPath,defaultDaemonSocketPath:()=>defaultDaemonSocketPath,defaultDaemonPidPath:()=>defaultDaemonPidPath,defaultDaemonLogPath:()=>defaultDaemonLogPath,defaultClientLogPath:()=>defaultClientLogPath,DEFAULT_DAEMON_WEB_PORT:()=>DEFAULT_DAEMON_WEB_PORT});import{createHash as createHash2}from"crypto";import{existsSync as existsSync5,readFileSync as readFileSync4}from"fs";import{homedir as homedir8,tmpdir as tmpdir2}from"os";import{join as join5}from"path";function stateDirs(homeDir2){return{canonical:join5(homeDir2,ROVE_STATE_DIR_BASENAME),legacy:join5(homeDir2,COMPAT_STATE_DIR_BASENAME)}}function pidIsLive(pidPath){try{let pid=Number.parseInt(readFileSync4(pidPath,"utf8").trim(),10);if(!Number.isInteger(pid)||pid<=1)return!1;return process.kill(pid,0),!0}catch{return!1}}function runtimePath(homeDir2,name,pidName){let{canonical,legacy}=stateDirs(homeDir2),canonicalPath=join5(canonical,name);if(existsSync5(canonicalPath))return canonicalPath;let legacyPath=join5(legacy,name);if(existsSync5(legacyPath)&&pidIsLive(join5(legacy,pidName)))return legacyPath;return canonicalPath}function legacyRuntimePath(homeDir2,name){return join5(homeDir2,COMPAT_STATE_DIR_BASENAME,name)}function legacyDaemonSocketPath(homeDir2){return legacyRuntimePath(homeDir2,"daemon.sock")}function legacyDaemonPidPath(homeDir2){return legacyRuntimePath(homeDir2,"daemon.pid")}function legacyPtyHostSocketPath(homeDir2){return legacyRuntimePath(homeDir2,"pty.sock")}function legacyPtyHostPidPath(homeDir2){return legacyRuntimePath(homeDir2,"pty.pid")}function runtimeDataPath(homeDir2,name){let{canonical,legacy}=stateDirs(homeDir2),canonicalPath=join5(canonical,name);if(existsSync5(canonicalPath))return canonicalPath;let legacyPath=join5(legacy,name);return existsSync5(legacyPath)?legacyPath:canonicalPath}function shortHomeTag(homeDir2){return createHash2("sha1").update(homeDir2).digest("hex").slice(0,8)}function fitSocketPath(naturalPath,homeDir2,role,pidTag){if(Buffer.byteLength(naturalPath,"utf8")<=SOCKET_PATH_SAFETY_LIMIT)return naturalPath;let tag=shortHomeTag(homeDir2),suffix=pidTag===void 0?"":`-${pidTag}`,fallback=join5(tmpdir2(),`kobe-${tag}-${role}${suffix}.sock`);if(Buffer.byteLength(fallback,"utf8")<=SOCKET_PATH_SAFETY_LIMIT)return fallback;throw Error(`daemon socket path exceeds ${SOCKET_PATH_SAFETY_LIMIT} bytes even after fallback: ${fallback}`)}function defaultDaemonSocketPath(homeDir2){let override=readRoveEnv("DAEMON_SOCKET_PATH");if(override&&override.length>0)return override;let explicit=homeDir2??readRoveEnv("HOME_DIR");if(explicit&&explicit.length>0)return fitSocketPath(runtimePath(explicit,"daemon.sock","daemon.pid"),explicit,"daemon");let runtimeDir=process.env.XDG_RUNTIME_DIR;if(runtimeDir&&runtimeDir.length>0)return fitSocketPath(join5(runtimeDir,"kobe.sock"),runtimeDir,"daemon");let home=homedir8();return fitSocketPath(runtimePath(home,"daemon.sock","daemon.pid"),home,"daemon")}function resolveDaemonHomeDir(homeDir2){let explicit=homeDir2??readRoveEnv("HOME_DIR");return explicit&&explicit.length>0?explicit:homedir8()}function defaultDaemonPidPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){let override=readRoveEnv("DAEMON_PID_PATH");if(override&&override.length>0)return override;return runtimePath(homeDir2,"daemon.pid","daemon.pid")}function defaultDaemonLogPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return join5(homeDir2,ROVE_STATE_DIR_BASENAME,"daemon.log")}function defaultClientLogPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return join5(homeDir2,ROVE_STATE_DIR_BASENAME,"client.log")}function isWindowsPipePath(path6){return path6.startsWith("\\\\.\\pipe\\")||path6.startsWith("//./pipe/")}function windowsPipePath(homeDir2,role){return`\\\\.\\pipe\\kobe-${shortHomeTag(homeDir2)}-${role}`}function defaultPtyHostSocketPath(homeDir2,platform=process.platform){let override=readRoveEnv("PTY_SOCKET_PATH");if(override&&override.length>0)return override;let explicit=homeDir2??readRoveEnv("HOME_DIR");if(platform==="win32")return windowsPipePath(explicit||homedir8(),"pty");if(explicit&&explicit.length>0)return fitSocketPath(runtimePath(explicit,"pty.sock","pty.pid"),explicit,"pty");let runtimeDir=process.env.XDG_RUNTIME_DIR;if(runtimeDir&&runtimeDir.length>0)return fitSocketPath(join5(runtimeDir,"kobe-pty.sock"),runtimeDir,"pty");let home=homedir8();return fitSocketPath(runtimePath(home,"pty.sock","pty.pid"),home,"pty")}function defaultPtyHostPidPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){let override=readRoveEnv("PTY_PID_PATH");if(override&&override.length>0)return override;return runtimePath(homeDir2,"pty.pid","pty.pid")}function defaultPtyHostLogPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return join5(homeDir2,ROVE_STATE_DIR_BASENAME,"pty.log")}function defaultPtyExitsPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return runtimeDataPath(homeDir2,"pty-exits.json")}function defaultWebTokenPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return runtimeDataPath(homeDir2,"web-token")}function defaultPtyFreezeDir(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return runtimeDataPath(homeDir2,"pty-sessions")}var SOCKET_PATH_SAFETY_LIMIT=100,DEFAULT_DAEMON_WEB_PORT=45174;var init_paths=()=>{};import{appendFile,mkdir as mkdir2,rename,stat as stat2}from"fs/promises";import{dirname as dirname4}from"path";function setClientLogContext(ctx){context=ctx}function coerceError(err){if(err instanceof Error)return{message:err.message,stack:err.stack};let text;try{text=typeof err==="string"?err:JSON.stringify(err)}catch{text=String(err)}return{message:text}}function formatClientEntry(subsystem,message,now=new Date){return`[${now.toISOString()}] client ${context} [${subsystem}] pid=${process.pid}: ${message}
8
+ `).map((l)=>l.trim()).filter(Boolean)[0]||void 0}}});import{homedir as homedir7}from"os";import path5 from"path";function claudeGlobalConfigPath(env,home){let override=env("CLAUDE_CONFIG_DIR")?.trim();if(override)return path5.join(override,".claude.json");return path5.join(home,".claude.json")}function codexAuthPath(env,home){let dir=env("CODEX_HOME")?.trim()??path5.join(home,".codex");return path5.join(dir,"auth.json")}function copilotConfigPath(env,home){let dir=env("COPILOT_HOME")?.trim()??path5.join(home,".copilot");return path5.join(dir,"config.json")}function kimiCredentialsPath(env,home){let dir=env("KIMI_CODE_HOME")?.trim()??path5.join(home,".kimi-code");return path5.join(dir,"credentials","kimi-code.json")}function decodeJwtPayload(jwt){let parts=jwt.split(".");if(parts.length!==3)return null;let payload=parts[1];if(!payload)return null;let b64=payload.replace(/-/g,"+").replace(/_/g,"/"),padded=b64+"=".repeat((4-b64.length%4)%4);try{let json=Buffer.from(padded,"base64").toString("utf8"),obj=JSON.parse(json);return typeof obj==="object"&&obj!==null?obj:null}catch{return null}}async function probeBinary(probe){try{return{found:!0,path:await probe()}}catch(err){if(err instanceof ClaudeBinaryNotFoundError||err instanceof CodexBinaryNotFoundError||err instanceof CopilotBinaryNotFoundError||err instanceof KimiBinaryNotFoundError)return{found:!1,error:"not found on PATH"};return{found:!1,error:errorMessage(err)}}}async function probeAvailableVendors(deps){return(await Promise.all([["claude",()=>deps.findClaudeBinary()],["codex",()=>deps.findCodexBinary()],["copilot",()=>deps.findCopilotBinary()],["kimi",()=>deps.findKimiBinary()]].map(async([vendor,probe])=>(await probeBinary(probe)).found?vendor:null))).filter((v)=>v!==null)}function detectAvailableVendors(deps=defaultDeps5){if(deps!==defaultDeps5)return probeAvailableVendors(deps);if(cachedDefaultVendors)return cachedDefaultVendors;let pending=probeAvailableVendors(deps).catch((err)=>{throw cachedDefaultVendors=null,err});return cachedDefaultVendors=pending,pending}function resetAvailableVendorsCache(){cachedDefaultVendors=null,cachedContribEngines=null}async function installedEngineIds(deps=defaultDeps5){let builtins=await detectAvailableVendors(deps),contrib=await detectContribEngines();return[...new Set([...builtins,...getCustomEngineIds(),...contrib])]}async function availableEngineIds(deps=defaultDeps5){let disabled=new Set(getDisabledEngineIds());return(await installedEngineIds(deps)).filter((id)=>!disabled.has(id))}function detectContribEngines(){if(cachedContribEngines)return cachedContribEngines;let which=globalThis.Bun?.which;return cachedContribEngines=Promise.resolve([...which?CONTRIB_ENGINE_IDS.filter((id)=>{let bin=CONTRIB_ENGINES[id]?.defaultCommand[0];return bin?which(bin)!==null:!1}):[],...pluginEngineIds()]),cachedContribEngines}async function detectClaudeAccount(deps=defaultDeps5){let binary=await probeBinary(()=>deps.findClaudeBinary()),configPath=claudeGlobalConfigPath(deps.env,deps.home()),raw;try{raw=deps.readFile(configPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${configPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${configPath}: ${errorMessage(err)}`}}let oauth=parsed?.oauthAccount;if(!oauth||typeof oauth!=="object")return{binary,account:{kind:"none"}};let o=oauth,email=typeof o.emailAddress==="string"?o.emailAddress:void 0;if(!email)return{binary,account:{kind:"none"}};return{binary,account:{kind:"oauth",email,organization:typeof o.organizationName==="string"?o.organizationName:void 0,displayName:typeof o.displayName==="string"?o.displayName:void 0,billingType:typeof o.billingType==="string"?o.billingType:void 0}}}async function detectCodexAccount(deps=defaultDeps5){let binary=await probeBinary(()=>deps.findCodexBinary()),authPath=codexAuthPath(deps.env,deps.home()),raw;try{raw=deps.readFile(authPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${authPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${authPath}: ${errorMessage(err)}`}}let obj=parsed??{},tokens=obj.tokens,idToken=typeof tokens?.id_token==="string"?tokens.id_token:void 0;if(idToken){let payload=decodeJwtPayload(idToken);if(!payload)return{binary,account:{kind:"none"},accountError:"codex id_token: malformed JWT"};let email=typeof payload.email==="string"?payload.email:void 0,authClaimRaw=payload["https://api.openai.com/auth"],authClaim=typeof authClaimRaw==="object"&&authClaimRaw!==null&&!Array.isArray(authClaimRaw)?authClaimRaw:void 0,plan=typeof authClaim?.chatgpt_plan_type==="string"?authClaim.chatgpt_plan_type:void 0;if(email)return{binary,account:{kind:"chatgpt",email,plan}};return{binary,account:{kind:"none"},accountError:"codex id_token: no email claim"}}let apiKey=obj.OPENAI_API_KEY;if(typeof apiKey==="string"&&apiKey.length>0)return{binary,account:{kind:"apikey"}};return{binary,account:{kind:"none"}}}async function detectCopilotAccount(deps=defaultDeps5){let binary=await probeBinary(()=>deps.findCopilotBinary());for(let source of["COPILOT_GITHUB_TOKEN","GH_TOKEN","GITHUB_TOKEN"])if(deps.env(source)?.trim())return{binary,account:{kind:"token",source}};let configPath=copilotConfigPath(deps.env,deps.home()),raw;try{raw=deps.readFile(configPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${configPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${configPath}: ${errorMessage(err)}`}}if(!isRecord(parsed))return{binary,account:{kind:"none"}};if(hasStringDeep(parsed,["github_token","oauth_token","access_token","token","selectedUser","currentUser","user"]))return{binary,account:{kind:"oauth"}};return{binary,account:{kind:"none"}}}async function detectKimiAccount(deps=defaultDeps5){let binary=await probeBinary(()=>deps.findKimiBinary()),credPath=kimiCredentialsPath(deps.env,deps.home()),raw;try{raw=deps.readFile(credPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${credPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${credPath}: ${errorMessage(err)}`}}if(!isRecord(parsed))return{binary,account:{kind:"none"}};let token=parsed.access_token;if(typeof token==="string"&&token.length>0)return{binary,account:{kind:"oauth"}};return{binary,account:{kind:"none"}}}function isRecord(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function hasStringDeep(value,interestingKeys,depth=0){if(depth>4||!isRecord(value))return!1;for(let[key,entry]of Object.entries(value)){if(interestingKeys.includes(key)&&typeof entry==="string"&&entry.length>0)return!0;if(isRecord(entry)&&hasStringDeep(entry,interestingKeys,depth+1))return!0}return!1}var defaultDeps5,cachedDefaultVendors=null,cachedContribEngines=null;var init_account_detect=__esm(()=>{init_repos();init_binary();init_binary2();init_contrib_engines();init_binary3();init_file_bounds();init_binary4();defaultDeps5={readFile(p){return readTextFileSyncBounded(p)},env(name){return process.env[name]},home(){return homedir7()},findClaudeBinary(){return findClaudeBinary()},findCodexBinary(){return findCodexBinary()},findCopilotBinary(){return findCopilotBinary()},findKimiBinary(){return findKimiBinary()}}});var claudeCapabilities,claudeIdentity;var init_capabilities=__esm(()=>{claudeCapabilities={},claudeIdentity={vendorId:"claude",shortName:"Claude"}});import{fileURLToPath}from"url";function roveCliInvocation(){let cliName=activeCliName();if(import.meta.url.endsWith(".js"))return[cliName];let entry=fileURLToPath(new URL(`./${cliName===ROVE_PRODUCT_NAME?"rove.ts":"kobe.ts"}`,import.meta.url));return[process.execPath,"--conditions=browser",entry]}function kobeHookInvocation(){if(import.meta.url.endsWith(".js"))return[LEGACY_KOBE_PRODUCT_NAME];if(Bun.which(LEGACY_KOBE_PRODUCT_NAME))return[LEGACY_KOBE_PRODUCT_NAME];return roveCliInvocation()}var init_invocation=__esm(()=>{init_product();init_rename_compat()});function quoteShellArg(value,opts={}){if(opts.bareSafe&&SAFE_BARE_TOKEN.test(value))return value;return`'${value.replace(/'/g,"'\\''")}'`}function quoteShellArgv(argv,opts={}){return argv.map((arg)=>quoteShellArg(arg,opts)).join(" ")}var SAFE_BARE_TOKEN;var init_shell_command=__esm(()=>{SAFE_BARE_TOKEN=/^[A-Za-z0-9_/.:=-]+$/});function isObject(v){return!!v&&typeof v==="object"&&!Array.isArray(v)}function activityMarkers(eventMap){return eventMap.flatMap((e)=>[quoteShellArgv(["hook",e.verb]),`hook ${e.verb}`])}function isKobeActivityGroup(group,markers){if(!isObject(group)||!Array.isArray(group.hooks))return!1;return group.hooks.some((h)=>isObject(h)&&typeof h.command==="string"&&markers.some((m)=>h.command.includes(m)))}function hasKobeActivityHooks(current,eventMap){let markers=activityMarkers(eventMap),hooks=isObject(current.hooks)?current.hooks:{};return Object.values(hooks).some((groups)=>Array.isArray(groups)&&groups.some((g)=>isKobeActivityGroup(g,markers)))}function buildActivityHooks(eventMap,inv=kobeHookInvocation(),opts={}){let out={};for(let spec of eventMap){if(opts.buildFilter&&!opts.buildFilter(spec))continue;let{event,matcher,verb}=spec,group={hooks:[{type:"command",command:quoteShellArgv([...inv,"hook",verb,...opts.extraArgs??[]])}]};if(matcher)group.matcher=matcher;let groups=out[event]??[];groups.push(group),out[event]=groups}return out}function mergeActivityHooks(current,install,eventMap,inv=kobeHookInvocation(),opts={}){let markers=activityMarkers(eventMap),{hooks:rawHooks,...restSettings}=current,hooks=isObject(rawHooks)?{...rawHooks}:{},built=install?buildActivityHooks(eventMap,inv,opts):{};for(let{event}of eventMap){let kept=(Array.isArray(hooks[event])?hooks[event]:[]).filter((g)=>!isKobeActivityGroup(g,markers));if(install&&Array.isArray(built[event]))kept.push(...built[event]);if(kept.length>0)hooks[event]=kept;else delete hooks[event]}return Object.keys(hooks).length>0?{...restSettings,hooks}:{...restSettings}}function isRetiredWatchGroup(group){if(!isObject(group)||!Array.isArray(group.hooks))return!1;return group.hooks.some((h)=>isObject(h)&&typeof h.command==="string"&&h.command.includes(WORKTREE_WATCH_MARKER))}function removeWorktreeWatchHook(current){let{hooks:rawHooks,...restSettings}=current,hooks=isObject(rawHooks)?{...rawHooks}:{},kept=(Array.isArray(hooks[RETIRED_WATCH_EVENT])?hooks[RETIRED_WATCH_EVENT]:[]).filter((g)=>!isRetiredWatchGroup(g));if(kept.length>0)hooks[RETIRED_WATCH_EVENT]=kept;else delete hooks[RETIRED_WATCH_EVENT];return Object.keys(hooks).length>0?{...restSettings,hooks}:{...restSettings}}var GATED_TOOL_VERBS,RETIRED_WATCH_EVENT="PostToolUse",WORKTREE_WATCH_MARKER="worktree-created";var init_json_hooks=__esm(()=>{init_invocation();init_shell_command();GATED_TOOL_VERBS=new Set(["tool-pre","tool-post","tool-failed"])});import{randomBytes}from"crypto";import{linkSync as linkSync2,mkdirSync as mkdirSync3,readFileSync as readFileSync3,unlinkSync as unlinkSync2,writeFileSync as writeFileSync3}from"fs";import{link,mkdir,readFile as readFile2,unlink,writeFile}from"fs/promises";import{dirname as dirname3}from"path";function isProcessAlive(pid){if(!Number.isInteger(pid)||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(err){if(err.code==="ESRCH")return!1;return!0}}async function acquire(lockPath,opts={}){await mkdir(dirname3(lockPath),{recursive:!0});let token=`${process.pid}:${randomBytes(8).toString("hex")}`,sidecar=`${lockPath}.${token.replace(":","-")}`;for(;;){await writeFile(sidecar,token);try{return await link(sidecar,lockPath),token}catch(err){if(err.code!=="EEXIST")throw err}finally{await unlink(sidecar).catch(()=>{})}let holder;try{holder=(await readFile2(lockPath,"utf8")).trim()}catch(err){if(err.code!=="ENOENT")throw err;continue}let holderPid=Number.parseInt(holder,10),alive=Number.isFinite(holderPid)&&holderPid>0&&isProcessAlive(holderPid);if(alive&&!opts.forceTakeover)throw new LockfileError(`task index is locked by another Rove instance (pid ${holderPid})`,holderPid);console.warn(`[rove] removing stale lockfile at ${lockPath} (was held by pid ${holderPid}${alive?", forced":", process gone"})`);try{await unlink(lockPath)}catch(err){if(err.code!=="ENOENT")throw err}}}async function release(lockPath,token){let current;try{current=(await readFile2(lockPath,"utf8")).trim()}catch(err){if(err.code==="ENOENT")return;throw err}if(current!==token)return;try{await unlink(lockPath)}catch(err){if(err.code==="ENOENT")return;throw err}}function sleepSync(ms){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,ms)}function acquireSync(lockPath,timeoutMs=5000){mkdirSync3(dirname3(lockPath),{recursive:!0});let token=`${process.pid}:${randomBytes(8).toString("hex")}`,sidecar=`${lockPath}.${token.replace(":","-")}`,deadline=Date.now()+timeoutMs;for(;;){writeFileSync3(sidecar,token);try{return linkSync2(sidecar,lockPath),token}catch(err){if(err.code!=="EEXIST")throw err}finally{try{unlinkSync2(sidecar)}catch{}}let holder;try{holder=readFileSync3(lockPath,"utf8").trim()}catch(err){if(err.code!=="ENOENT")throw err;continue}let holderPid=Number.parseInt(holder,10);if(Number.isFinite(holderPid)&&holderPid>0&&isProcessAlive(holderPid)){if(Date.now()>=deadline)throw new LockfileError(`${lockPath} is locked by another Rove instance (pid ${holderPid})`,holderPid);sleepSync(25);continue}console.warn(`[rove] removing stale lockfile at ${lockPath} (was held by pid ${holderPid}, process gone)`);try{unlinkSync2(lockPath)}catch(err){if(err.code!=="ENOENT")throw err}}}function releaseSync(lockPath,token){try{if(readFileSync3(lockPath,"utf8").trim()!==token)return;unlinkSync2(lockPath)}catch(err){if(err.code!=="ENOENT")throw err}}var LockfileError;var init_lockfile=__esm(()=>{LockfileError=class LockfileError extends Error{heldByPid;constructor(message,heldByPid){super(message);this.name="LockfileError",this.heldByPid=heldByPid}}});import{existsSync as existsSync4,renameSync as renameSync3,statSync as statSync6}from"fs";function shouldRotateLog(sizeBytes,capBytes=DEFAULT_LOG_ROTATE_CAP_BYTES){return sizeBytes>capBytes}function rotateLogIfNeeded(path6,capBytes=DEFAULT_LOG_ROTATE_CAP_BYTES){try{if(!existsSync4(path6))return;let{size}=statSync6(path6);if(!shouldRotateLog(size,capBytes))return;renameSync3(path6,`${path6}.old`)}catch{}}var DEFAULT_LOG_ROTATE_CAP_BYTES=10485760;var init_log_rotate=()=>{};var exports_paths={};__export(exports_paths,{windowsPipePath:()=>windowsPipePath,shortHomeTag:()=>shortHomeTag,resolveDaemonHomeDir:()=>resolveDaemonHomeDir,legacyRuntimePath:()=>legacyRuntimePath,legacyPtyHostSocketPath:()=>legacyPtyHostSocketPath,legacyPtyHostPidPath:()=>legacyPtyHostPidPath,legacyDaemonSocketPath:()=>legacyDaemonSocketPath,legacyDaemonPidPath:()=>legacyDaemonPidPath,isWindowsPipePath:()=>isWindowsPipePath,fitSocketPath:()=>fitSocketPath,defaultWebTokenPath:()=>defaultWebTokenPath,defaultPtyHostSocketPath:()=>defaultPtyHostSocketPath,defaultPtyHostPidPath:()=>defaultPtyHostPidPath,defaultPtyHostLogPath:()=>defaultPtyHostLogPath,defaultPtyFreezeDir:()=>defaultPtyFreezeDir,defaultPtyExitsPath:()=>defaultPtyExitsPath,defaultDaemonSocketPath:()=>defaultDaemonSocketPath,defaultDaemonPidPath:()=>defaultDaemonPidPath,defaultDaemonLogPath:()=>defaultDaemonLogPath,defaultClientLogPath:()=>defaultClientLogPath,DEFAULT_DAEMON_WEB_PORT:()=>DEFAULT_DAEMON_WEB_PORT});import{createHash as createHash2}from"crypto";import{existsSync as existsSync5,readFileSync as readFileSync4}from"fs";import{homedir as homedir8,tmpdir as tmpdir2}from"os";import{join as join5}from"path";function stateDirs(homeDir2){return{canonical:join5(homeDir2,ROVE_STATE_DIR_BASENAME),legacy:join5(homeDir2,COMPAT_STATE_DIR_BASENAME)}}function pidIsLive(pidPath){try{let pid=Number.parseInt(readFileSync4(pidPath,"utf8").trim(),10);if(!Number.isInteger(pid)||pid<=1)return!1;return process.kill(pid,0),!0}catch{return!1}}function runtimePath(homeDir2,name,pidName){let{canonical,legacy}=stateDirs(homeDir2),canonicalPath=join5(canonical,name);if(existsSync5(canonicalPath))return canonicalPath;let legacyPath=join5(legacy,name);if(existsSync5(legacyPath)&&pidIsLive(join5(legacy,pidName)))return legacyPath;return canonicalPath}function legacyRuntimePath(homeDir2,name){return join5(homeDir2,COMPAT_STATE_DIR_BASENAME,name)}function legacyDaemonSocketPath(homeDir2){return legacyRuntimePath(homeDir2,"daemon.sock")}function legacyDaemonPidPath(homeDir2){return legacyRuntimePath(homeDir2,"daemon.pid")}function legacyPtyHostSocketPath(homeDir2){return legacyRuntimePath(homeDir2,"pty.sock")}function legacyPtyHostPidPath(homeDir2){return legacyRuntimePath(homeDir2,"pty.pid")}function runtimeDataPath(homeDir2,name){let{canonical,legacy}=stateDirs(homeDir2),canonicalPath=join5(canonical,name);if(existsSync5(canonicalPath))return canonicalPath;let legacyPath=join5(legacy,name);return existsSync5(legacyPath)?legacyPath:canonicalPath}function shortHomeTag(homeDir2){return createHash2("sha1").update(homeDir2).digest("hex").slice(0,8)}function fitSocketPath(naturalPath,homeDir2,role,pidTag){if(Buffer.byteLength(naturalPath,"utf8")<=SOCKET_PATH_SAFETY_LIMIT)return naturalPath;let tag=shortHomeTag(homeDir2),suffix=pidTag===void 0?"":`-${pidTag}`,fallback=join5(tmpdir2(),`kobe-${tag}-${role}${suffix}.sock`);if(Buffer.byteLength(fallback,"utf8")<=SOCKET_PATH_SAFETY_LIMIT)return fallback;throw Error(`daemon socket path exceeds ${SOCKET_PATH_SAFETY_LIMIT} bytes even after fallback: ${fallback}`)}function defaultDaemonSocketPath(homeDir2){let override=readRoveEnv("DAEMON_SOCKET_PATH");if(override&&override.length>0)return override;let explicit=homeDir2??readRoveEnv("HOME_DIR");if(explicit&&explicit.length>0)return fitSocketPath(runtimePath(explicit,"daemon.sock","daemon.pid"),explicit,"daemon");let runtimeDir=process.env.XDG_RUNTIME_DIR;if(runtimeDir&&runtimeDir.length>0)return fitSocketPath(join5(runtimeDir,"kobe.sock"),runtimeDir,"daemon");let home=homedir8();return fitSocketPath(runtimePath(home,"daemon.sock","daemon.pid"),home,"daemon")}function resolveDaemonHomeDir(homeDir2){let explicit=homeDir2??readRoveEnv("HOME_DIR");return explicit&&explicit.length>0?explicit:homedir8()}function defaultDaemonPidPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){let override=readRoveEnv("DAEMON_PID_PATH");if(override&&override.length>0)return override;return runtimePath(homeDir2,"daemon.pid","daemon.pid")}function defaultDaemonLogPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return join5(homeDir2,ROVE_STATE_DIR_BASENAME,"daemon.log")}function defaultClientLogPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return join5(homeDir2,ROVE_STATE_DIR_BASENAME,"client.log")}function isWindowsPipePath(path6){return path6.startsWith("\\\\.\\pipe\\")||path6.startsWith("//./pipe/")}function windowsPipePath(homeDir2,role){return`\\\\.\\pipe\\kobe-${shortHomeTag(homeDir2)}-${role}`}function defaultPtyHostSocketPath(homeDir2,platform=process.platform){let override=readRoveEnv("PTY_SOCKET_PATH");if(override&&override.length>0)return override;let explicit=homeDir2??readRoveEnv("HOME_DIR");if(platform==="win32")return windowsPipePath(explicit||homedir8(),"pty");if(explicit&&explicit.length>0)return fitSocketPath(runtimePath(explicit,"pty.sock","pty.pid"),explicit,"pty");let runtimeDir=process.env.XDG_RUNTIME_DIR;if(runtimeDir&&runtimeDir.length>0)return fitSocketPath(join5(runtimeDir,"kobe-pty.sock"),runtimeDir,"pty");let home=homedir8();return fitSocketPath(runtimePath(home,"pty.sock","pty.pid"),home,"pty")}function defaultPtyHostPidPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){let override=readRoveEnv("PTY_PID_PATH");if(override&&override.length>0)return override;return runtimePath(homeDir2,"pty.pid","pty.pid")}function defaultPtyHostLogPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return join5(homeDir2,ROVE_STATE_DIR_BASENAME,"pty.log")}function defaultPtyExitsPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return runtimeDataPath(homeDir2,"pty-exits.json")}function defaultWebTokenPath(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return runtimeDataPath(homeDir2,"web-token")}function defaultPtyFreezeDir(homeDir2=readRoveEnv("HOME_DIR")??homedir8()){return runtimeDataPath(homeDir2,"pty-sessions")}var SOCKET_PATH_SAFETY_LIMIT=100,DEFAULT_DAEMON_WEB_PORT=45174;var init_paths=()=>{};import{appendFile,mkdir as mkdir2,rename,stat as stat2}from"fs/promises";import{dirname as dirname4}from"path";function setClientLogContext(ctx){context=ctx}function coerceError(err){if(err instanceof Error)return{message:err.message,stack:err.stack};let text;try{text=typeof err==="string"?err:JSON.stringify(err)}catch{text=String(err)}return{message:text}}function formatClientEntry(subsystem,message,now=new Date){return`[${now.toISOString()}] client ${context} [${subsystem}] pid=${process.pid}: ${message}
9
9
  `}function warnOnce(){if(warnedOnce)return;warnedOnce=!0;try{process.stderr.write(`[rove] client log write failed; continuing without it
10
10
  `)}catch{}}async function rotateClientLogIfNeeded(path6){try{let{size}=await stat2(path6);if(!shouldRotateLog(size,DEFAULT_LOG_ROTATE_CAP_BYTES))return;await rename(path6,`${path6}.old`)}catch{}}function append(line,logPath){let path6=logPath??defaultClientLogPath();writeChain=writeChain.then(async()=>{await rotateClientLogIfNeeded(path6);try{await appendFile(path6,line)}catch(err){if(err?.code==="ENOENT")await mkdir2(dirname4(path6),{recursive:!0}),await appendFile(path6,line);else throw err}}).catch(()=>warnOnce())}function logClient(subsystem,message,logPath){append(formatClientEntry(subsystem,message),logPath)}function logClientError(subsystem,err){let e=coerceError(err);append(formatClientEntry(subsystem,e.stack??e.message))}function installClientCrashHandlers(){if(onRejection||onException)return;onRejection=(reason)=>logClientError("crash-net",reason),onException=(err)=>logClientError("crash-net",err),process.on("unhandledRejection",onRejection),process.on("uncaughtException",onException)}var context="client",warnedOnce=!1,writeChain,onRejection,onException;var init_client_log=__esm(()=>{init_log_rotate();init_paths();writeChain=Promise.resolve()});function isTaskStatus(value){return typeof value==="string"&&TASK_STATUSES.includes(value)}var toTaskId=(id)=>id,DEFAULT_TASK_VENDOR="claude",TASK_STATUSES;var init_task=__esm(()=>{TASK_STATUSES=["backlog","in_progress","in_review","done","canceled","error"]});import{copyFile,readFile as readFile3}from"fs/promises";import{dirname as dirname5}from"path";async function acquireWithRetry(lockPath){let deadline=Date.now()+LOCK_MAX_WAIT_MS;for(;;)try{return await acquire(lockPath)}catch(err){if(!(err instanceof LockfileError)||Date.now()>=deadline)throw err;await sleep(LOCK_RETRY_DELAY_MS)}}async function backupCorruptManifest(path6,now=()=>new Date){let backupPath=`${path6}.corrupt-${now().toISOString().replaceAll(":","-")}`;try{return await copyFile(path6,backupPath),backupPath}catch{return null}}function warnManifestRecovery(message,manifestPath){console.warn(message),logClient("tasks-index",message,manifestPath?defaultClientLogPath(dirname5(dirname5(manifestPath))):void 0)}async function recoverUnsupportedVersion(parsed,sourcePath){if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return!1;let version=parsed.version;if(version===void 0||SUPPORTED_VERSIONS.has(version))return!1;let backup=await backupCorruptManifest(sourcePath);return warnManifestRecovery(`[rove] tasks.json at ${sourcePath} has unsupported version=${String(version)}; recovering with empty index.${backup?` Original bytes backed up to ${backup}.`:" Backup copy failed; the stale file is left in place."}`,sourcePath),!0}function normalizeIndex(parsed,source){if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return warnManifestRecovery(`[rove] tasks.json at ${source} is not an object; recovering with empty index.`,source),{version:CURRENT_VERSION,tasks:[]};let obj=parsed,version=obj.version;if(version!==void 0&&!SUPPORTED_VERSIONS.has(version))return warnManifestRecovery(`[rove] tasks.json at ${source} has unsupported version=${String(version)}; recovering with empty index.`,source),{version:CURRENT_VERSION,tasks:[]};let rawTasks=Array.isArray(obj.tasks)?obj.tasks:[],tasks=[];for(let entry of rawTasks){let task=coerceTask(entry);if(task)tasks.push(task);else console.warn(`[rove] dropping malformed task entry from ${source}: ${JSON.stringify(entry)}`)}return{version:CURRENT_VERSION,tasks}}async function readDiskIndex(path6,legacyPath){let raw,sourcePath=path6;try{raw=await readFile3(sourcePath,"utf8")}catch(err){if(err.code!=="ENOENT")throw err;sourcePath=legacyPath;try{raw=await readFile3(sourcePath,"utf8")}catch(legacyErr){if(legacyErr.code==="ENOENT")return{tasks:[],removed:[]};throw legacyErr}}let parsed;try{parsed=JSON.parse(raw)}catch{return await backupCorruptManifest(sourcePath),{tasks:[],removed:[]}}if(await recoverUnsupportedVersion(parsed,sourcePath))return{tasks:[],removed:[]};return{tasks:normalizeIndex(parsed,sourcePath).tasks,removed:coerceTombstones(parsed)}}function coerceTombstones(parsed){if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return[];let raw=parsed.removed;if(!Array.isArray(raw))return[];let out=[];for(let entry of raw){if(!entry||typeof entry!=="object")continue;let v=entry;if(typeof v.id==="string"&&v.id.length>0&&typeof v.at==="string")out.push({id:v.id,at:v.at})}return out}function mergeTasksWithDisk(cacheTasks,diskTasks,dirty,removed,diskRemoved=[],now=Date.now()){let tombstones=new Map;for(let t of diskRemoved){let at=Date.parse(t.at);if(!Number.isFinite(at)||now-at>TOMBSTONE_TTL_MS)continue;tombstones.set(t.id,t.at)}for(let[id,at]of removed)tombstones.set(id,at);let diskById=new Map(diskTasks.map((t)=>[t.id,t])),result=[],included=new Set;for(let task of cacheTasks){if(tombstones.has(task.id))continue;if(dirty.has(task.id))result.push(task);else{let onDisk=diskById.get(task.id);if(onDisk===void 0)continue;result.push(onDisk)}included.add(task.id)}for(let task of diskTasks){if(included.has(task.id)||tombstones.has(task.id))continue;result.push(task),included.add(task.id)}return{tasks:result,removed:[...tombstones].map(([id,at])=>({id,at}))}}function coerceTask(value){if(!value||typeof value!=="object")return null;let v=value;if(typeof v.id!=="string"||typeof v.title!=="string"||typeof v.repo!=="string"||typeof v.branch!=="string"||typeof v.worktreePath!=="string"||typeof v.status!=="string"||typeof v.createdAt!=="string"||typeof v.updatedAt!=="string")return null;if(!isTaskStatus2(v.status))return null;let kind=v.kind==="main"?"main":v.kind==="dir"?"dir":"task",scratch=kind==="dir"&&v.scratch===!0,healedStatus=kind==="main"&&(v.status==="in_progress"||v.status==="done")?"backlog":v.status,deletion=coerceDeletion(v.deletion),quotaResume=coerceQuotaResume(v.quotaResume),linkedWorkItem=coerceLinkedWorkItem(v.linkedWorkItem),dispatcher=coerceDispatcher(v.dispatcher),routine=coerceRoutine(v.routine);return{id:toTaskId(v.id),title:v.title,repo:v.repo,branch:v.branch,worktreePath:v.worktreePath,status:healedStatus,pinned:typeof v.pinned==="boolean"?v.pinned:!1,kind,...scratch?{scratch:!0}:{},...routine?{routine}:{},vendor:coerceVendorId(typeof v.vendor==="string"?v.vendor:void 0),...typeof v.command==="string"&&v.command.trim().length>0?{command:v.command}:{},prStatus:coercePRStatus(v.prStatus),...typeof v.modelEffort==="string"&&v.modelEffort.length>0?{modelEffort:v.modelEffort}:{},...typeof v.groupId==="string"&&v.groupId.length>0?{groupId:v.groupId}:{},...v.observedLanguage==="zh"||v.observedLanguage==="en"?{observedLanguage:v.observedLanguage}:{},...deletion?{deletion}:{},...quotaResume?{quotaResume}:{},...linkedWorkItem?{linkedWorkItem}:{},...dispatcher?{dispatcher}:{},...typeof v.prompt==="string"&&v.prompt.length>0?{prompt:v.prompt}:{},...typeof v.baseRef==="string"&&v.baseRef.trim().length>0?{baseRef:v.baseRef}:{},createdAt:v.createdAt,updatedAt:v.updatedAt}}function coerceDispatcher(value){if(!value||typeof value!=="object"||Array.isArray(value))return;let v=value;if(typeof v.taskId!=="string"||v.taskId.length===0)return;if(typeof v.tabId!=="string"||v.tabId.length===0)return;return{taskId:v.taskId,tabId:v.tabId}}function coerceRoutine(value){if(!value||typeof value!=="object"||Array.isArray(value))return;let v=value;if(typeof v.automationId!=="string"||v.automationId.length===0)return;return{automationId:v.automationId}}function coerceQuotaResume(value){if(!value||typeof value!=="object"||Array.isArray(value))return;let v=value;if(typeof v.resumeAt!=="string"||v.resumeAt.length===0)return;if(typeof v.requestedAt!=="string"||v.requestedAt.length===0)return;return{resumeAt:v.resumeAt,requestedAt:v.requestedAt}}function coerceLinkedWorkItem(value){if(!value||typeof value!=="object"||Array.isArray(value))return;let v=value;if(v.provider!=="github")return;if(v.type!=="issue"&&v.type!=="pr")return;if(typeof v.number!=="number"||!Number.isFinite(v.number))return;if(typeof v.title!=="string"||typeof v.url!=="string"||v.url.length===0)return;return{provider:v.provider,type:v.type,number:v.number,title:v.title,url:v.url}}function coerceDeletion(value){if(!value||typeof value!=="object"||Array.isArray(value))return;let v=value;if(v.phase!=="queued"&&v.phase!=="running"&&v.phase!=="error"||typeof v.force!=="boolean"||typeof v.requestedAt!=="string"||v.requestedAt.length===0||v.error!==void 0&&typeof v.error!=="string")return;return{phase:v.phase,force:v.force,...typeof v.deleteBranch==="boolean"?{deleteBranch:v.deleteBranch}:{},requestedAt:v.requestedAt,...typeof v.error==="string"?{error:v.error}:{}}}function coercePRStatus(value){if(!value||typeof value!=="object"||Array.isArray(value))return;let v=value;if(!isPRProviderId(v.provider)||!isPRLifecycleState(v.lifecycle)||!isPRCheckState(v.checkState))return;return{provider:v.provider,lifecycle:v.lifecycle,checkState:v.checkState,...typeof v.number==="number"&&Number.isFinite(v.number)?{number:v.number}:{},...typeof v.url==="string"?{url:v.url}:{},...typeof v.title==="string"?{title:v.title}:{},...typeof v.baseRef==="string"?{baseRef:v.baseRef}:{},...typeof v.headRef==="string"?{headRef:v.headRef}:{},...typeof v.reviewDecision==="string"?{reviewDecision:v.reviewDecision}:{},...typeof v.mergeable==="string"?{mergeable:v.mergeable}:{},...typeof v.lastCheckedAt==="string"?{lastCheckedAt:v.lastCheckedAt}:{},...typeof v.lastError==="string"?{lastError:v.lastError}:{}}}function isPRProviderId(v){return v==="github"||v==="gitlab"||v==="bitbucket"||v==="unknown"}function isPRLifecycleState(v){return v==="creating"||v==="open"||v==="ready_to_merge"||v==="merged"||v==="closed"||v==="unknown"}function isPRCheckState(v){return v==="none"||v==="pending"||v==="passing"||v==="failing"||v==="unknown"}function isTaskStatus2(s){return s==="backlog"||s==="in_progress"||s==="in_review"||s==="done"||s==="canceled"||s==="error"}var sleep=(ms)=>new Promise((resolve2)=>setTimeout(resolve2,ms)),LOCK_RETRY_DELAY_MS=25,LOCK_MAX_WAIT_MS=5000,CURRENT_VERSION=3,SUPPORTED_VERSIONS,TOMBSTONE_TTL_MS=2592000000;var init_store_codec=__esm(()=>{init_client_log();init_paths();init_task();init_vendor();init_lockfile();SUPPORTED_VERSIONS=new Set([1,2,3])});import{createHash as createHash3,randomBytes as randomBytes2}from"crypto";import{mkdirSync as mkdirSync4,readFileSync as readFileSync5,renameSync as renameSync4,unlinkSync as unlinkSync3,writeFileSync as writeFileSync4}from"fs";import{mkdir as mkdir3,readFile as readFile4,rename as rename2,unlink as unlink2,writeFile as writeFile2}from"fs/promises";import{dirname as dirname6,join as join6}from"path";function stagingPath(file){return`${file}.rove-${process.pid}-${randomBytes2(6).toString("hex")}.tmp`}function sharedConfigLockPath(file){return join6(roveStateDir(),`shared-config-${createHash3("sha256").update(file).digest("hex").slice(0,16)}.lock`)}function readRawSync(file){try{return readFileSync5(file,"utf8")}catch(err){if(err.code==="ENOENT")return;throw err}}async function readRaw(file){try{return await readFile4(file,"utf8")}catch(err){if(err.code==="ENOENT")return;throw err}}function updateSharedJsonSync(file,load,build){let lockPath=sharedConfigLockPath(file),lockToken=acquireSync(lockPath);try{for(let attempt=0;attempt<MAX_ATTEMPTS;attempt++){let before=readRawSync(file),doc=load(before);if(!doc)return;let text=build(doc);if(text===void 0)return;let tmp=stagingPath(file);try{if(mkdirSync4(dirname6(file),{recursive:!0}),writeFileSync4(tmp,text),readRawSync(file)===before){renameSync4(tmp,file);return}}finally{try{unlinkSync3(tmp)}catch{}}}throw Error(`gave up updating ${file} after ${MAX_ATTEMPTS} concurrent writes`)}finally{releaseSync(lockPath,lockToken)}}async function updateSharedJson(file,load,build){let lockPath=sharedConfigLockPath(file),lockToken=await acquireWithRetry(lockPath);try{for(let attempt=0;attempt<MAX_ATTEMPTS;attempt++){let before=await readRaw(file),doc=load(before);if(!doc)return;let text=build(doc);if(text===void 0)return;let tmp=stagingPath(file);try{if(await mkdir3(dirname6(file),{recursive:!0}),await writeFile2(tmp,text),await readRaw(file)===before){await rename2(tmp,file);return}}finally{await unlink2(tmp).catch(()=>{})}}throw Error(`gave up updating ${file} after ${MAX_ATTEMPTS} concurrent writes`)}finally{await release(lockPath,lockToken)}}var MAX_ATTEMPTS=5;var init_shared_config_write=__esm(()=>{init_env();init_lockfile();init_store_codec()});async function editJsonSettings(settingsFilePath,transform){try{await updateSharedJson(settingsFilePath,(raw)=>{if(raw===void 0)return{};try{let parsed=JSON.parse(raw);return isObject(parsed)?parsed:void 0}catch{return}},(current)=>{let next=transform(current),json=JSON.stringify(next,null,2);return json===JSON.stringify(current,null,2)?void 0:`${json}
11
11
  `})}catch{}}class JsonHookAdapter{supportsHooks(){return!0}activityDetailFromPayload(_kind,_payload){return}sessionFromPayload(_payload){return}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(_settingsFilePath){}gatedVerbs(){return GATED_TOOL_VERBS}async installActivityHooks(settingsFilePath,opts={}){let gated=this.gatedVerbs();await editJsonSettings(settingsFilePath,(cur)=>mergeActivityHooks(cur,!0,this.eventMap,void 0,{extraArgs:["--engine",this.vendor],buildFilter:(spec)=>opts.toolEvents===!0||!gated.has(spec.verb)}))}async removeActivityHooks(settingsFilePath){await editJsonSettings(settingsFilePath,(cur)=>mergeActivityHooks(cur,!1,this.eventMap))}async removeWorktreeWatchHook(settingsFilePath){await editJsonSettings(settingsFilePath,removeWorktreeWatchHook)}}var init_json_hook_adapter=__esm(()=>{init_json_hooks();init_shared_config_write()});import{homedir as homedir9}from"os";import{join as join7}from"path";function failureFromErrorType(errorType){if(typeof errorType!=="string")return"other";if(errorType==="rate_limit"||errorType==="overloaded")return"rate_limit";if(errorType==="billing_error")return"billing";return"other"}function claudeSettingsPath(){return join7(homedir9(),".claude","settings.json")}function isKobeWorktreeSyncGroup(group){if(!isObject(group)||!Array.isArray(group.hooks))return!1;return group.hooks.some((h)=>isObject(h)&&typeof h.command==="string"&&h.command.includes(WORKTREE_SYNC_MARKER))}function mergeWorktreeSyncHook(current,command){let{hooks:rawHooks,...restSettings}=current,{WorktreeCreate,...otherHooks}=isObject(rawHooks)?rawHooks:{},kept=(Array.isArray(WorktreeCreate)?WorktreeCreate:[]).filter((g)=>!isKobeWorktreeSyncGroup(g));if(command!==null)kept.push({hooks:[{type:"command",command}]});let nextHooks={...otherHooks};if(kept.length>0)nextHooks.WorktreeCreate=kept;return Object.keys(nextHooks).length>0?{...restSettings,hooks:nextHooks}:{...restSettings}}var CLAUDE_HOOK_EVENT_MAP,KOBE_HOOK_EVENTS,WORKTREE_SYNC_MARKER="worktree-created",ClaudeHookAdapter;var init_hook_adapter=__esm(()=>{init_json_hook_adapter();init_json_hooks();CLAUDE_HOOK_EVENT_MAP=[{event:"SessionStart",verb:"session-start"},{event:"UserPromptSubmit",verb:"turn-start"},{event:"Stop",verb:"turn-complete"},{event:"StopFailure",verb:"turn-failed"},{event:"Notification",matcher:"permission_prompt",verb:"awaiting-input"},{event:"Notification",matcher:"elicitation_dialog",verb:"awaiting-input"},{event:"SessionEnd",verb:"session-end"},{event:"PreCompact",verb:"pre-compact"},{event:"PostCompact",verb:"post-compact"},{event:"SubagentStart",verb:"subagent-start"},{event:"SubagentStop",verb:"subagent-stop"},{event:"PreToolUse",verb:"tool-pre"},{event:"PostToolUse",verb:"tool-post"},{event:"PostToolUseFailure",verb:"tool-failed"}],KOBE_HOOK_EVENTS=[...new Set(CLAUDE_HOOK_EVENT_MAP.map((e)=>e.event))];ClaudeHookAdapter=class ClaudeHookAdapter extends JsonHookAdapter{vendor="claude";eventMap=CLAUDE_HOOK_EVENT_MAP;globalSettingsPath(){return claudeSettingsPath()}activityDetailFromPayload(kind,payload){if(kind==="turn-failed")return{failure:failureFromErrorType(payload.error_type)};if(kind==="awaiting-input")return{waiting:payload.notification_type==="elicitation_dialog"?"input":"permission"};if(kind==="tool-pre"||kind==="tool-post"||kind==="tool-failed")return{tool:{...typeof payload.tool_name==="string"?{name:payload.tool_name}:{},...typeof payload.tool_use_id==="string"?{id:payload.tool_use_id}:{}}};if(kind==="pre-compact"||kind==="post-compact")return{compact:{trigger:payload.trigger==="manual"?"manual":"auto"}};if(kind==="subagent-start"||kind==="subagent-stop")return{subagent:{...typeof payload.agent_type==="string"?{type:payload.agent_type}:{},...typeof payload.agent_id==="string"?{id:payload.agent_id}:{}}};return}sessionFromPayload(payload){if(typeof payload.session_id!=="string"||!payload.session_id)return;return{sessionId:payload.session_id,...typeof payload.transcript_path==="string"&&payload.transcript_path?{transcriptPath:payload.transcript_path}:{}}}supportsWorktreeSync(){return!0}async removeWorktreeSyncHook(settingsFilePath){await editJsonSettings(settingsFilePath,(cur)=>mergeWorktreeSyncHook(cur,null))}}});import{spawn}from"child_process";function computeNextAllowedAt(startedAt,finishedAt,timedOut,cfg){if(timedOut)return startedAt+cfg.slowRetryMs;return finishedAt+Math.max(cfg.minIntervalMs,(finishedAt-startedAt)*5)}function shouldPoll(state,now){return!state.inFlight&&now>=state.nextAllowedAt}function applyJitter(delayMs,ratio,rand=Math.random){let r=Math.max(0,Math.min(1,ratio)),offset=(rand()*2-1)*delayMs*r;return Math.max(0,delayMs+offset)}function exponentialBackoff(baseMs,attempt,capMs){if(attempt<=0)return Math.min(baseMs,capMs);return Math.min(baseMs*2**attempt,capMs)}function maybeStartScheduledRun(state,cfg,run,onValue){let startedAt=Date.now();if(!shouldPoll(state,startedAt))return!1;state.inFlight=!0;let controller=new AbortController,timer=setTimeout(()=>controller.abort(),cfg.timeoutMs);return(async()=>{let value,ok=!1;try{value=await run(controller.signal),ok=!0}catch{}clearTimeout(timer);let timedOut=controller.signal.aborted;if(state.nextAllowedAt=computeNextAllowedAt(startedAt,Date.now(),timedOut,cfg),state.inFlight=!1,ok&&!timedOut)onValue(value)})(),!0}function decodeCapturedChunks(chunks){return Buffer.concat(chunks.map((c)=>typeof c==="string"?Buffer.from(c):c)).toString("utf8")}function spawnCapture(cmd,args,opts){return new Promise((resolve2)=>{let chunks=[],settled=!1,finish=(status)=>{if(settled)return;settled=!0,resolve2({status,stdout:decodeCapturedChunks(chunks)})},child=spawn(cmd,args.slice(),{cwd:opts.cwd,stdio:["ignore","pipe","ignore"],env:opts.env,signal:opts.signal,killSignal:"SIGKILL"});child.stdout?.on("data",(chunk)=>{chunks.push(chunk)}),child.on("error",()=>finish(null)),child.on("close",(code)=>finish(code))})}var init_poll_scheduling=()=>{};import{readFile as readFile5}from"fs/promises";import{homedir as homedir10,userInfo}from"os";import path6 from"path";function parseResetsAtMs(value){if(value==null)return null;let numeric=typeof value==="number"?value:/^\d+(?:\.\d+)?$/.test(value.trim())?Number(value):null;if(numeric!=null){if(!Number.isFinite(numeric)||numeric<=0)return null;return numeric<1000000000000?numeric*1000:numeric}let parsed=Date.parse(String(value));return Number.isNaN(parsed)?null:parsed}function windowLabel(kind,scopeModel){if(kind==="weekly_scoped"&&scopeModel)return scopeModel;return kind.startsWith("weekly")||kind.startsWith("seven_day")?"7d":"5h"}function usageFromClaudePayload(payload,capturedAt){let windows=[];if(payload.limits?.length)for(let limit of payload.limits){if(typeof limit.kind!=="string"||typeof limit.percent!=="number")continue;windows.push({kind:limit.kind,label:windowLabel(limit.kind,limit.scope?.model?.display_name),percent:clampPercent(limit.percent),resetsAt:parseResetsAtMs(limit.resets_at)})}else{if(typeof payload.five_hour?.utilization==="number")windows.push({kind:"session",label:"5h",percent:clampPercent(payload.five_hour.utilization),resetsAt:parseResetsAtMs(payload.five_hour.resets_at)});if(typeof payload.seven_day?.utilization==="number")windows.push({kind:"weekly_all",label:"7d",percent:clampPercent(payload.seven_day.utilization),resetsAt:parseResetsAtMs(payload.seven_day.resets_at)})}return{windows,capturedAt}}function parseCredentials(raw){try{let oauth=JSON.parse(raw)?.claudeAiOauth;if(!oauth||typeof oauth.accessToken!=="string"||!oauth.accessToken)return null;return{accessToken:oauth.accessToken,...typeof oauth.expiresAt==="number"&&Number.isFinite(oauth.expiresAt)?{expiresAt:oauth.expiresAt}:{}}}catch{return null}}async function readFileCredentials(dir){try{return parseCredentials(await readFile5(path6.join(dir,".credentials.json"),"utf8"))}catch{return null}}async function readKeychainCredentials(){if(process.platform!=="darwin")return null;let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),3000);try{let result=await spawnCapture("security",["find-generic-password","-a",userInfo().username,"-w","-s",KEYCHAIN_SERVICE],{cwd:homedir10(),signal:controller.signal});return result.status===0?parseCredentials(result.stdout.trim()):null}finally{clearTimeout(timeout)}}async function readAccessToken(){let configDir=process.env.CLAUDE_CONFIG_DIR?.trim();if(configDir){let fromFile=await readFileCredentials(configDir);return fromFile&&isFresh(fromFile)?fromFile.accessToken:null}return[await readKeychainCredentials(),await readFileCredentials(path6.join(homedir10(),".claude"))].find((c)=>c!=null&&isFresh(c))?.accessToken??null}async function fetchClaudeQuotaUsage(now=Date.now){let token=await readAccessToken().catch(()=>null);if(!token)return null;let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),USAGE_TIMEOUT_MS);try{let response=await fetch(OAUTH_USAGE_URL,{headers:{Authorization:`Bearer ${token}`,"Content-Type":"application/json","User-Agent":OAUTH_USER_AGENT,"anthropic-beta":OAUTH_BETA_HEADER},signal:controller.signal});if(!response.ok)return null;return usageFromClaudePayload(await response.json(),now())}catch{return null}finally{clearTimeout(timeout)}}var OAUTH_USAGE_URL="https://api.anthropic.com/api/oauth/usage",OAUTH_BETA_HEADER="oauth-2025-04-20",OAUTH_USER_AGENT="claude-cli/2.1.198 (external, cli)",USAGE_TIMEOUT_MS=1e4,KEYCHAIN_SERVICE="Claude Code-credentials",clampPercent=(value)=>Math.min(100,Math.max(0,Math.round(value))),isFresh=(c)=>c.expiresAt===void 0||c.expiresAt>Date.now();var init_quota=__esm(()=>{init_poll_scheduling()});var CLAUDE_SCREEN_MANIFEST;var init_screen=__esm(()=>{CLAUDE_SCREEN_MANIFEST={rules:[],composerEmpty:[{bottomLines:6,all:["\u276F"],lineRegex:["^\\s*\u276F\\s*(?:[\xB7\u2022]\\s*(?:\u2190[^\\n]*)?)?$"]}]}});import{homedir as homedir11}from"os";import path7 from"path";function trustClaudeWorktree(worktreePath,home=homedir11()){updateSharedJsonSync(path7.join(home,".claude.json"),(raw)=>{if(raw===void 0)return{};try{return JSON.parse(raw)}catch{return{}}},(doc)=>{let projects={...doc.projects??{}},existing=projects[worktreePath]??{};if(existing.hasTrustDialogAccepted===!0)return;return projects[worktreePath]={...existing,hasTrustDialogAccepted:!0,hasCompletedProjectOnboarding:!0},JSON.stringify({...doc,projects},null,2)})}var init_trust=__esm(()=>{init_shared_config_write()});function isSyntheticClaudeRecord(record){return record.isMeta===!0||record.isCompactSummary===!0}function isClaudeCommandBreadcrumb(blocks){if(blocks.length===0)return!1;for(let b of blocks){if(b.type!=="text")return!1;let t=b.text.trim();if(!t.startsWith("<command-name>")&&!t.startsWith("<command-message>")&&!t.startsWith("<local-command"))return!1}return!0}function isObject2(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function opensTurn(content){if(typeof content==="string")return content.trim().length>0;if(!Array.isArray(content))return!1;return content.some((b)=>!isObject2(b)||b.type!=="tool_result")}function num(v){return typeof v==="number"&&Number.isFinite(v)?v:0}function readUsage(v){if(!isObject2(v))return;return{input_tokens:num(v.input_tokens),output_tokens:num(v.output_tokens),cache_read_input_tokens:num(v.cache_read_input_tokens),cache_creation_input_tokens:num(v.cache_creation_input_tokens)}}function finish(draft){if(!draft.id)return null;let totals={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0};for(let u of draft.usageByMessage.values())totals.input_tokens+=u.input_tokens,totals.output_tokens+=u.output_tokens,totals.cache_read_input_tokens+=u.cache_read_input_tokens,totals.cache_creation_input_tokens+=u.cache_creation_input_tokens;return{id:draft.id,sessionId:draft.sessionId,...draft.model?{model:draft.model}:{},startedAt:draft.startedAt,endedAt:draft.endedAt,...draft.usageByMessage.size>0?{usage:totals}:{}}}function parseClaudeTurns(raw,fallbackSessionId=""){let out=[],draft=null;for(let line of raw.split(`
@@ -35,7 +35,7 @@ ${TRUST_LINE}
35
35
  `}function kimiFailureDetail(payload){let type=typeof payload.error_type==="string"?payload.error_type:"",message=typeof payload.error_message==="string"?payload.error_message:"",note=type||void 0;return{failure:(()=>{if(type==="APIProviderRateLimitError"||message.includes("provider.rate_limit"))return"rate_limit";if(type==="APIProviderQuotaExhaustedError")return"rate_limit";if(message.includes("provider.auth_error"))return"billing";return"other"})(),...note?{note}:{}}}class KimiHookAdapter{vendor="kimi";supportsHooks(){return!0}globalSettingsPath(){return kimiConfigPath()}activityDetailFromPayload(kind,payload){if(kind==="turn-failed")return kimiFailureDetail(payload);if(kind==="awaiting-input")return{waiting:"permission"};if(kind==="tool-pre"||kind==="tool-post"||kind==="tool-failed")return{tool:{...typeof payload.tool_name==="string"?{name:payload.tool_name}:{}}};return}sessionFromPayload(payload){if(typeof payload.session_id!=="string"||!payload.session_id)return;return{sessionId:payload.session_id}}async installActivityHooks(settingsFilePath,opts={}){if(!existsSync7(dirname7(settingsFilePath)))return;await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!0,void 0,opts))}async removeActivityHooks(settingsFilePath){if(!existsSync7(settingsFilePath))return;await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!1))}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async removeWorktreeWatchHook(){}}async function editTomlConfig(path14,transform){try{let current="";try{current=await readFile6(path14,"utf8")}catch(error){if(!(error&&typeof error==="object"&&("code"in error)&&error.code==="ENOENT"))return}let next=transform(current);if(next===current)return;await mkdir5(dirname7(path14),{recursive:!0}),await writeFile3(path14,next)}catch{}}var KIMI_HOOK_EVENT_MAP,KOBE_KIMI_HOOK_EVENTS,BLOCK_BEGIN="# >>> rove hooks",BLOCK_END="# <<< rove hooks",HOOK_TIMEOUT_SECONDS=10;var init_hook_adapter4=__esm(()=>{init_invocation();init_shell_command();init_json_hooks();KIMI_HOOK_EVENT_MAP=[{event:"SessionStart",verb:"session-start"},{event:"UserPromptSubmit",verb:"turn-start"},{event:"Stop",verb:"turn-complete"},{event:"StopFailure",verb:"turn-failed"},{event:"Interrupt",verb:"turn-interrupted"},{event:"PermissionRequest",verb:"awaiting-input"},{event:"SessionEnd",verb:"session-end"},{event:"PreCompact",verb:"pre-compact"},{event:"PostCompact",verb:"post-compact"},{event:"SubagentStart",verb:"subagent-start"},{event:"SubagentStop",verb:"subagent-stop"},{event:"PreToolUse",verb:"tool-pre"},{event:"PostToolUse",verb:"tool-post"},{event:"PostToolUseFailure",verb:"tool-failed"}],KOBE_KIMI_HOOK_EVENTS=[...new Set(KIMI_HOOK_EVENT_MAP.map((e)=>e.event))]});var KIMI_SCREEN_MANIFEST;var init_screen4=__esm(()=>{KIMI_SCREEN_MANIFEST={rules:[{state:"blocked",all:["\u21B5 confirm"],any:["approve","reject","revise"]},{state:"blocked",all:["\u2191\u2193 select","esc cancel"]},{state:"working",lineRegex:["^\\s*(\uD83C\uDF15|\uD83C\uDF16|\uD83C\uDF17|\uD83C\uDF18|\uD83C\uDF11|\uD83C\uDF12|\uD83C\uDF13|\uD83C\uDF14)","^\\s*[\\u2800-\\u28FF]+\\s*(thinking|working|using )"]}],composerEmpty:[{bottomLines:2,all:[">"],lineRegex:["^\\s*\u2502?\\s*>\\s*[\u2026]?\\s*\u2502?\\s*$"]}]}});import{createHash as createHash5}from"crypto";import{existsSync as existsSync8,mkdirSync as mkdirSync6,writeFileSync as writeFileSync6}from"fs";import{homedir as homedir19}from"os";import path14 from"path";function kimiTrustFilePath(worktreePath,home=homedir19()){let hash=createHash5("sha256").update(worktreePath).digest("hex").slice(0,12);return path14.join(home,".kimi-code","workspace-trust",`wd_${path14.basename(worktreePath)}_${hash}`)}function trustKimiWorktree(worktreePath,home=homedir19()){let file=kimiTrustFilePath(worktreePath,home);if(existsSync8(file))return;mkdirSync6(path14.dirname(file),{recursive:!0,mode:448}),writeFileSync6(file,JSON.stringify({root:worktreePath,trustedAt:Date.now()}),{mode:384})}var init_trust3=()=>{};import{readFile as readFile7,stat as stat7}from"fs/promises";class EngineTurnDetector{supportsCompletionMarkers(){return!0}async latestCompletion(worktree){return(await this.latestActivity(worktree)).marker}async latestActivityInFile(_transcriptPath){return null}}function createEngineTurnDetector(vendor){return engineEntry(vendor).createTurnDetector()}function latestClaudeCompletionMarkerFromJsonl(raw,sourceId="claude",fallbackMtimeMs=0){let latest=null,lineNo=0;for(let line of raw.split(`
36
36
  `)){lineNo++;let record=parseJsonLine(line);if(!record)continue;let inner=isObject8(record.message)?record.message:record;if(inner.role!=="assistant")continue;if(!("content"in inner))continue;let timestampMs=timestampFromRecord(record,fallbackMtimeMs),marker={id:`claude:${sourceId}:${timestampMs}:${lineNo}`,timestampMs,source:"claude"};if(!latest||marker.timestampMs>=latest.timestampMs)latest=marker}return latest}function isCodexCompletionRecord(record){if(record.type==="turn.completed")return!0;if(record.type!=="event_msg")return!1;let payload=isObject8(record.payload)?record.payload:void 0;return typeof payload?.type==="string"&&CODEX_ROLLOUT_DONE_EVENTS.has(payload.type)}function latestCodexCompletionMarkerFromJsonl(raw,sourceId="codex"){let latest=null,lineNo=0;for(let line of raw.split(`
37
37
  `)){lineNo++;let record=parseJsonLine(line);if(!record||!isCodexCompletionRecord(record))continue;let timestampMs=timestampFromRecord(record,0),marker={id:`codex:${sourceId}:${timestampMs}:${lineNo}`,timestampMs,source:"codex"};if(!latest||marker.timestampMs>=latest.timestampMs)latest=marker}return latest}function parseJsonLine(line){let trimmed=line.trim();if(!trimmed)return null;try{let parsed=JSON.parse(trimmed);return isObject8(parsed)?parsed:null}catch{return null}}function timestampFromRecord(record,fallback){let ts=typeof record.timestamp==="string"?Date.parse(record.timestamp):Number.NaN;return Number.isFinite(ts)?ts:fallback}function isObject8(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}var statMtimeMs=(path15)=>stat7(path15).then((s)=>s.mtimeMs,()=>0),defaultClaudeDeps,ClaudeTurnDetector,defaultCodexDeps,CodexTurnDetector,UnknownTurnDetector,CODEX_ROLLOUT_DONE_EVENTS;var init_turn_detector=__esm(()=>{init_history2();init_history();init_registry();defaultClaudeDeps={listSessionFiles:(worktree)=>listSessionFilesForWorktree(worktree),readFile:(path15)=>readFile7(path15,"utf8"),statMtimeMs};ClaudeTurnDetector=class ClaudeTurnDetector extends EngineTurnDetector{deps;vendor="claude";cache=new Map;constructor(deps=defaultClaudeDeps){super();this.deps=deps}async latestActivity(worktree){let files=await this.deps.listSessionFiles(worktree),mtimeMs=files[0]?.mtimeMs??0,latest=null,next=new Map;for(let file of files.slice(0,4)){let hit=this.cache.get(file.path),marker;if(hit&&file.mtimeMs>0&&hit.mtimeMs===file.mtimeMs)marker=hit.marker;else{let raw=await this.deps.readFile(file.path).catch(()=>"");marker=latestClaudeCompletionMarkerFromJsonl(raw,file.path,file.mtimeMs)}if(next.set(file.path,{mtimeMs:file.mtimeMs,marker}),marker&&(!latest||marker.timestampMs>latest.timestampMs))latest=marker}return this.cache=next,{marker:latest,mtimeMs}}async latestActivityInFile(transcriptPath2){let mtimeMs=await(this.deps.statMtimeMs??statMtimeMs)(transcriptPath2);if(mtimeMs===0)return null;let raw=await this.deps.readFile(transcriptPath2).catch(()=>"");return{marker:latestClaudeCompletionMarkerFromJsonl(raw,transcriptPath2,mtimeMs),mtimeMs}}};defaultCodexDeps={findLatestRollout:(worktree)=>findLatestRolloutForWorktree(worktree),readFile:(path15)=>readFile7(path15,"utf8")};CodexTurnDetector=class CodexTurnDetector extends EngineTurnDetector{deps;vendor="codex";cache=null;constructor(deps=defaultCodexDeps){super();this.deps=deps}async latestActivity(worktree){if(!worktree)return{marker:null,mtimeMs:0};let found=await this.deps.findLatestRollout(worktree);if(!found)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===found.path&&found.mtimeMs>0&&this.cache.mtimeMs===found.mtimeMs)return{marker:this.cache.marker,mtimeMs:found.mtimeMs};let raw=await this.deps.readFile(found.path).catch(()=>"");if(!raw)return{marker:null,mtimeMs:found.mtimeMs};let marker=latestCodexCompletionMarkerFromJsonl(raw,found.path);return this.cache={path:found.path,mtimeMs:found.mtimeMs,marker},{marker,mtimeMs:found.mtimeMs}}};UnknownTurnDetector=class UnknownTurnDetector extends EngineTurnDetector{vendor;constructor(vendor){super();this.vendor=vendor}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}};CODEX_ROLLOUT_DONE_EVENTS=new Set(["task_complete","turn_complete","turn_aborted"])});var BUILTIN_ENGINES;var init_builtin_engines=__esm(()=>{init_account_detect();init_capabilities();init_hook_adapter();init_quota();init_screen();init_trust();init_turns();init_capabilities2();init_hook_adapter2();init_quota2();init_screen2();init_terminal_title();init_trust2();init_screen3();init_history_readers();init_hook_adapter3();init_hook_adapter4();init_screen4();init_trust3();init_turn_detector();BUILTIN_ENGINES={claude:{vendor:"claude",builtin:!0,displayName:claudeIdentity.shortName,defaultCommand:["claude"],history:claudeHistoryReader,detectAccount:(deps)=>detectClaudeAccount(deps),createHookAdapter:()=>new ClaudeHookAdapter,createTurnDetector:()=>new ClaudeTurnDetector,capabilities:claudeCapabilities,identity:claudeIdentity,trustWorktree:trustClaudeWorktree,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},sessionIdentity:{pinFlag:"--session-id",sessionControlFlags:["--session-id","--resume","-r","--continue","-c","--from-pr"],resumeArgv:(base,id)=>[...base,"--resume",id],forkArgv:(base,sourceId,newId)=>{let forked=[...base,"--resume",sourceId,"--fork-session"];return newId?[...forked,"--session-id",newId]:forked}},quotaUsage:()=>fetchClaudeQuotaUsage(),readTurns:readClaudeTurns,screenManifest:CLAUDE_SCREEN_MANIFEST},codex:{vendor:"codex",builtin:!0,displayName:codexIdentity.shortName,defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh"],effortArgv:(base,level)=>[...base,"-c",`model_reasoning_effort=${level}`],history:codexHistoryReader,detectAccount:(deps)=>detectCodexAccount(deps),createHookAdapter:()=>new CodexHookAdapter,createTurnDetector:()=>new CodexTurnDetector,capabilities:codexCapabilities,identity:codexIdentity,trustWorktree:trustCodexWorktree,screenManifest:CODEX_SCREEN_MANIFEST,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"],sessionIdFromTitle:codexSessionIdFromTitle},sessionIdentity:{resumeArgv:(base,id)=>{let[bin,...rest]=base;return bin?[bin,"resume",...rest,id]:base},forkArgv:(base,sourceId)=>{let[bin,...rest]=base;return bin?[bin,"fork",...rest,sourceId]:null}},quotaUsage:()=>fetchCodexQuotaUsage()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:copilotHistoryReader,detectAccount:(deps)=>detectCopilotAccount(deps),createHookAdapter:()=>new NoopHookAdapter("copilot"),createTurnDetector:()=>new UnknownTurnDetector("copilot"),screenManifest:COPILOT_SCREEN_MANIFEST},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:trustKimiWorktree,history:kimiHistoryReader,detectAccount:(deps)=>detectKimiAccount(deps),createHookAdapter:()=>new KimiHookAdapter,createTurnDetector:()=>new UnknownTurnDetector("kimi"),sessionIdentity:{sessionControlFlags:["-S","--session","-c","--continue"],resumeArgv:(base,id)=>[...base,"-S",id]},screenManifest:KIMI_SCREEN_MANIFEST}}});function stripStatusPrefix(title,prefixes){for(let prefix of[...prefixes].sort((a,b)=>b.length-a.length)){if(!title.startsWith(prefix))continue;let rest=title.slice(prefix.length).trimStart();if(rest.length===0)return title;return rest}return title}function titleTurnHint(config,title){let working=config?.workingPrefixes;if(config?.ownsStatus!==!0||!working||working.length===0)return null;let trimmed=title.trim();if(trimmed.length===0)return null;return working.some((prefix)=>trimmed.startsWith(prefix))?"working":"rest"}function titleSessionId(config,title){let trimmed=title.trim();if(!trimmed)return null;return config?.sessionIdFromTitle?.(trimmed)??null}function titleIsPlaceholder(config,title){return titleSessionId(config,title)!==null}function customEngineEntry(vendor){return{vendor,builtin:!1,displayName:vendor,defaultCommand:[vendor],history:EMPTY_HISTORY,createHookAdapter:()=>new NoopHookAdapter(vendor),createTurnDetector:()=>new UnknownTurnDetector(vendor)}}function engineEntry(vendor){if(isBuiltinVendor(vendor))return BUILTIN_ENGINES[vendor];let custom=customEngineEntry(vendor);return isContribEngine(vendor)?contribEngineEntry(vendor,custom):custom}function supportsStructuredHistory(vendor){return engineEntry(vendor).history.readHistory!==EMPTY_HISTORY.readHistory}function engineStatusPrefixes(vendor){let declared=engineEntry(vendor).terminalTitle?.statusPrefixes;return declared&&declared.length>0?declared:ALL_STATUS_PREFIXES}function stripEngineStatusPrefix(title,vendor){return stripStatusPrefix(title,vendor?engineStatusPrefixes(vendor):ALL_STATUS_PREFIXES)}function engineTitleTurnHint(vendor,title){return titleTurnHint(engineEntry(vendor).terminalTitle,title)}function engineSessionIdFromTitle(vendor,title){return titleSessionId(engineEntry(vendor).terminalTitle,title)}function isEnginePlaceholderTitle(title,vendor){return titleIsPlaceholder(engineEntry(vendor).terminalTitle,title)}function getCapabilities(vendor){return engineEntry(vendor).capabilities}function vendorsWithQuotaProbe(){return Object.values(BUILTIN_ENGINES).filter((entry)=>entry.quotaUsage).map((entry)=>entry.vendor)}var ALL_STATUS_PREFIXES;var init_registry=__esm(()=>{init_vendor();init_builtin_engines();init_contrib_engines();init_history_readers();init_hook_adapter3();init_turn_detector();ALL_STATUS_PREFIXES=[...new Set(Object.values(BUILTIN_ENGINES).flatMap((entry)=>entry.terminalTitle?.statusPrefixes??[]))]});var exports_foreground={};__export(exports_foreground,{vendorFromArgv:()=>vendorFromArgv,psSnapshot:()=>psSnapshot,parsePsSnapshot:()=>parsePsSnapshot,hasAncestor:()=>hasAncestor,foregroundEngineIn:()=>foregroundEngineIn,foregroundEngine:()=>foregroundEngine,executableNameFromArgv:()=>executableNameFromArgv,engineProcessIn:()=>engineProcessIn});import{basename as basename2}from"path";function binaryName(token){return basename2(token).replace(/\.(exe|js|mjs|cjs)$/,"")}function executableNameFromArgv(argv){for(let token of argv.slice(0,8)){if(/^[A-Za-z_][A-Za-z0-9_]*=/.test(token))continue;let name=binaryName(token);if(WRAPPERS.has(name))continue;return name||null}return null}function vendorFromArgv(commandLine){let name=executableNameFromArgv(commandLine.trim().split(/\s+/));if(!name)return null;return BUILTIN_VENDORS.find((v)=>{let entry=engineEntry(v);return entry.defaultCommand[0]===name||entry.processNames?.includes(name)===!0})??null}function parsePsSnapshot(text){let rows=[];for(let line of text.split(`
38
- `)){let m=/^\s*(\d+)\s+(\d+)\s+(\S.*)$/.exec(line);if(m)rows.push({pid:Number(m[1]),ppid:Number(m[2]),args:m[3]})}return rows}function childrenIndex(rows){let kids=new Map;for(let row of rows){let list=kids.get(row.ppid);if(list)list.push(row);else kids.set(row.ppid,[row])}return kids}function hasAncestor(rows,pid,ancestorPid){let parents=new Map(rows.map((r)=>[r.pid,r.ppid])),cur=pid;for(let hops=0;hops<=rows.length;hops++){if(cur===ancestorPid)return!0;let next=parents.get(cur);if(next===void 0||next<=1)return!1;cur=next}return!1}function foregroundEngineIn(rows,rootPid){let kids=childrenIndex(rows),queue=[...kids.get(rootPid)??[]];while(queue.length>0){let row=queue.shift();if(!row)break;let vendor=vendorFromArgv(row.args);if(vendor)return{vendor,argv:row.args,pid:row.pid};queue.push(...kids.get(row.pid)??[])}return null}function engineProcessIn(rows,rootPid,extraLaunch){if(foregroundEngineIn(rows,rootPid))return!0;let expected=extraLaunch?executableNameFromArgv(typeof extraLaunch==="string"?[extraLaunch]:extraLaunch):null;if(!expected)return!1;let kids=childrenIndex(rows),queue=[...kids.get(rootPid)??[]];while(queue.length>0){let row=queue.shift();if(!row)break;if(executableNameFromArgv(row.args.trim().split(/\s+/))===expected)return!0;queue.push(...kids.get(row.pid)??[])}return!1}async function foregroundEngine(rootPid,snapshot=psSnapshot){try{return foregroundEngineIn(parsePsSnapshot(await snapshot()),rootPid)}catch{return null}}var WRAPPERS,psSnapshot=async()=>{let proc=Bun.spawn(["ps","-A","-o","pid=,ppid=,args="],{stdout:"pipe",stderr:"ignore"});return await new Response(proc.stdout).text()};var init_foreground=__esm(()=>{init_vendor();init_registry();WRAPPERS=new Set(["node","bun","npx","deno","sh","zsh","bash","env","script"])});function argvHasFlag(argv,flag){return argv.some((a)=>a===flag||a.startsWith(`${flag}=`))}function flagValue(argv,flag){for(let i=0;i<argv.length;i++){if(argv[i]===flag)return argv[i+1];if(argv[i].startsWith(`${flag}=`))return argv[i].slice(flag.length+1)}return}function engineCommandKey(vendor){return`engineCommand.${vendor}`}function engineNameKey(vendor){return`engineName.${vendor}`}function engineDisplayName(vendor){return getPersistedString(engineNameKey(vendor))?.trim()||engineEntry(vendor).displayName}function humanizeSlug(id){return id.split(/[-_]+/).filter((word)=>word.length>0).map((word)=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")}function defaultEngineCommand(vendor){return engineEntry(coerceVendorId(vendor)).defaultCommand}function parseEngineCommand(command){let out=[],token="",hasToken=!1,quote=null;for(let ch of command){if(quote){if(ch===quote)quote=null;else token+=ch;continue}if(ch==='"'||ch==="'"){quote=ch,hasToken=!0;continue}if(/\s/.test(ch)){if(hasToken)out.push(token),token="",hasToken=!1;continue}token+=ch,hasToken=!0}if(hasToken)out.push(token);return out}function interactiveEngineCommand(vendor,effort){let v=coerceVendorId(vendor),override=getPersistedString(engineCommandKey(v))?.trim(),base=(()=>{if(override){let argv=parseEngineCommand(override);if(argv.length>0)return argv}return defaultEngineCommand(v)})();return withEngineTerminalTitle(withEngineEffort(base,v,effort),v)}function withEngineTerminalTitle(argv,vendor){let args=engineEntry(coerceVendorId(vendor)).terminalTitle?.launchArgs;return args&&args.length>0?[...argv,...args]:argv}function withEngineEffort(argv,vendor,effort){let trimmed=effort?.trim();if(!trimmed)return argv;let entry=engineEntry(coerceVendorId(vendor));if(!entry.effortLevels?.includes(trimmed))return argv;return entry.effortArgv?.(argv,trimmed)??argv}function kobeApiInvocation(){let quote=(a)=>/^[A-Za-z0-9_/.:=-]+$/.test(a)?a:`'${a.replace(/'/g,"'\\''")}'`;try{return[...kobeCliInvocation(),"api"].map(quote).join(" ")}catch{return"rove api"}}var VENDOR_LABEL;var init_interactive_command=__esm(()=>{init_invocation();init_registry();init_repos();init_vendor();VENDOR_LABEL=Object.fromEntries(BUILTIN_VENDORS.map((v)=>[v,engineEntry(v).displayName]))});function hasFlag(argv,flag){return argv.some((a)=>a===flag||a.startsWith(`${flag}=`))}function controlsOwnSession(identity,argv){return(identity?.sessionControlFlags??[]).some((flag)=>hasFlag(argv,flag))}function pinSessionArgv(identity,argv,sessionId){if(!identity?.pinFlag)return argv;if(controlsOwnSession(identity,argv))return argv;return[...argv,identity.pinFlag,sessionId]}function acceptsPinnedSession(identity,argv){return!!identity?.pinFlag&&!controlsOwnSession(identity,argv)}function resumeSessionArgv(identity,base,sessionId){if(!sessionId||!identity?.resumeArgv)return null;if(controlsOwnSession(identity,base))return null;return identity.resumeArgv(base,sessionId)}function pickUnclaimedSessionId(ids,claimed){for(let i=ids.length-1;i>=0;i--){let id=ids[i];if(id&&!claimed.has(id))return id}return null}function forkSessionArgvFor(identity,base,sourceId,newId){if(!sourceId||!identity?.forkArgv)return null;if(controlsOwnSession(identity,base))return null;return identity.forkArgv(base,sourceId,newId)}function acceptsSessionFork(identity){return!!identity?.forkArgv}import{randomUUID as randomUUID2}from"crypto";function engineProtocolKey(id){return`engineProtocol.${id}`}function getEngineProtocol(id){if(isBuiltinVendor(id)||isContribEngine(id))return id;let raw=getPersistedString(engineProtocolKey(id))?.trim();return raw&&ENGINE_PROTOCOLS.includes(raw)?raw:void 0}function isPresetId(id){return isBuiltinVendor(id)||isContribEngine(id)||getCustomEngineIds().includes(id)}function listPresetIds(){return[...BUILTIN_VENDORS,...getCustomEngineIds()]}function describePreset(id){let command=getPersistedString(engineCommandKey(id))?.trim()||defaultEngineCommand(id).join(" ");return{id,name:engineDisplayName(id),command,protocol:getEngineProtocol(id)??GENERIC_PROTOCOL,builtin:isBuiltinVendor(id)}}function listEnginePresets(){return listPresetIds().map(describePreset)}function resolveCommandProtocol(command){let trimmed=command?.trim();if(!trimmed)return GENERIC_PROTOCOL;if(isPresetId(trimmed))return getEngineProtocol(trimmed)??GENERIC_PROTOCOL;let fromArgv=vendorFromArgv(trimmed);if(fromArgv)return fromArgv;let argv0=parseEngineCommand(trimmed)[0];if(argv0)for(let id of getCustomEngineIds()){let preset=getPersistedString(engineCommandKey(id))?.trim();if(preset&&parseEngineCommand(preset)[0]===argv0)return getEngineProtocol(id)??GENERIC_PROTOCOL}return GENERIC_PROTOCOL}function engineLaunchArgv(spec){let command=spec.command?.trim();if(!command)return interactiveEngineCommand(spec.vendor,spec.effort);let vendor=(isPresetId(command)?getEngineProtocol(command):void 0)??resolveCommandProtocol(command),base=isPresetId(command)?presetBaseArgv(command):(()=>{let argv=parseEngineCommand(command);return argv.length>0?argv:null})();if(!base)return interactiveEngineCommand(spec.vendor,spec.effort);return withEngineTerminalTitle(withEngineEffort(base,vendor,spec.effort),vendor)}function presetBaseArgv(id){let override=getPersistedString(engineCommandKey(id))?.trim();if(override){let argv=parseEngineCommand(override);if(argv.length>0)return argv}return defaultEngineCommand(id)}function sessionProtocol(vendor){let id=vendor?.trim();if(!id)return"claude";return getEngineProtocol(id)??id}function protocolEntry(vendor){return engineEntry(sessionProtocol(vendor))}function withPinnedSessionId(argv,vendor,newId=randomUUID2){let identity=engineEntry(sessionProtocol(vendor)).sessionIdentity;if(!acceptsPinnedSession(identity,argv))return{argv,sessionId:null};let sessionId=newId();return{argv:pinSessionArgv(identity,argv,sessionId),sessionId}}function engineResumeArgv(base,vendor,sessionId){return resumeSessionArgv(engineEntry(sessionProtocol(vendor)).sessionIdentity,base,sessionId)}function engineCanFork(vendor){return acceptsSessionFork(engineEntry(sessionProtocol(vendor)).sessionIdentity)}function engineForkArgv(base,vendor,sourceId,newId){return forkSessionArgvFor(engineEntry(sessionProtocol(vendor)).sessionIdentity,base,sourceId,newId)}var GENERIC_PROTOCOL="generic",ENGINE_PROTOCOLS;var init_engine_presets=__esm(()=>{init_registry();init_repos();init_vendor();init_contrib_engines();init_foreground();init_interactive_command();ENGINE_PROTOCOLS=BUILTIN_VENDORS});var PLUGIN_EVENT_NAMES,DAEMON_CHANNELS;var init_contract=__esm(()=>{PLUGIN_EVENT_NAMES=["task.created","task.deleted","task.changed","task.landed","task.pr-changed","worktree.created","issue.changed","note.filed","message.delivered","attention.handled","automation.dispatched","automation.skipped","automation.failed","quota.exhausted","quota.resumed","session.exited","plugin.enabled","plugin.disabled","agent.turn-complete","agent.permission-needed","agent.rate-limited","agent.error","agent.running","agent.idle","session.start","session.end","turn.prompt","turn.complete","turn.failed","turn.interrupted","tool.pre","tool.post","tool.failed","attention.permission","attention.question","context.pre-compact","context.post-compact","subagent.start","subagent.stop","file.will-open","file.opened","file.closed","task.opened","project.opened","tab.opened","tab.closed"],DAEMON_CHANNELS=["task.snapshot","issue.snapshot","active-task","update","engine-state","attention.inbox","ui-prefs","keybindings","task.jobs","worktree.changes","transcript.activity","session.deliver","tab.open","tab.close","engine.lifecycle","notice.event","usage.snapshot","ui.prompt"]});var DATE_TIME_RE,TomlDate;var init_date=__esm(()=>{/*!
38
+ `)){let m=/^\s*(\d+)\s+(\d+)\s+(\S.*)$/.exec(line);if(m)rows.push({pid:Number(m[1]),ppid:Number(m[2]),args:m[3]})}return rows}function childrenIndex(rows){let kids=new Map;for(let row of rows){let list=kids.get(row.ppid);if(list)list.push(row);else kids.set(row.ppid,[row])}return kids}function hasAncestor(rows,pid,ancestorPid){let parents=new Map(rows.map((r)=>[r.pid,r.ppid])),cur=pid;for(let hops=0;hops<=rows.length;hops++){if(cur===ancestorPid)return!0;let next=parents.get(cur);if(next===void 0||next<=1)return!1;cur=next}return!1}function foregroundEngineIn(rows,rootPid){let kids=childrenIndex(rows),queue=[...kids.get(rootPid)??[]];while(queue.length>0){let row=queue.shift();if(!row)break;let vendor=vendorFromArgv(row.args);if(vendor)return{vendor,argv:row.args,pid:row.pid};queue.push(...kids.get(row.pid)??[])}return null}function engineProcessIn(rows,rootPid,extraLaunch){if(foregroundEngineIn(rows,rootPid))return!0;let expected=extraLaunch?executableNameFromArgv(typeof extraLaunch==="string"?[extraLaunch]:extraLaunch):null;if(!expected)return!1;let kids=childrenIndex(rows),queue=[...kids.get(rootPid)??[]];while(queue.length>0){let row=queue.shift();if(!row)break;if(executableNameFromArgv(row.args.trim().split(/\s+/))===expected)return!0;queue.push(...kids.get(row.pid)??[])}return!1}async function foregroundEngine(rootPid,snapshot=psSnapshot){try{return foregroundEngineIn(parsePsSnapshot(await snapshot()),rootPid)}catch{return null}}var WRAPPERS,psSnapshot=async()=>{let proc=Bun.spawn(["ps","-A","-o","pid=,ppid=,args="],{stdout:"pipe",stderr:"ignore"});return await new Response(proc.stdout).text()};var init_foreground=__esm(()=>{init_vendor();init_registry();WRAPPERS=new Set(["node","bun","npx","deno","sh","zsh","bash","env","script"])});function argvHasFlag(argv,flag){return argv.some((a)=>a===flag||a.startsWith(`${flag}=`))}function flagValue(argv,flag){for(let i=0;i<argv.length;i++){if(argv[i]===flag)return argv[i+1];if(argv[i].startsWith(`${flag}=`))return argv[i].slice(flag.length+1)}return}function engineCommandKey(vendor){return`engineCommand.${vendor}`}function engineNameKey(vendor){return`engineName.${vendor}`}function engineDisplayName(vendor){return getPersistedString(engineNameKey(vendor))?.trim()||engineEntry(vendor).displayName}function humanizeSlug(id){return id.split(/[-_]+/).filter((word)=>word.length>0).map((word)=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")}function defaultEngineCommand(vendor){return engineEntry(coerceVendorId(vendor)).defaultCommand}function parseEngineCommand(command){let out=[],token="",hasToken=!1,quote=null;for(let ch of command){if(quote){if(ch===quote)quote=null;else token+=ch;continue}if(ch==='"'||ch==="'"){quote=ch,hasToken=!0;continue}if(/\s/.test(ch)){if(hasToken)out.push(token),token="",hasToken=!1;continue}token+=ch,hasToken=!0}if(hasToken)out.push(token);return out}function interactiveEngineCommand(vendor,effort){let v=coerceVendorId(vendor),override=getPersistedString(engineCommandKey(v))?.trim(),base=(()=>{if(override){let argv=parseEngineCommand(override);if(argv.length>0)return argv}return defaultEngineCommand(v)})();return withEngineTerminalTitle(withEngineEffort(base,v,effort),v)}function withEngineTerminalTitle(argv,vendor){let args=engineEntry(coerceVendorId(vendor)).terminalTitle?.launchArgs;return args&&args.length>0?[...argv,...args]:argv}function withEngineEffort(argv,vendor,effort){let trimmed=effort?.trim();if(!trimmed)return argv;let entry=engineEntry(coerceVendorId(vendor));if(!entry.effortLevels?.includes(trimmed))return argv;return entry.effortArgv?.(argv,trimmed)??argv}function kobeApiInvocation(){let quote=(a)=>/^[A-Za-z0-9_/.:=-]+$/.test(a)?a:`'${a.replace(/'/g,"'\\''")}'`;try{return[...roveCliInvocation(),"api"].map(quote).join(" ")}catch{return"rove api"}}var VENDOR_LABEL;var init_interactive_command=__esm(()=>{init_invocation();init_registry();init_repos();init_vendor();VENDOR_LABEL=Object.fromEntries(BUILTIN_VENDORS.map((v)=>[v,engineEntry(v).displayName]))});function hasFlag(argv,flag){return argv.some((a)=>a===flag||a.startsWith(`${flag}=`))}function controlsOwnSession(identity,argv){return(identity?.sessionControlFlags??[]).some((flag)=>hasFlag(argv,flag))}function pinSessionArgv(identity,argv,sessionId){if(!identity?.pinFlag)return argv;if(controlsOwnSession(identity,argv))return argv;return[...argv,identity.pinFlag,sessionId]}function acceptsPinnedSession(identity,argv){return!!identity?.pinFlag&&!controlsOwnSession(identity,argv)}function resumeSessionArgv(identity,base,sessionId){if(!sessionId||!identity?.resumeArgv)return null;if(controlsOwnSession(identity,base))return null;return identity.resumeArgv(base,sessionId)}function pickUnclaimedSessionId(ids,claimed){for(let i=ids.length-1;i>=0;i--){let id=ids[i];if(id&&!claimed.has(id))return id}return null}function forkSessionArgvFor(identity,base,sourceId,newId){if(!sourceId||!identity?.forkArgv)return null;if(controlsOwnSession(identity,base))return null;return identity.forkArgv(base,sourceId,newId)}function acceptsSessionFork(identity){return!!identity?.forkArgv}import{randomUUID as randomUUID2}from"crypto";function engineProtocolKey(id){return`engineProtocol.${id}`}function getEngineProtocol(id){if(isBuiltinVendor(id)||isContribEngine(id))return id;let raw=getPersistedString(engineProtocolKey(id))?.trim();return raw&&ENGINE_PROTOCOLS.includes(raw)?raw:void 0}function isPresetId(id){return isBuiltinVendor(id)||isContribEngine(id)||getCustomEngineIds().includes(id)}function listPresetIds(){return[...BUILTIN_VENDORS,...getCustomEngineIds()]}function describePreset(id){let command=getPersistedString(engineCommandKey(id))?.trim()||defaultEngineCommand(id).join(" ");return{id,name:engineDisplayName(id),command,protocol:getEngineProtocol(id)??GENERIC_PROTOCOL,builtin:isBuiltinVendor(id)}}function listEnginePresets(){return listPresetIds().map(describePreset)}function resolveCommandProtocol(command){let trimmed=command?.trim();if(!trimmed)return GENERIC_PROTOCOL;if(isPresetId(trimmed))return getEngineProtocol(trimmed)??GENERIC_PROTOCOL;let fromArgv=vendorFromArgv(trimmed);if(fromArgv)return fromArgv;let argv0=parseEngineCommand(trimmed)[0];if(argv0)for(let id of getCustomEngineIds()){let preset=getPersistedString(engineCommandKey(id))?.trim();if(preset&&parseEngineCommand(preset)[0]===argv0)return getEngineProtocol(id)??GENERIC_PROTOCOL}return GENERIC_PROTOCOL}function engineLaunchArgv(spec){let command=spec.command?.trim();if(!command)return interactiveEngineCommand(spec.vendor,spec.effort);let vendor=(isPresetId(command)?getEngineProtocol(command):void 0)??resolveCommandProtocol(command),base=isPresetId(command)?presetBaseArgv(command):(()=>{let argv=parseEngineCommand(command);return argv.length>0?argv:null})();if(!base)return interactiveEngineCommand(spec.vendor,spec.effort);return withEngineTerminalTitle(withEngineEffort(base,vendor,spec.effort),vendor)}function presetBaseArgv(id){let override=getPersistedString(engineCommandKey(id))?.trim();if(override){let argv=parseEngineCommand(override);if(argv.length>0)return argv}return defaultEngineCommand(id)}function sessionProtocol(vendor){let id=vendor?.trim();if(!id)return"claude";return getEngineProtocol(id)??id}function protocolEntry(vendor){return engineEntry(sessionProtocol(vendor))}function withPinnedSessionId(argv,vendor,newId=randomUUID2){let identity=engineEntry(sessionProtocol(vendor)).sessionIdentity;if(!acceptsPinnedSession(identity,argv))return{argv,sessionId:null};let sessionId=newId();return{argv:pinSessionArgv(identity,argv,sessionId),sessionId}}function engineResumeArgv(base,vendor,sessionId){return resumeSessionArgv(engineEntry(sessionProtocol(vendor)).sessionIdentity,base,sessionId)}function engineCanFork(vendor){return acceptsSessionFork(engineEntry(sessionProtocol(vendor)).sessionIdentity)}function engineForkArgv(base,vendor,sourceId,newId){return forkSessionArgvFor(engineEntry(sessionProtocol(vendor)).sessionIdentity,base,sourceId,newId)}var GENERIC_PROTOCOL="generic",ENGINE_PROTOCOLS;var init_engine_presets=__esm(()=>{init_registry();init_repos();init_vendor();init_contrib_engines();init_foreground();init_interactive_command();ENGINE_PROTOCOLS=BUILTIN_VENDORS});var PLUGIN_EVENT_NAMES,DAEMON_CHANNELS;var init_contract=__esm(()=>{PLUGIN_EVENT_NAMES=["task.created","task.deleted","task.changed","task.landed","task.pr-changed","worktree.created","issue.changed","note.filed","message.delivered","attention.handled","automation.dispatched","automation.skipped","automation.failed","quota.exhausted","quota.resumed","session.exited","plugin.enabled","plugin.disabled","agent.turn-complete","agent.permission-needed","agent.rate-limited","agent.error","agent.running","agent.idle","session.start","session.end","turn.prompt","turn.complete","turn.failed","turn.interrupted","tool.pre","tool.post","tool.failed","attention.permission","attention.question","context.pre-compact","context.post-compact","subagent.start","subagent.stop","file.will-open","file.opened","file.closed","task.opened","project.opened","tab.opened","tab.closed"],DAEMON_CHANNELS=["task.snapshot","issue.snapshot","active-task","update","engine-state","attention.inbox","ui-prefs","keybindings","task.jobs","worktree.changes","transcript.activity","session.deliver","tab.open","tab.close","engine.lifecycle","notice.event","usage.snapshot","ui.prompt"]});var DATE_TIME_RE,TomlDate;var init_date=__esm(()=>{/*!
39
39
  * Copyright (c) Squirrel Chat et al., All rights reserved.
40
40
  * SPDX-License-Identifier: BSD-3-Clause
41
41
  *
@@ -293,7 +293,7 @@ ${codeblock}`,options);this.line=line,this.column=column,this.codeblock=codebloc
293
293
  `,{mode:384})}function upsertPluginEntry(registry,entry){return{plugins:[...registry.plugins.filter((p)=>p.id!==entry.id),entry]}}function removePluginEntry(registry,id){return{plugins:registry.plugins.filter((p)=>p.id!==id)}}var EMPTY;var init_registry2=__esm(()=>{init_plugin_paths();EMPTY={plugins:[]}});var exports_plugin_engines={};__export(exports_plugin_engines,{reloadPluginEngines:()=>reloadPluginEngines,loadPluginEngines:()=>loadPluginEngines});function loadPluginEngines(homeDir2){let registered=[];try{for(let entry of loadPluginRegistry(homeDir2).plugins){if(!entry.enabled)continue;try{let{manifest}=readPluginManifest(entry.root);for(let engine of manifest.engines){let identity={vendorId:engine.id,shortName:engine.identity?.shortName??engine.name};if(registerPluginEngine(engine.id,{displayName:engine.name,defaultCommand:engine.command,...engine.processNames?{processNames:engine.processNames}:{},screenManifest:{rules:engine.rules},identity}))registered.push(engine.id);else console.warn(`[rove] plugin ${entry.id}: engine id \`${engine.id}\` shadows a built-in or shipped engine \u2014 skipped`)}}catch{}}}catch{}return registered}function reloadPluginEngines(homeDir2){clearPluginEngines();let registered=loadPluginEngines(homeDir2);return resetAvailableVendorsCache(),registered}var init_plugin_engines=__esm(()=>{init_manifest();init_registry2();init_account_detect();init_contrib_engines()});function helpStep(verbName){return{hint:"run the verb's --help for its exact flag contract, then retry",nextCommandArgs:["api",verbName,"--help"]}}var ApiError,VERB_GROUP_IDS;var init_types=__esm(()=>{ApiError=class ApiError extends Error{code;data;constructor(message,code,data){super(message);this.code=code;this.data=data}};VERB_GROUP_IDS=["discover","read","create","drive","edit","issues","workitems","routine","lifecycle","worktree","feedback"]});import{readFileSync as readFileSync9}from"fs";import{resolve as resolve2}from"path";function parsePositiveInt(raw){if(!/^\d+$/.test(raw.trim()))return;let n=Number.parseInt(raw,10);return Number.isSafeInteger(n)&&n>0?n:void 0}function parseBoolLiteral(raw){if(["true","1","yes"].includes(raw))return!0;if(["false","0","no"].includes(raw))return!1;return}function parseFlags(argv,booleanFlags=new Set){let flags=new Map,pretty=!1,help=!1;for(let i=0;i<argv.length;i++){let arg=argv[i];if(!arg.startsWith("--")&&arg!=="-h")throw new ApiError(`unexpected positional arg: ${arg}`,"BAD_FLAG");if(arg==="-h"){help=!0;continue}let eq=arg.indexOf("=");if(eq!==-1){let key2=arg.slice(2,eq),value=arg.slice(eq+1);if(key2==="pretty")pretty=value!=="false"&&value!=="0";else if(key2==="help")help=value!=="false"&&value!=="0";else flags.set(key2,value);continue}let key=arg.slice(2);if(key==="pretty"){pretty=!0;continue}if(key==="help"){help=!0;continue}if(booleanFlags.has(key)){let next2=argv[i+1];if(next2!==void 0&&parseBoolLiteral(next2)!==void 0)flags.set(key,next2),i+=1;else flags.set(key,"true");continue}let next=argv[i+1];if(next===void 0||next.startsWith("--"))throw new ApiError(`flag --${key} requires a value`,"BAD_FLAG");flags.set(key,next),i+=1}return{flags,pretty,help}}function validateAgainstSpec(verb,flags){let known=new Set(verb.flags.map((f)=>f.name));for(let key of flags.keys())if(!known.has(key))throw new ApiError(`unknown flag --${key} for "${verb.name}"`,"BAD_FLAG",helpStep(verb.name));for(let f of verb.flags){let satisfied=flags.get(f.name)||f.name==="prompt"&&flags.get("prompt-file");if(f.required&&!satisfied)throw new ApiError(`--${f.name} is required for "${verb.name}"`,"MISSING_FLAG",helpStep(verb.name));if(f.type==="enum"&&f.values){let raw=flags.get(f.name);if(raw!==void 0&&!f.values.includes(raw)){if(f.name==="vendor"&&getCustomEngineIds().includes(raw))continue;throw new ApiError(`--${f.name} must be one of ${f.values.join(", ")}`,"BAD_FLAG",helpStep(verb.name))}}if(f.type==="int"){let raw=flags.get(f.name);if(raw!==void 0&&parsePositiveInt(raw)===void 0)throw new ApiError(`--${f.name} must be a positive integer`,"BAD_FLAG")}}}class VerbArgs{verb;flags;constructor(verb,flags){this.verb=verb;this.flags=flags}spec(name){let f=this.verb.flags.find((s)=>s.name===name);if(!f)throw Error(`internal: --${name} is not declared on verb "${this.verb.name}"`);return f}str(name){this.spec(name);let v=this.flags.get(name);return v&&v.length>0?v:void 0}present(name){return this.spec(name),this.flags.get(name)!==void 0}promptText(){if(this.promptMemo!==void 0)return this.promptMemo.value;let value=this.readPromptText();return this.promptMemo={value},value}promptMemo;readPromptText(){let inline=this.str("prompt"),file=this.str("prompt-file");if(inline!==void 0&&file!==void 0)throw new ApiError("pass --prompt or --prompt-file, not both","BAD_FLAG",helpStep(this.verb.name));if(file===void 0)return inline;let text=readFileSync9(file==="-"?0:resolve2(process.cwd(),expandTilde(file)),"utf8");if(text.trim().length===0)throw new ApiError(`--prompt-file ${file} is empty`,"BAD_FLAG");return text}require(name){let v=this.str(name);if(v===void 0)throw new ApiError(`--${name} is required`,"MISSING_FLAG");return v}enumOf(name){let f=this.spec(name),v=this.str(name);if(v===void 0)return;if(f.values&&!f.values.includes(v))throw new ApiError(`--${name} must be one of ${f.values.join(", ")}`,"BAD_FLAG",helpStep(this.verb.name));return v}requireEnum(name){return this.require(name),this.enumOf(name)}vendor(){let value=this.str("vendor");if(value===void 0)return;let builtins=this.spec("vendor").values??ALL_VENDORS;if(builtins.includes(value))return value;if(getCustomEngineIds().includes(value))return value;throw new ApiError(`--vendor must be a built-in (${builtins.join(", ")}) or a registered custom engine id`,"BAD_FLAG",helpStep(this.verb.name))}bool(name){this.spec(name);let raw=this.str(name);if(raw===void 0)return;let value=parseBoolLiteral(raw);if(value===void 0)throw new ApiError(`--${name} must be a boolean (true/false)`,"BAD_FLAG");return value}int(name){this.spec(name);let raw=this.str(name);if(raw===void 0)return;let n=parsePositiveInt(raw);if(n===void 0)throw new ApiError(`--${name} must be a positive integer`,"BAD_FLAG");return n}path(name){let v=this.str(name);return v===void 0?void 0:resolve2(process.cwd(),expandTilde(v))}requirePath(name){return resolve2(process.cwd(),expandTilde(this.require(name)))}}function parseAgentsSpec(spec){let out=[];for(let part of spec.split(",")){let trimmed=part.trim();if(!trimmed)continue;let colon=trimmed.indexOf(":");if(colon===-1)throw new ApiError(`--agents entry "${trimmed}" must be engine:count`,"BAD_FLAG",FANOUT_STEP);let vendor=trimmed.slice(0,colon);if(!ALL_VENDORS.includes(vendor)&&!getCustomEngineIds().includes(vendor))throw new ApiError(`--agents engine "${vendor}" must be a built-in (${ALL_VENDORS.join(", ")}) or a registered engine id \u2014 see \`engine-list\``,"BAD_FLAG",FANOUT_STEP);let count=parsePositiveInt(trimmed.slice(colon+1));if(count===void 0)throw new ApiError(`--agents count for "${vendor}" must be a positive integer`,"BAD_FLAG",FANOUT_STEP);if(out.length+count>FANOUT_CAP)throw new ApiError(`--agents requests ${out.length+count} agents, exceeds the cap of ${FANOUT_CAP}`,"BAD_FLAG",FANOUT_STEP);for(let i=0;i<count;i++)out.push(vendor)}if(out.length===0)throw new ApiError('--agents specified no agents (e.g. "claude:2,codex:1")',"BAD_FLAG",FANOUT_STEP);return out}function buildCountPlan(count,vendor){if(count>FANOUT_CAP)throw new ApiError(`--count ${count} exceeds the parallel cap of ${FANOUT_CAP} \u2014 spawn in batches`,"BAD_FLAG",FANOUT_STEP);return Array(count).fill(vendor)}var FANOUT_CAP=10,FANOUT_STEP,F;var init_flags=__esm(()=>{init_path_home();init_repos();init_vendor();init_types();FANOUT_STEP=helpStep("add"),F={repo:(required=!0)=>({name:"repo",type:"string",required,placeholder:"PATH",description:"Repo root (git toplevel). Relative paths resolve against $PWD."}),taskId:(required=!0)=>({name:"task-id",type:"string",required,placeholder:"ID",description:"Target task id (from `list` / `add`)."}),vendor:()=>({name:"vendor",type:"enum",values:ALL_VENDORS,placeholder:"V",description:"Engine vendor for the task."}),command:()=>({name:"command",type:"string",placeholder:"CMD",description:"Engine launch command, verbatim \u2014 an engine id from `engine-list` (e.g. claude) or a full command line (e.g. 'codex --search'). Unvalidated: probe an unfamiliar engine's flags with `<cmd> --help` first. Omitted = the repo's default engine."}),title:()=>({name:"title",type:"string",placeholder:"T",description:"Human task title."}),prompt:(required,desc)=>({name:"prompt",type:"string",required,placeholder:"TEXT",description:required?`${desc} Required unless --prompt-file is given.`:desc}),promptFile:()=>({name:"prompt-file",type:"string",placeholder:"PATH",description:"Read the prompt from this file instead of --prompt (`-` = stdin). Use it whenever the text has backticks, $vars, or quotes you don't want the shell to touch. Exactly one of --prompt / --prompt-file."})}});function isAttentionInboxState(value){return typeof value==="string"&&ATTENTION_INBOX_STATES.includes(value)}function attentionInboxItemKey(item){let lane=item.state==="prompt_deferred"?"\x00deferred":"";return`${item.taskId}\x00${item.tabId??""}${lane}`}var ATTENTION_INBOX_STATES;var init_contracts=__esm(()=>{ATTENTION_INBOX_STATES=["turn_complete","permission_needed","error","rate_limited","prompt_deferred","dead"]});function isChannelName(value){return typeof value==="string"&&CHANNEL_NAME_SET.has(value)}function normalizeChannelFilter(value){if(!Array.isArray(value))return null;let set=new Set;for(let name of value)if(isChannelName(name))set.add(name);return set.size>0?set:null}var CHANNEL_NAMES,CHANNEL_NAME_SET;var init_channels=__esm(()=>{init_contract();CHANNEL_NAMES=DAEMON_CHANNELS,CHANNEL_NAME_SET=new Set(CHANNEL_NAMES)});function isProtocolCompatible(args){return args.remoteVersion>=args.localMin&&args.localVersion>=args.remoteMin}function isDaemonVersionStale(daemonVersion,clientVersion){if(!daemonVersion)return!1;return daemonVersion!==clientVersion}function isForeignDaemonHome(daemonHome,clientHome){if(!daemonHome)return!1;let strip=(value)=>value.replace(/[/\\]+$/,"");return strip(daemonHome)!==strip(clientHome)}function displayTaskTitle(task){return task.title||task.branch||task.worktreePath||task.repo||"scratch"}function serializeTask(task){return{id:task.id,title:displayTaskTitle(task),repo:task.repo,branch:task.branch,worktreePath:task.worktreePath,kind:task.kind??"task",...task.scratch?{scratch:!0}:{},...task.routine?{routine:task.routine}:{},status:task.status,pinned:task.pinned??!1,vendor:task.vendor,command:task.command,prStatus:task.prStatus,modelEffort:task.modelEffort,groupId:task.groupId,observedLanguage:task.observedLanguage,deletion:task.deletion,quotaResume:task.quotaResume,linkedWorkItem:task.linkedWorkItem,dispatcher:task.dispatcher,prompt:task.prompt,baseRef:task.baseRef,createdAt:task.createdAt,updatedAt:task.updatedAt}}function frameToLine(frame){return`${JSON.stringify(frame)}
294
294
  `}var DAEMON_PROTOCOL_VERSION=4,MIN_COMPATIBLE_PROTOCOL_VERSION=2;var init_protocol=__esm(()=>{init_contracts();init_channels()});var exports_client={};__export(exports_client,{RpcTimeoutError:()=>RpcTimeoutError,KobeDaemonClient:()=>KobeDaemonClient});import{connect}from"net";import{StringDecoder}from"string_decoder";function rpcTimeoutMs(){let raw=process.env.KOBE_RPC_TIMEOUT_MS?.trim();if(raw){let parsed=Number.parseInt(raw,10);if(Number.isFinite(parsed))return parsed}return 20000}class KobeDaemonClient{socketPath;socket=null;buffer="";nextId=1;pending=new Map;handlers=new Map;lifecycleHandlers=new Map;connecting=null;disposed=!1;constructor(socketPath){this.socketPath=socketPath}connect(){if(this.socket)return Promise.resolve();if(this.disposed)return Promise.reject(Error("daemon client disposed"));if(this.connecting)return this.connecting;let p=this.openSocket();this.connecting=p;let cleanup=()=>{if(this.connecting===p)this.connecting=null};return p.then(cleanup,cleanup),p}get isDisposed(){return this.disposed}close(){this.disposed=!0,this.socket?.end(),this.socket=null,this.failPending()}forceDisconnect(){let socket=this.socket;if(!socket)return;this.socket=null,socket.destroy(),this.failPending()}failPending(){if(this.pending.size===0)return;let err=Error("daemon connection closed");for(let pending of this.pending.values()){if(pending.timer)clearTimeout(pending.timer);pending.reject(err)}this.pending.clear()}on(name,handler){let set=this.handlers.get(name);if(!set)set=new Set,this.handlers.set(name,set);return set.add(handler),()=>{if(set?.delete(handler),set?.size===0)this.handlers.delete(name)}}onChannel(channel,handler){return this.on(channel,(frame)=>handler(frame.payload))}subscribe(opts={}){let payload={};if(opts.channels)payload.channels=opts.channels;if(opts.role)payload.role=opts.role;return this.request("subscribe",payload)}onLifecycle(name,handler){let set=this.lifecycleHandlers.get(name);if(!set)set=new Set,this.lifecycleHandlers.set(name,set);return set.add(handler),()=>{if(set?.delete(handler),set?.size===0)this.lifecycleHandlers.delete(name)}}async request(name,payload){await this.connect();let socket=this.socket;if(!socket)throw Error("daemon connection is not open");let id=String(this.nextId++),promise=new Promise((resolve3,reject)=>{let entry={resolve:(value)=>resolve3(value),reject},timeoutMs=rpcTimeoutMs();if(timeoutMs>0&&!RPC_TIMEOUT_EXEMPT.has(name))entry.timer=setTimeout(()=>this.onRequestTimeout(id,name,timeoutMs),timeoutMs);this.pending.set(id,entry)});return socket.write(frameToLine({type:"request",id,name,payload})),promise}onRequestTimeout(id,name,timeoutMs){let pending=this.pending.get(id);if(!pending)return;this.pending.delete(id),pending.reject(new RpcTimeoutError(name,timeoutMs)),this.forceDisconnect(),this.emitLifecycle("close")}openSocket(){return new Promise((resolve3,reject)=>{let socket=connect(this.socketPath);this.socket=socket;let onConnect=()=>{socket.off("error",onError),socket.on("error",()=>socket.destroy()),resolve3()},onError=(err)=>{if(socket.off("connect",onConnect),this.socket===socket)this.socket=null;reject(err)};socket.once("connect",onConnect),socket.once("error",onError);let decoder=new StringDecoder("utf8");this.buffer="",socket.on("data",(chunk)=>this.onData(decoder.write(chunk))),socket.on("close",()=>this.onSocketClose(socket))})}onSocketClose(which){if(this.socket!==which)return;this.socket=null,this.failPending(),this.emitLifecycle("close")}emitLifecycle(name){for(let handler of this.lifecycleHandlers.get(name)??[])try{handler()}catch(err){console.error(`[rove] lifecycle handler for "${name}" threw:`,err)}}onData(chunk){this.buffer+=chunk;let nl=this.buffer.indexOf(`
295
295
  `);while(nl!==-1){let line=this.buffer.slice(0,nl);if(this.buffer=this.buffer.slice(nl+1),line.trim().length>0)this.onLine(line);nl=this.buffer.indexOf(`
296
- `)}}onLine(line){let frame;try{frame=JSON.parse(line)}catch(err){logClientError("client-frame",err);return}if(frame.type==="event"){this.emit(frame);return}if(frame.type!=="response")return;let pending=this.pending.get(frame.id);if(!pending)return;if(this.pending.delete(frame.id),pending.timer)clearTimeout(pending.timer);if(frame.error){let err=Error(frame.error.message);if(frame.error.name)err.name=frame.error.name;pending.reject(err)}else pending.resolve(frame.payload)}emit(frame){for(let handler of this.handlers.get(frame.name)??[])try{handler(frame)}catch(err){logClientError("client-event",err)}for(let handler of this.handlers.get("*")??[])try{handler(frame)}catch(err){logClientError("client-event",err)}}}var RpcTimeoutError,RPC_TIMEOUT_EXEMPT;var init_client=__esm(()=>{init_protocol();init_client_log();RpcTimeoutError=class RpcTimeoutError extends Error{constructor(name,timeoutMs){super(`daemon rpc "${name}" timed out after ${timeoutMs}ms (daemon wedged?)`);this.name="RpcTimeoutError"}};RPC_TIMEOUT_EXEMPT=new Set(["task.ensureWorktree","task.ensureMain","worktree.discoverAdoptable","worktree.adopt","worktree.list","worktree.remove"])});function daemonOf(ctx){if(!ctx.client)throw new ApiError("daemon required","BAD_DAEMON");return ctx.client}async function simpleRpc(ctx,name,payload){return daemonOf(ctx).request(name,payload)}async function handlePtyList(){let[{KobeDaemonClient:KobeDaemonClient2},{defaultPtyHostSocketPath:defaultPtyHostSocketPath2}]=await Promise.all([Promise.resolve().then(() => (init_client(),exports_client)),Promise.resolve().then(() => (init_paths(),exports_paths))]),client=new KobeDaemonClient2(defaultPtyHostSocketPath2());try{return await client.connect(),await client.request("pty.list",{})}catch{return{sessions:[]}}finally{client.close()}}var init_handler_helpers=__esm(()=>{init_types()});async function listAllEnginePresets(){loadPluginEngines();let presets=[...listEnginePresets()],seen=new Set(presets.map((p)=>p.id));for(let id of await installedEngineIds())if(!seen.has(id))presets.push(describePreset(id));return presets}async function setCommand(ctx){let command=ctx.args.require("command"),vendor=resolveCommandProtocol(command);return await simpleRpc(ctx,"task.setCommand",{taskId:ctx.args.require("task-id"),command,vendor}),{ok:!0,command,protocol:vendor,...vendor===GENERIC_PROTOCOL?{generic:!0}:{}}}function taskEngine(task){let command=task.command?.trim();if(command){let resolved=resolveCommandProtocol(command);if(resolved!==GENERIC_PROTOCOL)return resolved}return coerceVendorId(task.vendor)}async function setEffort(ctx){let taskId=ctx.args.require("task-id"),level=ctx.args.require("level").trim(),daemon=daemonOf(ctx),{task}=await daemon.request("task.get",{taskId}),engine=taskEngine(task),levels=engineEntry(engine).effortLevels??[];if(levels.length===0)throw new ApiError(`engine ${engine} declares no reasoning effort levels`,"BAD_EFFORT",{engine,hint:"Only engines with declared levels accept one (codex today). Check the task's engine with `get-task`.",nextCommandArgs:["api","get-task","--task-id",taskId]});if(!levels.includes(level))throw new ApiError(`engine ${engine} does not accept effort level ${JSON.stringify(level)} \u2014 it declares ${levels.join(", ")}`,"BAD_EFFORT",{engine,levels,hint:`Pass one of: ${levels.join(", ")}.`});return await simpleRpc(ctx,"task.setVendor",{taskId,vendor:engine,effort:level}),{ok:!0,taskId,engine,effort:level}}var ENGINE_LIST_VERB,SET_COMMAND_VERB,SET_EFFORT_VERB;var init_handlers_engines=__esm(()=>{init_account_detect();init_engine_presets();init_plugin_engines();init_registry();init_vendor();init_flags();init_handler_helpers();init_types();ENGINE_LIST_VERB={name:"engine-list",group:"discover",summary:"List every engine Rove can launch \u2014 built-ins, registered presets, the shipped contrib engines whose CLI is on PATH (gemini, opencode, cursor, grok, droid, amp), and engines contributed by enabled plugins \u2014 each with its RAW launch command, exactly as it runs. Copy one into `add --command` / `send --tab new --command` verbatim, or edit its flags first. `protocol` is the adapter Rove speaks to it (history, trust, delivery); `generic` = none, which still runs fine but loses transcript reads. Returns { engines }.",flags:[],offline:!0,handler:async()=>({engines:await listAllEnginePresets()})};SET_COMMAND_VERB={name:"set-command",group:"edit",summary:"Set a task's engine launch command (takes effect on the next session rebuild). The protocol Rove speaks to it is derived from the command \u2014 the result reports which one, `generic` when the command names no engine Rove knows.",flags:[F.taskId(),{...F.command(),required:!0}],handler:setCommand};SET_EFFORT_VERB={name:"set-effort",group:"edit",summary:"Set a task's reasoning effort level (takes effect on the next session rebuild). Rejected when the task's engine declares no levels, or does not declare THIS one \u2014 the error names the levels it does accept. Codex accepts none/low/medium/high/xhigh; claude has none.",flags:[F.taskId(),{name:"level",type:"string",required:!0,placeholder:"LEVEL",description:"Effort level the task's engine declares (codex: none, low, medium, high, xhigh)."}],handler:setEffort}});var package_default;var init_package=__esm(()=>{package_default={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.94",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",keywords:["terminal","tui","cli","multiplexer","ai-agents","coding-agent","ai-coding-assistant","agentic-ai","parallel-agents","git-worktree","claude-code","codex","llm","developer-tools"],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://rove.run",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","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"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.17","@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 exports_version={};__export(exports_version,{repoSlug:()=>repoSlug,releasePageUrl:()=>releasePageUrl,recommendedGlobalInstallCommand:()=>recommendedGlobalInstallCommand,owningNpmPrefix:()=>owningNpmPrefix,isNewerSemver:()=>isNewerSemver,fetchReleaseSummaries:()=>fetchReleaseSummaries,fetchReleaseNotesRange:()=>fetchReleaseNotesRange,fetchReleaseNotes:()=>fetchReleaseNotes,compareSemver:()=>compareSemver,checkLatestVersion:()=>checkLatestVersion,channelOf:()=>channelOf,breakingVersionsCrossed:()=>breakingVersionsCrossed,UPDATE_SCRIPT_URL:()=>UPDATE_SCRIPT_URL,UPDATE_COMMAND:()=>UPDATE_COMMAND,RELEASE_CHANNELS:()=>RELEASE_CHANNELS,PACKAGE_NAME:()=>PACKAGE_NAME,DEFAULT_RELEASE_CHANNEL:()=>DEFAULT_RELEASE_CHANNEL,CURRENT_VERSION:()=>CURRENT_VERSION2,BREAKING_VERSIONS:()=>BREAKING_VERSIONS});import{fileURLToPath as fileURLToPath2}from"url";function repoSlug(){let url=package_default.repository?.url;if(!url)return null;let m=url.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!m||!m[1]||!m[2])return null;return`${m[1]}/${m[2]}`}function owningNpmPrefix(modulePath=fileURLToPath2(import.meta.url)){let at=modulePath.indexOf("/lib/node_modules/");if(at<=0)return null;return modulePath.slice(0,at)}function recommendedGlobalInstallCommand(prefix=owningNpmPrefix()){let target=`${PACKAGE_NAME}@latest`;return prefix===null?`npm install -g ${target}`:`npm install -g --prefix ${prefix} ${target}`}function breakingVersionsCrossed(from,to,breaking=BREAKING_VERSIONS){let[lo,hi]=compareSemver(from,to)<=0?[from,to]:[to,from];return breaking.filter((b)=>compareSemver(b,lo)>0&&compareSemver(b,hi)<=0)}function channelOf(version=CURRENT_VERSION2){return prereleaseOf(version)?.split(".")[0]==="nightly"?"nightly":DEFAULT_RELEASE_CHANNEL}async function fetchLatestFromRegistry(packageName,channel){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let encoded=packageName.replace("/","%2F"),res=await fetch(`https://registry.npmjs.org/${encoded}/${channel}`,{signal:ctrl.signal,headers:{accept:"application/json"}});if(!res.ok)return null;let body=await res.json();if(typeof body.version!=="string")return null;return body.version}catch{return null}finally{clearTimeout(timer)}}function isNewerSemver(latest,current){let core=compareSemver(latest,current);if(core!==0)return core>0;return comparePrerelease(prereleaseOf(latest),prereleaseOf(current))>0}function prereleaseOf(version){let dash=version.indexOf("-");return dash===-1?void 0:version.slice(dash+1)||void 0}function comparePrerelease(a,b){if(a===b)return 0;if(a===void 0)return 1;if(b===void 0)return-1;let aParts=a.split("."),bParts=b.split(".");for(let i=0;i<Math.max(aParts.length,bParts.length);i++){let av=aParts[i],bv=bParts[i];if(av===void 0)return-1;if(bv===void 0)return 1;if(av===bv)continue;let an=/^\d+$/.test(av)?Number.parseInt(av,10):null,bn=/^\d+$/.test(bv)?Number.parseInt(bv,10):null;if(an!==null&&bn!==null)return an>bn?1:-1;if(an!==null)return-1;if(bn!==null)return 1;return av>bv?1:-1}return 0}function compareSemver(aVersion,bVersion){let norm=(v)=>v.split("-")[0]??v,a=norm(aVersion).split(".").map((s)=>Number.parseInt(s,10)),b=norm(bVersion).split(".").map((s)=>Number.parseInt(s,10));for(let i=0;i<3;i++){let av=a[i]??0,bv=b[i]??0;if(Number.isNaN(av)||Number.isNaN(bv))return 0;if(av>bv)return 1;if(av<bv)return-1}return 0}async function checkLatestVersion(opts={}){let channel=opts.channel??channelOf(),fake=process.env.KOBE_FAKE_UPDATE;if(fake)return{current:CURRENT_VERSION2,latest:fake,hasUpdate:isNewerSemver(fake,CURRENT_VERSION2),channel};if(isDev()&&!opts.force)return null;let latest=await fetchLatestFromRegistry(PACKAGE_NAME,channel);if(!latest)return null;return{current:CURRENT_VERSION2,latest,hasUpdate:isNewerSemver(latest,CURRENT_VERSION2),channel}}function versionFromTagName(tagName){if(typeof tagName!=="string")return null;return tagName.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function fetchReleaseNotes(version){let slug=repoSlug();if(!slug)return null;let tag=`v${version}`,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases/tags/${tag}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return null;let body=await res.json();if(typeof body.body!=="string"||typeof body.html_url!=="string")return null;return{body:body.body,url:body.html_url,version}}catch{return null}finally{clearTimeout(timer)}}async function fetchReleaseNotesRange(args){let slug=repoSlug();if(!slug)return[];let limit=args.limit??100,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];return body.map((release2)=>{let version=versionFromTagName(release2.tag_name);if(!version||typeof release2.html_url!=="string"||typeof release2.body!=="string")return null;if(compareSemver(version,args.current)<=0)return null;if(compareSemver(version,args.latest)>0)return null;return{version,url:release2.html_url,body:release2.body}}).filter((release2)=>release2!==null)}catch{return[]}finally{clearTimeout(timer)}}async function fetchReleaseSummaries(limit=12){let slug=repoSlug();if(!slug)return[];let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];return body.map((release2)=>{let version=versionFromTagName(release2.tag_name);if(!version||typeof release2.html_url!=="string")return null;return{version,url:release2.html_url}}).filter((release2)=>release2!==null)}catch{return[]}finally{clearTimeout(timer)}}function releasePageUrl(version){let slug=repoSlug();if(!slug)return null;return`https://github.com/${slug}/releases/tag/v${version}`}var CURRENT_VERSION2,PACKAGE_NAME,UPDATE_SCRIPT_URL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",UPDATE_COMMAND,BREAKING_VERSIONS,FETCH_TIMEOUT_MS=3000,RELEASE_CHANNELS,DEFAULT_RELEASE_CHANNEL="latest";var init_version=__esm(()=>{init_package();init_env();CURRENT_VERSION2=package_default.version,PACKAGE_NAME=package_default.name;UPDATE_COMMAND=`curl -fsSL ${UPDATE_SCRIPT_URL} | sh`;BREAKING_VERSIONS=[];RELEASE_CHANNELS=["latest","nightly"]});function displayValues(f){if(!f.values)return;if(f.name!=="vendor")return f.values;let custom=getCustomEngineIds().filter((id)=>!f.values.includes(id));return custom.length>0?[...f.values,...custom]:f.values}function flagJson(f){let values=displayValues(f);return{name:f.name,type:f.type,required:f.required??!1,...values?{values}:{},...f.default!==void 0?{default:f.default}:{},...f.placeholder?{placeholder:f.placeholder}:{},description:f.description}}function verbSchema(v){return{name:v.name,group:v.group,summary:v.summary,offline:v.offline??!1,flags:v.flags.map(flagJson)}}function schemaIndex(){let cliName=activeCliName();return{apiVersion:API_SCHEMA_VERSION,kobeVersion:CURRENT_VERSION2,hint:`Compact index. Drill into ONE verb: \`${cliName} api schema --verb <name>\` (or \`${cliName} api <verb> --help\`). One group: \`--group <g>\`. Whole spec: \`--all\`.`,groups:VERB_GROUPS,verbs:VERBS.map((v)=>({name:v.name,group:v.group,summary:v.summary})),globalFlags:GLOBAL_FLAGS,aliases:VERB_ALIASES}}function groupSchema(group){let verbs=VERBS.filter((v)=>v.group===group);if(verbs.length===0)throw new ApiError(`unknown group: ${group}. Groups: ${Object.keys(VERB_GROUPS).join(", ")}`,"BAD_FLAG");return{group,verbs:verbs.map((v)=>({name:v.name,summary:v.summary}))}}function fullSchema(){return{apiVersion:API_SCHEMA_VERSION,kobeVersion:CURRENT_VERSION2,output:{success:"one JSON object on stdout, newline-terminated, exit 0",error:'{"error":{"message","code"}} on stderr, exit != 0',pretty:"--pretty indents stdout JSON"},globalFlags:GLOBAL_FLAGS,aliases:VERB_ALIASES,groups:VERB_GROUPS,verbs:VERBS.map(verbSchema)}}function flagSignature(verb){return verb.flags.map((f)=>{let meta=f.type==="enum"&&f.values?displayValues(f).join("|"):f.placeholder??(f.type==="bool"?"":"X"),core=meta?`--${f.name} ${meta}`:`--${f.name}`;return f.required?core:`[${core}]`}).join(" ")}function verbHelp(verb){let lines=[`${activeCliName()} api ${verb.name} ${flagSignature(verb)}`.trimEnd(),"",verb.summary,""],alias=Object.entries(VERB_ALIASES).find(([,canon])=>canon===verb.name)?.[0];if(alias)lines.push(`Alias: ${alias}`,"");if(verb.flags.length>0){lines.push("Flags:");for(let f of verb.flags){let req=f.required?" (required)":"",def=f.default!==void 0?` [default: ${f.default}]`:"",vals=f.type==="enum"&&f.values?` {${displayValues(f).join("|")}}`:"";lines.push(` --${f.name}${vals}${req}${def} ${f.description}`)}lines.push("")}return lines.push("Global: [--pretty] [--help]"),lines.join(`
296
+ `)}}onLine(line){let frame;try{frame=JSON.parse(line)}catch(err){logClientError("client-frame",err);return}if(frame.type==="event"){this.emit(frame);return}if(frame.type!=="response")return;let pending=this.pending.get(frame.id);if(!pending)return;if(this.pending.delete(frame.id),pending.timer)clearTimeout(pending.timer);if(frame.error){let err=Error(frame.error.message);if(frame.error.name)err.name=frame.error.name;pending.reject(err)}else pending.resolve(frame.payload)}emit(frame){for(let handler of this.handlers.get(frame.name)??[])try{handler(frame)}catch(err){logClientError("client-event",err)}for(let handler of this.handlers.get("*")??[])try{handler(frame)}catch(err){logClientError("client-event",err)}}}var RpcTimeoutError,RPC_TIMEOUT_EXEMPT;var init_client=__esm(()=>{init_protocol();init_client_log();RpcTimeoutError=class RpcTimeoutError extends Error{constructor(name,timeoutMs){super(`daemon rpc "${name}" timed out after ${timeoutMs}ms (daemon wedged?)`);this.name="RpcTimeoutError"}};RPC_TIMEOUT_EXEMPT=new Set(["task.ensureWorktree","task.ensureMain","worktree.discoverAdoptable","worktree.adopt","worktree.list","worktree.remove"])});function daemonOf(ctx){if(!ctx.client)throw new ApiError("daemon required","BAD_DAEMON");return ctx.client}async function simpleRpc(ctx,name,payload){return daemonOf(ctx).request(name,payload)}async function handlePtyList(){let[{KobeDaemonClient:KobeDaemonClient2},{defaultPtyHostSocketPath:defaultPtyHostSocketPath2}]=await Promise.all([Promise.resolve().then(() => (init_client(),exports_client)),Promise.resolve().then(() => (init_paths(),exports_paths))]),client=new KobeDaemonClient2(defaultPtyHostSocketPath2());try{return await client.connect(),await client.request("pty.list",{})}catch{return{sessions:[]}}finally{client.close()}}var init_handler_helpers=__esm(()=>{init_types()});async function listAllEnginePresets(){loadPluginEngines();let presets=[...listEnginePresets()],seen=new Set(presets.map((p)=>p.id));for(let id of await installedEngineIds())if(!seen.has(id))presets.push(describePreset(id));return presets}async function setCommand(ctx){let command=ctx.args.require("command"),vendor=resolveCommandProtocol(command);return await simpleRpc(ctx,"task.setCommand",{taskId:ctx.args.require("task-id"),command,vendor}),{ok:!0,command,protocol:vendor,...vendor===GENERIC_PROTOCOL?{generic:!0}:{}}}function taskEngine(task){let command=task.command?.trim();if(command){let resolved=resolveCommandProtocol(command);if(resolved!==GENERIC_PROTOCOL)return resolved}return coerceVendorId(task.vendor)}async function setEffort(ctx){let taskId=ctx.args.require("task-id"),level=ctx.args.require("level").trim(),daemon=daemonOf(ctx),{task}=await daemon.request("task.get",{taskId}),engine=taskEngine(task),levels=engineEntry(engine).effortLevels??[];if(levels.length===0)throw new ApiError(`engine ${engine} declares no reasoning effort levels`,"BAD_EFFORT",{engine,hint:"Only engines with declared levels accept one (codex today). Check the task's engine with `get-task`.",nextCommandArgs:["api","get-task","--task-id",taskId]});if(!levels.includes(level))throw new ApiError(`engine ${engine} does not accept effort level ${JSON.stringify(level)} \u2014 it declares ${levels.join(", ")}`,"BAD_EFFORT",{engine,levels,hint:`Pass one of: ${levels.join(", ")}.`});return await simpleRpc(ctx,"task.setVendor",{taskId,vendor:engine,effort:level}),{ok:!0,taskId,engine,effort:level}}var ENGINE_LIST_VERB,SET_COMMAND_VERB,SET_EFFORT_VERB;var init_handlers_engines=__esm(()=>{init_account_detect();init_engine_presets();init_plugin_engines();init_registry();init_vendor();init_flags();init_handler_helpers();init_types();ENGINE_LIST_VERB={name:"engine-list",group:"discover",summary:"List every engine Rove can launch \u2014 built-ins, registered presets, the shipped contrib engines whose CLI is on PATH (gemini, opencode, cursor, grok, droid, amp), and engines contributed by enabled plugins \u2014 each with its RAW launch command, exactly as it runs. Copy one into `add --command` / `send --tab new --command` verbatim, or edit its flags first. `protocol` is the adapter Rove speaks to it (history, trust, delivery); `generic` = none, which still runs fine but loses transcript reads. Returns { engines }.",flags:[],offline:!0,handler:async()=>({engines:await listAllEnginePresets()})};SET_COMMAND_VERB={name:"set-command",group:"edit",summary:"Set a task's engine launch command (takes effect on the next session rebuild). The protocol Rove speaks to it is derived from the command \u2014 the result reports which one, `generic` when the command names no engine Rove knows.",flags:[F.taskId(),{...F.command(),required:!0}],handler:setCommand};SET_EFFORT_VERB={name:"set-effort",group:"edit",summary:"Set a task's reasoning effort level (takes effect on the next session rebuild). Rejected when the task's engine declares no levels, or does not declare THIS one \u2014 the error names the levels it does accept. Codex accepts none/low/medium/high/xhigh; claude has none.",flags:[F.taskId(),{name:"level",type:"string",required:!0,placeholder:"LEVEL",description:"Effort level the task's engine declares (codex: none, low, medium, high, xhigh)."}],handler:setEffort}});var package_default;var init_package=__esm(()=>{package_default={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.95",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",keywords:["terminal","tui","cli","multiplexer","ai-agents","coding-agent","ai-coding-assistant","agentic-ai","parallel-agents","git-worktree","claude-code","codex","llm","developer-tools"],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://rove.run",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:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts",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","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"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.17","@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","react-devtools-core":"^7.0.1",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]}});var exports_version={};__export(exports_version,{repoSlug:()=>repoSlug,releasePageUrl:()=>releasePageUrl,recommendedGlobalInstallCommand:()=>recommendedGlobalInstallCommand,owningNpmPrefix:()=>owningNpmPrefix,isNewerSemver:()=>isNewerSemver,fetchReleaseSummaries:()=>fetchReleaseSummaries,fetchReleaseNotesRange:()=>fetchReleaseNotesRange,fetchReleaseNotes:()=>fetchReleaseNotes,compareSemver:()=>compareSemver,checkLatestVersion:()=>checkLatestVersion,channelOf:()=>channelOf,breakingVersionsCrossed:()=>breakingVersionsCrossed,UPDATE_SCRIPT_URL:()=>UPDATE_SCRIPT_URL,UPDATE_COMMAND:()=>UPDATE_COMMAND,RELEASE_CHANNELS:()=>RELEASE_CHANNELS,PACKAGE_NAME:()=>PACKAGE_NAME,DEFAULT_RELEASE_CHANNEL:()=>DEFAULT_RELEASE_CHANNEL,CURRENT_VERSION:()=>CURRENT_VERSION2,BREAKING_VERSIONS:()=>BREAKING_VERSIONS});import{fileURLToPath as fileURLToPath2}from"url";function repoSlug(){let url=package_default.repository?.url;if(!url)return null;let m=url.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!m||!m[1]||!m[2])return null;return`${m[1]}/${m[2]}`}function owningNpmPrefix(modulePath=fileURLToPath2(import.meta.url)){let at=modulePath.indexOf("/lib/node_modules/");if(at<=0)return null;return modulePath.slice(0,at)}function recommendedGlobalInstallCommand(prefix=owningNpmPrefix()){let target=`${PACKAGE_NAME}@latest`;return prefix===null?`npm install -g ${target}`:`npm install -g --prefix ${prefix} ${target}`}function breakingVersionsCrossed(from,to,breaking=BREAKING_VERSIONS){let[lo,hi]=compareSemver(from,to)<=0?[from,to]:[to,from];return breaking.filter((b)=>compareSemver(b,lo)>0&&compareSemver(b,hi)<=0)}function channelOf(version=CURRENT_VERSION2){return prereleaseOf(version)?.split(".")[0]==="nightly"?"nightly":DEFAULT_RELEASE_CHANNEL}async function fetchLatestFromRegistry(packageName,channel){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let encoded=packageName.replace("/","%2F"),res=await fetch(`https://registry.npmjs.org/${encoded}/${channel}`,{signal:ctrl.signal,headers:{accept:"application/json"}});if(!res.ok)return null;let body=await res.json();if(typeof body.version!=="string")return null;return body.version}catch{return null}finally{clearTimeout(timer)}}function isNewerSemver(latest,current){let core=compareSemver(latest,current);if(core!==0)return core>0;return comparePrerelease(prereleaseOf(latest),prereleaseOf(current))>0}function prereleaseOf(version){let dash=version.indexOf("-");return dash===-1?void 0:version.slice(dash+1)||void 0}function comparePrerelease(a,b){if(a===b)return 0;if(a===void 0)return 1;if(b===void 0)return-1;let aParts=a.split("."),bParts=b.split(".");for(let i=0;i<Math.max(aParts.length,bParts.length);i++){let av=aParts[i],bv=bParts[i];if(av===void 0)return-1;if(bv===void 0)return 1;if(av===bv)continue;let an=/^\d+$/.test(av)?Number.parseInt(av,10):null,bn=/^\d+$/.test(bv)?Number.parseInt(bv,10):null;if(an!==null&&bn!==null)return an>bn?1:-1;if(an!==null)return-1;if(bn!==null)return 1;return av>bv?1:-1}return 0}function compareSemver(aVersion,bVersion){let norm=(v)=>v.split("-")[0]??v,a=norm(aVersion).split(".").map((s)=>Number.parseInt(s,10)),b=norm(bVersion).split(".").map((s)=>Number.parseInt(s,10));for(let i=0;i<3;i++){let av=a[i]??0,bv=b[i]??0;if(Number.isNaN(av)||Number.isNaN(bv))return 0;if(av>bv)return 1;if(av<bv)return-1}return 0}async function checkLatestVersion(opts={}){let channel=opts.channel??channelOf(),fake=process.env.KOBE_FAKE_UPDATE;if(fake)return{current:CURRENT_VERSION2,latest:fake,hasUpdate:isNewerSemver(fake,CURRENT_VERSION2),channel};if(isDev()&&!opts.force)return null;let latest=await fetchLatestFromRegistry(PACKAGE_NAME,channel);if(!latest)return null;return{current:CURRENT_VERSION2,latest,hasUpdate:isNewerSemver(latest,CURRENT_VERSION2),channel}}function versionFromTagName(tagName){if(typeof tagName!=="string")return null;return tagName.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}async function fetchReleaseNotes(version){let slug=repoSlug();if(!slug)return null;let tag=`v${version}`,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases/tags/${tag}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return null;let body=await res.json();if(typeof body.body!=="string"||typeof body.html_url!=="string")return null;return{body:body.body,url:body.html_url,version}}catch{return null}finally{clearTimeout(timer)}}async function fetchReleaseNotesRange(args){let slug=repoSlug();if(!slug)return[];let limit=args.limit??100,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];return body.map((release2)=>{let version=versionFromTagName(release2.tag_name);if(!version||typeof release2.html_url!=="string"||typeof release2.body!=="string")return null;if(compareSemver(version,args.current)<=0)return null;if(compareSemver(version,args.latest)>0)return null;return{version,url:release2.html_url,body:release2.body}}).filter((release2)=>release2!==null)}catch{return[]}finally{clearTimeout(timer)}}async function fetchReleaseSummaries(limit=12){let slug=repoSlug();if(!slug)return[];let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];return body.map((release2)=>{let version=versionFromTagName(release2.tag_name);if(!version||typeof release2.html_url!=="string")return null;return{version,url:release2.html_url}}).filter((release2)=>release2!==null)}catch{return[]}finally{clearTimeout(timer)}}function releasePageUrl(version){let slug=repoSlug();if(!slug)return null;return`https://github.com/${slug}/releases/tag/v${version}`}var CURRENT_VERSION2,PACKAGE_NAME,UPDATE_SCRIPT_URL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",UPDATE_COMMAND,BREAKING_VERSIONS,FETCH_TIMEOUT_MS=3000,RELEASE_CHANNELS,DEFAULT_RELEASE_CHANNEL="latest";var init_version=__esm(()=>{init_package();init_env();CURRENT_VERSION2=package_default.version,PACKAGE_NAME=package_default.name;UPDATE_COMMAND=`curl -fsSL ${UPDATE_SCRIPT_URL} | sh`;BREAKING_VERSIONS=[];RELEASE_CHANNELS=["latest","nightly"]});function displayValues(f){if(!f.values)return;if(f.name!=="vendor")return f.values;let custom=getCustomEngineIds().filter((id)=>!f.values.includes(id));return custom.length>0?[...f.values,...custom]:f.values}function flagJson(f){let values=displayValues(f);return{name:f.name,type:f.type,required:f.required??!1,...values?{values}:{},...f.default!==void 0?{default:f.default}:{},...f.placeholder?{placeholder:f.placeholder}:{},description:f.description}}function verbSchema(v){return{name:v.name,group:v.group,summary:v.summary,offline:v.offline??!1,flags:v.flags.map(flagJson)}}function schemaIndex(){let cliName=activeCliName();return{apiVersion:API_SCHEMA_VERSION,kobeVersion:CURRENT_VERSION2,hint:`Compact index. Drill into ONE verb: \`${cliName} api schema --verb <name>\` (or \`${cliName} api <verb> --help\`). One group: \`--group <g>\`. Whole spec: \`--all\`.`,groups:VERB_GROUPS,verbs:VERBS.map((v)=>({name:v.name,group:v.group,summary:v.summary})),globalFlags:GLOBAL_FLAGS,aliases:VERB_ALIASES}}function groupSchema(group){let verbs=VERBS.filter((v)=>v.group===group);if(verbs.length===0)throw new ApiError(`unknown group: ${group}. Groups: ${Object.keys(VERB_GROUPS).join(", ")}`,"BAD_FLAG");return{group,verbs:verbs.map((v)=>({name:v.name,summary:v.summary}))}}function fullSchema(){return{apiVersion:API_SCHEMA_VERSION,kobeVersion:CURRENT_VERSION2,output:{success:"one JSON object on stdout, newline-terminated, exit 0",error:'{"error":{"message","code"}} on stderr, exit != 0',pretty:"--pretty indents stdout JSON"},globalFlags:GLOBAL_FLAGS,aliases:VERB_ALIASES,groups:VERB_GROUPS,verbs:VERBS.map(verbSchema)}}function flagSignature(verb){return verb.flags.map((f)=>{let meta=f.type==="enum"&&f.values?displayValues(f).join("|"):f.placeholder??(f.type==="bool"?"":"X"),core=meta?`--${f.name} ${meta}`:`--${f.name}`;return f.required?core:`[${core}]`}).join(" ")}function verbHelp(verb){let lines=[`${activeCliName()} api ${verb.name} ${flagSignature(verb)}`.trimEnd(),"",verb.summary,""],alias=Object.entries(VERB_ALIASES).find(([,canon])=>canon===verb.name)?.[0];if(alias)lines.push(`Alias: ${alias}`,"");if(verb.flags.length>0){lines.push("Flags:");for(let f of verb.flags){let req=f.required?" (required)":"",def=f.default!==void 0?` [default: ${f.default}]`:"",vals=f.type==="enum"&&f.values?` {${displayValues(f).join("|")}}`:"";lines.push(` --${f.name}${vals}${req}${def} ${f.description}`)}lines.push("")}return lines.push("Global: [--pretty] [--help]"),lines.join(`
297
297
  `)}function apiUsage(){let cliName=activeCliName(),rows=VERBS.map((v)=>` ${v.name.padEnd(18)} ${v.summary}`);return[`usage: ${cliName} api <verb> [flags] [--pretty] [--help]`,"",`Explore the full surface (names, flags, types) with: ${cliName} api schema`,"","verbs:",...rows,"","Output is one JSON object on stdout (exit 0); errors are JSON on stderr (exit != 0)."].join(`
298
298
  `)}var API_SCHEMA_VERSION=2,GLOBAL_FLAGS;var init_schema=__esm(()=>{init_repos();init_version();init_rename_compat();init_types();init_verbs();GLOBAL_FLAGS=[{name:"pretty",type:"bool",description:"Pretty-print stdout JSON."},{name:"help",type:"bool",description:"Show usage for the verb and exit."}]});var IllegalTransitionError,TaskNotFoundError,CannotDeleteMainTaskError,DIRTY_WORKTREE_CODE="DIRTY_WORKTREE",DirtyWorktreeError,WorktreeRemoveFailedError,TASK_DELETING_CODE="TASK_DELETING",TaskDeletingError,MAIN_CHECKOUT_DIRTY_CODE="MAIN_CHECKOUT_DIRTY",MainCheckoutDirtyError,EMPTY_BRANCH_CODE="EMPTY_BRANCH",EmptyBranchError,EMPTY_BRANCH_DIRTY_WORKTREE_CODE="EMPTY_BRANCH_DIRTY_WORKTREE",EmptyBranchDirtyWorktreeError,MISSING_REF_CODE="MISSING_REF",MissingRefError,LAND_CONFLICT_CODE="LAND_CONFLICT",LandConflictError;var init_errors=__esm(()=>{IllegalTransitionError=class IllegalTransitionError extends Error{from;to;taskId;constructor(from,to,taskId){super(`illegal transition for task ${taskId}: ${from} -> ${to}`);this.from=from;this.to=to;this.taskId=taskId;this.name="IllegalTransitionError"}};TaskNotFoundError=class TaskNotFoundError extends Error{constructor(taskId){super(`task not found: ${taskId}`);this.name="TaskNotFoundError"}};CannotDeleteMainTaskError=class CannotDeleteMainTaskError extends Error{constructor(){super("cannot delete a main task; remove the repo from saved repos instead");this.name="CannotDeleteMainTaskError"}};DirtyWorktreeError=class DirtyWorktreeError extends Error{taskId;constructor(taskId){super(`${DIRTY_WORKTREE_CODE}: task ${taskId} worktree has uncommitted or untracked changes`);this.taskId=taskId;this.name="DirtyWorktreeError"}};WorktreeRemoveFailedError=class WorktreeRemoveFailedError extends Error{taskId;cause;constructor(taskId,cause){super(`failed to remove worktree for task ${taskId}: ${errorMessage(cause)}`);this.taskId=taskId;this.cause=cause;this.name="WorktreeRemoveFailedError"}};TaskDeletingError=class TaskDeletingError extends Error{taskId;constructor(taskId){super(`${TASK_DELETING_CODE}: task ${taskId} is being deleted`);this.taskId=taskId;this.name="TaskDeletingError"}};MainCheckoutDirtyError=class MainCheckoutDirtyError extends Error{repo;dir;constructor(repo,dir){super(`${MAIN_CHECKOUT_DIRTY_CODE}: base checkout at ${dir} has uncommitted changes; commit them before landing (never git stash \u2014 the stash stack is shared by every worktree of this repo)`);this.repo=repo;this.dir=dir;this.name="MainCheckoutDirtyError"}};EmptyBranchError=class EmptyBranchError extends Error{branch;landedOn;constructor(branch,landedOn){super(`${EMPTY_BRANCH_CODE}: '${branch}' has no commits ahead of '${landedOn}' \u2014 landing it would be a no-op (the worker may not have delivered anything)`);this.branch=branch;this.landedOn=landedOn;this.name="EmptyBranchError"}};EmptyBranchDirtyWorktreeError=class EmptyBranchDirtyWorktreeError extends Error{branch;landedOn;worktreePath;files;constructor(branch,landedOn,worktreePath,files){let list=files.length>0?files.join(", "):"(none reported)";super(`${EMPTY_BRANCH_DIRTY_WORKTREE_CODE}: '${branch}' has no commits ahead of '${landedOn}' but its worktree ${worktreePath} has uncommitted changes (${list}) \u2014 commit them in the worktree first, then land again`);this.branch=branch;this.landedOn=landedOn;this.worktreePath=worktreePath;this.files=files;this.name="EmptyBranchDirtyWorktreeError"}};MissingRefError=class MissingRefError extends Error{branch;landedOn;dir;constructor(branch,landedOn,dir){super(`${MISSING_REF_CODE}: '${branch}' does not resolve in the base repo at ${dir} (comparing against '${landedOn}') \u2014 the branch was renamed or deleted outside Rove; re-point the task with \`rove api set-branch\` or recreate the branch`);this.branch=branch;this.landedOn=landedOn;this.dir=dir;this.name="MissingRefError"}};LandConflictError=class LandConflictError extends Error{taskId;branch;files;constructor(taskId,branch,files){let list=files.length>0?files.join(", "):"(none reported)";super(`${LAND_CONFLICT_CODE}: merging '${branch}' hit conflicts, merge aborted \u2014 conflicted files: ${list}`);this.taskId=taskId;this.branch=branch;this.files=files;this.name="LandConflictError"}}});import{readFile as readFile8,stat as stat8,unlink as unlink5}from"fs/promises";function listenOnUnixSocket(server,socketPath){return new Promise((resolve3,reject)=>{let evented=server;evented.once("error",reject),server.listen(socketPath,()=>{evented.removeListener("error",reject),resolve3()})})}async function readPidFile(pidPath){try{let raw=await readFile8(pidPath,"utf8"),pid=Number(raw.trim());return Number.isFinite(pid)?pid:null}catch{return null}}function createSocketOwnershipGuard(options){let watchMs=options.watchMs??DEFAULT_SOCKET_WATCH_MS,stamp=null,lost=!1,timer=null,currentStamp=async()=>{try{let s=await stat8(options.socketPath);return{dev:s.dev,ino:s.ino}}catch(err){return err.code==="ENOENT"?null:"error"}},stopTimer=()=>{if(timer)clearInterval(timer);timer=null},verify=async()=>{if(stamp===null||lost)return;let now=await currentStamp();if(now==="error")return;if(now===null||now.dev!==stamp.dev||now.ino!==stamp.ino)lost=!0},check=async()=>{if(stamp===null||lost)return;if(await verify(),!lost)return;stopTimer(),options.onLost()};return{async arm(){let now=await currentStamp();if(now===null||now==="error")return;if(stamp=now,watchMs>0)timer=setInterval(()=>void check(),watchMs),timer.unref?.()},async release(server){if(stopTimer(),await verify(),stamp===null||lost){server.unref();return}await new Promise((resolve3)=>server.close(()=>resolve3())),await unlink5(options.socketPath).catch(()=>{}),await unlink5(options.pidPath).catch(()=>{})}}}var DEFAULT_SOCKET_WATCH_MS=5000;var init_socket_guard=()=>{};import{unlink as unlink6}from"fs/promises";function isProcessAlive2(pid){try{return process.kill(pid,0),!0}catch(err){return err.code==="EPERM"}}async function stopDaemonProcess(socketPath,pidPath){let oldPid=await readPidFile(pidPath),targetPid=oldPid!==null&&oldPid!==process.pid?oldPid:null,wasAlive=targetPid!==null&&isProcessAlive2(targetPid),method=wasAlive?"graceful":"absent",client=new KobeDaemonClient(socketPath),stopRequest=client.request("daemon.stop").catch(()=>{return}),stopTimeout=new Promise((resolve3)=>setTimeout(resolve3,2000));if(await Promise.race([stopRequest,stopTimeout]),client.close(),wasAlive&&targetPid!==null){let deadline=Date.now()+5000,escalated=!1;while(Date.now()<deadline){try{process.kill(targetPid,0)}catch{break}if(!escalated&&Date.now()-(deadline-5000)>2000){try{process.kill(targetPid,"SIGTERM")}catch{}method="sigterm",escalated=!0}await new Promise((resolve3)=>setTimeout(resolve3,50))}try{process.kill(targetPid,0),process.kill(targetPid,"SIGKILL"),method="sigkill",await new Promise((resolve3)=>setTimeout(resolve3,100))}catch{}}let survivor=await readPidFile(pidPath);if(survivor!==null&&survivor!==process.pid&&isProcessAlive2(survivor))return{pid:oldPid,method};return await unlink6(socketPath).catch(()=>{}),await unlink6(pidPath).catch(()=>{}),{pid:oldPid,method}}var init_lifecycle=__esm(()=>{init_client();init_socket_guard()});var exports_daemon_process={};__export(exports_daemon_process,{tryAcquireSpawnLock:()=>tryAcquireSpawnLock,testDaemonResponds:()=>testDaemonResponds,spawnDetachedDaemon:()=>spawnDetachedDaemon,resolveKobeSpawn:()=>resolveKobeSpawn,probeDaemonSocket:()=>probeDaemonSocket,isStaleInstallError:()=>isStaleInstallError,ensureDaemonReachable:()=>ensureDaemonReachable,detachOptions:()=>detachOptions,connectOrStartDaemon:()=>connectOrStartDaemon,connectIfRunning:()=>connectIfRunning,autospawnDaemonEnv:()=>autospawnDaemonEnv,StaleInstallError:()=>StaleInstallError});import{spawn as spawn2}from"child_process";import{closeSync as closeSync3,existsSync as existsSync11,mkdirSync as mkdirSync8,openSync as openSync3,statSync as statSync7,unlinkSync as unlinkSync5}from"fs";import{dirname as dirname9,resolve as resolve3}from"path";import{fileURLToPath as fileURLToPath3}from"url";function detachOptions(platform=process.platform){return platform==="win32"?{windowsHide:!0}:{detached:!0}}function spawnDetachedDaemon(command,args,env,logPath){let stdio="ignore",logFd;try{mkdirSync8(dirname9(logPath),{recursive:!0}),logFd=openSync3(logPath,"a"),stdio=["ignore",logFd,logFd]}catch{stdio="ignore"}if(spawn2(command,[...args],{...detachOptions(),stdio,env}).unref(),logFd!==void 0)try{closeSync3(logFd)}catch{}}function insideEngineSession(env=process.env){return typeof env.KOBE_TASK_ID==="string"&&env.KOBE_TASK_ID!==""}function autospawnDaemonEnv(env=process.env){let{KOBE_TASK_ID:_task,KOBE_TAB_ID:_tab,KOBE_TUI:_tui,KOBE_TERMINAL_PTY:_pty,ROVE_TASK_ID:_roveTask,ROVE_TAB_ID:_roveTab,ROVE_TUI:_roveTui,ROVE_TERMINAL_PTY:_rovePty,...rest}=env;return{...rest,KOBE_DAEMON_AUTOSPAWNED:"1",ROVE_DAEMON_AUTOSPAWNED:"1"}}function tryAcquireSpawnLock(lockPath,staleMs=SPAWN_LOCK_STALE_MS){let create=()=>{return mkdirSync8(dirname9(lockPath),{recursive:!0}),closeSync3(openSync3(lockPath,"wx")),!0};try{return create()}catch{try{if(Date.now()-statSync7(lockPath).mtimeMs<=staleMs)return!1;return unlinkSync5(lockPath),create()}catch{return!1}}}async function ensureDaemonReachable(resolveSpawn=resolveKobeSpawn){let socketPath=defaultDaemonSocketPath(),state=await probeDaemonSocket(socketPath);if(state==="alive")return socketPath;if(state==="wedged"&&insideEngineSession())throw Error(`rove: daemon at ${socketPath} is not answering hello (busy or wedged); not restarting it from inside an engine session \u2014 retry, or run \`rove daemon restart\` from a regular shell`);let lockPath=`${defaultDaemonPidPath()}.spawn-lock`;if(!tryAcquireSpawnLock(lockPath)){let deadline=Date.now()+SPAWN_LOCK_WAIT_MS;while(Date.now()<deadline){if(await testDaemonResponds(socketPath))return socketPath;await new Promise((resolveTimer)=>setTimeout(resolveTimer,150))}throw Error(`rove: another process is starting the daemon but it never became reachable at ${socketPath}; check ${defaultDaemonLogPath()} or run \`rove doctor\``)}try{if(await probeDaemonSocket(socketPath)==="alive")return socketPath;let livePid=await readPidFile(defaultDaemonPidPath());if(livePid!==null&&livePid!==process.pid&&isProcessAlive2(livePid)){let deadline2=Date.now()+BUSY_DAEMON_GRACE_MS;while(Date.now()<deadline2){if(await new Promise((resolveTimer)=>setTimeout(resolveTimer,250)),await testDaemonResponds(socketPath))return socketPath;if(!isProcessAlive2(livePid))break}}let[command,...args]=resolveSpawn(DAEMON_START_ARGS);await stopDaemonProcess(socketPath,defaultDaemonPidPath()).catch(()=>{}),spawnDetachedDaemon(command,args,autospawnDaemonEnv(),defaultDaemonLogPath());let deadline=Date.now()+5000;while(Date.now()<deadline){if(await testDaemonResponds(socketPath))return socketPath;await new Promise((resolveTimer)=>setTimeout(resolveTimer,100))}throw Error(`rove: daemon did not start (or stayed wedged) at ${socketPath}; check ${defaultDaemonLogPath()} or run \`rove doctor\``)}finally{try{unlinkSync5(lockPath)}catch{}}}async function connectOrStartDaemon(){let socketPath=await ensureDaemonReachable(),client=new KobeDaemonClient(socketPath);return await client.connect(),client}async function connectIfRunning(){let socketPath=defaultDaemonSocketPath();if(!await testDaemonResponds(socketPath))return null;let client=new KobeDaemonClient(socketPath);return await client.connect(),client}async function probeDaemonSocket(socketPath,timeoutMs=DAEMON_HELLO_TIMEOUT_MS){let probe=new KobeDaemonClient(socketPath);try{await probe.connect()}catch{return probe.close(),"absent"}let droppedByPeer=!1,offClose=probe.onLifecycle("close",()=>{droppedByPeer=!0}),replied=probe.request("hello",{protocolVersion:DAEMON_PROTOCOL_VERSION}).then(()=>!0).catch(()=>!0),timer,timedOut=new Promise((resolve4)=>{timer=setTimeout(()=>resolve4(!1),timeoutMs)}),settled=await Promise.race([replied,timedOut]);if(timer)clearTimeout(timer);if(offClose(),probe.close(),droppedByPeer)return"absent";return settled?"alive":"wedged"}async function testDaemonResponds(socketPath,timeoutMs=DAEMON_HELLO_TIMEOUT_MS){return await probeDaemonSocket(socketPath,timeoutMs)==="alive"}function isStaleInstallError(err){return err instanceof Error&&err.name==="StaleInstallError"}function resolveKobeSpawn(subcommand,env=process.env,moduleFile=fileURLToPath3(import.meta.url)){let here=moduleFile;if(here.startsWith("/$bunfs")||here.startsWith("B:\\~BUN"))return[process.execPath,...subcommand];let dir=dirname9(here),cliName=env.ROVE_INVOKED_AS===ROVE_PRODUCT_NAME?ROVE_PRODUCT_NAME:LEGACY_KOBE_PRODUCT_NAME,candidates=[resolve3(dir,`../cli/${cliName}.ts`),resolve3(dir,`../../../kobe/src/cli/${cliName}.ts`),resolve3(dir,`../cli/${cliName}.js`),resolve3(dir,"../cli/index.ts"),resolve3(dir,"../../../kobe/src/cli/index.ts"),resolve3(dir,"../cli/index.js")],entry=candidates.find((candidate)=>existsSync11(candidate));if(entry)return[process.execPath,entry,...subcommand];throw new StaleInstallError(cliName,dir,candidates)}var DAEMON_START_ARGS,DAEMON_HELLO_TIMEOUT_MS=3000,BUSY_DAEMON_GRACE_MS=15000,SPAWN_LOCK_STALE_MS=40000,SPAWN_LOCK_WAIT_MS=30000,StaleInstallError;var init_daemon_process=__esm(()=>{init_lifecycle();init_paths();init_protocol();init_socket_guard();init_client();DAEMON_START_ARGS=["daemon","start"];StaleInstallError=class StaleInstallError extends Error{candidates;constructor(cliName,dir,candidates){super(`${cliName}: this process is running from an install that no longer exists on disk \u2014 no ${cliName} entry near ${dir} (checked ${candidates.join(", ")}). Reinstall (\`npm install -g @sma1lboy/rove\`) and relaunch Rove.`);this.name="StaleInstallError",this.candidates=candidates}}});import{existsSync as existsSync12}from"fs";import{rename as rename3,rm as rm2}from"fs/promises";import{basename as basename4,delimiter,dirname as dirname10,join as join12,resolve as resolve4}from"path";import{fileURLToPath as fileURLToPath4}from"url";function resolveNodeBinary(env=process.env,exists=existsSync12,platform=process.platform){let dirs=(env.PATH??env.Path??"").split(delimiter).filter((dir)=>dir.length>0),suffixes=platform==="win32"?(env.PATHEXT??".EXE;.CMD;.BAT").split(";").filter((ext)=>ext.length>0):[""];for(let dir of dirs)for(let suffix of suffixes){let candidate=join12(dir,`node${suffix}`);if(exists(candidate))return candidate}return null}async function bundleWithBun(entry,outFile,io){let{build,rename:move,discard}=io??{build:(config)=>Bun.build(config),rename:rename3,discard:(path15)=>rm2(path15,{force:!0})},staging=`${outFile}.${process.pid}.tmp`,built=await build({entrypoints:[entry],outdir:dirname10(staging),target:"node",format:"esm",naming:basename4(staging),external:["node-pty"]});if(!built.success)return await discard(staging).catch(()=>{}),built;return await move(staging,outFile),built}async function resolveNodePtyHostSpawn(deps={}){let platform=deps.platform??process.platform;if(platform!=="win32")return null;let here=deps.moduleDir??dirname10(fileURLToPath4(import.meta.url)),exists=deps.exists??existsSync12,bundle=deps.bundle??bundleWithBun,node=resolveNodeBinary(deps.env??process.env,exists,platform);if(!node)throw Error("Rove: the Windows PTY host runs under node, but no node was found on PATH. "+"Install Node.js (https://nodejs.org) and restart Rove \u2014 engine and terminal sessions cannot start without it.");let packaged=resolve4(here,PTY_HOST_NODE_BUNDLE);if(exists(packaged))return[node,packaged];let entry=resolve4(here,PTY_HOST_NODE_ENTRY);if(!exists(entry))throw Error(`Rove: no Windows PTY host found (looked for ${packaged} and ${entry})`);let cache3=resolve4(here,PTY_HOST_NODE_DEV_CACHE),built=await bundle(entry,cache3);if(!built.success)throw Error(`Rove: could not build the Windows PTY host \u2014 ${built.logs.map(String).join("; ")}`);return[node,cache3]}async function ensurePtyHostReachable(){let socketPath=defaultPtyHostSocketPath();if(await testDaemonResponds(socketPath))return socketPath;await stopDaemonProcess(socketPath,defaultPtyHostPidPath()).catch(()=>{});let[command,...args]=await resolveNodePtyHostSpawn()??resolveKobeSpawn(PTY_HOST_START_ARGS);spawnDetachedDaemon(command??"",args,process.env,defaultPtyHostLogPath());let deadline=Date.now()+5000;while(Date.now()<deadline){if(await testDaemonResponds(socketPath))return socketPath;await new Promise((resolveTimer)=>setTimeout(resolveTimer,100))}throw Error(`rove: pty host did not start (or stayed wedged) at ${socketPath}`)}async function sweepPtyHostSessions(liveTaskIds,homeDir2){let socketPath=defaultPtyHostSocketPath(homeDir2),client=new KobeDaemonClient(socketPath);try{await client.connect(),await client.request("pty.sweep",{liveTaskIds})}catch{}finally{client.close()}}async function ptyHostHasLiveSessions(homeDir2){let client=new KobeDaemonClient(defaultPtyHostSocketPath(homeDir2));try{return await client.connect(),(await client.request("pty.list")).sessions?.some((s)=>s.alive===!0)??!1}catch{return!1}finally{client.close()}}var PTY_HOST_START_ARGS,PTY_HOST_NODE_BUNDLE="pty-host-node.mjs",PTY_HOST_NODE_DEV_CACHE="../../.cache/pty-host-node.mjs",PTY_HOST_NODE_ENTRY="../daemon/pty-host-node-entry.ts";var init_pty_process=__esm(()=>{init_lifecycle();init_paths();init_daemon_process();init_client();PTY_HOST_START_ARGS=["pty-host"]});function composerGatePreferenceOn(store){return store.get(COMPOSER_GATE_KEY,!0)!==!1}function toggleComposerGatePreference(store,onDisabled){let next=!composerGatePreferenceOn(store);if(store.set(COMPOSER_GATE_KEY,next),!store.flush())return store.set(COMPOSER_GATE_KEY,!next),"persist-failed";if(!next)onDisabled?.();return next?"enabled":"disabled"}function composerGateEnabled(){return getPersistedBool(COMPOSER_GATE_KEY,!0)}var COMPOSER_GATE_KEY="delivery.composerGate";var init_composer_gate=__esm(()=>{init_store()});function normalizeColor(value){return typeof value==="string"&&HEX_COLOR_RE.test(value)?value.toLowerCase():null}function parseTerminalDefaultColors(value){if(typeof value!=="object"||value===null||Array.isArray(value))return null;let raw=value,foreground=normalizeColor(raw.foreground),background=normalizeColor(raw.background);return foreground&&background?{foreground,background}:null}function oscRgb(color){let hex=color.slice(1);return[hex.slice(0,2),hex.slice(2,4),hex.slice(4,6)].map((component)=>component.repeat(2)).join("/")}function formatDefaultColorReply(slot,colors){let color=slot===10?colors.foreground:colors.background;return`\x1B]${slot};rgb:${oscRgb(color)}\x1B\\`}function trailingQueryPrefix(text){let maxLength=QUERY_PREFIXES[0].length+1,start=Math.max(0,text.length-maxLength);for(let index=start;index<text.length;index++){let suffix=text.slice(index);if(QUERY_PREFIXES.some((prefix)=>prefix.startsWith(suffix)||suffix===`${prefix}\x1B`))return suffix}return""}function foldDefaultColorQueries(previousCarry,chunkText){let text=previousCarry+chunkText,slots=[],end=0;DEFAULT_COLOR_QUERY_RE.lastIndex=0;for(let match=DEFAULT_COLOR_QUERY_RE.exec(text);match;match=DEFAULT_COLOR_QUERY_RE.exec(text))slots.push(match[1]==="10"?10:11),end=match.index+match[0].length;return{slots,carry:trailingQueryPrefix(text.slice(end))}}var DEFAULT_TERMINAL_COLORS,HEX_COLOR_RE,DEFAULT_COLOR_QUERY_RE,QUERY_PREFIXES;var init_terminal_colors=__esm(()=>{DEFAULT_TERMINAL_COLORS={foreground:"#eae7df",background:"#141413"},HEX_COLOR_RE=/^#[0-9a-f]{6}$/i,DEFAULT_COLOR_QUERY_RE=/\x1b\](10|11);\?(?:\x07|\x1b\\)/g,QUERY_PREFIXES=["\x1B]10;?","\x1B]11;?"]});import{RGBA}from"@opentui/core";function srgbChannelToLinear(c){let v=c/255;return v<=0.04045?v/12.92:((v+0.055)/1.055)**2.4}function relativeLuminance([r,g,b]){return 0.2126*srgbChannelToLinear(r)+0.7152*srgbChannelToLinear(g)+0.0722*srgbChannelToLinear(b)}function contrastRatioTriplet(fg,bg){let l1=relativeLuminance(fg),l2=relativeLuminance(bg),lighter=Math.max(l1,l2),darker=Math.min(l1,l2);return(lighter+0.05)/(darker+0.05)}function rgbToHsl([r,g,b]){let rn=r/255,gn=g/255,bn=b/255,max=Math.max(rn,gn,bn),min=Math.min(rn,gn,bn),l=(max+min)/2;if(max===min)return[0,0,l];let d=max-min,s=l>0.5?d/(2-max-min):d/(max+min),h;if(max===rn)h=((gn-bn)/d+(gn<bn?6:0))*60;else if(max===gn)h=((bn-rn)/d+2)*60;else h=((rn-gn)/d+4)*60;return[h,s,l]}function hslToRgb(h,s,l){if(s===0){let v=Math.round(l*255);return[v,v,v]}let q=l<0.5?l*(1+s):l+s-l*s,p=2*l-q,channel=(t)=>{let tn=t;if(tn<0)tn+=1;if(tn>1)tn-=1;let c=tn<0.16666666666666666?p+(q-p)*6*tn:tn<0.5?q:tn<0.6666666666666666?p+(q-p)*(0.6666666666666666-tn)*6:p;return Math.round(c*255)};return[channel(h/360+0.3333333333333333),channel(h/360),channel(h/360-0.3333333333333333)]}function ensureContrast(fg,bg,minRatio=HOST_TEXT_MIN_CONTRAST){let fgInts=fg.toInts(),bgInts=bg.toInts(),fgTriplet=[fgInts[0],fgInts[1],fgInts[2]],bgTriplet=[bgInts[0],bgInts[1],bgInts[2]];if(contrastRatioTriplet(fgTriplet,bgTriplet)>=minRatio)return fg;let[h,s,l]=rgbToHsl(fgTriplet),lighten=relativeLuminance(bgTriplet)<=MID_HOST_LUMINANCE,at=(lightness)=>contrastRatioTriplet(hslToRgb(h,s,lightness),bgTriplet),lo=lighten?l:0,hi=lighten?1:l;for(let i=0;i<32;i++){let mid=(lo+hi)/2;if(at(mid)>=minRatio)if(lighten)hi=mid;else lo=mid;else if(lighten)lo=mid;else hi=mid}let[r,g,b]=hslToRgb(h,s,lighten?hi:lo);return RGBA.fromInts(r,g,b,fgInts[3])}var HOST_TEXT_MIN_CONTRAST=4.5,MID_HOST_LUMINANCE=0.5;var init_contrast_guard=()=>{};var claude_default;var init_claude=__esm(()=>{claude_default={$schema:"https://opencode.ai/theme.json",defs:{darkBg:"#141413",darkBgRaised:"#1A1917",darkBgInset:"#2B2A27",darkBgMenu:"#33312E",darkBorderSubtle:"#2B2A27",darkBorder:"#3A3835",darkBorderActive:"#5C5853",darkText:"#EAE7DF",darkTextMuted:"#A9A39A",darkTextSubtle:"#6B665F",darkPrimary:"#CC785C",darkSecondary:"#D4967E",darkAccent:"#CC785C",darkAccentHover:"#E0AB96",darkRed:"#D47563",darkOrange:"#D97757",darkYellow:"#E8C96B",darkGreen:"#9ACA86",darkBlue:"#61AAF2",darkViolet:"#9B87F5",darkTerracotta:"#BF4D43",lightBg:"#FAF9F5",lightBgRaised:"#F0EEE6",lightBgInset:"#EAE7DF",lightBgMenu:"#E2DED4",lightBorderSubtle:"#EAE7DF",lightBorder:"#D9D5CC",lightBorderActive:"#A9A39A",lightText:"#1A1917",lightTextMuted:"#6B665F",lightTextSubtle:"#8D877D",lightPrimary:"#C96442",lightSecondary:"#B85F3D",lightAccent:"#CC785C",lightAccentHover:"#B85F3D",lightRed:"#A84B3A",lightOrange:"#C96442",lightYellow:"#8A6220",lightGreen:"#2E7C4C",lightBlue:"#207FDE",lightViolet:"#7B5BB6",lightTerracotta:"#BF4D43"},theme:{primary:{dark:"darkPrimary",light:"lightPrimary"},secondary:{dark:"darkSecondary",light:"lightSecondary"},accent:{dark:"darkAccent",light:"lightAccent"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkYellow",light:"lightYellow"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkBlue",light:"lightBlue"},text:{dark:"darkText",light:"lightText"},textMuted:{dark:"darkTextMuted",light:"lightTextMuted"},background:{dark:"darkBg",light:"lightBg"},backgroundPanel:{dark:"darkBgRaised",light:"lightBgRaised"},backgroundElement:{dark:"darkBgInset",light:"lightBgInset"},backgroundMenu:{dark:"darkBgMenu",light:"lightBgMenu"},backgroundDialog:{dark:"darkBgRaised",light:"lightBgRaised"},border:{dark:"darkBorder",light:"lightBorder"},borderActive:{dark:"darkBorderActive",light:"lightBorderActive"},borderSubtle:{dark:"darkBorderSubtle",light:"lightBorderSubtle"},diffAdded:{dark:"darkGreen",light:"lightGreen"},diffRemoved:{dark:"darkRed",light:"lightRed"},diffContext:{dark:"darkTextMuted",light:"lightTextSubtle"},diffHunkHeader:{dark:"darkTextMuted",light:"lightTextSubtle"},diffHighlightAdded:{dark:"#B5E0A0",light:"#1F6638"},diffHighlightRemoved:{dark:"#E89180",light:"#8A3A2C"},diffAddedBg:{dark:"#1F2A1F",light:"#E5EEDF"},diffRemovedBg:{dark:"#2A1F1C",light:"#F5DAD3"},diffContextBg:{dark:"darkBgRaised",light:"lightBgRaised"},diffLineNumber:{dark:"darkTextSubtle",light:"lightTextSubtle"},diffAddedLineNumberBg:{dark:"#1A2419",light:"#D5E2CC"},diffRemovedLineNumberBg:{dark:"#241915",light:"#EBC8BE"},markdownText:{dark:"darkText",light:"lightText"},markdownHeading:{dark:"darkPrimary",light:"lightPrimary"},markdownLink:{dark:"darkAccent",light:"lightAccent"},markdownLinkText:{dark:"darkBlue",light:"lightBlue"},markdownCode:{dark:"darkSecondary",light:"lightSecondary"},markdownBlockQuote:{dark:"darkTextMuted",light:"lightTextMuted"},markdownEmph:{dark:"darkYellow",light:"lightYellow"},markdownStrong:{dark:"darkPrimary",light:"lightPrimary"},markdownHorizontalRule:{dark:"darkTextMuted",light:"lightTextMuted"},markdownListItem:{dark:"darkAccent",light:"lightAccent"},markdownListEnumeration:{dark:"darkBlue",light:"lightBlue"},markdownImage:{dark:"darkAccent",light:"lightAccent"},markdownImageText:{dark:"darkBlue",light:"lightBlue"},markdownCodeBlock:{dark:"darkText",light:"lightText"},markdownQuote:{dark:"darkTextMuted",light:"lightTextMuted"},syntaxComment:{dark:"darkTextSubtle",light:"lightTextSubtle"},syntaxKeyword:{dark:"darkPrimary",light:"lightPrimary"},syntaxFunction:{dark:"darkBlue",light:"lightBlue"},syntaxVariable:{dark:"darkText",light:"lightText"},syntaxString:{dark:"darkGreen",light:"lightGreen"},syntaxNumber:{dark:"darkOrange",light:"lightOrange"},syntaxType:{dark:"darkViolet",light:"lightViolet"},syntaxOperator:{dark:"darkSecondary",light:"lightSecondary"},syntaxPunctuation:{dark:"darkText",light:"lightText"},selectedListItemText:{dark:"darkBg",light:"lightBg"}}}});var conductor_default;var init_conductor=__esm(()=>{conductor_default={$schema:"https://opencode.ai/theme.json",defs:{darkStep1:"#0a0a0a",darkStep2:"#111111",darkStep3:"#181818",darkStep4:"#1f1f1f",darkStep5:"#2a2a2a",darkStep6:"#363636",darkStep7:"#444444",darkStep8:"#5a5a5a",darkStep9:"#7a7a7a",darkStep10:"#9a9a9a",darkStep11:"#909090",darkStep12:"#e8e8e8",darkAccent:"#7da5c8",darkAccentBright:"#9bc3e3",darkRed:"#e06c75",darkOrange:"#d6a668",darkGreen:"#7fd88f",darkCyan:"#7da5c8",darkYellow:"#d6a668",lightStep1:"#fafafa",lightStep2:"#f3f3f3",lightStep3:"#ececec",lightStep4:"#e2e2e2",lightStep5:"#d4d4d4",lightStep6:"#bdbdbd",lightStep7:"#9c9c9c",lightStep8:"#7c7c7c",lightStep9:"#5b5b5b",lightStep10:"#404040",lightStep11:"#6c6c6c",lightStep12:"#1a1a1a",lightAccent:"#3d6f9f",lightAccentBright:"#1a4f87",lightRed:"#c9343a",lightOrange:"#a06b1a",lightGreen:"#3d9a57",lightCyan:"#3d6f9f",lightYellow:"#a06b1a"},theme:{primary:{dark:"darkStep12",light:"lightStep12"},secondary:{dark:"darkAccentBright",light:"lightAccentBright"},accent:{dark:"darkAccent",light:"lightAccent"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkOrange",light:"lightOrange"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkCyan",light:"lightCyan"},text:{dark:"darkStep12",light:"lightStep12"},textMuted:{dark:"darkStep11",light:"lightStep11"},background:{dark:"darkStep1",light:"lightStep1"},backgroundPanel:{dark:"darkStep2",light:"lightStep2"},backgroundElement:{dark:"darkStep3",light:"lightStep3"},backgroundMenu:{dark:"darkStep4",light:"lightStep4"},border:{dark:"darkStep6",light:"lightStep6"},borderActive:{dark:"darkStep8",light:"lightStep8"},borderSubtle:{dark:"darkStep4",light:"lightStep4"},diffAdded:{dark:"#7fd88f",light:"#3d9a57"},diffRemoved:{dark:"#e06c75",light:"#c9343a"},diffContext:{dark:"darkStep10",light:"lightStep10"},diffHunkHeader:{dark:"darkStep10",light:"lightStep10"},diffHighlightAdded:{dark:"#9be5ad",light:"#2d7a3f"},diffHighlightRemoved:{dark:"#f08490",light:"#a82530"},diffAddedBg:{dark:"#15241a",light:"#d8efdc"},diffRemovedBg:{dark:"#2a1518",light:"#f5dadc"},diffContextBg:{dark:"darkStep2",light:"lightStep2"},diffLineNumber:{dark:"darkStep9",light:"lightStep9"},diffAddedLineNumberBg:{dark:"#0f1c14",light:"#c5deca"},diffRemovedLineNumberBg:{dark:"#221012",light:"#e5c5c8"},markdownText:{dark:"darkStep12",light:"lightStep12"},markdownHeading:{dark:"darkStep12",light:"lightStep12"},markdownLink:{dark:"darkAccent",light:"lightAccent"},markdownCode:{dark:"darkAccentBright",light:"lightAccentBright"},markdownCodeBlock:{dark:"darkStep12",light:"lightStep12"},markdownQuote:{dark:"darkStep11",light:"lightStep11"},selectedListItemText:{dark:"darkStep1",light:"lightStep1"}}}});var tokyonight_default;var init_tokyonight=__esm(()=>{tokyonight_default={$schema:"https://opencode.ai/theme.json",defs:{darkStep1:"#1a1b26",darkStep2:"#1e2030",darkStep3:"#222436",darkStep4:"#292e42",darkStep5:"#3b4261",darkStep6:"#545c7e",darkStep7:"#737aa2",darkStep8:"#9099b2",darkStep9:"#82aaff",darkStep10:"#89b4fa",darkStep11:"#828bb8",darkStep12:"#c8d3f5",darkRed:"#ff757f",darkOrange:"#ff966c",darkYellow:"#ffc777",darkGreen:"#c3e88d",darkCyan:"#86e1fc",darkPurple:"#c099ff",lightStep1:"#e1e2e7",lightStep2:"#d5d6db",lightStep3:"#c8c9ce",lightStep4:"#b9bac1",lightStep5:"#a8aecb",lightStep6:"#9699a8",lightStep7:"#737a8c",lightStep8:"#5a607d",lightStep9:"#2e7de9",lightStep10:"#1a6ce7",lightStep11:"#8990a3",lightStep12:"#3760bf",lightRed:"#f52a65",lightOrange:"#b15c00",lightYellow:"#8c6c3e",lightGreen:"#587539",lightCyan:"#007197",lightPurple:"#9854f1"},theme:{primary:{dark:"darkStep9",light:"lightStep9"},secondary:{dark:"darkPurple",light:"lightPurple"},accent:{dark:"darkOrange",light:"lightOrange"},error:{dark:"darkRed",light:"lightRed"},warning:{dark:"darkOrange",light:"lightOrange"},success:{dark:"darkGreen",light:"lightGreen"},info:{dark:"darkStep9",light:"lightStep9"},text:{dark:"darkStep12",light:"lightStep12"},textMuted:{dark:"darkStep11",light:"lightStep11"},background:{dark:"darkStep1",light:"lightStep1"},backgroundPanel:{dark:"darkStep2",light:"lightStep2"},backgroundElement:{dark:"darkStep3",light:"lightStep3"},border:{dark:"darkStep7",light:"lightStep7"},borderActive:{dark:"darkStep8",light:"lightStep8"},borderSubtle:{dark:"darkStep6",light:"lightStep6"},diffAdded:{dark:"#4fd6be",light:"#1e725c"},diffRemoved:{dark:"#c53b53",light:"#c53b53"},diffContext:{dark:"#828bb8",light:"#7086b5"},diffHunkHeader:{dark:"#828bb8",light:"#7086b5"},diffHighlightAdded:{dark:"#b8db87",light:"#4db380"},diffHighlightRemoved:{dark:"#e26a75",light:"#f52a65"},diffAddedBg:{dark:"#20303b",light:"#d5e5d5"},diffRemovedBg:{dark:"#37222c",light:"#f7d8db"},diffContextBg:{dark:"darkStep2",light:"lightStep2"},diffLineNumber:{dark:"#8f909a",light:"#59595b"},diffAddedLineNumberBg:{dark:"#1b2b34",light:"#c5d5c5"},diffRemovedLineNumberBg:{dark:"#2d1f26",light:"#e7c8cb"},markdownText:{dark:"darkStep12",light:"lightStep12"},markdownHeading:{dark:"darkPurple",light:"lightPurple"},markdownLink:{dark:"darkStep9",light:"lightStep9"},markdownLinkText:{dark:"darkCyan",light:"lightCyan"},markdownCode:{dark:"darkGreen",light:"lightGreen"},markdownBlockQuote:{dark:"darkYellow",light:"lightYellow"},markdownEmph:{dark:"darkYellow",light:"lightYellow"},markdownStrong:{dark:"darkOrange",light:"lightOrange"},markdownHorizontalRule:{dark:"darkStep11",light:"lightStep11"},markdownListItem:{dark:"darkStep9",light:"lightStep9"},markdownListEnumeration:{dark:"darkCyan",light:"lightCyan"},markdownImage:{dark:"darkStep9",light:"lightStep9"},markdownImageText:{dark:"darkCyan",light:"lightCyan"},markdownCodeBlock:{dark:"darkStep12",light:"lightStep12"},syntaxComment:{dark:"darkStep11",light:"lightStep11"},syntaxKeyword:{dark:"darkPurple",light:"lightPurple"},syntaxFunction:{dark:"darkStep9",light:"lightStep9"},syntaxVariable:{dark:"darkRed",light:"lightRed"},syntaxString:{dark:"darkGreen",light:"lightGreen"},syntaxNumber:{dark:"darkOrange",light:"lightOrange"},syntaxType:{dark:"darkYellow",light:"lightYellow"},syntaxOperator:{dark:"darkCyan",light:"lightCyan"},syntaxPunctuation:{dark:"darkStep12",light:"lightStep12"}}}});var BUNDLED_THEME_JSONS;var init_bundled=__esm(()=>{init_claude();init_conductor();init_tokyonight();BUNDLED_THEME_JSONS={claude:claude_default,conductor:conductor_default,tokyonight:tokyonight_default}});import{RGBA as RGBA2}from"@opentui/core";function hasBundledTheme(name){return Boolean(BUNDLED_THEMES[name])}function resolveTheme(theme,mode="dark"){let defs=theme.defs??{};function resolve5(c,chain=[]){if(typeof c==="string"){if(c==="transparent"||c==="none")return RGBA2.fromInts(0,0,0,0);if(c.startsWith("#"))return RGBA2.fromHex(c);if(chain.includes(c))return RGBA2.fromInts(0,0,0);let next=defs[c]??theme.theme[c];if(next===void 0)return RGBA2.fromInts(0,0,0);return resolve5(next,[...chain,c])}return resolve5(c[mode],chain)}let out={};for(let[k,v]of Object.entries(theme.theme))out[k]=resolve5(v);let text=out.text??RGBA2.fromHex("#ffffff"),background=out.background??RGBA2.fromHex("#000000");return{...{primary:out.primary??text,secondary:out.secondary??text,accent:out.accent??out.primary??text,error:out.error??text,warning:out.warning??text,warningOnHost:out.warning??text,success:out.success??text,info:out.info??text,text,textMuted:out.textMuted??text,background,backgroundPanel:out.backgroundPanel??background,backgroundElement:out.backgroundElement??background,backgroundMenu:out.backgroundMenu??out.backgroundElement??background,backgroundDialog:out.backgroundDialog??out.backgroundPanel??background,border:out.border??text,borderActive:out.borderActive??out.border??text,borderSubtle:out.borderSubtle??out.border??text,diffAdded:out.diffAdded??out.success??text,diffRemoved:out.diffRemoved??out.error??text,diffContext:out.diffContext??out.textMuted??text,diffHunkHeader:out.diffHunkHeader??out.textMuted??text,diffAddedBg:out.diffAddedBg??background,diffRemovedBg:out.diffRemovedBg??background,selectedListItemText:out.selectedListItemText??background},...out}}function applyDisplayOverlay(base,focusAccent,transparentBackground,hostBackground){let v={...base,focusAccent:base[focusAccent]??base.primary,warningOnHost:base.warning};if(!transparentBackground)return v;let[backgroundR,backgroundG,backgroundB]=base.background.toInts(),[panelR,panelG,panelB]=base.backgroundPanel.toInts(),transparent={...v,background:RGBA2.fromInts(backgroundR,backgroundG,backgroundB,0),backgroundPanel:RGBA2.fromInts(panelR,panelG,panelB,0)};if(!hostBackground)return transparent;return{...transparent,text:ensureContrast(transparent.text,hostBackground),textMuted:ensureContrast(transparent.textMuted,hostBackground),warningOnHost:ensureContrast(transparent.warning,hostBackground)}}var BUNDLED_THEMES,DEFAULT_THEME="claude",FOCUS_ACCENT_SLOTS;var init_theme_core=__esm(()=>{init_contrast_guard();init_bundled();BUNDLED_THEMES=BUNDLED_THEME_JSONS;FOCUS_ACCENT_SLOTS=["primary","success","info"]});function normalizeHex(value){let m=/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.exec(value);if(!m)return null;let digits=m[1];if(digits.length===3){let[r,g,b]=digits;return`#${r}${r}${g}${g}${b}${b}`.toLowerCase()}return`#${digits.slice(0,6)}`.toLowerCase()}function resolveThemeSlotHex(theme,slot,mode="dark"){let defs=theme.defs??{};function resolve5(c,chain){if(typeof c==="string"){if(c==="transparent"||c==="none")return null;if(c.startsWith("#"))return normalizeHex(c);if(chain.includes(c))return null;let next=defs[c]??theme.theme[c];if(next===void 0)return null;return resolve5(next,[...chain,c])}if(!c||typeof c!=="object")return null;let variant=c[mode];return typeof variant==="string"?resolve5(variant,chain):null}let value=theme.theme[slot];if(value===void 0)return null;return resolve5(value,[slot])}function isPlainObject(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function validateTheme(value){if(!isPlainObject(value))return{ok:!1,reason:"theme must be a JSON object at the top level"};let obj=value;if(!("theme"in obj))return{ok:!1,reason:"missing required key `theme`"};let theme=obj.theme;if(!isPlainObject(theme))return{ok:!1,reason:"`theme` must be an object map"};if("defs"in obj&&obj.defs!==void 0){if(!isPlainObject(obj.defs))return{ok:!1,reason:"`defs` must be an object map"};for(let[k,v]of Object.entries(obj.defs))if(typeof v!=="string")return{ok:!1,reason:`defs.${k} must be a string (hex like "#abc" or a ref name)`}}for(let[slot,raw]of Object.entries(theme)){if(typeof raw==="string")continue;if(!isPlainObject(raw))return{ok:!1,reason:`theme.${slot} must be a string or a { dark, light } object (got ${raw===null?"null":Array.isArray(raw)?"array":typeof raw})`};let variant=raw;if(typeof variant.dark!=="string")return{ok:!1,reason:`theme.${slot}.dark must be a string`};if(typeof variant.light!=="string")return{ok:!1,reason:`theme.${slot}.light must be a string`}}if("$schema"in obj&&obj.$schema!==void 0&&typeof obj.$schema!=="string")return{ok:!1,reason:"`$schema` must be a string when present"};return{ok:!0,theme:obj}}var init_schema2=()=>{};import{readFileSync as readFileSync10,readdirSync as readdirSync2}from"fs";import{join as join13}from"path";function userThemesDir(){return join13(roveStateDir(),"themes")}function loadUserThemes(){let dir=userThemesDir(),entries;try{entries=readdirSync2(dir)}catch{return[]}let out=[];for(let file of entries){if(!file.endsWith(".json"))continue;let path15=join13(dir,file),parsed;try{let text=readFileSync10(path15,"utf8");parsed=JSON.parse(text)}catch(err){let msg=errorMessage(err);console.warn(`[rove] skipping user theme ${path15}: invalid JSON \u2014 ${msg}`);continue}let result=validateTheme(parsed);if(!result.ok){console.warn(`[rove] skipping user theme ${path15}: ${result.reason}`);continue}let name=file.slice(0,-5);out.push({name,theme:result.theme})}return out}var init_loader=__esm(()=>{init_env();init_schema2()});var en,zh;var init_automations=__esm(()=>{en={title:"ROUTINES",holdingDaemon:"keeping the daemon awake",notHolding:"none active",paused:"paused",newTitle:"New routine",composerLegend:"enter create \xB7 tab fields \xB7 \u2190\u2192 \u2191\u2193 edit the focused field \xB7 esc cancel",fieldName:"NAME",fieldRepo:"REPO",fieldPrompt:"PROMPT",fieldSchedule:"SCHEDULE (FIVE-FIELD CRON)",namePlaceholder:"weekday dependency audit",promptPlaceholder:"Audit dependencies and summarize risky changes.",needRepo:"Open a project first \u2014 a routine runs in one.",cronInvalid:"not a five-field cron",cronField:{minute:"min",hour:"hour",dayOfMonth:"day",month:"month",dayOfWeek:"weekday"},cronNever:"valid, but never fires",missing:{name:"Give it a name.",repo:"Pick a project.",prompt:"Say what it should do.",schedule:"That schedule will not run."},empty:"No routines scheduled.",emptyHint:"Press n to create one.",precheck:"precheck: {command}",recentRuns:"RECENT RUNS",noRuns:"Not run yet.",noSelection:"A routine runs its prompt in a project on a schedule.",running:"Running {name}\u2026",ranWith:"{name}: {status}",runNow:"[ run now ]",runNowHint:"try it without waiting for the schedule",deleteTitle:"Delete routine?",deleteBody:"{name} and its run history will be removed. Tasks it already created are untouched.",deleteButton:"Delete",failed:"{error}"},zh={title:"\u4F8B\u884C\u4EFB\u52A1",holdingDaemon:"\u6B63\u5728\u4FDD\u6301\u5B88\u62A4\u8FDB\u7A0B\u5E38\u9A7B",notHolding:"\u65E0\u542F\u7528\u9879",paused:"\u5DF2\u6682\u505C",newTitle:"\u65B0\u5EFA\u4F8B\u884C\u4EFB\u52A1",composerLegend:"enter \u521B\u5EFA \xB7 tab \u5207\u5B57\u6BB5 \xB7 \u2190\u2192 \u2191\u2193 \u7F16\u8F91\u5F53\u524D\u5B57\u6BB5 \xB7 esc \u53D6\u6D88",fieldName:"\u540D\u79F0",fieldRepo:"\u4ED3\u5E93",fieldPrompt:"\u63D0\u793A\u8BCD",fieldSchedule:"\u8C03\u5EA6\uFF08\u4E94\u6BB5 cron\uFF09",namePlaceholder:"\u5DE5\u4F5C\u65E5\u4F9D\u8D56\u5BA1\u8BA1",promptPlaceholder:"\u5BA1\u8BA1\u4F9D\u8D56\u5E76\u603B\u7ED3\u6709\u98CE\u9669\u7684\u53D8\u66F4\u3002",needRepo:"\u5148\u6253\u5F00\u4E00\u4E2A\u9879\u76EE\u2014\u2014\u4F8B\u884C\u4EFB\u52A1\u8981\u8DD1\u5728\u67D0\u4E2A\u9879\u76EE\u91CC\u3002",cronInvalid:"\u4E0D\u662F\u5408\u6CD5\u7684\u4E94\u6BB5 cron",cronField:{minute:"\u5206",hour:"\u65F6",dayOfMonth:"\u65E5",month:"\u6708",dayOfWeek:"\u661F\u671F"},cronNever:"\u8BED\u6CD5\u5408\u6CD5\uFF0C\u4F46\u6C38\u8FDC\u4E0D\u4F1A\u89E6\u53D1",missing:{name:"\u8D77\u4E2A\u540D\u5B57\u3002",repo:"\u9009\u4E00\u4E2A\u9879\u76EE\u3002",prompt:"\u8BF4\u660E\u5B83\u8981\u505A\u4EC0\u4E48\u3002",schedule:"\u8FD9\u4E2A\u8C03\u5EA6\u4E0D\u4F1A\u89E6\u53D1\u3002"},empty:"\u8FD8\u6CA1\u6709\u4F8B\u884C\u4EFB\u52A1\u3002",emptyHint:"\u6309 n \u65B0\u5EFA\u4E00\u6761\u3002",precheck:"\u9884\u68C0\uFF1A{command}",recentRuns:"\u6700\u8FD1\u6267\u884C",noRuns:"\u5C1A\u672A\u6267\u884C\u3002",noSelection:"\u4F8B\u884C\u4EFB\u52A1\u4F1A\u6309\u8C03\u5EA6\u5728\u67D0\u4E2A\u9879\u76EE\u91CC\u8DD1\u5B83\u7684\u63D0\u793A\u8BCD\u3002",running:"\u6B63\u5728\u8FD0\u884C {name}\u2026",ranWith:"{name}\uFF1A{status}",runNow:"[ \u7ACB\u5373\u8FD0\u884C ]",runNowHint:"\u4E0D\u7B49\u8C03\u5EA6\uFF0C\u76F4\u63A5\u8BD5\u4E00\u6B21",deleteTitle:"\u5220\u9664\u8FD9\u6761\u4F8B\u884C\u4EFB\u52A1\uFF1F",deleteBody:"\u5C06\u5220\u9664 {name} \u53CA\u5176\u6267\u884C\u8BB0\u5F55\u3002\u5B83\u5DF2\u7ECF\u521B\u5EFA\u7684\u4EFB\u52A1\u4E0D\u53D7\u5F71\u54CD\u3002",deleteButton:"\u5220\u9664",failed:"{error}"}});var en2,zh2;var init_common=__esm(()=>{en2={cancel:"Cancel",loading:"Loading\u2026",create:"create",confirm:"Confirm",paneCrash:{title:"This pane crashed",hint:"Reload it from the Tasks pane (the error was logged to client.log)."},rename:{defaultTitle:"Rename task",defaultFieldLabel:"TITLE",footerHint:"enter {submitLabel} \xB7 esc cancel",defaultSubmitLabel:"rename"},prompt:{fieldLabel:"input",submitLabel:"submit"}},zh2={cancel:"\u53D6\u6D88",loading:"\u52A0\u8F7D\u4E2D\u2026",create:"\u521B\u5EFA",confirm:"\u786E\u8BA4",paneCrash:{title:"\u6B64\u9762\u677F\u5DF2\u5D29\u6E83",hint:"\u8BF7\u4ECE\u4EFB\u52A1\u9762\u677F\u91CD\u65B0\u52A0\u8F7D\uFF08\u9519\u8BEF\u5DF2\u8BB0\u5F55\u5230 client.log\uFF09\u3002"},rename:{defaultTitle:"\u91CD\u547D\u540D\u4EFB\u52A1",defaultFieldLabel:"\u540D\u79F0",footerHint:"enter {submitLabel} \xB7 esc \u53D6\u6D88",defaultSubmitLabel:"\u91CD\u547D\u540D"},prompt:{fieldLabel:"\u8F93\u5165",submitLabel:"\u63D0\u4EA4"}}});var en3,zh3;var init_doctor=__esm(()=>{en3={fix:{hint:"{count} finding(s) above have a known fix \u2014 run `{command}` to review them one by one",none:"fix: nothing to fix \u2014 no known remediation applies to this report",header:"fixes \u2014 each one asks before running:",willRun:"will run: {command}",confirmPrompt:"apply this fix? [y/N] ",done:"\u2713 done",failed:"\u2717 exited with code {code}",skipped:"\xB7 skipped",nonInteractive:"no interactive terminal \u2014 nothing was executed; run the commands above yourself",manualHeader:"manual steps \u2014 doctor prints these but never runs them:",daemonRestartWhy:"safe to run: engine sessions live in the separate PTY host and survive a daemon restart",daemonStale:"restart the daemon \u2014 it is running an older build than this CLI",daemonDown:"start the daemon \u2014 it is not running",hooksDown:"restart the daemon to re-establish the engine hook channel",inspectStale:"restart the daemon \u2014 it predates the hook-channel check",skillInstallWhy:"safe to run: installs skill files only; re-running is idempotent",skillMissing:"install the Rove agent skill",skillStale:"update the Rove agent skill to the version this build expects",spawnHelper:"restore the exec bit on node-pty's spawn-helper \u2014 every node-pty PTY spawn fails without it",spawnHelperWhy:"safe to run: chmod on two prebuilt binaries; idempotent, and `bun install` does the same",resetWhy:"stops the daemon, the PTY host, and every live session \u2014 not undoable, so doctor only prints it",resetDaemonWedged:"the daemon process is alive but unreachable (wedged)",resetPty:"the PTY host is unreachable or not running",resetLegacy:"pre-v0.8 tmux sessions are still holding processes and memory",engineTabs:"engine tabs may hold a stale daemon socket path",engineTabsAction:"close and reopen the affected engine tabs in the TUI",engineTabsWhy:"kills that tab's live engine session \u2014 your call, not doctor's",staleInstall:"the install this Rove runs from no longer exists on disk",staleInstallAction:"npm install -g @sma1lboy/rove, then relaunch Rove",staleInstallWhy:"doctor cannot reinstall Rove over the running process \u2014 a human has to, then relaunch",humanOnlyWhy:"doctor does not install software or log in to accounts for you",git:"git is not on PATH",gitAction:"install git with your OS package manager",noEngine:"no usable engine \u2014 no engine CLI is both installed and logged in",noEngineAction:"install an engine CLI (claude, codex, copilot, or kimi) and log in",windowsNode:"Node.js is missing \u2014 the Windows PTY host cannot start",windowsNodeAction:"install Node.js from https://nodejs.org",staleBun:"the Bun running Rove is older than this build supports \u2014 terminals will not paint",staleBunAction:"upgrade Bun (`bun upgrade`, `brew upgrade bun`, or `npm install -g bun@latest`), then relaunch Rove"}},zh3={fix:{hint:"\u4E0A\u9762\u6709 {count} \u9879\u53D1\u73B0\u5B58\u5728\u5DF2\u77E5\u4FEE\u6CD5 \u2014 \u8FD0\u884C `{command}` \u9010\u6761\u67E5\u770B",none:"fix: \u65E0\u53EF\u4FEE\u9879 \u2014 \u672C\u6B21\u62A5\u544A\u6CA1\u6709\u5339\u914D\u5230\u5DF2\u77E5\u4FEE\u6CD5",header:"\u4FEE\u590D\u9879 \u2014 \u6BCF\u4E00\u6761\u90FD\u4F1A\u5148\u8BE2\u95EE\u518D\u6267\u884C:",willRun:"\u5C06\u6267\u884C: {command}",confirmPrompt:"\u6267\u884C\u8FD9\u6761\u4FEE\u590D\u5417? [y/N] ",done:"\u2713 \u5B8C\u6210",failed:"\u2717 \u9000\u51FA\u7801 {code}",skipped:"\xB7 \u5DF2\u8DF3\u8FC7",nonInteractive:"\u6CA1\u6709\u4EA4\u4E92\u7EC8\u7AEF \u2014 \u672A\u6267\u884C\u4EFB\u4F55\u547D\u4EE4; \u8BF7\u81EA\u884C\u8FD0\u884C\u4E0A\u9762\u7684\u547D\u4EE4",manualHeader:"\u4EBA\u5DE5\u6B65\u9AA4 \u2014 doctor \u53EA\u6253\u5370, \u6C38\u8FDC\u4E0D\u4F1A\u66FF\u4F60\u6267\u884C:",daemonRestartWhy:"\u53EF\u5B89\u5168\u6267\u884C: \u5F15\u64CE\u4F1A\u8BDD\u5728\u72EC\u7ACB\u7684 PTY host \u91CC, daemon \u91CD\u542F\u540E\u4ECD\u7136\u5B58\u6D3B",daemonStale:"\u91CD\u542F daemon \u2014 \u5B83\u8FD0\u884C\u7684\u6784\u5EFA\u6BD4\u5F53\u524D CLI \u65E7",daemonDown:"\u542F\u52A8 daemon \u2014 \u5B83\u5F53\u524D\u6CA1\u6709\u5728\u8FD0\u884C",hooksDown:"\u91CD\u542F daemon \u4EE5\u91CD\u5EFA\u5F15\u64CE hook \u901A\u9053",inspectStale:"\u91CD\u542F daemon \u2014 \u5B83\u7684\u7248\u672C\u65E9\u4E8E hook \u901A\u9053\u68C0\u67E5",skillInstallWhy:"\u53EF\u5B89\u5168\u6267\u884C: \u53EA\u5199\u5165 skill \u6587\u4EF6; \u91CD\u590D\u8FD0\u884C\u662F\u5E42\u7B49\u7684",skillMissing:"\u5B89\u88C5 Rove agent skill",skillStale:"\u628A Rove agent skill \u66F4\u65B0\u5230\u5F53\u524D\u6784\u5EFA\u671F\u671B\u7684\u7248\u672C",spawnHelper:"\u6062\u590D node-pty spawn-helper \u7684\u53EF\u6267\u884C\u4F4D \u2014 \u7F3A\u4E86\u5B83 node-pty \u7684\u6BCF\u6B21 PTY \u542F\u52A8\u90FD\u4F1A\u5931\u8D25",spawnHelperWhy:"\u53EF\u5B89\u5168\u6267\u884C: \u53EA\u5BF9\u4E24\u4E2A\u9884\u7F16\u8BD1\u4E8C\u8FDB\u5236\u505A chmod; \u5E42\u7B49, `bun install` \u4E5F\u4F1A\u505A\u540C\u6837\u7684\u4E8B",resetWhy:"\u4F1A\u505C\u6389 daemon\u3001PTY host \u548C\u6240\u6709\u6D3B\u52A8\u4F1A\u8BDD \u2014 \u4E0D\u53EF\u64A4\u9500, \u6240\u4EE5 doctor \u53EA\u6253\u5370",resetDaemonWedged:"daemon \u8FDB\u7A0B\u5B58\u6D3B\u4F46\u65E0\u6CD5\u8FDE\u63A5 (\u5361\u6B7B)",resetPty:"PTY host \u65E0\u6CD5\u8FDE\u63A5\u6216\u6CA1\u6709\u5728\u8FD0\u884C",resetLegacy:"v0.8 \u4E4B\u524D\u7684 tmux \u4F1A\u8BDD\u4ECD\u5360\u7528\u8FDB\u7A0B\u548C\u5185\u5B58",engineTabs:"\u5F15\u64CE tab \u53EF\u80FD\u6301\u6709\u8FC7\u671F\u7684 daemon socket \u8DEF\u5F84",engineTabsAction:"\u5728 TUI \u91CC\u5173\u95ED\u5E76\u91CD\u5F00\u53D7\u5F71\u54CD\u7684\u5F15\u64CE tab",engineTabsWhy:"\u4F1A\u6740\u6389\u8BE5 tab \u7684\u6D3B\u52A8\u5F15\u64CE\u4F1A\u8BDD \u2014 \u7531\u4F60\u51B3\u5B9A, doctor \u4E0D\u4EE3\u52B3",staleInstall:"\u5F53\u524D Rove \u6240\u5728\u7684\u5B89\u88C5\u5DF2\u4ECE\u78C1\u76D8\u5220\u9664",staleInstallAction:"npm install -g @sma1lboy/rove, \u7136\u540E\u91CD\u65B0\u542F\u52A8 Rove",staleInstallWhy:"doctor \u65E0\u6CD5\u5728\u8FD0\u884C\u4E2D\u7684\u8FDB\u7A0B\u4E0A\u91CD\u88C5 Rove \u2014 \u9700\u8981\u4EBA\u5DE5\u91CD\u88C5\u540E\u91CD\u65B0\u542F\u52A8",humanOnlyWhy:"doctor \u4E0D\u4F1A\u66FF\u4F60\u5B89\u88C5\u8F6F\u4EF6\u6216\u767B\u5F55\u8D26\u53F7",git:"PATH \u4E0A\u627E\u4E0D\u5230 git",gitAction:"\u7528\u4F60\u7684\u7CFB\u7EDF\u5305\u7BA1\u7406\u5668\u5B89\u88C5 git",noEngine:"\u6CA1\u6709\u53EF\u7528\u5F15\u64CE \u2014 \u6CA1\u6709\u4EFB\u4F55\u5F15\u64CE CLI \u540C\u65F6\u6EE1\u8DB3\u5DF2\u5B89\u88C5\u4E14\u5DF2\u767B\u5F55",noEngineAction:"\u5B89\u88C5\u4EFB\u4E00\u5F15\u64CE CLI\uFF08claude\u3001codex\u3001copilot \u6216 kimi\uFF09\u5E76\u767B\u5F55",windowsNode:"\u7F3A\u5C11 Node.js \u2014 Windows PTY host \u65E0\u6CD5\u542F\u52A8",windowsNodeAction:"\u4ECE https://nodejs.org \u5B89\u88C5 Node.js",staleBun:"\u8FD0\u884C Rove \u7684 Bun \u7248\u672C\u4F4E\u4E8E\u672C\u6784\u5EFA\u7684\u8981\u6C42 \u2014 \u7EC8\u7AEF\u4E0D\u4F1A\u6709\u4EFB\u4F55\u8F93\u51FA",staleBunAction:"\u5347\u7EA7 Bun (`bun upgrade` / `brew upgrade bun` / `npm install -g bun@latest`), \u7136\u540E\u91CD\u65B0\u542F\u52A8 Rove"}}});var en4,zh4;var init_files=__esm(()=>{en4={tabs:{all:"All",changes:"Changes"},actions:{zen:"Zen",createPR:"Ask agent to create PR"},legend:{changes:"M modified \xB7 A added \xB7 D deleted \xB7 ? untracked"},scope:{working:"scope: working tree",branch:"scope: vs {base}",toggleHint:"b to toggle"},empty:{noTask:"(no task \u2014 press n to create)",noFiles:"(empty worktree)",noChanges:"(no changes \u2014 clean worktree)"},error:{retryHint:"press r to retry",notGitRepo:"not a git repository",pathMissing:"worktree path is missing",permissionDenied:"permission denied",gitNotInstalled:"git is not installed",gitFailed:"git command failed"},toast:{prOnTargetBranch:"Already on the target branch ({branch}) \u2014 ask the agent to create the PR from a task branch"}},zh4={tabs:{all:"\u5168\u90E8",changes:"\u6539\u52A8"},actions:{zen:"\u4E13\u6CE8\u6A21\u5F0F",createPR:"\u8BA9 agent \u521B\u5EFA PR"},legend:{changes:"M \u5DF2\u4FEE\u6539 \xB7 A \u5DF2\u6DFB\u52A0 \xB7 D \u5DF2\u5220\u9664 \xB7 ? \u672A\u8DDF\u8E2A"},scope:{working:"\u8303\u56F4\uFF1A\u5DE5\u4F5C\u533A\u6539\u52A8",branch:"\u8303\u56F4\uFF1A\u5BF9\u6BD4 {base}",toggleHint:"\u6309 b \u5207\u6362"},empty:{noTask:"\uFF08\u6682\u65E0\u4EFB\u52A1 \u2014 \u6309 n \u521B\u5EFA\uFF09",noFiles:"\uFF08worktree \u4E3A\u7A7A\uFF09",noChanges:"\uFF08\u65E0\u6539\u52A8 \u2014 worktree \u5E72\u51C0\uFF09"},error:{retryHint:"\u6309 r \u91CD\u8BD5",notGitRepo:"\u4E0D\u662F git \u4ED3\u5E93",pathMissing:"worktree \u8DEF\u5F84\u4E0D\u5B58\u5728",permissionDenied:"\u6743\u9650\u4E0D\u8DB3",gitNotInstalled:"\u672A\u5B89\u88C5 git",gitFailed:"git \u547D\u4EE4\u5931\u8D25"},toast:{prOnTargetBranch:"\u5F53\u524D\u5C31\u5728\u76EE\u6807\u5206\u652F\uFF08{branch}\uFF09\u2014 \u8BF7\u5728\u4EFB\u52A1\u5206\u652F\u4E0A\u8BA9 agent \u521B\u5EFA PR"}}});var en5,zh5;var init_help=__esm(()=>{en5={title:"Rove \u2014 keybindings",esc:"esc",commandLayer:"{prefix} \u2014 more Rove commands",escCancel:"esc cancel",directLayer:"Hold ctrl \u2014 Rove shortcuts",releaseCtrl:"release ctrl to close",overflow:"\u2026 F1 for all shortcuts",moreCommandsPrefix:"More commands (prefix)",focused:"Focused: {surface}",allBindings:"All keybinding contexts",grammar:"Use keys here \xB7 one-press Rove shortcuts \xB7 {prefix} for more commands",disabled:"prefix disabled",here:"HERE \u2014 only in {surface}",direct:"ONE PRESS \u2014 Rove shortcuts",afterPrefix:"AFTER PREFIX \u2014 more Rove commands",otherPane:"OTHER PANE \u2014 {surface}"},zh5={title:"Rove \u2014 \u5FEB\u6377\u952E",esc:"esc",commandLayer:"{prefix} \u2014 \u66F4\u591A Rove \u547D\u4EE4",escCancel:"esc \u53D6\u6D88",directLayer:"\u6309\u4F4F ctrl \u2014 Rove \u5FEB\u6377\u952E",releaseCtrl:"\u677E\u5F00 ctrl \u5173\u95ED",overflow:"\u2026 \u6309 F1 \u67E5\u770B\u5168\u90E8\u5FEB\u6377\u952E",moreCommandsPrefix:"\u66F4\u591A\u547D\u4EE4\uFF08prefix\uFF09",focused:"\u5F53\u524D\u7126\u70B9\uFF1A{surface}",allBindings:"\u6240\u6709\u5FEB\u6377\u952E\u4E0A\u4E0B\u6587",grammar:"\u5F53\u524D\u533A\u57DF\u76F4\u63A5\u6309 \xB7 Rove \u5355\u6B21\u5FEB\u6377\u952E \xB7 {prefix} \u6253\u5F00\u66F4\u591A\u547D\u4EE4",disabled:"Prefix \u5DF2\u7981\u7528",here:"\u5F53\u524D\u533A\u57DF \u2014 \u4EC5\u5728{surface}",direct:"\u4E00\u6B21\u6309\u4E0B \u2014 Rove \u5FEB\u6377\u952E",afterPrefix:"\u6309\u4E0B Prefix \u540E \u2014 \u66F4\u591A Rove \u547D\u4EE4",otherPane:"\u5176\u4ED6\u533A\u57DF \u2014 {surface}"}});var en6,zh6;var init_hints=__esm(()=>{en6={status:{commands:"{key} commands",help:"{key} help",sidebar:"{key} sidebar",settings:"settings"},pane:{move:"move",open:"open",collapse:"collapse",diff:"diff"}},zh6={status:{commands:"{key} \u547D\u4EE4",help:"{key} \u5E2E\u52A9",sidebar:"{key} \u4FA7\u680F",settings:"\u8BBE\u7F6E"},pane:{move:"\u79FB\u52A8",open:"\u6253\u5F00",collapse:"\u6298\u53E0",diff:"\u5DEE\u5F02"}}});var en7,zh7;var init_kanban=__esm(()=>{en7={title:"Kanban",hint:"tab project \xB7 \u2190\u2193\u2191\u2192 card \xB7 enter detail \xB7 n new \xB7 d delete \xB7 r refresh \xB7 esc close",loading:"Loading issues\u2026",noRepos:"No projects yet \u2014 create a task first.",empty:"No issues \u2014 agents file them via `rove api issue-create`.",columnEmpty:"No cards",column:{backlog:"Backlog",inProgress:"In progress",parked:"Parked",done:"Done"},more:"+{count} more",attention:"{count} need you",turnComplete:"turn done",detail:{status:{open:"open",doing:"doing",hold:"hold",done:"done"},created:"created {date}",linked:"linked to a session",titleLabel:"TITLE",description:"DESCRIPTION",noDescription:"No description.",attachHint:"paste a path / ctrl+v screenshot \u2192 inserts an image placeholder",engine:"ENGINE",workspace:"WORKSPACE",placement:{worktree:"New worktree task \u2014 its own workspace",projectWorktree:"New worktree \u2014 as a chattab in the project workspace",project:"Project checkout \u2014 a new chattab, no worktree"},jumpLabel:"AFTER START",jump:{stay:"Stay on the board",follow:"Jump to the session"},startLegend:"enter/ctrl+enter start \xB7 tab fields \xB7 \u2190\u2192 engine \xB7 \u2191\u2193 workspace \xB7 esc save & close",sessionLabel:"SESSION",openAction:"Open the linked session \u21B5",unlinkAction:"Unlink",openLegend:"enter open the focused action \xB7 tab fields \xB7 unlink returns the card to Backlog \xB7 esc save & close",eventsLabel:"EVENTS",eventsLoading:"Loading events\u2026",eventsNone:"No engine events recorded yet.",doneNote:"Done stories have nothing left to start \xB7 esc save & close",startedBackground:"Started in background: {title}",newStory:"NEW STORY",createLegend:"ctrl+s save \xB7 enter/ctrl+enter save & start \xB7 tab fields \xB7 esc cancel"},confirmDelete:{title:"Delete story #{id}?",body:"\u201C{title}\u201D will be removed from the tracker. A linked task, branch, or worktree is left untouched."},deleteFailed:"Couldn't delete story #{id}: {error}",createFailed:"Couldn't create the story: {error}",updateFailed:"Couldn't save story #{id}: {error}",statusFailed:"Story #{id} stays in its old column: {error}",linkFailed:"Story #{id} isn't linked to its task: {error}",unlinkFailed:"Story #{id} is still linked: {error}"},zh7={title:"\u770B\u677F",hint:"tab \u5207\u9879\u76EE \xB7 \u2190\u2193\u2191\u2192 \u9009\u5361\u7247 \xB7 enter \u8BE6\u60C5 \xB7 n \u65B0\u5EFA \xB7 d \u5220\u9664 \xB7 r \u5237\u65B0 \xB7 esc \u5173\u95ED",loading:"\u6B63\u5728\u52A0\u8F7D issues\u2026",noRepos:"\u8FD8\u6CA1\u6709\u9879\u76EE\u2014\u2014\u5148\u521B\u5EFA\u4E00\u4E2A\u4EFB\u52A1\u3002",empty:"\u6682\u65E0 issue\u2014\u2014agent \u53EF\u901A\u8FC7 `rove api issue-create` \u521B\u5EFA\u3002",columnEmpty:"\u6682\u65E0\u5361\u7247",column:{backlog:"\u5F85\u529E",inProgress:"\u8FDB\u884C\u4E2D",parked:"\u6401\u7F6E",done:"\u5DF2\u5B8C\u6210"},more:"\u8FD8\u6709 {count} \u6761",attention:"{count} \u5F20\u7B49\u4F60\u5904\u7406",turnComplete:"\u56DE\u5408\u5B8C\u6210",detail:{status:{open:"\u5F85\u529E",doing:"\u8FDB\u884C\u4E2D",hold:"\u6401\u7F6E",done:"\u5DF2\u5B8C\u6210"},created:"\u521B\u5EFA\u4E8E {date}",linked:"\u5DF2\u5173\u8054\u4F1A\u8BDD",titleLabel:"\u6807\u9898",description:"\u63CF\u8FF0",noDescription:"\u6682\u65E0\u63CF\u8FF0\u3002",attachHint:"\u7C98\u8D34\u8DEF\u5F84 / ctrl+v \u8D34\u622A\u56FE \u2192 \u63D2\u5165\u56FE\u7247\u5360\u4F4D\u884C",engine:"\u5F15\u64CE",workspace:"\u5DE5\u4F5C\u533A",placement:{worktree:"\u65B0\u5EFA worktree \u4EFB\u52A1\u2014\u2014\u72EC\u7ACB\u5DE5\u4F5C\u533A",projectWorktree:"\u65B0\u5EFA worktree\u2014\u2014\u4F5C\u4E3A\u9879\u76EE\u5DE5\u4F5C\u533A\u91CC\u7684 chattab",project:"\u9879\u76EE\u4E3B\u76EE\u5F55\u2014\u2014\u65B0\u5F00 chattab,\u4E0D\u5EFA worktree"},jumpLabel:"\u542F\u52A8\u540E",jump:{stay:"\u7559\u5728\u770B\u677F",follow:"\u8DF3\u8F6C\u5230\u4F1A\u8BDD"},startLegend:"enter/ctrl+enter \u542F\u52A8 \xB7 tab \u5207\u5B57\u6BB5 \xB7 \u2190\u2192 \u5F15\u64CE \xB7 \u2191\u2193 \u5DE5\u4F5C\u533A \xB7 esc \u4FDD\u5B58\u5173\u95ED",sessionLabel:"\u4F1A\u8BDD",openAction:"\u6253\u5F00\u5173\u8054\u4F1A\u8BDD \u21B5",unlinkAction:"\u89E3\u9664\u5173\u8054",openLegend:"enter \u6267\u884C\u9009\u4E2D\u64CD\u4F5C \xB7 tab \u5207\u5B57\u6BB5 \xB7 \u89E3\u9664\u5173\u8054\u628A\u5361\u7247\u9000\u56DE Backlog \xB7 esc \u4FDD\u5B58\u5173\u95ED",eventsLabel:"\u4E8B\u4EF6",eventsLoading:"\u6B63\u5728\u52A0\u8F7D\u4E8B\u4EF6\u2026",eventsNone:"\u6682\u65E0\u5F15\u64CE\u4E8B\u4EF6\u8BB0\u5F55\u3002",doneNote:"\u5DF2\u5B8C\u6210\u7684 story \u65E0\u9700\u542F\u52A8 \xB7 esc \u4FDD\u5B58\u5173\u95ED",startedBackground:"\u5DF2\u5728\u540E\u53F0\u542F\u52A8:{title}",newStory:"\u65B0\u5EFA STORY",createLegend:"ctrl+s \u4EC5\u4FDD\u5B58 \xB7 enter/ctrl+enter \u4FDD\u5B58\u5E76\u542F\u52A8 \xB7 tab \u5207\u5B57\u6BB5 \xB7 esc \u53D6\u6D88"},confirmDelete:{title:"\u5220\u9664 story #{id}?",body:"\u300C{title}\u300D\u5C06\u4ECE tracker \u4E2D\u79FB\u9664\u3002\u5DF2\u5173\u8054\u7684\u4EFB\u52A1\u3001\u5206\u652F\u3001worktree \u4E0D\u53D7\u5F71\u54CD\u3002"},deleteFailed:"\u5220\u9664 story #{id} \u5931\u8D25\uFF1A{error}",createFailed:"\u521B\u5EFA story \u5931\u8D25\uFF1A{error}",updateFailed:"\u4FDD\u5B58 story #{id} \u5931\u8D25\uFF1A{error}",statusFailed:"Story #{id} \u4ECD\u7559\u5728\u539F\u6765\u7684\u5217\uFF1A{error}",linkFailed:"Story #{id} \u672A\u80FD\u5173\u8054\u5230\u5B83\u7684\u4EFB\u52A1\uFF1A{error}",unlinkFailed:"Story #{id} \u4ECD\u5904\u4E8E\u5173\u8054\u72B6\u6001\uFF1A{error}"}});var en8,zh8;var init_keys=__esm(()=>{en8={category:{Global:"Global",Sidebar:"Sidebar",Workspace:"Workspace",Navigation:"Navigation","Tasks pane":"Tasks pane",Files:"Files",Terminal:"Terminal",Dialog:"Dialog",Views:"Views",Tasks:"Tasks",Sessions:"Sessions",Attention:"Attention",Tools:"Tools"},desc:{"help.open":"Show keybindings help","task.new":"New task","task.new.global":"New task","task.openEditor":"Open active Task directory in editor","task.moveMode":"Reorder sidebar rows (then j/k \u2014 tab, task, or project)","settings.open":"Open settings","settings.open.sidebar":"Open settings","inbox.show":"Open attention Inbox","worktrees.open.sidebar":"Open worktrees","kanban.open":"Open kanban (issues board)","automations.open":"Open routines (scheduled tasks)","workItems.open":"Open GitHub issues (external tracker)","app.quit":"Quit (with confirm)","focus.sidebar":"Back to sidebar (tasks)","focus.previous":"Focus previous pane (files \u2192 workspace \u2192 sidebar)","focus.next":"Focus next pane (sidebar \u2192 workspace \u2192 files)","workspace.zenToggle":"Toggle zen mode","attention.next":"Jump to the next attention item","chat.interrupt":"Interrupt current turn (esc while streaming)","sidebar.nav":"Move cursor up/down","sidebar.select":"Open the selected task","sidebar.tree.open":"Open the row under the cursor","sidebar.goto":"Top / bottom of list (gg or shift-G)","sidebar.rename":"Rename task","sidebar.localMerge":"Reorder row (Shift+M, then j/k \u2014 tab, task, or project)","sidebar.pin":"Pin / unpin task at top (Shift+P)","sidebar.sort":"Switch task sort (default \u2194 recent)","sidebar.delete":"Delete task (with confirm)","sidebar.search.enter":"Search tasks (fuzzy filter)","sidebar.search.nav":"Move highlight in search results","sidebar.search.submit":"Select search match and exit search","sidebar.search.cancel":"Cancel search (restore prior selection)","tasks.openWorktree":"Open selected Task directory in your editor","tasks.renameBranch":"Rename the selected task's git branch","tasks.cycleEngine":"Cycle engine vendor \u2014 applies on reopen","tasks.update":"Open the update page (when a new version is available)","tasks.focusEngine":"Focus the engine pane of the current window","tasks.jump":"Jump to the task showing that digit","chat.send":"Send message (composer)","chat.newline":"Newline in composer","chat.cycle-mode":"Cycle permission mode (composer)","chat.steer":"Steer (interrupt + send) \u2014 mid-stream only","chat.tab.new":"New chat tab","chat.tab.chooseEngine":"New conversation \u2014 engine/shell picker with destination + context toggles","chat.tab.fork":"Fork this chat into a new tab (same Task directory, keeps the conversation)","chat.fork.new":"Quick-fork: create child task seeded with current repo/branch/model","chat.tab.close":"Close chat tab","chat.tab.rename":"Rename active chat tab","chat.tab.cycle-next":"Next chat tab","chat.tab.cycle-prev":"Previous chat tab","workspace.split.right":"Split right","workspace.split.down":"Split down","workspace.split.focus-next":"Focus next split","workspace.split.close":"Close active split (tab when unsplit)","workspace.split.rename":"Rename active split (tab when unsplit)","files.nav":"Move cursor up/down","files.hierarchy":"Collapse / expand tree level","files.open":"Open file in configured editor (diff when supported)","files.tab":"Switch tab (cycle All / Changes)","files.refresh":"Refresh","files.scope":"Toggle Changes scope (working \u2194 branch vs base)","files.diff":"Open a read-only diff in a workspace tab","files.openExternal":"Open file in system default app (audio / video / pdf preview)","files.mention":"Inject @<path> mention into the engine pane","files.createPR":"Ask the agent to create a PR from the current task","diff.review.cursor":"Move the line cursor over the diff","diff.review.range":"Toggle range anchor at the cursor","diff.review.note":"Add a review note at the cursor","diff.review.send":"Send all unsent review notes to the engine","inbox.nav":"Move through attention items","inbox.open":"Open the selected attention item","inbox.delete":"Clear the selected attention item","terminal.scroll-up":"Scroll scrollback up","terminal.scroll-down":"Scroll scrollback down","terminal.reset":"Reset terminal \u2014 kill the current shell and respawn","dialog.cancel":"Close the top dialog (esc)","dialog.newtask.tab.cycle":"Switch New Task tab (Existing / New Repo)"}},zh8={category:{Global:"\u5168\u5C40",Sidebar:"\u4FA7\u8FB9\u680F",Workspace:"\u5DE5\u4F5C\u533A",Navigation:"\u5BFC\u822A","Tasks pane":"\u4EFB\u52A1\u9762\u677F",Files:"\u6587\u4EF6",Terminal:"\u7EC8\u7AEF",Dialog:"\u5BF9\u8BDD\u6846",Views:"\u89C6\u56FE",Tasks:"\u4EFB\u52A1",Sessions:"\u4F1A\u8BDD",Attention:"\u63D0\u9192",Tools:"\u5DE5\u5177"},desc:{"help.open":"\u663E\u793A\u5FEB\u6377\u952E\u5E2E\u52A9","task.new":"\u65B0\u5EFA\u4EFB\u52A1","task.new.global":"\u65B0\u5EFA\u4EFB\u52A1","task.openEditor":"\u5728\u7F16\u8F91\u5668\u4E2D\u6253\u5F00\u5F53\u524D Task \u7684\u76EE\u5F55","task.moveMode":"\u8C03\u6574\u4FA7\u8FB9\u680F\u884C\u987A\u5E8F\uFF08\u7136\u540E j/k\u2014\u2014tab / \u4EFB\u52A1 / \u9879\u76EE\uFF09","settings.open":"\u6253\u5F00\u8BBE\u7F6E","settings.open.sidebar":"\u6253\u5F00\u8BBE\u7F6E","inbox.show":"\u6253\u5F00\u63D0\u9192\u6536\u4EF6\u7BB1","worktrees.open.sidebar":"\u6253\u5F00 worktrees","kanban.open":"\u6253\u5F00\u770B\u677F\uFF08issues\uFF09","automations.open":"\u6253\u5F00\u4F8B\u884C\u4EFB\u52A1\uFF08\u5B9A\u65F6\u4EFB\u52A1\uFF09","workItems.open":"\u6253\u5F00 GitHub issues\uFF08\u5916\u90E8\u8DDF\u8E2A\u5668\uFF09","app.quit":"\u9000\u51FA\uFF08\u9700\u786E\u8BA4\uFF09","focus.sidebar":"\u8FD4\u56DE\u4FA7\u8FB9\u680F\uFF08\u4EFB\u52A1\u5217\u8868\uFF09","focus.previous":"\u805A\u7126\u4E0A\u4E00\u4E2A\u9762\u677F\uFF08\u6587\u4EF6 \u2192 \u5DE5\u4F5C\u533A \u2192 \u4FA7\u8FB9\u680F\uFF09","focus.next":"\u805A\u7126\u4E0B\u4E00\u4E2A\u9762\u677F\uFF08\u4FA7\u8FB9\u680F \u2192 \u5DE5\u4F5C\u533A \u2192 \u6587\u4EF6\uFF09","workspace.zenToggle":"\u5207\u6362\u7985\u6A21\u5F0F","attention.next":"\u8DF3\u5230\u4E0B\u4E00\u4E2A\u9700\u8981\u6CE8\u610F\u7684\u9879\u76EE","chat.interrupt":"\u4E2D\u65AD\u5F53\u524D\u8F6E\u6B21\uFF08\u6D41\u5F0F\u8F93\u51FA\u4E2D\u6309 esc\uFF09","sidebar.nav":"\u4E0A\u4E0B\u79FB\u52A8\u5149\u6807","sidebar.select":"\u6253\u5F00\u9009\u4E2D\u7684\u4EFB\u52A1","sidebar.tree.open":"\u6253\u5F00\u5149\u6807\u6240\u5728\u884C","sidebar.goto":"\u8DF3\u5230\u5217\u8868\u9876\u90E8 / \u5E95\u90E8\uFF08gg \u6216 shift-G\uFF09","sidebar.rename":"\u91CD\u547D\u540D\u4EFB\u52A1","sidebar.localMerge":"\u8C03\u6574\u5F53\u524D\u884C\u987A\u5E8F\uFF08Shift+M\uFF0C\u7136\u540E j/k\u2014\u2014tab / \u4EFB\u52A1 / \u9879\u76EE\uFF09","sidebar.pin":"\u7F6E\u9876 / \u53D6\u6D88\u7F6E\u9876\u4EFB\u52A1\uFF08Shift+P\uFF09","sidebar.sort":"\u5207\u6362\u4EFB\u52A1\u6392\u5E8F\u65B9\u5F0F\uFF08\u9ED8\u8BA4 \u2194 \u6700\u8FD1\uFF09","sidebar.delete":"\u5220\u9664\u4EFB\u52A1\uFF08\u9700\u786E\u8BA4\uFF09","sidebar.search.enter":"\u641C\u7D22\u4EFB\u52A1\uFF08\u6A21\u7CCA\u8FC7\u6EE4\uFF09","sidebar.search.nav":"\u5728\u641C\u7D22\u7ED3\u679C\u4E2D\u79FB\u52A8\u9AD8\u4EAE","sidebar.search.submit":"\u9009\u4E2D\u641C\u7D22\u5339\u914D\u9879\u5E76\u9000\u51FA\u641C\u7D22","sidebar.search.cancel":"\u53D6\u6D88\u641C\u7D22\uFF08\u6062\u590D\u4E4B\u524D\u7684\u9009\u4E2D\u9879\uFF09","tasks.openWorktree":"\u5728\u7F16\u8F91\u5668\u4E2D\u6253\u5F00\u9009\u4E2D Task \u7684\u76EE\u5F55","tasks.renameBranch":"\u91CD\u547D\u540D\u9009\u4E2D\u4EFB\u52A1\u7684 git \u5206\u652F","tasks.cycleEngine":"\u5FAA\u73AF\u5207\u6362\u5F15\u64CE\u5382\u5546\u2014\u2014\u91CD\u65B0\u6253\u5F00\u540E\u751F\u6548","tasks.update":"\u6253\u5F00\u66F4\u65B0\u9875\u9762\uFF08\u6709\u65B0\u7248\u672C\u65F6\uFF09","tasks.focusEngine":"\u805A\u7126\u5F53\u524D\u7A97\u53E3\u7684\u5F15\u64CE\u9762\u677F","tasks.jump":"\u8DF3\u5230\u663E\u793A\u5BF9\u5E94\u6570\u5B57\u7684\u4EFB\u52A1","chat.send":"\u53D1\u9001\u6D88\u606F\uFF08\u8F93\u5165\u6846\uFF09","chat.newline":"\u5728\u8F93\u5165\u6846\u4E2D\u6362\u884C","chat.cycle-mode":"\u5FAA\u73AF\u5207\u6362\u6743\u9650\u6A21\u5F0F\uFF08\u8F93\u5165\u6846\uFF09","chat.steer":"\u5F15\u5BFC\uFF08\u4E2D\u65AD\u5E76\u53D1\u9001\uFF09\u2014\u2014\u4EC5\u9650\u6D41\u5F0F\u8F93\u51FA\u4E2D","chat.tab.new":"\u65B0\u5EFA\u804A\u5929\u6807\u7B7E\u9875","chat.tab.chooseEngine":"\u65B0\u5EFA\u5BF9\u8BDD \u2014\u2014 \u9009\u62E9\u5F15\u64CE\u6216 shell\uFF0C\u53EF\u5207\u6362\u843D\u70B9\u4E0E\u4E0A\u4E0B\u6587","chat.tab.fork":"\u6D3E\u751F\u5F53\u524D\u5BF9\u8BDD\u5230\u65B0\u6807\u7B7E\u9875\uFF08\u540C\u4E00 Task \u76EE\u5F55\uFF0C\u5E26\u4E0A\u5DF2\u6709\u5BF9\u8BDD\uFF09","chat.fork.new":"\u5FEB\u901F\u6D3E\u751F\uFF1A\u4EE5\u5F53\u524D\u4ED3\u5E93/\u5206\u652F/\u6A21\u578B\u521B\u5EFA\u5B50\u4EFB\u52A1","chat.tab.close":"\u5173\u95ED\u804A\u5929\u6807\u7B7E\u9875","chat.tab.rename":"\u91CD\u547D\u540D\u5F53\u524D\u804A\u5929\u6807\u7B7E\u9875","chat.tab.cycle-next":"\u4E0B\u4E00\u4E2A\u804A\u5929\u6807\u7B7E\u9875","chat.tab.cycle-prev":"\u4E0A\u4E00\u4E2A\u804A\u5929\u6807\u7B7E\u9875","workspace.split.right":"\u5411\u53F3\u5206\u5C4F","workspace.split.down":"\u5411\u4E0B\u5206\u5C4F","workspace.split.focus-next":"\u805A\u7126\u4E0B\u4E00\u4E2A\u5206\u5C4F","workspace.split.close":"\u5173\u95ED\u5F53\u524D\u5206\u5C4F\uFF08\u672A\u5206\u5C4F\u65F6\u5173\u95ED\u6807\u7B7E\u9875\uFF09","workspace.split.rename":"\u91CD\u547D\u540D\u5F53\u524D\u5206\u5C4F\uFF08\u672A\u5206\u5C4F\u65F6\u91CD\u547D\u540D\u6807\u7B7E\u9875\uFF09","files.nav":"\u4E0A\u4E0B\u79FB\u52A8\u5149\u6807","files.hierarchy":"\u6298\u53E0 / \u5C55\u5F00\u6811\u5C42\u7EA7","files.open":"\u5728\u5DF2\u914D\u7F6E\u7684\u7F16\u8F91\u5668\u4E2D\u6253\u5F00\u6587\u4EF6\uFF08\u652F\u6301\u65F6\u663E\u793A diff\uFF09","files.tab":"\u5207\u6362\u6807\u7B7E\u9875\uFF08\u5FAA\u73AF \u5168\u90E8 / \u53D8\u66F4\uFF09","files.refresh":"\u5237\u65B0","files.scope":"\u5207\u6362\u53D8\u66F4\u8303\u56F4\uFF08\u5DE5\u4F5C\u533A \u2194 \u5206\u652F\u5BF9\u6BD4 base\uFF09","files.diff":"\u5728\u5DE5\u4F5C\u533A\u6807\u7B7E\u9875\u4E2D\u6253\u5F00\u53EA\u8BFB diff","files.openExternal":"\u5728\u7CFB\u7EDF\u9ED8\u8BA4\u5E94\u7528\u4E2D\u6253\u5F00\u6587\u4EF6\uFF08\u97F3\u9891 / \u89C6\u9891 / pdf \u9884\u89C8\uFF09","files.mention":"\u5C06 @<path> \u63D0\u53CA\u6CE8\u5165\u5F15\u64CE\u9762\u677F","files.createPR":"\u8BA9 agent \u4ECE\u5F53\u524D\u4EFB\u52A1\u521B\u5EFA PR","diff.review.cursor":"\u5728 diff \u4E2D\u79FB\u52A8\u884C\u5149\u6807","diff.review.range":"\u5728\u5149\u6807\u5904\u5207\u6362\u8303\u56F4\u951A\u70B9","diff.review.note":"\u5728\u5149\u6807\u5904\u6DFB\u52A0\u5BA1\u9605\u5907\u6CE8","diff.review.send":"\u5C06\u6240\u6709\u672A\u53D1\u9001\u7684\u5BA1\u9605\u5907\u6CE8\u53D1\u7ED9\u5F15\u64CE","inbox.nav":"\u5728\u63D0\u9192\u9879\u76EE\u4E4B\u95F4\u79FB\u52A8","inbox.open":"\u6253\u5F00\u9009\u4E2D\u7684\u63D0\u9192\u9879\u76EE","inbox.delete":"\u6E05\u9664\u9009\u4E2D\u7684\u63D0\u9192\u9879\u76EE","terminal.scroll-up":"\u5411\u4E0A\u6EDA\u52A8\u56DE\u6EDA","terminal.scroll-down":"\u5411\u4E0B\u6EDA\u52A8\u56DE\u6EDA","terminal.reset":"\u91CD\u7F6E\u7EC8\u7AEF\u2014\u2014\u5173\u95ED\u5F53\u524D shell \u5E76\u91CD\u65B0\u542F\u52A8","dialog.cancel":"\u5173\u95ED\u9876\u5C42\u5BF9\u8BDD\u6846\uFF08esc\uFF09","dialog.newtask.tab.cycle":"\u5207\u6362\u65B0\u5EFA\u4EFB\u52A1\u6807\u7B7E\u9875\uFF08\u73B0\u6709\u4ED3\u5E93 / \u65B0\u4ED3\u5E93\uFF09"}}});var en9,zh9;var init_newTask=__esm(()=>{en9={title:"New task",legend:"enter create \xB7 tab fields \xB7 ctrl+[ ] mode \xB7 ctrl+e engine \xB7 esc cancel",tabs:{existing:"For Existing",clone:"For New Repo",adopt:"Adopt Worktree"},field:{mode:"MODE",engine:"ENGINE",repo:"REPO",fromBranch:"FROM BRANCH",gitUrl:"GIT URL",parentDir:"PARENT DIR",folderName:"FOLDER NAME",baseBranch:"BASE BRANCH",adoptFilter:"FILTER (PATH GLOB)",opens:"OPENS"},intent:{task:"a new task worktree",project:"the project itself"},placeholder:{folderName:"auto from url",adoptFilter:"* \u2014 type e.g. feature-* to narrow"},hint:{modeCycle:"ctrl+[ ]",engineCycle:"ctrl+e",remembered:"(remembered \u2014 next clone defaults to this dir)",currentDir:"(current dir)",noBranchesFound:"(no local branches found \u2014 typed text will be used as ref)",noMatchBranch:"(no match \u2014 typed text will be used as ref)",scanningWorktrees:"scanning worktrees\u2026"},picker:{moreAbove:"\u2191 {count} more",moreBelow:"\u2193 {count} more"},open:{failed:"Couldn't open the project: {error}"},adopt:{repoLine:"repo: {path}",repoNone:"(none)",noUnlinked:"no unlinked worktrees \u2014 every git worktree here is already a task",noMatch:"no worktrees match the filter",hintSelected:"{count} selected \xB7 enter toggles \xB7 ctrl+a all \xB7 Create imports",hintDefault:"enter toggles \xB7 ctrl+a all \xB7 Create imports the highlighted row",summaryAll:"Adopted {count} worktree(s)",summaryPartial:"Adopted {done}/{total} worktrees \u2014 the rest failed (see log)",summaryNone:"Couldn't adopt any worktree: {error}"},clone:{progressFallback:"Cloning\u2026",progressInto:"Cloning into {target}\u2026"},button:{create:"Create",cloning:"Cloning\u2026"},error:{gitUrlRequired:"git URL is required",gitUrlInvalid:"does not look like a git URL: {url}",folderRequired:"folder name is required",folderHasSeparator:"folder name cannot contain path separators",parentRequired:"parent directory is required",parentNotFound:"parent directory does not exist: {path}",parentNotDir:"not a directory: {path}",targetExists:"target already exists: {path}",cloneFailed:"git clone failed: {error}",noAdoptable:"no adoptable worktrees to import",repoAmbiguous:"more than one saved repo is named {name} \u2014 pick the one you mean from the list"}},zh9={title:"\u65B0\u5EFA\u4EFB\u52A1",legend:"enter \u521B\u5EFA \xB7 tab \u5207\u5B57\u6BB5 \xB7 ctrl+[ ] \u5207\u6A21\u5F0F \xB7 ctrl+e \u5F15\u64CE \xB7 esc \u53D6\u6D88",tabs:{existing:"\u5DF2\u6709\u4ED3\u5E93",clone:"\u514B\u9686\u65B0\u4ED3\u5E93",adopt:"\u63A5\u7BA1 Worktree"},field:{mode:"\u6A21\u5F0F",engine:"\u5F15\u64CE",repo:"\u4ED3\u5E93",fromBranch:"\u57FA\u51C6\u5206\u652F",gitUrl:"git \u5730\u5740",parentDir:"\u7236\u76EE\u5F55",folderName:"\u6587\u4EF6\u5939\u540D",baseBranch:"\u57FA\u51C6\u5206\u652F",adoptFilter:"\u8FC7\u6EE4\uFF08\u8DEF\u5F84 glob\uFF09",opens:"\u6253\u5F00"},intent:{task:"\u65B0\u5EFA\u4EFB\u52A1 worktree",project:"\u9879\u76EE\u672C\u8EAB"},placeholder:{folderName:"\u81EA\u52A8\u4ECE\u5730\u5740\u63A8\u5BFC",adoptFilter:"* \u2014 \u8F93\u5165\u5982 feature-* \u6765\u7F29\u5C0F\u8303\u56F4"},hint:{modeCycle:"ctrl+[ ]",engineCycle:"ctrl+e",remembered:"\uFF08\u5DF2\u8BB0\u4F4F \u2014 \u4E0B\u6B21\u514B\u9686\u9ED8\u8BA4\u4F7F\u7528\u6B64\u76EE\u5F55\uFF09",currentDir:"\uFF08\u5F53\u524D\u76EE\u5F55\uFF09",noBranchesFound:"\uFF08\u672A\u627E\u5230\u672C\u5730\u5206\u652F \u2014 \u5C06\u76F4\u63A5\u4F7F\u7528\u8F93\u5165\u6587\u672C\u4F5C\u4E3A ref\uFF09",noMatchBranch:"\uFF08\u65E0\u5339\u914D \u2014 \u5C06\u76F4\u63A5\u4F7F\u7528\u8F93\u5165\u6587\u672C\u4F5C\u4E3A ref\uFF09",scanningWorktrees:"\u6B63\u5728\u626B\u63CF worktree\u2026"},picker:{moreAbove:"\u2191 \u8FD8\u6709 {count} \u9879",moreBelow:"\u2193 \u8FD8\u6709 {count} \u9879"},open:{failed:"\u65E0\u6CD5\u6253\u5F00\u9879\u76EE\uFF1A{error}"},adopt:{repoLine:"\u4ED3\u5E93\uFF1A{path}",repoNone:"\uFF08\u65E0\uFF09",noUnlinked:"\u6CA1\u6709\u672A\u5173\u8054\u7684 worktree \u2014 \u6B64\u4ED3\u5E93\u6240\u6709 git worktree \u5747\u5DF2\u662F\u4EFB\u52A1",noMatch:"\u6CA1\u6709 worktree \u5339\u914D\u6B64\u8FC7\u6EE4\u6761\u4EF6",hintSelected:"\u5DF2\u9009 {count} \u9879 \xB7 enter \u5207\u6362\u9009\u4E2D \xB7 ctrl+a \u5168\u9009 \xB7 \u521B\u5EFA \u5BFC\u5165",hintDefault:"enter \u5207\u6362\u9009\u4E2D \xB7 ctrl+a \u5168\u9009 \xB7 \u521B\u5EFA \u5C06\u5BFC\u5165\u9AD8\u4EAE\u884C",summaryAll:"\u5DF2\u63A5\u7BA1 {count} \u4E2A worktree",summaryPartial:"\u5DF2\u63A5\u7BA1 {done}/{total} \u4E2A worktree \u2014 \u5176\u4F59\u5931\u8D25\uFF08\u8BE6\u89C1\u65E5\u5FD7\uFF09",summaryNone:"\u6CA1\u6709 worktree \u63A5\u7BA1\u6210\u529F\uFF1A{error}"},clone:{progressFallback:"\u514B\u9686\u4E2D\u2026",progressInto:"\u6B63\u5728\u514B\u9686\u5230 {target}\u2026"},button:{create:"\u521B\u5EFA",cloning:"\u514B\u9686\u4E2D\u2026"},error:{gitUrlRequired:"git \u5730\u5740\u4E0D\u80FD\u4E3A\u7A7A",gitUrlInvalid:"\u4E0D\u50CF\u662F\u6709\u6548\u7684 git \u5730\u5740\uFF1A{url}",folderRequired:"\u6587\u4EF6\u5939\u540D\u4E0D\u80FD\u4E3A\u7A7A",folderHasSeparator:"\u6587\u4EF6\u5939\u540D\u4E0D\u80FD\u5305\u542B\u8DEF\u5F84\u5206\u9694\u7B26",parentRequired:"\u7236\u76EE\u5F55\u4E0D\u80FD\u4E3A\u7A7A",parentNotFound:"\u7236\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A{path}",parentNotDir:"\u4E0D\u662F\u76EE\u5F55\uFF1A{path}",targetExists:"\u76EE\u6807\u8DEF\u5F84\u5DF2\u5B58\u5728\uFF1A{path}",cloneFailed:"git clone \u5931\u8D25\uFF1A{error}",noAdoptable:"\u6CA1\u6709\u53EF\u63A5\u7BA1\u7684 worktree",repoAmbiguous:"\u6709\u591A\u4E2A\u5DF2\u4FDD\u5B58\u4ED3\u5E93\u90FD\u53EB {name} \u2014 \u8BF7\u4ECE\u5217\u8868\u4E2D\u9009\u62E9\u4F60\u8981\u7684\u90A3\u4E2A"}}});var en10,zh10;var init_onboarding=__esm(()=>{en10={title:"Welcome to Rove",subtitle:"Two quick questions and a quick environment check before your first launch.",completionsQuestion:"Install shell completions for {shell}?",completionsExplain:"Tab-completes rove subcommands. One line is added to your shell config.",skillQuestion:"Install the Rove agent skill?",skillExplain:"Teaches coding agents to drive Rove from the shell via `rove api`.",optionYes:"Yes (recommended)",optionNo:"No",legend:"\u2191\u2193 select \xB7 enter confirm \xB7 q skip setup",keysTitle:"Keyboard basics",keysBare:"Bare keys act in the focused pane \u2014 {nav} moves, {open} opens.",keysOnePress:"A few one-press chords are Rove's own \u2014 {newTab} new tab, {focusNext} next pane.",keysPrefix:"{prefix} opens the command map \u2014 hold it a beat and a guide appears.",keysHelp:"{help} shows the full live reference anytime.",keysLegend:"enter finish",envTitle:"Environment check",envExplain:"Read-only \u2014 what Rove found on this machine:",envReady:"\u2713 You're set \u2014 at least one engine is ready.",envNotReady:"\u2717 No usable engine yet \u2014 Rove needs one to run tasks.",envLegend:"enter continue \xB7 q skip setup",notReadyHeader:"Not ready yet:",appliedCompletions:"\u2713 completions hooked into {path} (takes effect in new shells)",skippedCompletions:"\xB7 completions skipped \u2014 run `{command}` anytime",installingSkill:"installing the Rove agent skill ({command})\u2026",skillFailed:"! skill install failed \u2014 retry with `{command}`",skillNeedsNode:"! agent skill needs `npx` (part of Node.js) \u2014 install Node from https://nodejs.org, then run `{command}`",skippedSkill:"\xB7 agent skill skipped \u2014 run `{command}` anytime",ready:"You're ready to go!",readyHint:"Run `{command}` to launch the TUI."},zh10={title:"\u6B22\u8FCE\u4F7F\u7528 Rove",subtitle:"\u9996\u6B21\u542F\u52A8\u524D\uFF0C\u5148\u56DE\u7B54\u4E24\u4E2A\u5C0F\u95EE\u9898\uFF0C\u518D\u505A\u4E00\u6B21\u73AF\u5883\u68C0\u67E5\u3002",completionsQuestion:"\u4E3A {shell} \u5B89\u88C5 shell \u8865\u5168\u5417\uFF1F",completionsExplain:"\u8BA9 rove \u5B50\u547D\u4EE4\u652F\u6301 Tab \u8865\u5168\uFF0C\u4F1A\u5728\u4F60\u7684 shell \u914D\u7F6E\u91CC\u52A0\u4E00\u884C\u3002",skillQuestion:"\u5B89\u88C5 Rove agent skill \u5417\uFF1F",skillExplain:"\u6559\u4F1A\u7F16\u7801 agent \u901A\u8FC7 `rove api` \u5728\u547D\u4EE4\u884C\u9A71\u52A8 Rove\u3002",optionYes:"\u5B89\u88C5\uFF08\u63A8\u8350\uFF09",optionNo:"\u8DF3\u8FC7",legend:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u786E\u8BA4 \xB7 q \u8DF3\u8FC7\u8BBE\u7F6E",keysTitle:"\u952E\u76D8\u57FA\u7840",keysBare:"\u88F8\u952E\u4F5C\u7528\u4E8E\u5F53\u524D\u805A\u7126\u9762\u677F \u2014 {nav} \u79FB\u52A8\uFF0C{open} \u6253\u5F00\u3002",keysOnePress:"\u5C11\u91CF\u5355\u6B21\u5FEB\u6377\u952E\u5C5E\u4E8E Rove \u81EA\u5DF1 \u2014 {newTab} \u65B0\u6807\u7B7E\u9875\uFF0C{focusNext} \u5207\u6362\u9762\u677F\u3002",keysPrefix:"{prefix} \u6253\u5F00\u547D\u4EE4\u5C42 \u2014 \u6309\u4F4F\u7A0D\u7B49\u4F1A\u51FA\u73B0\u547D\u4EE4\u6307\u5357\u3002",keysHelp:"\u968F\u65F6\u6309 {help} \u67E5\u770B\u5B8C\u6574\u7684\u5B9E\u65F6\u952E\u4F4D\u8868\u3002",keysLegend:"enter \u5B8C\u6210",envTitle:"\u73AF\u5883\u68C0\u67E5",envExplain:"\u53EA\u8BFB\u68C0\u67E5 \u2014 Rove \u5728\u8FD9\u53F0\u673A\u5668\u4E0A\u53D1\u73B0\u4E86\u4EC0\u4E48\uFF1A",envReady:"\u2713 \u4E00\u5207\u5C31\u7EEA \u2014 \u81F3\u5C11\u4E00\u4E2A\u5F15\u64CE\u53EF\u7528\u3002",envNotReady:"\u2717 \u8FD8\u6CA1\u6709\u53EF\u7528\u5F15\u64CE \u2014 Rove \u9700\u8981\u4E00\u4E2A\u5F15\u64CE\u624D\u80FD\u8FD0\u884C\u4EFB\u52A1\u3002",envLegend:"enter \u7EE7\u7EED \xB7 q \u8DF3\u8FC7\u8BBE\u7F6E",notReadyHeader:"\u8FD8\u6CA1\u51C6\u5907\u597D\uFF1A",appliedCompletions:"\u2713 \u8865\u5168\u5DF2\u5199\u5165 {path}\uFF08\u65B0\u5F00\u7684 shell \u751F\u6548\uFF09",skippedCompletions:"\xB7 \u5DF2\u8DF3\u8FC7\u8865\u5168 \u2014 \u4E4B\u540E\u53EF\u968F\u65F6\u8FD0\u884C `{command}`",installingSkill:"\u6B63\u5728\u5B89\u88C5 Rove agent skill\uFF08{command}\uFF09\u2026",skillFailed:"! skill \u5B89\u88C5\u5931\u8D25 \u2014 \u53EF\u7528 `{command}` \u91CD\u8BD5",skillNeedsNode:"! agent skill \u9700\u8981 `npx`\uFF08Node.js \u7684\u4E00\u90E8\u5206\uFF09\u2014 \u8BF7\u4ECE https://nodejs.org \u5B89\u88C5 Node\uFF0C\u7136\u540E\u8FD0\u884C `{command}`",skippedSkill:"\xB7 \u5DF2\u8DF3\u8FC7 agent skill \u2014 \u4E4B\u540E\u53EF\u968F\u65F6\u8FD0\u884C `{command}`",ready:"\u4E00\u5207\u5C31\u7EEA\uFF01",readyHint:"\u8FD0\u884C `{command}` \u542F\u52A8 TUI\u3002"}});var en11,zh11;var init_ops=__esm(()=>{en11={preview:{diffVsHead:"diff vs HEAD",diffVsBase:"diff vs {base}",file:"file",image:"image",binary:"binary file",closeHint:"\xB7 q to close",loading:"loading\u2026",noTextPreview:"no text preview",openHint:"o open in system viewer",review:{noteDialogTitle:"Review note \u2014 {location}",noteFieldLabel:"note",noteSubmitLabel:"add note",notePlaceholder:"what should the agent change here?",count:"{total} notes \xB7 {unsent} unsent",keysHint:"j/k line \xB7 v range \xB7 c note \xB7 s send"}}},zh11={preview:{diffVsHead:"\u4E0E HEAD \u5BF9\u6BD4",diffVsBase:"\u4E0E {base} \u5BF9\u6BD4",file:"\u6587\u4EF6",image:"\u56FE\u7247",binary:"\u4E8C\u8FDB\u5236\u6587\u4EF6",closeHint:"\xB7 q \u5173\u95ED",loading:"\u52A0\u8F7D\u4E2D\u2026",noTextPreview:"\u65E0\u6587\u672C\u9884\u89C8",openHint:"o \u7528\u7CFB\u7EDF\u67E5\u770B\u5668\u6253\u5F00",review:{noteDialogTitle:"\u8BC4\u5BA1\u5907\u6CE8 \u2014 {location}",noteFieldLabel:"\u5907\u6CE8",noteSubmitLabel:"\u6DFB\u52A0\u5907\u6CE8",notePlaceholder:"\u5E0C\u671B agent \u5728\u8FD9\u91CC\u6539\u4EC0\u4E48\uFF1F",count:"{total} \u6761\u5907\u6CE8 \xB7 {unsent} \u6761\u672A\u53D1\u9001",keysHint:"j/k \u884C \xB7 v \u8303\u56F4 \xB7 c \u5907\u6CE8 \xB7 s \u53D1\u9001"}}}});var en12,zh12;var init_quickTask=__esm(()=>{en12={title:"Quick task \xB7 {repoLabel}",promptLabel:"PROMPT",promptPlaceholder:"what should this task do?",engineLabel:"ENGINE",branchLabel:"BRANCH",legend:"enter create \xB7 tab fields \xB7 ctrl+e engine \xB7 ctrl+v attach \xB7 esc cancel"},zh12={title:"\u5FEB\u901F\u4EFB\u52A1 \xB7 {repoLabel}",promptLabel:"\u63D0\u793A\u8BCD",promptPlaceholder:"\u8FD9\u4E2A\u4EFB\u52A1\u8981\u505A\u4EC0\u4E48\uFF1F",engineLabel:"\u5F15\u64CE",branchLabel:"\u5206\u652F",legend:"enter \u521B\u5EFA \xB7 tab \u5207\u6362\u5B57\u6BB5 \xB7 ctrl+e \u5F15\u64CE \xB7 ctrl+v \u9644\u4EF6 \xB7 esc \u53D6\u6D88"}});var en13,zh13;var init_settings=__esm(()=>{en13={title:"Settings",esc:"esc",nav:{default:"j/k pick \xB7 h/l switch level \xB7 enter activate \xB7 esc close",feedback:"tab next field \xB7 enter sends on Send \xB7 esc close"},sections:{general:"General",engines:"Engines",plugins:"Plugins",keys:"Keybindings",feedback:"Feedback",dev:"Dev"},general:{usage:"USAGE",theme:"Theme",themeHint:"l to enter list \xB7 j/k to highlight \xB7 enter to apply",language:"Language",languageHint:"Display language for Rove's UI. l to enter list \xB7 j/k to highlight \xB7 enter to apply.",transparent:"Transparent background",transparentHint:"Drops the renderer's bg fill so the host terminal shows through. `t` toggles.",on:"[x] on",off:"[ ] off",focusAccent:"Focus accent",focusAccentHint:"Color of focused pane title, \u258C marker, and split borders.",accentPrimary:"Primary (brand accent)",accentSuccess:"Success (legacy green)",accentInfo:"Info (cool blue)",appearance:"Appearance",appearanceHint:"How split panes draw.",splitBox:"Box frames",splitLine:"Divider line",notifications:"Notifications",notificationsHint:"When a background tab finishes or pauses on an approval.",toast:"Toast",toastHint:"bottom-right popup",sound:"Sound",soundHint:"bell + chime + an OSC 9 desktop notification (rides SSH)",crossTask:"Cross-task",crossTaskHint:"also for a task you switched away from",keyHints:"Keyboard hints",keyHintsHint:"The status-bar reminder and the first-use hints in the sidebar and files panes.",keyHintsShow:"Show keyboard hints",keyHintsShowHint:"re-enabling relights hints dismissed by use",zen:"Zen mode",zenHint:"The `zen` chip and `prefix`+z hide Files, keeping the Tasks rail and workspace.",zenDefaultOn:"Start in zen mode",zenKeepTasks:"Keep Tasks pane",zenKeepTasksHint:"legacy \u2014 no layout effect today",editor:"Editor",editorHint:"What enter opens a file with in the file tree \u2014 diff mode when the editor supports it, the read-only preview when it isn't installed.",editorRow:"editor: < {kind} >",editorRowHint:"auto follows $VISUAL / $EDITOR, else nvim / vim / emacs / nano",editorCustom:"custom: {cmd}",editorCustomUnset:"(unset \u2014 enter to edit)",worktree:"Worktree location",worktreeHint:"Where new task worktrees are created. New tasks only.",worktreeBase:"location: < {kind} >",worktreeBaseHint:"custom takes `~`, a relative path, or a leading `$project_dir`",worktreeKindDefault:"default ~/.rove/worktrees",worktreeKindNext:"next to project",worktreeKindCustom:"custom",worktreeCustom:"custom: {path}",worktreeCustomUnset:"(unset \u2014 enter to edit)",worktreeBaseTitle:"Custom worktree location (blank = default; $project_dir = project root)",worktreeBaseField:"PATH",terminal:"Terminal",terminalHint:"Applies to terminals opened after the change.",scrollbackRow:"scrollback: {rows} rows",scrollbackRowHint:"100\u2013100000 \xB7 larger costs proportionally more CPU per redraw",scrollbackTitle:"Terminal scrollback rows (100\u2013100000)",scrollbackField:"ROWS",scrollbackInvalidTitle:"Not a number",scrollbackInvalidBody:"Scrollback must be a number of rows (e.g. 1000). Keeping the previous setting.",tabStripRow:"tab strip: {mode}",tabStripMode:{never:"off \u2014 the sidebar tree lists tabs",multipleOnly:"only with 2+ tabs",always:"always"}},engines:{title:"Engines",hint:"Every engine Rove can launch, with what detection found under each one: where its binary is, and for the engines with an account detector whether you are logged in. [x] = offered when picking an engine for a task; (\u25CF) = the global default (per-project picks, e.g. Ctrl+Shift+T, override it) \u2014 click either, or use the keys below. Override a launch command when the binary isn't on PATH or to pass default flags. space on/off \xB7 enter edit command \xB7 r rename \xB7 x reset/remove \xB7 d set default.",customTag:" (custom)",addEngine:"+ Add engine"},accounts:{checking:"Checking\u2026",notLoggedIn:"\u25CB Not logged in",loggedIn:"\u25CF Logged in: {email}",apiKeyConfigured:"\u25CF API key configured",chatgptLogin:"\u25CF ChatGPT login: {email}",tokenConfigured:"\u25CF Token configured ({source})",detected:"\u25CF Login detected"},plugins:{title:"Plugins",hint:"Plugins registered in ~/.kobe/plugins.json. enter (or click) toggles one on or off \u2014 the daemon watches the file, so the change applies live. Rows indented under a plugin are the settings it declares; enter edits one, and the value reaches the plugin on its next run. Install and remove them from the shell: `rove plugin install <owner/repo>`, `rove plugin link <dir>`.",empty:"No plugins registered. Install one with `rove plugin install <owner/repo>` \u2014 browse the `rove-plugin` topic on GitHub.",sourceLink:"linked {path}",sourceGithub:"{spec}",updateAvailable:"update available \u2014 rove plugin update",declares:"{actions} actions \xB7 {events} events \xB7 {panes} panes",declaresWithEngines:"{actions} actions \xB7 {events} events \xB7 {panes} panes \xB7 {engines} engines",manifestUnreadable:"manifest unreadable",unsupportedPlatform:"\xB7 not supported on this platform",noHooks:"\xB7 no hooks declared",lastRun:"\xB7 last run {label} {status} {ago} ago",neverRun:"\xB7 never run",runOk:"ok",runFailed:"failed to start",runExit:"exit {code}",settingUnset:"(unset \u2014 enter to edit)",settingInvalidTitle:"Not a number",settingInvalidBody:"{label} only accepts a number. Keeping the previous value."},keybindings:{title:"Keybindings",hint:"Rebind direct and prefix chords in your own YAML file; changes reload live. Press F1 anywhere for the live keymap with every binding id.",configFile:"Config file",notCreated:" (not created yet)",prefixTitle:"Command layer ({prefix})",prefixHint:"Bare keys act in the focused pane; a small one-press set covers frequent Rove actions; {prefix} opens the command layer ({timeout}ms second-stroke window). Prefix bindings keep their pane scope and modal rules.",tapPresentation:"Prefix tap",tapPresentationHint:"Choose whether the complete guide also marks controls already on screen.",tapPresentationLocal:"On-screen entries + complete guide (default)",tapPresentationGuide:"Complete guide only",prefixDisabled:"disabled",fixed:"Fixed (not rebindable): {ids}.",createHint:"No overrides file yet. Rove can write one for you, fully commented \u2014 nothing is rebound until you uncomment a line.",createFile:"[enter] Create keybindings.yaml",overridesApplied:"Overrides applied",none:"none",unbound:"(unbound)",defaultKeys:"default: {keys}",warnings:"Warnings"},feedback:{title:"Feedback",hint:"Sends a GitHub Discussion to the Rove repo through `gh`. Requires `gh auth login`; category defaults to Feedback.",titleLabel:"title",titlePlaceholder:"Short summary",descriptionLabel:"description",descriptionPlaceholder:"What happened? (enter for a new line \xB7 tab to Send)",send:"[enter] Send to GitHub Discussions"},dev:{reset:"Reset UI state",resetHint:"Clears ~/.config/rove/state.json and ~/.rove/tasks.json, then quits Rove \u2014 relaunch to start fresh. Working session list, pane sizes, theme, model picks all reset. Worktrees on disk and engine session history are not touched.",resetButton:"[enter] Reset",restart:"Restart backend",restartHint:"Stops the Rove daemon and quits this Rove window so the next launch spawns a fresh daemon \u2014 picks up daemon / orchestrator / engine edits without a process kill. Other attached Rove windows will lose their connection too.",restartButton:"[enter] Restart",doctorHint:"Daemon wedged or unresponsive? From a shell, run `rove daemon restart`, then relaunch Rove. Hosted engine sessions stay alive across a daemon restart.",experimental:"Experimental",remoteHint:"Remote projects (SSH): register a project whose git worktrees live on another host, driven from this local Rove. Unfinished \u2014 Hosted PTY engine launch over SSH is not implemented, and file/diff panes still degrade. Enables `rove add --remote`.",remote:"Remote projects",autoStatusHint:"Auto status flow: a backlog task moves to in_progress when its engine starts a turn, and new sessions get a system-prompt note telling the agent to set in_review itself when the work is done. Never touches done/canceled.",autoStatus:"Auto status flow",dispatcherHint:"Field-notes dispatcher: task sessions file one-line gotchas (`rove api note`), the daemon forwards each to the repo's main session, and that session relays them to the in-flight tasks that benefit (`rove api dispatch`). Web-hosted sessions receive the relays today.",dispatcher:"Field-notes dispatcher",composerGateHint:"Before pasting a peer/API prompt into a running engine, Rove reads that session's screen and holds the message if the composer already has text in it. The check knows each engine's CURRENT layout, so a vendor redesign can make it wrong \u2014 turn it off if messages are being held over composers you can see are empty. The separate recent-keystroke guard stays on either way, so a composer you are typing into now is still protected.",composerGate:"Check the composer before delivering"}},zh13={title:"\u8BBE\u7F6E",esc:"esc",nav:{default:"j/k \u9009\u62E9 \xB7 h/l \u5207\u6362\u5C42\u7EA7 \xB7 enter \u786E\u8BA4 \xB7 esc \u5173\u95ED",feedback:"tab \u4E0B\u4E00\u9879 \xB7 enter \u5728\u53D1\u9001\u9879\u53D1\u9001 \xB7 esc \u5173\u95ED"},sections:{general:"\u901A\u7528",engines:"\u5F15\u64CE",plugins:"\u63D2\u4EF6",keys:"\u5FEB\u6377\u952E",feedback:"\u53CD\u9988",dev:"\u5F00\u53D1"},general:{usage:"\u7528\u91CF",theme:"\u4E3B\u9898",themeHint:"l \u8FDB\u5165\u5217\u8868 \xB7 j/k \u9AD8\u4EAE \xB7 enter \u5E94\u7528",language:"\u8BED\u8A00",languageHint:"Rove \u754C\u9762\u7684\u663E\u793A\u8BED\u8A00\u3002l \u8FDB\u5165\u5217\u8868 \xB7 j/k \u9AD8\u4EAE \xB7 enter \u5E94\u7528\u3002",transparent:"\u900F\u660E\u80CC\u666F",transparentHint:"\u53BB\u6389\u6E32\u67D3\u5668\u7684\u80CC\u666F\u586B\u5145\uFF0C\u8BA9\u5BBF\u4E3B\u7EC8\u7AEF\u900F\u51FA\u6765\u3002\u6309 `t` \u5207\u6362\u3002",on:"[x] \u5F00",off:"[ ] \u5173",focusAccent:"\u805A\u7126\u5F3A\u8C03\u8272",focusAccentHint:"\u805A\u7126\u9762\u677F\u6807\u9898\u3001\u258C \u6807\u8BB0\u548C\u5206\u9694\u8FB9\u6846\u7684\u989C\u8272\u3002",accentPrimary:"\u4E3B\u8272\uFF08\u54C1\u724C\u5F3A\u8C03\u8272\uFF09",accentSuccess:"\u6210\u529F\u8272\uFF08\u4F20\u7EDF\u7EFF\uFF09",accentInfo:"\u4FE1\u606F\u8272\uFF08\u51B7\u84DD\uFF09",appearance:"\u5916\u89C2",appearanceHint:"\u5206\u5C4F\u9762\u677F\u600E\u4E48\u753B\u8FB9\u3002",splitBox:"\u65B9\u6846\u8FB9\u6846",splitLine:"\u5355\u7EBF\u5206\u9694",notifications:"\u901A\u77E5",notificationsHint:"\u540E\u53F0\u6807\u7B7E\u5B8C\u6210\u6216\u5728\u5BA1\u6279\u5904\u6682\u505C\u65F6\u89E6\u53D1\u3002",toast:"Toast \u5F39\u7A97",toastHint:"\u53F3\u4E0B\u89D2\u5F39\u7A97",sound:"\u58F0\u97F3",soundHint:"\u54CD\u94C3 + \u63D0\u793A\u97F3 + OSC 9 \u684C\u9762\u901A\u77E5\uFF08\u7ECF SSH \u76F4\u8FBE\u672C\u5730\uFF09",crossTask:"\u8DE8\u4EFB\u52A1",crossTaskHint:"\u4F60\u5DF2\u5207\u8D70\u7684\u4EFB\u52A1\u4E5F\u901A\u77E5",keyHints:"\u952E\u76D8\u63D0\u793A",keyHintsHint:"\u72B6\u6001\u680F\u63D0\u9192\uFF0C\u4EE5\u53CA\u4FA7\u680F\u548C\u6587\u4EF6\u9762\u677F\u7684\u9996\u7528\u63D0\u793A\u3002",keyHintsShow:"\u663E\u793A\u952E\u76D8\u63D0\u793A",keyHintsShowHint:"\u91CD\u65B0\u5F00\u542F\u4F1A\u70B9\u4EAE\u5DF2\u56E0\u4F7F\u7528\u800C\u7184\u706D\u7684\u63D0\u793A",zen:"\u7985\u6A21\u5F0F",zenHint:"`zen` \u6807\u8BB0\u548C `prefix`+z \u9690\u85CF Files\uFF0C\u4FDD\u7559 Tasks \u4FA7\u680F\u4E0E workspace\u3002",zenDefaultOn:"\u542F\u52A8\u5373\u8FDB\u5165\u7985\u6A21\u5F0F",zenKeepTasks:"\u4FDD\u7559 Tasks \u9762\u677F",zenKeepTasksHint:"\u65E7\u8BBE\u7F6E \u2014 \u5F53\u524D\u4E0D\u6539\u53D8\u5E03\u5C40",editor:"\u7F16\u8F91\u5668",editorHint:"\u6587\u4EF6\u6811\u91CC\u6309 enter \u7528\u4EC0\u4E48\u6253\u5F00\u6587\u4EF6\u2014\u2014\u652F\u6301\u65F6\u8D70\u7F16\u8F91\u5668 diff \u6A21\u5F0F\uFF0C\u672A\u5B89\u88C5\u65F6\u56DE\u9000\u5230\u53EA\u8BFB\u9884\u89C8\u3002",editorRow:"\u7F16\u8F91\u5668: < {kind} >",editorRowHint:"auto \u8DDF\u968F $VISUAL / $EDITOR\uFF0C\u5426\u5219 nvim / vim / emacs / nano",editorCustom:"\u81EA\u5B9A\u4E49: {cmd}",editorCustomUnset:"(\u672A\u8BBE\u7F6E \u2014 enter \u7F16\u8F91)",worktree:"\u5DE5\u4F5C\u6811\u4F4D\u7F6E",worktreeHint:"\u65B0\u4EFB\u52A1\u5DE5\u4F5C\u6811\u7684\u521B\u5EFA\u4F4D\u7F6E\u3002\u4EC5\u5BF9\u65B0\u4EFB\u52A1\u751F\u6548\u3002",worktreeBase:"\u4F4D\u7F6E: < {kind} >",worktreeBaseHint:"\u81EA\u5B9A\u4E49\u53EF\u586B `~`\u3001\u76F8\u5BF9\u8DEF\u5F84\u6216\u4EE5 `$project_dir` \u5F00\u5934",worktreeKindDefault:"\u9ED8\u8BA4 ~/.rove/worktrees",worktreeKindNext:"\u9879\u76EE\u65C1\u8FB9",worktreeKindCustom:"\u81EA\u5B9A\u4E49",worktreeCustom:"\u81EA\u5B9A\u4E49: {path}",worktreeCustomUnset:"(\u672A\u8BBE\u7F6E \u2014 enter \u7F16\u8F91)",worktreeBaseTitle:"\u81EA\u5B9A\u4E49\u5DE5\u4F5C\u6811\u4F4D\u7F6E\uFF08\u7559\u7A7A = \u9ED8\u8BA4\uFF1B$project_dir = \u9879\u76EE\u6839\u76EE\u5F55\uFF09",worktreeBaseField:"\u8DEF\u5F84",terminal:"\u7EC8\u7AEF",terminalHint:"\u5BF9\u4FEE\u6539\u540E\u65B0\u6253\u5F00\u7684\u7EC8\u7AEF\u751F\u6548\u3002",scrollbackRow:"\u56DE\u6EDA\u884C\u6570: {rows} \u884C",scrollbackRowHint:"100\u2013100000 \xB7 \u8C03\u5927\u4F1A\u6309\u6BD4\u4F8B\u589E\u52A0\u6BCF\u6B21\u91CD\u7ED8\u7684 CPU",scrollbackTitle:"\u7EC8\u7AEF\u56DE\u6EDA\u884C\u6570\uFF08100\u2013100000\uFF09",scrollbackField:"\u884C\u6570",scrollbackInvalidTitle:"\u4E0D\u662F\u6570\u5B57",scrollbackInvalidBody:"\u56DE\u6EDA\u884C\u6570\u5FC5\u987B\u662F\u6570\u5B57\uFF08\u5982 1000\uFF09\u3002\u4FDD\u7559\u539F\u8BBE\u7F6E\u3002",tabStripRow:"\u6807\u7B7E\u680F: {mode}",tabStripMode:{never:"\u5173\u95ED \u2014 \u6807\u7B7E\u5728\u5DE6\u4FA7\u6811\u91CC",multipleOnly:"\u4EC5 2 \u4E2A\u4EE5\u4E0A\u6807\u7B7E\u65F6\u663E\u793A",always:"\u59CB\u7EC8\u663E\u793A"}},engines:{title:"\u5F15\u64CE",hint:"Rove \u80FD\u542F\u52A8\u7684\u6240\u6709\u5F15\u64CE\uFF0C\u6BCF\u4E2A\u4E0B\u9762\u8DDF\u7740\u672C\u5730\u63A2\u6D4B\u5230\u7684\u60C5\u51B5\uFF1A\u4E8C\u8FDB\u5236\u5728\u54EA\uFF0C\u4EE5\u53CA\u5BF9\u6709\u8D26\u6237\u63A2\u6D4B\u5668\u7684\u5F15\u64CE\u662F\u5426\u5DF2\u767B\u5F55\u3002[x] = \u4E3A\u4EFB\u52A1\u9009\u5F15\u64CE\u65F6\u4F1A\u5217\u51FA\u5B83\uFF1B(\u25CF) = \u5168\u5C40\u9ED8\u8BA4\u5F15\u64CE\uFF08\u5404\u9879\u76EE\u81EA\u5DF1\u7684\u9009\u62E9\u4F1A\u8986\u76D6\u5B83\uFF0C\u5982 Ctrl+Shift+T\uFF09\u2014\u2014\u4E24\u8005\u90FD\u53EF\u76F4\u63A5\u70B9\uFF0C\u4E5F\u53EF\u7528\u4E0B\u9762\u7684\u6309\u952E\u3002\u4E8C\u8FDB\u5236\u4E0D\u5728 PATH \u4E0A\u3001\u6216\u8981\u4F20\u9ED8\u8BA4\u53C2\u6570\u65F6\uFF0C\u8986\u76D6\u5B83\u7684\u542F\u52A8\u547D\u4EE4\u3002space \u5F00/\u5173 \xB7 enter \u7F16\u8F91\u547D\u4EE4 \xB7 r \u91CD\u547D\u540D \xB7 x \u91CD\u7F6E/\u79FB\u9664 \xB7 d \u8BBE\u4E3A\u9ED8\u8BA4\u3002",customTag:" (\u81EA\u5B9A\u4E49)",addEngine:"+ \u6DFB\u52A0\u5F15\u64CE"},accounts:{checking:"\u68C0\u67E5\u4E2D\u2026",notLoggedIn:"\u25CB \u672A\u767B\u5F55",loggedIn:"\u25CF \u5DF2\u767B\u5F55: {email}",apiKeyConfigured:"\u25CF \u5DF2\u914D\u7F6E API key",chatgptLogin:"\u25CF ChatGPT \u767B\u5F55: {email}",tokenConfigured:"\u25CF \u5DF2\u914D\u7F6E Token ({source})",detected:"\u25CF \u68C0\u6D4B\u5230\u767B\u5F55"},plugins:{title:"\u63D2\u4EF6",hint:"\u5728 ~/.kobe/plugins.json \u91CC\u6CE8\u518C\u7684\u63D2\u4EF6\u3002enter\uFF08\u6216\u70B9\u51FB\uFF09\u5207\u6362\u542F\u7528/\u7981\u7528\u2014\u2014daemon \u76D1\u542C\u8BE5\u6587\u4EF6\uFF0C\u6539\u52A8\u5B9E\u65F6\u751F\u6548\u3002\u63D2\u4EF6\u4E0B\u65B9\u7F29\u8FDB\u7684\u884C\u662F\u5B83\u58F0\u660E\u7684\u8BBE\u7F6E\u9879\uFF0Center \u7F16\u8F91\uFF0C\u65B0\u503C\u5728\u63D2\u4EF6\u4E0B\u6B21\u8FD0\u884C\u65F6\u751F\u6548\u3002\u5B89\u88C5\u4E0E\u79FB\u9664\u5728 shell \u91CC\u505A\uFF1A`rove plugin install <owner/repo>`\u3001`rove plugin link <dir>`\u3002",empty:"\u5C1A\u672A\u6CE8\u518C\u4EFB\u4F55\u63D2\u4EF6\u3002\u7528 `rove plugin install <owner/repo>` \u5B89\u88C5\u4E00\u4E2A\u2014\u2014\u53EF\u5728 GitHub \u7684 `rove-plugin` \u8BDD\u9898\u4E0B\u6D4F\u89C8\u3002",sourceLink:"\u672C\u5730\u94FE\u63A5 {path}",sourceGithub:"{spec}",updateAvailable:"\u6709\u65B0\u7248\u672C \u2014 rove plugin update",declares:"{actions} \u4E2A\u52A8\u4F5C \xB7 {events} \u4E2A\u4E8B\u4EF6 \xB7 {panes} \u4E2A\u9762\u677F",declaresWithEngines:"{actions} \u4E2A\u52A8\u4F5C \xB7 {events} \u4E2A\u4E8B\u4EF6 \xB7 {panes} \u4E2A\u9762\u677F \xB7 {engines} \u4E2A\u5F15\u64CE",manifestUnreadable:"manifest \u65E0\u6CD5\u89E3\u6790",unsupportedPlatform:"\xB7 \u4E0D\u652F\u6301\u5F53\u524D\u5E73\u53F0",noHooks:"\xB7 \u672A\u58F0\u660E\u94A9\u5B50",lastRun:"\xB7 \u4E0A\u6B21\u8FD0\u884C {label} {status} {ago}\u524D",neverRun:"\xB7 \u5C1A\u672A\u8FD0\u884C\u8FC7",runOk:"\u6210\u529F",runFailed:"\u542F\u52A8\u5931\u8D25",runExit:"\u9000\u51FA\u7801 {code}",settingUnset:"(\u672A\u8BBE\u7F6E \u2014 enter \u7F16\u8F91)",settingInvalidTitle:"\u4E0D\u662F\u6570\u5B57",settingInvalidBody:"{label} \u53EA\u63A5\u53D7\u6570\u5B57\uFF0C\u4FDD\u7559\u539F\u503C\u3002"},keybindings:{title:"\u5FEB\u6377\u952E",hint:"\u5728\u4F60\u81EA\u5DF1\u7684 YAML \u6587\u4EF6\u91CC\u91CD\u7ED1\u5B9A\u76F4\u63A5\u6309\u952E\u548C prefix \u7EC4\u5408\uFF1B\u4FEE\u6539\u4F1A\u5B9E\u65F6\u52A0\u8F7D\u3002\u4EFB\u610F\u4F4D\u7F6E\u6309 F1 \u67E5\u770B\u5E26\u6BCF\u4E2A\u7ED1\u5B9A id \u7684\u5B9E\u65F6\u952E\u4F4D\u8868\u3002",configFile:"\u914D\u7F6E\u6587\u4EF6",notCreated:" (\u5C1A\u672A\u521B\u5EFA)",prefixTitle:"\u547D\u4EE4\u5C42\uFF08{prefix}\uFF09",prefixHint:"\u88F8\u952E\u4F5C\u7528\u4E8E\u5F53\u524D\u805A\u7126\u9762\u677F\uFF1B\u5C11\u91CF\u5355\u6B21\u5FEB\u6377\u952E\u8986\u76D6\u9AD8\u9891 Rove \u64CD\u4F5C\uFF1B{prefix} \u6253\u5F00\u547D\u4EE4\u5C42\uFF08\u7B2C\u4E8C\u51FB\u7A97\u53E3 {timeout}ms\uFF09\u3002Prefix \u7ED1\u5B9A\u4FDD\u6301\u539F\u6709\u7684\u9762\u677F\u4F5C\u7528\u57DF\u548C modal \u89C4\u5219\u3002",tapPresentation:"\u70B9\u6309 Prefix",tapPresentationHint:"\u9009\u62E9\u5B8C\u6574\u6307\u5357\u662F\u5426\u540C\u65F6\u6807\u8BB0\u5F53\u524D\u5C4F\u5E55\u4E0A\u7684\u5165\u53E3\u3002",tapPresentationLocal:"\u5C4F\u5E55\u5165\u53E3 + \u5B8C\u6574\u6307\u5357\uFF08\u9ED8\u8BA4\uFF09",tapPresentationGuide:"\u4EC5\u5B8C\u6574\u6307\u5357",prefixDisabled:"\u5DF2\u7981\u7528",fixed:"\u56FA\u5B9A\uFF08\u4E0D\u53EF\u91CD\u7ED1\u5B9A\uFF09\uFF1A{ids}\u3002",createHint:"\u8FD8\u6CA1\u6709\u8986\u76D6\u6587\u4EF6\u3002Rove \u53EF\u4EE5\u5E2E\u4F60\u5199\u4E00\u4EFD\u5E26\u5B8C\u6574\u6CE8\u91CA\u7684\u2014\u2014\u5728\u4F60\u53D6\u6D88\u6CE8\u91CA\u4E4B\u524D\u4E0D\u4F1A\u6539\u52A8\u4EFB\u4F55\u6309\u952E\u3002",createFile:"[enter] \u521B\u5EFA keybindings.yaml",overridesApplied:"\u5DF2\u5E94\u7528\u7684\u8986\u76D6",none:"\u65E0",unbound:"(\u5DF2\u89E3\u7ED1)",defaultKeys:"\u9ED8\u8BA4: {keys}",warnings:"\u8B66\u544A"},feedback:{title:"\u53CD\u9988",hint:"\u901A\u8FC7 `gh` \u5411 Rove \u4ED3\u5E93\u53D1\u4E00\u6761 GitHub Discussion\u3002\u9700\u8981 `gh auth login`\uFF1B\u5206\u7C7B\u9ED8\u8BA4\u4E3A Feedback\u3002",titleLabel:"\u6807\u9898",titlePlaceholder:"\u7B80\u77ED\u6982\u62EC",descriptionLabel:"\u63CF\u8FF0",descriptionPlaceholder:"\u53D1\u751F\u4E86\u4EC0\u4E48\uFF1F(enter \u6362\u884C \xB7 tab \u8DF3\u5230\u53D1\u9001)",send:"[enter] \u53D1\u9001\u5230 GitHub Discussions"},dev:{reset:"\u91CD\u7F6E UI \u72B6\u6001",resetHint:"\u6E05\u7A7A ~/.config/rove/state.json \u548C ~/.rove/tasks.json\uFF0C\u7136\u540E\u9000\u51FA Rove\u2014\u2014\u91CD\u65B0\u542F\u52A8\u5373\u53EF\u4ECE\u5934\u5F00\u59CB\u3002\u5DE5\u4F5C\u4F1A\u8BDD\u5217\u8868\u3001\u9762\u677F\u5C3A\u5BF8\u3001\u4E3B\u9898\u3001\u6A21\u578B\u9009\u62E9\u90FD\u4F1A\u91CD\u7F6E\u3002\u78C1\u76D8\u4E0A\u7684 worktree \u548C\u5F15\u64CE\u4F1A\u8BDD\u5386\u53F2\u4E0D\u53D7\u5F71\u54CD\u3002",resetButton:"[enter] \u91CD\u7F6E",restart:"\u91CD\u542F\u540E\u7AEF",restartHint:"\u505C\u6B62 Rove daemon \u5E76\u9000\u51FA\u5F53\u524D Rove \u7A97\u53E3\uFF0C\u4E0B\u6B21\u542F\u52A8\u4F1A\u62C9\u8D77\u4E00\u4E2A\u5168\u65B0\u7684 daemon\u2014\u2014\u65E0\u9700\u6740\u8FDB\u7A0B\u5373\u53EF\u5E94\u7528 daemon / orchestrator / engine \u7684\u6539\u52A8\u3002\u5176\u4ED6\u5DF2\u8FDE\u63A5\u7684 Rove \u7A97\u53E3\u4E5F\u4F1A\u65AD\u5F00\u8FDE\u63A5\u3002",restartButton:"[enter] \u91CD\u542F",doctorHint:"daemon \u5361\u4F4F\u6216\u65E0\u54CD\u5E94\uFF1F\u5728 shell \u91CC\u8FD0\u884C `rove daemon restart`\uFF0C\u7136\u540E\u91CD\u65B0\u542F\u52A8 Rove\u3002Hosted PTY \u5F15\u64CE\u4F1A\u8BDD\u4E0D\u4F1A\u56E0 daemon \u91CD\u542F\u800C\u9000\u51FA\u3002",experimental:"\u5B9E\u9A8C\u6027",remoteHint:"\u8FDC\u7A0B\u9879\u76EE\uFF08SSH\uFF09\uFF1A\u6CE8\u518C\u4E00\u4E2A git worktree + \u5F15\u64CE\u90FD\u901A\u8FC7 SSH \u8DD1\u5728\u53E6\u4E00\u53F0\u4E3B\u673A\u4E0A\u3001\u7531\u672C\u5730 Rove \u9A71\u52A8\u7684\u9879\u76EE\u3002\u5C1A\u672A\u5B8C\u6210\u2014\u2014\u6587\u4EF6/diff \u9762\u677F\u5BF9\u8FDC\u7A0B\u4ECD\u4F1A\u964D\u7EA7\u3002\u542F\u7528 `rove add --remote`\u3002",remote:"\u8FDC\u7A0B\u9879\u76EE",autoStatusHint:"\u81EA\u52A8\u72B6\u6001\u6D41\u8F6C\uFF1Abacklog \u4EFB\u52A1\u5728\u5176\u5F15\u64CE\u5F00\u59CB\u4E00\u8F6E\u65F6\u79FB\u5230 in_progress\uFF0C\u65B0\u4F1A\u8BDD\u4F1A\u62FF\u5230\u4E00\u6761\u7CFB\u7EDF\u63D0\u793A\uFF0C\u544A\u8BC9 agent \u5B8C\u6210\u540E\u81EA\u884C\u8BBE\u4E3A in_review\u3002\u7EDD\u4E0D\u89E6\u78B0 done/canceled\u3002",autoStatus:"\u81EA\u52A8\u72B6\u6001\u6D41\u8F6C",dispatcherHint:"\u73B0\u573A\u7B14\u8BB0\u8C03\u5EA6\u5668\uFF1A\u4EFB\u52A1\u4F1A\u8BDD\u63D0\u4EA4\u4E00\u884C\u7ECF\u9A8C\uFF08`rove api note`\uFF09\uFF0Cdaemon \u5C06\u6BCF\u6761\u8F6C\u53D1\u7ED9\u4ED3\u5E93\u7684\u4E3B\u4F1A\u8BDD\uFF0C\u4E3B\u4F1A\u8BDD\u518D\u628A\u5B83\u4EEC\u8F6C\u8FBE\u7ED9\u80FD\u53D7\u76CA\u7684\u8FDB\u884C\u4E2D\u4EFB\u52A1\uFF08`rove api dispatch`\uFF09\u3002\u76EE\u524D\u7531 Web \u6258\u7BA1\u7684\u4F1A\u8BDD\u4F1A\u6536\u5230\u8F6C\u8FBE\u3002",dispatcher:"\u73B0\u573A\u7B14\u8BB0\u8C03\u5EA6\u5668",composerGateHint:"\u628A peer/API \u7684\u6D88\u606F\u7C98\u8FDB\u8FD0\u884C\u4E2D\u7684\u5F15\u64CE\u4E4B\u524D,Rove \u4F1A\u8BFB\u4E00\u904D\u90A3\u4E2A\u4F1A\u8BDD\u7684\u5C4F\u5E55,\u53D1\u73B0\u8F93\u5165\u6846\u91CC\u5DF2\u7ECF\u6709\u5B57\u5C31\u5148\u6263\u4F4F\u4E0D\u53D1\u3002\u8FD9\u4E2A\u5224\u65AD\u4F9D\u8D56\u5F15\u64CE\u5F53\u524D\u7684\u754C\u9762\u5E03\u5C40,\u6240\u4EE5\u5382\u5546\u6539\u7248\u53EF\u80FD\u8BA9\u5B83\u5931\u51C6\u2014\u2014\u5982\u679C\u4F60\u770B\u7740\u8F93\u5165\u6846\u660E\u660E\u662F\u7A7A\u7684\u3001\u6D88\u606F\u5374\u4E00\u76F4\u88AB\u6263\u4F4F,\u5C31\u5173\u6389\u5B83\u3002\u53E6\u4E00\u9053\u300C\u521A\u521A\u6709\u4EBA\u5728\u6253\u5B57\u300D\u7684\u4FDD\u62A4\u59CB\u7EC8\u751F\u6548,\u6B63\u5728\u8F93\u5165\u7684\u8F93\u5165\u6846\u4ECD\u7136\u53D7\u4FDD\u62A4\u3002",composerGate:"\u6295\u9012\u524D\u68C0\u67E5\u8F93\u5165\u6846"}}});var en14,zh14;var init_tasks=__esm(()=>{en14={nav:{kanban:"Kanban",automations:"Routines",issues:"Issues"},header:{scratch:"SCRATCH"},search:{placeholder:"fuzzy filter"},menu:{open:"Open",openTab:"Open tab",closeTab:"Close tab",newChat:"New conversation",newShell:"New shell",newTask:"New task",forgetProject:"Remove project",fieldNotes:"Field notes",rename:"Rename",pin:"Pin",unpin:"Unpin",reorder:"Reorder row",runAgain:"Run again",setStatus:"Set status",copyBranch:"Copy branch name",copyPath:"Copy path",openEditor:"Open in editor",renameBranch:"Rename branch",changeEngine:"Change engine",land:"Land into base branch",delete:"Delete"},status:{backlog:"Backlog",inProgress:"In progress",inReview:"In review",done:"Done",canceled:"Canceled",error:"Error"},setStatus:{title:"Set status",current:"current",footer:"\u2191\u2193 choose \xB7 enter set \xB7 esc cancel"},changeEngine:{title:"Change engine",current:"current",footer:"\u2191\u2193 choose \xB7 enter set \xB7 esc cancel",effortLabel:"EFFORT",noEffort:"engine default",footerEffort:"\u2191\u2193 engine \xB7 \u2190\u2192 effort \xB7 enter set \xB7 esc cancel"},runAgain:{title:"Run again",source:"Brief from \u201C{title}\u201D",hint:"Runs this brief again in a new task, on its own branch and worktree.",confirm:"Run again",footer:"\u2191\u2193 scroll \xB7 \u2190\u2192 choose \xB7 enter run \xB7 esc cancel"},fieldNotes:{title:"Field notes",empty:"No field notes for this repo yet \u2014 agents file one with `rove api note`.",loading:"Loading\u2026",footer:"\u2191\u2193 scroll \xB7 esc close"},moveChip:" move",recentJump:"Recent: {title}",routinesRow:"{count} routine sessions",empty:{noMatchSearch:"No matching tasks \u2014 esc to clear.",noActiveProject:"No active tasks for this project.",noActive:"No active tasks \u2014 create one above."},activity:{working:"working",rateLimited:"rate limited",permissionNeeded:"needs permission",error:"error",dead:"engine exited"},subtitle:{noTracking:"no activity tracking",materializing:"materializing",deleting:"deleting",deleteFailed:"delete failed"},reBranch:{title:"Set branch",fieldLabel:"branch",hintNoBranches:"(no local branches \u2014 type a new name)",hintNoMatch:"(no match \u2014 enter renames to this branch)",footer:"\u2191\u2193 pick \xB7 enter set \xB7 esc cancel"},toast:{noDaemonWorktree:"No daemon running \u2014 can't create the worktree",noEditor:"No editor found \u2014 set ROVE_OPEN_EDITOR (e.g. 'code', 'cursor', 'nvim')",openWorktreeFailed:"Couldn't open worktree with {label}",worktreeErrorDeleting:"This task is being deleted \u2014 it can't be opened",worktreeErrorNotGit:"This project isn't a git repo yet \u2014 a task needs a git branch. Run `git init` (+ a first commit) in the project, then open the task. Non-git support is coming.",worktreeErrorGeneric:"Couldn't create the worktree: {message}",scratchAdopted:"Adopted into {repo} \u2014 save it as a project from New Task if you want it in the picker",scratchOpenFailed:"Couldn't open a scratch shell: {message}",scratchCloseFailed:"Couldn't close the scratch task: {message}",worktreeGoneTitle:'Worktree for "{title}" is gone',worktreeGoneBody:"Closed {count} tab(s). The branch {branch} is still there \u2014 reopen the task to re-create its worktree.",copiedBranch:"Copied branch {text}",copiedPath:"Copied path {text}"}},zh14={nav:{kanban:"\u770B\u677F",automations:"\u4F8B\u884C\u4EFB\u52A1",issues:"\u8BAE\u9898"},header:{scratch:"\u4E34\u65F6"},search:{placeholder:"\u6A21\u7CCA\u641C\u7D22"},menu:{open:"\u6253\u5F00",openTab:"\u6253\u5F00\u8BE5\u6807\u7B7E\u9875",closeTab:"\u5173\u95ED\u8BE5\u6807\u7B7E\u9875",newChat:"\u65B0\u5EFA\u4F1A\u8BDD",newShell:"\u65B0\u5EFA\u7EC8\u7AEF",newTask:"\u65B0\u5EFA\u4EFB\u52A1",forgetProject:"\u79FB\u9664\u9879\u76EE",fieldNotes:"\u73B0\u573A\u7B14\u8BB0",rename:"\u91CD\u547D\u540D",pin:"\u7F6E\u9876",unpin:"\u53D6\u6D88\u7F6E\u9876",reorder:"\u91CD\u65B0\u6392\u5E8F",runAgain:"\u91CD\u65B0\u8FD0\u884C",setStatus:"\u8BBE\u7F6E\u72B6\u6001",copyBranch:"\u590D\u5236\u5206\u652F\u540D",copyPath:"\u590D\u5236\u8DEF\u5F84",openEditor:"\u5728\u7F16\u8F91\u5668\u4E2D\u6253\u5F00",renameBranch:"\u91CD\u547D\u540D\u5206\u652F",changeEngine:"\u5207\u6362\u5F15\u64CE",land:"\u5408\u5165\u57FA\u7840\u5206\u652F",delete:"\u5220\u9664"},status:{backlog:"\u5F85\u529E",inProgress:"\u8FDB\u884C\u4E2D",inReview:"\u5F85\u8BC4\u5BA1",done:"\u5DF2\u5B8C\u6210",canceled:"\u5DF2\u53D6\u6D88",error:"\u51FA\u9519"},setStatus:{title:"\u8BBE\u7F6E\u72B6\u6001",current:"\u5F53\u524D",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u8BBE\u7F6E \xB7 esc \u53D6\u6D88"},changeEngine:{title:"\u5207\u6362\u5F15\u64CE",current:"\u5F53\u524D",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u8BBE\u7F6E \xB7 esc \u53D6\u6D88",effortLabel:"\u63A8\u7406\u5F3A\u5EA6",noEffort:"\u5F15\u64CE\u9ED8\u8BA4",footerEffort:"\u2191\u2193 \u5F15\u64CE \xB7 \u2190\u2192 \u5F3A\u5EA6 \xB7 enter \u8BBE\u7F6E \xB7 esc \u53D6\u6D88"},runAgain:{title:"\u91CD\u65B0\u8FD0\u884C",source:"\u6765\u81EA\u4EFB\u52A1\u300C{title}\u300D\u7684\u6307\u4EE4",hint:"\u5728\u65B0\u4EFB\u52A1\u91CC\u91CD\u65B0\u6267\u884C\u8FD9\u6BB5\u6307\u4EE4\uFF0C\u65B0\u4EFB\u52A1\u6709\u81EA\u5DF1\u7684\u5206\u652F\u548C\u5DE5\u4F5C\u6811\u3002",confirm:"\u91CD\u65B0\u8FD0\u884C",footer:"\u2191\u2193 \u6EDA\u52A8 \xB7 \u2190\u2192 \u9009\u62E9 \xB7 enter \u8FD0\u884C \xB7 esc \u53D6\u6D88"},fieldNotes:{title:"\u73B0\u573A\u7B14\u8BB0",empty:"\u8BE5\u4ED3\u5E93\u6682\u65E0\u73B0\u573A\u7B14\u8BB0\u2014\u2014agent \u53EF\u7528 `rove api note` \u8BB0\u5F55\u3002",loading:"\u52A0\u8F7D\u4E2D\u2026",footer:"\u2191\u2193 \u6EDA\u52A8 \xB7 esc \u5173\u95ED"},moveChip:" \u79FB\u52A8",recentJump:"\u6700\u8FD1:{title}",routinesRow:"{count} \u4E2A routine \u4F1A\u8BDD",empty:{noMatchSearch:"\u65E0\u5339\u914D\u4EFB\u52A1\u2014\u2014\u6309 esc \u6E05\u9664\u3002",noActiveProject:"\u8BE5\u9879\u76EE\u6682\u65E0\u6D3B\u8DC3\u4EFB\u52A1\u3002",noActive:"\u6682\u65E0\u6D3B\u8DC3\u4EFB\u52A1\u2014\u2014\u5728\u4E0A\u65B9\u65B0\u5EFA\u3002"},activity:{working:"\u8FD0\u884C\u4E2D",rateLimited:"\u8BF7\u6C42\u53D7\u9650",permissionNeeded:"\u7B49\u5F85\u6388\u6743",error:"\u9519\u8BEF",dead:"\u5F15\u64CE\u5DF2\u9000\u51FA"},subtitle:{noTracking:"\u4E0D\u8DDF\u8E2A\u6D3B\u52A8",materializing:"\u6B63\u5728\u521B\u5EFA worktree",deleting:"\u6B63\u5728\u5220\u9664",deleteFailed:"\u5220\u9664\u5931\u8D25"},reBranch:{title:"\u8BBE\u7F6E\u5206\u652F",fieldLabel:"\u5206\u652F",hintNoBranches:"\uFF08\u6CA1\u6709\u672C\u5730\u5206\u652F\u2014\u2014\u8F93\u5165\u65B0\u540D\u79F0\uFF09",hintNoMatch:"\uFF08\u65E0\u5339\u914D\u2014\u2014\u56DE\u8F66\u5C06\u5206\u652F\u91CD\u547D\u540D\u4E3A\u6B64\u540D\uFF09",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u8BBE\u7F6E \xB7 esc \u53D6\u6D88"},toast:{noDaemonWorktree:"\u5B88\u62A4\u8FDB\u7A0B\u672A\u8FD0\u884C\u2014\u2014\u65E0\u6CD5\u521B\u5EFA worktree",noEditor:"\u672A\u627E\u5230\u7F16\u8F91\u5668\u2014\u2014\u8BF7\u8BBE\u7F6E ROVE_OPEN_EDITOR\uFF08\u5982 'code'\u3001'cursor'\u3001'nvim'\uFF09",openWorktreeFailed:"\u65E0\u6CD5\u7528 {label} \u6253\u5F00 worktree",worktreeErrorDeleting:"\u8BE5\u4EFB\u52A1\u6B63\u5728\u5220\u9664\u4E2D\u2014\u2014\u65E0\u6CD5\u6253\u5F00",worktreeErrorNotGit:"\u8BE5\u9879\u76EE\u5C1A\u975E git \u4ED3\u5E93\u2014\u2014\u4EFB\u52A1\u9700\u8981 git \u5206\u652F\u3002\u8BF7\u5728\u9879\u76EE\u4E2D\u6267\u884C `git init`\uFF08+ \u9996\u6B21\u63D0\u4EA4\uFF09\u540E\u518D\u6253\u5F00\u4EFB\u52A1\u3002\u975E git \u9879\u76EE\u7684\u652F\u6301\u5373\u5C06\u63A8\u51FA\u3002",worktreeErrorGeneric:"\u65E0\u6CD5\u521B\u5EFA worktree\uFF1A{message}",scratchAdopted:"\u5DF2\u5F52\u5165 {repo}\u2014\u2014\u82E5\u8981\u51FA\u73B0\u5728\u9879\u76EE\u9009\u62E9\u5668\u91CC,\u53EF\u5728\u65B0\u5EFA\u4EFB\u52A1\u4E2D\u4FDD\u5B58\u4E3A\u9879\u76EE",scratchOpenFailed:"\u65E0\u6CD5\u6253\u5F00\u4E34\u65F6 Shell:{message}",scratchCloseFailed:"\u65E0\u6CD5\u5173\u95ED\u4E34\u65F6\u4EFB\u52A1:{message}",worktreeGoneTitle:'"{title}" \u7684 worktree \u5DF2\u6D88\u5931',worktreeGoneBody:"\u5DF2\u5173\u95ED {count} \u4E2A\u6807\u7B7E\u9875\u3002\u5206\u652F {branch} \u4ECD\u5728\u2014\u2014\u91CD\u65B0\u6253\u5F00\u8BE5\u4EFB\u52A1\u4F1A\u91CD\u5EFA worktree\u3002",copiedBranch:"\u5DF2\u590D\u5236\u5206\u652F {text}",copiedPath:"\u5DF2\u590D\u5236\u8DEF\u5F84 {text}"}}});var en15,zh15;var init_terminal=__esm(()=>{en15={noTask:"(no task \u2014 press n to create)",exited:"process exited \u2014 F5 restarts it",restoring:"restoring session\u2026",tab:{groupTitle:"group {n}",renameTitle:"Rename tab",renameField:"TAB TITLE",renameSubmit:"rename",chooseEngineHint:"\u2190/\u2192 or h/l choose, enter confirm, esc cancel",newChat:{title:"New conversation",engine:"ENGINE",destLabel:"DESTINATION",destTab:"new tab in this worktree",destFork:"fork a child task (new worktree)",ctxLabel:"CONTEXT",ctxFresh:"fresh conversation",ctxContinue:"continue this conversation",scratchChoice:"scratch shell"},cannotCloseLast:"Cannot close the only tab",tabGone:"That tab is no longer there",nothingToFork:"No conversation in this tab to fork yet",noTranscriptToHandOff:"{engine} keeps no readable transcript to hand over"},split:{renameTitle:"Rename split",renameField:"SPLIT NAME"},scrolledBack:"\u2191 scrolled {lines}L (ctrl+pgdn to follow)",unavailable:{shellMissing:"terminal unavailable \u2014 configured shell is not available",spawnFailed:"terminal unavailable \u2014 shell could not start",retry:"F5 tries again"},reset:{title:"Reset terminal?",body:"The running shell will be killed and a fresh one will spawn at the worktree. Any in-flight processes (vim, htop, paused jobs) end immediately."}},zh15={noTask:"\uFF08\u65E0\u4EFB\u52A1 \u2014\u2014 \u6309 n \u521B\u5EFA\uFF09",exited:"\u8FDB\u7A0B\u5DF2\u9000\u51FA \u2014\u2014 \u6309 F5 \u91CD\u542F",restoring:"\u6B63\u5728\u6062\u590D\u4F1A\u8BDD\u2026",tab:{groupTitle:"group {n}",renameTitle:"\u91CD\u547D\u540D\u6807\u7B7E\u9875",renameField:"\u6807\u7B7E\u9875\u540D\u79F0",renameSubmit:"\u91CD\u547D\u540D",chooseEngineHint:"\u2190/\u2192 \u6216 h/l \u9009\u62E9\uFF0Center \u786E\u8BA4\uFF0Cesc \u53D6\u6D88",newChat:{title:"\u65B0\u5EFA\u5BF9\u8BDD",engine:"\u5F15\u64CE",destLabel:"\u843D\u70B9",destTab:"\u672C worktree \u65B0\u6807\u7B7E\u9875",destFork:"fork \u5B50\u4EFB\u52A1\uFF08\u65B0 worktree\uFF09",ctxLabel:"\u4E0A\u4E0B\u6587",ctxFresh:"\u5168\u65B0\u5BF9\u8BDD",ctxContinue:"\u63A5\u7740\u5F53\u524D\u5BF9\u8BDD",scratchChoice:"\u4E34\u65F6 shell"},cannotCloseLast:"\u65E0\u6CD5\u5173\u95ED\u552F\u4E00\u7684\u6807\u7B7E\u9875",tabGone:"\u8FD9\u4E2A\u6807\u7B7E\u9875\u5DF2\u7ECF\u4E0D\u5728\u4E86",nothingToFork:"\u8FD9\u4E2A\u6807\u7B7E\u9875\u8FD8\u6CA1\u6709\u53EF\u6D3E\u751F\u7684\u5BF9\u8BDD",noTranscriptToHandOff:"{engine} \u6CA1\u6709\u53EF\u8BFB\u7684\u5BF9\u8BDD\u8BB0\u5F55\uFF0C\u65E0\u6CD5\u4EA4\u63A5"},split:{renameTitle:"\u91CD\u547D\u540D\u5206\u5C4F",renameField:"\u5206\u5C4F\u540D\u79F0"},scrolledBack:"\u2191 \u5DF2\u56DE\u6EDA {lines} \u884C\uFF08ctrl+pgdn \u56DE\u5230\u5E95\u90E8\uFF09",unavailable:{shellMissing:"\u7EC8\u7AEF\u4E0D\u53EF\u7528 \u2014\u2014 \u914D\u7F6E\u7684 shell \u4E0D\u5B58\u5728",spawnFailed:"\u7EC8\u7AEF\u4E0D\u53EF\u7528 \u2014\u2014 shell \u542F\u52A8\u5931\u8D25",retry:"\u6309 F5 \u91CD\u8BD5"},reset:{title:"\u91CD\u7F6E\u7EC8\u7AEF\uFF1F",body:"\u6B63\u5728\u8FD0\u884C\u7684 shell \u4F1A\u88AB\u6740\u6389\u5E76\u5728 worktree \u91CD\u65B0\u542F\u52A8\uFF0C\u8FDB\u884C\u4E2D\u7684\u8FDB\u7A0B\uFF08vim\u3001htop\u3001\u6682\u505C\u7684\u4EFB\u52A1\uFF09\u4F1A\u7ACB\u5373\u7ED3\u675F\u3002"}}});var en16,zh16;var init_update=__esm(()=>{en16={pageTitle:"ROVE UPDATE",chip:"\u2191 {version}",current:"current",latest:"latest",latestUnknown:"unknown \u2014 could not reach the registry",releaseUrlUnavailable:"release URL unavailable",statusReleaseOpened:"Opened release page in your browser.",statusReleaseError:"Could not open release URL.",statusRunningUpdater:"Closing the TUI and running the updater in this terminal...",loadingNotes:"Loading release notes...",notesUnavailable:"Release notes are unavailable. Use Open release to view the GitHub release page.",changesSectionHeader:"\u2500\u2500 changes from v{from} to v{to} \u2500\u2500",updateComplete:"Rove update complete. Relaunch Rove to use the new version.",updateFailed:"Rove update failed with exit code {code}.",pressAnyKey:"Press any key to close this update window.",actions:{updateNow:"Update now",openRelease:"Open release",close:"Close",closeDetail:"return to the workspace"},skew:{title:"\u26A0 DAEMON OUT OF DATE",olderBuild:"an older build",hint:"daemon is {daemon} \u2014 you launched v{clientVersion}. Run `rove daemon restart`, then relaunch Rove"},staleInstall:{title:"\u2715 ROVE INSTALL IS GONE",hint:"this Rove is running from an install that no longer exists on disk, so it cannot start a daemon. Reinstall (`npm install -g @sma1lboy/rove`) and relaunch Rove"},versions:{pageTitle:"ROVE VERSIONS",loading:"Loading releases...",unavailable:"Could not fetch releases (offline or rate-limited).",tagCurrent:"current",tagLatest:"latest",tagBreaking:"breaking",breakingWarning:"\u26A0 installing this crosses breaking version(s) {versions} \u2014 run `rove reset` after the update.",footerHint:"j/k select \xB7 enter install \xB7 q close"}},zh16={pageTitle:"ROVE \u66F4\u65B0",chip:"\u2191 {version}",current:"\u5F53\u524D",latest:"\u6700\u65B0",latestUnknown:"\u672A\u77E5 \u2014\u2014 \u65E0\u6CD5\u8FDE\u63A5\u5230 registry",releaseUrlUnavailable:"\u53D1\u5E03\u94FE\u63A5\u4E0D\u53EF\u7528",statusReleaseOpened:"\u5DF2\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u53D1\u5E03\u8BF4\u660E\u9875\u9762\u3002",statusReleaseError:"\u65E0\u6CD5\u6253\u5F00\u53D1\u5E03\u94FE\u63A5\u3002",statusRunningUpdater:"\u6B63\u5728\u5173\u95ED TUI\uFF0C\u5E76\u5728\u5F53\u524D\u7EC8\u7AEF\u4E2D\u8FD0\u884C\u66F4\u65B0\u7A0B\u5E8F\u2026\u2026",loadingNotes:"\u6B63\u5728\u52A0\u8F7D\u53D1\u5E03\u8BF4\u660E\u2026\u2026",notesUnavailable:"\u53D1\u5E03\u8BF4\u660E\u4E0D\u53EF\u7528\u3002\u8BF7\u4F7F\u7528\u300C\u6253\u5F00\u53D1\u5E03\u9875\u300D\u67E5\u770B GitHub \u53D1\u5E03\u9875\u9762\u3002",changesSectionHeader:"\u2500\u2500 v{from} \u81F3 v{to} \u7684\u53D8\u66F4 \u2500\u2500",updateComplete:"Rove \u66F4\u65B0\u5B8C\u6210\u3002\u8BF7\u91CD\u65B0\u542F\u52A8 Rove \u4EE5\u4F7F\u7528\u65B0\u7248\u672C\u3002",updateFailed:"Rove \u66F4\u65B0\u5931\u8D25\uFF0C\u9000\u51FA\u7801\u4E3A {code}\u3002",pressAnyKey:"\u6309\u4EFB\u610F\u952E\u5173\u95ED\u6B64\u66F4\u65B0\u7A97\u53E3\u3002",actions:{updateNow:"\u7ACB\u5373\u66F4\u65B0",openRelease:"\u6253\u5F00\u53D1\u5E03\u9875",close:"\u5173\u95ED",closeDetail:"\u8FD4\u56DE\u5DE5\u4F5C\u533A"},skew:{title:"\u26A0 DAEMON \u7248\u672C\u4E0D\u4E00\u81F4",olderBuild:"\u65E7\u7248\u672C\u6784\u5EFA",hint:"daemon \u8FD0\u884C\u7684\u662F {daemon}\uFF0C\u800C\u4F60\u542F\u52A8\u7684\u662F v{clientVersion}\u3002\u8BF7\u8FD0\u884C `rove daemon restart`\uFF0C\u7136\u540E\u91CD\u65B0\u542F\u52A8 Rove"},staleInstall:{title:"\u2715 ROVE \u5B89\u88C5\u5DF2\u4E0D\u5B58\u5728",hint:"\u5F53\u524D Rove \u8FD0\u884C\u81EA\u4E00\u4EFD\u5DF2\u4ECE\u78C1\u76D8\u5220\u9664\u7684\u5B89\u88C5\uFF0C\u56E0\u6B64\u65E0\u6CD5\u542F\u52A8 daemon\u3002\u8BF7\u91CD\u65B0\u5B89\u88C5\uFF08`npm install -g @sma1lboy/rove`\uFF09\u5E76\u91CD\u65B0\u542F\u52A8 Rove"},versions:{pageTitle:"ROVE \u7248\u672C\u5217\u8868",loading:"\u6B63\u5728\u52A0\u8F7D\u53D1\u5E03\u5217\u8868\u2026\u2026",unavailable:"\u65E0\u6CD5\u83B7\u53D6\u53D1\u5E03\u5217\u8868\uFF08\u79BB\u7EBF\u6216\u89E6\u53D1\u9650\u6D41\uFF09\u3002",tagCurrent:"\u5F53\u524D",tagLatest:"\u6700\u65B0",tagBreaking:"breaking",breakingWarning:"\u26A0 \u5B89\u88C5\u8BE5\u7248\u672C\u4F1A\u8DE8\u8FC7 breaking \u7248\u672C {versions}\u2014\u2014\u66F4\u65B0\u540E\u9700\u8FD0\u884C `rove reset`\u3002",footerHint:"j/k \u9009\u62E9 \xB7 enter \u5B89\u88C5 \xB7 q \u5173\u95ED"}}});var en17,zh17;var init_workItems=__esm(()=>{en17={title:"ISSUES",noRepo:"no project",empty:"No open issues.",assignedFilter:"assigned to me",starting:"Starting work on #{number}\u2026",startedNoEngine:"Created {title}, but its engine did not start.",linkedChip:"\u2192 {title}",openingLinked:"Opening {title}\u2026",startFailed:"Couldn't start work on #{number}: {error}",errorHint:{noRemote:"Add a GitHub remote (`git remote add origin <url>`) and try again, or press q / esc to close.",ghMissing:"Install the `gh` CLI and authenticate, or press q / esc to close.",auth:"Run `gh auth login`, or press q / esc to close.",fallback:"{message} \xB7 press q / esc to close"}},zh17={title:"\u8BAE\u9898",noRepo:"\u65E0\u9879\u76EE",empty:"\u6CA1\u6709\u5F00\u653E\u7684\u8BAE\u9898\u3002",assignedFilter:"\u5206\u914D\u7ED9\u6211\u7684",starting:"\u6B63\u5728\u5F00\u59CB\u5904\u7406 #{number}\u2026",startedNoEngine:"\u5DF2\u521B\u5EFA {title}\uFF0C\u4F46\u5F15\u64CE\u6CA1\u6709\u542F\u52A8\u3002",linkedChip:"\u2192 {title}",openingLinked:"\u6B63\u5728\u6253\u5F00 {title}\u2026",startFailed:"\u5F00\u59CB\u5904\u7406 #{number} \u5931\u8D25\uFF1A{error}",errorHint:{noRemote:"\u6DFB\u52A0 GitHub remote\uFF08`git remote add origin <url>`\uFF09\u540E\u91CD\u8BD5\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",ghMissing:"\u5B89\u88C5 `gh` CLI \u5E76\u767B\u5F55\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",auth:"\u6267\u884C `gh auth login`\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",fallback:"{message} \xB7 \u6309 q / esc \u5173\u95ED"}}});var en18,zh18;var init_workspace=__esm(()=>{en18={quit:{confirmTitle:"Quit Rove?",confirmBody:"The daemon and task sessions keep running. This closes only the native workspace.",confirmLabel:"Quit"},empty:{selectTask:"Select a task with a worktree",noSessions:"No sessions here \u2014 press \u23CE or ctrl+e to start one",remoteUnsupported:"Hosted engine launch over SSH is not implemented \u2014 this task's worktree is on {host}"},welcome:{title:"Welcome to Rove",tagline:"Run several AI coding sessions side by side \u2014 each task gets its own git worktree and branch.",worktreeExplain:"Each task creates its own git worktree directory and branch, so multiple AI sessions can edit the same codebase in parallel without colliding.",stepNew:"creates your first task \u2014 pick a repo, a base branch, an engine",stepHelp:"shows every shortcut reachable from the current focus",stepPrefix:"opens the command menu",enginesFound:"\u2713 engines: {list}",enginesMissing:"\u2717 no engine CLI found \u2014 install claude, codex, copilot, or kimi, then restart Rove",gitMissing:"\u2717 git not found on PATH \u2014 Rove needs git to create worktrees",doctorHint:"run `rove doctor` in a shell for the full diagnosis",docsHint:"docs: https://docs.rove.run"},attention:{none:"No available Inbox items"},inbox:{title:"INBOX",empty:"No pending attention",openHint:"enter open",clearHint:"d clear",more:"+{count} more",section:{attention:"ATTENTION",recent:"RECENT"},state:{done:"done",needsInput:"needs input",error:"error",rateLimited:"rate limited",running:"running",dead:"engine exited",promptDeferred:"message queued"},resumesAt:"resumes {time}",deferredToast:"Message queued \u2014 composer busy",deferredStillQueued:"Still typing? The queued message stays in the Inbox \u2014 open it again to send.",deferredUnavailable:"That tab isn't running \u2014 the queued message stays in the Inbox.",deferredInsertFailed:"Couldn't insert the queued message \u2014 it's still in the Inbox."}},zh18={quit:{confirmTitle:"\u9000\u51FA Rove\uFF1F",confirmBody:"\u5B88\u62A4\u8FDB\u7A0B\u548C\u4EFB\u52A1\u4F1A\u8BDD\u4F1A\u7EE7\u7EED\u8FD0\u884C\uFF0C\u8FD9\u91CC\u53EA\u5173\u95ED\u539F\u751F\u5DE5\u4F5C\u533A\u3002",confirmLabel:"\u9000\u51FA"},empty:{selectTask:"\u8BF7\u9009\u62E9\u4E00\u4E2A\u5E26 worktree \u7684\u4EFB\u52A1",noSessions:"\u8FD9\u91CC\u6CA1\u6709\u4F1A\u8BDD\u2014\u2014\u6309 \u23CE \u6216 ctrl+e \u5F00\u4E00\u4E2A",remoteUnsupported:"\u5C1A\u672A\u5B9E\u73B0\u901A\u8FC7 SSH \u542F\u52A8\u6258\u7BA1\u5F15\u64CE\u2014\u2014\u8BE5\u4EFB\u52A1\u7684 worktree \u5728 {host} \u4E0A"},welcome:{title:"\u6B22\u8FCE\u4F7F\u7528 Rove",tagline:"\u5E76\u884C\u8FD0\u884C\u591A\u4E2A AI \u7F16\u7801\u4F1A\u8BDD\u2014\u2014\u6BCF\u4E2A\u4EFB\u52A1\u90FD\u6709\u81EA\u5DF1\u7684 git worktree \u548C\u5206\u652F\u3002",worktreeExplain:"\u6BCF\u4E2A\u4EFB\u52A1\u90FD\u4F1A\u521B\u5EFA\u72EC\u7ACB\u7684 git worktree \u76EE\u5F55\u548C\u5206\u652F\uFF0C\u591A\u4E2A AI \u4F1A\u8BDD\u53EF\u4EE5\u5E76\u884C\u4FEE\u6539\u540C\u4E00\u4EFD\u4EE3\u7801\u5E93\uFF0C\u4E92\u4E0D\u5E72\u6270\u3002",stepNew:"\u521B\u5EFA\u4F60\u7684\u7B2C\u4E00\u4E2A\u4EFB\u52A1\u2014\u2014\u9009\u4ED3\u5E93\u3001\u57FA\u7840\u5206\u652F\u548C\u5F15\u64CE",stepHelp:"\u67E5\u770B\u5F53\u524D\u7126\u70B9\u4E0B\u7684\u5168\u90E8\u5FEB\u6377\u952E",stepPrefix:"\u6253\u5F00\u547D\u4EE4\u83DC\u5355",enginesFound:"\u2713 \u5DF2\u68C0\u6D4B\u5230\u5F15\u64CE:{list}",enginesMissing:"\u2717 \u672A\u627E\u5230\u5F15\u64CE CLI\u2014\u2014\u8BF7\u5B89\u88C5 claude\u3001codex\u3001copilot \u6216 kimi \u540E\u91CD\u542F Rove",gitMissing:"\u2717 PATH \u4E0A\u6CA1\u6709 git\u2014\u2014Rove \u9700\u8981 git \u6765\u521B\u5EFA worktree",doctorHint:"\u5728 shell \u91CC\u8FD0\u884C `rove doctor` \u67E5\u770B\u5B8C\u6574\u8BCA\u65AD",docsHint:"\u6587\u6863:https://docs.rove.run"},attention:{none:"\u6536\u4EF6\u7BB1\u4E2D\u6CA1\u6709\u53EF\u6253\u5F00\u7684\u9879\u76EE"},inbox:{title:"\u6536\u4EF6\u7BB1",empty:"\u6682\u65E0\u5F85\u5904\u7406",openHint:"enter \u6253\u5F00",clearHint:"d \u6E05\u9664",more:"\u8FD8\u6709 {count} \u6761",section:{attention:"\u5F85\u5904\u7406",recent:"\u6700\u8FD1\u4F7F\u7528"},state:{done:"\u5B8C\u6210",needsInput:"\u9700\u8981\u8F93\u5165",error:"\u51FA\u9519",rateLimited:"\u9650\u6D41",running:"\u8FDB\u884C\u4E2D",dead:"\u5F15\u64CE\u5DF2\u9000\u51FA",promptDeferred:"\u6D88\u606F\u5DF2\u6392\u961F"},resumesAt:"{time} \u6062\u590D",deferredToast:"\u6D88\u606F\u5DF2\u6392\u961F\u2014\u2014composer \u6B63\u5FD9",deferredStillQueued:"\u8FD8\u5728\u6253\u5B57\uFF1F\u6392\u961F\u7684\u6D88\u606F\u7559\u5728\u6536\u4EF6\u7BB1\u2014\u2014\u518D\u6253\u5F00\u4E00\u6B21\u5373\u53EF\u53D1\u9001\u3002",deferredUnavailable:"\u8BE5\u6807\u7B7E\u9875\u672A\u8FD0\u884C\u2014\u2014\u6392\u961F\u7684\u6D88\u606F\u7559\u5728\u6536\u4EF6\u7BB1\u3002",deferredInsertFailed:"\u65E0\u6CD5\u63D2\u5165\u6392\u961F\u7684\u6D88\u606F\u2014\u2014\u5B83\u4ECD\u5728\u6536\u4EF6\u7BB1\u4E2D\u3002"}}});var en19,zh19;var init_worktrees=__esm(()=>{en19={title:"Worktrees",loading:"Loading worktrees\u2026",noProjects:"No local projects known to Rove yet.",noWorktrees:"No worktrees.",badge:{kobeManaged:"rove",dirty:"dirty",remoteOn:"on remote",remoteOff:"not pushed",remoteUnknown:"remote unknown"},verdict:{prOpen:"PR open",prMerged:"merged (PR)",inMain:"in main",prClosed:"PR closed",idle:"stale"},row:{detached:"(detached)",created:"created {age} ago",linkedTask:"task: {title}"},delete:{button:"Delete",confirmTitle:"Delete worktree?",confirmBody:'Delete the worktree for "{branch}"? This removes the working directory; the branch itself is kept.',forceTitle:"Force delete worktree?",forceBody:'"{branch}" has uncommitted or untracked changes that will be PERMANENTLY LOST. Force delete anyway?',failed:"Failed to delete worktree: {error}",residue:"Git deregistered the worktree, but couldn't delete {path} ({reason}). Rove is done with it \u2014 retrying won't help; delete the directory by hand if you want the space."},land:{button:"Land",confirmTitle:"Land branch?",confirmBody:`Merge "{branch}" into the base repo's current branch, then remove this worktree? The branch is kept. A dirty base checkout is refused; conflicts abort with a file list.`,noTask:"This worktree isn't tracked as a Rove task \u2014 nothing to land.",conflict:"Land hit conflicts (merge aborted). Resolve by hand: {files}",dirtyBase:"The base checkout has uncommitted changes \u2014 commit them, then land. Never `git stash` here: the stash stack lives in the repo's common dir and is shared by every linked worktree, so a stash can entangle other tasks' work.",failed:"Land failed: {error}",done:'Landed "{branch}" onto {landedOn} ({commit}).',worktreeKept:"Landed, but the worktree was kept: {reason}",worktreePathStale:"Landed and removed the worktree, but the task still points at it: {reason}",worktreeResidue:"Landed. Git deregistered the worktree, but couldn't delete {path} ({reason}) \u2014 delete the directory by hand if you want the space."},hint:{}},zh19={title:"\u5DE5\u4F5C\u6811",loading:"\u6B63\u5728\u52A0\u8F7D worktree\u2026",noProjects:"Rove \u8FD8\u6CA1\u6709\u5DF2\u77E5\u7684\u672C\u5730\u9879\u76EE\u3002",noWorktrees:"\u6CA1\u6709 worktree\u3002",badge:{kobeManaged:"rove",dirty:"\u6709\u6539\u52A8",remoteOn:"\u5DF2\u63A8\u9001",remoteOff:"\u672A\u63A8\u9001",remoteUnknown:"\u8FDC\u7AEF\u672A\u77E5"},verdict:{prOpen:"PR \u8BC4\u5BA1\u4E2D",prMerged:"\u5DF2\u5408\u5165 (PR)",inMain:"\u5DF2\u5728\u4E3B\u5206\u652F",prClosed:"PR \u5DF2\u5173\u95ED",idle:"\u9648\u65E7"},row:{detached:"(\u6E38\u79BB\u72B6\u6001)",created:"{age}\u524D\u521B\u5EFA",linkedTask:"\u4EFB\u52A1\uFF1A{title}"},delete:{button:"\u5220\u9664",confirmTitle:"\u5220\u9664 worktree\uFF1F",confirmBody:'\u786E\u5B9A\u5220\u9664 "{branch}" \u5BF9\u5E94\u7684 worktree\uFF1F\u5DE5\u4F5C\u76EE\u5F55\u4F1A\u88AB\u79FB\u9664\uFF0C\u5206\u652F\u672C\u8EAB\u4F1A\u4FDD\u7559\u3002',forceTitle:"\u5F3A\u5236\u5220\u9664 worktree\uFF1F",forceBody:'"{branch}" \u5B58\u5728\u672A\u63D0\u4EA4\u6216\u672A\u8DDF\u8E2A\u7684\u6539\u52A8\uFF0C\u5F3A\u5236\u5220\u9664\u540E\u5C06\u6C38\u4E45\u4E22\u5931\u3002\u4ECD\u8981\u5F3A\u5236\u5220\u9664\u5417\uFF1F',failed:"\u5220\u9664 worktree \u5931\u8D25\uFF1A{error}",residue:"Git \u5DF2\u6CE8\u9500\u8BE5 worktree\uFF0C\u4F46\u6CA1\u80FD\u5220\u6389 {path}\uFF08{reason}\uFF09\u3002Rove \u8FD9\u8FB9\u5DF2\u7ECF\u5904\u7406\u5B8C\u4E86\u2014\u2014\u91CD\u8BD5\u6CA1\u6709\u7528\uFF1B\u60F3\u8981\u56DE\u78C1\u76D8\u7A7A\u95F4\u8BF7\u624B\u52A8\u5220\u9664\u8BE5\u76EE\u5F55\u3002"},land:{button:"\u5408\u5165",confirmTitle:"\u5408\u5165\u5206\u652F\uFF1F",confirmBody:'\u628A "{branch}" \u5408\u5165\u57FA\u4ED3\u5E93\u5F53\u524D\u5206\u652F\uFF0C\u7136\u540E\u79FB\u9664\u8FD9\u4E2A worktree\uFF1F\u5206\u652F\u4F1A\u4FDD\u7559\u3002\u57FA\u7840\u68C0\u51FA\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u4F1A\u88AB\u62D2\u7EDD\uFF1B\u51B2\u7A81\u4F1A\u4E2D\u6B62\u5E76\u7ED9\u51FA\u6587\u4EF6\u6E05\u5355\u3002',noTask:"\u8BE5 worktree \u672A\u4F5C\u4E3A Rove \u4EFB\u52A1\u88AB\u8DDF\u8E2A\u2014\u2014\u6CA1\u6709\u53EF\u5408\u5165\u7684\u5BF9\u8C61\u3002",conflict:"\u5408\u5165\u9047\u5230\u51B2\u7A81\uFF08\u5DF2\u4E2D\u6B62\uFF09\u3002\u8BF7\u624B\u52A8\u89E3\u51B3\uFF1A{files}",dirtyBase:"\u57FA\u7840\u68C0\u51FA\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u2014\u2014\u8BF7\u5148\u63D0\u4EA4\u518D\u5408\u5165\u3002\u7EDD\u4E0D\u8981\u5728\u8FD9\u91CC `git stash`\uFF1Astash \u6808\u5B58\u653E\u5728\u4ED3\u5E93\u7684 common dir \u4E2D\uFF0C\u8BE5\u4ED3\u5E93\u6240\u6709 linked worktree \u5171\u4EAB\uFF0C\u4E00\u6B21 stash \u53EF\u80FD\u7EA0\u7F20\u5176\u4ED6\u4EFB\u52A1\u7684\u5DE5\u4F5C\u3002",failed:"\u5408\u5165\u5931\u8D25\uFF1A{error}",done:'\u5DF2\u628A "{branch}" \u5408\u5165 {landedOn}\uFF08{commit}\uFF09\u3002',worktreeKept:"\u5DF2\u5408\u5165\uFF0C\u4F46 worktree \u4FDD\u7559\u4E86\uFF1A{reason}",worktreePathStale:"\u5DF2\u5408\u5165\u5E76\u79FB\u9664 worktree\uFF0C\u4F46\u4EFB\u52A1\u4ECD\u6307\u5411\u5B83\uFF1A{reason}",worktreeResidue:"\u5DF2\u5408\u5165\u3002Git \u5DF2\u6CE8\u9500\u8BE5 worktree\uFF0C\u4F46\u6CA1\u80FD\u5220\u6389 {path}\uFF08{reason}\uFF09\u2014\u2014\u60F3\u8981\u56DE\u78C1\u76D8\u7A7A\u95F4\u8BF7\u624B\u52A8\u5220\u9664\u8BE5\u76EE\u5F55\u3002"},hint:{}}});function isLocaleId(value){return typeof value==="string"&&LOCALES.some((l)=>l.id===value)}var en20,zh20,LOCALES,CATALOGS,DEFAULT_LOCALE="en";var init_catalog=__esm(()=>{init_automations();init_common();init_doctor();init_files();init_help();init_hints();init_kanban();init_keys();init_newTask();init_onboarding();init_ops();init_quickTask();init_settings();init_tasks();init_terminal();init_update();init_workItems();init_workspace();init_worktrees();en20={settings:en13,tasks:en14,terminal:en15,files:en4,newTask:en9,onboarding:en10,ops:en11,update:en16,quickTask:en12,help:en5,hints:en6,common:en2,keys:en8,workspace:en18,worktrees:en19,kanban:en7,automations:en,workItems:en17,doctor:en3},zh20={settings:zh13,tasks:zh14,terminal:zh15,files:zh4,newTask:zh9,onboarding:zh10,ops:zh11,update:zh16,quickTask:zh12,help:zh5,hints:zh6,common:zh2,keys:zh8,workspace:zh18,worktrees:zh19,kanban:zh7,automations:zh,workItems:zh17,doctor:zh3},LOCALES=[{id:"en",label:"English"},{id:"zh",label:"\u4E2D\u6587"}],CATALOGS={en:en20,zh:zh20}});import{readFileSync as readFileSync11}from"fs";function readPersistedUiPrefs(fallbackTheme,isKnownTheme=hasBundledTheme){try{let parsed=JSON.parse(readFileSync11(kvStatePath(),"utf8")),theme=typeof parsed.activeTheme==="string"&&isKnownTheme(parsed.activeTheme)?parsed.activeTheme:fallbackTheme,transparent=parsed.transparentBackground!==!1,focusAccent=typeof parsed.focusAccent==="string"&&FOCUS_ACCENT_SLOTS.includes(parsed.focusAccent)?parsed.focusAccent:null,locale=isLocaleId(parsed[LOCALE_KEY])?parsed[LOCALE_KEY]:DEFAULT_LOCALE;return{theme,transparent,focusAccent,locale}}catch{return{theme:fallbackTheme,transparent:!0,focusAccent:null,locale:DEFAULT_LOCALE}}}var LOCALE_KEY="locale";var init_persisted_ui_prefs=__esm(()=>{init_env();init_theme_core();init_catalog()});function terminalDefaultColorsForTheme(theme){return parseTerminalDefaultColors({foreground:resolveThemeSlotHex(theme,"text","dark"),background:resolveThemeSlotHex(theme,"background","dark")})??DEFAULT_TERMINAL_COLORS}function readPersistedTerminalDefaultColors(){let themes={...BUNDLED_THEMES};for(let{name,theme}of loadUserThemes())themes[name]=theme;let prefs=readPersistedUiPrefs(DEFAULT_THEME,(name)=>Boolean(themes[name])),selected=themes[prefs.theme]??themes[DEFAULT_THEME];return selected?terminalDefaultColorsForTheme(selected):DEFAULT_TERMINAL_COLORS}var init_terminal_colors2=__esm(()=>{init_terminal_colors();init_theme_core();init_loader();init_persisted_ui_prefs()});function He(r,e){let t=0,n=e.length-1,o;if(r<e[0][0]||r>e[n][1])return!1;for(;n>=t;)if(o=t+n>>1,r>e[o][1])t=o+1;else if(r<e[o][0])n=o-1;else return!0;return!1}function Y(r){Je(r)||Ge.onUnexpectedError(r)}function Je(r){return r instanceof G?!0:r instanceof Error&&r.name===ce&&r.message===ce}function pe(r2,e){let t=this,n=!1,o;return function(){if(n)return o;if(n=!0,e)try{o=r2.apply(t,arguments)}finally{e()}else o=r2.apply(t,arguments);return o}}function Ye(r2,e,t=0,n=r2.length){let o=t,d=n;for(;o<d;){let v=Math.floor((o+d)/2);e(r2[v])?o=v+1:d=v}return o-1}function we(r2,e){return(t,n)=>e(r2(t),r2(n))}function Oe(r2,e){let t=Object.create(null);for(let n of r2){let o=e(n),d=t[o];d||(d=t[o]=[]),d.push(n)}return t}function Ze(r2){O=r2}function Te(r2){return O?.trackDisposable(r2),r2}function ve(r2){O?.markAsDisposed(r2)}function he(r2,e){O?.setParent(r2,e)}function et(r2,e){if(O)for(let t of r2)O.setParent(t,e)}function Pe(r2){if(fe.is(r2)){let e=[];for(let t of r2)if(t)try{t.dispose()}catch(n){e.push(n)}if(e.length===1)throw e[0];if(e.length>1)throw AggregateError(e,"Encountered errors while disposing of store");return Array.isArray(r2)?[]:r2}else if(r2)return r2.dispose(),r2}function Me(...r2){let e=me(()=>Pe(r2));return et(r2,e),e}function me(r2){let e=Te({dispose:pe(()=>{ve(e),r2()})});return e}function je(r5,e){let t=0,n=e.length-1,o;if(r5<e[0][0]||r5>e[n][1])return!1;for(;n>=t;)if(o=t+n>>1,r5>e[o][1])t=o+1;else if(r5<e[o][0])n=o-1;else return!0;return!1}var ue,qe,A,H=class{constructor(){if(this.version="6",!A){A=new Uint8Array(65536),A.fill(1),A[0]=0,A.fill(0,1,32),A.fill(0,127,160),A.fill(2,4352,4448),A[9001]=2,A[9002]=2,A.fill(2,11904,42192),A[12351]=1,A.fill(2,44032,55204),A.fill(2,63744,64256),A.fill(2,65040,65050),A.fill(2,65072,65136),A.fill(2,65280,65377),A.fill(2,65504,65511);for(let e=0;e<ue.length;++e)A.fill(0,ue[e][0],ue[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?A[e]:He(e,qe)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let n=this.wcwidth(e),o=n===0&&t!==0;if(o){let d=w.extractWidth(t);d===0?o=!1:d>n&&(n=d)}return w.createPropertyValue(0,n,o)}},de=class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?J.isErrorNoTelemetry(e)?new J(e.message+`
299
299
 
@@ -363,7 +363,7 @@ ${i3.join(`
363
363
  `)}function engineSessionKey(taskId,tabId="tab-1"){return`${taskId}::${tabId}`}function buildEngineSessionLaunch(input){let remoteKey=[input.task.repo,input.worktreePath].find((key)=>key&&isRemoteRepoKey(key));if(remoteKey)throw new RemoteEngineLaunchError(remoteKey);let protocolTaskId=input.task.kind==="main"?void 0:input.task.id,dispatcherTaskId=input.task.kind==="main"?input.task.id:void 0,gates=input.protocolGates,launchInit=resolveEngineLaunchInit(input.task.repo??"",input.worktreePath,input.promptIntent,input.task.id),notes=protocolTaskId?(input.readNotes??readFieldNotes)(input.task.repo??""):[],argv=withDispatcherProtocol(withWorktreeProtocol(input.argv,input.task.vendor,protocolTaskId,{status:gates?.status,notes:gates?.notes},notes),input.task.vendor,dispatcherTaskId,gates?.dispatcher),pasteFirstMessage=(input.firstMessageDelivery??protocolEntry(input.task.vendor).firstMessageDelivery??"argv")==="paste"?launchInit.firstMessage?.text:void 0;if(launchInit.firstMessage&&!pasteFirstMessage)argv=[...argv,launchInit.firstMessage.text];let markerPath=launchInit.initScript?worktreeInitMarkerPath(input.worktreePath):void 0,initTimeoutMs=resolveRepoInitTimeoutSeconds(input.initTimeoutSeconds)*1000,script=engineLaunchLine(quoteShellArgv(argv,{bareSafe:!0}),{initScript:launchInit.initScript,markerPath,timeoutSeconds:input.initTimeoutSeconds}),taskId=quoteShellArg(input.task.id),tabId=quoteShellArg(input.tabId??"tab-1"),identity=`export ROVE_TASK_ID=${taskId} KOBE_TASK_ID=${taskId} ROVE_TAB_ID=${tabId} KOBE_TAB_ID=${tabId}
364
364
  `;return{key:engineSessionKey(input.task.id,input.tabId),command:[input.shell,"-ilc",identity+script],...pasteFirstMessage?{firstMessage:pasteFirstMessage}:{},...markerPath?{initMarkerPath:markerPath,initTimeoutMs}:{}}}var SIGINT_GUARD="trap ':' INT; ",REPO_INIT_TIMEOUT_SECONDS=120,REPO_INIT_TIMEOUT_MIN_SECONDS=5,REPO_INIT_TIMEOUT_MAX_SECONDS=3600,RemoteEngineLaunchError;var init_session_launch=__esm(()=>{init_platform_shell();init_env();init_shell_command();init_field_notes();init_repo_init();init_repos();init_engine_presets();init_worktree_protocol();RemoteEngineLaunchError=class RemoteEngineLaunchError extends Error{repo;code="REMOTE_ENGINE_LAUNCH_UNSUPPORTED";constructor(repo){super(`hosted engine launch over SSH is not implemented (remote project ${repo})`);this.repo=repo;this.name="RemoteEngineLaunchError"}}});import{existsSync as existsSync15}from"fs";import{basename as basename5}from"path";async function connectHostedSessionClient(socketPath){let client=new KobeDaemonClient(socketPath);try{await client.connect()}catch(error){throw client.close(),error}return{rpc:client,close:()=>client.close()}}async function openHostedSessionHost(){try{return await connectHostedSessionClient(defaultPtyHostSocketPath())}catch{return null}}async function ensureHostedSessionHost(){return connectHostedSessionClient(await ensurePtyHostReachable())}async function listHostedSessions(rpc){try{let{sessions}=await rpc.request("pty.list",{});return sessions??[]}catch{return[]}}function isHostedTaskKey(key,taskId){return(key.split("::")[0]??key)===taskId}function hostedTaskKeys(sessions,taskId){return sessions.filter((session)=>isHostedTaskKey(session.key,taskId)).map((session)=>session.key)}async function killHostedSessions(rpc,keys){for(let key of keys)await rpc.request("pty.kill",{key}).catch(()=>{})}function commandHasEngineWord(command,engineBin){for(let part of command)for(let token of part.split(/\s+/)){let bare=token.replace(/^['"]+|['"]+$/g,"");if(bare&&basename5(bare)===engineBin)return!0}return!1}function builtinEngineBins(){return BUILTIN_VENDORS.flatMap((vendor)=>{let entry=engineEntry(vendor);return[entry.defaultCommand[0],...entry.processNames??[]]}).filter((bin)=>Boolean(bin))}function tabOrder(key){let n=Number(/tab-(\d+)$/.exec(key)?.[1]);return Number.isFinite(n)?n:Number.POSITIVE_INFINITY}function findHostedEngineKey(sessions,taskId,engineBin){let mine=sessions.filter((s)=>s.alive&&isHostedTaskKey(s.key,taskId)).sort((a,b)=>tabOrder(a.key)-tabOrder(b.key)),tab1=mine.find((s)=>s.key===`${taskId}::tab-1`);if(tab1)return tab1.key;if(engineBin){let byCommand=mine.find((s)=>commandHasEngineWord(s.command,engineBin));if(byCommand)return byCommand.key}let bins=builtinEngineBins();return mine.find((s)=>bins.some((bin)=>commandHasEngineWord(s.command,bin)))?.key??null}function recentHumanWriteBlocks(peek,opts,now){if(peek.lastHumanWriteMs===void 0||peek.lastHumanWriteMs<=0)return!1;let quiet=opts.humanWriteQuietMs??peek.humanWriteQuietMs??1e4;return now-peek.lastHumanWriteMs<quiet}async function composerNonEmpty(peek,manifest){if(!manifest?.composerEmpty||manifest.composerEmpty.length===0)return!1;let bytes=Buffer.from(peek.data,"base64");return await isComposerEmpty(bytes,manifest)===!1}async function assertComposerClear(peek,key,opts){let now=opts?.now?.()??Date.now();if(recentHumanWriteBlocks(peek,opts??{},now))throw new ComposerBusyError("recent-human-write",key);if(!(opts?.composerGate??composerGateEnabled()))return;if(await composerNonEmpty(peek,opts?.screenManifest))throw new ComposerBusyError("composer-not-empty",key)}function flatten(text){return text.replace(/\s+/g," ")}async function confirmPromptLanded(rpc,key,prompt,sinceOffset){let tail=flatten(prompt).trim().slice(-CONFIRM_TAIL_CHARS);if(tail.length===0)return!1;let deadline=Date.now()+CONFIRM_TIMEOUT_MS;for(;;){let peek=await rpc.request("pty.peek",{key,sinceOffset});if(!peek.alive)return!1;if(flatten(Buffer.from(peek.data,"base64").toString("utf8")).includes(tail))return!0;if(Date.now()>=deadline)return!1;await new Promise((resolve5)=>setTimeout(resolve5,CONFIRM_POLL_MS))}}async function writeAndConfirm(rpc,key,prompt,sinceOffset,opts){let ready=await awaitPasteReady(rpc,key,{timeoutMs:opts?.pasteReadyTimeoutMs}),bytes=await writeHostedPrompt(rpc,key,prompt,{ready}),confirmed=await confirmPromptLanded(rpc,key,prompt,sinceOffset);return{bytes,ready,confirmed}}async function writeHostedPromptIfClear(rpc,key,prompt,opts){let peek=await rpc.request("pty.peek",{key});if(!peek.alive)return null;return await assertComposerClear(peek,key,opts),writeAndConfirm(rpc,key,prompt,peek.offset,opts)}async function awaitPasteReady(rpc,key,opts={}){let sleep2=opts.sleep??((ms)=>new Promise((resolve5)=>setTimeout(resolve5,ms))),deadline=Date.now()+(opts.timeoutMs??PASTE_READY_TIMEOUT_MS);for(;;){let peek=await rpc.request("pty.peek",{key});if(!peek.alive)return!1;if(bracketedPasteActive(Buffer.from(peek.data,"base64").toString("latin1")))return!0;if(Date.now()>=deadline)return!1;await sleep2(PASTE_READY_POLL_MS)}}async function writeHostedPrompt(rpc,key,prompt,opts){let bracketed=opts?.ready??await awaitPasteReady(rpc,key),data=encodePaste(prompt,bracketed);return await rpc.request("pty.write",{key,data}),await new Promise((resolve5)=>setTimeout(resolve5,SUBMIT_DELAY_MS)),await rpc.request("pty.write",{key,data:"\r"}),Buffer.byteLength(data,"utf8")}async function deliverToHostedKey(rpc,key,prompt,opts){let peek=await rpc.request("pty.peek",{key});if(!peek.alive)return null;return await assertComposerClear(peek,key,opts),writeAndConfirm(rpc,key,prompt,peek.offset,opts)}async function ensureHostedEngine(rpc,cwd,launch,defaultColors=readPersistedTerminalDefaultColors()){let result=await rpc.request("pty.open",{key:launch.key,cwd,command:launch.command,defaultColors});return await rpc.request("pty.detach",{key:launch.key}).catch(()=>{}),result}async function pastePromptWhenEngineUp(rpc,key,engineBin,prompt,opts={}){let sleep2=opts.sleep??((ms)=>new Promise((resolve5)=>setTimeout(resolve5,ms))),snapshot=opts.snapshot??psSnapshot;if(opts.initMarkerPath){let initDeadline=Date.now()+(opts.initTimeoutMs??REPO_INIT_TIMEOUT_SECONDS*1000);while(Date.now()<initDeadline){let{sessions=[]}=await rpc.request("pty.list",{});if(!sessions.find((s)=>s.key===key)?.alive)return null;if(existsSync15(opts.initMarkerPath))break;await sleep2(opts.intervalMs??FIRST_MESSAGE_POLL_INTERVAL_MS)}}let deadline=Date.now()+(opts.timeoutMs??FIRST_MESSAGE_ENGINE_TIMEOUT_MS);while(Date.now()<deadline){let{sessions=[]}=await rpc.request("pty.list",{}),session=sessions.find((s)=>s.key===key);if(!session?.alive)return null;if(session.pid){let up=!1;try{up=engineProcessIn(parsePsSnapshot(await snapshot()),session.pid,engineBin)}catch{up=!1}if(up){if(!await awaitPasteReady(rpc,key,{timeoutMs:opts.pasteReadyTimeoutMs,sleep:sleep2}))await sleep2(opts.settleMs??FIRST_MESSAGE_SETTLE_MS);return await writeHostedPromptIfClear(rpc,key,prompt,opts)}}await sleep2(opts.intervalMs??FIRST_MESSAGE_POLL_INTERVAL_MS)}return null}var SUBMIT_DELAY_MS=150,ComposerBusyError,CONFIRM_TAIL_CHARS=24,CONFIRM_TIMEOUT_MS=2000,CONFIRM_POLL_MS=100,FIRST_MESSAGE_ENGINE_TIMEOUT_MS=20000,FIRST_MESSAGE_POLL_INTERVAL_MS=500,FIRST_MESSAGE_SETTLE_MS=1500;var init_hosted_session=__esm(()=>{init_client();init_pty_process();init_paths();init_composer_gate();init_terminal_colors2();init_vendor();init_composer_state();init_foreground();init_registry();init_session_launch();ComposerBusyError=class ComposerBusyError extends Error{layer;key;constructor(layer,key){super(`composer busy on ${key}: ${layer}`);this.layer=layer;this.key=key}}});async function sessionHasEngine(pid,extraLaunch,snapshot=psSnapshot){if(!pid)return!1;try{return engineProcessIn(parsePsSnapshot(await snapshot()),pid,extraLaunch)}catch{return!1}}var init_session_engine_presence=__esm(()=>{init_foreground()});var exports_pty_delivery={};__export(exports_pty_delivery,{taskKeys:()=>taskKeys,openPtyHost:()=>openPtyHost,listSessions:()=>listSessions,killTaskSessions:()=>killTaskSessions,isTaskKey:()=>isTaskKey,findEngineKey:()=>findEngineKey,ensurePtyHost:()=>ensurePtyHost,deliverToKey:()=>deliverToKey,deliverToExactTab:()=>deliverToExactTab,deliverHostedPrompt:()=>deliverHostedPrompt});function outcomeFields(outcome){if(!outcome)return{engineReady:!1,delivered:!1};return{engineReady:outcome.ready,delivered:!0,bytes:outcome.bytes,promptEcho:outcome.confirmed?"confirmed":"unconfirmed"}}async function deliverHostedPrompt(rpc,target,cwd,prompt,launch,opts){let{sessions=[]}=await rpc.request("pty.list",{}),existingKey=opts?.forceNew?null:findEngineKey(sessions,target.id,target.engineBin);if(existingKey){let pid=sessions.find((s)=>s.key===existingKey)?.pid;if(!await sessionHasEngine(pid,target.engineBin,opts?.snapshot))throw new ApiError(`task ${target.id}'s engine tab (${existingKey}) has no live engine process \u2014 its engine exited into a plain shell`,"ENGINE_NOT_RUNNING",{hint:"spawn a fresh engine tab for this prompt with --tab new",nextCommandArgs:["api","send","--task-id",target.id,"--tab","new","--prompt",prompt]});let deliveryOpts={screenManifest:resolveComposerManifest(opts?.vendor)},tabId=existingKey.split("::")[1]??"tab-1",outcome;try{outcome=await deliverToKey(rpc,existingKey,prompt,deliveryOpts)}catch(err){if(err instanceof ComposerBusyError)return deferOrThrow(err,opts?.defer,target.id,tabId,prompt);throw err}return{session:existingKey,pane:existingKey,started:!1,...outcomeFields(outcome)}}if(!opts?.forceNew){let aliveTabs=sessions.filter((s)=>s.alive&&isTaskKey(s.key,target.id)).map((s)=>s.key);if(aliveTabs.length>0)throw new ApiError(`task ${target.id} has live tabs (${aliveTabs.join(", ")}) but none resolves as its engine tab \u2014 refusing to spawn a new engine`,"NO_ENGINE_TAB",{hint:"address a live engine tab explicitly with --tab <tab-N> (see pty-list), or spawn a fresh engine tab with --tab new",nextCommandArgs:["api","pty-list"]})}let staleCanonical=sessions.find((session)=>session.key===launch.key&&!session.alive);if(staleCanonical&&staleCanonical.restored!==!0)await rpc.request("pty.kill",{key:launch.key});let open=await rpc.request("pty.open",{key:launch.key,cwd,command:launch.command,defaultColors:readPersistedTerminalDefaultColors()});try{if(!open.alive)return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,engineReady:!1,delivered:!1};if(launch.firstMessage){let tabId=launch.key.split("::")[1]??"tab-1",outcome;try{outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs,screenManifest:resolveComposerManifest(opts?.vendor)})}catch(err){if(err instanceof ComposerBusyError)return deferOrThrow(err,opts?.defer,target.id,tabId,prompt);throw err}return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,...outcomeFields(outcome)}}let started=open.created!==!1||open.respawned===!0;if(open.created===!1&&open.respawned!==!0){let tabId=launch.key.split("::")[1]??"tab-1",outcome;try{outcome=await writePrompt(rpc,launch.key,prompt,{screenManifest:resolveComposerManifest(opts?.vendor)})}catch(err){if(err instanceof ComposerBusyError)return deferOrThrow(err,opts?.defer,target.id,tabId,prompt);throw err}return{session:launch.key,pane:launch.key,started,...outcomeFields(outcome)}}return{session:launch.key,pane:launch.key,started,engineReady:open.alive,delivered:!0}}finally{await rpc.request("pty.detach",{key:launch.key}).catch(()=>{})}}async function deliverToExactTab(rpc,taskId,tabId,cwd,prompt,opts){let key=`${taskId}::${tabId}`,{sessions=[]}=await rpc.request("pty.list",{}),session=sessions.find((s)=>s.key===key);if(!session?.alive)throw new ApiError(`tab ${tabId} has no live session on task ${taskId} \u2014 see \`rove api pty-list\` for alive tabs`,"TAB_NOT_FOUND");if(!await sessionHasEngine(session.pid,opts?.engineBin,opts?.snapshot))throw new ApiError(`tab ${tabId} on task ${taskId} has no live engine process \u2014 it is a plain shell right now`,"ENGINE_NOT_RUNNING",{hint:"spawn a fresh engine tab for this prompt with --tab new, or pick an engine tab from pty-list",nextCommandArgs:["api","pty-list"]});let deliveryOpts={screenManifest:resolveComposerManifest(opts?.vendor)},outcome;try{outcome=await deliverToKey(rpc,key,prompt,deliveryOpts)}catch(err){if(err instanceof ComposerBusyError)return deferOrThrow(err,opts?.defer,taskId,tabId,prompt);throw err}return{session:key,pane:key,started:!1,...outcomeFields(outcome)}}function resolveComposerManifest(vendor){return vendor?engineEntry(vendor).screenManifest:void 0}async function deferOrThrow(error,sink,taskId,tabId,prompt){if(sink){let deferred;try{deferred=await sink.defer({taskId,tabId,prompt,layer:error.layer})}catch{throw composerBusyApiError(error,taskId,prompt)}if(deferred.kind==="occupied")throw new ApiError(`task ${taskId} tab ${tabId} already has a deferred prompt`,"DEFERRED_PROMPT_PENDING",{taskId,tabId,existingId:deferred.id,hint:"release or dismiss the existing Inbox prompt before retrying",nextCommandArgs:["api","send","--task-id",taskId,"--tab",tabId,"--prompt",prompt]});return{session:`${taskId}::${tabId}`,pane:`${taskId}::${tabId}`,started:!1,engineReady:!1,delivered:!1,deferred:{id:deferred.id,layer:error.layer}}}throw composerBusyApiError(error,taskId,prompt)}function composerBusyApiError(error,taskId,prompt){let layerText=error.layer==="recent-human-write"?"user was typing recently":"composer has text";return new ApiError(`task ${taskId}'s composer is busy (${layerText})`,"COMPOSER_BUSY",{layer:error.layer,hint:"wait a moment and retry, or spawn a fresh engine tab with --tab new",nextCommandArgs:["api","send","--task-id",taskId,"--prompt",prompt]})}var isTaskKey,findEngineKey,taskKeys,openPtyHost,ensurePtyHost,listSessions,deliverToKey,writePrompt,killTaskSessions;var init_pty_delivery=__esm(()=>{init_hosted_session();init_registry();init_session_engine_presence();init_terminal_colors2();init_types();isTaskKey=isHostedTaskKey,findEngineKey=findHostedEngineKey,taskKeys=hostedTaskKeys,openPtyHost=openHostedSessionHost,ensurePtyHost=ensureHostedSessionHost,listSessions=listHostedSessions,deliverToKey=deliverToHostedKey,writePrompt=writeHostedPromptIfClear;killTaskSessions=killHostedSessions});async function realProbe(){let[{openPtyHost:openPtyHost2,listSessions:listSessions2},{psSnapshot:psSnapshot2}]=await Promise.all([Promise.resolve().then(() => (init_pty_delivery(),exports_pty_delivery)),Promise.resolve().then(() => (init_foreground(),exports_foreground))]);return{sessions:async()=>{let host=await openPtyHost2();if(!host)return[];try{return await listSessions2(host.rpc)}finally{host.close()}},ps:psSnapshot2,pid:process.pid}}async function verifiedSelfSession(env=process.env,probe){if(!probe&&selfSessionOnce)return selfSessionOnce;let run=resolveSelfSession(env,probe);return selfSessionOnce=run,run}async function resolveSelfSession(env,probe){let taskId=env.KOBE_TASK_ID;if(!taskId)return null;let tabId=env.KOBE_TAB_ID||"tab-1";try{let p=probe??await realProbe(),key=`${taskId}::${tabId}`,session=(await p.sessions()).find((s)=>s.key===key&&s.alive);if(session?.pid){let{hasAncestor:hasAncestor2,parsePsSnapshot:parsePsSnapshot2}=await Promise.resolve().then(() => (init_foreground(),exports_foreground));if(hasAncestor2(parsePsSnapshot2(await p.ps()),p.pid,session.pid))return identityWarning=null,{taskId,tabId}}}catch{}return identityWarning=`$ROVE_TASK_ID/$KOBE_TASK_ID names task ${taskId} ${tabId}, but this process is not running inside that tab (an inherited env, not an identity) \u2014 dispatcher/peer provenance omitted`,null}function takeIdentityWarning(){let warning=identityWarning;return identityWarning=null,warning}async function dispatcherEnvPayload(env=process.env,probe){let self2=await verifiedSelfSession(env,probe);if(!self2)return{};return{dispatcherTaskId:self2.taskId,dispatcherTabId:self2.tabId}}async function readOwnDispatcher(daemon){let self2=await verifiedSelfSession();if(!self2)return null;try{return(await daemon.request("task.get",{taskId:self2.taskId})).task.dispatcher??null}catch{return null}}async function resolveDispatcherTab(runtime,dispatcher){let{tabs,running}=await runtime.taskTabs(dispatcher.taskId);if(tabs.some((t)=>t.id===dispatcher.tabId&&t.alive))return dispatcher.tabId;if(running)return;throw new ApiError(`dispatcher tab ${dispatcher.tabId} on task ${dispatcher.taskId} is dead and the task has no live engine tab \u2014 the reply has nowhere to land`,"DISPATCHER_UNREACHABLE",{dispatcher,hint:`address an alive target explicitly with --task-id/--tab (see \`${activeCliName()} api pty-list\`), or notify the user with \`${activeCliName()} api notify\``,nextCommandArgs:["api","pty-list"]})}async function withPeerProvenance(daemon,targetTaskId,prompt){let self2=await verifiedSelfSession(),senderId=self2?.taskId;if(!senderId||senderId===targetTaskId)return prompt;let label=senderId;try{let res=await daemon.request("task.get",{taskId:senderId});label=res.task.title||res.task.branch||senderId}catch{}let api=kobeApiInvocation(),replyTarget=`--task-id ${senderId} --tab ${self2.tabId}`;return`[ROVE PEER] from "${label}" (task ${senderId} \u2014 load the Rove agent skill FIRST (registered as /rove; legacy /kobe installs still work), then reply: \`${api} send ${replyTarget} --prompt "<text>"\`; verb reference: \`${api} schema\`)
365
365
 
366
- ${prompt}`}var selfSessionOnce,identityWarning=null;var init_dispatcher2=__esm(()=>{init_interactive_command();init_rename_compat();init_types()});function trustEngineWorktree(vendor,worktreePath){try{protocolEntry(vendor).trustWorktree?.(worktreePath)}catch{}}var init_trust_worktree=__esm(()=>{init_engine_presets()});function snapshotShape(value){if(value===null)return"null";if(Array.isArray(value))return`Array(${value.length})`;if(value instanceof Map)return`Map(${value.size})`;if(value instanceof Set)return`Set(${value.size})`;if(typeof value==="string")return`string(${value.length})`;if(typeof value==="number"||typeof value==="boolean"||typeof value>"u")return String(value);if(typeof value==="object")return`Object(${Object.keys(value).length})`;return typeof value}function recordStateChange(label,before,after){if(recentStateChanges.push(`${new Date().toISOString()} ${label}: ${snapshotShape(before)} -> ${snapshotShape(after)}`),recentStateChanges.length>64)recentStateChanges.splice(0,recentStateChanges.length-64)}function recentStateChangesForDiagnostics(){return recentStateChanges}function createStateCell(initial,debugLabel){let snapshot=initial,listeners=new Set,state=()=>snapshot;return state.get=state,state.set=(next)=>{if(Object.is(next,snapshot))return;if(debugLabel)recordStateChange(debugLabel,snapshot,next);snapshot=next;for(let listener of[...listeners])listener()},state.update=(fn)=>state.set(fn(snapshot)),state.subscribe=(listener)=>{return listeners.add(listener),()=>{listeners.delete(listener)}},state}function mapReadableState(source,map){let get=()=>map(source.get()),derived=get;return derived.get=get,derived.subscribe=source.subscribe,derived}var recentStateChanges,createExternalStore;var init_external_store=__esm(()=>{recentStateChanges=[];createExternalStore=createStateCell});function lookup(catalog,key){let node=catalog;for(let part of key.split("."))if(node&&typeof node==="object"&&part in node)node=node[part];else return;return typeof node==="string"?node:void 0}function interpolate(template,params){if(!params)return template;return template.replace(/\{(\w+)\}/g,(whole,name)=>(name in params)?String(params[name]):whole)}function lookupKeys(catalog,group,key){return catalog.keys[group]?.[key]}function setLocaleLang(lang){if(CATALOGS[lang])langState.set(lang)}function currentLang(){return langState.get()}function localeState(){return langState}function t(key,params){let lang=langState.get(),resolved=lookup(CATALOGS[lang],key)??lookup(CATALOGS.en,key)??key;return interpolate(resolved,params)}function tKeys(group,key){let lang=langState.get();return lookupKeys(CATALOGS[lang],group,key)??lookupKeys(CATALOGS.en,group,key)??key}var langState;var init_i18n=__esm(()=>{init_external_store();init_catalog();init_catalog();langState=createStateCell(DEFAULT_LOCALE)});import*as fs from"fs";import*as os from"os";function pathLeaf(p){return p.slice(p.lastIndexOf("/")+1)}function expandHome(p){if(p==="~")return os.homedir();if(p.startsWith("~/"))return os.homedir()+p.slice(1);return p}function splitPathForDirSuggest(value){if(!value)return{base:"",filter:""};let expanded=expandHome(value==="~"?"~/":value);if(expanded.endsWith("/"))return{base:expanded,filter:""};let lastSlash=expanded.lastIndexOf("/");if(lastSlash===-1)return{base:"",filter:expanded};return{base:expanded.slice(0,lastSlash+1),filter:expanded.slice(lastSlash+1)}}function listSubdirs(base){if(!base)return[];try{let entries=fs.readdirSync(base,{withFileTypes:!0}),out=[];for(let e of entries)if(e.isDirectory())out.push(e.name);return out.sort((a,b)=>a.localeCompare(b))}catch{return[]}}function filterSubdirs(all,filter){let f=filter.toLowerCase(),visible=f.startsWith(".")?all:all.filter((n)=>!n.startsWith("."));if(!f)return visible;return visible.filter((n)=>n.toLowerCase().startsWith(f))}function joinPicked(typedValue,baseExpanded,name){let out=baseExpanded+name;if(typedValue.startsWith("~")){let home=os.homedir();if(out===home)return"~";if(out.startsWith(`${home}/`))return`~${out.slice(home.length)}`}return out}var init_path_helpers=()=>{};function depth(node){return node.kind==="leaf"?0:1+Math.max(...node.children.map(depth))}function siblingCount(root,id,orientation){let find=(node)=>{if(node.kind==="leaf")return null;if(node.orientation===orientation&&node.children.some((c)=>c.kind==="leaf"&&c.id===id))return node.children.length;for(let child of node.children){let n=find(child);if(n!==null)return n}return null};return find(root)??1}function splitFits(state,orientation,activeSize){let extent=orientation==="row"?activeSize.cols:activeSize.rows,min=orientation==="row"?20:6,n=siblingCount(state.root,state.activeLeafId,orientation);return Math.floor(extent*n/(n+1))-1>=min}function initialSplit(content){return{root:{kind:"leaf",id:"leaf-1",content},activeLeafId:"leaf-1",nextOrdinal:2}}function leaves(node){return node.kind==="leaf"?[node]:node.children.flatMap(leaves)}function splitActive(state,orientation,content,activeSize){if(activeSize&&!splitFits(state,orientation,activeSize))return state;let leaf={kind:"leaf",id:`leaf-${state.nextOrdinal}`,content},insert=(node)=>{if(node.kind==="leaf"){if(node.id!==state.activeLeafId)return node;return{kind:"group",orientation,children:[node,leaf]}}if(node.orientation===orientation){let i=node.children.findIndex((c)=>c.kind==="leaf"&&c.id===state.activeLeafId);if(i>=0){let children=[...node.children.slice(0,i+1),leaf,...node.children.slice(i+1)];return{...node,children}}}return{...node,children:node.children.map(insert)}},root=insert(state.root);if(!activeSize&&depth(root)>4)return state;return{root,activeLeafId:leaf.id,nextOrdinal:state.nextOrdinal+1}}function removeLeaf(state,id){let all=leaves(state.root);if(all.length<=1)return null;let prune=(node)=>{if(node.kind==="leaf")return node.id===id?null:node;let children=node.children.map(prune).filter((c)=>c!==null);if(children.length===0)return null;if(children.length===1)return children[0];return{...node,children}},root=prune(state.root);if(root===null)return null;if(leaves(root).length===all.length)return state;let order=all.map((l)=>l.id),removedIdx=order.indexOf(id),fallback=order[removedIdx>0?removedIdx-1:removedIdx+1],activeLeafId=state.activeLeafId===id?fallback:state.activeLeafId;return{...state,root,activeLeafId}}function renameLeaf(state,id,title){let trimmed=title.trim(),next=trimmed.length>0?trimmed:null,walk=(node)=>node.kind==="leaf"?node.id===id?{...node,title:next}:node:{...node,children:node.children.map(walk)};if(!leaves(state.root).some((l)=>l.id===id))return state;return{...state,root:walk(state.root)}}function cycleLeaf(state,delta){let order=leaves(state.root).map((l)=>l.id);if(order.length<=1)return state;let i=order.indexOf(state.activeLeafId),next=order[(i+delta+order.length)%order.length];return{...state,activeLeafId:next}}function hasEngineLeaf(tree){return!tree||leaves(tree.root).some((l)=>l.id==="leaf-1")}function isTabSplit(tree){return tree?leaves(tree.root).length>1:!1}function collapseSplit(next){let ls=leaves(next.root);return ls.length===1&&ls[0]?.id==="leaf-1"?null:next}function splitLeafPtyKey(tabKey,leafId){return leafId==="leaf-1"?tabKey:`${tabKey}::${leafId}`}function splitLeafNames(leafList,tabCommand,engineTitle,liveTitles){let basename6=(argv)=>{let head=(argv??tabCommand)[0]??"",name=pathLeaf(head);return name.length>0?name:"?"},seen=new Map,out=new Map;for(let leaf of leafList){if(leaf.title){out.set(leaf.id,leaf.title);continue}let name=leaf.content===null?engineTitle||liveTitles?.get(leaf.id)||basename6(leaf.content):liveTitles?.get(leaf.id)||SHELL_LEAF_NAME,n=(seen.get(name)??0)+1;seen.set(name,n),out.set(leaf.id,n===1?name:`${name} ${n}`)}return out}function meaningfulAutoTitle(autoTitle){let trimmed=(autoTitle??"").trim();if(trimmed.length<3)return null;if(/^[\d\s\p{P}\p{S}]+$/u.test(trimmed))return null;return trimmed}function stableRecordedTitle(raw,vendor){let recorded=raw?.trim();if(!recorded)return null;let cleaned=stripEngineStatusPrefix(recorded,vendor);if(cleaned===recorded&&isEngineDecoration(recorded,vendor))return null;if(isEnginePlaceholderTitle(cleaned,vendor))return null;return cleaned||null}function isEngineDecoration(text,vendor){let glyphs=new Set(engineStatusPrefixes(vendor));return[...text].every((ch)=>ch.trim().length===0||glyphs.has(ch))}function tabTitleStable(tab,taskVendor,liveVendor,liveTitle){if(liveVendor===null&&tab.kind==="engine")return tabTitle({...tab,kind:"command",lastTitle:null},taskVendor);let vendor=liveVendor??tab.liveVendor??(tab.kind==="engine"?tab.vendor??taskVendor:void 0)??void 0,source=liveTitle?.trim()||tab.lastTitle,named=vendor?stableRecordedTitle(source,vendor):source??null;if(!vendor||engineEntry(vendor).terminalTitle?.ownsStatus!==!0)return tabTitle({...tab,lastTitle:named},taskVendor);return tabTitle({...tab,kind:"engine",vendor,lastTitle:named},taskVendor)}function titleVendor(tab,taskVendor){return tab.liveVendor??(tab.kind==="engine"?tab.vendor:void 0)??taskVendor}function tabTitle(tab,taskVendor,liveName){if(tab.title)return tab.title;let ls=tab.splitTree?leaves(tab.splitTree.root):[];if(ls.length>1)return t("terminal.tab.groupTitle",{n:tab.ordinal});let sole=ls.length===1?ls[0]:void 0;if(sole&&sole.id!=="leaf-1")return sole.title??`${liveName??SHELL_LEAF_NAME} ${tab.ordinal}`;let vendor=titleVendor(tab,taskVendor);if(liveName&&!isEnginePlaceholderTitle(liveName,vendor))return`${liveName} ${tab.ordinal}`;if(tab.lastTitle&&!isEnginePlaceholderTitle(tab.lastTitle,vendor))return`${tab.lastTitle} ${tab.ordinal}`;let auto=meaningfulAutoTitle(tab.autoTitle);if(auto)return auto;return`${tab.kind==="engine"?engineEntry(tab.vendor??taskVendor).defaultCommand[0]??SHELL_LEAF_NAME:SHELL_LEAF_NAME} ${tab.ordinal}`}function visibleNativeStatus(tab,taskVendor,vendor,liveName){if(!vendor||!liveName)return!1;if(engineEntry(vendor).terminalTitle?.ownsStatus!==!0)return!1;return tabTitle(tab,taskVendor,liveName)===`${liveName} ${tab.ordinal}`}var SHELL_LEAF_NAME="shell";var init_terminal_tab_split=__esm(()=>{init_registry();init_i18n();init_path_helpers()});function initialTabs(){return{tabs:[{kind:"engine",id:"tab-1",title:null,ordinal:1}],activeId:"tab-1",nextOrdinal:2}}function reopenHintFor(closed){if(closed?.kind==="command")return{kind:"command"};if(closed?.kind==="engine"&&closed.vendor)return{kind:"engine",vendor:closed.vendor};return{kind:"engine"}}function reopenTabs(state,shell){let ordinal=state.nextOrdinal,id=`tab-${ordinal}`,next=state.nextOrdinal+1;if(state.reopenAs?.kind==="command")return{tabs:[{kind:"command",id,title:null,ordinal,command:[shell]}],activeId:id,nextOrdinal:next};let vendor=state.reopenAs?.kind==="engine"?state.reopenAs.vendor:void 0;return{tabs:[{kind:"engine",id,title:null,ordinal,...vendor?{vendor}:{}}],activeId:id,nextOrdinal:next}}function initialShellTabs(shell){return{tabs:[{kind:"command",id:"tab-1",title:null,ordinal:1,command:[shell]}],activeId:"tab-1",nextOrdinal:2}}function rehydrateTabs(persisted,shell,opts={}){let tabs=persisted.tabs.map((t2)=>t2.kind==="command"?{...t2,command:shell,purpose:void 0}:t2);if(tabs.length===0)return opts.allowEmpty?persisted:initialTabs();let activeId=tabs.some((t2)=>t2.id===persisted.activeId)?persisted.activeId:tabs[0].id,maxOrdinal=tabs.reduce((max,t2)=>Math.max(max,t2.ordinal),0);return{tabs,activeId,nextOrdinal:Math.max(persisted.nextOrdinal,maxOrdinal+1)}}function recycleTabs(state,prev){let ordinal=state.nextOrdinal,id=`tab-${ordinal}`,pinned=prev.kind==="engine"?prev:void 0;return{tabs:[{kind:"engine",id,ordinal,title:prev.title,autoTitle:prev.autoTitle,...pinned?.vendor?{vendor:pinned.vendor}:{},...pinned?.engineCommand?{engineCommand:pinned.engineCommand}:{}}],activeId:id,nextOrdinal:ordinal+1}}function engineTabArgv(tab,base,live,fallbackVendor){if(tab.forkFrom&&!tab.spawned&&!live){let forked=tab.vendor?engineForkArgv(base,tab.vendor,tab.forkFrom,tab.sessionId??null):null;if(forked)return forked}if(!tab.sessionId)return base;let vendor=tab.vendor??fallbackVendor;if(tab.spawned&&!live)return engineResumeArgv(base,vendor,tab.sessionId)??base;return withPinnedSessionId(base,vendor,()=>tab.sessionId).argv}function engineTabSpawnFor(state,tab,base,opts){let{live,shell,prompt}=opts,firstEngine=state.tabs.find((t2)=>t2.kind==="engine"),fresh=!tab.spawned&&!live,tabPrompt=fresh?tab.initialPrompt?.trim():void 0,wantsPrompt=!!prompt&&tab.id===firstEngine?.id&&fresh,isFreshFirstEngine=tab.id===firstEngine?.id&&fresh,promptIntent=tabPrompt?{kind:"explicit",prompt:tabPrompt}:wantsPrompt?{kind:"new-task",prompt}:isFreshFirstEngine?{kind:"repo-init"}:{kind:"none"},ref=tab.ptyTask;trustEngineWorktree(tab.vendor??opts.task.vendor,ref?.worktree??opts.worktreePath);let launch=buildEngineSessionLaunch({task:ref?{...opts.task,id:ref.id,kind:"task"}:opts.task,worktreePath:ref?.worktree??opts.worktreePath,shell,argv:engineTabArgv(tab,base,live,opts.task.vendor),promptIntent,protocolGates:opts.protocolGates,tabId:ref?"tab-1":tab.id});return{command:launch.command,...launch.firstMessage?{firstMessage:launch.firstMessage,engineBin:base[0]}:{}}}function tabExitAction(tab,deadOnAttach,resumeTried){if(tab.kind==="engine"&&deadOnAttach&&!!tab.sessionId&&tab.spawned&&!resumeTried)return"resume";return"close"}var init_terminal_tab_argv=__esm(()=>{init_session_launch();init_trust_worktree();init_engine_presets()});function shellCommandLine(argv){return argv.map((a)=>SHELL_SAFE_ARG.test(a)?a:`'${a.replaceAll("'","'\\''")}'`).join(" ")}function shellIdentityInput(taskId,tabId){let task=shellCommandLine([taskId]),tab=shellCommandLine([tabId]);return` export ROVE_TASK_ID=${task} KOBE_TASK_ID=${task} ROVE_TAB_ID=${tab} KOBE_TAB_ID=${tab} && clear\r`}var SHELL_SAFE_ARG;var init_terminal_tab_spawn=__esm(()=>{SHELL_SAFE_ARG=/^[A-Za-z0-9@%+=:,./_-]+$/});function insertAfterActive(state,tab){let i=state.tabs.findIndex((t2)=>t2.id===state.activeId);return{tabs:[...state.tabs.slice(0,i+1),tab,...state.tabs.slice(i+1)],activeId:tab.id,nextOrdinal:state.nextOrdinal+1}}function addTab(state,vendor){let ordinal=state.nextOrdinal;return insertAfterActive(state,{kind:"engine",id:`tab-${ordinal}`,title:null,ordinal,vendor})}function openCommandTab(state,command,label){let ordinal=state.nextOrdinal;return insertAfterActive(state,{kind:"command",id:`tab-${ordinal}`,title:label,ordinal,command})}function findEditorTab(state){return state.tabs.find((tab)=>tab.kind==="command"&&tab.purpose==="editor")}function openEditorTab(state,command,label){let existing=findEditorTab(state);if(!existing){let ordinal=state.nextOrdinal;return insertAfterActive(state,{kind:"command",id:`tab-${ordinal}`,title:label,ordinal,command,purpose:"editor"})}let tabs=state.tabs.map((tab)=>tab.id===existing.id?{...existing,title:label,command,splitTree:null}:tab);return{...state,tabs,activeId:existing.id}}function findContentTab(state){return state.tabs.find((tab)=>tab.kind==="content")}function openContentTab(state,relPath,label,base){let existing=findContentTab(state);if(!existing){let ordinal=state.nextOrdinal;return insertAfterActive(state,{kind:"content",id:`tab-${ordinal}`,title:label,ordinal,relPath,base})}let tabs=state.tabs.map((tab)=>tab.id===existing.id?{...existing,title:label,relPath,base}:tab);return{...state,tabs,activeId:existing.id}}function closeTab(state,id,opts={}){if(state.tabs.length<=1&&!opts.allowEmpty)return{state,closedId:null};let i=state.tabs.findIndex((t2)=>t2.id===id);if(i<0)return{state,closedId:null};let tabs=state.tabs.filter((t2)=>t2.id!==id);if(state.activeId!==id)return{state:{...state,tabs},closedId:id};if(tabs.length===0)return{state:{...state,tabs,activeId:id,reopenAs:reopenHintFor(state.tabs[i])},closedId:id};let next=tabs[Math.max(0,i-1)];return{state:{...state,tabs,activeId:(next??tabs[0]).id},closedId:id}}function closeActiveTab(state){return closeTab(state,state.activeId)}function renameActiveTab(state,title){let trimmed=title.trim(),tabs=state.tabs.map((t2)=>t2.id===state.activeId?{...t2,title:trimmed.length>0?trimmed:null}:t2);return{...state,tabs}}function setTabSessionId(state,id,sessionId){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"?{...t2,sessionId}:t2);return{...state,tabs}}function setTabForkFrom(state,id,sourceSessionId){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"?{...t2,forkFrom:sourceSessionId}:t2);return{...state,tabs}}function setTabEngineCommand(state,id,command){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"?{...t2,engineCommand:command}:t2);return{...state,tabs}}function setTabInitialPrompt(state,id,prompt){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"?{...t2,initialPrompt:prompt}:t2);return{...state,tabs}}function setTabLastTitle(state,id,lastTitle){if(lastTitle.length===0)return state;let current=state.tabs.find((t2)=>t2.id===id);if(!current||current.lastTitle===lastTitle)return state;let tabs=state.tabs.map((t2)=>t2.id===id?{...t2,lastTitle}:t2);return{...state,tabs}}function setTabLiveVendor(state,id,liveVendor){let current=state.tabs.find((t2)=>t2.id===id);if(!current||(current.liveVendor??null)===liveVendor)return state;let tabs=state.tabs.map((t2)=>t2.id===id?{...t2,liveVendor}:t2);return{...state,tabs}}function setTabAutoTitle(state,id,autoTitle){let tabs=state.tabs.map((t2)=>t2.id===id?{...t2,autoTitle}:t2);return{...state,tabs}}function setTabSpawned(state,id,spawned){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"&&!t2.spawned!==!spawned?{...t2,spawned}:t2);return{...state,tabs}}function cycleTab(state,delta){let n=state.tabs.length;if(n<=1)return state;let i=state.tabs.findIndex((t2)=>t2.id===state.activeId),next=state.tabs[(i+delta+n)%n];return{...state,activeId:next.id}}function moveTab(state,id,delta){let i=state.tabs.findIndex((t2)=>t2.id===id),j=i+delta;if(i<0||j<0||j>=state.tabs.length)return state;let tabs=[...state.tabs],a=tabs[i];return tabs[i]=tabs[j],tabs[j]=a,{...state,tabs}}function selectTab(state,id){if(state.activeId===id||!state.tabs.some((t2)=>t2.id===id))return state;return{...state,activeId:id}}function setTabSplit(state,id,tree){if(!state.tabs.some((t2)=>t2.id===id))return state;let tabs=state.tabs.map((t2)=>t2.id===id?{...t2,splitTree:tree}:t2);return{...state,tabs}}function tabPtyKey(taskId,tabId){return`${taskId}::${tabId}`}function tabPtyKeyFor(taskId,tab){if(tab.kind==="engine"&&tab.ptyTask)return tabPtyKey(tab.ptyTask.id,"tab-1");return tabPtyKey(taskId,tab.id)}function tabCwdFor(tab,taskWorktree){if(tab.kind==="engine"&&tab.ptyTask)return tab.ptyTask.worktree;return taskWorktree}var init_terminal_tabs_core=__esm(()=>{init_terminal_tab_split();init_terminal_tab_argv();init_terminal_tab_spawn()});var exports_daemon_session={};__export(exports_daemon_session,{withDaemonSession:()=>withDaemonSession,resolveActiveTaskId:()=>resolveActiveTaskId,openDaemonSession:()=>openDaemonSession});async function openDaemonSession(opts={}){let client=opts.mode==="require-running"?await connectIfRunning():await connectOrStartDaemon();if(!client)return null;return{client,close:()=>client.close()}}async function withDaemonSession(work,opts={}){let session=await openDaemonSession(opts);try{return await work(session?.client??null)}finally{session?.close()}}async function resolveActiveTaskId(client){let activeId=null,off=client.onChannel("active-task",(payload)=>{activeId=payload.taskId});try{await client.subscribe()}finally{off()}return activeId}var init_daemon_session=__esm(()=>{init_daemon_process()});function terminalTabsKey(taskId){return`terminalTabs.${taskId}`}function forgetTaskTabsSnapshot(kv,taskId){let key=terminalTabsKey(taskId);if(kv.store[key]===void 0)return;kv.set(key,void 0)}function sweepOrphanTabsSnapshots(kv,liveTaskIds){let live=new Set(liveTaskIds),swept=0;for(let key of Object.keys(kv.store)){if(!key.startsWith("terminalTabs."))continue;let taskId=key.slice(13);if(live.has(taskId))continue;kv.set(key,void 0),swept++}return swept}function readTabsSnapshot(taskId){try{let snap=loadStateFile()[terminalTabsKey(taskId)];return snap&&Array.isArray(snap.tabs)?snap:void 0}catch{return}}function closeTabsSnapshot(taskId,tabId){let closing,key=terminalTabsKey(taskId);return updateStateFile((store)=>{let state=store[key];if(!state||!Array.isArray(state.tabs))return!1;if(closing=state.tabs.find((tab)=>tab.id===tabId),!closing)return!1;let{state:next,closedId}=closeTab(state,tabId,{allowEmpty:!0});if(!closedId)return closing=void 0,!1;store[key]=next;return}),closing}function unregisteredTabIds(snapshot,taskId,sessions){let known=new Set((snapshot?.tabs??[]).map((t2)=>t2.id)),prefix=`${taskId}::`,out=[];for(let s of sessions){if(!s.alive||!s.key.startsWith(prefix))continue;let tabId=s.key.slice(prefix.length);if(tabId.includes("::"))continue;if(!known.has(tabId)&&!out.includes(tabId))out.push(tabId)}return out}function joinTaskTabs(snapshot,taskId,sessions,persistedExits={},liveVendors){let alive=aliveKeysOf(sessions),sessionExits=new Map(sessions.map((s)=>[s.key,s.exit])),deadExit=(key)=>{let ex=abnormalExit(sessionExits.get(key)??persistedExits[key]);if(!ex)return null;let record=persistedExits[key],tail=record?.at===ex.at?record.tail:void 0;return{code:ex.code,signal:ex.signal,at:ex.at,...tail&&tail.length>0?{tail}:{}}},rows=(snapshot?.tabs??[]).map((t2)=>{let key=`${taskId}::${t2.id}`,isAlive=alive.has(key),walked=isAlive&&liveVendors?.has(key)===!0?liveVendors.get(key)??null:void 0;return{id:t2.id,kind:t2.kind,title:t2.title??null,vendor:t2.vendor??null,liveVendor:walked!==void 0?walked:t2.liveVendor??null,lastTitle:t2.lastTitle??null,autoTitle:t2.autoTitle??null,alive:isAlive,exit:isAlive?null:deadExit(key)}});for(let tabId of unregisteredTabIds(snapshot,taskId,sessions))rows.push({id:tabId,kind:"engine",title:null,vendor:null,liveVendor:null,lastTitle:null,autoTitle:null,alive:!0,exit:null,unregistered:!0});return rows}function hasLiveEngineTab(snapshot,taskId,sessions){let alive=aliveKeysOf(sessions);if(alive.has(`${taskId}::tab-1`))return!0;return(snapshot?.tabs??[]).some((t2)=>t2.kind==="engine"&&alive.has(`${taskId}::${t2.id}`))}function publishCliTabSnapshot(taskId,sessionId){if(!taskId)return;try{let key=terminalTabsKey(taskId);if(loadStateFile()[key]!==void 0)return;let seeded=initialTabs();patchStateFile({[key]:sessionId?{...seeded,tabs:seeded.tabs.map((t2)=>t2.kind==="engine"?{...t2,sessionId,spawned:!0}:t2)}:seeded})}catch{}}function markCliTabSession(taskId,tabId,sessionId){try{let key=terminalTabsKey(taskId),existing=loadStateFile()[key];if(!existing||!Array.isArray(existing.tabs))return;patchStateFile({[key]:{...existing,tabs:existing.tabs.map((t2)=>t2.id===tabId&&t2.kind==="engine"?{...t2,sessionId,spawned:!0}:t2)}})}catch{}}function mintCliTab(taskId,vendor,command){let tabId="tab-1";try{let key=terminalTabsKey(taskId),existing=loadStateFile()[key],state=existing&&Array.isArray(existing.tabs)&&existing.tabs.length>0?existing:initialTabs(),ordinal=typeof state.nextOrdinal==="number"&&state.nextOrdinal>1?state.nextOrdinal:2;tabId=`tab-${ordinal}`,patchStateFile({[key]:{...state,tabs:[...state.tabs,{kind:"engine",id:tabId,title:null,ordinal,...vendor?{vendor}:{},...command?{engineCommand:command}:{}}],activeId:tabId,nextOrdinal:ordinal+1}})}catch{tabId=`tab-cli-${Date.now().toString(36)}`}return tabId}var aliveKeysOf=(sessions)=>new Set(sessions.filter((s)=>s.alive).map((s)=>s.key)),abnormalExit=(exit)=>exit&&(exit.code!==0||exit.signal!==null)?exit:null;var init_tab_snapshot=__esm(()=>{init_store();init_terminal_tabs_core()});function breakRowsOnCursorMotion(raw){return raw.replace(CURSOR_DOWN_RE,(_m,count)=>`
366
+ ${prompt}`}var selfSessionOnce,identityWarning=null;var init_dispatcher2=__esm(()=>{init_interactive_command();init_rename_compat();init_types()});function trustEngineWorktree(vendor,worktreePath){try{protocolEntry(vendor).trustWorktree?.(worktreePath)}catch{}}var init_trust_worktree=__esm(()=>{init_engine_presets()});function snapshotShape(value){if(value===null)return"null";if(Array.isArray(value))return`Array(${value.length})`;if(value instanceof Map)return`Map(${value.size})`;if(value instanceof Set)return`Set(${value.size})`;if(typeof value==="string")return`string(${value.length})`;if(typeof value==="number"||typeof value==="boolean"||typeof value>"u")return String(value);if(typeof value==="object")return`Object(${Object.keys(value).length})`;return typeof value}function recordStateChange(label,before,after){if(recentStateChanges.push(`${new Date().toISOString()} ${label}: ${snapshotShape(before)} -> ${snapshotShape(after)}`),recentStateChanges.length>64)recentStateChanges.splice(0,recentStateChanges.length-64)}function recentStateChangesForDiagnostics(){return recentStateChanges}function createStateCell(initial,debugLabel){let snapshot=initial,listeners=new Set,state=()=>snapshot;return state.get=state,state.set=(next)=>{if(Object.is(next,snapshot))return;if(debugLabel)recordStateChange(debugLabel,snapshot,next);snapshot=next;for(let listener of[...listeners])listener()},state.update=(fn)=>state.set(fn(snapshot)),state.subscribe=(listener)=>{return listeners.add(listener),()=>{listeners.delete(listener)}},state}function mapReadableState(source,map){let get=()=>map(source.get()),derived=get;return derived.get=get,derived.subscribe=source.subscribe,derived}var recentStateChanges;var init_external_store=__esm(()=>{recentStateChanges=[]});function lookup(catalog,key){let node=catalog;for(let part of key.split("."))if(node&&typeof node==="object"&&part in node)node=node[part];else return;return typeof node==="string"?node:void 0}function interpolate(template,params){if(!params)return template;return template.replace(/\{(\w+)\}/g,(whole,name)=>(name in params)?String(params[name]):whole)}function lookupKeys(catalog,group,key){return catalog.keys[group]?.[key]}function setLocaleLang(lang){if(CATALOGS[lang])langState.set(lang)}function currentLang(){return langState.get()}function localeState(){return langState}function t(key,params){let lang=langState.get(),resolved=lookup(CATALOGS[lang],key)??lookup(CATALOGS.en,key)??key;return interpolate(resolved,params)}function tKeys(group,key){let lang=langState.get();return lookupKeys(CATALOGS[lang],group,key)??lookupKeys(CATALOGS.en,group,key)??key}var langState;var init_i18n=__esm(()=>{init_external_store();init_catalog();init_catalog();langState=createStateCell(DEFAULT_LOCALE)});import*as fs from"fs";import*as os from"os";function pathLeaf(p){return p.slice(p.lastIndexOf("/")+1)}function expandHome(p){if(p==="~")return os.homedir();if(p.startsWith("~/"))return os.homedir()+p.slice(1);return p}function splitPathForDirSuggest(value){if(!value)return{base:"",filter:""};let expanded=expandHome(value==="~"?"~/":value);if(expanded.endsWith("/"))return{base:expanded,filter:""};let lastSlash=expanded.lastIndexOf("/");if(lastSlash===-1)return{base:"",filter:expanded};return{base:expanded.slice(0,lastSlash+1),filter:expanded.slice(lastSlash+1)}}function listSubdirs(base){if(!base)return[];try{let entries=fs.readdirSync(base,{withFileTypes:!0}),out=[];for(let e of entries)if(e.isDirectory())out.push(e.name);return out.sort((a,b)=>a.localeCompare(b))}catch{return[]}}function filterSubdirs(all,filter){let f=filter.toLowerCase(),visible=f.startsWith(".")?all:all.filter((n)=>!n.startsWith("."));if(!f)return visible;return visible.filter((n)=>n.toLowerCase().startsWith(f))}function joinPicked(typedValue,baseExpanded,name){let out=baseExpanded+name;if(typedValue.startsWith("~")){let home=os.homedir();if(out===home)return"~";if(out.startsWith(`${home}/`))return`~${out.slice(home.length)}`}return out}var init_path_helpers=()=>{};function depth(node){return node.kind==="leaf"?0:1+Math.max(...node.children.map(depth))}function siblingCount(root,id,orientation){let find=(node)=>{if(node.kind==="leaf")return null;if(node.orientation===orientation&&node.children.some((c)=>c.kind==="leaf"&&c.id===id))return node.children.length;for(let child of node.children){let n=find(child);if(n!==null)return n}return null};return find(root)??1}function splitFits(state,orientation,activeSize){let extent=orientation==="row"?activeSize.cols:activeSize.rows,min=orientation==="row"?20:6,n=siblingCount(state.root,state.activeLeafId,orientation);return Math.floor(extent*n/(n+1))-1>=min}function initialSplit(content){return{root:{kind:"leaf",id:"leaf-1",content},activeLeafId:"leaf-1",nextOrdinal:2}}function leaves(node){return node.kind==="leaf"?[node]:node.children.flatMap(leaves)}function splitActive(state,orientation,content,activeSize){if(activeSize&&!splitFits(state,orientation,activeSize))return state;let leaf={kind:"leaf",id:`leaf-${state.nextOrdinal}`,content},insert=(node)=>{if(node.kind==="leaf"){if(node.id!==state.activeLeafId)return node;return{kind:"group",orientation,children:[node,leaf]}}if(node.orientation===orientation){let i=node.children.findIndex((c)=>c.kind==="leaf"&&c.id===state.activeLeafId);if(i>=0){let children=[...node.children.slice(0,i+1),leaf,...node.children.slice(i+1)];return{...node,children}}}return{...node,children:node.children.map(insert)}},root=insert(state.root);if(!activeSize&&depth(root)>4)return state;return{root,activeLeafId:leaf.id,nextOrdinal:state.nextOrdinal+1}}function removeLeaf(state,id){let all=leaves(state.root);if(all.length<=1)return null;let prune=(node)=>{if(node.kind==="leaf")return node.id===id?null:node;let children=node.children.map(prune).filter((c)=>c!==null);if(children.length===0)return null;if(children.length===1)return children[0];return{...node,children}},root=prune(state.root);if(root===null)return null;if(leaves(root).length===all.length)return state;let order=all.map((l)=>l.id),removedIdx=order.indexOf(id),fallback=order[removedIdx>0?removedIdx-1:removedIdx+1],activeLeafId=state.activeLeafId===id?fallback:state.activeLeafId;return{...state,root,activeLeafId}}function renameLeaf(state,id,title){let trimmed=title.trim(),next=trimmed.length>0?trimmed:null,walk=(node)=>node.kind==="leaf"?node.id===id?{...node,title:next}:node:{...node,children:node.children.map(walk)};if(!leaves(state.root).some((l)=>l.id===id))return state;return{...state,root:walk(state.root)}}function cycleLeaf(state,delta){let order=leaves(state.root).map((l)=>l.id);if(order.length<=1)return state;let i=order.indexOf(state.activeLeafId),next=order[(i+delta+order.length)%order.length];return{...state,activeLeafId:next}}function hasEngineLeaf(tree){return!tree||leaves(tree.root).some((l)=>l.id==="leaf-1")}function isTabSplit(tree){return tree?leaves(tree.root).length>1:!1}function collapseSplit(next){let ls=leaves(next.root);return ls.length===1&&ls[0]?.id==="leaf-1"?null:next}function splitLeafPtyKey(tabKey,leafId){return leafId==="leaf-1"?tabKey:`${tabKey}::${leafId}`}function splitLeafNames(leafList,tabCommand,engineTitle,liveTitles){let basename6=(argv)=>{let head=(argv??tabCommand)[0]??"",name=pathLeaf(head);return name.length>0?name:"?"},seen=new Map,out=new Map;for(let leaf of leafList){if(leaf.title){out.set(leaf.id,leaf.title);continue}let name=leaf.content===null?engineTitle||liveTitles?.get(leaf.id)||basename6(leaf.content):liveTitles?.get(leaf.id)||SHELL_LEAF_NAME,n=(seen.get(name)??0)+1;seen.set(name,n),out.set(leaf.id,n===1?name:`${name} ${n}`)}return out}function meaningfulAutoTitle(autoTitle){let trimmed=(autoTitle??"").trim();if(trimmed.length<3)return null;if(/^[\d\s\p{P}\p{S}]+$/u.test(trimmed))return null;return trimmed}function stableRecordedTitle(raw,vendor){let recorded=raw?.trim();if(!recorded)return null;let cleaned=stripEngineStatusPrefix(recorded,vendor);if(cleaned===recorded&&isEngineDecoration(recorded,vendor))return null;if(isEnginePlaceholderTitle(cleaned,vendor))return null;return cleaned||null}function isEngineDecoration(text,vendor){let glyphs=new Set(engineStatusPrefixes(vendor));return[...text].every((ch)=>ch.trim().length===0||glyphs.has(ch))}function tabTitleStable(tab,taskVendor,liveVendor,liveTitle){if(liveVendor===null&&tab.kind==="engine")return tabTitle({...tab,kind:"command",lastTitle:null},taskVendor);let vendor=liveVendor??tab.liveVendor??(tab.kind==="engine"?tab.vendor??taskVendor:void 0)??void 0,source=liveTitle?.trim()||tab.lastTitle,named=vendor?stableRecordedTitle(source,vendor):source??null;if(!vendor||engineEntry(vendor).terminalTitle?.ownsStatus!==!0)return tabTitle({...tab,lastTitle:named},taskVendor);return tabTitle({...tab,kind:"engine",vendor,lastTitle:named},taskVendor)}function titleVendor(tab,taskVendor){return tab.liveVendor??(tab.kind==="engine"?tab.vendor:void 0)??taskVendor}function tabTitle(tab,taskVendor,liveName){if(tab.title)return tab.title;let ls=tab.splitTree?leaves(tab.splitTree.root):[];if(ls.length>1)return t("terminal.tab.groupTitle",{n:tab.ordinal});let sole=ls.length===1?ls[0]:void 0;if(sole&&sole.id!=="leaf-1")return sole.title??`${liveName??SHELL_LEAF_NAME} ${tab.ordinal}`;let vendor=titleVendor(tab,taskVendor);if(liveName&&!isEnginePlaceholderTitle(liveName,vendor))return`${liveName} ${tab.ordinal}`;if(tab.lastTitle&&!isEnginePlaceholderTitle(tab.lastTitle,vendor))return`${tab.lastTitle} ${tab.ordinal}`;let auto=meaningfulAutoTitle(tab.autoTitle);if(auto)return auto;return`${tab.kind==="engine"?engineEntry(tab.vendor??taskVendor).defaultCommand[0]??SHELL_LEAF_NAME:SHELL_LEAF_NAME} ${tab.ordinal}`}function visibleNativeStatus(tab,taskVendor,vendor,liveName){if(!vendor||!liveName)return!1;if(engineEntry(vendor).terminalTitle?.ownsStatus!==!0)return!1;return tabTitle(tab,taskVendor,liveName)===`${liveName} ${tab.ordinal}`}var SHELL_LEAF_NAME="shell";var init_terminal_tab_split=__esm(()=>{init_registry();init_i18n();init_path_helpers()});function initialTabs(){return{tabs:[{kind:"engine",id:"tab-1",title:null,ordinal:1}],activeId:"tab-1",nextOrdinal:2}}function reopenHintFor(closed){if(closed?.kind==="command")return{kind:"command"};if(closed?.kind==="engine"&&closed.vendor)return{kind:"engine",vendor:closed.vendor};return{kind:"engine"}}function reopenTabs(state,shell){let ordinal=state.nextOrdinal,id=`tab-${ordinal}`,next=state.nextOrdinal+1;if(state.reopenAs?.kind==="command")return{tabs:[{kind:"command",id,title:null,ordinal,command:[shell]}],activeId:id,nextOrdinal:next};let vendor=state.reopenAs?.kind==="engine"?state.reopenAs.vendor:void 0;return{tabs:[{kind:"engine",id,title:null,ordinal,...vendor?{vendor}:{}}],activeId:id,nextOrdinal:next}}function initialShellTabs(shell){return{tabs:[{kind:"command",id:"tab-1",title:null,ordinal:1,command:[shell]}],activeId:"tab-1",nextOrdinal:2}}function rehydrateTabs(persisted,shell,opts={}){let tabs=persisted.tabs.map((t2)=>t2.kind==="command"?{...t2,command:shell,purpose:void 0}:t2);if(tabs.length===0)return opts.allowEmpty?persisted:initialTabs();let activeId=tabs.some((t2)=>t2.id===persisted.activeId)?persisted.activeId:tabs[0].id,maxOrdinal=tabs.reduce((max,t2)=>Math.max(max,t2.ordinal),0);return{tabs,activeId,nextOrdinal:Math.max(persisted.nextOrdinal,maxOrdinal+1)}}function recycleTabs(state,prev){let ordinal=state.nextOrdinal,id=`tab-${ordinal}`,pinned=prev.kind==="engine"?prev:void 0;return{tabs:[{kind:"engine",id,ordinal,title:prev.title,autoTitle:prev.autoTitle,...pinned?.vendor?{vendor:pinned.vendor}:{},...pinned?.engineCommand?{engineCommand:pinned.engineCommand}:{}}],activeId:id,nextOrdinal:ordinal+1}}function engineTabArgv(tab,base,live,fallbackVendor){if(tab.forkFrom&&!tab.spawned&&!live){let forked=tab.vendor?engineForkArgv(base,tab.vendor,tab.forkFrom,tab.sessionId??null):null;if(forked)return forked}if(!tab.sessionId)return base;let vendor=tab.vendor??fallbackVendor;if(tab.spawned&&!live)return engineResumeArgv(base,vendor,tab.sessionId)??base;return withPinnedSessionId(base,vendor,()=>tab.sessionId).argv}function engineTabSpawnFor(state,tab,base,opts){let{live,shell,prompt}=opts,firstEngine=state.tabs.find((t2)=>t2.kind==="engine"),fresh=!tab.spawned&&!live,tabPrompt=fresh?tab.initialPrompt?.trim():void 0,wantsPrompt=!!prompt&&tab.id===firstEngine?.id&&fresh,isFreshFirstEngine=tab.id===firstEngine?.id&&fresh,promptIntent=tabPrompt?{kind:"explicit",prompt:tabPrompt}:wantsPrompt?{kind:"new-task",prompt}:isFreshFirstEngine?{kind:"repo-init"}:{kind:"none"},ref=tab.ptyTask;trustEngineWorktree(tab.vendor??opts.task.vendor,ref?.worktree??opts.worktreePath);let launch=buildEngineSessionLaunch({task:ref?{...opts.task,id:ref.id,kind:"task"}:opts.task,worktreePath:ref?.worktree??opts.worktreePath,shell,argv:engineTabArgv(tab,base,live,opts.task.vendor),promptIntent,protocolGates:opts.protocolGates,tabId:ref?"tab-1":tab.id});return{command:launch.command,...launch.firstMessage?{firstMessage:launch.firstMessage,engineBin:base[0]}:{}}}function tabExitAction(tab,deadOnAttach,resumeTried){if(tab.kind==="engine"&&deadOnAttach&&!!tab.sessionId&&tab.spawned&&!resumeTried)return"resume";return"close"}var init_terminal_tab_argv=__esm(()=>{init_session_launch();init_trust_worktree();init_engine_presets()});function shellCommandLine(argv){return argv.map((a)=>SHELL_SAFE_ARG.test(a)?a:`'${a.replaceAll("'","'\\''")}'`).join(" ")}function shellIdentityInput(taskId,tabId){let task=shellCommandLine([taskId]),tab=shellCommandLine([tabId]);return` export ROVE_TASK_ID=${task} KOBE_TASK_ID=${task} ROVE_TAB_ID=${tab} KOBE_TAB_ID=${tab} && clear\r`}var SHELL_SAFE_ARG;var init_terminal_tab_spawn=__esm(()=>{SHELL_SAFE_ARG=/^[A-Za-z0-9@%+=:,./_-]+$/});function insertAfterActive(state,tab){let i=state.tabs.findIndex((t2)=>t2.id===state.activeId);return{tabs:[...state.tabs.slice(0,i+1),tab,...state.tabs.slice(i+1)],activeId:tab.id,nextOrdinal:state.nextOrdinal+1}}function addTab(state,vendor){let ordinal=state.nextOrdinal;return insertAfterActive(state,{kind:"engine",id:`tab-${ordinal}`,title:null,ordinal,vendor})}function openCommandTab(state,command,label){let ordinal=state.nextOrdinal;return insertAfterActive(state,{kind:"command",id:`tab-${ordinal}`,title:label,ordinal,command})}function findEditorTab(state){return state.tabs.find((tab)=>tab.kind==="command"&&tab.purpose==="editor")}function openEditorTab(state,command,label){let existing=findEditorTab(state);if(!existing){let ordinal=state.nextOrdinal;return insertAfterActive(state,{kind:"command",id:`tab-${ordinal}`,title:label,ordinal,command,purpose:"editor"})}let tabs=state.tabs.map((tab)=>tab.id===existing.id?{...existing,title:label,command,splitTree:null}:tab);return{...state,tabs,activeId:existing.id}}function findContentTab(state){return state.tabs.find((tab)=>tab.kind==="content")}function openContentTab(state,relPath,label,base){let existing=findContentTab(state);if(!existing){let ordinal=state.nextOrdinal;return insertAfterActive(state,{kind:"content",id:`tab-${ordinal}`,title:label,ordinal,relPath,base})}let tabs=state.tabs.map((tab)=>tab.id===existing.id?{...existing,title:label,relPath,base}:tab);return{...state,tabs,activeId:existing.id}}function closeTab(state,id,opts={}){if(state.tabs.length<=1&&!opts.allowEmpty)return{state,closedId:null};let i=state.tabs.findIndex((t2)=>t2.id===id);if(i<0)return{state,closedId:null};let tabs=state.tabs.filter((t2)=>t2.id!==id);if(state.activeId!==id)return{state:{...state,tabs},closedId:id};if(tabs.length===0)return{state:{...state,tabs,activeId:id,reopenAs:reopenHintFor(state.tabs[i])},closedId:id};let next=tabs[Math.max(0,i-1)];return{state:{...state,tabs,activeId:(next??tabs[0]).id},closedId:id}}function closeActiveTab(state){return closeTab(state,state.activeId)}function renameActiveTab(state,title){let trimmed=title.trim(),tabs=state.tabs.map((t2)=>t2.id===state.activeId?{...t2,title:trimmed.length>0?trimmed:null}:t2);return{...state,tabs}}function setTabSessionId(state,id,sessionId){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"?{...t2,sessionId}:t2);return{...state,tabs}}function setTabForkFrom(state,id,sourceSessionId){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"?{...t2,forkFrom:sourceSessionId}:t2);return{...state,tabs}}function setTabEngineCommand(state,id,command){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"?{...t2,engineCommand:command}:t2);return{...state,tabs}}function setTabInitialPrompt(state,id,prompt){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"?{...t2,initialPrompt:prompt}:t2);return{...state,tabs}}function setTabLastTitle(state,id,lastTitle){if(lastTitle.length===0)return state;let current=state.tabs.find((t2)=>t2.id===id);if(!current||current.lastTitle===lastTitle)return state;let tabs=state.tabs.map((t2)=>t2.id===id?{...t2,lastTitle}:t2);return{...state,tabs}}function setTabLiveVendor(state,id,liveVendor){let current=state.tabs.find((t2)=>t2.id===id);if(!current||(current.liveVendor??null)===liveVendor)return state;let tabs=state.tabs.map((t2)=>t2.id===id?{...t2,liveVendor}:t2);return{...state,tabs}}function setTabAutoTitle(state,id,autoTitle){let tabs=state.tabs.map((t2)=>t2.id===id?{...t2,autoTitle}:t2);return{...state,tabs}}function setTabSpawned(state,id,spawned){let tabs=state.tabs.map((t2)=>t2.id===id&&t2.kind==="engine"&&!t2.spawned!==!spawned?{...t2,spawned}:t2);return{...state,tabs}}function cycleTab(state,delta){let n=state.tabs.length;if(n<=1)return state;let i=state.tabs.findIndex((t2)=>t2.id===state.activeId),next=state.tabs[(i+delta+n)%n];return{...state,activeId:next.id}}function moveTab(state,id,delta){let i=state.tabs.findIndex((t2)=>t2.id===id),j=i+delta;if(i<0||j<0||j>=state.tabs.length)return state;let tabs=[...state.tabs],a=tabs[i];return tabs[i]=tabs[j],tabs[j]=a,{...state,tabs}}function selectTab(state,id){if(state.activeId===id||!state.tabs.some((t2)=>t2.id===id))return state;return{...state,activeId:id}}function setTabSplit(state,id,tree){if(!state.tabs.some((t2)=>t2.id===id))return state;let tabs=state.tabs.map((t2)=>t2.id===id?{...t2,splitTree:tree}:t2);return{...state,tabs}}function tabPtyKey(taskId,tabId){return`${taskId}::${tabId}`}function tabPtyKeyFor(taskId,tab){if(tab.kind==="engine"&&tab.ptyTask)return tabPtyKey(tab.ptyTask.id,"tab-1");return tabPtyKey(taskId,tab.id)}function tabCwdFor(tab,taskWorktree){if(tab.kind==="engine"&&tab.ptyTask)return tab.ptyTask.worktree;return taskWorktree}var init_terminal_tabs_core=__esm(()=>{init_terminal_tab_split();init_terminal_tab_argv();init_terminal_tab_spawn()});var exports_daemon_session={};__export(exports_daemon_session,{withDaemonSession:()=>withDaemonSession,resolveActiveTaskId:()=>resolveActiveTaskId,openDaemonSession:()=>openDaemonSession});async function openDaemonSession(opts={}){let client=opts.mode==="require-running"?await connectIfRunning():await connectOrStartDaemon();if(!client)return null;return{client,close:()=>client.close()}}async function withDaemonSession(work,opts={}){let session=await openDaemonSession(opts);try{return await work(session?.client??null)}finally{session?.close()}}async function resolveActiveTaskId(client){let activeId=null,off=client.onChannel("active-task",(payload)=>{activeId=payload.taskId});try{await client.subscribe()}finally{off()}return activeId}var init_daemon_session=__esm(()=>{init_daemon_process()});function terminalTabsKey(taskId){return`terminalTabs.${taskId}`}function forgetTaskTabsSnapshot(kv,taskId){let key=terminalTabsKey(taskId);if(kv.store[key]===void 0)return;kv.set(key,void 0)}function sweepOrphanTabsSnapshots(kv,liveTaskIds){let live=new Set(liveTaskIds),swept=0;for(let key of Object.keys(kv.store)){if(!key.startsWith("terminalTabs."))continue;let taskId=key.slice(13);if(live.has(taskId))continue;kv.set(key,void 0),swept++}return swept}function readTabsSnapshot(taskId){try{let snap=loadStateFile()[terminalTabsKey(taskId)];return snap&&Array.isArray(snap.tabs)?snap:void 0}catch{return}}function closeTabsSnapshot(taskId,tabId){let closing,key=terminalTabsKey(taskId);return updateStateFile((store)=>{let state=store[key];if(!state||!Array.isArray(state.tabs))return!1;if(closing=state.tabs.find((tab)=>tab.id===tabId),!closing)return!1;let{state:next,closedId}=closeTab(state,tabId,{allowEmpty:!0});if(!closedId)return closing=void 0,!1;store[key]=next;return}),closing}function unregisteredTabIds(snapshot,taskId,sessions){let known=new Set((snapshot?.tabs??[]).map((t2)=>t2.id)),prefix=`${taskId}::`,out=[];for(let s of sessions){if(!s.alive||!s.key.startsWith(prefix))continue;let tabId=s.key.slice(prefix.length);if(tabId.includes("::"))continue;if(!known.has(tabId)&&!out.includes(tabId))out.push(tabId)}return out}function joinTaskTabs(snapshot,taskId,sessions,persistedExits={},liveVendors){let alive=aliveKeysOf(sessions),sessionExits=new Map(sessions.map((s)=>[s.key,s.exit])),deadExit=(key)=>{let ex=abnormalExit(sessionExits.get(key)??persistedExits[key]);if(!ex)return null;let record=persistedExits[key],tail=record?.at===ex.at?record.tail:void 0;return{code:ex.code,signal:ex.signal,at:ex.at,...tail&&tail.length>0?{tail}:{}}},rows=(snapshot?.tabs??[]).map((t2)=>{let key=`${taskId}::${t2.id}`,isAlive=alive.has(key),walked=isAlive&&liveVendors?.has(key)===!0?liveVendors.get(key)??null:void 0;return{id:t2.id,kind:t2.kind,title:t2.title??null,vendor:t2.vendor??null,liveVendor:walked!==void 0?walked:t2.liveVendor??null,lastTitle:t2.lastTitle??null,autoTitle:t2.autoTitle??null,alive:isAlive,exit:isAlive?null:deadExit(key)}});for(let tabId of unregisteredTabIds(snapshot,taskId,sessions))rows.push({id:tabId,kind:"engine",title:null,vendor:null,liveVendor:null,lastTitle:null,autoTitle:null,alive:!0,exit:null,unregistered:!0});return rows}function hasLiveEngineTab(snapshot,taskId,sessions){let alive=aliveKeysOf(sessions);if(alive.has(`${taskId}::tab-1`))return!0;return(snapshot?.tabs??[]).some((t2)=>t2.kind==="engine"&&alive.has(`${taskId}::${t2.id}`))}function publishCliTabSnapshot(taskId,sessionId){if(!taskId)return;try{let key=terminalTabsKey(taskId);if(loadStateFile()[key]!==void 0)return;let seeded=initialTabs();patchStateFile({[key]:sessionId?{...seeded,tabs:seeded.tabs.map((t2)=>t2.kind==="engine"?{...t2,sessionId,spawned:!0}:t2)}:seeded})}catch{}}function markCliTabSession(taskId,tabId,sessionId){try{let key=terminalTabsKey(taskId),existing=loadStateFile()[key];if(!existing||!Array.isArray(existing.tabs))return;patchStateFile({[key]:{...existing,tabs:existing.tabs.map((t2)=>t2.id===tabId&&t2.kind==="engine"?{...t2,sessionId,spawned:!0}:t2)}})}catch{}}function mintCliTab(taskId,vendor,command){let tabId="tab-1";try{let key=terminalTabsKey(taskId),existing=loadStateFile()[key],state=existing&&Array.isArray(existing.tabs)&&existing.tabs.length>0?existing:initialTabs(),ordinal=typeof state.nextOrdinal==="number"&&state.nextOrdinal>1?state.nextOrdinal:2;tabId=`tab-${ordinal}`,patchStateFile({[key]:{...state,tabs:[...state.tabs,{kind:"engine",id:tabId,title:null,ordinal,...vendor?{vendor}:{},...command?{engineCommand:command}:{}}],activeId:tabId,nextOrdinal:ordinal+1}})}catch{tabId=`tab-cli-${Date.now().toString(36)}`}return tabId}var aliveKeysOf=(sessions)=>new Set(sessions.filter((s)=>s.alive).map((s)=>s.key)),abnormalExit=(exit)=>exit&&(exit.code!==0||exit.signal!==null)?exit:null;var init_tab_snapshot=__esm(()=>{init_store();init_terminal_tabs_core()});function breakRowsOnCursorMotion(raw){return raw.replace(CURSOR_DOWN_RE,(_m,count)=>`
367
367
  `.repeat(Math.min(200,Math.max(1,Number.parseInt(count,10)||1)))).replace(CURSOR_POSITION_RE,`
368
368
  `)}function terminalRows(raw,maxLineChars){return breakRowsOnCursorMotion(raw).replace(ANSI_RE,"").replace(/\r\n/g,`
369
369
  `).split(`
@@ -520,7 +520,7 @@ To install use this command:
520
520
 
521
521
  $ bun add react-devtools-core@7 -d
522
522
  `.trim()+`
523
- `);else throw error}reconciler.injectIntoDevTools();_r=reconciler,flushSync=_r.flushSyncFromReconciler??_r.flushSync});import{engine as engine2,Timeline}from"@opentui/core";import{createSlotRegistry}from"@opentui/core";import{TimeToFirstDrawRenderable}from"@opentui/core";function useEffectEvent(handler){let handlerRef=import_react6.useRef(handler);return import_react6.useLayoutEffect(()=>{handlerRef.current=handler}),import_react6.useCallback((...args)=>{let fn=handlerRef.current;return fn(...args)},[])}function renderPluginFailurePlaceholder(registry,pluginFailurePlaceholder,failure,pluginId,slot){if(!pluginFailurePlaceholder)return null;try{return pluginFailurePlaceholder(failure)}catch(error){return registry.reportPluginError({pluginId,slot,phase:"error_placeholder",source:"react",error}),null}}var import_react5,import_react6,import_react7,import_react8,import_react9,import_react10,import_react11,import_react12,import_react13,import_react14,import_react15,import_react16,useRenderer=()=>{let{renderer}=useAppContext();if(!renderer)throw Error("Renderer not found.");return renderer},usePaste=(handler)=>{let{keyHandler}=useAppContext(),stableHandler=useEffectEvent(handler);import_react9.useEffect(()=>{return keyHandler?.on("paste",stableHandler),()=>{keyHandler?.off("paste",stableHandler)}},[keyHandler])},useOnResize=(callback)=>{let renderer=useRenderer(),stableCallback=useEffectEvent(callback);return import_react10.useEffect(()=>{return renderer.on("resize",stableCallback),()=>{renderer.off("resize",stableCallback)}},[renderer]),renderer},useTerminalDimensions=()=>{let renderer=useRenderer(),[dimensions,setDimensions]=import_react12.useState({width:renderer.width,height:renderer.height});return useOnResize((width,height)=>{setDimensions({width,height})}),dimensions},PluginErrorBoundary;var init_react=__esm(async()=>{init_chunk_2mx7fq49();await init_chunk_rm53pqj2();import_react5=__toESM(require_react_production(),1),import_react6=__toESM(require_react_production(),1),import_react7=__toESM(require_react_production(),1),import_react8=__toESM(require_react_production(),1),import_react9=__toESM(require_react_production(),1),import_react10=__toESM(require_react_production(),1),import_react11=__toESM(require_react_production(),1),import_react12=__toESM(require_react_production(),1),import_react13=__toESM(require_react_production(),1),import_react14=__toESM(require_react_production(),1),import_react15=__toESM(require_react_production(),1),import_react16=__toESM(require_react_production(),1);PluginErrorBoundary=class PluginErrorBoundary extends import_react14.default.Component{constructor(props){super(props);this.state={failure:null}}componentDidCatch(error){let failure=this.props.registry.reportPluginError({pluginId:this.props.pluginId,slot:this.props.slotName,phase:"render",source:"react",error});this.setState({failure})}componentDidUpdate(previousProps){if(previousProps.resetToken!==this.props.resetToken&&this.state.failure)this.setState({failure:null})}render(){if(this.state.failure){let placeholder=renderPluginFailurePlaceholder(this.props.registry,this.props.pluginFailurePlaceholder,this.state.failure,this.props.pluginId,this.props.slotName);if(placeholder===null||placeholder===void 0||placeholder===!1)return this.props.fallbackOnFailure??null;return placeholder}return this.props.children}};extend({"time-to-first-draw":TimeToFirstDrawRenderable})});function useAccessor(state){return import_react17.useSyncExternalStore(state.subscribe,state.get,state.get)}var import_react17;var init_use_accessor=__esm(()=>{import_react17=__toESM(require_react_production(),1)});function jsxProd(type,config,maybeKey){var key=null;if(maybeKey!==void 0&&(key=""+maybeKey),config.key!==void 0&&(key=""+config.key),"key"in config){maybeKey={};for(var propName in config)propName!=="key"&&(maybeKey[propName]=config[propName])}else maybeKey=config;return config=maybeKey.ref,{$$typeof:REACT_ELEMENT_TYPE,type,key,ref:config!==void 0?config:null,props:maybeKey}}var REACT_ELEMENT_TYPE,REACT_FRAGMENT_TYPE,$Fragment2,$jsx,$jsxs;var init_react_jsx_runtime_production=__esm(()=>{REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");$Fragment2=REACT_FRAGMENT_TYPE,$jsx=jsxProd,$jsxs=jsxProd});var init_jsx_runtime=__esm(()=>{init_react_jsx_runtime_production()});import{RGBA as RGBA3}from"@opentui/core";function listThemes(){return Object.keys(store.get().themes)}function hasTheme(name){return Boolean(store.get().themes[name])}function addTheme(name,theme){if(!name)return!1;if(!theme||typeof theme!=="object"||!theme.theme)return!1;return store.update((s)=>({...s,themes:{...s.themes,[name]:theme}})),!0}function selectedTheme(){return store.get().active}function setTheme(name){if(!hasTheme(name))return!1;return store.update((s)=>({...s,active:name})),!0}function transparentBackground(){return store.get().transparentBackground}function setTransparentBackground(v){store.update((s)=>({...s,transparentBackground:v}))}function focusAccent(){return store.get().focusAccent}function setFocusAccent(v){store.update((s)=>({...s,focusAccent:v}))}function resolveActive(state){let active=state.themes[state.active];if(active)return resolveTheme(active,state.mode);let fallback=state.themes[DEFAULT_THEME]??Object.values(state.themes)[0];if(!fallback)return resolveTheme({theme:{background:"#000000",text:"#ffffff"}},state.mode);return resolveTheme(fallback,state.mode)}function ThemeProvider(props){import_react19.useMemo(()=>{store.update((s)=>({...s,mode:props.mode??s.mode,active:props.theme&&s.themes[props.theme]?props.theme:s.active}))},[]);let state=useAccessor(store),renderer=useRenderer(),[hostBackground,setHostBackground]=import_react19.useState(null);import_react19.useEffect(()=>{if(!state.transparentBackground)return;if(renderer?.screenMode==="split-footer")return;if(!renderer)return;let cancelled=!1;return renderer.getPalette({timeout:HOST_PALETTE_QUERY_TIMEOUT_MS}).then((colors)=>{if(cancelled||!colors.defaultBackground)return;setHostBackground(RGBA3.fromHex(colors.defaultBackground))}).catch(()=>{}),()=>{cancelled=!0}},[renderer,state.transparentBackground]);let theme=import_react19.useMemo(()=>applyDisplayOverlay(resolveActive(state),state.focusAccent,state.transparentBackground,hostBackground??void 0),[state,hostBackground]);import_react19.useEffect(()=>{if(renderer?.screenMode==="split-footer")return;renderer?.setBackgroundColor(theme.background??RGBA3.fromInts(0,0,0))},[renderer,theme]);let value=import_react19.useMemo(()=>({theme,selected:state.active,transparentBackground:state.transparentBackground,focusAccent:state.focusAccent,mode:()=>state.mode,set(name){if(!hasTheme(name))return!1;return store.update((s)=>({...s,active:name})),!0},setMode(mode){store.update((s)=>({...s,mode}))},setTransparentBackground(v){store.update((s)=>({...s,transparentBackground:v}))},setFocusAccent(v){store.update((s)=>({...s,focusAccent:v}))},all:listThemes,has:hasTheme}),[theme,state]);return $jsx(ThemeContext.Provider,{value,children:props.children})}function useTheme(){let value=import_react19.useContext(ThemeContext);if(!value)throw Error("Theme context must be used within a context provider");return value}var import_react19,store,ThemeContext,HOST_PALETTE_QUERY_TIMEOUT_MS=2000;var init_theme=__esm(async()=>{init_external_store();init_theme_core();init_use_accessor();init_theme_core();init_jsx_runtime();await init_react();import_react19=__toESM(require_react_production(),1),store=createExternalStore({themes:{...BUNDLED_THEMES},active:DEFAULT_THEME,mode:"dark",transparentBackground:!0,focusAccent:"primary"});ThemeContext=import_react19.createContext(null)});function useLang(){return useAccessor(localeState())}function useT(){let lang=useLang();return import_react20.useCallback((key,params)=>t(key,params),[lang])}var import_react20;var init_i18n2=__esm(()=>{init_i18n();init_use_accessor();init_catalog();import_react20=__toESM(require_react_production(),1)});function describePayload(value){if(value===void 0)return"undefined";if(value===null)return"null";let type=Array.isArray(value)?"array":typeof value,text;try{text=typeof value==="string"?value:JSON.stringify(value)}catch{text=String(value)}if(text.length>120)text=`${text.slice(0,120)}\u2026`;return`${type}:${text}`}function parseWorktreeChangesPayload(payload){let changes=payload?.changes;if(!changes||typeof changes!=="object"||Array.isArray(changes))return null;let map=new Map;for(let[path15,value]of Object.entries(changes)){let counts=value;if(typeof counts?.added!=="number"||typeof counts.deleted!=="number")return null;map.set(path15,{added:counts.added,deleted:counts.deleted})}return map}function decodeUiPrefsPayload(payload){let p=payload;if(typeof p?.theme!=="string")return null;return{theme:p.theme,transparentBackground:p.transparentBackground===!0,focusAccent:typeof p.focusAccent==="string"?p.focusAccent:null,locale:typeof p.locale==="string"?p.locale:"",sortMode:p.sortMode==="recent"?"recent":"default",keysCollapsed:p.keysCollapsed===!0,projectFilter:typeof p.projectFilter==="string"&&p.projectFilter.length>0?p.projectFilter:null}}function sameWorktreeChangesMap(a,b){if(a.size!==b.size)return!1;for(let[path15,counts]of a){let other=b.get(path15);if(!other||!sameWorktreeChanges(counts,other))return!1}return!0}function parseUsageSnapshotPayload(payload){let usage=payload?.usage;if(!usage||typeof usage!=="object"||Array.isArray(usage))return null;let map=new Map;for(let[vendor,value]of Object.entries(usage)){let snapshot=value;if(typeof snapshot?.capturedAt!=="number"||!Array.isArray(snapshot.windows))return null;let windows=[];for(let raw of snapshot.windows){let w2=raw;if(typeof w2?.kind!=="string"||typeof w2.label!=="string"||typeof w2.percent!=="number")return null;if(w2.resetsAt!==null&&typeof w2.resetsAt!=="number")return null;windows.push({kind:w2.kind,label:w2.label,percent:w2.percent,resetsAt:w2.resetsAt})}map.set(vendor,{windows,capturedAt:snapshot.capturedAt})}return map}function sameUsageSnapshotMap(a,b){if(a.size!==b.size)return!1;for(let[vendor,usage]of a){let other=b.get(vendor);if(!other||other.capturedAt!==usage.capturedAt||other.windows.length!==usage.windows.length)return!1;for(let i=0;i<usage.windows.length;i++){let x=usage.windows[i],y=other.windows[i];if(!x||!y||x.kind!==y.kind||x.label!==y.label||x.percent!==y.percent||x.resetsAt!==y.resetsAt)return!1}}return!0}function parseTranscriptActivityPayload(payload){let activity=payload?.activity;if(!activity||typeof activity!=="object"||Array.isArray(activity))return null;let map=new Map;for(let[path15,value]of Object.entries(activity)){let v=value;if(typeof v?.mtimeMs!=="number"||typeof v.completionAt!=="number")return null;if(v.completionId!==null&&typeof v.completionId!=="string")return null;map.set(path15,{mtimeMs:v.mtimeMs,completionId:v.completionId,completionAt:v.completionAt})}return map}function sameTranscriptActivityMap(a,b){if(a.size!==b.size)return!1;for(let[path15,v]of a){let other=b.get(path15);if(!other||other.mtimeMs!==v.mtimeMs||other.completionId!==v.completionId||other.completionAt!==v.completionAt)return!1}return!0}function shouldLogReconnectAttempt(attempt){if(attempt>RECONNECT_LOG_ATTEMPT_CEILING)return!1;return attempt===1||attempt%10===0}function deserializeTask(s){return{id:toTaskId(s.id),title:s.title,repo:s.repo,branch:s.branch,worktreePath:s.worktreePath,kind:s.kind,...s.scratch?{scratch:!0}:{},...s.routine?{routine:s.routine}:{},status:s.status,pinned:s.pinned,vendor:s.vendor,command:s.command,prStatus:s.prStatus,modelEffort:s.modelEffort,groupId:s.groupId,observedLanguage:s.observedLanguage,deletion:s.deletion,quotaResume:s.quotaResume,linkedWorkItem:s.linkedWorkItem,dispatcher:s.dispatcher,prompt:s.prompt,baseRef:s.baseRef,createdAt:s.createdAt,updatedAt:s.updatedAt}}var RECONNECT_LOG_ATTEMPT_CEILING=100;var init_remote_orchestrator_payloads=__esm(()=>{init_worktree_changes();init_task()});async function runReconnectLoop(deps){let delayMs=deps.spawnDaemon?Math.floor(Math.random()*400):500,attempt=0;while(!deps.isDisposed()){if(delayMs>0)await new Promise((r5)=>setTimeout(r5,delayMs));if(deps.isDisposed())break;attempt++;try{if(deps.spawnDaemon)await deps.ensureReachable();await deps.init(),logClient("orch",`reconnected and re-subscribed after ${attempt} attempt(s) \u2014 task list re-synced`);return}catch(err){if(isStaleInstallError(err)){logClientError("orch-reconnect-fatal",err),deps.onFatal?.(err);return}if(deps.shouldLogAttempt(attempt))logClientError("orch-reconnect",err);delayMs=delayMs===0?500:Math.min(delayMs*2,3000)}}}async function performInit(client,opts,signals){let hello=await client.request("hello",{protocolVersion:DAEMON_PROTOCOL_VERSION,minProtocolVersion:MIN_COMPATIBLE_PROTOCOL_VERSION}),daemonVersion=typeof hello.protocolVersion==="number"?hello.protocolVersion:DAEMON_PROTOCOL_VERSION,daemonMin=typeof hello.minProtocolVersion==="number"?hello.minProtocolVersion:daemonVersion;if(!isProtocolCompatible({localVersion:DAEMON_PROTOCOL_VERSION,localMin:MIN_COMPATIBLE_PROTOCOL_VERSION,remoteVersion:daemonVersion,remoteMin:daemonMin}))throw Error(`Rove daemon is protocol v${daemonVersion} (min v${daemonMin}); this client is v${DAEMON_PROTOCOL_VERSION} (min v${MIN_COMPATIBLE_PROTOCOL_VERSION}). Restart the daemon (\`rove daemon restart\`) or upgrade Rove.`);let clientHome=homeDir();if(isForeignDaemonHome(hello.homeDir,clientHome))throw Error(`Rove daemon on this socket serves ${hello.homeDir}, but this client uses ${clientHome}. A sandbox or dev daemon has taken the production socket \u2014 stop it (\`rove daemon stop\`), or unset ROVE_DAEMON_SOCKET_PATH / KOBE_DAEMON_SOCKET_PATH before starting it.`);if(signals.setDaemonVersionSig(typeof hello.kobeVersion==="string"?hello.kobeVersion:null),hello.tasks&&opts.subscribesTasks)signals.setTasks(hello.tasks.map(deserializeTask));if(await client.subscribe({role:opts.role,channels:opts.channels}),hello.capabilities?.includes("worktree.changes")){if(signals.worktreeChangesAcc()===null)signals.setWorktreeChangesSig(new Map)}else signals.setWorktreeChangesSig(null);if(hello.capabilities?.includes("transcript.activity")){if(signals.transcriptActivityAcc()===null)signals.setTranscriptActivitySig(new Map)}else signals.setTranscriptActivitySig(null);signals.setConnectionState("online"),logClient("orch",`subscribed as ${opts.role} (${signals.tasksAcc().length} tasks)`)}var init_remote_orchestrator_connect=__esm(()=>{init_client_log();init_daemon_process();init_protocol();init_env();init_remote_orchestrator_payloads()});function pruneEngineState(tasks,signals){let live=new Set(tasks.map((t2)=>t2.id)),current=signals.engineStateAcc();if(current.size>0){let next=null;for(let key of current.keys()){if(live.has(key))continue;if(!next)next=new Map(current);next.delete(key)}if(next)signals.setEngineStateSig(next)}let tabs=signals.engineTabStateAcc();if(tabs.size>0){let nextTabs=null;for(let key of tabs.keys()){if(live.has(key))continue;if(!nextTabs)nextTabs=new Map(tabs);nextTabs.delete(key)}if(nextTabs)signals.setEngineTabStateSig(nextTabs)}let lifecycle=signals.engineLifecycleAcc();if(lifecycle.size>0){let nextLifecycle=null;for(let key of lifecycle.keys()){if(live.has(key))continue;if(!nextLifecycle)nextLifecycle=new Map(lifecycle);nextLifecycle.delete(key)}if(nextLifecycle)signals.setEngineLifecycleSig(nextLifecycle)}}function pruneTaskJobs(tasks,signals){let current=signals.taskJobsAcc();if(current.size===0)return;let live=new Set(tasks.map((t2)=>t2.id)),next=null;for(let key of current.keys()){if(live.has(key))continue;if(!next)next=new Map(current);next.delete(key)}if(next)signals.setTaskJobsSig(next)}function handleOrchestratorEvent(name,payload,signals){if(name==="task.snapshot"){let value=payload?.tasks;if(Array.isArray(value))signals.setTasks(value.map(deserializeTask)),pruneEngineState(value,signals),pruneTaskJobs(value,signals);else logClientError("orch",`dropped task.snapshot event: tasks is not an array (got ${describePayload(value)})`);return}if(name==="active-task"){let id=payload?.taskId;signals.setActiveTaskSig(typeof id==="string"?id:null);return}if(name==="update"){let info=payload?.info;signals.setUpdateSig(info??null);return}if(name==="engine-state"){let p=payload;if(typeof p?.taskId!=="string"||typeof p.state!=="string"){logClientError("orch",`dropped engine-state event: taskId/state must be strings (taskId=${describePayload(p?.taskId)}, state=${describePayload(p?.state)})`);return}let tabId=typeof p.tabId==="string"&&p.tabId?p.tabId:void 0,entry={state:p.state,detail:p.detail,...typeof p.sessionId==="string"&&p.sessionId?{sessionId:p.sessionId}:{},...typeof p.transcriptPath==="string"&&p.transcriptPath?{transcriptPath:p.transcriptPath}:{},...tabId?{tabId}:{},at:typeof p.at==="number"?p.at:0},prevTask=signals.engineStateAcc().get(p.taskId),prevTaskState=prevTask?.state,next=new Map(signals.engineStateAcc());if(p.state==="idle"){if(!tabId||prevTask?.tabId===tabId)next.delete(p.taskId)}else next.set(p.taskId,entry);if(signals.setEngineStateSig(next),(p.state==="idle"||p.state==="turn_complete"||p.state==="error"||p.state==="running"&&prevTaskState!=="running")&&signals.engineLifecycleAcc().has(p.taskId)){let lifecycle=new Map(signals.engineLifecycleAcc());lifecycle.delete(p.taskId),signals.setEngineLifecycleSig(lifecycle)}if(tabId){let nextTabs=new Map(signals.engineTabStateAcc()),tabs=new Map(nextTabs.get(p.taskId)??[]);tabs.set(tabId,entry),nextTabs.set(p.taskId,tabs),signals.setEngineTabStateSig(nextTabs)}return}if(name==="attention.inbox"){let items=payload?.items;if(!Array.isArray(items)){logClientError("orch",`dropped attention.inbox event: items is not an array (${describePayload(items)})`);return}if(!items.every((item)=>{if(!item||typeof item!=="object"||Array.isArray(item))return!1;let p=item;return typeof p.taskId==="string"&&(p.tabId===null||typeof p.tabId==="string")&&isAttentionInboxState(p.state)&&(p.unread===void 0||typeof p.unread==="boolean")&&typeof p.at==="number"})){logClientError("orch",`dropped attention.inbox event: malformed item (${describePayload(items)})`);return}signals.setAttentionInboxSig(items.map((item)=>({...item,unread:item.unread!==!1})));return}if(name==="task.jobs"){let p=payload;if(typeof p?.taskId!=="string"||p.kind!=="ensureWorktree"){logClientError("orch",`dropped task.jobs event: expected string taskId + kind "ensureWorktree" (taskId=${describePayload(p?.taskId)}, kind=${describePayload(p?.kind)})`);return}let current=signals.taskJobsAcc();if(p.phase==="running"){let next=new Map(current);next.set(p.taskId,{kind:p.kind}),signals.setTaskJobsSig(next);return}if((p.phase==="done"||p.phase==="error")&&current.has(p.taskId)){let next=new Map(current);next.delete(p.taskId),signals.setTaskJobsSig(next)}return}if(name==="usage.snapshot"){let next=parseUsageSnapshotPayload(payload);if(!next){logClientError("orch",`dropped usage.snapshot event: malformed usage payload (${describePayload(payload)})`);return}let current=signals.usageSnapshotAcc();if(current&&sameUsageSnapshotMap(current,next))return;signals.setUsageSnapshotSig(next);return}if(name==="worktree.changes"){let next=parseWorktreeChangesPayload(payload);if(!next){logClientError("orch",`dropped worktree.changes event: malformed changes payload (${describePayload(payload)})`);return}let current=signals.worktreeChangesAcc();if(current&&sameWorktreeChangesMap(current,next))return;signals.setWorktreeChangesSig(next);return}if(name==="transcript.activity"){let next=parseTranscriptActivityPayload(payload);if(!next){logClientError("orch",`dropped transcript.activity event: malformed activity payload (${describePayload(payload)})`);return}let current=signals.transcriptActivityAcc();if(current&&sameTranscriptActivityMap(current,next))return;signals.setTranscriptActivitySig(next);return}if(name==="tab.open"){let p=payload;if(typeof p?.taskId!=="string"||typeof p.at!=="number"||typeof p.title!=="string"||!Array.isArray(p.argv)){logClientError("orch",`dropped tab.open event: malformed payload (${describePayload(payload)})`);return}signals.setTabOpenSig(p);return}if(name==="tab.close"){let p=payload;if(!(p&&"kind"in p&&p.kind==="terminal-tab"?typeof p.taskId==="string"&&typeof p.tabId==="string"&&typeof p.requestId==="string"&&typeof p.at==="number":typeof p?.taskId==="string"&&typeof p.at==="number"&&("title"in p)&&typeof p.title==="string")){logClientError("orch",`dropped tab.close event: malformed payload (${describePayload(payload)})`);return}signals.setTabCloseSig(p);return}if(name==="ui.prompt"){let p=payload;if(typeof p?.promptId!=="string"||typeof p.title!=="string"||typeof p.at!=="number"){logClientError("orch",`dropped ui.prompt event: malformed payload (${describePayload(payload)})`);return}signals.setUiPromptSig(p);return}if(name==="engine.lifecycle"){let p=payload;if(typeof p?.taskId!=="string"||typeof p.kind!=="string"){logClientError("orch",`dropped engine.lifecycle event: malformed payload (${describePayload(payload)})`);return}let prev=signals.engineLifecycleAcc(),cur=prev.get(p.taskId)??{subagents:0},entry=p.kind==="subagent-start"?{subagents:cur.subagents+1}:p.kind==="subagent-stop"?{subagents:Math.max(0,cur.subagents-1)}:cur;if(entry===cur&&!prev.has(p.taskId))return;let map=new Map(prev);if(entry.subagents===0)map.delete(p.taskId);else map.set(p.taskId,entry);signals.setEngineLifecycleSig(map);return}if(name==="notice.event"){let p=payload;if(typeof p?.title!=="string"||typeof p.at!=="number"||typeof p.kind!=="string"){logClientError("orch",`dropped notice.event: malformed payload (${describePayload(payload)})`);return}signals.setNoticeSig(p);return}if(name==="ui-prefs"){let decoded=decodeUiPrefsPayload(payload);if(!decoded){let theme=payload?.theme;logClientError("orch",`dropped ui-prefs event: theme must be a string (got ${describePayload(theme)})`);return}signals.setUiPrefsSig(decoded);return}if(name==="keybindings"){let p=payload;if(typeof p?.rev!=="number"){logClientError("orch",`dropped keybindings event: rev must be a number (got ${describePayload(p?.rev)})`);return}signals.setKeybindingsRevSig(p.rev)}}var init_remote_orchestrator_events=__esm(()=>{init_client_log();init_protocol();init_remote_orchestrator_payloads()});function tasksSignalOp(s){return s.tasksAcc}function activeTaskSignalOp(s){return s.activeTaskAcc}function updateSignalOp(s){return s.updateAcc}function daemonVersionSignalOp(s){return s.daemonVersionAcc}function daemonStaleSignalOp(s){return s.daemonStaleAcc}function engineStateSignalOp(s){return s.engineStateAcc}function engineTabStatesSignalOp(s){return s.engineTabStateAcc}function attentionInboxSignalOp(s){return s.attentionInboxAcc}function taskJobsSignalOp(s){return s.taskJobsAcc}function worktreeChangesSignalOp(s){return s.worktreeChangesAcc}function usageSnapshotSignalOp(s){return s.usageSnapshotAcc}function transcriptActivitySignalOp(s){return s.transcriptActivityAcc}function transcriptActivityStoreOp(s){return s.transcriptActivityStoreInner}function uiPrefsSignalOp(s){return s.uiPrefsAcc}function uiPrefsStoreOp(s){return s.uiPrefsStoreInner}function keybindingsRevSignalOp(s){return s.keybindingsRevAcc}function keybindingsRevStoreOp(s){return s.keybindingsRevStoreInner}function listTasksOp(s){return s.tasksAcc()}function getTaskOp(s,id){return s.tasksAcc().find((t2)=>t2.id===id)}function subscribeTasksOp(s,listener){try{listener(listTasksOp(s))}catch(err){console.error("[rove RemoteOrchestrator] task listener threw on subscribe:",err)}return s.tasksAcc.subscribe(()=>{try{listener(s.tasksAcc.get())}catch(err){console.error("[rove RemoteOrchestrator] task listener threw:",err)}})}async function createTaskOp(client,input){let{modelEffort,...rest}=input,res=await client.request("task.create",{...rest,effort:modelEffort});return deserializeTask(res.task)}async function ensureMainTaskOp(client,repo){let res=await client.request("task.ensureMain",{repo});return deserializeTask(res.task)}async function openDirectoryTaskOp(client,input){let res=await client.request("task.openDir",input);return deserializeTask(res.task)}async function adoptScratchRepoOp(client,id,repo){await client.request("task.adoptScratchRepo",{taskId:String(id),repo})}async function ensureWorktreeOp(client,id){return(await client.request("task.ensureWorktree",{taskId:String(id)})).worktreePath}async function forgetProjectOp(client,repo){await client.request("project.forget",{repo})}function reportEngineInterruptOp(client,taskId,tabId){client.request("engine.reportEvent",{kind:"turn-interrupted",taskId,tabId}).catch(()=>{})}async function setTitleOp(client,id,title){await client.request("task.rename",{taskId:String(id),title})}async function setBranchOp(client,id,branch){await client.request("task.setBranch",{taskId:String(id),branch})}async function setVendorOp(client,id,vendor,effort){await client.request("task.setVendor",{taskId:String(id),vendor,...effort!==void 0?{effort}:{}})}async function setCommandOp(client,id,command,vendor){await client.request("task.setCommand",{taskId:String(id),command,...vendor?{vendor}:{}})}async function setPinnedOp(client,id,pinned){await client.request("task.pin",{taskId:String(id),pinned})}async function moveTaskOp(client,id,delta){await client.request("task.move",{taskId:String(id),direction:delta<0?"up":"down"})}async function setPromptOp(client,id,prompt){await client.request("task.setPrompt",{taskId:String(id),prompt})}async function setStatusOp(client,id,status){await client.request("task.status",{taskId:String(id),status})}async function deleteTaskOp(client,id,opts){await client.request("task.delete",{taskId:String(id),force:opts?.force,deleteBranch:opts?.deleteBranch})}async function dismissAttentionOp(client,taskId,tabId,at2){return(await client.request("attention.dismiss",{taskId:String(taskId),...tabId!==null?{tabId}:{},at:at2})).deleted}async function markAttentionReadOp(client,taskId,tabId,at2){return(await client.request("attention.read",{taskId:String(taskId),...tabId!==null?{tabId}:{},at:at2})).updated}async function releaseDeferredPromptOp(client,id){let res=await client.request("deferredPrompt.release",{id});if(res.kind!=="claimed")return res.kind;if(res.cleanupPending.length>0)return"cleanup-pending";if(res.delivered.includes(id)||res.cleaned.includes(id))return"inserted";return res.retained[0]?.reason==="busy"?"deferred-again":"unavailable"}async function flushDeferredPromptsOp(client){return await client.request("deferredPrompt.flush",{})}async function landTaskOp(client,id,opts){return(await client.request("task.land",{taskId:String(id),strategy:opts?.strategy,deleteBranch:opts?.deleteBranch,removeWorktree:opts?.removeWorktree,callerCwd:opts?.callerCwd})).result}async function discoverAdoptableWorktreesOp(client,repo){return(await client.request("worktree.discoverAdoptable",{repo})).worktrees}async function adoptWorktreeOp(client,input){let res=await client.request("worktree.adopt",input);return deserializeTask(res.task)}async function listWorktreesOp(client,opts){return(await client.request("worktree.list",{network:opts?.network!==!1})).projects}async function removeWorktreeOp(client,path15,force){return(await client.request("worktree.remove",{path:path15,force})).residue??null}async function listIssuesOp(client,repoRoot){return client.request("issue.list",{repoRoot})}async function listFieldNotesOp(client,repo){return(await client.request("note.list",{repo})).notes??[]}async function mutateIssueOp(client,repoRoot,op){return client.request("issue.mutate",{repoRoot,op})}async function listAutomationsOp(client){return client.request("automation.list",{})}async function createAutomationOp(client,input){return client.request("automation.create",input)}async function automationRunsOp(client,id){return client.request("automation.runs",{id})}async function setAutomationEnabledOp(client,id,enabled){return client.request("automation.update",{id,enabled})}async function runAutomationNowOp(client,id){return client.request("automation.runNow",{id})}async function deleteAutomationOp(client,id){return client.request("automation.delete",{id})}async function listWorkItemsOp(client,args){return client.request("workitem.list",args)}async function startWorkItemOp(client,args){return client.request("workitem.start",args)}async function setActiveTaskOp(client,id){await client.request("task.setActive",{taskId:id===null?null:String(id)})}function replyTabCloseOp(client,requestId,closed){client.request("terminalTab.closeReply",{requestId,closed}).catch(()=>{})}var init_remote_orchestrator_writes=__esm(()=>{init_remote_orchestrator_payloads()});class RemoteOrchestrator{client;tasksAcc=createStateCell([],"orchestrator.tasks");activeTaskAcc=createStateCell(null,"orchestrator.active-task");updateAcc=createStateCell(null);daemonVersionAcc=createStateCell(null);daemonStaleAcc=mapReadableState(this.daemonVersionAcc,(version)=>isDaemonVersionStale(version??void 0,CURRENT_VERSION2));engineStateAcc=createStateCell(new Map);engineTabStateAcc=createStateCell(new Map);attentionInboxAcc=createStateCell([]);taskJobsAcc=createStateCell(new Map);worktreeChangesAcc=createStateCell(null);usageSnapshotAcc=createStateCell(null);transcriptActivityAcc=createStateCell(null);noticeAcc=createStateCell(null);tabOpenAcc=createStateCell(null);tabCloseAcc=createStateCell(null);uiPromptAcc=createStateCell(null);engineLifecycleAcc=createStateCell(new Map);uiPrefsAcc=createStateCell(null);keybindingsRevAcc=createStateCell(null);connectionStateAcc=createStateCell("online","orchestrator.connection");staleInstallAcc=createStateCell(null);ensureReachable;role;channels;subscribesTasks;reconnectTask=null;signals;reads;constructor(client,options={}){this.client=client;this.ensureReachable=options.ensureReachable??ensureDaemonReachable,this.role=options.role??"pane",this.channels=options.channels,this.subscribesTasks=!options.channels||options.channels.includes("task.snapshot"),this.signals={tasksAcc:this.tasksAcc,setTasks:this.tasksAcc.set,setActiveTaskSig:this.activeTaskAcc.set,setUpdateSig:this.updateAcc.set,setDaemonVersionSig:this.daemonVersionAcc.set,engineStateAcc:this.engineStateAcc,setEngineStateSig:this.engineStateAcc.set,engineTabStateAcc:this.engineTabStateAcc,setEngineTabStateSig:this.engineTabStateAcc.set,setAttentionInboxSig:this.attentionInboxAcc.set,taskJobsAcc:this.taskJobsAcc,setTaskJobsSig:this.taskJobsAcc.set,worktreeChangesAcc:this.worktreeChangesAcc,setWorktreeChangesSig:this.worktreeChangesAcc.set,usageSnapshotAcc:this.usageSnapshotAcc,setUsageSnapshotSig:this.usageSnapshotAcc.set,transcriptActivityAcc:this.transcriptActivityAcc,setTranscriptActivitySig:this.transcriptActivityAcc.set,setNoticeSig:this.noticeAcc.set,setTabOpenSig:this.tabOpenAcc.set,setTabCloseSig:this.tabCloseAcc.set,setUiPromptSig:this.uiPromptAcc.set,engineLifecycleAcc:this.engineLifecycleAcc,setEngineLifecycleSig:this.engineLifecycleAcc.set,setUiPrefsSig:this.uiPrefsAcc.set,setKeybindingsRevSig:this.keybindingsRevAcc.set,setConnectionState:this.connectionStateAcc.set},this.reads={tasksAcc:this.tasksAcc,activeTaskAcc:this.activeTaskAcc,updateAcc:this.updateAcc,daemonVersionAcc:this.daemonVersionAcc,daemonStaleAcc:this.daemonStaleAcc,engineStateAcc:this.engineStateAcc,engineTabStateAcc:this.engineTabStateAcc,attentionInboxAcc:this.attentionInboxAcc,taskJobsAcc:this.taskJobsAcc,worktreeChangesAcc:this.worktreeChangesAcc,usageSnapshotAcc:this.usageSnapshotAcc,transcriptActivityAcc:this.transcriptActivityAcc,transcriptActivityStoreInner:this.transcriptActivityAcc,noticeAcc:this.noticeAcc,uiPrefsAcc:this.uiPrefsAcc,uiPrefsStoreInner:this.uiPrefsAcc,keybindingsRevAcc:this.keybindingsRevAcc,keybindingsRevStoreInner:this.keybindingsRevAcc,connectionStateAcc:this.connectionStateAcc},this.client.on("*",(frame)=>this.handleEvent(frame.name,frame.payload)),this.client.onLifecycle("close",()=>{this.connectionStateAcc.set("disconnected");let spawnDaemon=this.role==="gui";logClient("orch",spawnDaemon?"daemon socket closed \u2014 starting silent spawning reconnect loop":"daemon socket closed \u2014 starting non-spawning reconnect loop"),this.reconnectLoop(spawnDaemon)})}reconnectLoop(spawnDaemon){if(this.reconnectTask)return this.reconnectTask;let task=runReconnectLoop({isDisposed:()=>this.client.isDisposed,spawnDaemon,ensureReachable:this.ensureReachable,init:()=>this.init(),shouldLogAttempt:shouldLogReconnectAttempt,onFatal:(err)=>this.staleInstallAcc.set(err instanceof Error?err.message:String(err))});this.reconnectTask=task;let clear=()=>{if(this.reconnectTask===task)this.reconnectTask=null};return task.then(clear,clear),task}async init(){await performInit(this.client,{role:this.role,channels:this.channels,subscribesTasks:this.subscribesTasks},this.signals)}connectionStateSignal(){return this.connectionStateAcc}staleInstallSignal(){return this.staleInstallAcc}async manualReconnect(){this.client.forceDisconnect(),await this.reconnectLoop(!0)}dispose(){this.client.close()}tasksSignal=()=>tasksSignalOp(this.reads);activeTaskSignal=()=>activeTaskSignalOp(this.reads);updateSignal=()=>updateSignalOp(this.reads);daemonVersionSignal=()=>daemonVersionSignalOp(this.reads);daemonStaleSignal=()=>daemonStaleSignalOp(this.reads);engineStateSignal=()=>engineStateSignalOp(this.reads);engineTabStatesSignal=()=>engineTabStatesSignalOp(this.reads);attentionInboxSignal=()=>attentionInboxSignalOp(this.reads);taskJobsSignal=()=>taskJobsSignalOp(this.reads);worktreeChangesSignal=()=>worktreeChangesSignalOp(this.reads);usageSnapshotSignal=()=>usageSnapshotSignalOp(this.reads);transcriptActivitySignal=()=>transcriptActivitySignalOp(this.reads);transcriptActivityStore=()=>transcriptActivityStoreOp(this.reads);noticeStore=()=>this.noticeAcc;tabOpenStore=()=>this.tabOpenAcc;tabCloseStore=()=>this.tabCloseAcc;replyTerminalTabClose=(requestId,closed)=>replyTabCloseOp(this.client,requestId,closed);uiPromptStore=()=>this.uiPromptAcc;replyPrompt=(promptId,value)=>void this.client.request("ui.promptReply",{promptId,...value!==void 0?{value}:{}}).catch(()=>{});engineLifecycleSignal=()=>this.engineLifecycleAcc;recentTaskEvents(id){return this.client.request("task.recentEvents",{taskId:String(id)})}reportUiEvent=(kind,taskId,detail)=>void this.client.request("ui.reportEvent",{kind,...taskId?{taskId}:{},...detail?{detail}:{}}).catch(()=>{});reportEngineInterrupt=(taskId,tabId)=>reportEngineInterruptOp(this.client,String(taskId),tabId);uiPrefsSignal=()=>uiPrefsSignalOp(this.reads);uiPrefsStore=()=>uiPrefsStoreOp(this.reads);keybindingsRevSignal=()=>keybindingsRevSignalOp(this.reads);keybindingsRevStore=()=>keybindingsRevStoreOp(this.reads);listTasks=()=>listTasksOp(this.reads);getTask=(id)=>getTaskOp(this.reads,id);subscribeTasks(listener){return subscribeTasksOp(this.reads,listener)}createTask=(input)=>createTaskOp(this.client,input);ensureMainTask=(repo)=>ensureMainTaskOp(this.client,repo);openDirectoryTask=(input)=>openDirectoryTaskOp(this.client,input);adoptScratchRepo=(id,repo)=>adoptScratchRepoOp(this.client,id,repo);ensureWorktree=(id)=>ensureWorktreeOp(this.client,id);forgetProject=(repo)=>forgetProjectOp(this.client,repo);setTitle=(id,title)=>setTitleOp(this.client,id,title);setBranch=(id,branch)=>setBranchOp(this.client,id,branch);setVendor=(id,vendor,effort)=>setVendorOp(this.client,id,vendor,effort);setCommand=(id,command,vendor)=>setCommandOp(this.client,id,command,vendor);setPinned=(id,pinned)=>setPinnedOp(this.client,id,pinned);moveTask=(id,delta)=>moveTaskOp(this.client,id,delta);setStatus=(id,status)=>setStatusOp(this.client,id,status);setPrompt=(id,prompt)=>setPromptOp(this.client,id,prompt);deleteTask=(id,opts)=>deleteTaskOp(this.client,id,opts);dismissAttention=(taskId,tabId,at2)=>dismissAttentionOp(this.client,taskId,tabId,at2);markAttentionRead=(taskId,tabId,at2)=>markAttentionReadOp(this.client,taskId,tabId,at2);releaseDeferredPrompt=(id)=>releaseDeferredPromptOp(this.client,id);flushDeferredPrompts=()=>flushDeferredPromptsOp(this.client);landTask(id,opts){return landTaskOp(this.client,id,opts)}discoverAdoptableWorktrees(repo){return discoverAdoptableWorktreesOp(this.client,repo)}adoptWorktree(input){return adoptWorktreeOp(this.client,input)}listWorktrees(opts){return listWorktreesOp(this.client,opts)}listIssues(repoRoot){return listIssuesOp(this.client,repoRoot)}mutateIssue(repoRoot,op){return mutateIssueOp(this.client,repoRoot,op)}listAutomations=()=>listAutomationsOp(this.client);createAutomation=(i)=>createAutomationOp(this.client,i);automationRuns=(id)=>automationRunsOp(this.client,id);setAutomationEnabled=(id,on)=>setAutomationEnabledOp(this.client,id,on);runAutomationNow=(id)=>runAutomationNowOp(this.client,id);deleteAutomation=(id)=>deleteAutomationOp(this.client,id);listWorkItems=(a)=>listWorkItemsOp(this.client,a);listFieldNotes=(repo)=>listFieldNotesOp(this.client,repo);startWorkItem=(a)=>startWorkItemOp(this.client,a);removeWorktree(path15,force){return removeWorktreeOp(this.client,path15,force)}setActiveTask(id){return setActiveTaskOp(this.client,id)}handleEvent(name,payload){handleOrchestratorEvent(name,payload,this.signals)}}var init_remote_orchestrator=__esm(()=>{init_client_log();init_daemon_process();init_protocol();init_external_store();init_version();init_remote_orchestrator_connect();init_remote_orchestrator_events();init_remote_orchestrator_payloads();init_remote_orchestrator_writes();init_remote_orchestrator_payloads()});async function connectPaneOrchestrator(options={}){let tag=options.logTag??"orch-connect",connect2=options.connect??connectIfRunning,remote=null;try{let client=await connect2();if(!client)return logClient(tag,"no daemon running \u2014 caller degrades"),null;return remote=new RemoteOrchestrator(client,{...options.orchestratorOptions,channels:options.channels}),await remote.init(),remote}catch(err){return logClientError(tag,err),remote?.dispose(),null}}var init_connect_pane_orchestrator=__esm(()=>{init_client_log();init_daemon_process();init_remote_orchestrator()});import{existsSync as existsSync16,readFileSync as readFileSync16}from"fs";function resetKeybindingsFileCache(){cached=null}function resolveConfigFile(){let canonical2=keybindingsConfigPath();if(existsSync16(canonical2))return{canonical:canonical2,found:canonical2};let yml=canonical2.replace(/\.yaml$/,".yml");if(existsSync16(yml))return{canonical:canonical2,found:yml};return{canonical:canonical2,found:null}}function readKeybindingsFile(){if(cached)return cached;let{canonical:canonical2,found}=resolveConfigFile();if(!found)return cached={path:canonical2,exists:!1,doc:null,warnings:[]},cached;let warnings=[],doc=null;try{let text=readFileSync16(found,"utf8");doc=Bun.YAML.parse(text)}catch(err){let msg=errorMessage(err);warnings.push(`could not read/parse ${found}: ${msg}`)}return cached={path:canonical2,exists:!0,doc,warnings},cached}var cached=null;var init_keybindings_file=__esm(()=>{init_env()});function matchKey(evt){let base=[],name=evt.name;if(name)base.push(name);if(name==="return")base.push("enter");if(name==="enter")base.push("return");if(name==="backspace"&&evt.raw==="\b"&&!evt.meta&&!evt.option)base.push("ctrl+h");if(name==="linefeed"&&!evt.meta&&!evt.option)base.push("ctrl+j");let mods=[];if(evt.ctrl)mods.push("ctrl");if(evt.meta)mods.push("cmd");if(evt.option)mods.push("alt");let bareShiftChar=evt.shift&&name!==void 0&&name.length===1&&mods.length===0;if(evt.shift&&name&&name.length>1)mods.push("shift");if(mods.length===0){if(bareShiftChar)return[...base.map((n)=>`shift+${n}`),...base];return base}let prefix=`${mods.join("+")}+`;return base.map((n)=>prefix+n)}function hasReachableBinding(snapshot,predicate){for(let i=snapshot.length-1;i>=0;i--){let cfg=snapshot[i]?.config();if(!cfg||cfg.enabled===!1)continue;if(cfg.bindings.some(predicate))return!0;if(cfg.modal)return!1}return!1}function scanReachability(snapshot){let directIds=new Set,prefixIds=new Set,prefixReachable2=!1,inputPassthrough=!1,yieldedDirectIds=new Set,prefixOptions=[],seenPrefixKeys=new Set;for(let i=snapshot.length-1;i>=0;i--){let cfg=snapshot[i]?.config();if(!cfg||cfg.enabled===!1)continue;for(let binding of cfg.bindings){if(binding.passthrough)inputPassthrough=!0;if(binding.prefix===!0){if(prefixReachable2=!0,binding.id)prefixIds.add(binding.id);if(!seenPrefixKeys.has(binding.key))seenPrefixKeys.add(binding.key),prefixOptions.push({stroke:binding.key,action:binding.id??binding.key})}else if(binding.id){if(directIds.add(binding.id),binding.yieldToPassthrough)yieldedDirectIds.add(binding.id)}}if(cfg.modal)break}if(inputPassthrough)for(let id of yieldedDirectIds)directIds.delete(id);return{prefixReachable:prefixReachable2,inputPassthrough,prefixOptions,directIds,prefixIds}}function bindingReachability(snapshot){let{directIds,prefixIds,inputPassthrough}=scanReachability(snapshot);return{direct:directIds,prefix:prefixIds,inputPassthrough}}var prefixReachable=(snapshot)=>hasReachableBinding(snapshot,(binding)=>binding.prefix===!0),inputPassthroughReachable=(snapshot)=>hasReachableBinding(snapshot,(binding)=>binding.passthrough===!0);function isKittyModifierKeyName(name){return name!==void 0&&KITTY_MODIFIER_KEYS.has(name)}function isKittyModifierKeyEvent(event){return isKittyModifierKeyName(event.name)}function isCtrlModifierKeyName(name){return name==="leftctrl"||name==="rightctrl"}var KITTY_MODIFIER_KEY_NAMES,KITTY_MODIFIER_KEYS;var init_modifier_keys=__esm(()=>{KITTY_MODIFIER_KEY_NAMES=["leftshift","leftctrl","leftalt","leftsuper","lefthyper","leftmeta","rightshift","rightctrl","rightalt","rightsuper","righthyper","rightmeta","iso_level3_shift","iso_level5_shift"],KITTY_MODIFIER_KEYS=new Set(KITTY_MODIFIER_KEY_NAMES)});function prefixHudSetArmed(armed,options=[],armedAt=null){cell.update((current)=>{if(!armed)return current.guide?.kind==="prefix"?{...current,guide:null}:current;return{...current,guide:{kind:"prefix",armedAt:armedAt??Date.now(),options}}})}function prefixHudShowDirect(options){cell.update((current)=>({...current,guide:{kind:"direct",options}}))}function prefixHudHideDirect(){cell.update((current)=>current.guide?.kind==="direct"?{...current,guide:null}:current)}function prefixHudPush(entry){cell.update((current)=>({...current,guide:null,entries:[...current.entries,{...entry,id:nextEntryId++}].slice(-MAX_ENTRIES)}))}var PREFIX_HUD_TTL_MS=4000,PREFIX_GUIDE_DELAY_MS=180,MAX_ENTRIES=3,cell,nextEntryId=1,prefixHudState;var init_prefix_hud=__esm(()=>{init_external_store();cell=createStateCell({guide:null,entries:[]}),prefixHudState=cell});function prefixAction(run){return{run}}function insertRegistration(stack,reg){if(reg.modalOwner!==void 0){let firstMember=stack.findIndex((r5)=>r5.modalMember===reg.modalOwner);if(firstMember>=0){stack.splice(firstMember,0,reg);return}}stack.push(reg)}function configurePrefix(next){prefixConfiguration={...next},resetPrefixState()}function resetPrefixConfiguration(){prefixConfiguration={...DEFAULT_PREFIX_CONFIGURATION},resetPrefixState()}function currentPrefixConfiguration(){return prefixConfiguration}function resetPrefixState(){if(prefixTimer!==null)clearTimeout(prefixTimer);prefixTimer=null,prefixArmedAt=null,prefixArmedOnPassthrough=!1,prefixArmedOptions=[],prefixHudSetArmed(!1)}function armPrefix(now,options,inputPassthrough){resetPrefixState(),prefixArmedAt=now,prefixArmedOnPassthrough=inputPassthrough,prefixArmedOptions=options.slice(),prefixTimer=setTimeout(resetPrefixState,prefixConfiguration.timeoutMs),prefixHudSetArmed(!0,options,now)}function armPrefixNow(snapshot,now=Date.now()){if(prefixConfiguration.key===null)return!1;let reach=scanReachability(snapshot);if(!reach.prefixReachable)return!1;return armPrefix(now,reach.prefixOptions,reach.inputPassthrough),!0}function invokeArmedPrefixAction(bindingStack,actionId,stroke,now=Date.now()){if(dispatching||prefixArmedAt===null)return!1;let snapshot=bindingStack.slice(),armedPrefixKey=prefixConfiguration.key??"",validOption=prefixArmedOptions.some((option)=>option.action===actionId&&option.stroke===stroke),expired=now-prefixArmedAt>prefixConfiguration.timeoutMs,crossedBoundary=inputPassthroughReachable(snapshot)!==prefixArmedOnPassthrough;if(!validOption||expired||crossedBoundary)return resetPrefixState(),!1;let hit=null;for(let i=snapshot.length-1;i>=0;i--){let reg=snapshot[i];if(!reg)continue;let cfg=reg.config();if(cfg.enabled===!1)continue;let candidate=cfg.bindings.find((binding)=>binding.prefix===!0&&binding.key===stroke);if(candidate){if(candidate.id===actionId)hit=candidate;break}if(cfg.modal)break}if(!hit?.action)return resetPrefixState(),!1;resetPrefixState(),dispatching=!0;try{return hit.action.run(),prefixHudPush({prefixKey:armedPrefixKey,stroke,action:actionId,at:now}),!0}finally{dispatching=!1}}function warnShadowedMatch(snapshot,hitIndex,candidates,prefix){for(let j=hitIndex-1;j>=0;j--){let cfg=snapshot[j]?.config();if(!cfg||cfg.enabled===!1)continue;let shadowed=cfg.bindings.find((b)=>Boolean(b.prefix)===prefix&&candidates.includes(b.key));if(shadowed){if(!shadowWarned.has(shadowed.key))shadowWarned.add(shadowed.key),console.error(`[rove keymap] "${shadowed.key}" matched two ENABLED bindings \u2014 the lower one is shadowed by LIFO order. Gate one of them off (see tui-react/lib/keymap.ts header).`);return}if(cfg.modal)return}}function dispatchMode(snapshot,evt,candidates,prefix,runCmd){for(let i=snapshot.length-1;i>=0;i--){let reg=snapshot[i];if(!reg)continue;let cfg=reg.config();if(cfg.enabled===!1)continue;let hit;for(let candidate of candidates)if(hit=cfg.bindings.find((binding)=>Boolean(binding.prefix)===prefix&&binding.key===candidate),hit)break;if(hit){if(hit.yieldToPassthrough&&inputPassthroughReachable(snapshot))continue;if(!cfg.modal&&isDev())warnShadowedMatch(snapshot,i,candidates,prefix);return runCmd(()=>hit.cmd(evt,hit.slot)),hit}if(cfg.modal)return null}return null}function dispatchKeyEvent(bindingStack,evt,now=Date.now(),opts){if(evt.defaultPrevented||dispatching)return!1;if(isKittyModifierKeyName(evt.name))return evt.preventDefault(),!0;let snapshot=bindingStack.slice(),candidates=matchKey(evt),runCmd=opts?.flushSync??((fn)=>fn());dispatching=!0;try{if(prefixArmedAt!==null&&inputPassthroughReachable(snapshot)!==prefixArmedOnPassthrough)resetPrefixState();if(prefixArmedAt!==null){let armedPrefixKey=prefixConfiguration.key??"",expired=now-prefixArmedAt>prefixConfiguration.timeoutMs;if(prefixArmedAt=null,expired)resetPrefixState();else{if(candidates.includes("escape"))return resetPrefixState(),evt.preventDefault(),!0;resetPrefixState();let hit=dispatchMode(snapshot,evt,candidates,!0,runCmd);return prefixHudPush({prefixKey:armedPrefixKey,stroke:candidates[0]??"",action:hit?hit.id??hit.key:null,at:now}),evt.preventDefault(),!0}}if(prefixConfiguration.key!==null&&candidates.includes(prefixConfiguration.key)){if(prefixReachable(snapshot)){let reach=scanReachability(snapshot);return armPrefix(now,reach.prefixOptions,reach.inputPassthrough),evt.preventDefault(),!0}}let direct=dispatchMode(snapshot,evt,candidates,!1,runCmd);if(direct){if(direct.id&&direct.key.includes("+")&&!direct.key.startsWith("shift+"))prefixHudPush({prefixKey:"",stroke:direct.key,action:direct.id??direct.key,at:now});return evt.preventDefault(),!0}return!1}finally{dispatching=!1}}var dispatching=!1,DEFAULT_PREFIX_CONFIGURATION,prefixConfiguration,prefixArmedAt=null,prefixArmedOnPassthrough=!1,prefixArmedOptions,prefixTimer=null,shadowWarned;var init_keymap_dispatch=__esm(()=>{init_env();init_modifier_keys();init_prefix_hud();DEFAULT_PREFIX_CONFIGURATION={key:"ctrl+a",timeoutMs:5000},prefixConfiguration={...DEFAULT_PREFIX_CONFIGURATION},prefixArmedOptions=[];shadowWarned=new Set});function normalizeChord(raw){let rawTrimmed=raw.trim(),upperLetterKey=rawTrimmed.length===1&&rawTrimmed>="A"&&rawTrimmed<="Z",trimmed=raw.trim().toLowerCase();if(!trimmed)return{error:"empty chord"};let parts=trimmed.split("+"),key=parts.pop()??"";if(key===""&&parts.length>0&&parts[parts.length-1]==="")key="+",parts.pop();if(!key)return{error:`"${raw}": no key after the modifiers`};let mods=new Set;for(let part of parts){let mod=MOD_ALIASES[part];if(!mod)return{error:`"${raw}": unknown modifier "${part}" (use ctrl / cmd / alt / shift)`};mods.add(mod)}if(key=KEY_ALIASES[key]??key,upperLetterKey)mods.add("shift");if(mods.has("shift")&&mods.size>1&&key.length===1)return{error:`"${raw}": shift with other modifiers on a single character can never match \u2014 legacy terminals send the same byte with and without shift`};let prefix=MOD_ORDER.filter((m)=>mods.has(m)).join("+"),chord=prefix?`${prefix}+${key}`:key;if(key.length>1&&!KNOWN_NAMED_KEYS.has(key))return{chord,warning:`"${raw}": unrecognized key name "${key}" \u2014 the chord may never fire`};return{chord}}function isRecord2(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function platformSectionNames(platform){if(platform==="darwin")return["darwin","macos","mac"];if(platform==="win32")return["win32","windows"];return[platform]}function extractBindingsMap(section){if(!isRecord2(section))return null;let nested=section.bindings;if(isRecord2(nested))return nested;return section}function extractKeybindingOverrides(doc,platform){let warnings=[];if(doc===null||doc===void 0)return{entries:[],prefixEntries:[],warnings};if(!isRecord2(doc))return{entries:[],prefixEntries:[],warnings:["config root must be a YAML mapping (e.g. a top-level `bindings:` key)"]};let merged=new Map,prefixMerged=new Map,layers=[];if(doc.bindings!==void 0)if(isRecord2(doc.bindings))layers.push(doc.bindings);else warnings.push("`bindings:` must be a mapping of id \u2192 chord(s)");for(let name of platformSectionNames(platform)){let section=doc[name];if(section===void 0)continue;let map=extractBindingsMap(section);if(map)layers.push(map);else warnings.push(`\`${name}:\` must be a mapping (or contain a \`bindings:\` mapping)`)}for(let layer of layers)for(let[id,value]of Object.entries(layer)){let modeValues=isRecord2(value)&&(("direct"in value)||("prefix"in value))?[[merged,value.direct],[prefixMerged,value.prefix]]:[[merged,value]];for(let[target,modeValue]of modeValues){if(modeValue===void 0)continue;if(modeValue===null||modeValue===!1||Array.isArray(modeValue)&&modeValue.length===0){target.set(id,[]);continue}let rawChords=typeof modeValue==="string"?[modeValue]:Array.isArray(modeValue)?modeValue:null;if(!rawChords){warnings.push(`${id}: expected a chord string, a list of chords, or null \u2014 got ${typeof modeValue}`);continue}let chords=[],anyError=!1;for(let rawChord of rawChords){if(typeof rawChord!=="string"){warnings.push(`${id}: chord entries must be strings`),anyError=!0;continue}let result=normalizeChord(rawChord);if("error"in result){warnings.push(`${id}: ${result.error}`),anyError=!0;continue}if(result.warning)warnings.push(`${id}: ${result.warning}`);if(!chords.includes(result.chord))chords.push(result.chord)}if(chords.length===0&&anyError){warnings.push(`${id}: no valid chords \u2014 keeping the default`);continue}target.set(id,chords)}}return{entries:Array.from(merged,([id,keys])=>({id,keys})),prefixEntries:Array.from(prefixMerged,([id,keys])=>({id,keys})),warnings}}var MOD_ALIASES,KEY_ALIASES,KNOWN_NAMED_KEYS,MOD_ORDER;var init_keymap_overrides_parse=__esm(()=>{MOD_ALIASES={ctrl:"ctrl",control:"ctrl",ctl:"ctrl",cmd:"cmd",command:"cmd",meta:"cmd",super:"cmd",win:"cmd",alt:"alt",option:"alt",opt:"alt",shift:"shift"},KEY_ALIASES={esc:"escape",spacebar:"space",pgup:"pageup",pgdn:"pagedown",pgdown:"pagedown"},KNOWN_NAMED_KEYS=new Set(["up","down","left","right","pageup","pagedown","home","end","insert","delete","backspace","tab","space","escape","enter","return",...Array.from({length:12},(_2,i)=>`f${i+1}`)]),MOD_ORDER=["ctrl","cmd","alt","shift"]});function pairContract(first,second){let layout=`alternating [${first}, ${second}] pairs`;return{layout,validateCount:(count)=>count>=2&&count%2===0?null:`needs ${layout} (an even number of chords \u2014 got ${count})`}}function scopesOverlap(a,b){return a===b||a==="global"||b==="global"}function applyKeymapOverrides(keymap,entries,fixedIds=FIXED_BINDING_IDS){let warnings=[],applied=[];for(let entry of entries){let row=keymap.find((b)=>b.id===entry.id);if(!row){warnings.push(`${entry.id}: unknown binding id (press F1 in Rove for the full list)`);continue}let fixedReason=fixedIds[entry.id];if(fixedReason){warnings.push(`${entry.id}: not customizable \u2014 ${fixedReason}`);continue}if(row.keys.length===0&&row.prefixKeys===void 0){warnings.push(`${entry.id}: not customizable \u2014 the key is handled outside the keymap (doc-only row)`);continue}let contract=SLOT_CONTRACTS[entry.id];if(contract&&entry.keys.length>0){let problem=contract.validateCount(entry.keys.length);if(problem){warnings.push(`${entry.id}: ${problem} \u2014 keeping the default`);continue}}let keys=entry.keys.filter((chord)=>{if((chord.length===1||chord.startsWith("shift+")&&chord.length===7)&&NO_BARE_LETTER_SCOPES.has(row.scope))return warnings.push(`${entry.id}: "${chord}" dropped \u2014 a bare character on a ${row.scope}-scope binding would steal typed input (add a modifier)`),!1;return!0});if(keys.length===0&&entry.keys.length>0){warnings.push(`${entry.id}: no chords survived validation \u2014 keeping the default`);continue}if(contract&&keys.length!==entry.keys.length){warnings.push(`${entry.id}: a dropped chord would shift the slot layout (${contract.layout}) \u2014 keeping the default`);continue}let defaultKeys=row.keys,mutable=row;if(mutable.keys=keys,row.hint)if(keys.length===0)mutable.hint=void 0;else row.hint.keys=keys.join("/");applied.push({id:entry.id,keys,defaultKeys})}for(let change of applied)for(let chord of change.keys){let owner=keymap.find((b)=>b.id===change.id);if(!owner)continue;for(let other of keymap){if(other.id===change.id)continue;if(!other.keys.includes(chord))continue;if(!scopesOverlap(owner.scope,other.scope))continue;warnings.push(`${change.id}: "${chord}" also fires ${other.id} (${other.scope} scope) \u2014 last registration wins; consider a different chord`)}}return{applied,warnings}}var FIXED_BINDING_IDS,SLOT_CONTRACTS,NO_BARE_LETTER_SCOPES;var init_keymap_overrides=__esm(()=>{init_keymap_overrides_parse();FIXED_BINDING_IDS={"diff.review.cursor":"diff-review cursor is a fixed raw binding (j/k), not keymap-driven","diff.review.range":"diff-review range anchor is a fixed raw binding (v), not keymap-driven","diff.review.note":"diff-review note is a fixed raw binding (c), not keymap-driven","diff.review.send":"diff-review send is a fixed raw binding (s), not keymap-driven"};SLOT_CONTRACTS={"sidebar.goto":pairContract("top (double-tap)","bottom"),"sidebar.nav":pairContract("down","up"),"files.nav":pairContract("down","up"),"sidebar.search.nav":pairContract("down","up"),"files.hierarchy":pairContract("collapse","expand"),"files.tab":pairContract("previous tab","next tab"),"app.quit":{layout:"[quit confirm, hard exit] (second chord optional)",validateCount:(count)=>count<=2?null:`needs [quit confirm, hard exit] (1 or 2 chords \u2014 got ${count})`}},NO_BARE_LETTER_SCOPES=new Set(["global","workspace","terminal"])});function sectionOf(doc,key){if(typeof doc!=="object"||doc===null)return null;let section=doc[key];if(typeof section!=="object"||section===null||Array.isArray(section))return null;return section}function collect2(section,into,warnings){for(let[rawChord,rawValue]of Object.entries(section)){if(typeof rawValue!=="string"){warnings.push(`plugins: ${rawChord}: value must be a "pane:<id>" or "action:<id>" string`);continue}let match=rawValue.trim().match(VALUE_RE);if(!match){warnings.push(`plugins: ${rawChord}: \`${rawValue}\` is not pane:<plugin-id>.<local-id> or action:<...>`);continue}let chord=normalizeChord(rawChord);if("error"in chord){warnings.push(`plugins: ${rawChord}: ${chord.error}`);continue}if(chord.warning)warnings.push(`plugins: ${rawChord}: ${chord.warning}`);into.set(chord.chord,{chord:chord.chord,kind:match[1],target:match[2].trim()})}}function extractPluginKeybindings(doc,platform){let warnings=[],byChord=new Map,base=sectionOf(doc,"plugins");if(base)collect2(base,byChord,warnings);for(let alias of PLATFORM_SECTIONS[platform]??[]){let overlaySection=sectionOf(doc,alias),overlay=overlaySection?sectionOf(overlaySection,"plugins"):null;if(overlay)collect2(overlay,byChord,warnings)}return{entries:[...byChord.values()],warnings}}var PLATFORM_SECTIONS,VALUE_RE;var init_keymap_plugin_bindings=__esm(()=>{init_keymap_overrides_parse();PLATFORM_SECTIONS={darwin:["darwin","macos","mac"],linux:["linux"],win32:["win32","windows"]},VALUE_RE=/^(pane|action):\s*([A-Za-z0-9][A-Za-z0-9._:-]*\.[A-Za-z0-9][A-Za-z0-9_:-]*)$/});function isRecord3(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function platformKeys(platform){if(platform==="darwin")return["darwin","macos","mac"];if(platform==="win32")return["win32","windows"];return[platform]}function collectEntries(source,warnings){let out=new Map;if(source===void 0)return out;if(!isRecord3(source))return warnings.push("prefix.bindings must be a mapping of binding id to chord(s)"),out;for(let[id,raw]of Object.entries(source)){if(raw===null||Array.isArray(raw)&&raw.length===0){out.set(id,[]);continue}let rawKeys=typeof raw==="string"?[raw]:Array.isArray(raw)?raw:null;if(!rawKeys||rawKeys.some((key)=>typeof key!=="string")){warnings.push(`prefix.bindings.${id} must be a chord string, a string list, null, or []`);continue}let keys=[],anyError=!1;for(let rawKey of rawKeys){let normalized=normalizeChord(rawKey);if("error"in normalized){warnings.push(`prefix.bindings.${id}: ${normalized.error}`),anyError=!0;continue}if(!keys.includes(normalized.chord))keys.push(normalized.chord);if(normalized.warning)warnings.push(`prefix.bindings.${id}: ${normalized.warning}`)}if(keys.length===0&&anyError){warnings.push(`prefix.bindings.${id}: no valid chords \u2014 keeping the default`);continue}out.set(id,keys)}return out}function mergePrefixBlock(raw,configuration,entries,warnings){if(raw===void 0)return;if(!isRecord3(raw)){warnings.push("prefix must be a mapping");return}if("key"in raw)if(raw.key===null)configuration.key=null;else if(typeof raw.key!=="string")warnings.push("prefix.key must be a modifier chord or null");else{let normalized=normalizeChord(raw.key);if("error"in normalized)warnings.push(`prefix.key: ${normalized.error}`);else if(!normalized.chord.includes("+"))warnings.push("prefix.key must include a modifier");else configuration.key=normalized.chord}if("timeoutMs"in raw)if(typeof raw.timeoutMs!=="number"||!Number.isInteger(raw.timeoutMs)||raw.timeoutMs<100||raw.timeoutMs>1e4)warnings.push("prefix.timeoutMs must be an integer from 100 to 10000");else configuration.timeoutMs=raw.timeoutMs;for(let[id,keys]of collectEntries(raw.bindings,warnings))entries.set(id,keys)}function extractPrefixKeybindings(doc,platform){let configuration={},warnings=[],entries=new Map;if(!isRecord3(doc)){if(doc!==null&&doc!==void 0)warnings.push("keybindings document must be a mapping");return{configuration,entries:[],warnings}}mergePrefixBlock(doc.prefix,configuration,entries,warnings);for(let key of platformKeys(platform)){let overlay=doc[key];if(isRecord3(overlay))mergePrefixBlock(overlay.prefix,configuration,entries,warnings)}return{configuration,entries:[...entries].map(([id,keys])=>({id,keys})),warnings}}function applyPrefixKeymapOverrides(keymap,entries){let applied=[],warnings=[];for(let entry of entries){let row=keymap.find((candidate)=>candidate.id===entry.id);if(!row){warnings.push(`${entry.id}: unknown binding id`);continue}let mutable=row,defaultKeys=[...row.prefixKeys??[]];mutable.prefixKeys=[...entry.keys],applied.push({id:entry.id,keys:[...entry.keys],defaultKeys})}return{applied,warnings}}var init_keymap_prefix_overrides=__esm(()=>{init_keymap_overrides()});var CHAT_BINDINGS;var init_keybindings_chat=__esm(()=>{CHAT_BINDINGS=[{id:"chat.send",scope:"workspace",keys:[],category:"Workspace",description:"Send message (composer)",hint:{keys:"enter"}},{id:"chat.newline",scope:"workspace",keys:[],category:"Workspace",description:"Newline in composer",hint:{keys:"shift+enter"}},{id:"chat.cycle-mode",scope:"workspace",keys:[],category:"Workspace",description:"Cycle permission mode (composer)",hint:{keys:"shift+tab"}},{id:"chat.steer",scope:"workspace",keys:[],category:"Workspace",description:"Steer (interrupt + send) \u2014 mid-stream only",hint:{keys:"ctrl+enter"}},{id:"chat.tab.new",scope:"workspace",keys:["ctrl+t"],category:"Workspace",description:"New chat tab",hint:{keys:"ctrl+t"},presentation:"onePress"},{id:"chat.tab.chooseEngine",scope:"workspace",keys:["ctrl+e"],category:"Workspace",description:"New conversation \u2014 engine/shell picker with destination + context toggles",hint:{keys:"ctrl+e"},presentation:"onePress"},{id:"chat.tab.fork",scope:"workspace",keys:[],prefixKeys:["c"],category:"Workspace",description:"Fork this chat into a new tab (same Task directory, keeps the conversation)",hint:{keys:"ctrl+a c"}},{id:"chat.fork.new",scope:"workspace",keys:[],prefixKeys:["f"],category:"Workspace",description:"Quick-fork: create child task seeded with current repo/branch/model",hint:{keys:"ctrl+a f"}},{id:"chat.tab.close",scope:"workspace",keys:["ctrl+w"],prefixKeys:["w"],category:"Workspace",description:"Close chat tab",hint:{keys:"ctrl+w"},presentation:"onePress"},{id:"workspace.reopenSession",scope:"workspace",keys:["return"],category:"Workspace",description:"Reopen a session in a task whose tabs are all closed",hint:{keys:"enter"},presentation:"onePress"},{id:"chat.tab.rename",scope:"workspace",keys:["f2"],category:"Workspace",description:"Rename active chat tab",hint:{keys:"f2"},presentation:"onePress"},{id:"chat.tab.cycle-next",scope:"workspace",keys:["ctrl+]"],category:"Workspace",description:"Next chat tab",hint:{keys:"ctrl+]"},presentation:"onePress"},{id:"chat.tab.cycle-prev",scope:"workspace",keys:["ctrl+["],category:"Workspace",description:"Previous chat tab",hint:{keys:"ctrl+["},presentation:"onePress"},{id:"workspace.split.right",scope:"workspace",keys:["ctrl+\\"],category:"Workspace",description:"Split right",hint:{keys:"ctrl+\\"},presentation:"onePress"},{id:"workspace.split.down",scope:"workspace",keys:["ctrl+="],category:"Workspace",description:"Split down",hint:{keys:"ctrl+="},presentation:"onePress"},{id:"workspace.split.focus-next",scope:"workspace",keys:["f3"],category:"Workspace",description:"Focus next split",hint:{keys:"f3"},presentation:"onePress"},{id:"workspace.split.close",scope:"workspace",keys:["ctrl+w"],prefixKeys:["w"],category:"Workspace",description:"Close active split (tab when unsplit)",hint:{keys:"ctrl+w"},presentation:"onePress"},{id:"workspace.split.rename",scope:"workspace",keys:["f2"],category:"Workspace",description:"Rename active split (tab when unsplit)",hint:{keys:"f2"},presentation:"onePress"}]});var FILES_BINDINGS;var init_keybindings_files=__esm(()=>{FILES_BINDINGS=[{id:"files.nav",scope:"files",keys:["j","k","down","up"],category:"Files",description:"Move cursor up/down",hint:{keys:"j/k"}},{id:"files.hierarchy",scope:"files",keys:["h","l","left","right"],category:"Files",description:"Collapse / expand tree level",hint:{keys:"h/l"}},{id:"files.open",scope:"files",keys:["return"],category:"Files",description:"Open file in configured editor (diff when supported)",hint:{keys:"enter"}},{id:"files.tab",scope:"files",keys:["[","]"],category:"Files",description:"Switch tab (cycle All / Changes)",hint:{keys:"[/]"}},{id:"files.refresh",scope:"files",keys:["r"],category:"Files",description:"Refresh",hint:{keys:"r"}},{id:"files.scope",scope:"files",keys:["b"],category:"Files",description:"Toggle Changes scope (working \u2194 branch vs base)",hint:{keys:"b"}},{id:"files.diff",scope:"files",keys:["d"],category:"Files",description:"Open read-only diff in a workspace tab",hint:{keys:"d"}},{id:"files.openExternal",scope:"files",keys:["o"],category:"Files",description:"Open file in system default app (audio / video / pdf preview)",hint:{keys:"o"}},{id:"files.mention",scope:"files",keys:["a"],category:"Files",description:"Inject @<path> mention into the engine pane",hint:{keys:"a"}},{id:"files.createPR",scope:"global",keys:[],prefixKeys:["p","shift+p"],category:"Files",description:"Ask the agent to create a PR from the current task"},{id:"diff.review.cursor",scope:"workspace",keys:[],category:"Diff review",description:"Move the line cursor over the diff",hint:{keys:"j/k"}},{id:"diff.review.range",scope:"workspace",keys:[],category:"Diff review",description:"Toggle range anchor at the cursor",hint:{keys:"v"}},{id:"diff.review.note",scope:"workspace",keys:[],category:"Diff review",description:"Add a review note at the cursor",hint:{keys:"c"}},{id:"diff.review.send",scope:"workspace",keys:[],category:"Diff review",description:"Send all unsent review notes to the engine",hint:{keys:"s"}}]});var INBOX_BINDINGS;var init_keybindings_inbox=__esm(()=>{INBOX_BINDINGS=[{id:"inbox.show",scope:"global",keys:[],prefixKeys:["i"],category:"Global",description:"Open Inbox"},{id:"inbox.nav",scope:"inbox",keys:["j","k","down","up"],category:"Inbox",description:"Move cursor up/down",hint:{keys:"j/k"}},{id:"inbox.open",scope:"inbox",keys:["return"],category:"Inbox",description:"Open the selected Task and Terminal Tab",hint:{keys:"enter"}},{id:"inbox.delete",scope:"inbox",keys:["d"],category:"Inbox",description:"Remove the selected Inbox item",hint:{keys:"d"}}]});var TASK_JUMP_DIGITS,TASK_JUMP_CHORDS;var init_jump_digits=__esm(()=>{TASK_JUMP_DIGITS=["2","3","4","5","6","7","8","9","0"],TASK_JUMP_CHORDS=TASK_JUMP_DIGITS.map((d)=>`ctrl+${d}`)});var SIDEBAR_BINDINGS;var init_keybindings_sidebar=__esm(()=>{init_jump_digits();SIDEBAR_BINDINGS=[{id:"sidebar.nav",scope:"sidebar",keys:["j","k","down","up"],category:"Sidebar",description:"Move cursor up/down",hint:{keys:"j/k"}},{id:"sidebar.select",scope:"sidebar",keys:["return"],category:"Sidebar",description:"Open the selected task",hint:{keys:"enter"}},{id:"sidebar.tree.open",scope:"sidebar",keys:["l","space"],category:"Sidebar",description:"Open the row under the cursor (a tab row enters its chat)",hint:{keys:"l"}},{id:"sidebar.goto",scope:"sidebar",keys:["g","shift+g"],category:"Sidebar",description:"Top / bottom of list (gg or shift-G)"},{id:"sidebar.rename",scope:"sidebar",keys:["r"],category:"Sidebar",description:"Rename task",hint:{keys:"r"}},{id:"sidebar.localMerge",scope:"sidebar",keys:["shift+m"],category:"Sidebar",description:"Reorder row (Shift+M, then j/k)",hint:{keys:"M"}},{id:"sidebar.pin",scope:"sidebar",keys:["shift+p"],category:"Sidebar",description:"Pin / unpin task at top (Shift+P)",hint:{keys:"P"}},{id:"sidebar.sort",scope:"sidebar",keys:["t"],category:"Sidebar",description:"Switch task sort (default \u2194 recent)",hint:{keys:"t"}},{id:"sidebar.delete",scope:"sidebar",keys:["d"],category:"Sidebar",description:"Delete task (with confirm)",hint:{keys:"d"}},{id:"sidebar.search.enter",scope:"sidebar",keys:["/"],category:"Sidebar",description:"Search tasks (fuzzy filter)",hint:{keys:"/"}},{id:"sidebar.search.nav",scope:"sidebar",keys:["down","up"],category:"Sidebar",description:"Move highlight in search results"},{id:"sidebar.search.submit",scope:"sidebar",keys:["return"],category:"Sidebar",description:"Select search match and exit search"},{id:"sidebar.search.cancel",scope:"sidebar",keys:["escape"],category:"Sidebar",description:"Cancel search (restore prior selection)"},{id:"tasks.openWorktree",scope:"sidebar",keys:["o"],category:"Tasks pane",description:"Open selected Task directory in your editor",hint:{keys:"o"}},{id:"tasks.renameBranch",scope:"sidebar",keys:["b"],category:"Tasks pane",description:"Rename the selected task's git branch",hint:{keys:"b"}},{id:"tasks.cycleEngine",scope:"sidebar",keys:["v"],category:"Tasks pane",description:"Cycle engine vendor \u2014 applies on reopen",hint:{keys:"v"}},{id:"tasks.update",scope:"sidebar",keys:["u"],category:"Tasks pane",description:"Open the update page \u2014 version check + release notes",hint:{keys:"u"}},{id:"tasks.jump",scope:"global",keys:[...TASK_JUMP_CHORDS],category:"Tasks pane",description:"Jump to the task showing that digit (ctrl+2 = first row)",hint:{keys:"ctrl+2-0"},presentation:"onePress"},{id:"tasks.focusEngine",scope:"sidebar",keys:["right"],category:"Tasks pane",description:"Focus the engine pane of the current window",hint:{keys:"\u2192"}}]});var KobeKeymap;var init_keybindings_table=__esm(()=>{init_keybindings_chat();init_keybindings_files();init_keybindings_inbox();init_keybindings_sidebar();KobeKeymap=[{id:"help.open",scope:"global",keys:["f1"],category:"Global",description:"Show keybindings help",hint:{keys:"F1"},presentation:"onePress"},{id:"task.new",scope:"sidebar",keys:["n"],category:"Sidebar",description:"New task",hint:{keys:"n"}},{id:"task.new.global",scope:"global",keys:[],prefixKeys:["n"],category:"Global",description:"New task"},{id:"task.openEditor",scope:"global",keys:[],prefixKeys:["o"],category:"Global",description:"Open active Task directory in editor"},{id:"task.moveMode",scope:"global",keys:[],prefixKeys:["m"],category:"Global",description:"Reorder sidebar rows (then j/k)"},{id:"settings.open",scope:"global",keys:[],prefixKeys:[","],category:"Global",description:"Open settings"},{id:"settings.open.sidebar",scope:"sidebar",keys:["s"],category:"Sidebar",description:"Open settings",hint:{keys:"s"}},{id:"worktrees.open.sidebar",scope:"sidebar",keys:["x"],category:"Sidebar",description:"Open worktrees",hint:{keys:"x"}},{id:"kanban.open",scope:"global",keys:[],prefixKeys:["1"],category:"Global",description:"Open kanban (issues board)"},{id:"automations.open",scope:"global",keys:[],prefixKeys:["2"],category:"Global",description:"Open routines (scheduled tasks)"},{id:"workItems.open",scope:"global",keys:[],prefixKeys:["3"],category:"Global",description:"Open GitHub issues (external tracker)"},{id:"app.quit",scope:"sidebar",keys:["q","ctrl+q"],category:"Sidebar",description:"Quit (with confirm)",hint:{keys:"q"}},{id:"focus.sidebar",scope:"workspace",keys:["ctrl+q"],category:"Workspace",description:"Back to sidebar (tasks)",hint:{keys:"ctrl+q"},presentation:"onePress"},{id:"focus.previous",scope:"global",keys:[],prefixKeys:["h"],category:"Navigation",description:"Focus previous pane (files \u2192 workspace \u2192 sidebar)"},{id:"focus.next",scope:"global",keys:["f4"],prefixKeys:["l"],category:"Navigation",description:"Focus next pane (sidebar \u2192 workspace \u2192 files)",hint:{keys:"f4"},presentation:"onePress"},{id:"attention.next",scope:"global",keys:["f7"],category:"Navigation",description:"Jump to the next available Inbox item",hint:{keys:"f7"},presentation:"onePress"},{id:"workspace.zenToggle",scope:"global",keys:[],prefixKeys:["z"],category:"Navigation",description:"Toggle zen mode (hide the files column)"},{id:"chat.interrupt",scope:"workspace",keys:[],category:"Workspace",description:"Interrupt current turn (esc while streaming)"},...SIDEBAR_BINDINGS,...CHAT_BINDINGS,...FILES_BINDINGS,...INBOX_BINDINGS,{id:"terminal.scroll-up",scope:"terminal",keys:["ctrl+pageup"],category:"Terminal",description:"Scroll scrollback up",hint:{keys:"ctrl+pgup"}},{id:"terminal.scroll-down",scope:"terminal",keys:["ctrl+pagedown"],category:"Terminal",description:"Scroll scrollback down"},{id:"terminal.reset",scope:"terminal",keys:["f5"],category:"Terminal",description:"Reset terminal \u2014 kill the current shell and respawn",hint:{keys:"f5"},presentation:"onePress"},{id:"dialog.cancel",scope:"global",keys:[],category:"Dialog",description:"Close the top dialog (esc)"},{id:"dialog.newtask.tab.cycle",scope:"global",keys:[],category:"Dialog",description:"Switch New Task tab (Existing / New Repo)",hint:{keys:"ctrl+[/]"}}]});function bindByIds(handlers){let out=[];for(let id in handlers){let handler=handlers[id];if(!handler)continue;let action=typeof handler==="function"?void 0:handler,cmd=typeof handler==="function"?handler:()=>handler.run(),binding=findBinding(id),chords=binding?.keys??[],prefixChords=binding?.prefixKeys??[];if(chords.length===0&&prefixChords.length===0){console.warn(`[rove/keybindings] bindByIds: id="${id}" has no chords (or doesn't exist in KobeKeymap)`);continue}chords.forEach((key,slot)=>out.push({key,cmd,action,slot,id,yieldToPassthrough:binding?.yieldToPassthrough})),prefixChords.forEach((key,slot)=>out.push({key,prefix:!0,cmd,action,slot,id}))}return out}var init_keybindings_bindings=__esm(()=>{init_keybindings()});function defaultChordsOf(id){return KEYMAP_DEFAULTS.get(id)?.keys??[]}function resetKeymapToDefaults(){for(let row of KobeKeymap){let def=KEYMAP_DEFAULTS.get(row.id);if(!def)continue;let mutable=row;mutable.keys=[...def.keys],mutable.prefixKeys=def.prefixKeys&&[...def.prefixKeys],mutable.hint=def.hint?{...def.hint}:void 0}}function keymapVersion(){return keymapVersionValue}function subscribeKeymapVersion(listener){return keymapVersionListeners.add(listener),()=>{keymapVersionListeners.delete(listener)}}function bumpKeymapVersion(){keymapVersionValue+=1;for(let listener of[...keymapVersionListeners])listener()}function findBinding(id){return KEYMAP_BY_ID.get(id)}var KEYMAP_DEFAULTS,keymapVersionValue=0,keymapVersionListeners,KEYMAP_BY_ID;var init_keybindings=__esm(()=>{init_keybindings_table();init_keybindings_table();init_keybindings_bindings();KEYMAP_DEFAULTS=new Map(KobeKeymap.map((b)=>[b.id,{keys:[...b.keys],prefixKeys:b.prefixKeys&&[...b.prefixKeys],hint:b.hint?{...b.hint}:void 0}]));keymapVersionListeners=new Set;KEYMAP_BY_ID=new Map(KobeKeymap.map((b)=>[b.id,b]))});function applyUserKeybindings(){if(cached2)return cached2;let file=readKeybindingsFile();if(!file.exists)return cached2={path:file.path,exists:!1,applied:[],plugins:[],warnings:[]},cached2;let warnings=[...file.warnings],extracted=extractKeybindingOverrides(file.doc,process.platform);warnings.push(...extracted.warnings);let prefix=extractPrefixKeybindings(file.doc,process.platform);warnings.push(...prefix.warnings),configurePrefix({...DEFAULT_PREFIX_CONFIGURATION,...prefix.configuration});let result=applyKeymapOverrides(KobeKeymap,extracted.entries);warnings.push(...result.warnings);let applied=[...result.applied],prefixKey=prefix.configuration.key;if(prefixKey!==null&&prefixKey!==void 0){let directOwner=KobeKeymap.find((row)=>row.keys.includes(prefixKey));if(directOwner)warnings.push(`prefix.key "${prefixKey}" collides with direct binding ${directOwner.id}`)}let prefixResult=applyPrefixKeymapOverrides(KobeKeymap,[...extracted.prefixEntries,...prefix.entries]);warnings.push(...prefixResult.warnings),applied.push(...prefixResult.applied);let plugins=extractPluginKeybindings(file.doc,process.platform);warnings.push(...plugins.warnings);for(let p of plugins.entries){let owner=KobeKeymap.find((row)=>row.keys.includes(p.chord));if(owner)warnings.push(`plugins: ${p.chord} shadows ${owner.id}`)}for(let w2 of warnings)console.warn(`[rove/keybindings] ${w2}`);return cached2={path:file.path,exists:!0,applied,plugins:plugins.entries,warnings},cached2}function pluginKeybindings(){return userKeybindingsReport().plugins}function userKeybindingsReport(){return cached2??applyUserKeybindings()}function reloadUserKeybindings(){cached2=null,resetKeybindingsFileCache(),resetKeymapToDefaults(),resetPrefixConfiguration();let report=applyUserKeybindings();return bumpKeymapVersion(),report}var cached2=null;var init_keybindings_user=__esm(()=>{init_keybindings_file();init_keymap_dispatch();init_keymap_overrides();init_keymap_plugin_bindings();init_keymap_prefix_overrides();init_keybindings()});function applyUiPrefs(target,prefs){if(typeof prefs.theme==="string"&&prefs.theme.length>0&&prefs.theme!==target.selectedTheme()){if(!target.hasTheme(prefs.theme))target.reloadUserThemes();if(target.hasTheme(prefs.theme))target.setTheme(prefs.theme)}if(typeof prefs.transparentBackground==="boolean"&&prefs.transparentBackground!==target.transparentBackground())target.setTransparentBackground(prefs.transparentBackground);if(prefs.focusAccent===null||typeof prefs.focusAccent==="string"){let slot=normalizeFocusAccent(prefs.focusAccent);if(slot&&slot!==target.focusAccent())target.setFocusAccent(slot)}}function normalizeFocusAccent(value){if(value===null)return"primary";return UI_PREFS_FOCUS_ACCENT_SLOTS.includes(value)?value:null}var UI_PREFS_FOCUS_ACCENT_SLOTS;var init_apply_ui_prefs=__esm(()=>{UI_PREFS_FOCUS_ACCENT_SLOTS=["primary","success","info"]});function stallReport(gapMs,mem,heartbeatMs=STALL_HEARTBEAT_MS,thresholdMs=STALL_THRESHOLD_MS){let stallMs=gapMs-heartbeatMs;if(stallMs<thresholdMs)return null;let mb=(n)=>Math.round(n/1048576);return`event loop stalled ~${stallMs}ms \u2014 rss=${mb(mem.rss)}MB heapUsed=${mb(mem.heapUsed)}MB`}function installEventLoopStallTelemetry(){let last=Date.now(),timer=setInterval(()=>{let now=Date.now(),gap=now-last;last=now;let report=stallReport(gap,process.memoryUsage());if(report)logClient("stall",report)},STALL_HEARTBEAT_MS);return timer.unref?.(),()=>clearInterval(timer)}var STALL_HEARTBEAT_MS=1000,STALL_THRESHOLD_MS=2000;var init_event_loop_stall=__esm(()=>{init_client_log()});function hostRenderOptions(onDestroy){let base={backgroundColor:"transparent",externalOutputMode:"passthrough",exitOnCtrlC:!1,screenMode:"alternate-screen",useKittyKeyboard:KITTY_KEYBOARD};return onDestroy?{...base,onDestroy}:base}function inlineRenderOptions(heightRows,onDestroy){let base={backgroundColor:"transparent",exitOnCtrlC:!1,screenMode:"split-footer",footerHeight:heightRows,useKittyKeyboard:KITTY_KEYBOARD};return onDestroy?{...base,onDestroy}:base}function installExitRestoreBackstop(renderer){process.on("exit",()=>renderer.destroy())}function installBracketedPasteMode(stdout=process.stdout){if(!stdout.isTTY)return()=>{};let write=(seq)=>{try{stdout.write(seq)}catch{}};write(BRACKETED_PASTE_ON);let restored=!1,restore=()=>{if(restored)return;restored=!0,write(BRACKETED_PASTE_OFF)};return process.on("exit",restore),restore}function installPaneExitBackstop(){let exitScheduled=!1,scheduleExit=()=>{if(exitScheduled)return;exitScheduled=!0,setTimeout(()=>process.exit(0),5000)};for(let signal of["SIGHUP","SIGTERM","SIGINT"])process.on(signal,scheduleExit)}function installOrphanExitWatchdog(intervalMs=5000){let timer=setInterval(()=>{if(process.ppid===1)process.exit(0)},intervalMs);return timer.unref?.(),()=>clearInterval(timer)}var KITTY_KEYBOARD,BRACKETED_PASTE_ON="\x1B[?2004h",BRACKETED_PASTE_OFF="\x1B[?2004l";var init_host_render_options=__esm(()=>{KITTY_KEYBOARD={}});class ImeAnchorController{owner=null;anchor=null;claim(owner,anchor){this.owner=owner,this.anchor={x:Math.max(0,Math.trunc(anchor.x)),y:Math.max(0,Math.trunc(anchor.y))}}release(owner){if(this.owner!==owner)return!1;return this.owner=null,this.anchor=null,!0}current(){return this.anchor}}class ImeAnchorFrameTransformer{controller;pending=Buffer.alloc(0);frame=Buffer.alloc(0);constructor(controller){this.controller=controller}push(chunk){let data=this.pending.length>0?Buffer.concat([this.pending,chunk]):chunk;this.pending=Buffer.alloc(0);let output=[],offset=0;while(offset<data.length){if(this.frame.length===0){let start=data.indexOf(SYNC_START,offset);if(start<0){let tail2=data.subarray(offset),pendingLength2=longestMarkerPrefixSuffix(tail2,[SYNC_START]),safeLength2=tail2.length-pendingLength2;if(safeLength2>0)output.push(tail2.subarray(0,safeLength2));if(pendingLength2>0)this.pending=Buffer.from(tail2.subarray(safeLength2));break}if(start>offset)output.push(data.subarray(offset,start));this.frame=Buffer.from(SYNC_START),offset=start+SYNC_START.length;continue}let end=data.indexOf(SYNC_END,offset),restart=data.indexOf(SYNC_START,offset);if(restart>=0&&(end<0||restart<end)){this.frame=Buffer.from(SYNC_START),offset=restart+SYNC_START.length;continue}if(end>=0){if(end>offset)this.frame=Buffer.concat([this.frame,data.subarray(offset,end)]);output.push(this.frame);let anchor=this.controller.current();if(anchor)output.push(Buffer.from(`\x1B[${anchor.y+1};${anchor.x+1}H\x1B[?25l`));output.push(SYNC_END),this.frame=Buffer.alloc(0),offset=end+SYNC_END.length;continue}let tail=data.subarray(offset),pendingLength=longestMarkerPrefixSuffix(tail,[SYNC_START,SYNC_END]),safeLength=tail.length-pendingLength;if(safeLength>0)this.frame=Buffer.concat([this.frame,tail.subarray(0,safeLength)]);if(pendingLength>0)this.pending=Buffer.from(tail.subarray(safeLength));break}return output.length>0?Buffer.concat(output):Buffer.alloc(0)}flush(){if(this.frame.length>0)return this.frame=Buffer.alloc(0),this.pending=Buffer.alloc(0),Buffer.alloc(0);let pending=this.pending;return this.pending=Buffer.alloc(0),pending}}function longestMarkerPrefixSuffix(bytes,markers){let max=Math.min(bytes.length,Math.max(...markers.map((marker)=>marker.length-1)));for(let length=max;length>0;length-=1){let suffix=bytes.subarray(bytes.length-length);if(markers.some((marker)=>length<marker.length&&suffix.equals(marker.subarray(0,length))))return length}return 0}function asBuffer(chunk,encodingOrCallback){if(typeof chunk!=="string")return Buffer.from(chunk);let encoding=typeof encodingOrCallback==="string"?encodingOrCallback:void 0;return Buffer.from(chunk,encoding)}function writeCallback(encodingOrCallback,maybeCallback){return typeof encodingOrCallback==="function"?encodingOrCallback:maybeCallback}function createImeAnchoredOutput(target,controller=imeAnchorController){let transformer=new ImeAnchorFrameTransformer(controller),exposedWrite=(chunk,encodingOrCallback,maybeCallback)=>{let transformed=transformer.push(asBuffer(chunk,encodingOrCallback)),callback=writeCallback(encodingOrCallback,maybeCallback);if(transformed.length===0){if(callback)queueMicrotask(()=>callback(null));return!0}return callback?target.write(transformed,callback):target.write(transformed)};return{stdout:new Proxy(target,{get(stream,property){if(property==="write")return exposedWrite;let value=Reflect.get(stream,property,stream);return typeof value==="function"?value.bind(stream):value},set(stream,property,value){if(property==="write")return exposedWrite=value,!0;return Reflect.set(stream,property,value,stream)}}),flush(){let pending=transformer.flush();if(pending.length>0)target.write(pending)}}}function createHostImeOutput(opts){if(opts.platform!=="darwin"||!opts.fullscreen)return{active:!1,rendererOptions:{},attach:()=>()=>{},flush:()=>{}};let output=createImeAnchoredOutput(opts.stdout,opts.controller);return{active:!0,rendererOptions:{stdout:output.stdout,remote:!1},attach:(renderer)=>installRendererResizeForwarder(renderer,opts.stdout),flush:()=>output.flush()}}function installRendererResizeForwarder(renderer,terminal,signals=process){let onResize=()=>{let{columns:width,rows:height}=terminal;if(!width||!height)return;renderer.resize(width,height)};return signals.on("SIGWINCH",onResize),()=>signals.removeListener("SIGWINCH",onResize)}var SYNC_START,SYNC_END,imeAnchorController;var init_ime_anchor_output=__esm(()=>{SYNC_START=Buffer.from("\x1B[?2026h"),SYNC_END=Buffer.from("\x1B[?2026l");imeAnchorController=new ImeAnchorController});function useLatest(value){let ref=import_react21.useRef(value);return ref.current=value,ref}var import_react21;var init_use_latest=__esm(()=>{import_react21=__toESM(require_react_production(),1)});function FocusProvider(props){let[focused,setFocusedState]=import_react23.useState(props.initial??"sidebar"),renderer=useRenderer(),focusedRef=useLatest(focused),setFocused=import_react23.useCallback((pane)=>{if(focusedRef.current===pane)return;let current=renderer?.currentFocusedRenderable;if(current&&!current.isDestroyed)try{current.blur()}catch{}setFocusedState(pane)},[renderer]),cycle=import_react23.useCallback((delta)=>{let next=(PANE_ORDER.indexOf(focusedRef.current)+delta+PANE_ORDER.length)%PANE_ORDER.length;setFocused(PANE_ORDER[next])},[setFocused]),value=import_react23.useMemo(()=>({focused,is:(pane)=>focused===pane,setFocused,cycle}),[focused,setFocused,cycle]);return $jsx(FocusContext.Provider,{value,children:props.children})}function useFocus(){let ctx=import_react23.useContext(FocusContext);if(!ctx)throw Error("useFocus: must be called inside <FocusProvider>. See src/tui-react/context/focus.tsx.");return ctx}function useOptionalFocus(){return import_react23.useContext(FocusContext)}var import_react23,PANE_ORDER,FocusContext;var init_focus=__esm(async()=>{init_use_latest();init_jsx_runtime();await init_react();import_react23=__toESM(require_react_production(),1),PANE_ORDER=["sidebar","workspace","files","terminal"],FocusContext=import_react23.createContext(null)});function createKvCore(){let store2=createExternalStore(loadStateFile(),"kv.snapshot"),dirtyKeys=new Set,writeTimer=null;function writeNow(label){if(dirtyKeys.size===0)return!0;try{let patch={},snap=store2.get();for(let key of dirtyKeys)patch[key]=snap[key];return patchStateFile(patch),dirtyKeys.clear(),!0}catch(err){return console.error(`[rove] kv ${label} failed:`,err),!1}}function cancelTimer(){if(writeTimer)clearTimeout(writeTimer),writeTimer=null}function scheduleWrite(){cancelTimer(),writeTimer=setTimeout(()=>{writeTimer=null,writeNow("write")},WRITE_DEBOUNCE_MS)}return{snapshot:store2.get,subscribe:store2.subscribe,get(key,defaultValue){return store2.get()[key]??defaultValue},set(key,value){store2.update((s)=>{if(value!==void 0)return{...s,[key]:value};if(!(key in s))return s;let next={...s};return delete next[key],next}),dirtyKeys.add(key),scheduleWrite()},seed(key,value){if(store2.get()[key]!==void 0)return;store2.update((s)=>({...s,[key]:value}))},flush(){return cancelTimer(),writeNow("flush")},clear(){cancelTimer(),dirtyKeys.clear(),store2.set({});try{replaceStateFile({})}catch(err){console.error("[rove] kv clear write failed:",err)}}}}var WRITE_DEBOUNCE_MS=250;var init_kv_core=__esm(()=>{init_external_store();init_store()});function KVProvider(props){let[core]=import_react24.useState(createKvCore),snapshot=import_react24.useSyncExternalStore(core.subscribe,core.snapshot,core.snapshot);import_react24.useEffect(()=>{let flush=()=>{core.flush()};return process.on("exit",flush),()=>{process.off("exit",flush)}},[core]);let value=import_react24.useMemo(()=>({ready:!0,store:snapshot,signal(name,defaultValue){return core.seed(name,defaultValue),[()=>core.get(name)??defaultValue,(next)=>core.set(name,next)]},get:core.get,set:core.set,flush:core.flush,clear:core.clear}),[core,snapshot]);return $jsx(Ctx.Provider,{value,children:props.children})}function useKV(){let value=import_react24.useContext(Ctx);if(!value)throw Error("KV context must be used within a context provider");return value}function useOptionalKV(){return import_react24.useContext(Ctx)??null}var import_react24,Ctx;var init_kv=__esm(()=>{init_kv_core();init_jsx_runtime();import_react24=__toESM(require_react_production(),1),Ctx=import_react24.createContext(null)});function unreadKey(taskId,tabId){return`${taskId}:${tabId}`}function addUnread(prev,input){let key=unreadKey(input.taskId,input.tabId),existing=prev.get(key);if(existing==="needs_input"||existing==="error")return prev;let next=new Map(prev);return next.set(key,input.kind),next}function removeUnread(prev,taskId,tabId){let key=unreadKey(taskId,tabId);if(!prev.has(key))return prev;let next=new Map(prev);return next.delete(key),next}function shouldShowToast(kind,toastEnabled){return kind==="error"||toastEnabled}function attentionKindFor(state){if(state==="permission_needed")return"needs_input";if(state==="error"||state==="rate_limited"||state==="dead")return"error";if(state==="turn_complete")return"done";return null}function chipAttentionKind(turn){if(turn==="done")return"done";if(turn==="error"||turn==="rate_limited"||turn==="dead")return"error";if(turn==="needs_input")return"needs_input";return null}function attentionEdges(prev,next,skip,kindFor){if(prev===null)return[];let out=[];for(let[key,state]of next){if(key===skip)continue;if(prev.get(key)===state)continue;let kind=kindFor(state);if(kind)out.push({key,kind})}return out}function sanitizeOscBody(body){let out="",segmentStart=0;for(let i=0;i<body.length;i++){let code=body.charCodeAt(i);if(code>31&&(code<127||code>159))continue;out+=`${body.slice(segmentStart,i)} `,segmentStart=i+1}return segmentStart===0?body:out+body.slice(segmentStart)}function osc9(body){return`\x1B]9;${sanitizeOscBody(body)}\x07`}var TOAST_DURATION_MS=4500;var pulse_default="../pulse-n3cq1btw.wav";var init_pulse=()=>{};import{existsSync as existsSync17,mkdirSync as mkdirSync10}from"fs";import{tmpdir as tmpdir3}from"os";import{basename as basename6,delimiter as delimiter2,isAbsolute as isAbsolute2,join as join17,resolve as resolve6}from"path";function args(player,file,volume){if(player==="ffplay")return[player,"-autoexit","-nodisp","-af",`volume=${volume}`,file];if(player==="mpv")return[player,"--no-video","--audio-display=no","--volume",String(Math.round(volume*100)),file];if(player==="mpg123"||player==="mpg321")return[player,"-g",String(Math.round(volume*100)),file];if(player==="mplayer")return[player,"-vo","null","-volume",String(Math.round(volume*100)),file];if(player==="afplay"||player==="omxplayer"||player==="aplay"||player==="cmdmp3")return[player,file];if(player==="play")return[player,"-v",String(volume),file];if(player==="cvlc")return[player,`--gain=${volume}`,"--play-and-exit",file];return[player,"-c",`(New-Object Media.SoundPlayer '${file.replace(/'/g,"''")}').PlaySync()`]}function pathDirs(rawPath,delim=delimiter2){return rawPath.split(delim).filter(Boolean)}function pickPlayer(){if(cachedPlayer!==void 0)return cachedPlayer;let segments=pathDirs(process.env.PATH??"");return cachedPlayer=PLAYERS.find((p)=>segments.some((dir)=>existsSync17(join17(dir,p))))??null,cachedPlayer}async function ensureAsset(){return cachedPath??=(async()=>{mkdirSync10(DIR,{recursive:!0});let dest=join17(DIR,basename6(pulseAsset)),out=Bun.file(dest);if(await out.exists())return dest;return await Bun.write(out,Bun.file(pulseAsset)),dest})(),cachedPath}function pulse(volume=0.4){let player=pickPlayer();if(!player)return;ensureAsset().then((path15)=>{try{Bun.spawn(args(player,path15,volume),{stdin:"ignore",stdout:"ignore",stderr:"ignore"}).unref?.()}catch{}}).catch(()=>{return})}var pulseAsset,DIR,PLAYERS,cachedPlayer,cachedPath;var init_sound=__esm(()=>{init_pulse();pulseAsset=isAbsolute2(pulse_default)?pulse_default:resolve6(import.meta.dir,pulse_default),DIR=join17(tmpdir3(),"kobe-sfx"),PLAYERS=["ffplay","mpv","mpg123","mpg321","mplayer","afplay","play","omxplayer","aplay","cmdmp3","cvlc","powershell.exe"]});function NotificationsProvider(props){let[toasts,setToasts]=import_react25.useState([]),[unread,setUnread]=import_react25.useState(new Map),kv=useOptionalKV(),snapshot=import_react25.useMemo(()=>loadStateFile(),[]),prefs=import_react25.useMemo(()=>({"notifications.sound.enabled":kv?.get("notifications.sound.enabled")??snapshot["notifications.sound.enabled"],"notifications.toast.enabled":kv?.get("notifications.toast.enabled")??snapshot["notifications.toast.enabled"]}),[kv,snapshot]),counter=import_react25.useRef(0),timers=import_react25.useRef(new Set);import_react25.useEffect(()=>()=>{for(let id of timers.current)clearTimeout(id);timers.current.clear()},[]);let dismiss=import_react25.useCallback((id)=>{setToasts((prev)=>prev.filter((t2)=>t2.id!==id))},[]),notify=import_react25.useCallback((input)=>{if(setUnread((prev)=>addUnread(prev,input)),prefs["notifications.sound.enabled"]!==!1){try{process.stdout.write(`\x07${osc9(`Rove \u2014 ${input.title}`)}`)}catch{}pulse()}let toastEnabled=prefs["notifications.toast.enabled"]!==!1;if(shouldShowToast(input.kind,toastEnabled)){let id=++counter.current;setToasts((prev)=>[...prev,{id,...input}]);let timer=setTimeout(()=>{timers.current.delete(timer),dismiss(id)},TOAST_DURATION_MS);timers.current.add(timer)}},[prefs,dismiss]),markRead=import_react25.useCallback((taskId,tabId)=>{setUnread((prev)=>removeUnread(prev,taskId,tabId))},[]),value=import_react25.useMemo(()=>({toasts,unread,notify,dismiss,markRead}),[toasts,unread,notify,dismiss,markRead]);return $jsx(ctx.Provider,{value,children:props.children})}function useNotifications(){let value=import_react25.useContext(ctx);if(!value)throw Error("useNotifications must be used within a NotificationsProvider");return value}var import_react25,ctx;var init_notifications=__esm(()=>{init_store();init_sound();init_kv();init_jsx_runtime();import_react25=__toESM(require_react_production(),1),ctx=import_react25.createContext(null)});function createCtrlHoldDetector(callbacks){let state={kind:"idle"},held=new Set,reset=()=>{if(state.kind==="pending")clearTimeout(state.timer);if(state.kind==="visible")callbacks.onHide();state={kind:"idle"}},cancel=()=>{reset(),held.clear()};return{keypress:(event)=>{if(!isCtrlModifierKeyName(event.name)){cancel();return}if(event.eventType==="repeat"&&held.has(event.name))return;if(event.eventType!=="press")return;if(held.add(event.name),state.kind!=="idle")return;state={kind:"pending",timer:setTimeout(()=>{state={kind:"visible"},callbacks.onReveal()},CTRL_HOLD_THRESHOLD_MS)}},keyrelease:(event)=>{if(!isCtrlModifierKeyName(event.name)||event.eventType!=="release")return;if(held.delete(event.name),held.size===0)reset()},cancel}}var CTRL_HOLD_THRESHOLD_MS=400;var init_ctrl_hold=__esm(()=>{init_modifier_keys()});function formatKey(k,upper){if(k.includes("/"))return k.split("/").map((part)=>formatKey(part,upper)).join("/");let low=k.toLowerCase();if(low==="tab")return"tab";let named=KEY_GLYPH[low];if(named)return named;if(/^f\d{1,2}$/.test(low))return low.toUpperCase();if(!upper)return k;if(/^[a-z]$/.test(low))return k.toUpperCase();return k.replace(/[a-z]+/gi,(run)=>run.toUpperCase())}function formatChord(chord,prefixGlyph="\u2303A"){let s=chord.trim();if(!s)return s;let pm=/^prefix\s+(.+)$/i.exec(s);if(pm){let suffix=pm[1]??"";return`${prefixGlyph} ${suffix.includes("+")?formatChord(suffix,prefixGlyph):formatKey(suffix,!0)}`}let parts=s.split("+");if(parts.length===1)return formatKey(parts[0]??"",!1);let key=parts[parts.length-1]??"";return`${parts.slice(0,-1).map((p)=>MODIFIER_GLYPH[p.toLowerCase().trim()]??p).join("")} ${formatKey(key,!0)}`}var MODIFIER_GLYPH,KEY_GLYPH;var init_chord_glyphs=__esm(()=>{MODIFIER_GLYPH={ctrl:"\u2303",control:"\u2303",alt:"\u2325",opt:"\u2325",option:"\u2325",shift:"\u21E7",cmd:"\u2318",command:"\u2318",meta:"\u2318",super:"\u2318"},KEY_GLYPH={enter:"\u23CE",return:"\u23CE",esc:"\u238B",escape:"\u238B",space:"\u2423",up:"\u2191",down:"\u2193",left:"\u2190",right:"\u2192",backspace:"\u232B",delete:"\u2326",del:"\u2326",pgup:"\u21DE",pageup:"\u21DE",pgdn:"\u21DF",pagedown:"\u21DF",home:"\u2196",end:"\u2198"}});function ctrlFollowUpKey(chord){return CTRL_FOLLOW_UP_CHORD.test(chord)?chord.slice(5):null}function shortcutCaption(input){let binding=findBinding(input.bindingId);if(!binding)return null;if(input.reachability.direct.has(input.bindingId)){let direct=binding.keys[0];if(direct)return formatChord(direct)}if(input.prefixKey&&input.reachability.prefix.has(input.bindingId)){let stroke=binding.prefixKeys?.[0];if(stroke)return`${formatChord(input.prefixKey)} ${formatChord(stroke)}`}return null}function directGuideOptions(reachability,prefixKey){let options=KobeKeymap.filter((binding)=>reachability.direct.has(binding.id)&&!DIRECT_GUIDE_HIDDEN_ACTIONS.has(binding.id)).flatMap((binding)=>binding.keys.flatMap((chord)=>{let stroke=ctrlFollowUpKey(chord);return stroke?[{stroke,action:binding.id}]:[]})),prefixStroke=prefixKey?ctrlFollowUpKey(prefixKey):null;if(prefixStroke&&reachability.prefix.size>0)options.push({stroke:prefixStroke,action:DIRECT_GUIDE_PREFIX_ACTION_ID});return options}var DIRECT_GUIDE_PREFIX_ACTION_ID="prefix.moreCommands",CTRL_FOLLOW_UP_CHORD,DIRECT_GUIDE_HIDDEN_ACTIONS;var init_shortcut_reveal=__esm(()=>{init_keybindings();init_chord_glyphs();CTRL_FOLLOW_UP_CHORD=/^ctrl\+[^+]+$/;DIRECT_GUIDE_HIDDEN_ACTIONS=new Set(["tasks.jump"])});function ensureInstalled(renderer){if(!renderer)throw Error("useBindings: no renderer in scope; call inside a component rendered by @opentui/react.");if(installedRenderer===renderer)return;if(supersededRenderers.has(renderer))return;if(installed&&listener)installed.off("keypress",listener);if(installed&&releaseListener)installed.off("keyrelease",releaseListener);if(ctrlHoldDetector?.cancel(),installedRenderer)supersededRenderers.add(installedRenderer);stack.length=0,resetPrefixState(),installedRenderer=renderer,installed=renderer.keyInput,ctrlHoldDetector=createCtrlHoldDetector({onReveal:()=>{resetPrefixState();let options=directGuideOptions(bindingReachability(stack),currentPrefixConfiguration().key);if(options.length>0)prefixHudShowDirect(options)},onHide:prefixHudHideDirect}),listener=(evt)=>{ctrlHoldDetector?.keypress(evt),dispatchKeyEvent(stack,evt,Date.now(),{flushSync})},releaseListener=(evt)=>ctrlHoldDetector?.keyrelease(evt),installed.on("keypress",listener),installed.on("keyrelease",releaseListener)}function modalActive(){return stack.some((r5)=>r5.modalOwner!==void 0)}function currentBindingReachability(){return bindingReachability(stack)}function armPrefixFromCurrentStack(){return armPrefixNow(stack)}function invokeArmedPrefixActionFromCurrentStack(actionId,stroke){return invokeArmedPrefixAction(stack,actionId,stroke)}function bumpStackVersion(){prefixHudHideDirect(),stackVersion++;for(let listener2 of stackListeners)listener2()}function bindingReachabilitySignature(config){let bindings=config.bindings.map((binding)=>[binding.id??"",binding.key,binding.prefix===!0?"p":"d",binding.passthrough===!0?"i":"u"].join(":")).join("|");return`${config.enabled===!1?"off":"on"};${config.modal===!0?"modal":"plain"};${bindings}`}function useBindingStackVersion(){return import_react27.useSyncExternalStore((onChange)=>{return stackListeners.add(onChange),()=>stackListeners.delete(onChange)},()=>stackVersion)}function useBindings(config,opts){let renderer=useRenderer();ensureInstalled(renderer);let configRef=useLatest(config),scope=import_react27.useContext(ModalScopeContext),reachabilitySignature=bindingReachabilitySignature(config()),previousReachabilitySignature=import_react27.useRef(reachabilitySignature);import_react27.useEffect(()=>{if(previousReachabilitySignature.current===reachabilitySignature)return;previousReachabilitySignature.current=reachabilitySignature,bumpStackVersion()},[reachabilitySignature]),import_react27.useEffect(()=>{if(opts?.modalOwner!==void 0)resetPrefixState();let reg={config:()=>configRef.current(),id:nextId++,modalOwner:opts?.modalOwner,modalMember:opts?.modalOwner===void 0?scope??void 0:void 0};return insertRegistration(stack,reg),bumpStackVersion(),()=>{let i=stack.findIndex((r5)=>r5.id===reg.id);if(i>=0)stack.splice(i,1);bumpStackVersion()}},[])}function pageCloseBindings(cmd){return[{key:"escape",cmd},{key:"q",cmd},{key:"ctrl+c",cmd}]}var import_react27,ModalScopeContext,nextId=1,stack,installedRenderer=null,installed=null,listener=null,releaseListener=null,ctrlHoldDetector=null,supersededRenderers,stackVersion=0,stackListeners;var init_keymap=__esm(async()=>{init_ctrl_hold();init_keymap_dispatch();init_prefix_hud();init_shortcut_reveal();init_use_latest();init_keymap_dispatch();await init_react();import_react27=__toESM(require_react_production(),1),ModalScopeContext=import_react27.createContext(null),stack=[],supersededRenderers=new WeakSet;stackListeners=new Set});function isNarrowWidth(cols){return cols<70}function narrowSurface(args2){if(args2.focusedPane==="sidebar")return"sidebar";return args2.hasSelection||args2.hasOpenPage?"content":"sidebar"}function useDialogPaddingX(){let dims=useTerminalDimensions();return isNarrowWidth(dims.width)?1:2}function Dialog(props){let dimensions=useTerminalDimensions(),{theme}=useTheme(),renderer=useRenderer(),dismissRef=import_react29.useRef(!1),width=props.size==="xlarge"?140:props.size==="large"?110:props.size==="small"?50:80,VERTICAL_MARGIN=2,upperFifth=props.placement==="upper-fifth"&&!isNarrowWidth(dimensions.width),headerTop=Math.max(2,Math.floor(dimensions.height/5)),cardTop=upperFifth?Math.max(2,headerTop-1):0,maxCardHeight=Math.max(8,upperFifth?dimensions.height-cardTop-2:dimensions.height-4);return $jsx("box",{onMouseDown:()=>{dismissRef.current=!!renderer?.getSelection()},onMouseUp:()=>{if(dismissRef.current){dismissRef.current=!1;return}props.onClose?.()},width:dimensions.width,height:dimensions.height,alignItems:"center",justifyContent:upperFifth?"flex-start":"center",paddingTop:cardTop,position:"absolute",zIndex:3000,left:0,top:0,shouldFill:!1,children:$jsx("box",{onMouseUp:(e)=>{dismissRef.current=!1,e.stopPropagation()},width,maxWidth:dimensions.width-2,maxHeight:maxCardHeight,flexShrink:1,flexGrow:0,backgroundColor:theme.backgroundDialog,paddingTop:1,children:props.children})})}function DialogProvider(props){let[stack2,setStack]=import_react29.useState([]),[size,setSize]=import_react29.useState("medium"),[placement,setPlacement]=import_react29.useState("center"),renderer=useRenderer(),{transparentBackground:transparentBackground2}=useTheme(),focusRef=import_react29.useRef(null),refocusTimer=import_react29.useRef(null);import_react29.useEffect(()=>()=>{if(refocusTimer.current)clearTimeout(refocusTimer.current)},[]);let refocus=import_react29.useCallback(()=>{if(refocusTimer.current)clearTimeout(refocusTimer.current);refocusTimer.current=setTimeout(()=>{let focus=focusRef.current;if(!focus||focus.isDestroyed)return;function find(item){for(let child of item.getChildren()){if(child===focus)return!0;if(find(child))return!0}return!1}let root=renderer?.root;if(!root)return;if(!find(root))return;focus.focus()},1)},[renderer]),stackRef=useLatest(stack2),captureFocusIfFirst=import_react29.useCallback(()=>{if(refocusTimer.current)clearTimeout(refocusTimer.current);if(stackRef.current.length===0)focusRef.current=renderer?.currentFocusedRenderable??null,focusRef.current?.blur()},[renderer]),dismissTop=import_react29.useCallback(()=>{let selection=renderer?.getSelection();if(selection){if(renderer?.clearSelection(),selection.getSelectedText())return}stackRef.current.at(-1)?.onClose?.(),setStack((s)=>s.slice(0,-1)),refocus()},[renderer,refocus]),value=import_react29.useMemo(()=>({clear(options){for(let item of stackRef.current)item.onClose?.();if(setSize("medium"),setPlacement("center"),setStack([]),options?.refocus===!1)focusRef.current=null;else refocus()},replace(thunk,onClose){captureFocusIfFirst();for(let item of stackRef.current)item.onClose?.();setSize("medium"),setPlacement("center"),setStack([{key:++entrySeq,element:thunk,onClose}])},push(thunk,onClose){captureFocusIfFirst(),setStack((s)=>[...s,{key:++entrySeq,element:thunk,onClose}])},pop(){if(stackRef.current.at(-1)?.onClose?.(),setStack((s)=>s.slice(0,-1)),stackRef.current.length<=1)refocus()},get stack(){return stackRef.current},get size(){return size},setSize,get placement(){return placement},setPlacement}),[stack2,size,placement,refocus,captureFocusIfFirst]),top=stack2.at(-1),contentOpacity=top?transparentBackground2?TRANSPARENT_DIALOG_CONTENT_OPACITY:DIALOG_CONTENT_OPACITY:1;return $jsxs(ctx2.Provider,{value,children:[$jsx("box",{flexGrow:1,backgroundColor:top&&!transparentBackground2?"black":"transparent",children:$jsx("box",{flexGrow:1,opacity:contentOpacity,children:props.children})}),$jsx("box",{position:"absolute",zIndex:3000,children:top?$jsxs(ModalScopeContext,{value:MODAL_SCOPE,children:[$jsx(ModalBarrier,{dismissTop}),$jsx(Dialog,{onClose:()=>value.clear(),size,placement,children:top.element()},top.key)]}):null})]})}function ModalBarrier(props){return useBindings(()=>({modal:!0,bindings:[{key:"escape",cmd:props.dismissTop},{key:"ctrl+c",cmd:props.dismissTop}]}),{modalOwner:MODAL_SCOPE}),null}function useDialog(){let value=import_react29.useContext(ctx2);if(!value)throw Error("useDialog must be used within a DialogProvider");return value}function useOptionalDialog(){return import_react29.useContext(ctx2)}function showDialog(dialog,body,opts){return new Promise((resolve7)=>{if(dialog.replace(()=>body(resolve7),()=>resolve7(void 0)),opts?.size)dialog.setSize(opts.size)})}var import_react29,DIALOG_CONTENT_OPACITY=0.5,TRANSPARENT_DIALOG_CONTENT_OPACITY=0.75,entrySeq=0,ctx2,MODAL_SCOPE;var init_dialog=__esm(async()=>{init_use_latest();init_jsx_runtime();await __promiseAll([init_react(),init_theme(),init_keymap()]);import_react29=__toESM(require_react_production(),1);ctx2=import_react29.createContext(null);MODAL_SCOPE=Symbol("kobe.dialog.modal")});import{createCliRenderer}from"@opentui/core";function UiPrefsSync(){return import_react31.useEffect(()=>{let disposed=!1,orch=null,disposers=[];return(async()=>{let remote=await connectPaneOrchestrator({logTag:"ui-prefs",channels:["ui-prefs","keybindings"]});if(!remote)return;if(disposed){remote.dispose();return}orch=remote;let applyPrefs=(payload)=>{if(!payload)return;if(applyUiPrefs(themeTarget,payload),isLocaleId(payload.locale))setLocaleLang(payload.locale)},prefsStore=remote.uiPrefsStore();applyPrefs(prefsStore.get()),disposers.push(prefsStore.subscribe(()=>applyPrefs(prefsStore.get())));let revStore=remote.keybindingsRevStore(),lastKeybindingsRev=revStore.get();disposers.push(revStore.subscribe(()=>{let rev=revStore.get();if(rev==null||rev===lastKeybindingsRev)return;let isFirst=lastKeybindingsRev===null;if(lastKeybindingsRev=rev,!isFirst)reloadUserKeybindings()}))})(),()=>{disposed=!0;for(let dispose of disposers)dispose();orch?.dispose()}},[]),null}function PaneCrashFallback(){let{theme}=useTheme();return $jsxs("box",{flexDirection:"column",flexGrow:1,backgroundColor:theme.background,paddingLeft:1,paddingTop:1,gap:1,children:[$jsx("text",{fg:theme.error,children:t("common.paneCrash.title")}),$jsx("text",{fg:theme.textMuted,children:t("common.paneCrash.hint")})]})}function formatPaneCrashDiagnostic(error,info){let base=error instanceof Error?error.stack??error.message:String(error),componentStack=info.componentStack?.trim()||"(unavailable)",stateChanges=recentStateChangesForDiagnostics();return`${base}
523
+ `);else throw error}reconciler.injectIntoDevTools();_r=reconciler,flushSync=_r.flushSyncFromReconciler??_r.flushSync});import{engine as engine2,Timeline}from"@opentui/core";import{createSlotRegistry}from"@opentui/core";import{TimeToFirstDrawRenderable}from"@opentui/core";function useEffectEvent(handler){let handlerRef=import_react6.useRef(handler);return import_react6.useLayoutEffect(()=>{handlerRef.current=handler}),import_react6.useCallback((...args)=>{let fn=handlerRef.current;return fn(...args)},[])}function renderPluginFailurePlaceholder(registry,pluginFailurePlaceholder,failure,pluginId,slot){if(!pluginFailurePlaceholder)return null;try{return pluginFailurePlaceholder(failure)}catch(error){return registry.reportPluginError({pluginId,slot,phase:"error_placeholder",source:"react",error}),null}}var import_react5,import_react6,import_react7,import_react8,import_react9,import_react10,import_react11,import_react12,import_react13,import_react14,import_react15,import_react16,useRenderer=()=>{let{renderer}=useAppContext();if(!renderer)throw Error("Renderer not found.");return renderer},usePaste=(handler)=>{let{keyHandler}=useAppContext(),stableHandler=useEffectEvent(handler);import_react9.useEffect(()=>{return keyHandler?.on("paste",stableHandler),()=>{keyHandler?.off("paste",stableHandler)}},[keyHandler])},useOnResize=(callback)=>{let renderer=useRenderer(),stableCallback=useEffectEvent(callback);return import_react10.useEffect(()=>{return renderer.on("resize",stableCallback),()=>{renderer.off("resize",stableCallback)}},[renderer]),renderer},useTerminalDimensions=()=>{let renderer=useRenderer(),[dimensions,setDimensions]=import_react12.useState({width:renderer.width,height:renderer.height});return useOnResize((width,height)=>{setDimensions({width,height})}),dimensions},PluginErrorBoundary;var init_react=__esm(async()=>{init_chunk_2mx7fq49();await init_chunk_rm53pqj2();import_react5=__toESM(require_react_production(),1),import_react6=__toESM(require_react_production(),1),import_react7=__toESM(require_react_production(),1),import_react8=__toESM(require_react_production(),1),import_react9=__toESM(require_react_production(),1),import_react10=__toESM(require_react_production(),1),import_react11=__toESM(require_react_production(),1),import_react12=__toESM(require_react_production(),1),import_react13=__toESM(require_react_production(),1),import_react14=__toESM(require_react_production(),1),import_react15=__toESM(require_react_production(),1),import_react16=__toESM(require_react_production(),1);PluginErrorBoundary=class PluginErrorBoundary extends import_react14.default.Component{constructor(props){super(props);this.state={failure:null}}componentDidCatch(error){let failure=this.props.registry.reportPluginError({pluginId:this.props.pluginId,slot:this.props.slotName,phase:"render",source:"react",error});this.setState({failure})}componentDidUpdate(previousProps){if(previousProps.resetToken!==this.props.resetToken&&this.state.failure)this.setState({failure:null})}render(){if(this.state.failure){let placeholder=renderPluginFailurePlaceholder(this.props.registry,this.props.pluginFailurePlaceholder,this.state.failure,this.props.pluginId,this.props.slotName);if(placeholder===null||placeholder===void 0||placeholder===!1)return this.props.fallbackOnFailure??null;return placeholder}return this.props.children}};extend({"time-to-first-draw":TimeToFirstDrawRenderable})});function useAccessor(state){return import_react17.useSyncExternalStore(state.subscribe,state.get,state.get)}var import_react17;var init_use_accessor=__esm(()=>{import_react17=__toESM(require_react_production(),1)});function jsxProd(type,config,maybeKey){var key=null;if(maybeKey!==void 0&&(key=""+maybeKey),config.key!==void 0&&(key=""+config.key),"key"in config){maybeKey={};for(var propName in config)propName!=="key"&&(maybeKey[propName]=config[propName])}else maybeKey=config;return config=maybeKey.ref,{$$typeof:REACT_ELEMENT_TYPE,type,key,ref:config!==void 0?config:null,props:maybeKey}}var REACT_ELEMENT_TYPE,REACT_FRAGMENT_TYPE,$Fragment2,$jsx,$jsxs;var init_react_jsx_runtime_production=__esm(()=>{REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");$Fragment2=REACT_FRAGMENT_TYPE,$jsx=jsxProd,$jsxs=jsxProd});var init_jsx_runtime=__esm(()=>{init_react_jsx_runtime_production()});import{RGBA as RGBA3}from"@opentui/core";function listThemes(){return Object.keys(store.get().themes)}function hasTheme(name){return Boolean(store.get().themes[name])}function addTheme(name,theme){if(!name)return!1;if(!theme||typeof theme!=="object"||!theme.theme)return!1;return store.update((s)=>({...s,themes:{...s.themes,[name]:theme}})),!0}function selectedTheme(){return store.get().active}function setTheme(name){if(!hasTheme(name))return!1;return store.update((s)=>({...s,active:name})),!0}function transparentBackground(){return store.get().transparentBackground}function setTransparentBackground(v){store.update((s)=>({...s,transparentBackground:v}))}function focusAccent(){return store.get().focusAccent}function setFocusAccent(v){store.update((s)=>({...s,focusAccent:v}))}function resolveActive(state){let active=state.themes[state.active];if(active)return resolveTheme(active,state.mode);let fallback=state.themes[DEFAULT_THEME]??Object.values(state.themes)[0];if(!fallback)return resolveTheme({theme:{background:"#000000",text:"#ffffff"}},state.mode);return resolveTheme(fallback,state.mode)}function ThemeProvider(props){import_react19.useMemo(()=>{store.update((s)=>({...s,mode:props.mode??s.mode,active:props.theme&&s.themes[props.theme]?props.theme:s.active}))},[]);let state=useAccessor(store),renderer=useRenderer(),[hostBackground,setHostBackground]=import_react19.useState(null);import_react19.useEffect(()=>{if(!state.transparentBackground)return;if(renderer?.screenMode==="split-footer")return;if(!renderer)return;let cancelled=!1;return renderer.getPalette({timeout:HOST_PALETTE_QUERY_TIMEOUT_MS}).then((colors)=>{if(cancelled||!colors.defaultBackground)return;setHostBackground(RGBA3.fromHex(colors.defaultBackground))}).catch(()=>{}),()=>{cancelled=!0}},[renderer,state.transparentBackground]);let theme=import_react19.useMemo(()=>applyDisplayOverlay(resolveActive(state),state.focusAccent,state.transparentBackground,hostBackground??void 0),[state,hostBackground]);import_react19.useEffect(()=>{if(renderer?.screenMode==="split-footer")return;renderer?.setBackgroundColor(theme.background??RGBA3.fromInts(0,0,0))},[renderer,theme]);let value=import_react19.useMemo(()=>({theme,selected:state.active,transparentBackground:state.transparentBackground,focusAccent:state.focusAccent,mode:()=>state.mode,set(name){if(!hasTheme(name))return!1;return store.update((s)=>({...s,active:name})),!0},setMode(mode){store.update((s)=>({...s,mode}))},setTransparentBackground(v){store.update((s)=>({...s,transparentBackground:v}))},setFocusAccent(v){store.update((s)=>({...s,focusAccent:v}))},all:listThemes,has:hasTheme}),[theme,state]);return $jsx(ThemeContext.Provider,{value,children:props.children})}function useTheme(){let value=import_react19.useContext(ThemeContext);if(!value)throw Error("Theme context must be used within a context provider");return value}var import_react19,store,ThemeContext,HOST_PALETTE_QUERY_TIMEOUT_MS=2000;var init_theme=__esm(async()=>{init_external_store();init_theme_core();init_use_accessor();init_theme_core();init_jsx_runtime();await init_react();import_react19=__toESM(require_react_production(),1),store=createStateCell({themes:{...BUNDLED_THEMES},active:DEFAULT_THEME,mode:"dark",transparentBackground:!0,focusAccent:"primary"});ThemeContext=import_react19.createContext(null)});function useLang(){return useAccessor(localeState())}function useT(){let lang=useLang();return import_react20.useCallback((key,params)=>t(key,params),[lang])}var import_react20;var init_i18n2=__esm(()=>{init_i18n();init_use_accessor();init_catalog();import_react20=__toESM(require_react_production(),1)});function describePayload(value){if(value===void 0)return"undefined";if(value===null)return"null";let type=Array.isArray(value)?"array":typeof value,text;try{text=typeof value==="string"?value:JSON.stringify(value)}catch{text=String(value)}if(text.length>120)text=`${text.slice(0,120)}\u2026`;return`${type}:${text}`}function parseWorktreeChangesPayload(payload){let changes=payload?.changes;if(!changes||typeof changes!=="object"||Array.isArray(changes))return null;let map=new Map;for(let[path15,value]of Object.entries(changes)){let counts=value;if(typeof counts?.added!=="number"||typeof counts.deleted!=="number")return null;map.set(path15,{added:counts.added,deleted:counts.deleted})}return map}function decodeUiPrefsPayload(payload){let p=payload;if(typeof p?.theme!=="string")return null;return{theme:p.theme,transparentBackground:p.transparentBackground===!0,focusAccent:typeof p.focusAccent==="string"?p.focusAccent:null,locale:typeof p.locale==="string"?p.locale:"",sortMode:p.sortMode==="recent"?"recent":"default",keysCollapsed:p.keysCollapsed===!0,projectFilter:typeof p.projectFilter==="string"&&p.projectFilter.length>0?p.projectFilter:null}}function sameWorktreeChangesMap(a,b){if(a.size!==b.size)return!1;for(let[path15,counts]of a){let other=b.get(path15);if(!other||!sameWorktreeChanges(counts,other))return!1}return!0}function parseUsageSnapshotPayload(payload){let usage=payload?.usage;if(!usage||typeof usage!=="object"||Array.isArray(usage))return null;let map=new Map;for(let[vendor,value]of Object.entries(usage)){let snapshot=value;if(typeof snapshot?.capturedAt!=="number"||!Array.isArray(snapshot.windows))return null;let windows=[];for(let raw of snapshot.windows){let w2=raw;if(typeof w2?.kind!=="string"||typeof w2.label!=="string"||typeof w2.percent!=="number")return null;if(w2.resetsAt!==null&&typeof w2.resetsAt!=="number")return null;windows.push({kind:w2.kind,label:w2.label,percent:w2.percent,resetsAt:w2.resetsAt})}map.set(vendor,{windows,capturedAt:snapshot.capturedAt})}return map}function sameUsageSnapshotMap(a,b){if(a.size!==b.size)return!1;for(let[vendor,usage]of a){let other=b.get(vendor);if(!other||other.capturedAt!==usage.capturedAt||other.windows.length!==usage.windows.length)return!1;for(let i=0;i<usage.windows.length;i++){let x=usage.windows[i],y=other.windows[i];if(!x||!y||x.kind!==y.kind||x.label!==y.label||x.percent!==y.percent||x.resetsAt!==y.resetsAt)return!1}}return!0}function parseTranscriptActivityPayload(payload){let activity=payload?.activity;if(!activity||typeof activity!=="object"||Array.isArray(activity))return null;let map=new Map;for(let[path15,value]of Object.entries(activity)){let v=value;if(typeof v?.mtimeMs!=="number"||typeof v.completionAt!=="number")return null;if(v.completionId!==null&&typeof v.completionId!=="string")return null;map.set(path15,{mtimeMs:v.mtimeMs,completionId:v.completionId,completionAt:v.completionAt})}return map}function sameTranscriptActivityMap(a,b){if(a.size!==b.size)return!1;for(let[path15,v]of a){let other=b.get(path15);if(!other||other.mtimeMs!==v.mtimeMs||other.completionId!==v.completionId||other.completionAt!==v.completionAt)return!1}return!0}function shouldLogReconnectAttempt(attempt){if(attempt>RECONNECT_LOG_ATTEMPT_CEILING)return!1;return attempt===1||attempt%10===0}function deserializeTask(s){return{id:toTaskId(s.id),title:s.title,repo:s.repo,branch:s.branch,worktreePath:s.worktreePath,kind:s.kind,...s.scratch?{scratch:!0}:{},...s.routine?{routine:s.routine}:{},status:s.status,pinned:s.pinned,vendor:s.vendor,command:s.command,prStatus:s.prStatus,modelEffort:s.modelEffort,groupId:s.groupId,observedLanguage:s.observedLanguage,deletion:s.deletion,quotaResume:s.quotaResume,linkedWorkItem:s.linkedWorkItem,dispatcher:s.dispatcher,prompt:s.prompt,baseRef:s.baseRef,createdAt:s.createdAt,updatedAt:s.updatedAt}}var RECONNECT_LOG_ATTEMPT_CEILING=100;var init_remote_orchestrator_payloads=__esm(()=>{init_worktree_changes();init_task()});async function runReconnectLoop(deps){let delayMs=deps.spawnDaemon?Math.floor(Math.random()*400):500,attempt=0;while(!deps.isDisposed()){if(delayMs>0)await new Promise((r5)=>setTimeout(r5,delayMs));if(deps.isDisposed())break;attempt++;try{if(deps.spawnDaemon)await deps.ensureReachable();await deps.init(),logClient("orch",`reconnected and re-subscribed after ${attempt} attempt(s) \u2014 task list re-synced`);return}catch(err){if(isStaleInstallError(err)){logClientError("orch-reconnect-fatal",err),deps.onFatal?.(err);return}if(deps.shouldLogAttempt(attempt))logClientError("orch-reconnect",err);delayMs=delayMs===0?500:Math.min(delayMs*2,3000)}}}async function performInit(client,opts,signals){let hello=await client.request("hello",{protocolVersion:DAEMON_PROTOCOL_VERSION,minProtocolVersion:MIN_COMPATIBLE_PROTOCOL_VERSION}),daemonVersion=typeof hello.protocolVersion==="number"?hello.protocolVersion:DAEMON_PROTOCOL_VERSION,daemonMin=typeof hello.minProtocolVersion==="number"?hello.minProtocolVersion:daemonVersion;if(!isProtocolCompatible({localVersion:DAEMON_PROTOCOL_VERSION,localMin:MIN_COMPATIBLE_PROTOCOL_VERSION,remoteVersion:daemonVersion,remoteMin:daemonMin}))throw Error(`Rove daemon is protocol v${daemonVersion} (min v${daemonMin}); this client is v${DAEMON_PROTOCOL_VERSION} (min v${MIN_COMPATIBLE_PROTOCOL_VERSION}). Restart the daemon (\`rove daemon restart\`) or upgrade Rove.`);let clientHome=homeDir();if(isForeignDaemonHome(hello.homeDir,clientHome))throw Error(`Rove daemon on this socket serves ${hello.homeDir}, but this client uses ${clientHome}. A sandbox or dev daemon has taken the production socket \u2014 stop it (\`rove daemon stop\`), or unset ROVE_DAEMON_SOCKET_PATH / KOBE_DAEMON_SOCKET_PATH before starting it.`);if(signals.setDaemonVersionSig(typeof hello.kobeVersion==="string"?hello.kobeVersion:null),hello.tasks&&opts.subscribesTasks)signals.setTasks(hello.tasks.map(deserializeTask));if(await client.subscribe({role:opts.role,channels:opts.channels}),hello.capabilities?.includes("worktree.changes")){if(signals.worktreeChangesAcc()===null)signals.setWorktreeChangesSig(new Map)}else signals.setWorktreeChangesSig(null);if(hello.capabilities?.includes("transcript.activity")){if(signals.transcriptActivityAcc()===null)signals.setTranscriptActivitySig(new Map)}else signals.setTranscriptActivitySig(null);signals.setConnectionState("online"),logClient("orch",`subscribed as ${opts.role} (${signals.tasksAcc().length} tasks)`)}var init_remote_orchestrator_connect=__esm(()=>{init_client_log();init_daemon_process();init_protocol();init_env();init_remote_orchestrator_payloads()});function pruneEngineState(tasks,signals){let live=new Set(tasks.map((t2)=>t2.id)),current=signals.engineStateAcc();if(current.size>0){let next=null;for(let key of current.keys()){if(live.has(key))continue;if(!next)next=new Map(current);next.delete(key)}if(next)signals.setEngineStateSig(next)}let tabs=signals.engineTabStateAcc();if(tabs.size>0){let nextTabs=null;for(let key of tabs.keys()){if(live.has(key))continue;if(!nextTabs)nextTabs=new Map(tabs);nextTabs.delete(key)}if(nextTabs)signals.setEngineTabStateSig(nextTabs)}let lifecycle=signals.engineLifecycleAcc();if(lifecycle.size>0){let nextLifecycle=null;for(let key of lifecycle.keys()){if(live.has(key))continue;if(!nextLifecycle)nextLifecycle=new Map(lifecycle);nextLifecycle.delete(key)}if(nextLifecycle)signals.setEngineLifecycleSig(nextLifecycle)}}function pruneTaskJobs(tasks,signals){let current=signals.taskJobsAcc();if(current.size===0)return;let live=new Set(tasks.map((t2)=>t2.id)),next=null;for(let key of current.keys()){if(live.has(key))continue;if(!next)next=new Map(current);next.delete(key)}if(next)signals.setTaskJobsSig(next)}function handleOrchestratorEvent(name,payload,signals){if(name==="task.snapshot"){let value=payload?.tasks;if(Array.isArray(value))signals.setTasks(value.map(deserializeTask)),pruneEngineState(value,signals),pruneTaskJobs(value,signals);else logClientError("orch",`dropped task.snapshot event: tasks is not an array (got ${describePayload(value)})`);return}if(name==="active-task"){let id=payload?.taskId;signals.setActiveTaskSig(typeof id==="string"?id:null);return}if(name==="update"){let info=payload?.info;signals.setUpdateSig(info??null);return}if(name==="engine-state"){let p=payload;if(typeof p?.taskId!=="string"||typeof p.state!=="string"){logClientError("orch",`dropped engine-state event: taskId/state must be strings (taskId=${describePayload(p?.taskId)}, state=${describePayload(p?.state)})`);return}let tabId=typeof p.tabId==="string"&&p.tabId?p.tabId:void 0,entry={state:p.state,detail:p.detail,...typeof p.sessionId==="string"&&p.sessionId?{sessionId:p.sessionId}:{},...typeof p.transcriptPath==="string"&&p.transcriptPath?{transcriptPath:p.transcriptPath}:{},...tabId?{tabId}:{},at:typeof p.at==="number"?p.at:0},prevTask=signals.engineStateAcc().get(p.taskId),prevTaskState=prevTask?.state,next=new Map(signals.engineStateAcc());if(p.state==="idle"){if(!tabId||prevTask?.tabId===tabId)next.delete(p.taskId)}else next.set(p.taskId,entry);if(signals.setEngineStateSig(next),(p.state==="idle"||p.state==="turn_complete"||p.state==="error"||p.state==="running"&&prevTaskState!=="running")&&signals.engineLifecycleAcc().has(p.taskId)){let lifecycle=new Map(signals.engineLifecycleAcc());lifecycle.delete(p.taskId),signals.setEngineLifecycleSig(lifecycle)}if(tabId){let nextTabs=new Map(signals.engineTabStateAcc()),tabs=new Map(nextTabs.get(p.taskId)??[]);tabs.set(tabId,entry),nextTabs.set(p.taskId,tabs),signals.setEngineTabStateSig(nextTabs)}return}if(name==="attention.inbox"){let items=payload?.items;if(!Array.isArray(items)){logClientError("orch",`dropped attention.inbox event: items is not an array (${describePayload(items)})`);return}if(!items.every((item)=>{if(!item||typeof item!=="object"||Array.isArray(item))return!1;let p=item;return typeof p.taskId==="string"&&(p.tabId===null||typeof p.tabId==="string")&&isAttentionInboxState(p.state)&&(p.unread===void 0||typeof p.unread==="boolean")&&typeof p.at==="number"})){logClientError("orch",`dropped attention.inbox event: malformed item (${describePayload(items)})`);return}signals.setAttentionInboxSig(items.map((item)=>({...item,unread:item.unread!==!1})));return}if(name==="task.jobs"){let p=payload;if(typeof p?.taskId!=="string"||p.kind!=="ensureWorktree"){logClientError("orch",`dropped task.jobs event: expected string taskId + kind "ensureWorktree" (taskId=${describePayload(p?.taskId)}, kind=${describePayload(p?.kind)})`);return}let current=signals.taskJobsAcc();if(p.phase==="running"){let next=new Map(current);next.set(p.taskId,{kind:p.kind}),signals.setTaskJobsSig(next);return}if((p.phase==="done"||p.phase==="error")&&current.has(p.taskId)){let next=new Map(current);next.delete(p.taskId),signals.setTaskJobsSig(next)}return}if(name==="usage.snapshot"){let next=parseUsageSnapshotPayload(payload);if(!next){logClientError("orch",`dropped usage.snapshot event: malformed usage payload (${describePayload(payload)})`);return}let current=signals.usageSnapshotAcc();if(current&&sameUsageSnapshotMap(current,next))return;signals.setUsageSnapshotSig(next);return}if(name==="worktree.changes"){let next=parseWorktreeChangesPayload(payload);if(!next){logClientError("orch",`dropped worktree.changes event: malformed changes payload (${describePayload(payload)})`);return}let current=signals.worktreeChangesAcc();if(current&&sameWorktreeChangesMap(current,next))return;signals.setWorktreeChangesSig(next);return}if(name==="transcript.activity"){let next=parseTranscriptActivityPayload(payload);if(!next){logClientError("orch",`dropped transcript.activity event: malformed activity payload (${describePayload(payload)})`);return}let current=signals.transcriptActivityAcc();if(current&&sameTranscriptActivityMap(current,next))return;signals.setTranscriptActivitySig(next);return}if(name==="tab.open"){let p=payload;if(typeof p?.taskId!=="string"||typeof p.at!=="number"||typeof p.title!=="string"||!Array.isArray(p.argv)){logClientError("orch",`dropped tab.open event: malformed payload (${describePayload(payload)})`);return}signals.setTabOpenSig(p);return}if(name==="tab.close"){let p=payload;if(!(p&&"kind"in p&&p.kind==="terminal-tab"?typeof p.taskId==="string"&&typeof p.tabId==="string"&&typeof p.requestId==="string"&&typeof p.at==="number":typeof p?.taskId==="string"&&typeof p.at==="number"&&("title"in p)&&typeof p.title==="string")){logClientError("orch",`dropped tab.close event: malformed payload (${describePayload(payload)})`);return}signals.setTabCloseSig(p);return}if(name==="ui.prompt"){let p=payload;if(typeof p?.promptId!=="string"||typeof p.title!=="string"||typeof p.at!=="number"){logClientError("orch",`dropped ui.prompt event: malformed payload (${describePayload(payload)})`);return}signals.setUiPromptSig(p);return}if(name==="engine.lifecycle"){let p=payload;if(typeof p?.taskId!=="string"||typeof p.kind!=="string"){logClientError("orch",`dropped engine.lifecycle event: malformed payload (${describePayload(payload)})`);return}let prev=signals.engineLifecycleAcc(),cur=prev.get(p.taskId)??{subagents:0},entry=p.kind==="subagent-start"?{subagents:cur.subagents+1}:p.kind==="subagent-stop"?{subagents:Math.max(0,cur.subagents-1)}:cur;if(entry===cur&&!prev.has(p.taskId))return;let map=new Map(prev);if(entry.subagents===0)map.delete(p.taskId);else map.set(p.taskId,entry);signals.setEngineLifecycleSig(map);return}if(name==="notice.event"){let p=payload;if(typeof p?.title!=="string"||typeof p.at!=="number"||typeof p.kind!=="string"){logClientError("orch",`dropped notice.event: malformed payload (${describePayload(payload)})`);return}signals.setNoticeSig(p);return}if(name==="ui-prefs"){let decoded=decodeUiPrefsPayload(payload);if(!decoded){let theme=payload?.theme;logClientError("orch",`dropped ui-prefs event: theme must be a string (got ${describePayload(theme)})`);return}signals.setUiPrefsSig(decoded);return}if(name==="keybindings"){let p=payload;if(typeof p?.rev!=="number"){logClientError("orch",`dropped keybindings event: rev must be a number (got ${describePayload(p?.rev)})`);return}signals.setKeybindingsRevSig(p.rev)}}var init_remote_orchestrator_events=__esm(()=>{init_client_log();init_protocol();init_remote_orchestrator_payloads()});function tasksSignalOp(s){return s.tasksAcc}function activeTaskSignalOp(s){return s.activeTaskAcc}function updateSignalOp(s){return s.updateAcc}function daemonVersionSignalOp(s){return s.daemonVersionAcc}function daemonStaleSignalOp(s){return s.daemonStaleAcc}function engineStateSignalOp(s){return s.engineStateAcc}function engineTabStatesSignalOp(s){return s.engineTabStateAcc}function attentionInboxSignalOp(s){return s.attentionInboxAcc}function taskJobsSignalOp(s){return s.taskJobsAcc}function worktreeChangesSignalOp(s){return s.worktreeChangesAcc}function usageSnapshotSignalOp(s){return s.usageSnapshotAcc}function transcriptActivitySignalOp(s){return s.transcriptActivityAcc}function transcriptActivityStoreOp(s){return s.transcriptActivityStoreInner}function uiPrefsSignalOp(s){return s.uiPrefsAcc}function uiPrefsStoreOp(s){return s.uiPrefsStoreInner}function keybindingsRevSignalOp(s){return s.keybindingsRevAcc}function keybindingsRevStoreOp(s){return s.keybindingsRevStoreInner}function listTasksOp(s){return s.tasksAcc()}function getTaskOp(s,id){return s.tasksAcc().find((t2)=>t2.id===id)}function subscribeTasksOp(s,listener){try{listener(listTasksOp(s))}catch(err){console.error("[rove RemoteOrchestrator] task listener threw on subscribe:",err)}return s.tasksAcc.subscribe(()=>{try{listener(s.tasksAcc.get())}catch(err){console.error("[rove RemoteOrchestrator] task listener threw:",err)}})}async function createTaskOp(client,input){let{modelEffort,...rest}=input,res=await client.request("task.create",{...rest,effort:modelEffort});return deserializeTask(res.task)}async function ensureMainTaskOp(client,repo){let res=await client.request("task.ensureMain",{repo});return deserializeTask(res.task)}async function openDirectoryTaskOp(client,input){let res=await client.request("task.openDir",input);return deserializeTask(res.task)}async function adoptScratchRepoOp(client,id,repo){await client.request("task.adoptScratchRepo",{taskId:String(id),repo})}async function ensureWorktreeOp(client,id){return(await client.request("task.ensureWorktree",{taskId:String(id)})).worktreePath}async function forgetProjectOp(client,repo){await client.request("project.forget",{repo})}function reportEngineInterruptOp(client,taskId,tabId){client.request("engine.reportEvent",{kind:"turn-interrupted",taskId,tabId}).catch(()=>{})}async function setTitleOp(client,id,title){await client.request("task.rename",{taskId:String(id),title})}async function setBranchOp(client,id,branch){await client.request("task.setBranch",{taskId:String(id),branch})}async function setVendorOp(client,id,vendor,effort){await client.request("task.setVendor",{taskId:String(id),vendor,...effort!==void 0?{effort}:{}})}async function setCommandOp(client,id,command,vendor){await client.request("task.setCommand",{taskId:String(id),command,...vendor?{vendor}:{}})}async function setPinnedOp(client,id,pinned){await client.request("task.pin",{taskId:String(id),pinned})}async function moveTaskOp(client,id,delta){await client.request("task.move",{taskId:String(id),direction:delta<0?"up":"down"})}async function setPromptOp(client,id,prompt){await client.request("task.setPrompt",{taskId:String(id),prompt})}async function setStatusOp(client,id,status){await client.request("task.status",{taskId:String(id),status})}async function deleteTaskOp(client,id,opts){await client.request("task.delete",{taskId:String(id),force:opts?.force,deleteBranch:opts?.deleteBranch})}async function dismissAttentionOp(client,taskId,tabId,at2){return(await client.request("attention.dismiss",{taskId:String(taskId),...tabId!==null?{tabId}:{},at:at2})).deleted}async function markAttentionReadOp(client,taskId,tabId,at2){return(await client.request("attention.read",{taskId:String(taskId),...tabId!==null?{tabId}:{},at:at2})).updated}async function releaseDeferredPromptOp(client,id){let res=await client.request("deferredPrompt.release",{id});if(res.kind!=="claimed")return res.kind;if(res.cleanupPending.length>0)return"cleanup-pending";if(res.delivered.includes(id)||res.cleaned.includes(id))return"inserted";return res.retained[0]?.reason==="busy"?"deferred-again":"unavailable"}async function flushDeferredPromptsOp(client){return await client.request("deferredPrompt.flush",{})}async function landTaskOp(client,id,opts){return(await client.request("task.land",{taskId:String(id),strategy:opts?.strategy,deleteBranch:opts?.deleteBranch,removeWorktree:opts?.removeWorktree,callerCwd:opts?.callerCwd})).result}async function discoverAdoptableWorktreesOp(client,repo){return(await client.request("worktree.discoverAdoptable",{repo})).worktrees}async function adoptWorktreeOp(client,input){let res=await client.request("worktree.adopt",input);return deserializeTask(res.task)}async function listWorktreesOp(client,opts){return(await client.request("worktree.list",{network:opts?.network!==!1})).projects}async function removeWorktreeOp(client,path15,force){return(await client.request("worktree.remove",{path:path15,force})).residue??null}async function listIssuesOp(client,repoRoot){return client.request("issue.list",{repoRoot})}async function listFieldNotesOp(client,repo){return(await client.request("note.list",{repo})).notes??[]}async function mutateIssueOp(client,repoRoot,op){return client.request("issue.mutate",{repoRoot,op})}async function listAutomationsOp(client){return client.request("automation.list",{})}async function createAutomationOp(client,input){return client.request("automation.create",input)}async function automationRunsOp(client,id){return client.request("automation.runs",{id})}async function setAutomationEnabledOp(client,id,enabled){return client.request("automation.update",{id,enabled})}async function runAutomationNowOp(client,id){return client.request("automation.runNow",{id})}async function deleteAutomationOp(client,id){return client.request("automation.delete",{id})}async function listWorkItemsOp(client,args){return client.request("workitem.list",args)}async function startWorkItemOp(client,args){return client.request("workitem.start",args)}async function setActiveTaskOp(client,id){await client.request("task.setActive",{taskId:id===null?null:String(id)})}function replyTabCloseOp(client,requestId,closed){client.request("terminalTab.closeReply",{requestId,closed}).catch(()=>{})}var init_remote_orchestrator_writes=__esm(()=>{init_remote_orchestrator_payloads()});class RemoteOrchestrator{client;tasksAcc=createStateCell([],"orchestrator.tasks");activeTaskAcc=createStateCell(null,"orchestrator.active-task");updateAcc=createStateCell(null);daemonVersionAcc=createStateCell(null);daemonStaleAcc=mapReadableState(this.daemonVersionAcc,(version)=>isDaemonVersionStale(version??void 0,CURRENT_VERSION2));engineStateAcc=createStateCell(new Map);engineTabStateAcc=createStateCell(new Map);attentionInboxAcc=createStateCell([]);taskJobsAcc=createStateCell(new Map);worktreeChangesAcc=createStateCell(null);usageSnapshotAcc=createStateCell(null);transcriptActivityAcc=createStateCell(null);noticeAcc=createStateCell(null);tabOpenAcc=createStateCell(null);tabCloseAcc=createStateCell(null);uiPromptAcc=createStateCell(null);engineLifecycleAcc=createStateCell(new Map);uiPrefsAcc=createStateCell(null);keybindingsRevAcc=createStateCell(null);connectionStateAcc=createStateCell("online","orchestrator.connection");staleInstallAcc=createStateCell(null);ensureReachable;role;channels;subscribesTasks;reconnectTask=null;signals;reads;constructor(client,options={}){this.client=client;this.ensureReachable=options.ensureReachable??ensureDaemonReachable,this.role=options.role??"pane",this.channels=options.channels,this.subscribesTasks=!options.channels||options.channels.includes("task.snapshot"),this.signals={tasksAcc:this.tasksAcc,setTasks:this.tasksAcc.set,setActiveTaskSig:this.activeTaskAcc.set,setUpdateSig:this.updateAcc.set,setDaemonVersionSig:this.daemonVersionAcc.set,engineStateAcc:this.engineStateAcc,setEngineStateSig:this.engineStateAcc.set,engineTabStateAcc:this.engineTabStateAcc,setEngineTabStateSig:this.engineTabStateAcc.set,setAttentionInboxSig:this.attentionInboxAcc.set,taskJobsAcc:this.taskJobsAcc,setTaskJobsSig:this.taskJobsAcc.set,worktreeChangesAcc:this.worktreeChangesAcc,setWorktreeChangesSig:this.worktreeChangesAcc.set,usageSnapshotAcc:this.usageSnapshotAcc,setUsageSnapshotSig:this.usageSnapshotAcc.set,transcriptActivityAcc:this.transcriptActivityAcc,setTranscriptActivitySig:this.transcriptActivityAcc.set,setNoticeSig:this.noticeAcc.set,setTabOpenSig:this.tabOpenAcc.set,setTabCloseSig:this.tabCloseAcc.set,setUiPromptSig:this.uiPromptAcc.set,engineLifecycleAcc:this.engineLifecycleAcc,setEngineLifecycleSig:this.engineLifecycleAcc.set,setUiPrefsSig:this.uiPrefsAcc.set,setKeybindingsRevSig:this.keybindingsRevAcc.set,setConnectionState:this.connectionStateAcc.set},this.reads={tasksAcc:this.tasksAcc,activeTaskAcc:this.activeTaskAcc,updateAcc:this.updateAcc,daemonVersionAcc:this.daemonVersionAcc,daemonStaleAcc:this.daemonStaleAcc,engineStateAcc:this.engineStateAcc,engineTabStateAcc:this.engineTabStateAcc,attentionInboxAcc:this.attentionInboxAcc,taskJobsAcc:this.taskJobsAcc,worktreeChangesAcc:this.worktreeChangesAcc,usageSnapshotAcc:this.usageSnapshotAcc,transcriptActivityAcc:this.transcriptActivityAcc,transcriptActivityStoreInner:this.transcriptActivityAcc,noticeAcc:this.noticeAcc,uiPrefsAcc:this.uiPrefsAcc,uiPrefsStoreInner:this.uiPrefsAcc,keybindingsRevAcc:this.keybindingsRevAcc,keybindingsRevStoreInner:this.keybindingsRevAcc,connectionStateAcc:this.connectionStateAcc},this.client.on("*",(frame)=>this.handleEvent(frame.name,frame.payload)),this.client.onLifecycle("close",()=>{this.connectionStateAcc.set("disconnected");let spawnDaemon=this.role==="gui";logClient("orch",spawnDaemon?"daemon socket closed \u2014 starting silent spawning reconnect loop":"daemon socket closed \u2014 starting non-spawning reconnect loop"),this.reconnectLoop(spawnDaemon)})}reconnectLoop(spawnDaemon){if(this.reconnectTask)return this.reconnectTask;let task=runReconnectLoop({isDisposed:()=>this.client.isDisposed,spawnDaemon,ensureReachable:this.ensureReachable,init:()=>this.init(),shouldLogAttempt:shouldLogReconnectAttempt,onFatal:(err)=>this.staleInstallAcc.set(err instanceof Error?err.message:String(err))});this.reconnectTask=task;let clear=()=>{if(this.reconnectTask===task)this.reconnectTask=null};return task.then(clear,clear),task}async init(){await performInit(this.client,{role:this.role,channels:this.channels,subscribesTasks:this.subscribesTasks},this.signals)}connectionStateSignal(){return this.connectionStateAcc}staleInstallSignal(){return this.staleInstallAcc}async manualReconnect(){this.client.forceDisconnect(),await this.reconnectLoop(!0)}dispose(){this.client.close()}tasksSignal=()=>tasksSignalOp(this.reads);activeTaskSignal=()=>activeTaskSignalOp(this.reads);updateSignal=()=>updateSignalOp(this.reads);daemonVersionSignal=()=>daemonVersionSignalOp(this.reads);daemonStaleSignal=()=>daemonStaleSignalOp(this.reads);engineStateSignal=()=>engineStateSignalOp(this.reads);engineTabStatesSignal=()=>engineTabStatesSignalOp(this.reads);attentionInboxSignal=()=>attentionInboxSignalOp(this.reads);taskJobsSignal=()=>taskJobsSignalOp(this.reads);worktreeChangesSignal=()=>worktreeChangesSignalOp(this.reads);usageSnapshotSignal=()=>usageSnapshotSignalOp(this.reads);transcriptActivitySignal=()=>transcriptActivitySignalOp(this.reads);transcriptActivityStore=()=>transcriptActivityStoreOp(this.reads);noticeStore=()=>this.noticeAcc;tabOpenStore=()=>this.tabOpenAcc;tabCloseStore=()=>this.tabCloseAcc;replyTerminalTabClose=(requestId,closed)=>replyTabCloseOp(this.client,requestId,closed);uiPromptStore=()=>this.uiPromptAcc;replyPrompt=(promptId,value)=>void this.client.request("ui.promptReply",{promptId,...value!==void 0?{value}:{}}).catch(()=>{});engineLifecycleSignal=()=>this.engineLifecycleAcc;recentTaskEvents(id){return this.client.request("task.recentEvents",{taskId:String(id)})}reportUiEvent=(kind,taskId,detail)=>void this.client.request("ui.reportEvent",{kind,...taskId?{taskId}:{},...detail?{detail}:{}}).catch(()=>{});reportEngineInterrupt=(taskId,tabId)=>reportEngineInterruptOp(this.client,String(taskId),tabId);uiPrefsSignal=()=>uiPrefsSignalOp(this.reads);uiPrefsStore=()=>uiPrefsStoreOp(this.reads);keybindingsRevSignal=()=>keybindingsRevSignalOp(this.reads);keybindingsRevStore=()=>keybindingsRevStoreOp(this.reads);listTasks=()=>listTasksOp(this.reads);getTask=(id)=>getTaskOp(this.reads,id);subscribeTasks(listener){return subscribeTasksOp(this.reads,listener)}createTask=(input)=>createTaskOp(this.client,input);ensureMainTask=(repo)=>ensureMainTaskOp(this.client,repo);openDirectoryTask=(input)=>openDirectoryTaskOp(this.client,input);adoptScratchRepo=(id,repo)=>adoptScratchRepoOp(this.client,id,repo);ensureWorktree=(id)=>ensureWorktreeOp(this.client,id);forgetProject=(repo)=>forgetProjectOp(this.client,repo);setTitle=(id,title)=>setTitleOp(this.client,id,title);setBranch=(id,branch)=>setBranchOp(this.client,id,branch);setVendor=(id,vendor,effort)=>setVendorOp(this.client,id,vendor,effort);setCommand=(id,command,vendor)=>setCommandOp(this.client,id,command,vendor);setPinned=(id,pinned)=>setPinnedOp(this.client,id,pinned);moveTask=(id,delta)=>moveTaskOp(this.client,id,delta);setStatus=(id,status)=>setStatusOp(this.client,id,status);setPrompt=(id,prompt)=>setPromptOp(this.client,id,prompt);deleteTask=(id,opts)=>deleteTaskOp(this.client,id,opts);dismissAttention=(taskId,tabId,at2)=>dismissAttentionOp(this.client,taskId,tabId,at2);markAttentionRead=(taskId,tabId,at2)=>markAttentionReadOp(this.client,taskId,tabId,at2);releaseDeferredPrompt=(id)=>releaseDeferredPromptOp(this.client,id);flushDeferredPrompts=()=>flushDeferredPromptsOp(this.client);landTask(id,opts){return landTaskOp(this.client,id,opts)}discoverAdoptableWorktrees(repo){return discoverAdoptableWorktreesOp(this.client,repo)}adoptWorktree(input){return adoptWorktreeOp(this.client,input)}listWorktrees(opts){return listWorktreesOp(this.client,opts)}listIssues(repoRoot){return listIssuesOp(this.client,repoRoot)}mutateIssue(repoRoot,op){return mutateIssueOp(this.client,repoRoot,op)}listAutomations=()=>listAutomationsOp(this.client);createAutomation=(i)=>createAutomationOp(this.client,i);automationRuns=(id)=>automationRunsOp(this.client,id);setAutomationEnabled=(id,on)=>setAutomationEnabledOp(this.client,id,on);runAutomationNow=(id)=>runAutomationNowOp(this.client,id);deleteAutomation=(id)=>deleteAutomationOp(this.client,id);listWorkItems=(a)=>listWorkItemsOp(this.client,a);listFieldNotes=(repo)=>listFieldNotesOp(this.client,repo);startWorkItem=(a)=>startWorkItemOp(this.client,a);removeWorktree(path15,force){return removeWorktreeOp(this.client,path15,force)}setActiveTask(id){return setActiveTaskOp(this.client,id)}handleEvent(name,payload){handleOrchestratorEvent(name,payload,this.signals)}}var init_remote_orchestrator=__esm(()=>{init_client_log();init_daemon_process();init_protocol();init_external_store();init_version();init_remote_orchestrator_connect();init_remote_orchestrator_events();init_remote_orchestrator_payloads();init_remote_orchestrator_writes();init_remote_orchestrator_payloads()});async function connectPaneOrchestrator(options={}){let tag=options.logTag??"orch-connect",connect2=options.connect??connectIfRunning,remote=null;try{let client=await connect2();if(!client)return logClient(tag,"no daemon running \u2014 caller degrades"),null;return remote=new RemoteOrchestrator(client,{...options.orchestratorOptions,channels:options.channels}),await remote.init(),remote}catch(err){return logClientError(tag,err),remote?.dispose(),null}}var init_connect_pane_orchestrator=__esm(()=>{init_client_log();init_daemon_process();init_remote_orchestrator()});import{existsSync as existsSync16,readFileSync as readFileSync16}from"fs";function resetKeybindingsFileCache(){cached=null}function resolveConfigFile(){let canonical2=keybindingsConfigPath();if(existsSync16(canonical2))return{canonical:canonical2,found:canonical2};let yml=canonical2.replace(/\.yaml$/,".yml");if(existsSync16(yml))return{canonical:canonical2,found:yml};return{canonical:canonical2,found:null}}function readKeybindingsFile(){if(cached)return cached;let{canonical:canonical2,found}=resolveConfigFile();if(!found)return cached={path:canonical2,exists:!1,doc:null,warnings:[]},cached;let warnings=[],doc=null;try{let text=readFileSync16(found,"utf8");doc=Bun.YAML.parse(text)}catch(err){let msg=errorMessage(err);warnings.push(`could not read/parse ${found}: ${msg}`)}return cached={path:canonical2,exists:!0,doc,warnings},cached}var cached=null;var init_keybindings_file=__esm(()=>{init_env()});function matchKey(evt){let base=[],name=evt.name;if(name)base.push(name);if(name==="return")base.push("enter");if(name==="enter")base.push("return");if(name==="backspace"&&evt.raw==="\b"&&!evt.meta&&!evt.option)base.push("ctrl+h");if(name==="linefeed"&&!evt.meta&&!evt.option)base.push("ctrl+j");let mods=[];if(evt.ctrl)mods.push("ctrl");if(evt.meta)mods.push("cmd");if(evt.option)mods.push("alt");let bareShiftChar=evt.shift&&name!==void 0&&name.length===1&&mods.length===0;if(evt.shift&&name&&name.length>1)mods.push("shift");if(mods.length===0){if(bareShiftChar)return[...base.map((n)=>`shift+${n}`),...base];return base}let prefix=`${mods.join("+")}+`;return base.map((n)=>prefix+n)}function hasReachableBinding(snapshot,predicate){for(let i=snapshot.length-1;i>=0;i--){let cfg=snapshot[i]?.config();if(!cfg||cfg.enabled===!1)continue;if(cfg.bindings.some(predicate))return!0;if(cfg.modal)return!1}return!1}function scanReachability(snapshot){let directIds=new Set,prefixIds=new Set,prefixReachable2=!1,inputPassthrough=!1,yieldedDirectIds=new Set,prefixOptions=[],seenPrefixKeys=new Set;for(let i=snapshot.length-1;i>=0;i--){let cfg=snapshot[i]?.config();if(!cfg||cfg.enabled===!1)continue;for(let binding of cfg.bindings){if(binding.passthrough)inputPassthrough=!0;if(binding.prefix===!0){if(prefixReachable2=!0,binding.id)prefixIds.add(binding.id);if(!seenPrefixKeys.has(binding.key))seenPrefixKeys.add(binding.key),prefixOptions.push({stroke:binding.key,action:binding.id??binding.key})}else if(binding.id){if(directIds.add(binding.id),binding.yieldToPassthrough)yieldedDirectIds.add(binding.id)}}if(cfg.modal)break}if(inputPassthrough)for(let id of yieldedDirectIds)directIds.delete(id);return{prefixReachable:prefixReachable2,inputPassthrough,prefixOptions,directIds,prefixIds}}function bindingReachability(snapshot){let{directIds,prefixIds,inputPassthrough}=scanReachability(snapshot);return{direct:directIds,prefix:prefixIds,inputPassthrough}}var prefixReachable=(snapshot)=>hasReachableBinding(snapshot,(binding)=>binding.prefix===!0),inputPassthroughReachable=(snapshot)=>hasReachableBinding(snapshot,(binding)=>binding.passthrough===!0);function isKittyModifierKeyName(name){return name!==void 0&&KITTY_MODIFIER_KEYS.has(name)}function isKittyModifierKeyEvent(event){return isKittyModifierKeyName(event.name)}function isCtrlModifierKeyName(name){return name==="leftctrl"||name==="rightctrl"}var KITTY_MODIFIER_KEY_NAMES,KITTY_MODIFIER_KEYS;var init_modifier_keys=__esm(()=>{KITTY_MODIFIER_KEY_NAMES=["leftshift","leftctrl","leftalt","leftsuper","lefthyper","leftmeta","rightshift","rightctrl","rightalt","rightsuper","righthyper","rightmeta","iso_level3_shift","iso_level5_shift"],KITTY_MODIFIER_KEYS=new Set(KITTY_MODIFIER_KEY_NAMES)});function prefixHudSetArmed(armed,options=[],armedAt=null){cell.update((current)=>{if(!armed)return current.guide?.kind==="prefix"?{...current,guide:null}:current;return{...current,guide:{kind:"prefix",armedAt:armedAt??Date.now(),options}}})}function prefixHudShowDirect(options){cell.update((current)=>({...current,guide:{kind:"direct",options}}))}function prefixHudHideDirect(){cell.update((current)=>current.guide?.kind==="direct"?{...current,guide:null}:current)}function prefixHudPush(entry){cell.update((current)=>({...current,guide:null,entries:[...current.entries,{...entry,id:nextEntryId++}].slice(-MAX_ENTRIES)}))}var PREFIX_HUD_TTL_MS=4000,PREFIX_GUIDE_DELAY_MS=180,MAX_ENTRIES=3,cell,nextEntryId=1,prefixHudState;var init_prefix_hud=__esm(()=>{init_external_store();cell=createStateCell({guide:null,entries:[]}),prefixHudState=cell});function prefixAction(run){return{run}}function insertRegistration(stack,reg){if(reg.modalOwner!==void 0){let firstMember=stack.findIndex((r5)=>r5.modalMember===reg.modalOwner);if(firstMember>=0){stack.splice(firstMember,0,reg);return}}stack.push(reg)}function configurePrefix(next){prefixConfiguration={...next},resetPrefixState()}function resetPrefixConfiguration(){prefixConfiguration={...DEFAULT_PREFIX_CONFIGURATION},resetPrefixState()}function currentPrefixConfiguration(){return prefixConfiguration}function resetPrefixState(){if(prefixTimer!==null)clearTimeout(prefixTimer);prefixTimer=null,prefixArmedAt=null,prefixArmedOnPassthrough=!1,prefixArmedOptions=[],prefixHudSetArmed(!1)}function armPrefix(now,options,inputPassthrough){resetPrefixState(),prefixArmedAt=now,prefixArmedOnPassthrough=inputPassthrough,prefixArmedOptions=options.slice(),prefixTimer=setTimeout(resetPrefixState,prefixConfiguration.timeoutMs),prefixHudSetArmed(!0,options,now)}function armPrefixNow(snapshot,now=Date.now()){if(prefixConfiguration.key===null)return!1;let reach=scanReachability(snapshot);if(!reach.prefixReachable)return!1;return armPrefix(now,reach.prefixOptions,reach.inputPassthrough),!0}function invokeArmedPrefixAction(bindingStack,actionId,stroke,now=Date.now()){if(dispatching||prefixArmedAt===null)return!1;let snapshot=bindingStack.slice(),armedPrefixKey=prefixConfiguration.key??"",validOption=prefixArmedOptions.some((option)=>option.action===actionId&&option.stroke===stroke),expired=now-prefixArmedAt>prefixConfiguration.timeoutMs,crossedBoundary=inputPassthroughReachable(snapshot)!==prefixArmedOnPassthrough;if(!validOption||expired||crossedBoundary)return resetPrefixState(),!1;let hit=null;for(let i=snapshot.length-1;i>=0;i--){let reg=snapshot[i];if(!reg)continue;let cfg=reg.config();if(cfg.enabled===!1)continue;let candidate=cfg.bindings.find((binding)=>binding.prefix===!0&&binding.key===stroke);if(candidate){if(candidate.id===actionId)hit=candidate;break}if(cfg.modal)break}if(!hit?.action)return resetPrefixState(),!1;resetPrefixState(),dispatching=!0;try{return hit.action.run(),prefixHudPush({prefixKey:armedPrefixKey,stroke,action:actionId,at:now}),!0}finally{dispatching=!1}}function warnShadowedMatch(snapshot,hitIndex,candidates,prefix){for(let j=hitIndex-1;j>=0;j--){let cfg=snapshot[j]?.config();if(!cfg||cfg.enabled===!1)continue;let shadowed=cfg.bindings.find((b)=>Boolean(b.prefix)===prefix&&candidates.includes(b.key));if(shadowed){if(!shadowWarned.has(shadowed.key))shadowWarned.add(shadowed.key),console.error(`[rove keymap] "${shadowed.key}" matched two ENABLED bindings \u2014 the lower one is shadowed by LIFO order. Gate one of them off (see tui-react/lib/keymap.ts header).`);return}if(cfg.modal)return}}function dispatchMode(snapshot,evt,candidates,prefix,runCmd){for(let i=snapshot.length-1;i>=0;i--){let reg=snapshot[i];if(!reg)continue;let cfg=reg.config();if(cfg.enabled===!1)continue;let hit;for(let candidate of candidates)if(hit=cfg.bindings.find((binding)=>Boolean(binding.prefix)===prefix&&binding.key===candidate),hit)break;if(hit){if(hit.yieldToPassthrough&&inputPassthroughReachable(snapshot))continue;if(!cfg.modal&&isDev())warnShadowedMatch(snapshot,i,candidates,prefix);return runCmd(()=>hit.cmd(evt,hit.slot)),hit}if(cfg.modal)return null}return null}function dispatchKeyEvent(bindingStack,evt,now=Date.now(),opts){if(evt.defaultPrevented||dispatching)return!1;if(isKittyModifierKeyName(evt.name))return evt.preventDefault(),!0;let snapshot=bindingStack.slice(),candidates=matchKey(evt),runCmd=opts?.flushSync??((fn)=>fn());dispatching=!0;try{if(prefixArmedAt!==null&&inputPassthroughReachable(snapshot)!==prefixArmedOnPassthrough)resetPrefixState();if(prefixArmedAt!==null){let armedPrefixKey=prefixConfiguration.key??"",expired=now-prefixArmedAt>prefixConfiguration.timeoutMs;if(prefixArmedAt=null,expired)resetPrefixState();else{if(candidates.includes("escape"))return resetPrefixState(),evt.preventDefault(),!0;resetPrefixState();let hit=dispatchMode(snapshot,evt,candidates,!0,runCmd);return prefixHudPush({prefixKey:armedPrefixKey,stroke:candidates[0]??"",action:hit?hit.id??hit.key:null,at:now}),evt.preventDefault(),!0}}if(prefixConfiguration.key!==null&&candidates.includes(prefixConfiguration.key)){if(prefixReachable(snapshot)){let reach=scanReachability(snapshot);return armPrefix(now,reach.prefixOptions,reach.inputPassthrough),evt.preventDefault(),!0}}let direct=dispatchMode(snapshot,evt,candidates,!1,runCmd);if(direct){if(direct.id&&direct.key.includes("+")&&!direct.key.startsWith("shift+"))prefixHudPush({prefixKey:"",stroke:direct.key,action:direct.id??direct.key,at:now});return evt.preventDefault(),!0}return!1}finally{dispatching=!1}}var dispatching=!1,DEFAULT_PREFIX_CONFIGURATION,prefixConfiguration,prefixArmedAt=null,prefixArmedOnPassthrough=!1,prefixArmedOptions,prefixTimer=null,shadowWarned;var init_keymap_dispatch=__esm(()=>{init_env();init_modifier_keys();init_prefix_hud();DEFAULT_PREFIX_CONFIGURATION={key:"ctrl+a",timeoutMs:5000},prefixConfiguration={...DEFAULT_PREFIX_CONFIGURATION},prefixArmedOptions=[];shadowWarned=new Set});function normalizeChord(raw){let rawTrimmed=raw.trim(),upperLetterKey=rawTrimmed.length===1&&rawTrimmed>="A"&&rawTrimmed<="Z",trimmed=raw.trim().toLowerCase();if(!trimmed)return{error:"empty chord"};let parts=trimmed.split("+"),key=parts.pop()??"";if(key===""&&parts.length>0&&parts[parts.length-1]==="")key="+",parts.pop();if(!key)return{error:`"${raw}": no key after the modifiers`};let mods=new Set;for(let part of parts){let mod=MOD_ALIASES[part];if(!mod)return{error:`"${raw}": unknown modifier "${part}" (use ctrl / cmd / alt / shift)`};mods.add(mod)}if(key=KEY_ALIASES[key]??key,upperLetterKey)mods.add("shift");if(mods.has("shift")&&mods.size>1&&key.length===1)return{error:`"${raw}": shift with other modifiers on a single character can never match \u2014 legacy terminals send the same byte with and without shift`};let prefix=MOD_ORDER.filter((m)=>mods.has(m)).join("+"),chord=prefix?`${prefix}+${key}`:key;if(key.length>1&&!KNOWN_NAMED_KEYS.has(key))return{chord,warning:`"${raw}": unrecognized key name "${key}" \u2014 the chord may never fire`};return{chord}}function isRecord2(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function platformSectionNames(platform){if(platform==="darwin")return["darwin","macos","mac"];if(platform==="win32")return["win32","windows"];return[platform]}function extractBindingsMap(section){if(!isRecord2(section))return null;let nested=section.bindings;if(isRecord2(nested))return nested;return section}function extractKeybindingOverrides(doc,platform){let warnings=[];if(doc===null||doc===void 0)return{entries:[],prefixEntries:[],warnings};if(!isRecord2(doc))return{entries:[],prefixEntries:[],warnings:["config root must be a YAML mapping (e.g. a top-level `bindings:` key)"]};let merged=new Map,prefixMerged=new Map,layers=[];if(doc.bindings!==void 0)if(isRecord2(doc.bindings))layers.push(doc.bindings);else warnings.push("`bindings:` must be a mapping of id \u2192 chord(s)");for(let name of platformSectionNames(platform)){let section=doc[name];if(section===void 0)continue;let map=extractBindingsMap(section);if(map)layers.push(map);else warnings.push(`\`${name}:\` must be a mapping (or contain a \`bindings:\` mapping)`)}for(let layer of layers)for(let[id,value]of Object.entries(layer)){let modeValues=isRecord2(value)&&(("direct"in value)||("prefix"in value))?[[merged,value.direct],[prefixMerged,value.prefix]]:[[merged,value]];for(let[target,modeValue]of modeValues){if(modeValue===void 0)continue;if(modeValue===null||modeValue===!1||Array.isArray(modeValue)&&modeValue.length===0){target.set(id,[]);continue}let rawChords=typeof modeValue==="string"?[modeValue]:Array.isArray(modeValue)?modeValue:null;if(!rawChords){warnings.push(`${id}: expected a chord string, a list of chords, or null \u2014 got ${typeof modeValue}`);continue}let chords=[],anyError=!1;for(let rawChord of rawChords){if(typeof rawChord!=="string"){warnings.push(`${id}: chord entries must be strings`),anyError=!0;continue}let result=normalizeChord(rawChord);if("error"in result){warnings.push(`${id}: ${result.error}`),anyError=!0;continue}if(result.warning)warnings.push(`${id}: ${result.warning}`);if(!chords.includes(result.chord))chords.push(result.chord)}if(chords.length===0&&anyError){warnings.push(`${id}: no valid chords \u2014 keeping the default`);continue}target.set(id,chords)}}return{entries:Array.from(merged,([id,keys])=>({id,keys})),prefixEntries:Array.from(prefixMerged,([id,keys])=>({id,keys})),warnings}}var MOD_ALIASES,KEY_ALIASES,KNOWN_NAMED_KEYS,MOD_ORDER;var init_keymap_overrides_parse=__esm(()=>{MOD_ALIASES={ctrl:"ctrl",control:"ctrl",ctl:"ctrl",cmd:"cmd",command:"cmd",meta:"cmd",super:"cmd",win:"cmd",alt:"alt",option:"alt",opt:"alt",shift:"shift"},KEY_ALIASES={esc:"escape",spacebar:"space",pgup:"pageup",pgdn:"pagedown",pgdown:"pagedown"},KNOWN_NAMED_KEYS=new Set(["up","down","left","right","pageup","pagedown","home","end","insert","delete","backspace","tab","space","escape","enter","return",...Array.from({length:12},(_2,i)=>`f${i+1}`)]),MOD_ORDER=["ctrl","cmd","alt","shift"]});function pairContract(first,second){let layout=`alternating [${first}, ${second}] pairs`;return{layout,validateCount:(count)=>count>=2&&count%2===0?null:`needs ${layout} (an even number of chords \u2014 got ${count})`}}function scopesOverlap(a,b){return a===b||a==="global"||b==="global"}function applyKeymapOverrides(keymap,entries,fixedIds=FIXED_BINDING_IDS){let warnings=[],applied=[];for(let entry of entries){let row=keymap.find((b)=>b.id===entry.id);if(!row){warnings.push(`${entry.id}: unknown binding id (press F1 in Rove for the full list)`);continue}let fixedReason=fixedIds[entry.id];if(fixedReason){warnings.push(`${entry.id}: not customizable \u2014 ${fixedReason}`);continue}if(row.keys.length===0&&row.prefixKeys===void 0){warnings.push(`${entry.id}: not customizable \u2014 the key is handled outside the keymap (doc-only row)`);continue}let contract=SLOT_CONTRACTS[entry.id];if(contract&&entry.keys.length>0){let problem=contract.validateCount(entry.keys.length);if(problem){warnings.push(`${entry.id}: ${problem} \u2014 keeping the default`);continue}}let keys=entry.keys.filter((chord)=>{if((chord.length===1||chord.startsWith("shift+")&&chord.length===7)&&NO_BARE_LETTER_SCOPES.has(row.scope))return warnings.push(`${entry.id}: "${chord}" dropped \u2014 a bare character on a ${row.scope}-scope binding would steal typed input (add a modifier)`),!1;return!0});if(keys.length===0&&entry.keys.length>0){warnings.push(`${entry.id}: no chords survived validation \u2014 keeping the default`);continue}if(contract&&keys.length!==entry.keys.length){warnings.push(`${entry.id}: a dropped chord would shift the slot layout (${contract.layout}) \u2014 keeping the default`);continue}let defaultKeys=row.keys,mutable=row;if(mutable.keys=keys,row.hint)if(keys.length===0)mutable.hint=void 0;else row.hint.keys=keys.join("/");applied.push({id:entry.id,keys,defaultKeys})}for(let change of applied)for(let chord of change.keys){let owner=keymap.find((b)=>b.id===change.id);if(!owner)continue;for(let other of keymap){if(other.id===change.id)continue;if(!other.keys.includes(chord))continue;if(!scopesOverlap(owner.scope,other.scope))continue;warnings.push(`${change.id}: "${chord}" also fires ${other.id} (${other.scope} scope) \u2014 last registration wins; consider a different chord`)}}return{applied,warnings}}var FIXED_BINDING_IDS,SLOT_CONTRACTS,NO_BARE_LETTER_SCOPES;var init_keymap_overrides=__esm(()=>{init_keymap_overrides_parse();FIXED_BINDING_IDS={"diff.review.cursor":"diff-review cursor is a fixed raw binding (j/k), not keymap-driven","diff.review.range":"diff-review range anchor is a fixed raw binding (v), not keymap-driven","diff.review.note":"diff-review note is a fixed raw binding (c), not keymap-driven","diff.review.send":"diff-review send is a fixed raw binding (s), not keymap-driven"};SLOT_CONTRACTS={"sidebar.goto":pairContract("top (double-tap)","bottom"),"sidebar.nav":pairContract("down","up"),"files.nav":pairContract("down","up"),"sidebar.search.nav":pairContract("down","up"),"files.hierarchy":pairContract("collapse","expand"),"files.tab":pairContract("previous tab","next tab"),"app.quit":{layout:"[quit confirm, hard exit] (second chord optional)",validateCount:(count)=>count<=2?null:`needs [quit confirm, hard exit] (1 or 2 chords \u2014 got ${count})`}},NO_BARE_LETTER_SCOPES=new Set(["global","workspace","terminal"])});function sectionOf(doc,key){if(typeof doc!=="object"||doc===null)return null;let section=doc[key];if(typeof section!=="object"||section===null||Array.isArray(section))return null;return section}function collect2(section,into,warnings){for(let[rawChord,rawValue]of Object.entries(section)){if(typeof rawValue!=="string"){warnings.push(`plugins: ${rawChord}: value must be a "pane:<id>" or "action:<id>" string`);continue}let match=rawValue.trim().match(VALUE_RE);if(!match){warnings.push(`plugins: ${rawChord}: \`${rawValue}\` is not pane:<plugin-id>.<local-id> or action:<...>`);continue}let chord=normalizeChord(rawChord);if("error"in chord){warnings.push(`plugins: ${rawChord}: ${chord.error}`);continue}if(chord.warning)warnings.push(`plugins: ${rawChord}: ${chord.warning}`);into.set(chord.chord,{chord:chord.chord,kind:match[1],target:match[2].trim()})}}function extractPluginKeybindings(doc,platform){let warnings=[],byChord=new Map,base=sectionOf(doc,"plugins");if(base)collect2(base,byChord,warnings);for(let alias of PLATFORM_SECTIONS[platform]??[]){let overlaySection=sectionOf(doc,alias),overlay=overlaySection?sectionOf(overlaySection,"plugins"):null;if(overlay)collect2(overlay,byChord,warnings)}return{entries:[...byChord.values()],warnings}}var PLATFORM_SECTIONS,VALUE_RE;var init_keymap_plugin_bindings=__esm(()=>{init_keymap_overrides_parse();PLATFORM_SECTIONS={darwin:["darwin","macos","mac"],linux:["linux"],win32:["win32","windows"]},VALUE_RE=/^(pane|action):\s*([A-Za-z0-9][A-Za-z0-9._:-]*\.[A-Za-z0-9][A-Za-z0-9_:-]*)$/});function isRecord3(value){return typeof value==="object"&&value!==null&&!Array.isArray(value)}function platformKeys(platform){if(platform==="darwin")return["darwin","macos","mac"];if(platform==="win32")return["win32","windows"];return[platform]}function collectEntries(source,warnings){let out=new Map;if(source===void 0)return out;if(!isRecord3(source))return warnings.push("prefix.bindings must be a mapping of binding id to chord(s)"),out;for(let[id,raw]of Object.entries(source)){if(raw===null||Array.isArray(raw)&&raw.length===0){out.set(id,[]);continue}let rawKeys=typeof raw==="string"?[raw]:Array.isArray(raw)?raw:null;if(!rawKeys||rawKeys.some((key)=>typeof key!=="string")){warnings.push(`prefix.bindings.${id} must be a chord string, a string list, null, or []`);continue}let keys=[],anyError=!1;for(let rawKey of rawKeys){let normalized=normalizeChord(rawKey);if("error"in normalized){warnings.push(`prefix.bindings.${id}: ${normalized.error}`),anyError=!0;continue}if(!keys.includes(normalized.chord))keys.push(normalized.chord);if(normalized.warning)warnings.push(`prefix.bindings.${id}: ${normalized.warning}`)}if(keys.length===0&&anyError){warnings.push(`prefix.bindings.${id}: no valid chords \u2014 keeping the default`);continue}out.set(id,keys)}return out}function mergePrefixBlock(raw,configuration,entries,warnings){if(raw===void 0)return;if(!isRecord3(raw)){warnings.push("prefix must be a mapping");return}if("key"in raw)if(raw.key===null)configuration.key=null;else if(typeof raw.key!=="string")warnings.push("prefix.key must be a modifier chord or null");else{let normalized=normalizeChord(raw.key);if("error"in normalized)warnings.push(`prefix.key: ${normalized.error}`);else if(!normalized.chord.includes("+"))warnings.push("prefix.key must include a modifier");else configuration.key=normalized.chord}if("timeoutMs"in raw)if(typeof raw.timeoutMs!=="number"||!Number.isInteger(raw.timeoutMs)||raw.timeoutMs<100||raw.timeoutMs>1e4)warnings.push("prefix.timeoutMs must be an integer from 100 to 10000");else configuration.timeoutMs=raw.timeoutMs;for(let[id,keys]of collectEntries(raw.bindings,warnings))entries.set(id,keys)}function extractPrefixKeybindings(doc,platform){let configuration={},warnings=[],entries=new Map;if(!isRecord3(doc)){if(doc!==null&&doc!==void 0)warnings.push("keybindings document must be a mapping");return{configuration,entries:[],warnings}}mergePrefixBlock(doc.prefix,configuration,entries,warnings);for(let key of platformKeys(platform)){let overlay=doc[key];if(isRecord3(overlay))mergePrefixBlock(overlay.prefix,configuration,entries,warnings)}return{configuration,entries:[...entries].map(([id,keys])=>({id,keys})),warnings}}function applyPrefixKeymapOverrides(keymap,entries){let applied=[],warnings=[];for(let entry of entries){let row=keymap.find((candidate)=>candidate.id===entry.id);if(!row){warnings.push(`${entry.id}: unknown binding id`);continue}let mutable=row,defaultKeys=[...row.prefixKeys??[]];mutable.prefixKeys=[...entry.keys],applied.push({id:entry.id,keys:[...entry.keys],defaultKeys})}return{applied,warnings}}var init_keymap_prefix_overrides=__esm(()=>{init_keymap_overrides()});var CHAT_BINDINGS;var init_keybindings_chat=__esm(()=>{CHAT_BINDINGS=[{id:"chat.send",scope:"workspace",keys:[],category:"Workspace",description:"Send message (composer)",hint:{keys:"enter"}},{id:"chat.newline",scope:"workspace",keys:[],category:"Workspace",description:"Newline in composer",hint:{keys:"shift+enter"}},{id:"chat.cycle-mode",scope:"workspace",keys:[],category:"Workspace",description:"Cycle permission mode (composer)",hint:{keys:"shift+tab"}},{id:"chat.steer",scope:"workspace",keys:[],category:"Workspace",description:"Steer (interrupt + send) \u2014 mid-stream only",hint:{keys:"ctrl+enter"}},{id:"chat.tab.new",scope:"workspace",keys:["ctrl+t"],category:"Workspace",description:"New chat tab",hint:{keys:"ctrl+t"},presentation:"onePress"},{id:"chat.tab.chooseEngine",scope:"workspace",keys:["ctrl+e"],category:"Workspace",description:"New conversation \u2014 engine/shell picker with destination + context toggles",hint:{keys:"ctrl+e"},presentation:"onePress"},{id:"chat.tab.fork",scope:"workspace",keys:[],prefixKeys:["c"],category:"Workspace",description:"Fork this chat into a new tab (same Task directory, keeps the conversation)",hint:{keys:"ctrl+a c"}},{id:"chat.fork.new",scope:"workspace",keys:[],prefixKeys:["f"],category:"Workspace",description:"Quick-fork: create child task seeded with current repo/branch/model",hint:{keys:"ctrl+a f"}},{id:"chat.tab.close",scope:"workspace",keys:["ctrl+w"],prefixKeys:["w"],category:"Workspace",description:"Close chat tab",hint:{keys:"ctrl+w"},presentation:"onePress"},{id:"workspace.reopenSession",scope:"workspace",keys:["return"],category:"Workspace",description:"Reopen a session in a task whose tabs are all closed",hint:{keys:"enter"},presentation:"onePress"},{id:"chat.tab.rename",scope:"workspace",keys:["f2"],category:"Workspace",description:"Rename active chat tab",hint:{keys:"f2"},presentation:"onePress"},{id:"chat.tab.cycle-next",scope:"workspace",keys:["ctrl+]"],category:"Workspace",description:"Next chat tab",hint:{keys:"ctrl+]"},presentation:"onePress"},{id:"chat.tab.cycle-prev",scope:"workspace",keys:["ctrl+["],category:"Workspace",description:"Previous chat tab",hint:{keys:"ctrl+["},presentation:"onePress"},{id:"workspace.split.right",scope:"workspace",keys:["ctrl+\\"],category:"Workspace",description:"Split right",hint:{keys:"ctrl+\\"},presentation:"onePress"},{id:"workspace.split.down",scope:"workspace",keys:["ctrl+="],category:"Workspace",description:"Split down",hint:{keys:"ctrl+="},presentation:"onePress"},{id:"workspace.split.focus-next",scope:"workspace",keys:["f3"],category:"Workspace",description:"Focus next split",hint:{keys:"f3"},presentation:"onePress"},{id:"workspace.split.close",scope:"workspace",keys:["ctrl+w"],prefixKeys:["w"],category:"Workspace",description:"Close active split (tab when unsplit)",hint:{keys:"ctrl+w"},presentation:"onePress"},{id:"workspace.split.rename",scope:"workspace",keys:["f2"],category:"Workspace",description:"Rename active split (tab when unsplit)",hint:{keys:"f2"},presentation:"onePress"}]});var FILES_BINDINGS;var init_keybindings_files=__esm(()=>{FILES_BINDINGS=[{id:"files.nav",scope:"files",keys:["j","k","down","up"],category:"Files",description:"Move cursor up/down",hint:{keys:"j/k"}},{id:"files.hierarchy",scope:"files",keys:["h","l","left","right"],category:"Files",description:"Collapse / expand tree level",hint:{keys:"h/l"}},{id:"files.open",scope:"files",keys:["return"],category:"Files",description:"Open file in configured editor (diff when supported)",hint:{keys:"enter"}},{id:"files.tab",scope:"files",keys:["[","]"],category:"Files",description:"Switch tab (cycle All / Changes)",hint:{keys:"[/]"}},{id:"files.refresh",scope:"files",keys:["r"],category:"Files",description:"Refresh",hint:{keys:"r"}},{id:"files.scope",scope:"files",keys:["b"],category:"Files",description:"Toggle Changes scope (working \u2194 branch vs base)",hint:{keys:"b"}},{id:"files.diff",scope:"files",keys:["d"],category:"Files",description:"Open read-only diff in a workspace tab",hint:{keys:"d"}},{id:"files.openExternal",scope:"files",keys:["o"],category:"Files",description:"Open file in system default app (audio / video / pdf preview)",hint:{keys:"o"}},{id:"files.mention",scope:"files",keys:["a"],category:"Files",description:"Inject @<path> mention into the engine pane",hint:{keys:"a"}},{id:"files.createPR",scope:"global",keys:[],prefixKeys:["p","shift+p"],category:"Files",description:"Ask the agent to create a PR from the current task"},{id:"diff.review.cursor",scope:"workspace",keys:[],category:"Diff review",description:"Move the line cursor over the diff",hint:{keys:"j/k"}},{id:"diff.review.range",scope:"workspace",keys:[],category:"Diff review",description:"Toggle range anchor at the cursor",hint:{keys:"v"}},{id:"diff.review.note",scope:"workspace",keys:[],category:"Diff review",description:"Add a review note at the cursor",hint:{keys:"c"}},{id:"diff.review.send",scope:"workspace",keys:[],category:"Diff review",description:"Send all unsent review notes to the engine",hint:{keys:"s"}}]});var INBOX_BINDINGS;var init_keybindings_inbox=__esm(()=>{INBOX_BINDINGS=[{id:"inbox.show",scope:"global",keys:[],prefixKeys:["i"],category:"Global",description:"Open Inbox"},{id:"inbox.nav",scope:"inbox",keys:["j","k","down","up"],category:"Inbox",description:"Move cursor up/down",hint:{keys:"j/k"}},{id:"inbox.open",scope:"inbox",keys:["return"],category:"Inbox",description:"Open the selected Task and Terminal Tab",hint:{keys:"enter"}},{id:"inbox.delete",scope:"inbox",keys:["d"],category:"Inbox",description:"Remove the selected Inbox item",hint:{keys:"d"}}]});var TASK_JUMP_DIGITS,TASK_JUMP_CHORDS;var init_jump_digits=__esm(()=>{TASK_JUMP_DIGITS=["2","3","4","5","6","7","8","9","0"],TASK_JUMP_CHORDS=TASK_JUMP_DIGITS.map((d)=>`ctrl+${d}`)});var SIDEBAR_BINDINGS;var init_keybindings_sidebar=__esm(()=>{init_jump_digits();SIDEBAR_BINDINGS=[{id:"sidebar.nav",scope:"sidebar",keys:["j","k","down","up"],category:"Sidebar",description:"Move cursor up/down",hint:{keys:"j/k"}},{id:"sidebar.select",scope:"sidebar",keys:["return"],category:"Sidebar",description:"Open the selected task",hint:{keys:"enter"}},{id:"sidebar.tree.open",scope:"sidebar",keys:["l","space"],category:"Sidebar",description:"Open the row under the cursor (a tab row enters its chat)",hint:{keys:"l"}},{id:"sidebar.goto",scope:"sidebar",keys:["g","shift+g"],category:"Sidebar",description:"Top / bottom of list (gg or shift-G)"},{id:"sidebar.rename",scope:"sidebar",keys:["r"],category:"Sidebar",description:"Rename task",hint:{keys:"r"}},{id:"sidebar.localMerge",scope:"sidebar",keys:["shift+m"],category:"Sidebar",description:"Reorder row (Shift+M, then j/k)",hint:{keys:"M"}},{id:"sidebar.pin",scope:"sidebar",keys:["shift+p"],category:"Sidebar",description:"Pin / unpin task at top (Shift+P)",hint:{keys:"P"}},{id:"sidebar.sort",scope:"sidebar",keys:["t"],category:"Sidebar",description:"Switch task sort (default \u2194 recent)",hint:{keys:"t"}},{id:"sidebar.delete",scope:"sidebar",keys:["d"],category:"Sidebar",description:"Delete task (with confirm)",hint:{keys:"d"}},{id:"sidebar.search.enter",scope:"sidebar",keys:["/"],category:"Sidebar",description:"Search tasks (fuzzy filter)",hint:{keys:"/"}},{id:"sidebar.search.nav",scope:"sidebar",keys:["down","up"],category:"Sidebar",description:"Move highlight in search results"},{id:"sidebar.search.submit",scope:"sidebar",keys:["return"],category:"Sidebar",description:"Select search match and exit search"},{id:"sidebar.search.cancel",scope:"sidebar",keys:["escape"],category:"Sidebar",description:"Cancel search (restore prior selection)"},{id:"tasks.openWorktree",scope:"sidebar",keys:["o"],category:"Tasks pane",description:"Open selected Task directory in your editor",hint:{keys:"o"}},{id:"tasks.renameBranch",scope:"sidebar",keys:["b"],category:"Tasks pane",description:"Rename the selected task's git branch",hint:{keys:"b"}},{id:"tasks.cycleEngine",scope:"sidebar",keys:["v"],category:"Tasks pane",description:"Cycle engine vendor \u2014 applies on reopen",hint:{keys:"v"}},{id:"tasks.update",scope:"sidebar",keys:["u"],category:"Tasks pane",description:"Open the update page \u2014 version check + release notes",hint:{keys:"u"}},{id:"tasks.jump",scope:"global",keys:[...TASK_JUMP_CHORDS],category:"Tasks pane",description:"Jump to the task showing that digit (ctrl+2 = first row)",hint:{keys:"ctrl+2-0"},presentation:"onePress"},{id:"tasks.focusEngine",scope:"sidebar",keys:["right"],category:"Tasks pane",description:"Focus the engine pane of the current window",hint:{keys:"\u2192"}}]});var KobeKeymap;var init_keybindings_table=__esm(()=>{init_keybindings_chat();init_keybindings_files();init_keybindings_inbox();init_keybindings_sidebar();KobeKeymap=[{id:"help.open",scope:"global",keys:["f1"],category:"Global",description:"Show keybindings help",hint:{keys:"F1"},presentation:"onePress"},{id:"task.new",scope:"sidebar",keys:["n"],category:"Sidebar",description:"New task",hint:{keys:"n"}},{id:"task.new.global",scope:"global",keys:[],prefixKeys:["n"],category:"Global",description:"New task"},{id:"task.openEditor",scope:"global",keys:[],prefixKeys:["o"],category:"Global",description:"Open active Task directory in editor"},{id:"task.moveMode",scope:"global",keys:[],prefixKeys:["m"],category:"Global",description:"Reorder sidebar rows (then j/k)"},{id:"settings.open",scope:"global",keys:[],prefixKeys:[","],category:"Global",description:"Open settings"},{id:"settings.open.sidebar",scope:"sidebar",keys:["s"],category:"Sidebar",description:"Open settings",hint:{keys:"s"}},{id:"worktrees.open.sidebar",scope:"sidebar",keys:["x"],category:"Sidebar",description:"Open worktrees",hint:{keys:"x"}},{id:"kanban.open",scope:"global",keys:[],prefixKeys:["1"],category:"Global",description:"Open kanban (issues board)"},{id:"automations.open",scope:"global",keys:[],prefixKeys:["2"],category:"Global",description:"Open routines (scheduled tasks)"},{id:"workItems.open",scope:"global",keys:[],prefixKeys:["3"],category:"Global",description:"Open GitHub issues (external tracker)"},{id:"app.quit",scope:"sidebar",keys:["q","ctrl+q"],category:"Sidebar",description:"Quit (with confirm)",hint:{keys:"q"}},{id:"focus.sidebar",scope:"workspace",keys:["ctrl+q"],category:"Workspace",description:"Back to sidebar (tasks)",hint:{keys:"ctrl+q"},presentation:"onePress"},{id:"focus.previous",scope:"global",keys:[],prefixKeys:["h"],category:"Navigation",description:"Focus previous pane (files \u2192 workspace \u2192 sidebar)"},{id:"focus.next",scope:"global",keys:["f4"],prefixKeys:["l"],category:"Navigation",description:"Focus next pane (sidebar \u2192 workspace \u2192 files)",hint:{keys:"f4"},presentation:"onePress"},{id:"attention.next",scope:"global",keys:["f7"],category:"Navigation",description:"Jump to the next available Inbox item",hint:{keys:"f7"},presentation:"onePress"},{id:"workspace.zenToggle",scope:"global",keys:[],prefixKeys:["z"],category:"Navigation",description:"Toggle zen mode (hide the files column)"},{id:"chat.interrupt",scope:"workspace",keys:[],category:"Workspace",description:"Interrupt current turn (esc while streaming)"},...SIDEBAR_BINDINGS,...CHAT_BINDINGS,...FILES_BINDINGS,...INBOX_BINDINGS,{id:"terminal.scroll-up",scope:"terminal",keys:["ctrl+pageup"],category:"Terminal",description:"Scroll scrollback up",hint:{keys:"ctrl+pgup"}},{id:"terminal.scroll-down",scope:"terminal",keys:["ctrl+pagedown"],category:"Terminal",description:"Scroll scrollback down"},{id:"terminal.reset",scope:"terminal",keys:["f5"],category:"Terminal",description:"Reset terminal \u2014 kill the current shell and respawn",hint:{keys:"f5"},presentation:"onePress"},{id:"dialog.cancel",scope:"global",keys:[],category:"Dialog",description:"Close the top dialog (esc)"},{id:"dialog.newtask.tab.cycle",scope:"global",keys:[],category:"Dialog",description:"Switch New Task tab (Existing / New Repo)",hint:{keys:"ctrl+[/]"}}]});function bindByIds(handlers){let out=[];for(let id in handlers){let handler=handlers[id];if(!handler)continue;let action=typeof handler==="function"?void 0:handler,cmd=typeof handler==="function"?handler:()=>handler.run(),binding=findBinding(id),chords=binding?.keys??[],prefixChords=binding?.prefixKeys??[];if(chords.length===0&&prefixChords.length===0){console.warn(`[rove/keybindings] bindByIds: id="${id}" has no chords (or doesn't exist in KobeKeymap)`);continue}chords.forEach((key,slot)=>out.push({key,cmd,action,slot,id,yieldToPassthrough:binding?.yieldToPassthrough})),prefixChords.forEach((key,slot)=>out.push({key,prefix:!0,cmd,action,slot,id}))}return out}var init_keybindings_bindings=__esm(()=>{init_keybindings()});function defaultChordsOf(id){return KEYMAP_DEFAULTS.get(id)?.keys??[]}function resetKeymapToDefaults(){for(let row of KobeKeymap){let def=KEYMAP_DEFAULTS.get(row.id);if(!def)continue;let mutable=row;mutable.keys=[...def.keys],mutable.prefixKeys=def.prefixKeys&&[...def.prefixKeys],mutable.hint=def.hint?{...def.hint}:void 0}}function keymapVersion(){return keymapVersionValue}function subscribeKeymapVersion(listener){return keymapVersionListeners.add(listener),()=>{keymapVersionListeners.delete(listener)}}function bumpKeymapVersion(){keymapVersionValue+=1;for(let listener of[...keymapVersionListeners])listener()}function findBinding(id){return KEYMAP_BY_ID.get(id)}var KEYMAP_DEFAULTS,keymapVersionValue=0,keymapVersionListeners,KEYMAP_BY_ID;var init_keybindings=__esm(()=>{init_keybindings_table();init_keybindings_table();init_keybindings_bindings();KEYMAP_DEFAULTS=new Map(KobeKeymap.map((b)=>[b.id,{keys:[...b.keys],prefixKeys:b.prefixKeys&&[...b.prefixKeys],hint:b.hint?{...b.hint}:void 0}]));keymapVersionListeners=new Set;KEYMAP_BY_ID=new Map(KobeKeymap.map((b)=>[b.id,b]))});function applyUserKeybindings(){if(cached2)return cached2;let file=readKeybindingsFile();if(!file.exists)return cached2={path:file.path,exists:!1,applied:[],plugins:[],warnings:[]},cached2;let warnings=[...file.warnings],extracted=extractKeybindingOverrides(file.doc,process.platform);warnings.push(...extracted.warnings);let prefix=extractPrefixKeybindings(file.doc,process.platform);warnings.push(...prefix.warnings),configurePrefix({...DEFAULT_PREFIX_CONFIGURATION,...prefix.configuration});let result=applyKeymapOverrides(KobeKeymap,extracted.entries);warnings.push(...result.warnings);let applied=[...result.applied],prefixKey=prefix.configuration.key;if(prefixKey!==null&&prefixKey!==void 0){let directOwner=KobeKeymap.find((row)=>row.keys.includes(prefixKey));if(directOwner)warnings.push(`prefix.key "${prefixKey}" collides with direct binding ${directOwner.id}`)}let prefixResult=applyPrefixKeymapOverrides(KobeKeymap,[...extracted.prefixEntries,...prefix.entries]);warnings.push(...prefixResult.warnings),applied.push(...prefixResult.applied);let plugins=extractPluginKeybindings(file.doc,process.platform);warnings.push(...plugins.warnings);for(let p of plugins.entries){let owner=KobeKeymap.find((row)=>row.keys.includes(p.chord));if(owner)warnings.push(`plugins: ${p.chord} shadows ${owner.id}`)}for(let w2 of warnings)console.warn(`[rove/keybindings] ${w2}`);return cached2={path:file.path,exists:!0,applied,plugins:plugins.entries,warnings},cached2}function pluginKeybindings(){return userKeybindingsReport().plugins}function userKeybindingsReport(){return cached2??applyUserKeybindings()}function reloadUserKeybindings(){cached2=null,resetKeybindingsFileCache(),resetKeymapToDefaults(),resetPrefixConfiguration();let report=applyUserKeybindings();return bumpKeymapVersion(),report}var cached2=null;var init_keybindings_user=__esm(()=>{init_keybindings_file();init_keymap_dispatch();init_keymap_overrides();init_keymap_plugin_bindings();init_keymap_prefix_overrides();init_keybindings()});function applyUiPrefs(target,prefs){if(typeof prefs.theme==="string"&&prefs.theme.length>0&&prefs.theme!==target.selectedTheme()){if(!target.hasTheme(prefs.theme))target.reloadUserThemes();if(target.hasTheme(prefs.theme))target.setTheme(prefs.theme)}if(typeof prefs.transparentBackground==="boolean"&&prefs.transparentBackground!==target.transparentBackground())target.setTransparentBackground(prefs.transparentBackground);if(prefs.focusAccent===null||typeof prefs.focusAccent==="string"){let slot=normalizeFocusAccent(prefs.focusAccent);if(slot&&slot!==target.focusAccent())target.setFocusAccent(slot)}}function normalizeFocusAccent(value){if(value===null)return"primary";return UI_PREFS_FOCUS_ACCENT_SLOTS.includes(value)?value:null}var UI_PREFS_FOCUS_ACCENT_SLOTS;var init_apply_ui_prefs=__esm(()=>{UI_PREFS_FOCUS_ACCENT_SLOTS=["primary","success","info"]});function stallReport(gapMs,mem,heartbeatMs=STALL_HEARTBEAT_MS,thresholdMs=STALL_THRESHOLD_MS){let stallMs=gapMs-heartbeatMs;if(stallMs<thresholdMs)return null;let mb=(n)=>Math.round(n/1048576);return`event loop stalled ~${stallMs}ms \u2014 rss=${mb(mem.rss)}MB heapUsed=${mb(mem.heapUsed)}MB`}function installEventLoopStallTelemetry(){let last=Date.now(),timer=setInterval(()=>{let now=Date.now(),gap=now-last;last=now;let report=stallReport(gap,process.memoryUsage());if(report)logClient("stall",report)},STALL_HEARTBEAT_MS);return timer.unref?.(),()=>clearInterval(timer)}var STALL_HEARTBEAT_MS=1000,STALL_THRESHOLD_MS=2000;var init_event_loop_stall=__esm(()=>{init_client_log()});function hostRenderOptions(onDestroy){let base={backgroundColor:"transparent",externalOutputMode:"passthrough",exitOnCtrlC:!1,screenMode:"alternate-screen",useKittyKeyboard:KITTY_KEYBOARD};return onDestroy?{...base,onDestroy}:base}function inlineRenderOptions(heightRows,onDestroy){let base={backgroundColor:"transparent",exitOnCtrlC:!1,screenMode:"split-footer",footerHeight:heightRows,useKittyKeyboard:KITTY_KEYBOARD};return onDestroy?{...base,onDestroy}:base}function installExitRestoreBackstop(renderer){process.on("exit",()=>renderer.destroy())}function installBracketedPasteMode(stdout=process.stdout){if(!stdout.isTTY)return()=>{};let write=(seq)=>{try{stdout.write(seq)}catch{}};write(BRACKETED_PASTE_ON);let restored=!1,restore=()=>{if(restored)return;restored=!0,write(BRACKETED_PASTE_OFF)};return process.on("exit",restore),restore}function installPaneExitBackstop(){let exitScheduled=!1,scheduleExit=()=>{if(exitScheduled)return;exitScheduled=!0,setTimeout(()=>process.exit(0),5000)};for(let signal of["SIGHUP","SIGTERM","SIGINT"])process.on(signal,scheduleExit)}function installOrphanExitWatchdog(intervalMs=5000){let timer=setInterval(()=>{if(process.ppid===1)process.exit(0)},intervalMs);return timer.unref?.(),()=>clearInterval(timer)}var KITTY_KEYBOARD,BRACKETED_PASTE_ON="\x1B[?2004h",BRACKETED_PASTE_OFF="\x1B[?2004l";var init_host_render_options=__esm(()=>{KITTY_KEYBOARD={}});class ImeAnchorController{owner=null;anchor=null;claim(owner,anchor){this.owner=owner,this.anchor={x:Math.max(0,Math.trunc(anchor.x)),y:Math.max(0,Math.trunc(anchor.y))}}release(owner){if(this.owner!==owner)return!1;return this.owner=null,this.anchor=null,!0}current(){return this.anchor}}class ImeAnchorFrameTransformer{controller;pending=Buffer.alloc(0);frame=Buffer.alloc(0);constructor(controller){this.controller=controller}push(chunk){let data=this.pending.length>0?Buffer.concat([this.pending,chunk]):chunk;this.pending=Buffer.alloc(0);let output=[],offset=0;while(offset<data.length){if(this.frame.length===0){let start=data.indexOf(SYNC_START,offset);if(start<0){let tail2=data.subarray(offset),pendingLength2=longestMarkerPrefixSuffix(tail2,[SYNC_START]),safeLength2=tail2.length-pendingLength2;if(safeLength2>0)output.push(tail2.subarray(0,safeLength2));if(pendingLength2>0)this.pending=Buffer.from(tail2.subarray(safeLength2));break}if(start>offset)output.push(data.subarray(offset,start));this.frame=Buffer.from(SYNC_START),offset=start+SYNC_START.length;continue}let end=data.indexOf(SYNC_END,offset),restart=data.indexOf(SYNC_START,offset);if(restart>=0&&(end<0||restart<end)){this.frame=Buffer.from(SYNC_START),offset=restart+SYNC_START.length;continue}if(end>=0){if(end>offset)this.frame=Buffer.concat([this.frame,data.subarray(offset,end)]);output.push(this.frame);let anchor=this.controller.current();if(anchor)output.push(Buffer.from(`\x1B[${anchor.y+1};${anchor.x+1}H\x1B[?25l`));output.push(SYNC_END),this.frame=Buffer.alloc(0),offset=end+SYNC_END.length;continue}let tail=data.subarray(offset),pendingLength=longestMarkerPrefixSuffix(tail,[SYNC_START,SYNC_END]),safeLength=tail.length-pendingLength;if(safeLength>0)this.frame=Buffer.concat([this.frame,tail.subarray(0,safeLength)]);if(pendingLength>0)this.pending=Buffer.from(tail.subarray(safeLength));break}return output.length>0?Buffer.concat(output):Buffer.alloc(0)}flush(){if(this.frame.length>0)return this.frame=Buffer.alloc(0),this.pending=Buffer.alloc(0),Buffer.alloc(0);let pending=this.pending;return this.pending=Buffer.alloc(0),pending}}function longestMarkerPrefixSuffix(bytes,markers){let max=Math.min(bytes.length,Math.max(...markers.map((marker)=>marker.length-1)));for(let length=max;length>0;length-=1){let suffix=bytes.subarray(bytes.length-length);if(markers.some((marker)=>length<marker.length&&suffix.equals(marker.subarray(0,length))))return length}return 0}function asBuffer(chunk,encodingOrCallback){if(typeof chunk!=="string")return Buffer.from(chunk);let encoding=typeof encodingOrCallback==="string"?encodingOrCallback:void 0;return Buffer.from(chunk,encoding)}function writeCallback(encodingOrCallback,maybeCallback){return typeof encodingOrCallback==="function"?encodingOrCallback:maybeCallback}function createImeAnchoredOutput(target,controller=imeAnchorController){let transformer=new ImeAnchorFrameTransformer(controller),exposedWrite=(chunk,encodingOrCallback,maybeCallback)=>{let transformed=transformer.push(asBuffer(chunk,encodingOrCallback)),callback=writeCallback(encodingOrCallback,maybeCallback);if(transformed.length===0){if(callback)queueMicrotask(()=>callback(null));return!0}return callback?target.write(transformed,callback):target.write(transformed)};return{stdout:new Proxy(target,{get(stream,property){if(property==="write")return exposedWrite;let value=Reflect.get(stream,property,stream);return typeof value==="function"?value.bind(stream):value},set(stream,property,value){if(property==="write")return exposedWrite=value,!0;return Reflect.set(stream,property,value,stream)}}),flush(){let pending=transformer.flush();if(pending.length>0)target.write(pending)}}}function createHostImeOutput(opts){if(opts.platform!=="darwin"||!opts.fullscreen)return{active:!1,rendererOptions:{},attach:()=>()=>{},flush:()=>{}};let output=createImeAnchoredOutput(opts.stdout,opts.controller);return{active:!0,rendererOptions:{stdout:output.stdout,remote:!1},attach:(renderer)=>installRendererResizeForwarder(renderer,opts.stdout),flush:()=>output.flush()}}function installRendererResizeForwarder(renderer,terminal,signals=process){let onResize=()=>{let{columns:width,rows:height}=terminal;if(!width||!height)return;renderer.resize(width,height)};return signals.on("SIGWINCH",onResize),()=>signals.removeListener("SIGWINCH",onResize)}var SYNC_START,SYNC_END,imeAnchorController;var init_ime_anchor_output=__esm(()=>{SYNC_START=Buffer.from("\x1B[?2026h"),SYNC_END=Buffer.from("\x1B[?2026l");imeAnchorController=new ImeAnchorController});function useLatest(value){let ref=import_react21.useRef(value);return ref.current=value,ref}var import_react21;var init_use_latest=__esm(()=>{import_react21=__toESM(require_react_production(),1)});function FocusProvider(props){let[focused,setFocusedState]=import_react23.useState(props.initial??"sidebar"),renderer=useRenderer(),focusedRef=useLatest(focused),setFocused=import_react23.useCallback((pane)=>{if(focusedRef.current===pane)return;let current=renderer?.currentFocusedRenderable;if(current&&!current.isDestroyed)try{current.blur()}catch{}setFocusedState(pane)},[renderer]),cycle=import_react23.useCallback((delta)=>{let next=(PANE_ORDER.indexOf(focusedRef.current)+delta+PANE_ORDER.length)%PANE_ORDER.length;setFocused(PANE_ORDER[next])},[setFocused]),value=import_react23.useMemo(()=>({focused,is:(pane)=>focused===pane,setFocused,cycle}),[focused,setFocused,cycle]);return $jsx(FocusContext.Provider,{value,children:props.children})}function useFocus(){let ctx=import_react23.useContext(FocusContext);if(!ctx)throw Error("useFocus: must be called inside <FocusProvider>. See src/tui-react/context/focus.tsx.");return ctx}function useOptionalFocus(){return import_react23.useContext(FocusContext)}var import_react23,PANE_ORDER,FocusContext;var init_focus=__esm(async()=>{init_use_latest();init_jsx_runtime();await init_react();import_react23=__toESM(require_react_production(),1),PANE_ORDER=["sidebar","workspace","files","terminal"],FocusContext=import_react23.createContext(null)});function createKvCore(){let store2=createStateCell(loadStateFile(),"kv.snapshot"),dirtyKeys=new Set,writeTimer=null;function writeNow(label){if(dirtyKeys.size===0)return!0;try{let patch={},snap=store2.get();for(let key of dirtyKeys)patch[key]=snap[key];return patchStateFile(patch),dirtyKeys.clear(),!0}catch(err){return console.error(`[rove] kv ${label} failed:`,err),!1}}function cancelTimer(){if(writeTimer)clearTimeout(writeTimer),writeTimer=null}function scheduleWrite(){cancelTimer(),writeTimer=setTimeout(()=>{writeTimer=null,writeNow("write")},WRITE_DEBOUNCE_MS)}return{snapshot:store2.get,subscribe:store2.subscribe,get(key,defaultValue){return store2.get()[key]??defaultValue},set(key,value){store2.update((s)=>{if(value!==void 0)return{...s,[key]:value};if(!(key in s))return s;let next={...s};return delete next[key],next}),dirtyKeys.add(key),scheduleWrite()},seed(key,value){if(store2.get()[key]!==void 0)return;store2.update((s)=>({...s,[key]:value}))},flush(){return cancelTimer(),writeNow("flush")},clear(){cancelTimer(),dirtyKeys.clear(),store2.set({});try{replaceStateFile({})}catch(err){console.error("[rove] kv clear write failed:",err)}}}}var WRITE_DEBOUNCE_MS=250;var init_kv_core=__esm(()=>{init_external_store();init_store()});function KVProvider(props){let[core]=import_react24.useState(createKvCore),snapshot=import_react24.useSyncExternalStore(core.subscribe,core.snapshot,core.snapshot);import_react24.useEffect(()=>{let flush=()=>{core.flush()};return process.on("exit",flush),()=>{process.off("exit",flush)}},[core]);let value=import_react24.useMemo(()=>({ready:!0,store:snapshot,signal(name,defaultValue){return core.seed(name,defaultValue),[()=>core.get(name)??defaultValue,(next)=>core.set(name,next)]},get:core.get,set:core.set,flush:core.flush,clear:core.clear}),[core,snapshot]);return $jsx(Ctx.Provider,{value,children:props.children})}function useKV(){let value=import_react24.useContext(Ctx);if(!value)throw Error("KV context must be used within a context provider");return value}function useOptionalKV(){return import_react24.useContext(Ctx)??null}var import_react24,Ctx;var init_kv=__esm(()=>{init_kv_core();init_jsx_runtime();import_react24=__toESM(require_react_production(),1),Ctx=import_react24.createContext(null)});function unreadKey(taskId,tabId){return`${taskId}:${tabId}`}function addUnread(prev,input){let key=unreadKey(input.taskId,input.tabId),existing=prev.get(key);if(existing==="needs_input"||existing==="error")return prev;let next=new Map(prev);return next.set(key,input.kind),next}function removeUnread(prev,taskId,tabId){let key=unreadKey(taskId,tabId);if(!prev.has(key))return prev;let next=new Map(prev);return next.delete(key),next}function shouldShowToast(kind,toastEnabled){return kind==="error"||toastEnabled}function attentionKindFor(state){if(state==="permission_needed")return"needs_input";if(state==="error"||state==="rate_limited"||state==="dead")return"error";if(state==="turn_complete")return"done";return null}function chipAttentionKind(turn){if(turn==="done")return"done";if(turn==="error"||turn==="rate_limited"||turn==="dead")return"error";if(turn==="needs_input")return"needs_input";return null}function attentionEdges(prev,next,skip,kindFor){if(prev===null)return[];let out=[];for(let[key,state]of next){if(key===skip)continue;if(prev.get(key)===state)continue;let kind=kindFor(state);if(kind)out.push({key,kind})}return out}function sanitizeOscBody(body){let out="",segmentStart=0;for(let i=0;i<body.length;i++){let code=body.charCodeAt(i);if(code>31&&(code<127||code>159))continue;out+=`${body.slice(segmentStart,i)} `,segmentStart=i+1}return segmentStart===0?body:out+body.slice(segmentStart)}function osc9(body){return`\x1B]9;${sanitizeOscBody(body)}\x07`}var TOAST_DURATION_MS=4500;var pulse_default="../pulse-n3cq1btw.wav";var init_pulse=()=>{};import{existsSync as existsSync17,mkdirSync as mkdirSync10}from"fs";import{tmpdir as tmpdir3}from"os";import{basename as basename6,delimiter as delimiter2,isAbsolute as isAbsolute2,join as join17,resolve as resolve6}from"path";function args(player,file,volume){if(player==="ffplay")return[player,"-autoexit","-nodisp","-af",`volume=${volume}`,file];if(player==="mpv")return[player,"--no-video","--audio-display=no","--volume",String(Math.round(volume*100)),file];if(player==="mpg123"||player==="mpg321")return[player,"-g",String(Math.round(volume*100)),file];if(player==="mplayer")return[player,"-vo","null","-volume",String(Math.round(volume*100)),file];if(player==="afplay"||player==="omxplayer"||player==="aplay"||player==="cmdmp3")return[player,file];if(player==="play")return[player,"-v",String(volume),file];if(player==="cvlc")return[player,`--gain=${volume}`,"--play-and-exit",file];return[player,"-c",`(New-Object Media.SoundPlayer '${file.replace(/'/g,"''")}').PlaySync()`]}function pathDirs(rawPath,delim=delimiter2){return rawPath.split(delim).filter(Boolean)}function pickPlayer(){if(cachedPlayer!==void 0)return cachedPlayer;let segments=pathDirs(process.env.PATH??"");return cachedPlayer=PLAYERS.find((p)=>segments.some((dir)=>existsSync17(join17(dir,p))))??null,cachedPlayer}async function ensureAsset(){return cachedPath??=(async()=>{mkdirSync10(DIR,{recursive:!0});let dest=join17(DIR,basename6(pulseAsset)),out=Bun.file(dest);if(await out.exists())return dest;return await Bun.write(out,Bun.file(pulseAsset)),dest})(),cachedPath}function pulse(volume=0.4){let player=pickPlayer();if(!player)return;ensureAsset().then((path15)=>{try{Bun.spawn(args(player,path15,volume),{stdin:"ignore",stdout:"ignore",stderr:"ignore"}).unref?.()}catch{}}).catch(()=>{return})}var pulseAsset,DIR,PLAYERS,cachedPlayer,cachedPath;var init_sound=__esm(()=>{init_pulse();pulseAsset=isAbsolute2(pulse_default)?pulse_default:resolve6(import.meta.dir,pulse_default),DIR=join17(tmpdir3(),"kobe-sfx"),PLAYERS=["ffplay","mpv","mpg123","mpg321","mplayer","afplay","play","omxplayer","aplay","cmdmp3","cvlc","powershell.exe"]});function NotificationsProvider(props){let[toasts,setToasts]=import_react25.useState([]),[unread,setUnread]=import_react25.useState(new Map),kv=useOptionalKV(),snapshot=import_react25.useMemo(()=>loadStateFile(),[]),prefs=import_react25.useMemo(()=>({"notifications.sound.enabled":kv?.get("notifications.sound.enabled")??snapshot["notifications.sound.enabled"],"notifications.toast.enabled":kv?.get("notifications.toast.enabled")??snapshot["notifications.toast.enabled"]}),[kv,snapshot]),counter=import_react25.useRef(0),timers=import_react25.useRef(new Set);import_react25.useEffect(()=>()=>{for(let id of timers.current)clearTimeout(id);timers.current.clear()},[]);let dismiss=import_react25.useCallback((id)=>{setToasts((prev)=>prev.filter((t2)=>t2.id!==id))},[]),notify=import_react25.useCallback((input)=>{if(setUnread((prev)=>addUnread(prev,input)),prefs["notifications.sound.enabled"]!==!1){try{process.stdout.write(`\x07${osc9(`Rove \u2014 ${input.title}`)}`)}catch{}pulse()}let toastEnabled=prefs["notifications.toast.enabled"]!==!1;if(shouldShowToast(input.kind,toastEnabled)){let id=++counter.current;setToasts((prev)=>[...prev,{id,...input}]);let timer=setTimeout(()=>{timers.current.delete(timer),dismiss(id)},TOAST_DURATION_MS);timers.current.add(timer)}},[prefs,dismiss]),markRead=import_react25.useCallback((taskId,tabId)=>{setUnread((prev)=>removeUnread(prev,taskId,tabId))},[]),value=import_react25.useMemo(()=>({toasts,unread,notify,dismiss,markRead}),[toasts,unread,notify,dismiss,markRead]);return $jsx(ctx.Provider,{value,children:props.children})}function useNotifications(){let value=import_react25.useContext(ctx);if(!value)throw Error("useNotifications must be used within a NotificationsProvider");return value}var import_react25,ctx;var init_notifications=__esm(()=>{init_store();init_sound();init_kv();init_jsx_runtime();import_react25=__toESM(require_react_production(),1),ctx=import_react25.createContext(null)});function createCtrlHoldDetector(callbacks){let state={kind:"idle"},held=new Set,reset=()=>{if(state.kind==="pending")clearTimeout(state.timer);if(state.kind==="visible")callbacks.onHide();state={kind:"idle"}},cancel=()=>{reset(),held.clear()};return{keypress:(event)=>{if(!isCtrlModifierKeyName(event.name)){cancel();return}if(event.eventType==="repeat"&&held.has(event.name))return;if(event.eventType!=="press")return;if(held.add(event.name),state.kind!=="idle")return;state={kind:"pending",timer:setTimeout(()=>{state={kind:"visible"},callbacks.onReveal()},CTRL_HOLD_THRESHOLD_MS)}},keyrelease:(event)=>{if(!isCtrlModifierKeyName(event.name)||event.eventType!=="release")return;if(held.delete(event.name),held.size===0)reset()},cancel}}var CTRL_HOLD_THRESHOLD_MS=400;var init_ctrl_hold=__esm(()=>{init_modifier_keys()});function formatKey(k,upper){if(k.includes("/"))return k.split("/").map((part)=>formatKey(part,upper)).join("/");let low=k.toLowerCase();if(low==="tab")return"tab";let named=KEY_GLYPH[low];if(named)return named;if(/^f\d{1,2}$/.test(low))return low.toUpperCase();if(!upper)return k;if(/^[a-z]$/.test(low))return k.toUpperCase();return k.replace(/[a-z]+/gi,(run)=>run.toUpperCase())}function formatChord(chord,prefixGlyph="\u2303A"){let s=chord.trim();if(!s)return s;let pm=/^prefix\s+(.+)$/i.exec(s);if(pm){let suffix=pm[1]??"";return`${prefixGlyph} ${suffix.includes("+")?formatChord(suffix,prefixGlyph):formatKey(suffix,!0)}`}let parts=s.split("+");if(parts.length===1)return formatKey(parts[0]??"",!1);let key=parts[parts.length-1]??"";return`${parts.slice(0,-1).map((p)=>MODIFIER_GLYPH[p.toLowerCase().trim()]??p).join("")} ${formatKey(key,!0)}`}var MODIFIER_GLYPH,KEY_GLYPH;var init_chord_glyphs=__esm(()=>{MODIFIER_GLYPH={ctrl:"\u2303",control:"\u2303",alt:"\u2325",opt:"\u2325",option:"\u2325",shift:"\u21E7",cmd:"\u2318",command:"\u2318",meta:"\u2318",super:"\u2318"},KEY_GLYPH={enter:"\u23CE",return:"\u23CE",esc:"\u238B",escape:"\u238B",space:"\u2423",up:"\u2191",down:"\u2193",left:"\u2190",right:"\u2192",backspace:"\u232B",delete:"\u2326",del:"\u2326",pgup:"\u21DE",pageup:"\u21DE",pgdn:"\u21DF",pagedown:"\u21DF",home:"\u2196",end:"\u2198"}});function ctrlFollowUpKey(chord){return CTRL_FOLLOW_UP_CHORD.test(chord)?chord.slice(5):null}function shortcutCaption(input){let binding=findBinding(input.bindingId);if(!binding)return null;if(input.reachability.direct.has(input.bindingId)){let direct=binding.keys[0];if(direct)return formatChord(direct)}if(input.prefixKey&&input.reachability.prefix.has(input.bindingId)){let stroke=binding.prefixKeys?.[0];if(stroke)return`${formatChord(input.prefixKey)} ${formatChord(stroke)}`}return null}function directGuideOptions(reachability,prefixKey){let options=KobeKeymap.filter((binding)=>reachability.direct.has(binding.id)&&!DIRECT_GUIDE_HIDDEN_ACTIONS.has(binding.id)).flatMap((binding)=>binding.keys.flatMap((chord)=>{let stroke=ctrlFollowUpKey(chord);return stroke?[{stroke,action:binding.id}]:[]})),prefixStroke=prefixKey?ctrlFollowUpKey(prefixKey):null;if(prefixStroke&&reachability.prefix.size>0)options.push({stroke:prefixStroke,action:DIRECT_GUIDE_PREFIX_ACTION_ID});return options}var DIRECT_GUIDE_PREFIX_ACTION_ID="prefix.moreCommands",CTRL_FOLLOW_UP_CHORD,DIRECT_GUIDE_HIDDEN_ACTIONS;var init_shortcut_reveal=__esm(()=>{init_keybindings();init_chord_glyphs();CTRL_FOLLOW_UP_CHORD=/^ctrl\+[^+]+$/;DIRECT_GUIDE_HIDDEN_ACTIONS=new Set(["tasks.jump"])});function ensureInstalled(renderer){if(!renderer)throw Error("useBindings: no renderer in scope; call inside a component rendered by @opentui/react.");if(installedRenderer===renderer)return;if(supersededRenderers.has(renderer))return;if(installed&&listener)installed.off("keypress",listener);if(installed&&releaseListener)installed.off("keyrelease",releaseListener);if(ctrlHoldDetector?.cancel(),installedRenderer)supersededRenderers.add(installedRenderer);stack.length=0,resetPrefixState(),installedRenderer=renderer,installed=renderer.keyInput,ctrlHoldDetector=createCtrlHoldDetector({onReveal:()=>{resetPrefixState();let options=directGuideOptions(bindingReachability(stack),currentPrefixConfiguration().key);if(options.length>0)prefixHudShowDirect(options)},onHide:prefixHudHideDirect}),listener=(evt)=>{ctrlHoldDetector?.keypress(evt),dispatchKeyEvent(stack,evt,Date.now(),{flushSync})},releaseListener=(evt)=>ctrlHoldDetector?.keyrelease(evt),installed.on("keypress",listener),installed.on("keyrelease",releaseListener)}function modalActive(){return stack.some((r5)=>r5.modalOwner!==void 0)}function currentBindingReachability(){return bindingReachability(stack)}function armPrefixFromCurrentStack(){return armPrefixNow(stack)}function invokeArmedPrefixActionFromCurrentStack(actionId,stroke){return invokeArmedPrefixAction(stack,actionId,stroke)}function bumpStackVersion(){prefixHudHideDirect(),stackVersion++;for(let listener2 of stackListeners)listener2()}function bindingReachabilitySignature(config){let bindings=config.bindings.map((binding)=>[binding.id??"",binding.key,binding.prefix===!0?"p":"d",binding.passthrough===!0?"i":"u"].join(":")).join("|");return`${config.enabled===!1?"off":"on"};${config.modal===!0?"modal":"plain"};${bindings}`}function useBindingStackVersion(){return import_react27.useSyncExternalStore((onChange)=>{return stackListeners.add(onChange),()=>stackListeners.delete(onChange)},()=>stackVersion)}function useBindings(config,opts){let renderer=useRenderer();ensureInstalled(renderer);let configRef=useLatest(config),scope=import_react27.useContext(ModalScopeContext),reachabilitySignature=bindingReachabilitySignature(config()),previousReachabilitySignature=import_react27.useRef(reachabilitySignature);import_react27.useEffect(()=>{if(previousReachabilitySignature.current===reachabilitySignature)return;previousReachabilitySignature.current=reachabilitySignature,bumpStackVersion()},[reachabilitySignature]),import_react27.useEffect(()=>{if(opts?.modalOwner!==void 0)resetPrefixState();let reg={config:()=>configRef.current(),id:nextId++,modalOwner:opts?.modalOwner,modalMember:opts?.modalOwner===void 0?scope??void 0:void 0};return insertRegistration(stack,reg),bumpStackVersion(),()=>{let i=stack.findIndex((r5)=>r5.id===reg.id);if(i>=0)stack.splice(i,1);bumpStackVersion()}},[])}function pageCloseBindings(cmd){return[{key:"escape",cmd},{key:"q",cmd},{key:"ctrl+c",cmd}]}var import_react27,ModalScopeContext,nextId=1,stack,installedRenderer=null,installed=null,listener=null,releaseListener=null,ctrlHoldDetector=null,supersededRenderers,stackVersion=0,stackListeners;var init_keymap=__esm(async()=>{init_ctrl_hold();init_keymap_dispatch();init_prefix_hud();init_shortcut_reveal();init_use_latest();init_keymap_dispatch();await init_react();import_react27=__toESM(require_react_production(),1),ModalScopeContext=import_react27.createContext(null),stack=[],supersededRenderers=new WeakSet;stackListeners=new Set});function isNarrowWidth(cols){return cols<70}function narrowSurface(args2){if(args2.focusedPane==="sidebar")return"sidebar";return args2.hasSelection||args2.hasOpenPage?"content":"sidebar"}function useDialogPaddingX(){let dims=useTerminalDimensions();return isNarrowWidth(dims.width)?1:2}function Dialog(props){let dimensions=useTerminalDimensions(),{theme}=useTheme(),renderer=useRenderer(),dismissRef=import_react29.useRef(!1),width=props.size==="xlarge"?140:props.size==="large"?110:props.size==="small"?50:80,VERTICAL_MARGIN=2,upperFifth=props.placement==="upper-fifth"&&!isNarrowWidth(dimensions.width),headerTop=Math.max(2,Math.floor(dimensions.height/5)),cardTop=upperFifth?Math.max(2,headerTop-1):0,maxCardHeight=Math.max(8,upperFifth?dimensions.height-cardTop-2:dimensions.height-4);return $jsx("box",{onMouseDown:()=>{dismissRef.current=!!renderer?.getSelection()},onMouseUp:()=>{if(dismissRef.current){dismissRef.current=!1;return}props.onClose?.()},width:dimensions.width,height:dimensions.height,alignItems:"center",justifyContent:upperFifth?"flex-start":"center",paddingTop:cardTop,position:"absolute",zIndex:3000,left:0,top:0,shouldFill:!1,children:$jsx("box",{onMouseUp:(e)=>{dismissRef.current=!1,e.stopPropagation()},width,maxWidth:dimensions.width-2,maxHeight:maxCardHeight,flexShrink:1,flexGrow:0,backgroundColor:theme.backgroundDialog,paddingTop:1,children:props.children})})}function DialogProvider(props){let[stack2,setStack]=import_react29.useState([]),[size,setSize]=import_react29.useState("medium"),[placement,setPlacement]=import_react29.useState("center"),renderer=useRenderer(),{transparentBackground:transparentBackground2}=useTheme(),focusRef=import_react29.useRef(null),refocusTimer=import_react29.useRef(null);import_react29.useEffect(()=>()=>{if(refocusTimer.current)clearTimeout(refocusTimer.current)},[]);let refocus=import_react29.useCallback(()=>{if(refocusTimer.current)clearTimeout(refocusTimer.current);refocusTimer.current=setTimeout(()=>{let focus=focusRef.current;if(!focus||focus.isDestroyed)return;function find(item){for(let child of item.getChildren()){if(child===focus)return!0;if(find(child))return!0}return!1}let root=renderer?.root;if(!root)return;if(!find(root))return;focus.focus()},1)},[renderer]),stackRef=useLatest(stack2),captureFocusIfFirst=import_react29.useCallback(()=>{if(refocusTimer.current)clearTimeout(refocusTimer.current);if(stackRef.current.length===0)focusRef.current=renderer?.currentFocusedRenderable??null,focusRef.current?.blur()},[renderer]),dismissTop=import_react29.useCallback(()=>{let selection=renderer?.getSelection();if(selection){if(renderer?.clearSelection(),selection.getSelectedText())return}stackRef.current.at(-1)?.onClose?.(),setStack((s)=>s.slice(0,-1)),refocus()},[renderer,refocus]),value=import_react29.useMemo(()=>({clear(options){for(let item of stackRef.current)item.onClose?.();if(setSize("medium"),setPlacement("center"),setStack([]),options?.refocus===!1)focusRef.current=null;else refocus()},replace(thunk,onClose){captureFocusIfFirst();for(let item of stackRef.current)item.onClose?.();setSize("medium"),setPlacement("center"),setStack([{key:++entrySeq,element:thunk,onClose}])},push(thunk,onClose){captureFocusIfFirst(),setStack((s)=>[...s,{key:++entrySeq,element:thunk,onClose}])},pop(){if(stackRef.current.at(-1)?.onClose?.(),setStack((s)=>s.slice(0,-1)),stackRef.current.length<=1)refocus()},get stack(){return stackRef.current},get size(){return size},setSize,get placement(){return placement},setPlacement}),[stack2,size,placement,refocus,captureFocusIfFirst]),top=stack2.at(-1),contentOpacity=top?transparentBackground2?TRANSPARENT_DIALOG_CONTENT_OPACITY:DIALOG_CONTENT_OPACITY:1;return $jsxs(ctx2.Provider,{value,children:[$jsx("box",{flexGrow:1,backgroundColor:top&&!transparentBackground2?"black":"transparent",children:$jsx("box",{flexGrow:1,opacity:contentOpacity,children:props.children})}),$jsx("box",{position:"absolute",zIndex:3000,children:top?$jsxs(ModalScopeContext,{value:MODAL_SCOPE,children:[$jsx(ModalBarrier,{dismissTop}),$jsx(Dialog,{onClose:()=>value.clear(),size,placement,children:top.element()},top.key)]}):null})]})}function ModalBarrier(props){return useBindings(()=>({modal:!0,bindings:[{key:"escape",cmd:props.dismissTop},{key:"ctrl+c",cmd:props.dismissTop}]}),{modalOwner:MODAL_SCOPE}),null}function useDialog(){let value=import_react29.useContext(ctx2);if(!value)throw Error("useDialog must be used within a DialogProvider");return value}function useOptionalDialog(){return import_react29.useContext(ctx2)}function showDialog(dialog,body,opts){return new Promise((resolve7)=>{if(dialog.replace(()=>body(resolve7),()=>resolve7(void 0)),opts?.size)dialog.setSize(opts.size)})}var import_react29,DIALOG_CONTENT_OPACITY=0.5,TRANSPARENT_DIALOG_CONTENT_OPACITY=0.75,entrySeq=0,ctx2,MODAL_SCOPE;var init_dialog=__esm(async()=>{init_use_latest();init_jsx_runtime();await __promiseAll([init_react(),init_theme(),init_keymap()]);import_react29=__toESM(require_react_production(),1);ctx2=import_react29.createContext(null);MODAL_SCOPE=Symbol("kobe.dialog.modal")});import{createCliRenderer}from"@opentui/core";function UiPrefsSync(){return import_react31.useEffect(()=>{let disposed=!1,orch=null,disposers=[];return(async()=>{let remote=await connectPaneOrchestrator({logTag:"ui-prefs",channels:["ui-prefs","keybindings"]});if(!remote)return;if(disposed){remote.dispose();return}orch=remote;let applyPrefs=(payload)=>{if(!payload)return;if(applyUiPrefs(themeTarget,payload),isLocaleId(payload.locale))setLocaleLang(payload.locale)},prefsStore=remote.uiPrefsStore();applyPrefs(prefsStore.get()),disposers.push(prefsStore.subscribe(()=>applyPrefs(prefsStore.get())));let revStore=remote.keybindingsRevStore(),lastKeybindingsRev=revStore.get();disposers.push(revStore.subscribe(()=>{let rev=revStore.get();if(rev==null||rev===lastKeybindingsRev)return;let isFirst=lastKeybindingsRev===null;if(lastKeybindingsRev=rev,!isFirst)reloadUserKeybindings()}))})(),()=>{disposed=!0;for(let dispose of disposers)dispose();orch?.dispose()}},[]),null}function PaneCrashFallback(){let{theme}=useTheme();return $jsxs("box",{flexDirection:"column",flexGrow:1,backgroundColor:theme.background,paddingLeft:1,paddingTop:1,gap:1,children:[$jsx("text",{fg:theme.error,children:t("common.paneCrash.title")}),$jsx("text",{fg:theme.textMuted,children:t("common.paneCrash.hint")})]})}function formatPaneCrashDiagnostic(error,info){let base=error instanceof Error?error.stack??error.message:String(error),componentStack=info.componentStack?.trim()||"(unavailable)",stateChanges=recentStateChangesForDiagnostics();return`${base}
524
524
  React component stack:
525
525
  ${componentStack}
526
526
  Recent state changes:
@@ -726,7 +726,7 @@ ${refs}`}async function capture(cmd){try{let proc=Bun.spawn(cmd,{stdin:"ignore",
726
726
  `).filter((l2)=>l2.length>0);attachUntrackedChildren(merged,others)}catch{}let untracked=[];for(let e2 of merged){if(e2.status!=="?")continue;if(e2.children)untracked.push(...e2.children);else if(e2.added==null&&!e2.path.endsWith("/"))untracked.push(e2)}if(untracked.length>0)await Promise.all(untracked.map(async(e2)=>{let added=await countAddedLines(worktreePath,e2.path,signal);if(added!=null)e2.added=added,e2.deleted=0}));for(let e2 of merged){if(!e2.children)continue;let sum=0,counted=!1;for(let c2 of e2.children)if(c2.added!=null)sum+=c2.added,counted=!0;if(counted)e2.added=sum,e2.deleted=0}return merged}function isUntrackedDir(e2){return e2.status==="?"&&e2.path.endsWith("/")}function attachUntrackedChildren(entries,others){for(let e2 of entries){if(!isUntrackedDir(e2))continue;e2.children=others.filter((p3)=>p3.startsWith(e2.path)).map((p3)=>({path:p3,status:"?"}))}}async function resolveBase(worktreePath,prBaseRef,signal){if(prBaseRef&&prBaseRef.trim().length>0)return prBaseRef.trim();try{let head=(await runGit2(["symbolic-ref","--short","refs/remotes/origin/HEAD"],worktreePath,signal)).trim();if(head.length>0)return head}catch{}for(let guess of["origin/main","origin/master"])try{return await runGit2(["rev-parse","--verify","--quiet",guess],worktreePath,signal),guess}catch{}return null}async function statusFilesBranch(worktreePath,base,signal){let range=`${base}...HEAD`,[nameStatusOut,numstatOut]=await Promise.all([runGit2(["diff","--no-color","--name-status",range],worktreePath,signal),runGit2(["diff","--no-color","--numstat","-z",range],worktreePath,signal)]),counts=new Map(parseNumstat(numstatOut).map((n2)=>[n2.path,{added:n2.added,deleted:n2.deleted}])),entries=[];for(let{status,path:path22}of parseNameStatus(nameStatusOut)){let c2=counts.get(path22);entries.push({path:path22,status,added:c2?.added,deleted:c2?.deleted})}return entries}function parseNameStatus(raw){let out=[];for(let rawLine of raw.split(`
727
727
  `)){let line=rawLine.replace(/\r$/,"");if(line.length===0)continue;let tab1=line.indexOf("\t");if(tab1<0)continue;let code=line[0],path22;if(code==="R"||code==="C"){let tab2=line.indexOf("\t",tab1+1);path22=unquoteGitPath(tab2<0?line.slice(tab1+1):line.slice(tab2+1))}else path22=unquoteGitPath(line.slice(tab1+1));if(path22.length===0||path22.endsWith("/"))continue;let status=code==="M"||code==="A"||code==="D"||code==="T"?code:code==="R"?"R":code==="C"?"C":null;if(status)out.push({status,path:path22})}return out}async function countAddedLines(worktreePath,relPath,signal){if(signal?.aborted)return null;let text=await readWorktreeFile(worktreePath,relPath);if(text==null)return null;if(text.includes("\x00"))return null;if(text.length===0)return 0;let count=0;for(let i2=0;i2<text.length;i2++)if(text[i2]===`
728
728
  `)count++;if(!text.endsWith(`
729
- `))count++;return count}function parseNumstat(raw){return parseNumstatRows(raw).map((r6)=>({path:r6.path,added:r6.added,deleted:r6.deleted}))}function parseStatusEntries(raw){let out=[];for(let row of parsePorcelainRows(raw)){let status;if(row.x==="?"&&row.y==="?")status="?";else{let candidate=row.y!==" "?row.y:row.x;if(candidate==="M"||candidate==="A"||candidate==="D"||candidate==="R"||candidate==="C"||candidate==="U"||candidate==="T")status=candidate;else continue}let path22=row.path;if(path22.length===0)continue;if(path22.endsWith("/")&&status!=="?")continue;out.push({path:path22,status})}return out}var init_git2=__esm(()=>{init_git_parsers();init_content()});function tabLabelKey(tab){switch(tab){case"all":return"files.tabs.all";case"changes":return"files.tabs.changes"}}function fileTreeBindings(opts){return bindByIds({"files.nav":(_evt,slot)=>{if((slot??0)%2===0)opts.moveDown();else opts.moveUp()},"files.hierarchy":(_evt,slot)=>{if((slot??0)%2===0)opts.collapseOrParent();else opts.expandOrDescend()},"files.tab":(_evt,slot)=>{let cur=opts.currentTab(),idx=TAB_ORDER.indexOf(cur);if(idx<0)return;let delta=(slot??0)%2===0?-1:1,next=TAB_ORDER[(idx+delta+TAB_ORDER.length)%TAB_ORDER.length];if(next)opts.setTab(next)},"files.open":()=>opts.openCurrent(),"files.mention":()=>opts.mentionCurrent?.(),"files.openExternal":()=>opts.openExternal(),"files.refresh":()=>opts.refresh(),"files.scope":()=>opts.toggleScope?.(),"files.diff":()=>opts.openDiff?.()})}var TAB_ORDER;var init_keys_core=__esm(()=>{init_keybindings();TAB_ORDER=["all","changes"]});import{spawn as spawn11}from"child_process";import{existsSync as existsSync33}from"fs";import{platform as platform2}from"os";function openExternally(absPath){if(!absPath)return;let plat=platform2();if(plat==="linux"){if(existsSync33("/proc/sys/fs/binfmt_misc/WSLInterop")||process.env.WSL_DISTRO_NAME){spawnDetachedWithFallback("wslview",[absPath],()=>{let child=spawn11("wslpath",["-w",absPath],{stdio:["ignore","pipe","ignore"]}),out="";child.stdout?.on("data",(b3)=>{out+=b3.toString()}),child.on("close",(code)=>{if(code===0)spawnDetachedWithFallback("explorer.exe",[out.trim()])})});return}spawnDetachedWithFallback("xdg-open",[absPath]);return}if(plat==="darwin"){spawnDetachedWithFallback("open",[absPath]);return}if(plat==="win32"){spawnDetachedWithFallback("cmd.exe",["/c","start","",absPath]);return}}function spawnDetachedWithFallback(cmd,args2,onError){spawnDetached(cmd,args2,{onError:onError?()=>onError():void 0})}var init_open_external2=__esm(()=>{init_spawn_detached()});import{watch}from"fs";function statusToken(s2){switch(s2){case"M":return"warning";case"A":return"success";case"D":return"error";case"?":return"textMuted";case"R":case"C":case"U":case"T":return"info"}}function summarizeGitError(raw,t3){let m3=raw.toLowerCase();if(m3.includes("not a git repository"))return t3("files.error.notGitRepo");if(m3.includes("does not exist")||m3.includes("enoent"))return t3("files.error.pathMissing");if(m3.includes("permission denied")||m3.includes("eacces"))return t3("files.error.permissionDenied");if(m3.includes("git: not found")||m3.includes("command not found"))return t3("files.error.gitNotInstalled");let colon=raw.indexOf(": ");if(colon>=0&&raw.startsWith("git "))return raw.slice(colon+2).trim()||t3("files.error.gitFailed");return raw.trim()||t3("files.error.gitFailed")}function computeStatWidths(rows){let added=0,deleted=0;for(let row of rows){if(row.kind!=="status")continue;if(row.added!=null)added=Math.max(added,String(row.added).length+1);if(row.deleted!=null)deleted=Math.max(deleted,String(row.deleted).length+1)}return{added,deleted}}function computePathBudget(paneWidth,w4){let stats=(w4.added>0?w4.added+1:0)+(w4.deleted>0?w4.deleted+1:0);return Math.max(8,paneWidth-6-stats)}function statCell(value,width,sign){let glyph=sign==="-"?"\u2212":sign;return value==null?" ".repeat(width):`${glyph}${value}`.padStart(width)}function toggleDir(expanded,path22){let next=new Set(expanded);if(next.has(path22))next.delete(path22);else next.add(path22);return next}function expandOrDescendAction(rows,cursorIndex){let row=rows[cursorIndex];if(!row)return null;if(row.kind==="status"){if(row.fileCount==null)return null;if(!row.expanded)return{type:"expand",path:row.path};return cursorIndex+1<rows.length?{type:"cursor",index:cursorIndex+1}:null}if(row.kind!=="dir")return null;if(!row.expanded&&row.hasChildren)return{type:"expand",path:row.path};if(row.expanded&&cursorIndex+1<rows.length)return{type:"cursor",index:cursorIndex+1};return null}function collapseOrParentAction(rows,cursorIndex){let row=rows[cursorIndex];if(!row)return null;if(row.kind==="dir"&&row.expanded)return{type:"collapse",path:row.path};if(row.kind==="status")return row.fileCount!=null&&row.expanded?{type:"collapse",path:row.path}:null;if(row.kind!=="dir"&&row.kind!=="file")return null;let targetDepth=row.depth-1;if(targetDepth<0)return null;for(let j2=cursorIndex-1;j2>=0;j2--){let candidate=rows[j2];if(!candidate)continue;if(candidate.kind==="dir"&&candidate.depth===targetDepth)return{type:"cursor",index:j2}}return null}function followScrollTop(scrollTop,viewportHeight,cursorIndex){if(viewportHeight<=0)return null;if(cursorIndex<scrollTop)return cursorIndex;if(cursorIndex>=scrollTop+viewportHeight)return cursorIndex-viewportHeight+1;return null}function watchEventRelevant(filename){if(filename===".git"||filename.startsWith(".git/")||filename.startsWith(".git\\"))return!1;if(filename.startsWith("node_modules/")||filename.startsWith("node_modules\\"))return!1;return!0}function watchWorktree(path22,onChange,debounceMs=500){let debounceTimer=null,watcher=null;try{watcher=watch(path22,{recursive:!0},(_event,filename)=>{if(filename==null)return;if(!watchEventRelevant(filename.toString()))return;if(debounceTimer!=null)clearTimeout(debounceTimer);debounceTimer=setTimeout(()=>{debounceTimer=null,onChange()},debounceMs)}),watcher.on("error",()=>{})}catch{}return()=>{if(debounceTimer!=null)clearTimeout(debounceTimer);if(watcher!=null)watcher.close()}}var init_pane_core=()=>{};function reconcileStableRows(prev,next,keyOf2,equals,opts={}){if(prev.length===0)return next;let prevByKey=new Map;for(let row of prev)prevByKey.set(keyOf2(row),row);let allReused=prev.length===next.length,out=Array(next.length);for(let i2=0;i2<next.length;i2++){let fresh=next[i2],old=prevByKey.get(keyOf2(fresh));if(old&&equals(old,fresh)&&(!opts.samePosition||prev[i2]===old)){if(out[i2]=old,allReused&&prev[i2]!==old)allReused=!1}else out[i2]=fresh,allReused=!1}return allReused?prev:out}function flattenTree(node,expanded,depth2,out){for(let child of node.children)if(child.isDir){let isOpen=expanded.has(child.path);if(out.push({kind:"dir",path:child.path,name:child.name,depth:depth2,expanded:isOpen,hasChildren:child.children.length>0}),isOpen)flattenTree(child,expanded,depth2+1,out)}else out.push({kind:"file",path:child.path,name:child.name,depth:depth2})}function truncatePathTail(path22,maxCells){return truncateStartCells(path22,maxCells,charWidth)}function statusRows(entries,expanded=NO_EXPANSION){let out=[];for(let e2 of entries){if(e2.children==null){out.push({kind:"status",path:e2.path,status:e2.status,added:e2.added,deleted:e2.deleted});continue}let isOpen=expanded.has(e2.path);if(out.push({kind:"status",path:e2.path,status:e2.status,added:e2.added,deleted:e2.deleted,fileCount:e2.children.length,expanded:isOpen}),isOpen)for(let c2 of e2.children)out.push({kind:"status",path:c2.path,status:c2.status,added:c2.added,deleted:c2.deleted,child:!0})}return out}function rowKey(row){return`${row.kind}\x00${row.path}`}function rowEquals(a2,b3){if(a2.kind!==b3.kind||a2.path!==b3.path)return!1;switch(a2.kind){case"file":{let o2=b3;return a2.name===o2.name&&a2.depth===o2.depth}case"dir":{let o2=b3;return a2.name===o2.name&&a2.depth===o2.depth&&a2.expanded===o2.expanded&&a2.hasChildren===o2.hasChildren}case"status":{let o2=b3;return a2.status===o2.status&&a2.added===o2.added&&a2.deleted===o2.deleted&&a2.fileCount===o2.fileCount&&a2.expanded===o2.expanded&&a2.child===o2.child}}}function reconcileRows(prev,next){return reconcileStableRows(prev,next,rowKey,rowEquals)}function sameFileList(a2,b3){if(a2===b3)return!0;if(a2==null||b3==null)return!1;if(a2.length!==b3.length)return!1;for(let i2=0;i2<a2.length;i2++)if(a2[i2]!==b3[i2])return!1;return!0}function sameStatusEntries(a2,b3){if(a2===b3)return!0;if(a2==null||b3==null)return!1;if(a2.length!==b3.length)return!1;for(let i2=0;i2<a2.length;i2++){let x2=a2[i2],y3=b3[i2];if(x2.path!==y3.path||x2.status!==y3.status||x2.added!==y3.added||x2.deleted!==y3.deleted)return!1;let xc=x2.children,yc=y3.children;if(xc==null!==(yc==null))return!1;if(xc&&yc){if(xc.length!==yc.length)return!1;for(let j2=0;j2<xc.length;j2++){let cx=xc[j2],cy=yc[j2];if(cx.path!==cy.path||cx.status!==cy.status||cx.added!==cy.added||cx.deleted!==cy.deleted)return!1}}}return!0}var NO_EXPANSION;var init_rows=__esm(()=>{NO_EXPANSION=new Set});function buildTree(paths){let root={name:"",path:"",isDir:!0,children:[]};for(let p3 of paths){if(!p3)continue;let segs=p3.split("/").filter((s2)=>s2.length>0);if(segs.length===0)continue;let cur=root;for(let i2=0;i2<segs.length;i2++){let seg=segs[i2],isDir=i2!==segs.length-1,child=cur.children.find((c2)=>c2.name===seg&&c2.isDir===isDir);if(!child)child={name:seg,path:segs.slice(0,i2+1).join("/"),isDir,children:[]},cur.children.push(child);cur=child}}return sortTree(root),root}function sortTree(node){node.children.sort((a2,b3)=>{if(a2.isDir!==b3.isDir)return a2.isDir?-1:1;return a2.name.localeCompare(b3.name)});for(let c2 of node.children)sortTree(c2)}function capOf(row){return row.hint?.keys??row.keys[0]}function legendCap(id){let row=findBinding(id);if(!row)return null;let cap=capOf(row);return cap&&cap.length>0?cap:null}function directCap(row){if(row.keys.length>0)return row.hint?.keys??row.keys[0]??null;return row.prefixKeys?.length?null:row.hint?.keys??null}function availableOn(row,surface){if(row.scope==="global")return!0;if(surface===null)return!1;if(row.scope===surface)return!0;return surface==="terminal"&&row.scope==="workspace"}function grammarHelpSections(keymap,surface,prefixKey,reachability){let here=[],direct=[],prefix=[],other=new Map;for(let binding of keymap){let cap=directCap(binding),staticallyAvailable=availableOn(binding,surface),directAvailable=reachability?reachability.direct.has(binding.id):staticallyAvailable,prefixAvailable=reachability?reachability.prefix.has(binding.id):staticallyAvailable;if(cap){let row={binding,primary:cap,aliases:binding.keys.filter((key)=>key!==cap)},docOnlyHere=binding.keys.length===0&&!binding.prefixKeys?.length&&staticallyAvailable;if(directAvailable&&(staticallyAvailable||binding.presentation==="onePress")||docOnlyHere)if(binding.presentation==="onePress")direct.push(row);else here.push(row);else if(!staticallyAvailable&&binding.scope!=="global"){let rows=other.get(binding.scope);if(rows)rows.push(row);else other.set(binding.scope,[row])}}if(prefixKey&&prefixAvailable&&binding.prefixKeys?.length)prefix.push({binding,primary:`${prefixKey} + ${binding.prefixKeys[0]}`,aliases:binding.prefixKeys.slice(1).map((key)=>`${prefixKey} + ${key}`)})}let sections=[];if(here.length)sections.push({kind:"here",scope:surface??void 0,rows:here});if(direct.length)sections.push({kind:"direct",rows:direct});if(prefix.length)sections.push({kind:"prefix",rows:prefix});for(let[scope,rows]of other)sections.push({kind:"other",scope,rows});return sections}var init_help_groups=__esm(()=>{init_keybindings()});function keyHintsEnabled(raw){return raw!==!1}function keyHintsToggleOn(kv){return keyHintsEnabled(kv.get(KEY_HINTS_ENABLED_KEY,!0))}function toggleKeyHints(kv){let next=!keyHintsToggleOn(kv);if(kv.set(KEY_HINTS_ENABLED_KEY,next),next)for(let key of Object.values(PANE_HINT_USED_KEYS))kv.set(key,!1)}function paneHintVisible(enabledRaw,usedRaw){return keyHintsEnabled(enabledRaw)&&usedRaw!==!0}function statusHintTokens(reach,prefixKey){let tokens=[];if(prefixKey!==null&&reach.prefix.size>0)tokens.push({chord:prefixKey,msg:"commands"});else if(reach.inputPassthrough){let cap=reach.direct.has("focus.sidebar")?legendCap("focus.sidebar"):null;if(cap)tokens.push({chord:cap,msg:"sidebar"})}if(reach.direct.has("help.open")){let cap=legendCap("help.open");if(cap)tokens.push({chord:cap,msg:"help"})}return tokens}function paneHintTokens(pane,mode){return PANE_HINT_ROWS[pane].flatMap((row)=>{if(mode==="always"&&row.always!==!0)return[];let cap=legendCap(row.id);return cap?[{cap,msg:row.msg}]:[]})}function wizardKeyLines(prefixKey){let lines=[],nav=legendCap("sidebar.nav"),open2=legendCap("sidebar.select");if(nav&&open2)lines.push({msg:"keysBare",params:{nav:formatChord(nav),open:formatChord(open2)}});let newTab=legendCap("chat.tab.new"),focusNext=legendCap("focus.next");if(newTab&&focusNext)lines.push({msg:"keysOnePress",params:{newTab:formatChord(newTab),focusNext:formatChord(focusNext)}});if(prefixKey!==null)lines.push({msg:"keysPrefix",params:{prefix:formatChord(prefixKey)}});let help=legendCap("help.open");if(help)lines.push({msg:"keysHelp",params:{help:formatChord(help)}});return lines}var KEY_HINTS_ENABLED_KEY="hints.keyboard.enabled",PANE_HINT_USED_KEYS,PANE_HINT_ROWS;var init_keyboard_hints=__esm(()=>{init_chord_glyphs();init_help_groups();PANE_HINT_USED_KEYS={sidebar:"hints.sidebar.used",files:"hints.files.used"};PANE_HINT_ROWS={sidebar:[{id:"sidebar.nav",msg:"move"},{id:"sidebar.select",msg:"open"}],files:[{id:"files.nav",msg:"move"},{id:"files.hierarchy",msg:"collapse"},{id:"files.open",msg:"open",always:!0},{id:"files.diff",msg:"diff",always:!0}]}});import{TextAttributes as TextAttributes9}from"@opentui/core";function scopeCategory(scope){if(!scope)return"Global";if(scope==="sidebar")return"Sidebar";if(scope==="workspace")return"Workspace";if(scope==="files")return"Files";if(scope==="terminal")return"Terminal";return"Dialog"}function displayCap(cap){return cap.split(" + ").map((part)=>formatChord(part)).join(" + ")}function sectionTitle(section,t3){if(section.kind==="here")return t3("help.here",{surface:tKeys("category",scopeCategory(section.scope))});if(section.kind==="direct")return t3("help.direct");if(section.kind==="prefix")return t3("help.afterPrefix");return t3("help.otherPane",{surface:tKeys("category",scopeCategory(section.scope))})}function HelpDialog(props){let dialog=useDialog(),{theme}=useTheme(),t3=useT(),padX=useDialogPaddingX(),keymapVersion2=useKeymapVersion(),pureTuiPrefix=currentPrefixConfiguration(),sections=import_react60.useMemo(()=>grammarHelpSections(KobeKeymap,props.currentScope??null,pureTuiPrefix.key,props.reachability),[keymapVersion2,props.currentScope,props.reachability,pureTuiPrefix.key]),close=()=>props.onClose?props.onClose():dialog.clear(),scrollRef=import_react60.useRef(null),scrollBy=(lines)=>{let scroll=scrollRef.current;if(!scroll)return;scroll.scrollTo({x:0,y:Math.max(0,scroll.scrollTop+lines)})},scrollToEdge=(edge)=>{let scroll=scrollRef.current;if(!scroll)return;scroll.scrollTo({x:0,y:edge==="top"?0:Number.MAX_SAFE_INTEGER})};return useBindings(()=>({bindings:[{key:"?",cmd:close},{key:"up",cmd:()=>scrollBy(-1)},{key:"down",cmd:()=>scrollBy(1)},{key:"pageup",cmd:()=>scrollBy(-(scrollRef.current?.viewport.height??10))},{key:"pagedown",cmd:()=>scrollBy(scrollRef.current?.viewport.height??10)},{key:"home",cmd:()=>scrollToEdge("top")},{key:"end",cmd:()=>scrollToEdge("bottom")}]})),$jsxs("box",{paddingLeft:padX,paddingRight:padX,gap:1,flexShrink:1,children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",flexShrink:0,children:[$jsxs("box",{flexDirection:"column",gap:0,children:[$jsx("text",{attributes:TextAttributes9.BOLD,fg:theme.text,children:t3("help.title")}),$jsx("text",{fg:theme.textMuted,children:props.currentScope?t3("help.focused",{surface:tKeys("category",scopeCategory(props.currentScope))}):t3("help.allBindings")}),$jsx("text",{fg:theme.textMuted,children:t3("help.grammar",{prefix:pureTuiPrefix.key?formatChord(pureTuiPrefix.key):t3("help.disabled")})})]}),$jsx("text",{fg:theme.textMuted,onMouseUp:close,children:t3("help.esc")})]}),$jsx("scrollbox",{ref:(r6)=>{scrollRef.current=r6},flexShrink:1,flexGrow:1,stickyScroll:!1,verticalScrollbarOptions:{trackOptions:{backgroundColor:theme.backgroundDialog,foregroundColor:theme.borderActive}},children:$jsx("box",{paddingBottom:1,gap:1,paddingRight:1,children:sections.map((section,sectionIndex)=>$jsxs("box",{gap:0,children:[$jsx("text",{fg:theme.accent,attributes:TextAttributes9.BOLD,children:sectionTitle(section,t3)}),section.rows.map((row)=>{return $jsxs("box",{flexDirection:"row",gap:2,paddingLeft:1,children:[$jsx("box",{width:18,children:$jsx("text",{fg:theme.primary,children:displayCap(row.primary)})}),$jsx("box",{flexGrow:1,children:$jsx("text",{fg:theme.text,children:tKeys("desc",row.binding.id)})}),row.aliases.length>0?$jsx("box",{children:$jsx("text",{fg:theme.textMuted,children:`(${row.aliases.map(displayCap).join(", ")})`})}):null]},`${section.kind}-${row.binding.id}`)})]},`${section.kind}-${section.scope??sectionIndex}`))})})]})}var import_react60;var init_help_dialog=__esm(async()=>{init_chord_glyphs();init_help_groups();init_keymap_dispatch();init_keybindings2();init_i18n2();init_jsx_runtime();await __promiseAll([init_theme(),init_keymap(),init_dialog()]);import_react60=__toESM(require_react_production(),1);HelpDialog.show=(dialog,currentScope)=>{let reachability=currentBindingReachability(),inputScope=reachability.inputPassthrough?"terminal":currentScope;dialog.replace(()=>$jsx(HelpDialog,{currentScope:inputScope,reachability}))}});function useStatusKeyHintItems(opts){let t3=useT(),kv=useOptionalKV(),focus=useOptionalFocus(),dialog=useOptionalDialog(),keymapVersion2=useKeymapVersion(),stackVersion2=useBindingStackVersion(),hintsEnabled=keyHintsEnabled(kv?.get(KEY_HINTS_ENABLED_KEY,!0)),[snapshot,setSnapshot]=import_react61.useState({tokens:[],modal:!1});import_react61.useEffect(()=>{let enabled=hintsEnabled,nextModal=modalActive()||(dialog?.stack.length??0)>0,fresh=enabled&&!nextModal?statusHintTokens(currentBindingReachability(),currentPrefixConfiguration().key):null;setSnapshot((prev)=>{let nextTokens=fresh??(enabled?prev.tokens:[]);return prev.modal===nextModal&&prev.tokens.length===nextTokens.length&&prev.tokens.every((tok,i2)=>tok.chord===nextTokens[i2]?.chord&&tok.msg===nextTokens[i2]?.msg)?prev:{tokens:nextTokens,modal:nextModal}})},[keymapVersion2,stackVersion2,focus?.focused,dialog?.stack.length,hintsEnabled]);let actions=snapshot.modal?{commands:void 0,sidebar:void 0,help:void 0}:{commands:()=>void armPrefixFromCurrentStack(),sidebar:focus?()=>focus.setFocused("sidebar"):void 0,help:dialog?()=>HelpDialog.show(dialog,focus?.focused??"sidebar"):void 0},items=snapshot.tokens.map((tok)=>({text:opts?.compact?formatChord(tok.chord):t3(`hints.status.${tok.msg}`,{key:formatChord(tok.chord)}),onPress:actions[tok.msg]}));if(opts?.onOpenSettings&&!opts.compact&&hintsEnabled)items.push({text:`[${t3("hints.status.settings")}]`,bindingId:"settings.open",onPress:snapshot.modal?void 0:opts.onOpenSettings});return items}function StatusKeyHintBar(props){let{theme}=useTheme(),items=useStatusKeyHintItems({onOpenSettings:props.onOpenSettings,compact:props.compact});if(items.length===0)return null;return $jsx("box",{flexDirection:"row",flexShrink:0,children:items.flatMap((item,index)=>[index>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:" \xB7 "},`sep-${item.text}`):null,$jsxs("box",{position:"relative",onMouseUp:item.onPress,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:item.text}),item.bindingId?$jsx(ShortcutRevealBadge,{bindingId:item.bindingId,cover:!0}):null]},item.text)])})}function usePaneHintMark(pane){let kv=useOptionalKV();return import_react61.useCallback(()=>{if(!kv)return;if(kv.get(PANE_HINT_USED_KEYS[pane],!1)!==!0)kv.set(PANE_HINT_USED_KEYS[pane],!0)},[kv,pane])}function PaneKeyHint(props){let t3=useT(),{theme}=useTheme(),kv=useOptionalKV();useKeymapVersion();let enabledRaw=kv?.get(KEY_HINTS_ENABLED_KEY,!0),usedRaw=kv?.get(PANE_HINT_USED_KEYS[props.pane],!1);if(!keyHintsEnabled(enabledRaw))return null;let tokens=paneHintTokens(props.pane,paneHintVisible(enabledRaw,usedRaw)?"firstUse":"always");if(tokens.length===0)return null;return $jsx("text",{fg:theme.textMuted,wrapMode:"none",children:tokens.map((tok)=>`${formatChord(tok.cap)} ${t3(`hints.pane.${tok.msg}`)}`).join(" \xB7 ")})}var import_react61;var init_keyboard_hints2=__esm(async()=>{init_chord_glyphs();init_keyboard_hints();init_keymap_dispatch();init_keybindings2();init_kv();init_i18n2();init_jsx_runtime();await __promiseAll([init_focus(),init_theme(),init_keymap(),init_dialog(),init_help_dialog(),init_shortcut_reveal2()]);import_react61=__toESM(require_react_production(),1)});import{TextAttributes as TextAttributes10}from"@opentui/core";function FileTreeHeaderView(props){let{theme}=useTheme(),t3=useT(),prefixKey=currentPrefixConfiguration().key,createPRChord=prefixKey?`[${formatChord(prefixKey)} P]`:null;return $jsxs($Fragment2,{children:[props.onZenToggle||props.onCreatePR?$jsxs("box",{flexDirection:"row",flexWrap:"wrap",justifyContent:"flex-end",columnGap:2,paddingBottom:1,flexShrink:0,children:[props.onZenToggle?$jsxs("box",{position:"relative",flexDirection:"row",gap:1,flexShrink:0,onMouseUp:(e2)=>{e2.stopPropagation(),props.onZenToggle?.()},children:[$jsx("text",{fg:theme.accent,attributes:TextAttributes10.BOLD,wrapMode:"none",children:"[~]"}),$jsx("text",{fg:theme.text,wrapMode:"none",children:t3("files.actions.zen")}),$jsx(ShortcutRevealBadge,{bindingId:"workspace.zenToggle"})]}):null,props.onCreatePR?$jsxs("box",{flexDirection:"row",gap:1,flexShrink:0,onMouseUp:(e2)=>{e2.stopPropagation(),props.onCreatePR?.()},children:[createPRChord?$jsxs("box",{position:"relative",children:[$jsx("text",{fg:theme.accent,attributes:TextAttributes10.BOLD,wrapMode:"none",children:createPRChord}),$jsx(ShortcutRevealBadge,{bindingId:"files.createPR",cover:!0})]}):null,$jsx("text",{fg:theme.text,wrapMode:"none",children:t3("files.actions.createPR")})]}):null]}):null,$jsx("box",{flexDirection:"row",paddingBottom:0,flexShrink:0,gap:2,children:TAB_ORDER.map((tabId)=>{let isActive=props.tab===tabId;return $jsx("text",{fg:isActive?theme.primary:theme.textMuted,attributes:isActive?TextAttributes10.BOLD:void 0,wrapMode:"none",onMouseUp:()=>props.onSelectTab(tabId),children:t3(tabLabelKey(tabId))},tabId)})}),props.tab==="changes"?$jsxs("box",{flexDirection:"column",paddingBottom:1,flexShrink:0,gap:0,children:[$jsxs("text",{fg:theme.textMuted,wrapMode:"none",children:[props.scope==="branch"&&props.base!=null?t3("files.scope.branch",{base:props.base}):t3("files.scope.working"),props.base!=null?` ${t3("files.scope.toggleHint")}`:""]}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("files.legend.changes")})]}):$jsx("box",{flexDirection:"row",paddingBottom:1,flexShrink:0})]})}var init_header_view=__esm(async()=>{init_chord_glyphs();init_keymap_dispatch();init_keys_core();init_i18n2();init_jsx_runtime();await __promiseAll([init_shortcut_reveal2(),init_theme()])});function resolveRowSelectionChrome(theme,state){let transparent=theme.background.a===0;if(state.cursor){if(transparent)return{marker:"\u258C",markerColor:theme.focusAccent??theme.primary,backgroundColor:void 0};return{marker:"\u258C",markerColor:theme.text,backgroundColor:theme.backgroundElement}}if(state.selected)return{marker:"\u258C",markerColor:theme.borderActive,backgroundColor:transparent?void 0:theme.background};return{marker:" ",markerColor:void 0,backgroundColor:void 0}}import{TextAttributes as TextAttributes11}from"@opentui/core";var import_react62,FileTreeRowView;var init_row_view=__esm(async()=>{init_pane_core();init_rows();init_jsx_runtime();await init_theme();import_react62=__toESM(require_react_production(),1),FileTreeRowView=import_react62.memo(function(props){let{theme}=useTheme(),selection=resolveRowSelectionChrome(theme,{cursor:props.cursor}),bar=$jsx("text",{fg:selection.markerColor,wrapMode:"none",children:selection.marker}),rowBg=selection.backgroundColor,row=props.row;if(row.kind==="dir"){let indent2=" ".repeat(row.depth);return $jsxs("box",{flexDirection:"row",gap:0,backgroundColor:rowBg,onMouseUp:()=>props.onActivate(props.row,props.index),children:[bar,$jsx("box",{flexGrow:1,paddingRight:1,children:$jsx("text",{fg:theme.textMuted,attributes:TextAttributes11.BOLD,wrapMode:"none",children:`${indent2}${row.expanded?"\u25BE":"\u25B8"} ${row.name}/`})})]})}if(row.kind==="file"){let indent2=" ".repeat(row.depth);return $jsxs("box",{flexDirection:"row",gap:0,backgroundColor:rowBg,onMouseUp:()=>props.onActivate(props.row,props.index),children:[bar,$jsx("box",{flexGrow:1,paddingRight:1,children:$jsx("text",{fg:theme.text,wrapMode:"none",children:`${indent2} ${row.name}`})})]})}let isUntrackedDir2=row.fileCount!==void 0,marker=isUntrackedDir2?row.expanded?"\u25BE ":"\u25B8 ":"",countSuffix=isUntrackedDir2?` (${row.fileCount})`:"",indent=row.child?" ":"",pathBudget=props.pathBudget-displayWidth(marker)-displayWidth(countSuffix)-displayWidth(indent),tone=statusToken(row.status),statusColor=tone==="success"?theme.success:tone==="warning"?theme.warning:tone==="error"?theme.error:tone==="info"?theme.info:theme.textMuted;return $jsxs("box",{flexDirection:"row",gap:0,backgroundColor:rowBg,onMouseUp:()=>props.onActivate(props.row,props.index),children:[bar,$jsxs("box",{flexDirection:"row",flexGrow:1,gap:1,paddingRight:1,children:[$jsx("text",{fg:statusColor,wrapMode:"none",children:row.status}),$jsx("text",{fg:isUntrackedDir2?theme.textMuted:theme.text,wrapMode:"none",flexGrow:1,children:`${indent}${marker}${truncatePathTail(row.path,pathBudget)}${countSuffix}`}),props.statWidths.added>0?$jsx("text",{fg:theme.success,wrapMode:"none",children:statCell(row.added,props.statWidths.added,"+")}):null,props.statWidths.deleted>0?$jsx("text",{fg:theme.error,wrapMode:"none",children:statCell(row.deleted,props.statWidths.deleted,"-")}):null]})]})})});function FileTree(props){let{theme}=useTheme(),t3=useT(),dims=useTerminalDimensions(),[tab,setTab]=import_react64.useState("all"),[scope,setScope]=import_react64.useState("working"),[scopeManual,setScopeManual]=import_react64.useState(!1),[base,setBase]=import_react64.useState(null),[cursorIndex,setCursorIndex]=import_react64.useState(0),[refreshTick,setRefreshTick]=import_react64.useState(0),[allFiles,setAllFiles]=import_react64.useState(null),[changes,setChanges]=import_react64.useState(null),[error,setError]=import_react64.useState(null),[expandedDirs,setExpandedDirs]=import_react64.useState(()=>new Set),pathRef=useLatest(props.worktreePath),tabRef=useLatest(tab),allFilesRef=useLatest(allFiles),changesRef=useLatest(changes),scopeRef=useLatest(scope),baseRef=useLatest(base),scopeManualRef=useLatest(scopeManual),onOpenFileRef=useLatest(props.onOpenFile),fetchSeq=import_react64.useRef(0),refetch=import_react64.useCallback(async(currentTab,path22,signal)=>{let seq=++fetchSeq.current;if(path22==null){setAllFiles(null),setChanges(null),setError(null);return}setError(null);try{if(currentTab==="all"){let files=await listFiles(path22,signal);if(signal?.aborted||seq!==fetchSeq.current||pathRef.current!==path22)return;setAllFiles((prev)=>sameFileList(prev,files)?prev:files)}else if(currentTab==="changes"){let wantBranch=scopeRef.current==="branch"&&baseRef.current!=null,entries=wantBranch?await statusFilesBranch(path22,baseRef.current,signal):await statusFiles(path22,signal);if(signal?.aborted||seq!==fetchSeq.current||pathRef.current!==path22)return;if(!wantBranch&&entries.length===0&&!scopeManualRef.current&&baseRef.current!=null){setScope("branch");return}setChanges((prev)=>sameStatusEntries(prev,entries)?prev:entries)}}catch(err){if(signal?.aborted)return;let message=errorMessage(err);if(seq===fetchSeq.current&&pathRef.current===path22)setError(message)}},[]);import_react64.useEffect(()=>{setAllFiles(null),setChanges(null),setError(null),setCursorIndex(0),setExpandedDirs(new Set),setScope("working"),setScopeManual(!1);let controller=new AbortController;return refetch(tabRef.current,props.worktreePath,controller.signal),()=>controller.abort()},[props.worktreePath,refetch]),import_react64.useEffect(()=>{let path22=props.worktreePath;if(path22==null){setBase(null);return}let disposed=!1,controller=new AbortController;return resolveBase(path22,props.prBaseRef,controller.signal).then((b3)=>{if(!disposed)setBase(b3)}).catch(()=>{if(!disposed)setBase(null)}),()=>{disposed=!0,controller.abort()}},[props.worktreePath,props.prBaseRef]),import_react64.useEffect(()=>{if(tabRef.current!=="changes")return;let path22=pathRef.current;if(path22==null)return;let controller=new AbortController;return refetch("changes",path22,controller.signal),()=>controller.abort()},[scope,base,refetch]),import_react64.useEffect(()=>{let path22=props.worktreePath;if(path22==null)return;if(process.env.KOBE_FILETREE_WATCH==="0")return;return watchWorktree(path22,()=>setRefreshTick((n2)=>n2+1))},[props.worktreePath]),import_react64.useEffect(()=>{setCursorIndex(0);let path22=pathRef.current;if(path22==null)return;let controller=new AbortController;if(tab==="all"){if(allFilesRef.current==null)refetch("all",path22,controller.signal)}else if(tab==="changes"){if(changesRef.current==null)refetch("changes",path22,controller.signal)}return()=>controller.abort()},[tab,refetch]),import_react64.useEffect(()=>{if(refreshTick===0)return;let path22=pathRef.current;if(path22==null)return;let controller=new AbortController;return refetch(tabRef.current,path22,controller.signal),()=>controller.abort()},[refreshTick,refetch]);let tree=import_react64.useMemo(()=>allFiles==null?null:buildTree(allFiles),[allFiles]),prevRows=import_react64.useRef([]),rows=import_react64.useMemo(()=>{let next=[];if(tab==="all"){if(tree!=null)flattenTree(tree,expandedDirs,0,next)}else if(tab==="changes"){if(changes!=null)next.push(...statusRows(changes,expandedDirs))}let reconciled=reconcileRows(prevRows.current,next);return prevRows.current=reconciled,reconciled},[tab,tree,expandedDirs,changes]);import_react64.useEffect(()=>{if(rows.length===0)return;setCursorIndex((i2)=>i2>rows.length-1?rows.length-1:i2)},[rows]);let statWidths=import_react64.useMemo(()=>computeStatWidths(rows),[rows]),paneWidth=props.paneWidth??dims.width,pathBudget=import_react64.useMemo(()=>computePathBudget(paneWidth,statWidths),[paneWidth,statWidths]);function applyNav(action){if(!action)return;if(action.type==="cursor")setCursorIndex(action.index);else if(action.type==="expand")setExpandedDirs((prev)=>new Set(prev).add(action.path));else setExpandedDirs((prev)=>toggleDir(prev,action.path))}let activateRow=import_react64.useCallback((row)=>{if(row.kind==="dir"||row.path.endsWith("/"))setExpandedDirs((prev)=>toggleDir(prev,row.path));else onOpenFileRef.current(row.path)},[]),handleRowActivate=import_react64.useCallback((row,index)=>{setCursorIndex(index),activateRow(row)},[activateRow]),markKeysUsed=usePaneHintMark("files");useBindings(()=>({enabled:props.focused??!0,bindings:fileTreeBindings({moveDown:()=>{if(markKeysUsed(),rows.length===0)return;setCursorIndex((i2)=>Math.min(i2+1,rows.length-1))},moveUp:()=>{if(markKeysUsed(),rows.length===0)return;setCursorIndex((i2)=>Math.max(i2-1,0))},setTab,currentTab:()=>tab,openCurrent:()=>{markKeysUsed();let row=rows[cursorIndex];if(row)activateRow(row)},mentionCurrent:()=>{let row=rows[cursorIndex];if(!row||row.kind==="dir"||row.path.endsWith("/"))return;props.onMention?.(row.path)},openExternal:()=>{let row=rows[cursorIndex];if(!row||row.kind==="dir"||row.path.endsWith("/"))return;if(!props.worktreePath)return;openExternally(`${props.worktreePath}/${row.path}`)},refresh:()=>{setRefreshTick((n2)=>n2+1)},toggleScope:()=>{if(tab!=="changes")return;if(base==null)return;setScopeManual(!0),setScope((s2)=>s2==="working"?"branch":"working")},openDiff:()=>{let row=rows[cursorIndex];if(!row||row.kind==="dir"||row.path.endsWith("/"))return;props.onOpenDiff?.(row.path,scope==="branch"&&base!=null?base:void 0)},expandOrDescend:()=>applyNav(expandOrDescendAction(rows,cursorIndex)),collapseOrParent:()=>applyNav(collapseOrParentAction(rows,cursorIndex))})}));let scrollRef=import_react64.useRef(null);import_react64.useEffect(()=>{let scroll=scrollRef.current;if(!scroll||rows.length===0)return;let y3=followScrollTop(scroll.scrollTop,scroll.viewport.height,cursorIndex);if(y3!=null)scroll.scrollTo({x:0,y:y3})},[cursorIndex,rows]);let loaded=tab==="all"&&allFiles!=null||tab==="changes"&&changes!=null;return $jsxs("box",{flexDirection:"column",flexGrow:1,paddingLeft:0,paddingRight:0,children:[$jsx(FileTreeHeaderView,{tab,scope,base,onSelectTab:setTab,onZenToggle:props.onZenToggle,onCreatePR:props.onCreatePR}),$jsx("scrollbox",{ref:(r6)=>{scrollRef.current=r6},flexGrow:1,verticalScrollbarOptions:{trackOptions:{foregroundColor:"transparent"}},children:props.worktreePath==null?$jsx("box",{paddingTop:1,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:t3("files.empty.noTask")})}):error!=null?$jsxs("box",{paddingTop:1,paddingLeft:1,flexDirection:"column",gap:0,children:[$jsx("text",{fg:theme.error,wrapMode:"word",children:summarizeGitError(error,t3)}),$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t3("files.error.retryHint")})]}):rows.length===0&&loaded?$jsx("box",{paddingTop:1,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:tab==="all"?t3("files.empty.noFiles"):t3("files.empty.noChanges")})}):rows.length>0?$jsx("box",{flexShrink:0,gap:0,paddingRight:1,children:rows.map((row,index)=>$jsx(FileTreeRowView,{row,index,cursor:index===cursorIndex,statWidths,pathBudget,onActivate:handleRowActivate},`${row.kind}:${row.path}`))}):null}),props.worktreePath!=null?$jsx("box",{flexDirection:"row",justifyContent:"flex-end",paddingTop:1,flexShrink:0,children:$jsx(PaneKeyHint,{pane:"files"})}):null]})}var import_react64;var init_FileTree=__esm(async()=>{init_git2();init_keys_core();init_open_external2();init_pane_core();init_rows();init_i18n2();init_use_latest();init_jsx_runtime();await __promiseAll([init_react(),init_keyboard_hints2(),init_theme(),init_keymap(),init_header_view(),init_row_view()]);import_react64=__toESM(require_react_production(),1)});function HostFilesPane(props){let{theme}=useTheme(),focus=useFocus(),dims=useTerminalDimensions(),inactiveBorder=theme.borderActive,available=Math.max(WORKTREE_TOOLS_MIN_WIDTH,dims.width-sidebarWidthFor(dims.width)),width=Math.max(WORKTREE_TOOLS_MIN_WIDTH,Math.min(WORKTREE_TOOLS_MAX_WIDTH,Math.floor(available/3)));return $jsx("box",{width,flexShrink:0,borderStyle:"rounded",borderColor:focus.focused==="files"?theme.focusAccent:inactiveBorder,onMouseUp:()=>focus.setFocused("files"),children:$jsx(FileTree,{worktreePath:props.worktree,paneWidth:width-2,prBaseRef:props.prBaseRef,focused:props.focused,onOpenFile:props.onOpenFile,onOpenDiff:props.onOpenDiff,onMention:props.onMention,onZenToggle:props.onZenToggle,onCreatePR:props.taskKind==="main"?void 0:props.onCreatePR})})}var WORKTREE_TOOLS_MIN_WIDTH=22,WORKTREE_TOOLS_MAX_WIDTH=34;var init_host_files_pane=__esm(async()=>{init_view_core();init_jsx_runtime();await __promiseAll([init_react(),init_focus(),init_theme(),init_FileTree()])});function ratioBar(ratio,width=8){let cells=Math.min(1,Math.max(0,ratio))*width,full=Math.floor(cells),eighth=Math.round((cells-full)*8);if(eighth===8)full+=1,eighth=0;let partial=full<width?EIGHTHS[eighth]??"":"";return`${"\u2588".repeat(full)}${partial}`.padEnd(width,"\u2591")}var EIGHTHS;var init_progress_bar=__esm(()=>{EIGHTHS=["","\u258F","\u258E","\u258D","\u258C","\u258B","\u258A","\u2589"]});function formatReset(resetsAt,nowMs){if(resetsAt==null||resetsAt<=nowMs)return"";let d2=new Date(resetsAt),clock=`${pad2(d2.getHours())}:${pad2(d2.getMinutes())}`;if(resetsAt-nowMs<86400000)return`\u2192 ${clock}`;return`\u2192 ${d2.getMonth()+1}/${d2.getDate()} ${clock}`}function usageChips(usage,nowMs){return usage.windows.map((w4)=>({label:w4.label,percentText:`${w4.percent}%`,resetText:formatReset(w4.resetsAt,nowMs),tone:toneOf(w4.percent)}))}function narrowUsageChip(usage,nowMs){let w4=usage.windows.find((win)=>win.kind==="session")??usage.windows[0];if(!w4)return null;return{label:w4.label,percentText:`${w4.percent}%`,resetText:formatReset(w4.resetsAt,nowMs),tone:toneOf(w4.percent)}}function fullChipCells(chip,index){let label=index===0?chip.label:`\xB7 ${chip.label}`,parts=[displayWidth(label),displayWidth(chip.percentText)];if(chip.resetText)parts.push(displayWidth(chip.resetText));return parts.reduce((a2,b3)=>a2+b3,0)+(parts.length-1)}function fullVendorCells(vendor){return displayWidth(vendor.vendor)+vendor.chips.reduce((sum,chip,i2)=>sum+fullChipCells(chip,i2),0)+vendor.chips.length}function usageChipsBudget(opts){return Math.max(0,opts.terminalWidth-4-opts.hintCells)}function buildFooterChips(opts){let entries=[...opts.usage.entries()].map(([id,snapshot])=>({vendor:opts.vendorLabel(id).toUpperCase(),snapshot,chips:usageChips(snapshot,opts.nowMs)})).filter((entry)=>entry.chips.length>0);if(entries.length===0)return null;if(!opts.forceCompact){let fulls=entries.map((entry)=>({vendor:entry.vendor,chips:entry.chips}));if(fulls.reduce((sum,v3)=>sum+fullVendorCells(v3),0)+(fulls.length-1)*2<=opts.budget)return{form:"full",vendors:fulls}}let vendors=[],remaining=opts.budget;for(let entry of entries){let chip=narrowUsageChip(entry.snapshot,opts.nowMs);if(!chip)continue;let gap=vendors.length>0?2:0,need=displayWidth(entry.vendor)+1+displayWidth(chip.percentText);if(need+gap<=remaining){vendors.push({vendor:entry.vendor,percentText:chip.percentText,tone:chip.tone}),remaining-=need+gap;continue}let nameBudget=remaining-gap-1-displayWidth(chip.percentText);if(nameBudget>=3)vendors.push({vendor:truncateEndCells(entry.vendor,nameBudget,approxCharCells),percentText:chip.percentText,tone:chip.tone});break}return{form:"compact",vendors}}function usageRows(usage,nowMs){let labelWidth=Math.min(8,usage.windows.reduce((w4,win)=>Math.max(w4,win.label.length),2));return usage.windows.map((w4)=>({label:(w4.label.length>labelWidth?w4.label.slice(0,labelWidth):w4.label).padEnd(labelWidth),bar:ratioBar(w4.percent/100,USAGE_BAR_WIDTH),percentText:`${String(w4.percent).padStart(3)}%`,resetText:formatReset(w4.resetsAt,nowMs),tone:toneOf(w4.percent)}))}var USAGE_BAR_WIDTH=10,toneOf=(percent)=>percent>=95?"crit":percent>=75?"warn":"ok",pad2=(n2)=>String(n2).padStart(2,"0");var init_usage_core=__esm(()=>{init_progress_bar()});function UsageChips(props){let{theme}=useTheme(),usage=useAccessor(props.orchestrator.usageSnapshotSignal()),toneColor2={ok:theme.success,warn:theme.warning,crit:theme.error},now=Date.now(),view=usage&&usage.size>0?buildFooterChips({usage,budget:props.budget,nowMs:now,vendorLabel:engineDisplayName,forceCompact:props.narrow}):null;if(!view)return null;if(view.form==="full")return $jsx("box",{flexDirection:"row",gap:2,children:view.vendors.map((vendor)=>$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:vendor.vendor}),vendor.chips.map((chip,i2)=>$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:i2===0?chip.label:`\xB7 ${chip.label}`}),$jsx("text",{fg:toneColor2[chip.tone],wrapMode:"none",children:chip.percentText}),chip.resetText?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:chip.resetText}):null]},chip.label))]},vendor.vendor))});return $jsx("box",{flexDirection:"row",gap:2,children:view.vendors.map((vendor,index)=>$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:vendor.vendor}),$jsx("text",{fg:toneColor2[vendor.tone],wrapMode:"none",children:vendor.percentText})]},`${vendor.vendor}-${index}`))})}function WorkspaceFrame(props){let{theme}=useTheme(),dims=useTerminalDimensions(),narrow=isNarrowWidth(dims.width),usage=useAccessor(props.orchestrator.usageSnapshotSignal()),hintItems=useStatusKeyHintItems({onOpenSettings:narrow?void 0:props.onOpenSettings,compact:narrow}),footerVisible=usage!=null&&usage.size>0||hintItems.length>0,hintCells=hintItems.reduce((sum,item,index)=>sum+displayWidth(item.text)+(index>0?3:0),0),chipsBudget=usageChipsBudget({terminalWidth:dims.width,hintCells});return $jsx(ShortcutRevealProvider,{children:$jsxs("box",{flexDirection:"column",flexGrow:1,backgroundColor:theme.background,children:[props.banner,$jsx("box",{flexDirection:"row",flexGrow:1,children:props.children}),footerVisible?$jsxs("box",{flexDirection:"row",flexShrink:0,height:1,paddingLeft:1,paddingRight:1,gap:2,children:[$jsx("box",{flexGrow:1,flexShrink:1,flexDirection:"row",overflow:"hidden",children:$jsx(UsageChips,{orchestrator:props.orchestrator,narrow,budget:chipsBudget})}),$jsx(StatusKeyHintBar,{onOpenSettings:narrow?void 0:props.onOpenSettings,compact:narrow})]}):null]})})}var init_host_footer=__esm(async()=>{init_interactive_command();init_usage_core();init_use_accessor();init_jsx_runtime();await __promiseAll([init_react(),init_keyboard_hints2(),init_shortcut_reveal2(),init_theme()])});function workspacePagesClosed(s2){return!s2.dialogOpen&&!s2.settingsOpen&&!s2.worktreesOpen&&!s2.updateOpen}function settingsCloseKeysEnabled(s2){return s2.settingsOpen&&!s2.dialogOpen}function nextFocusedPane(current,delta,opts){let reachable=PANE_CYCLE.filter((pane)=>pane!=="files"||opts.filesVisible),idx=reachable.indexOf(current);if(idx<0)return(delta>0?reachable[reachable.length-1]:reachable[0])??null;let next=Math.min(Math.max(idx+delta,0),reachable.length-1);return next===idx?null:reachable[next]??null}var PANE_CYCLE;var init_keybinding_gates=__esm(()=>{PANE_CYCLE=["sidebar","workspace","files"]});function firePluginBinding(binding){let verb=binding.kind==="pane"?["plugin","pane","open",binding.target]:["plugin","action","invoke",binding.target],[cmd,...rest]=[...kobeCliInvocation(),...verb];spawnDetached(cmd,rest,{onError:(err)=>console.warn(`[rove/plugins] ${binding.target}: ${String(err)}`)})}function usePluginKeybindings(enabled){useBindings(()=>({enabled,bindings:pluginKeybindings().map((binding)=>({key:binding.chord,cmd:()=>firePluginBinding(binding)}))}))}var init_use_plugin_keybindings=__esm(async()=>{init_invocation();init_spawn_detached();init_keybindings_user();await init_keymap()});function useWorkspaceKeybindings(deps){let{focus,dialog}=deps,t3=useT(),renderer=useRenderer();function exitApp(){try{renderer?.destroy()}catch(err){console.error("Rove: renderer.destroy() failed during quit:",err)}process.exit(0)}async function quit(){if(await DialogConfirm.show(dialog,t3("workspace.quit.confirmTitle"),t3("workspace.quit.confirmBody"),t3("common.cancel"),t3("workspace.quit.confirmLabel")))exitApp()}function cyclePane(delta){let next=nextFocusedPane(focus.focused,delta,{filesVisible:deps.filesPaneVisible!==!1});if(next)focus.setFocused(next)}let pages={dialogOpen:deps.dialog.stack.length>0,settingsOpen:deps.pages.settingsOpen,worktreesOpen:deps.pages.worktreesOpen,updateOpen:deps.pages.updateOpen,kanbanOpen:deps.pages.kanbanOpen,automationsOpen:deps.pages.automationsOpen,workItemsOpen:deps.pages.workItemsOpen},pagesClosed=workspacePagesClosed(pages);useBindings(()=>({enabled:pagesClosed,bindings:[...bindByIds({"help.open":()=>HelpDialog.show(dialog,focus.focused),"focus.previous":prefixAction(()=>cyclePane(-1)),"focus.next":prefixAction(()=>cyclePane(1)),"workspace.zenToggle":prefixAction(()=>deps.toggleZen()),"attention.next":()=>deps.jumpToNextAttention(),"inbox.show":prefixAction(()=>deps.openInbox()),"kanban.open":prefixAction(()=>deps.pages.openKanban()),"automations.open":prefixAction(()=>deps.pages.openAutomations()),"workItems.open":prefixAction(()=>deps.pages.openWorkItems()),"task.moveMode":prefixAction(()=>deps.enterMoveMode()),"settings.open":prefixAction(()=>deps.pages.openSettings()),"files.createPR":prefixAction(()=>{let row=focus.focused==="sidebar"?deps.cursorTaskId():null;if(row!==null&&row!==deps.selectedId)deps.createPRFor(row);else deps.createPR()}),"task.openEditor":prefixAction(()=>{let id=(focus.focused==="sidebar"?deps.cursorTaskId():null)??deps.selectedId;if(id)deps.openTaskWorktree(id)})})]})),useBindings(()=>({enabled:!pages.dialogOpen&&!pages.settingsOpen&&!deps.searchActive,bindings:bindByIds({"task.new.global":()=>deps.createTask()})})),useBindings(()=>({enabled:pagesClosed&&focus.focused!=="sidebar",bindings:bindByIds({"focus.sidebar":()=>focus.setFocused("sidebar")})})),useBindings(()=>({enabled:pagesClosed&&focus.focused==="sidebar"&&!deps.searchActive,bindings:bindByIds({"app.quit":(_evt,slot)=>{if(slot===1){exitApp();return}quit()},"settings.open.sidebar":()=>deps.pages.openSettings(),"worktrees.open.sidebar":()=>deps.pages.openWorktrees(),"tasks.update":()=>deps.pages.openUpdate()})})),useBindings(()=>({enabled:pagesClosed&&focus.focused==="sidebar"&&!deps.searchActive,bindings:bindByIds({"task.new":()=>deps.createTask(),"tasks.openWorktree":()=>{let id=deps.cursorTaskId();if(id)deps.openTaskWorktree(id)},"tasks.renameBranch":()=>{let id=deps.cursorTaskId();if(id)deps.renameBranch(id)},"tasks.cycleEngine":()=>{let id=deps.cursorTaskId();if(id)deps.cycleVendor(id)},"tasks.focusEngine":()=>focus.setFocused("workspace"),"sidebar.sort":()=>deps.toggleSortMode()})})),useBindings(()=>({enabled:settingsCloseKeysEnabled(pages),bindings:pageCloseBindings(deps.pages.closeSettings)})),usePluginKeybindings(pagesClosed)}var init_host_keybindings=__esm(async()=>{init_keymap_dispatch();init_keybindings2();init_i18n2();init_keybinding_gates();await __promiseAll([init_react(),init_help_dialog(),init_keymap(),init_dialog_confirm(),init_use_plugin_keybindings()])});function focusPaneForNav(nav){return nav==="terminal"?"sidebar":"workspace"}var SIDEBAR_NAV_ITEMS;var init_nav_core=__esm(()=>{SIDEBAR_NAV_ITEMS=[{nav:"kanban",labelKey:"tasks.nav.kanban",bindingId:"kanban.open"},{nav:"automations",labelKey:"tasks.nav.automations",bindingId:"automations.open"},{nav:"issues",labelKey:"tasks.nav.issues",bindingId:"workItems.open"}]});function relativeBuckets(absMs){let minutes=Math.round(absMs/60000),hours=Math.round(minutes/60);return{minutes,hours,days:Math.round(hours/24)}}function dividerRule(terminalWidth){return"\u2500".repeat(Math.max(1,terminalWidth))}function nextComposerField(field,delta=1){let index=COMPOSER_FIELDS.indexOf(field);if(index<0)return"name";let next=(index+delta+COMPOSER_FIELDS.length)%COMPOSER_FIELDS.length;return COMPOSER_FIELDS[next]}function canSubmitDraft(draft){return draft.name.trim().length>0&&draft.repo.trim().length>0&&draft.prompt.trim().length>0&&isValidCron(draft.schedule.trim())}function firstIncompleteField(draft){if(draft.name.trim().length===0)return"name";if(draft.repo.trim().length===0)return"repo";if(draft.prompt.trim().length===0)return"prompt";if(!isValidCron(draft.schedule.trim()))return"schedule";return null}function previewSchedule(expression,nowMs){let trimmed=expression.trim();if(!isValidCron(trimmed))return{kind:"invalid"};let nextRunMs;try{nextRunMs=nextCronAfter(trimmed,nowMs)}catch{return{kind:"never"}}return{kind:"ok",nextRunMs,relative:formatRelative(nextRunMs-nowMs),absolute:formatAbsolute(nextRunMs,nowMs)}}function formatRelative(deltaMs){let{minutes,hours,days}=relativeBuckets(deltaMs);if(minutes<60)return`in ${Math.max(1,minutes)}m`;if(hours<24)return`in ${hours}h`;return`in ${days}d`}function formatAbsolute(atMs,nowMs){let at2=new Date(atMs),time=`${String(at2.getHours()).padStart(2,"0")}:${String(at2.getMinutes()).padStart(2,"0")}`,now=new Date(nowMs);if(at2.getFullYear()===now.getFullYear()&&at2.getMonth()===now.getMonth()&&at2.getDate()===now.getDate())return time;let weekday=WEEKDAYS[at2.getDay()]??"";if(atMs-nowMs<518400000)return`${weekday} ${time}`;return`${weekday} ${MONTHS[at2.getMonth()]??""} ${at2.getDate()}, ${time}`}var COMPOSER_FIELDS,EMPTY_DRAFT,WEEKDAYS,MONTHS;var init_automation_composer=__esm(()=>{init_cron();COMPOSER_FIELDS=["name","repo","prompt","schedule","confirm"];EMPTY_DRAFT={name:"",repo:"",prompt:"",schedule:"0 9 * * MON-FRI"};WEEKDAYS=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],MONTHS=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function splitCron(expression){let parts=expression.trim().split(/\s+/).filter(Boolean);return CRON_SEGMENTS.map((_4,index)=>parts[index]??"*")}function joinCron(parts){return CRON_SEGMENTS.map((_4,index)=>parts[index]??"*").join(" ")}function range(from,to){let out=[];for(let n2=from;n2<=to;n2++)out.push(String(n2));return out}function stepSegment(segment,current,delta){let ladder=LADDERS[segment],index=ladder.indexOf(current.trim().toUpperCase());if(index<0)return(delta>0?ladder[0]:ladder[ladder.length-1])??current;let next=(index+delta+ladder.length)%ladder.length;return ladder[next]??current}function moveSegmentCursor(cursor,delta){return Math.min(Math.max(cursor+delta,0),CRON_SEGMENTS.length-1)}function setSegment(expression,index,value){let parts=splitCron(expression);if(index<0||index>=CRON_SEGMENTS.length)return joinCron(parts);return parts[index]=value,joinCron(parts)}function describeCron(expression){let[minute,hour,dom,month,dow]=splitCron(expression);if(month!=="*"||dom!=="*")return null;if(minute===void 0||hour===void 0||dow===void 0)return null;let at2=describeTimeOfDay(minute,hour);if(!at2)return null;if(dow==="*")return at2.startsWith("every ")?at2:`every day ${at2}`;if(dow==="MON-FRI")return`weekdays ${at2}`;if(dow==="SAT,SUN")return`weekends ${at2}`;let named=DOW_NAMES[dow.toUpperCase()];if(named)return`${named} ${at2}`;return null}function describeTimeOfDay(minute,hour){if(hour==="*"){if(minute==="*")return"every minute";if(minute.startsWith("*/"))return`every ${minute.slice(2)}m`;if(/^\d+$/.test(minute))return`hourly at :${minute.padStart(2,"0")}`;return null}if(hour.startsWith("*/")&&minute==="0")return`every ${hour.slice(2)}h`;if(/^\d+$/.test(hour)&&/^\d+$/.test(minute))return`at ${hour.padStart(2,"0")}:${minute.padStart(2,"0")}`;return null}var CRON_SEGMENTS,MINUTE_LADDER,HOUR_LADDER,DOM_LADDER,MONTH_LADDER,DOW_LADDER,DOW_NAMES,LADDERS;var init_cron_segments=__esm(()=>{CRON_SEGMENTS=["minute","hour","dayOfMonth","month","dayOfWeek"];MINUTE_LADDER=["*","*/5","*/10","*/15","*/30",...range(0,59)],HOUR_LADDER=["*","*/2","*/3","*/4","*/6","*/12",...range(0,23)],DOM_LADDER=["*",...range(1,31)],MONTH_LADDER=["*","JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],DOW_LADDER=["*","MON-FRI","SAT,SUN","MON","TUE","WED","THU","FRI","SAT","SUN"],DOW_NAMES={MON:"Mondays",TUE:"Tuesdays",WED:"Wednesdays",THU:"Thursdays",FRI:"Fridays",SAT:"Saturdays",SUN:"Sundays"};LADDERS={minute:MINUTE_LADDER,hour:HOUR_LADDER,dayOfMonth:DOM_LADDER,month:MONTH_LADDER,dayOfWeek:DOW_LADDER}});function fuzzyMatch(query,haystack){if(!query)return!0;let q2=query.toLowerCase(),h2=haystack.toLowerCase(),qi=0;for(let hi=0;hi<h2.length&&qi<q2.length;hi++)if(h2.charCodeAt(hi)===q2.charCodeAt(qi))qi++;return qi===q2.length}function compareRecent(a2,b3){let byTime=taskTime(b3)-taskTime(a2);if(byTime!==0)return byTime;return String(b3.id).localeCompare(String(a2.id))}function taskTime(task){let parsed=Date.parse(task.updatedAt||task.createdAt);return Number.isFinite(parsed)?parsed:0}function repoBasename(repo){let segments=repo.split("/").filter(Boolean);return segments[segments.length-1]??repo}function sidebarProjectKey(repo){return repo.trim().replace(/[\\/]+$/,"")||repo}function sidebarProjectLabel(repo,repos){let base=repoBasename(repo);if(!repos.some((r6)=>r6!==repo&&repoBasename(r6)===base))return base;return repo.replace(/[\\/]+$/,"").split(/[\\/]+/).slice(-2).join("/")}var init_groups=()=>{};import{TextAttributes as TextAttributes12}from"@opentui/core";function PickerList(props){let{theme}=useTheme(),t3=useT(),below=props.window.total-props.window.start-props.window.items.length;return $jsxs("box",{gap:0,paddingLeft:2,paddingBottom:props.paddingBottom,children:[props.window.start>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("newTask.picker.moreAbove",{count:props.window.start})}):null,props.rows.map((row,i2)=>{let absoluteIndex=props.window.start+i2,isCursor=absoluteIndex===props.cursor,fg=isCursor?theme.primary:row.accent?theme.accent:theme.textMuted,attributes=isCursor?TextAttributes12.BOLD:void 0;if(!row.dim)return $jsxs("text",{fg,attributes,wrapMode:"none",onMouseUp:()=>props.onPick(absoluteIndex),children:[isCursor?"\u25B8 ":" ",row.body]},row.key);return $jsxs("box",{flexDirection:"row",onMouseUp:()=>props.onPick(absoluteIndex),children:[$jsxs("text",{fg,attributes,wrapMode:"none",flexShrink:0,children:[isCursor?"\u25B8 ":" ",row.body]}),$jsx("box",{flexGrow:1}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:1,children:` ${row.dim}`})]},row.key)}),below>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("newTask.picker.moreBelow",{count:below})}):null,props.footer]})}var init_picker_list=__esm(async()=>{init_i18n2();init_jsx_runtime();await init_theme()});import{TextAttributes as TextAttributes13}from"@opentui/core";function AutomationComposerView(props){let{theme}=useTheme(),dialog=useDialog(),t3=useT(),padX=useDialogPaddingX(),[draft,setDraft]=import_react68.useState(()=>({...EMPTY_DRAFT,repo:props.defaultRepo??props.repos[0]??""})),[field,setField]=import_react68.useState("name"),[repoCursor,setRepoCursor]=import_react68.useState(()=>{let at2=props.repos.indexOf(props.defaultRepo??"");return at2>=0?at2:0}),[error,setError]=import_react68.useState(null),[segmentCursor,setSegmentCursor]=import_react68.useState(0),segmentValues=splitCron(draft.schedule),selectSegment=(index)=>{setField("schedule"),setSegmentCursor(Math.min(Math.max(index,0),CRON_SEGMENTS.length-1))},cancel=()=>{props.onCancel(),dialog.clear()},patch=(next)=>{setDraft((prev)=>({...prev,...next})),setError(null)},pickRepoAt=(index)=>{let repo=props.repos[clampCursor(index,props.repos.length)];if(!repo)return;setRepoCursor(clampCursor(index,props.repos.length)),patch({repo})};function commit(){if(canSubmitDraft(draft)){props.onSubmit({name:draft.name.trim(),repo:draft.repo.trim(),prompt:draft.prompt.trim(),schedule:draft.schedule.trim()}),dialog.clear();return}let gap=firstIncompleteField(draft);if(gap)setField(gap),setError(t3(`automations.missing.${gap}`))}let preview=previewSchedule(draft.schedule,Date.now()),repoWindow=windowAround(props.repos,repoCursor),repoRows=repoWindow.items.map((repo,index)=>({key:repo,body:sidebarProjectLabel(repo,props.repos),accent:repoWindow.start+index===repoCursor}));return useBindings(()=>({bindings:[{key:"tab",cmd:()=>setField((f2)=>nextComposerField(f2,1))},{key:"shift+tab",cmd:()=>setField((f2)=>nextComposerField(f2,-1))},...field==="repo"?[{key:"up",cmd:()=>pickRepoAt(repoCursor-1)},{key:"down",cmd:()=>pickRepoAt(repoCursor+1)}]:[],...field==="schedule"?[{key:"left",cmd:()=>setSegmentCursor((c2)=>moveSegmentCursor(c2,-1))},{key:"right",cmd:()=>setSegmentCursor((c2)=>moveSegmentCursor(c2,1))},{key:"up",cmd:()=>{let seg=CRON_SEGMENTS[segmentCursor];if(!seg)return;patch({schedule:setSegment(draft.schedule,segmentCursor,stepSegment(seg,segmentValues[segmentCursor]??"*",1))})}},{key:"down",cmd:()=>{let seg=CRON_SEGMENTS[segmentCursor];if(!seg)return;patch({schedule:setSegment(draft.schedule,segmentCursor,stepSegment(seg,segmentValues[segmentCursor]??"*",-1))})}}]:[],...field==="confirm"?[{key:"return",cmd:()=>commit()}]:[]]})),$jsxs("box",{paddingLeft:padX,paddingRight:padX,gap:1,children:[$jsx(DialogHeader,{title:t3("automations.newTitle"),onClose:()=>cancel()}),$jsx(DialogSection,{label:t3("automations.fieldName"),focused:field==="name",onPress:()=>setField("name"),children:$jsx(DialogField,{focused:field==="name",children:$jsx("input",{value:draft.name,placeholder:t3("automations.namePlaceholder"),focused:field==="name",onMouseUp:()=>setField("name"),onInput:(v3)=>patch({name:v3}),onSubmit:()=>setField(nextComposerField("name"))})})}),$jsx(DialogSection,{label:t3("automations.fieldRepo"),focused:field==="repo",hint:props.repos.length===0?void 0:"\u2191/\u2193",onPress:()=>setField("repo"),children:props.repos.length===0?$jsx("text",{fg:theme.textMuted,children:t3("automations.needRepo")}):$jsx(DialogField,{focused:field==="repo",children:$jsx(PickerList,{window:repoWindow,cursor:repoCursor,rows:repoRows,onPick:pickRepoAt})})}),$jsx(DialogSection,{label:t3("automations.fieldPrompt"),focused:field==="prompt",onPress:()=>setField("prompt"),children:$jsx(DialogField,{focused:field==="prompt",children:$jsx("input",{value:draft.prompt,placeholder:t3("automations.promptPlaceholder"),focused:field==="prompt",onMouseUp:()=>setField("prompt"),onInput:(v3)=>patch({prompt:v3}),onSubmit:()=>setField(nextComposerField("prompt"))})})}),$jsx(DialogSection,{label:t3("automations.fieldSchedule"),focused:field==="schedule",hint:"\u2190/\u2192 \u2191/\u2193",onPress:()=>setField("schedule"),children:$jsxs(DialogField,{focused:field==="schedule",children:[$jsx("box",{flexDirection:"row",gap:2,children:CRON_SEGMENTS.map((segment,index)=>{let activeCell=field==="schedule"&&index===segmentCursor;return $jsxs("box",{flexDirection:"column",onMouseUp:()=>selectSegment(index),children:[$jsx("text",{fg:activeCell?theme.primary:theme.text,attributes:activeCell?TextAttributes13.BOLD|TextAttributes13.UNDERLINE:void 0,wrapMode:"none",children:segmentValues[index]??"*"}),$jsx("text",{fg:activeCell?theme.textMuted:theme.borderSubtle,wrapMode:"none",children:t3(`automations.cronField.${segment}`)})]},segment)})}),preview.kind==="ok"?$jsx("text",{fg:theme.success,wrapMode:"none",children:`${describeCron(draft.schedule)??""}${describeCron(draft.schedule)?" \xB7 ":""}${preview.relative} \xB7 ${preview.absolute}`}):$jsx("text",{fg:theme.error,wrapMode:"none",children:preview.kind==="never"?t3("automations.cronNever"):t3("automations.cronInvalid")})]})}),error?$jsxs("text",{fg:theme.error,wrapMode:"word",children:["\u203B ",error]}):null,$jsx(DialogFooter,{children:t3("automations.composerLegend")}),$jsx(DialogActions,{label:t3("common.create"),focused:field==="confirm",onPress:()=>commit()})]})}var import_react68,AutomationComposer;var init_automation_composer_dialog=__esm(async()=>{init_automation_composer();init_cron_segments();init_state();init_groups();init_i18n2();init_jsx_runtime();await __promiseAll([init_theme(),init_keymap(),init_dialog(),init_dialog_parts(),init_picker_list()]);import_react68=__toESM(require_react_production(),1);AutomationComposer={show(dialog,opts){return showDialog(dialog,(resolve17)=>$jsx(AutomationComposerView,{repos:opts.repos,...opts.defaultRepo?{defaultRepo:opts.defaultRepo}:{},onSubmit:(draft)=>resolve17(draft),onCancel:()=>resolve17(void 0)}))}}});import{TextAttributes as TextAttributes14}from"@opentui/core";function formatWhen(iso,now){if(!iso)return"\u2014";let at2=Date.parse(iso);if(!Number.isFinite(at2))return"\u2014";let deltaMs=at2-now,{minutes,hours}=relativeBuckets(Math.abs(deltaMs));if(minutes<1)return deltaMs>=0?"now":"just now";if(minutes<60)return deltaMs>=0?`in ${minutes}m`:`${minutes}m ago`;if(hours<24)return deltaMs>=0?`in ${hours}h`:`${hours}h ago`;return new Date(at2).toLocaleDateString()}function repoLabel(repo){return repo.split("/").filter(Boolean).pop()??repo}function AutomationsPage(props){let{theme}=useTheme(),dialog=useDialog(),t3=useT(),dims=useTerminalDimensions(),notif=useNotifications();function notifyError(message){notif.notify({kind:"error",taskId:"",tabId:"",title:message})}let[automations,setAutomations]=import_react70.useState(null),[keepsDaemonAlive,setKeepsDaemonAlive]=import_react70.useState(!1),[runs,setRuns]=import_react70.useState([]),[reloadTick,setReloadTick]=import_react70.useState(0),[busyId,setBusyId]=import_react70.useState(null),[notice,setNotice]=import_react70.useState(null),refetch=()=>setReloadTick((tick)=>tick+1);import_react70.useEffect(()=>{let disposed=!1,orch=props.orchestrator;if(!orch){setAutomations([]);return}let load=()=>{orch.listAutomations().then((result)=>{if(disposed)return;setAutomations(result.automations),setKeepsDaemonAlive(result.keepsDaemonAlive)}).catch(()=>{if(!disposed)setAutomations((prev)=>prev??[])})};load();let timer=setInterval(load,POLL_MS2);return()=>{disposed=!0,clearInterval(timer)}},[props.orchestrator,reloadTick]);let rows=automations??[],[cursor,setCursor]=import_react70.useState(0);import_react70.useEffect(()=>{setCursor((c2)=>clampCursor(c2,rows.length))},[rows.length]);let selected=rows[cursor];import_react70.useEffect(()=>{let disposed=!1,orch=props.orchestrator;if(!orch||!selected){setRuns([]);return}return orch.automationRuns(selected.id).then((result)=>{if(!disposed)setRuns(result.runs)}).catch(()=>{if(!disposed)setRuns([])}),()=>{disposed=!0}},[props.orchestrator,selected,reloadTick]);async function toggleEnabled(){let orch=props.orchestrator;if(!orch||!selected||busyId)return;setBusyId(selected.id);try{await orch.setAutomationEnabled(selected.id,!selected.enabled),refetch()}catch(err){console.error("[rove automations] toggle failed:",err),notifyError(t3("automations.failed",{error:errorMessage(err)}))}finally{setBusyId(null)}}async function runNow(){let orch=props.orchestrator;if(!orch||!selected||busyId)return;setBusyId(selected.id),setNotice(t3("automations.running",{name:selected.name}));try{let result=await orch.runAutomationNow(selected.id);setNotice(t3("automations.ranWith",{name:selected.name,status:result.status})),refetch()}catch(err){console.error("[rove automations] run now failed:",err),notifyError(t3("automations.failed",{error:errorMessage(err)}))}finally{setBusyId(null)}}async function createAutomation(){let orch=props.orchestrator;if(!orch||busyId)return;let repos=[...new Set(orch.listTasks().map((task)=>task.repo))].filter(Boolean);if(repos.length===0){setNotice(t3("automations.needRepo"));return}let draft=await AutomationComposer.show(dialog,{repos,...props.focusRepo?{defaultRepo:props.focusRepo}:{}});if(!draft)return;setBusyId("new");try{await orch.createAutomation(draft),refetch()}catch(err){console.error("[rove automations] create failed:",err),notifyError(t3("automations.failed",{error:errorMessage(err)}))}finally{setBusyId(null)}}async function requestDelete(){let orch=props.orchestrator;if(!orch||!selected||busyId)return;if(await DialogConfirm.show(dialog,t3("automations.deleteTitle"),t3("automations.deleteBody",{name:selected.name}),t3("common.cancel"),t3("automations.deleteButton"),{danger:!0})!==!0)return;setBusyId(selected.id);try{await orch.deleteAutomation(selected.id),refetch()}catch(err){console.error("[rove automations] delete failed:",err),notifyError(t3("automations.failed",{error:errorMessage(err)}))}finally{setBusyId(null)}}useBindings(()=>({enabled:props.focused!==!1,bindings:[...pageCloseBindings(props.onClose),{key:"j",cmd:()=>setCursor((c2)=>clampCursor(c2+1,rows.length))},{key:"down",cmd:()=>setCursor((c2)=>clampCursor(c2+1,rows.length))},{key:"k",cmd:()=>setCursor((c2)=>clampCursor(c2-1,rows.length))},{key:"up",cmd:()=>setCursor((c2)=>clampCursor(c2-1,rows.length))},{key:"n",cmd:()=>void createAutomation()},{key:"r",cmd:()=>refetch()},{key:"e",cmd:()=>void toggleEnabled()},{key:"s",cmd:()=>void runNow()},{key:"d",cmd:()=>void requestDelete()},{key:"return",cmd:()=>{let taskId=runs.find((run3)=>run3.taskId)?.taskId;if(taskId)props.onOpenTask?.(taskId)}}]}));let now=Date.now();return $jsxs("box",{flexDirection:"column",flexGrow:1,paddingTop:1,paddingLeft:2,paddingRight:2,children:[$jsxs("box",{flexDirection:"row",gap:1,flexShrink:0,children:[$jsx("text",{attributes:TextAttributes14.BOLD,fg:theme.text,wrapMode:"none",flexShrink:0,children:t3("automations.title")}),$jsx("text",{fg:theme.borderSubtle,wrapMode:"none",flexBasis:0,flexGrow:1,flexShrink:1,children:dividerRule(dims.width)}),$jsx("text",{fg:keepsDaemonAlive?theme.success:theme.textMuted,wrapMode:"none",flexShrink:0,children:keepsDaemonAlive?t3("automations.holdingDaemon"):t3("automations.notHolding")})]}),automations===null?$jsx("box",{paddingTop:1,children:$jsx("text",{fg:theme.textMuted,children:t3("common.loading")})}):rows.length===0?$jsxs("box",{flexDirection:"column",paddingTop:1,gap:1,children:[$jsx("text",{fg:theme.textMuted,children:t3("automations.empty")}),$jsx("text",{fg:theme.text,children:t3("automations.emptyHint")})]}):$jsx("box",{flexDirection:"column",marginTop:1,flexGrow:1,gap:0,children:rows.map((automation,index)=>{let isCursor=index===cursor;return $jsxs("box",{flexDirection:"row",flexShrink:0,...FRAME,borderColor:isCursor?theme.borderActive:theme.borderSubtle,paddingLeft:1,paddingRight:1,gap:1,...isCursor?{backgroundColor:theme.backgroundElement}:{},children:[$jsx("text",{fg:automation.enabled?theme.text:theme.textMuted,attributes:isCursor?TextAttributes14.BOLD:void 0,wrapMode:"none",flexShrink:1,children:automation.name}),$jsx("text",{fg:theme.borderSubtle,wrapMode:"none",flexBasis:0,flexGrow:1,flexShrink:1,children:dividerRule(dims.width)}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:1,children:`${repoLabel(automation.repo)} \xB7 ${automation.schedule}`}),automation.enabled?null:$jsx("text",{fg:theme.warning,wrapMode:"none",flexShrink:0,children:`${t3("automations.paused")} \xB7`}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:formatWhen(automation.nextRunAt,now)})]},automation.id)})}),$jsx("box",{flexDirection:"column",marginTop:1,...FRAME,borderColor:theme.border,padding:1,flexShrink:0,children:selected?$jsxs($Fragment2,{children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",gap:2,children:[$jsx("text",{fg:theme.text,wrapMode:"none",flexShrink:1,flexGrow:1,children:selected.prompt}),$jsx("text",{fg:busyId===selected.id?theme.textMuted:theme.primary,attributes:TextAttributes14.BOLD,wrapMode:"none",flexShrink:0,onMouseUp:()=>void runNow(),children:t3("automations.runNow")})]}),selected.precheck?$jsx("text",{fg:theme.textMuted,children:t3("automations.precheck",{command:selected.precheck.command})}):null,$jsx("text",{attributes:TextAttributes14.BOLD,fg:theme.text,children:t3("automations.recentRuns")}),runs.length===0?$jsx("text",{fg:theme.textMuted,children:t3("automations.noRuns")}):runs.slice(0,5).map((run3)=>{let tone=RUN_TONE[run3.status]??"muted",color=tone==="success"?theme.success:tone==="warning"?theme.warning:tone==="error"?theme.error:theme.textMuted;return $jsx("text",{fg:color,children:`#${run3.runNumber} ${run3.status}${run3.error?` \u2014 ${run3.error}`:""} ${formatWhen(run3.at,now)}`},run3.id)})]}):$jsx("text",{fg:theme.textMuted,children:t3("automations.noSelection")})}),notice?$jsx("text",{fg:theme.textMuted,children:notice}):null]})}var import_react70,POLL_MS2=5000,RUN_TONE;var init_automations_page=__esm(async()=>{init_state();init_notifications();init_i18n2();init_frame();init_jsx_runtime();await __promiseAll([init_react(),init_theme(),init_keymap(),init_dialog(),init_dialog_confirm(),init_automation_composer_dialog()]);import_react70=__toESM(require_react_production(),1),RUN_TONE={dispatched:"success",skipped_precheck:"muted",skipped_missed:"warning",skipped_unavailable:"warning",dispatch_failed:"error"}});function statusDisposition(status){return DISPOSITIONS[status]??"parked"}var DISPOSITIONS;var init_status_disposition=__esm(()=>{DISPOSITIONS={backlog:"active",in_progress:"active",in_review:"parked",error:"parked",done:"terminal",canceled:"terminal",open:"active",doing:"active",hold:"parked"}});function moveBoardSelection(columns,currentId,dir){let firstVisible=columns.find((column)=>column.issues.length>0)?.issues[0]?.id??null;if(currentId==null)return firstVisible;let col=-1,row=-1;for(let[c2,column]of columns.entries()){let r6=column.issues.findIndex((issue)=>issue.id===currentId);if(r6!==-1){col=c2,row=r6;break}}if(col===-1)return firstVisible;if(dir==="up"||dir==="down"){let column=columns[col]?.issues??[],next=dir==="up"?row-1:row+1;return column[Math.max(0,Math.min(next,column.length-1))]?.id??currentId}let step=dir==="left"?-1:1;for(let c2=col+step;c2>=0&&c2<columns.length;c2+=step){let column=columns[c2]?.issues??[];if(column.length===0)continue;return column[Math.min(row,column.length-1)]?.id??currentId}return currentId}function issueColumnKey(issue,taskExists){let disposition=statusDisposition(issue.status);if(disposition==="terminal")return"done";if(disposition==="parked")return"parked";if(issue.taskId!==void 0&&issue.taskId!==""&&(taskExists?.(issue.taskId)??!0))return"in_progress";return"backlog"}function isBoardAttentionState(state){return state!==void 0&&BOARD_ATTENTION_STATES.includes(state)}function applyBoardAttention(columns,stateOf){let attentionCount=0;return{columns:columns.map((col)=>{if(col.key!=="in_progress")return col;let attention=[],rest=[];for(let issue of col.issues)if(issue.taskId!==void 0&&issue.taskId!==""&&isBoardAttentionState(stateOf(issue.taskId)))attention.push(issue);else rest.push(issue);return attentionCount=attention.length,attention.length===0?col:{...col,issues:[...attention,...rest]}}),attentionCount}}function compareIssues(a2,b3){if(a2.created!==b3.created)return a2.created<b3.created?1:-1;return b3.id-a2.id}function buildIssueBoard(issues,taskExists){let buckets={backlog:[],in_progress:[],parked:[],done:[]};for(let issue of issues)buckets[issueColumnKey(issue,taskExists)].push(issue);return BOARD_COLUMN_ORDER.map((key)=>{let capped=key==="done"||key==="parked",sorted2=buckets[key].sort(compareIssues);if(!capped||sorted2.length<=COLUMN_CAP)return{key,issues:sorted2,hiddenCount:0};return{key,issues:sorted2.slice(0,COLUMN_CAP),hiddenCount:sorted2.length-COLUMN_CAP}})}var BOARD_COLUMN_ORDER,COLUMN_CAP=20,BOARD_ATTENTION_STATES;var init_issue_board=__esm(()=>{init_status_disposition();BOARD_COLUMN_ORDER=["backlog","in_progress","parked","done"];BOARD_ATTENTION_STATES=["permission_needed","rate_limited","error"]});function quickForkComposerOptions(repo,engines,defaultVendor,branchFrom=repo){return{repoLabel:repoBasename(repo),engines,defaultVendor,defaultBaseRef:getCurrentBranch(branchFrom)??getCurrentBranch(repo)??DEFAULT_BASE_REF,engineLabel:engineDisplayName}}function quickForkDefaultVendor(repo,detected){let pref=resolvePreferredVendor(repo);if(detected.length===0||detected.includes(pref))return pref;return detected[0]??pref}async function createQuickForkTask(orch,repo,baseRef,vendor){return setRepoLastActiveVendor(repo,vendor),addSavedRepo(repo),orch.createTask({repo,baseRef,vendor})}async function runQuickFork(orch,repo,result,hooks){try{let task=await createQuickForkTask(orch,repo,result.baseRef,result.vendor);return hooks.selectTask(task.id),await hooks.enterTask(task.id),task.id}catch(err){console.error("[rove workspace] quick-fork task.create failed:",err),hooks.notifyError(`Couldn't fork task: ${errorMessage(err)}`);return}}async function runAgainTask(orch,task,hooks){let prompt=task.prompt;if(prompt===void 0)return;let baseRef=task.baseRef??getCurrentBranch(task.worktreePath||task.repo)??DEFAULT_BASE_REF,vendor=task.vendor??DEFAULT_TASK_VENDOR,taskId=await runQuickFork(orch,task.repo,{baseRef,vendor},hooks);if(taskId===void 0)return;return await orch.setPrompt(taskId,prompt).catch(()=>{return}),taskId}function useQuickFork(orch,hooks){let[pending,setPending]=import_react71.useState(null);async function onQuickFork(repo,result){let taskId=await runQuickFork(orch,repo,result,hooks);if(taskId)setPending({taskId,prompt:appendAttachmentRefs(result.prompt,result.attachments)})}async function onRunAgain(task){let taskId=await runAgainTask(orch,task,hooks);if(taskId&&task.prompt!==void 0)setPending({taskId,prompt:task.prompt})}function initialPromptFor(taskId){return taskId&&pending?.taskId===taskId?pending.prompt:void 0}return{onQuickFork:(repo,result)=>void onQuickFork(repo,result),initialPromptFor,runAgain:(task)=>void onRunAgain(task)}}var import_react71;var init_quick_fork=__esm(()=>{init_interactive_command();init_repos();init_vendor_prefs();init_attachments();init_git_snapshot();init_groups();init_task();import_react71=__toESM(require_react_production(),1)});function promptHeader(issue){let lines=[`Work on user story #${issue.id}: ${issue.title}`,""],body=issue.body.trim();if(body)lines.push(body,"");return lines}function issueWorktreePrompt(issue,api,product){return[...promptHeader(issue),`Treat this as the story's dedicated ${product} task session: work only in this task worktree, and preserve any repo init instructions already delivered to the session.`,"Before finishing, verify the acceptance criteria implied by the story and summarize what changed plus any verification still needed.","Then merge the task branch back into the current project's main branch after the worktree is clean and checks pass.",`When the work lands, run: ${api} issue-set-status --repo . --id ${issue.id} --status done`].join(`
729
+ `))count++;return count}function parseNumstat(raw){return parseNumstatRows(raw).map((r6)=>({path:r6.path,added:r6.added,deleted:r6.deleted}))}function parseStatusEntries(raw){let out=[];for(let row of parsePorcelainRows(raw)){let status;if(row.x==="?"&&row.y==="?")status="?";else{let candidate=row.y!==" "?row.y:row.x;if(candidate==="M"||candidate==="A"||candidate==="D"||candidate==="R"||candidate==="C"||candidate==="U"||candidate==="T")status=candidate;else continue}let path22=row.path;if(path22.length===0)continue;if(path22.endsWith("/")&&status!=="?")continue;out.push({path:path22,status})}return out}var init_git2=__esm(()=>{init_git_parsers();init_content()});function tabLabelKey(tab){switch(tab){case"all":return"files.tabs.all";case"changes":return"files.tabs.changes"}}function fileTreeBindings(opts){return bindByIds({"files.nav":(_evt,slot)=>{if((slot??0)%2===0)opts.moveDown();else opts.moveUp()},"files.hierarchy":(_evt,slot)=>{if((slot??0)%2===0)opts.collapseOrParent();else opts.expandOrDescend()},"files.tab":(_evt,slot)=>{let cur=opts.currentTab(),idx=TAB_ORDER.indexOf(cur);if(idx<0)return;let delta=(slot??0)%2===0?-1:1,next=TAB_ORDER[(idx+delta+TAB_ORDER.length)%TAB_ORDER.length];if(next)opts.setTab(next)},"files.open":()=>opts.openCurrent(),"files.mention":()=>opts.mentionCurrent?.(),"files.openExternal":()=>opts.openExternal(),"files.refresh":()=>opts.refresh(),"files.scope":()=>opts.toggleScope?.(),"files.diff":()=>opts.openDiff?.()})}var TAB_ORDER;var init_keys_core=__esm(()=>{init_keybindings();TAB_ORDER=["all","changes"]});import{spawn as spawn11}from"child_process";import{existsSync as existsSync33}from"fs";import{platform as platform2}from"os";function openExternally(absPath){if(!absPath)return;let plat=platform2();if(plat==="linux"){if(existsSync33("/proc/sys/fs/binfmt_misc/WSLInterop")||process.env.WSL_DISTRO_NAME){spawnDetachedWithFallback("wslview",[absPath],()=>{let child=spawn11("wslpath",["-w",absPath],{stdio:["ignore","pipe","ignore"]}),out="";child.stdout?.on("data",(b3)=>{out+=b3.toString()}),child.on("close",(code)=>{if(code===0)spawnDetachedWithFallback("explorer.exe",[out.trim()])})});return}spawnDetachedWithFallback("xdg-open",[absPath]);return}if(plat==="darwin"){spawnDetachedWithFallback("open",[absPath]);return}if(plat==="win32"){spawnDetachedWithFallback("cmd.exe",["/c","start","",absPath]);return}}function spawnDetachedWithFallback(cmd,args2,onError){spawnDetached(cmd,args2,{onError:onError?()=>onError():void 0})}var init_open_external2=__esm(()=>{init_spawn_detached()});import{watch}from"fs";function statusToken(s2){switch(s2){case"M":return"warning";case"A":return"success";case"D":return"error";case"?":return"textMuted";case"R":case"C":case"U":case"T":return"info"}}function summarizeGitError(raw,t3){let m3=raw.toLowerCase();if(m3.includes("not a git repository"))return t3("files.error.notGitRepo");if(m3.includes("does not exist")||m3.includes("enoent"))return t3("files.error.pathMissing");if(m3.includes("permission denied")||m3.includes("eacces"))return t3("files.error.permissionDenied");if(m3.includes("git: not found")||m3.includes("command not found"))return t3("files.error.gitNotInstalled");let colon=raw.indexOf(": ");if(colon>=0&&raw.startsWith("git "))return raw.slice(colon+2).trim()||t3("files.error.gitFailed");return raw.trim()||t3("files.error.gitFailed")}function computeStatWidths(rows){let added=0,deleted=0;for(let row of rows){if(row.kind!=="status")continue;if(row.added!=null)added=Math.max(added,String(row.added).length+1);if(row.deleted!=null)deleted=Math.max(deleted,String(row.deleted).length+1)}return{added,deleted}}function computePathBudget(paneWidth,w4){let stats=(w4.added>0?w4.added+1:0)+(w4.deleted>0?w4.deleted+1:0);return Math.max(8,paneWidth-6-stats)}function statCell(value,width,sign){let glyph=sign==="-"?"\u2212":sign;return value==null?" ".repeat(width):`${glyph}${value}`.padStart(width)}function toggleDir(expanded,path22){let next=new Set(expanded);if(next.has(path22))next.delete(path22);else next.add(path22);return next}function expandOrDescendAction(rows,cursorIndex){let row=rows[cursorIndex];if(!row)return null;if(row.kind==="status"){if(row.fileCount==null)return null;if(!row.expanded)return{type:"expand",path:row.path};return cursorIndex+1<rows.length?{type:"cursor",index:cursorIndex+1}:null}if(row.kind!=="dir")return null;if(!row.expanded&&row.hasChildren)return{type:"expand",path:row.path};if(row.expanded&&cursorIndex+1<rows.length)return{type:"cursor",index:cursorIndex+1};return null}function collapseOrParentAction(rows,cursorIndex){let row=rows[cursorIndex];if(!row)return null;if(row.kind==="dir"&&row.expanded)return{type:"collapse",path:row.path};if(row.kind==="status")return row.fileCount!=null&&row.expanded?{type:"collapse",path:row.path}:null;if(row.kind!=="dir"&&row.kind!=="file")return null;let targetDepth=row.depth-1;if(targetDepth<0)return null;for(let j2=cursorIndex-1;j2>=0;j2--){let candidate=rows[j2];if(!candidate)continue;if(candidate.kind==="dir"&&candidate.depth===targetDepth)return{type:"cursor",index:j2}}return null}function followScrollTop(scrollTop,viewportHeight,cursorIndex){if(viewportHeight<=0)return null;if(cursorIndex<scrollTop)return cursorIndex;if(cursorIndex>=scrollTop+viewportHeight)return cursorIndex-viewportHeight+1;return null}function watchEventRelevant(filename){if(filename===".git"||filename.startsWith(".git/")||filename.startsWith(".git\\"))return!1;if(filename.startsWith("node_modules/")||filename.startsWith("node_modules\\"))return!1;return!0}function watchWorktree(path22,onChange,debounceMs=500){let debounceTimer=null,watcher=null;try{watcher=watch(path22,{recursive:!0},(_event,filename)=>{if(filename==null)return;if(!watchEventRelevant(filename.toString()))return;if(debounceTimer!=null)clearTimeout(debounceTimer);debounceTimer=setTimeout(()=>{debounceTimer=null,onChange()},debounceMs)}),watcher.on("error",()=>{})}catch{}return()=>{if(debounceTimer!=null)clearTimeout(debounceTimer);if(watcher!=null)watcher.close()}}var init_pane_core=()=>{};function reconcileStableRows(prev,next,keyOf2,equals,opts={}){if(prev.length===0)return next;let prevByKey=new Map;for(let row of prev)prevByKey.set(keyOf2(row),row);let allReused=prev.length===next.length,out=Array(next.length);for(let i2=0;i2<next.length;i2++){let fresh=next[i2],old=prevByKey.get(keyOf2(fresh));if(old&&equals(old,fresh)&&(!opts.samePosition||prev[i2]===old)){if(out[i2]=old,allReused&&prev[i2]!==old)allReused=!1}else out[i2]=fresh,allReused=!1}return allReused?prev:out}function flattenTree(node,expanded,depth2,out){for(let child of node.children)if(child.isDir){let isOpen=expanded.has(child.path);if(out.push({kind:"dir",path:child.path,name:child.name,depth:depth2,expanded:isOpen,hasChildren:child.children.length>0}),isOpen)flattenTree(child,expanded,depth2+1,out)}else out.push({kind:"file",path:child.path,name:child.name,depth:depth2})}function truncatePathTail(path22,maxCells){return truncateStartCells(path22,maxCells,charWidth)}function statusRows(entries,expanded=NO_EXPANSION){let out=[];for(let e2 of entries){if(e2.children==null){out.push({kind:"status",path:e2.path,status:e2.status,added:e2.added,deleted:e2.deleted});continue}let isOpen=expanded.has(e2.path);if(out.push({kind:"status",path:e2.path,status:e2.status,added:e2.added,deleted:e2.deleted,fileCount:e2.children.length,expanded:isOpen}),isOpen)for(let c2 of e2.children)out.push({kind:"status",path:c2.path,status:c2.status,added:c2.added,deleted:c2.deleted,child:!0})}return out}function rowKey(row){return`${row.kind}\x00${row.path}`}function rowEquals(a2,b3){if(a2.kind!==b3.kind||a2.path!==b3.path)return!1;switch(a2.kind){case"file":{let o2=b3;return a2.name===o2.name&&a2.depth===o2.depth}case"dir":{let o2=b3;return a2.name===o2.name&&a2.depth===o2.depth&&a2.expanded===o2.expanded&&a2.hasChildren===o2.hasChildren}case"status":{let o2=b3;return a2.status===o2.status&&a2.added===o2.added&&a2.deleted===o2.deleted&&a2.fileCount===o2.fileCount&&a2.expanded===o2.expanded&&a2.child===o2.child}}}function reconcileRows(prev,next){return reconcileStableRows(prev,next,rowKey,rowEquals)}function sameFileList(a2,b3){if(a2===b3)return!0;if(a2==null||b3==null)return!1;if(a2.length!==b3.length)return!1;for(let i2=0;i2<a2.length;i2++)if(a2[i2]!==b3[i2])return!1;return!0}function sameStatusEntries(a2,b3){if(a2===b3)return!0;if(a2==null||b3==null)return!1;if(a2.length!==b3.length)return!1;for(let i2=0;i2<a2.length;i2++){let x2=a2[i2],y3=b3[i2];if(x2.path!==y3.path||x2.status!==y3.status||x2.added!==y3.added||x2.deleted!==y3.deleted)return!1;let xc=x2.children,yc=y3.children;if(xc==null!==(yc==null))return!1;if(xc&&yc){if(xc.length!==yc.length)return!1;for(let j2=0;j2<xc.length;j2++){let cx=xc[j2],cy=yc[j2];if(cx.path!==cy.path||cx.status!==cy.status||cx.added!==cy.added||cx.deleted!==cy.deleted)return!1}}}return!0}var NO_EXPANSION;var init_rows=__esm(()=>{NO_EXPANSION=new Set});function buildTree(paths){let root={name:"",path:"",isDir:!0,children:[]};for(let p3 of paths){if(!p3)continue;let segs=p3.split("/").filter((s2)=>s2.length>0);if(segs.length===0)continue;let cur=root;for(let i2=0;i2<segs.length;i2++){let seg=segs[i2],isDir=i2!==segs.length-1,child=cur.children.find((c2)=>c2.name===seg&&c2.isDir===isDir);if(!child)child={name:seg,path:segs.slice(0,i2+1).join("/"),isDir,children:[]},cur.children.push(child);cur=child}}return sortTree(root),root}function sortTree(node){node.children.sort((a2,b3)=>{if(a2.isDir!==b3.isDir)return a2.isDir?-1:1;return a2.name.localeCompare(b3.name)});for(let c2 of node.children)sortTree(c2)}function capOf(row){return row.hint?.keys??row.keys[0]}function legendCap(id){let row=findBinding(id);if(!row)return null;let cap=capOf(row);return cap&&cap.length>0?cap:null}function directCap(row){if(row.keys.length>0)return row.hint?.keys??row.keys[0]??null;return row.prefixKeys?.length?null:row.hint?.keys??null}function availableOn(row,surface){if(row.scope==="global")return!0;if(surface===null)return!1;if(row.scope===surface)return!0;return surface==="terminal"&&row.scope==="workspace"}function grammarHelpSections(keymap,surface,prefixKey,reachability){let here=[],direct=[],prefix=[],other=new Map;for(let binding of keymap){let cap=directCap(binding),staticallyAvailable=availableOn(binding,surface),directAvailable=reachability?reachability.direct.has(binding.id):staticallyAvailable,prefixAvailable=reachability?reachability.prefix.has(binding.id):staticallyAvailable;if(cap){let row={binding,primary:cap,aliases:binding.keys.filter((key)=>key!==cap)},docOnlyHere=binding.keys.length===0&&!binding.prefixKeys?.length&&staticallyAvailable;if(directAvailable&&(staticallyAvailable||binding.presentation==="onePress")||docOnlyHere)if(binding.presentation==="onePress")direct.push(row);else here.push(row);else if(!staticallyAvailable&&binding.scope!=="global"){let rows=other.get(binding.scope);if(rows)rows.push(row);else other.set(binding.scope,[row])}}if(prefixKey&&prefixAvailable&&binding.prefixKeys?.length)prefix.push({binding,primary:`${prefixKey} + ${binding.prefixKeys[0]}`,aliases:binding.prefixKeys.slice(1).map((key)=>`${prefixKey} + ${key}`)})}let sections=[];if(here.length)sections.push({kind:"here",scope:surface??void 0,rows:here});if(direct.length)sections.push({kind:"direct",rows:direct});if(prefix.length)sections.push({kind:"prefix",rows:prefix});for(let[scope,rows]of other)sections.push({kind:"other",scope,rows});return sections}var init_help_groups=__esm(()=>{init_keybindings()});function keyHintsEnabled(raw){return raw!==!1}function keyHintsToggleOn(kv){return keyHintsEnabled(kv.get(KEY_HINTS_ENABLED_KEY,!0))}function toggleKeyHints(kv){let next=!keyHintsToggleOn(kv);if(kv.set(KEY_HINTS_ENABLED_KEY,next),next)for(let key of Object.values(PANE_HINT_USED_KEYS))kv.set(key,!1)}function paneHintVisible(enabledRaw,usedRaw){return keyHintsEnabled(enabledRaw)&&usedRaw!==!0}function statusHintTokens(reach,prefixKey){let tokens=[];if(prefixKey!==null&&reach.prefix.size>0)tokens.push({chord:prefixKey,msg:"commands"});else if(reach.inputPassthrough){let cap=reach.direct.has("focus.sidebar")?legendCap("focus.sidebar"):null;if(cap)tokens.push({chord:cap,msg:"sidebar"})}if(reach.direct.has("help.open")){let cap=legendCap("help.open");if(cap)tokens.push({chord:cap,msg:"help"})}return tokens}function paneHintTokens(pane,mode){return PANE_HINT_ROWS[pane].flatMap((row)=>{if(mode==="always"&&row.always!==!0)return[];let cap=legendCap(row.id);return cap?[{cap,msg:row.msg}]:[]})}function wizardKeyLines(prefixKey){let lines=[],nav=legendCap("sidebar.nav"),open2=legendCap("sidebar.select");if(nav&&open2)lines.push({msg:"keysBare",params:{nav:formatChord(nav),open:formatChord(open2)}});let newTab=legendCap("chat.tab.new"),focusNext=legendCap("focus.next");if(newTab&&focusNext)lines.push({msg:"keysOnePress",params:{newTab:formatChord(newTab),focusNext:formatChord(focusNext)}});if(prefixKey!==null)lines.push({msg:"keysPrefix",params:{prefix:formatChord(prefixKey)}});let help=legendCap("help.open");if(help)lines.push({msg:"keysHelp",params:{help:formatChord(help)}});return lines}var KEY_HINTS_ENABLED_KEY="hints.keyboard.enabled",PANE_HINT_USED_KEYS,PANE_HINT_ROWS;var init_keyboard_hints=__esm(()=>{init_chord_glyphs();init_help_groups();PANE_HINT_USED_KEYS={sidebar:"hints.sidebar.used",files:"hints.files.used"};PANE_HINT_ROWS={sidebar:[{id:"sidebar.nav",msg:"move"},{id:"sidebar.select",msg:"open"}],files:[{id:"files.nav",msg:"move"},{id:"files.hierarchy",msg:"collapse"},{id:"files.open",msg:"open",always:!0},{id:"files.diff",msg:"diff",always:!0}]}});import{TextAttributes as TextAttributes9}from"@opentui/core";function scopeCategory(scope){if(!scope)return"Global";if(scope==="sidebar")return"Sidebar";if(scope==="workspace")return"Workspace";if(scope==="files")return"Files";if(scope==="terminal")return"Terminal";return"Dialog"}function displayCap(cap){return cap.split(" + ").map((part)=>formatChord(part)).join(" + ")}function sectionTitle(section,t3){if(section.kind==="here")return t3("help.here",{surface:tKeys("category",scopeCategory(section.scope))});if(section.kind==="direct")return t3("help.direct");if(section.kind==="prefix")return t3("help.afterPrefix");return t3("help.otherPane",{surface:tKeys("category",scopeCategory(section.scope))})}function HelpDialog(props){let dialog=useDialog(),{theme}=useTheme(),t3=useT(),padX=useDialogPaddingX(),keymapVersion2=useKeymapVersion(),pureTuiPrefix=currentPrefixConfiguration(),sections=import_react60.useMemo(()=>grammarHelpSections(KobeKeymap,props.currentScope??null,pureTuiPrefix.key,props.reachability),[keymapVersion2,props.currentScope,props.reachability,pureTuiPrefix.key]),close=()=>props.onClose?props.onClose():dialog.clear(),scrollRef=import_react60.useRef(null),scrollBy=(lines)=>{let scroll=scrollRef.current;if(!scroll)return;scroll.scrollTo({x:0,y:Math.max(0,scroll.scrollTop+lines)})},scrollToEdge=(edge)=>{let scroll=scrollRef.current;if(!scroll)return;scroll.scrollTo({x:0,y:edge==="top"?0:Number.MAX_SAFE_INTEGER})};return useBindings(()=>({bindings:[{key:"?",cmd:close},{key:"up",cmd:()=>scrollBy(-1)},{key:"down",cmd:()=>scrollBy(1)},{key:"pageup",cmd:()=>scrollBy(-(scrollRef.current?.viewport.height??10))},{key:"pagedown",cmd:()=>scrollBy(scrollRef.current?.viewport.height??10)},{key:"home",cmd:()=>scrollToEdge("top")},{key:"end",cmd:()=>scrollToEdge("bottom")}]})),$jsxs("box",{paddingLeft:padX,paddingRight:padX,gap:1,flexShrink:1,children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",flexShrink:0,children:[$jsxs("box",{flexDirection:"column",gap:0,children:[$jsx("text",{attributes:TextAttributes9.BOLD,fg:theme.text,children:t3("help.title")}),$jsx("text",{fg:theme.textMuted,children:props.currentScope?t3("help.focused",{surface:tKeys("category",scopeCategory(props.currentScope))}):t3("help.allBindings")}),$jsx("text",{fg:theme.textMuted,children:t3("help.grammar",{prefix:pureTuiPrefix.key?formatChord(pureTuiPrefix.key):t3("help.disabled")})})]}),$jsx("text",{fg:theme.textMuted,onMouseUp:close,children:t3("help.esc")})]}),$jsx("scrollbox",{ref:(r6)=>{scrollRef.current=r6},flexShrink:1,flexGrow:1,stickyScroll:!1,verticalScrollbarOptions:{trackOptions:{backgroundColor:theme.backgroundDialog,foregroundColor:theme.borderActive}},children:$jsx("box",{paddingBottom:1,gap:1,paddingRight:1,children:sections.map((section,sectionIndex)=>$jsxs("box",{gap:0,children:[$jsx("text",{fg:theme.accent,attributes:TextAttributes9.BOLD,children:sectionTitle(section,t3)}),section.rows.map((row)=>{return $jsxs("box",{flexDirection:"row",gap:2,paddingLeft:1,children:[$jsx("box",{width:18,children:$jsx("text",{fg:theme.primary,children:displayCap(row.primary)})}),$jsx("box",{flexGrow:1,children:$jsx("text",{fg:theme.text,children:tKeys("desc",row.binding.id)})}),row.aliases.length>0?$jsx("box",{children:$jsx("text",{fg:theme.textMuted,children:`(${row.aliases.map(displayCap).join(", ")})`})}):null]},`${section.kind}-${row.binding.id}`)})]},`${section.kind}-${section.scope??sectionIndex}`))})})]})}var import_react60;var init_help_dialog=__esm(async()=>{init_chord_glyphs();init_help_groups();init_keymap_dispatch();init_keybindings2();init_i18n2();init_jsx_runtime();await __promiseAll([init_theme(),init_keymap(),init_dialog()]);import_react60=__toESM(require_react_production(),1);HelpDialog.show=(dialog,currentScope)=>{let reachability=currentBindingReachability(),inputScope=reachability.inputPassthrough?"terminal":currentScope;dialog.replace(()=>$jsx(HelpDialog,{currentScope:inputScope,reachability}))}});function useStatusKeyHintItems(opts){let t3=useT(),kv=useOptionalKV(),focus=useOptionalFocus(),dialog=useOptionalDialog(),keymapVersion2=useKeymapVersion(),stackVersion2=useBindingStackVersion(),hintsEnabled=keyHintsEnabled(kv?.get(KEY_HINTS_ENABLED_KEY,!0)),[snapshot,setSnapshot]=import_react61.useState({tokens:[],modal:!1});import_react61.useEffect(()=>{let enabled=hintsEnabled,nextModal=modalActive()||(dialog?.stack.length??0)>0,fresh=enabled&&!nextModal?statusHintTokens(currentBindingReachability(),currentPrefixConfiguration().key):null;setSnapshot((prev)=>{let nextTokens=fresh??(enabled?prev.tokens:[]);return prev.modal===nextModal&&prev.tokens.length===nextTokens.length&&prev.tokens.every((tok,i2)=>tok.chord===nextTokens[i2]?.chord&&tok.msg===nextTokens[i2]?.msg)?prev:{tokens:nextTokens,modal:nextModal}})},[keymapVersion2,stackVersion2,focus?.focused,dialog?.stack.length,hintsEnabled]);let actions=snapshot.modal?{commands:void 0,sidebar:void 0,help:void 0}:{commands:()=>void armPrefixFromCurrentStack(),sidebar:focus?()=>focus.setFocused("sidebar"):void 0,help:dialog?()=>HelpDialog.show(dialog,focus?.focused??"sidebar"):void 0},items=snapshot.tokens.map((tok)=>({text:opts?.compact?formatChord(tok.chord):t3(`hints.status.${tok.msg}`,{key:formatChord(tok.chord)}),onPress:actions[tok.msg]}));if(opts?.onOpenSettings&&!opts.compact&&hintsEnabled)items.push({text:`[${t3("hints.status.settings")}]`,bindingId:"settings.open",onPress:snapshot.modal?void 0:opts.onOpenSettings});return items}function StatusKeyHintBar(props){let{theme}=useTheme(),items=useStatusKeyHintItems({onOpenSettings:props.onOpenSettings,compact:props.compact});if(items.length===0)return null;return $jsx("box",{flexDirection:"row",flexShrink:0,children:items.flatMap((item,index)=>[index>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:" \xB7 "},`sep-${item.text}`):null,$jsxs("box",{position:"relative",onMouseUp:item.onPress,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:item.text}),item.bindingId?$jsx(ShortcutRevealBadge,{bindingId:item.bindingId,cover:!0}):null]},item.text)])})}function usePaneHintMark(pane){let kv=useOptionalKV();return import_react61.useCallback(()=>{if(!kv)return;if(kv.get(PANE_HINT_USED_KEYS[pane],!1)!==!0)kv.set(PANE_HINT_USED_KEYS[pane],!0)},[kv,pane])}function PaneKeyHint(props){let t3=useT(),{theme}=useTheme(),kv=useOptionalKV();useKeymapVersion();let enabledRaw=kv?.get(KEY_HINTS_ENABLED_KEY,!0),usedRaw=kv?.get(PANE_HINT_USED_KEYS[props.pane],!1);if(!keyHintsEnabled(enabledRaw))return null;let tokens=paneHintTokens(props.pane,paneHintVisible(enabledRaw,usedRaw)?"firstUse":"always");if(tokens.length===0)return null;return $jsx("text",{fg:theme.textMuted,wrapMode:"none",children:tokens.map((tok)=>`${formatChord(tok.cap)} ${t3(`hints.pane.${tok.msg}`)}`).join(" \xB7 ")})}var import_react61;var init_keyboard_hints2=__esm(async()=>{init_chord_glyphs();init_keyboard_hints();init_keymap_dispatch();init_keybindings2();init_kv();init_i18n2();init_jsx_runtime();await __promiseAll([init_focus(),init_theme(),init_keymap(),init_dialog(),init_help_dialog(),init_shortcut_reveal2()]);import_react61=__toESM(require_react_production(),1)});import{TextAttributes as TextAttributes10}from"@opentui/core";function FileTreeHeaderView(props){let{theme}=useTheme(),t3=useT(),prefixKey=currentPrefixConfiguration().key,createPRChord=prefixKey?`[${formatChord(prefixKey)} P]`:null;return $jsxs($Fragment2,{children:[props.onZenToggle||props.onCreatePR?$jsxs("box",{flexDirection:"row",flexWrap:"wrap",justifyContent:"flex-end",columnGap:2,paddingBottom:1,flexShrink:0,children:[props.onZenToggle?$jsxs("box",{position:"relative",flexDirection:"row",gap:1,flexShrink:0,onMouseUp:(e2)=>{e2.stopPropagation(),props.onZenToggle?.()},children:[$jsx("text",{fg:theme.accent,attributes:TextAttributes10.BOLD,wrapMode:"none",children:"[~]"}),$jsx("text",{fg:theme.text,wrapMode:"none",children:t3("files.actions.zen")}),$jsx(ShortcutRevealBadge,{bindingId:"workspace.zenToggle"})]}):null,props.onCreatePR?$jsxs("box",{flexDirection:"row",gap:1,flexShrink:0,onMouseUp:(e2)=>{e2.stopPropagation(),props.onCreatePR?.()},children:[createPRChord?$jsxs("box",{position:"relative",children:[$jsx("text",{fg:theme.accent,attributes:TextAttributes10.BOLD,wrapMode:"none",children:createPRChord}),$jsx(ShortcutRevealBadge,{bindingId:"files.createPR",cover:!0})]}):null,$jsx("text",{fg:theme.text,wrapMode:"none",children:t3("files.actions.createPR")})]}):null]}):null,$jsx("box",{flexDirection:"row",paddingBottom:0,flexShrink:0,gap:2,children:TAB_ORDER.map((tabId)=>{let isActive=props.tab===tabId;return $jsx("text",{fg:isActive?theme.primary:theme.textMuted,attributes:isActive?TextAttributes10.BOLD:void 0,wrapMode:"none",onMouseUp:()=>props.onSelectTab(tabId),children:t3(tabLabelKey(tabId))},tabId)})}),props.tab==="changes"?$jsxs("box",{flexDirection:"column",paddingBottom:1,flexShrink:0,gap:0,children:[$jsxs("text",{fg:theme.textMuted,wrapMode:"none",children:[props.scope==="branch"&&props.base!=null?t3("files.scope.branch",{base:props.base}):t3("files.scope.working"),props.base!=null?` ${t3("files.scope.toggleHint")}`:""]}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("files.legend.changes")})]}):$jsx("box",{flexDirection:"row",paddingBottom:1,flexShrink:0})]})}var init_header_view=__esm(async()=>{init_chord_glyphs();init_keymap_dispatch();init_keys_core();init_i18n2();init_jsx_runtime();await __promiseAll([init_shortcut_reveal2(),init_theme()])});function resolveRowSelectionChrome(theme,state){let transparent=theme.background.a===0;if(state.cursor){if(transparent)return{marker:"\u258C",markerColor:theme.focusAccent??theme.primary,backgroundColor:void 0};return{marker:"\u258C",markerColor:theme.text,backgroundColor:theme.backgroundElement}}if(state.selected)return{marker:"\u258C",markerColor:theme.borderActive,backgroundColor:transparent?void 0:theme.background};return{marker:" ",markerColor:void 0,backgroundColor:void 0}}import{TextAttributes as TextAttributes11}from"@opentui/core";var import_react62,FileTreeRowView;var init_row_view=__esm(async()=>{init_pane_core();init_rows();init_jsx_runtime();await init_theme();import_react62=__toESM(require_react_production(),1),FileTreeRowView=import_react62.memo(function(props){let{theme}=useTheme(),selection=resolveRowSelectionChrome(theme,{cursor:props.cursor}),bar=$jsx("text",{fg:selection.markerColor,wrapMode:"none",children:selection.marker}),rowBg=selection.backgroundColor,row=props.row;if(row.kind==="dir"){let indent2=" ".repeat(row.depth);return $jsxs("box",{flexDirection:"row",gap:0,backgroundColor:rowBg,onMouseUp:()=>props.onActivate(props.row,props.index),children:[bar,$jsx("box",{flexGrow:1,paddingRight:1,children:$jsx("text",{fg:theme.textMuted,attributes:TextAttributes11.BOLD,wrapMode:"none",children:`${indent2}${row.expanded?"\u25BE":"\u25B8"} ${row.name}/`})})]})}if(row.kind==="file"){let indent2=" ".repeat(row.depth);return $jsxs("box",{flexDirection:"row",gap:0,backgroundColor:rowBg,onMouseUp:()=>props.onActivate(props.row,props.index),children:[bar,$jsx("box",{flexGrow:1,paddingRight:1,children:$jsx("text",{fg:theme.text,wrapMode:"none",children:`${indent2} ${row.name}`})})]})}let isUntrackedDir2=row.fileCount!==void 0,marker=isUntrackedDir2?row.expanded?"\u25BE ":"\u25B8 ":"",countSuffix=isUntrackedDir2?` (${row.fileCount})`:"",indent=row.child?" ":"",pathBudget=props.pathBudget-displayWidth(marker)-displayWidth(countSuffix)-displayWidth(indent),tone=statusToken(row.status),statusColor=tone==="success"?theme.success:tone==="warning"?theme.warning:tone==="error"?theme.error:tone==="info"?theme.info:theme.textMuted;return $jsxs("box",{flexDirection:"row",gap:0,backgroundColor:rowBg,onMouseUp:()=>props.onActivate(props.row,props.index),children:[bar,$jsxs("box",{flexDirection:"row",flexGrow:1,gap:1,paddingRight:1,children:[$jsx("text",{fg:statusColor,wrapMode:"none",children:row.status}),$jsx("text",{fg:isUntrackedDir2?theme.textMuted:theme.text,wrapMode:"none",flexGrow:1,children:`${indent}${marker}${truncatePathTail(row.path,pathBudget)}${countSuffix}`}),props.statWidths.added>0?$jsx("text",{fg:theme.success,wrapMode:"none",children:statCell(row.added,props.statWidths.added,"+")}):null,props.statWidths.deleted>0?$jsx("text",{fg:theme.error,wrapMode:"none",children:statCell(row.deleted,props.statWidths.deleted,"-")}):null]})]})})});function FileTree(props){let{theme}=useTheme(),t3=useT(),dims=useTerminalDimensions(),[tab,setTab]=import_react64.useState("all"),[scope,setScope]=import_react64.useState("working"),[scopeManual,setScopeManual]=import_react64.useState(!1),[base,setBase]=import_react64.useState(null),[cursorIndex,setCursorIndex]=import_react64.useState(0),[refreshTick,setRefreshTick]=import_react64.useState(0),[allFiles,setAllFiles]=import_react64.useState(null),[changes,setChanges]=import_react64.useState(null),[error,setError]=import_react64.useState(null),[expandedDirs,setExpandedDirs]=import_react64.useState(()=>new Set),pathRef=useLatest(props.worktreePath),tabRef=useLatest(tab),allFilesRef=useLatest(allFiles),changesRef=useLatest(changes),scopeRef=useLatest(scope),baseRef=useLatest(base),scopeManualRef=useLatest(scopeManual),onOpenFileRef=useLatest(props.onOpenFile),fetchSeq=import_react64.useRef(0),refetch=import_react64.useCallback(async(currentTab,path22,signal)=>{let seq=++fetchSeq.current;if(path22==null){setAllFiles(null),setChanges(null),setError(null);return}setError(null);try{if(currentTab==="all"){let files=await listFiles(path22,signal);if(signal?.aborted||seq!==fetchSeq.current||pathRef.current!==path22)return;setAllFiles((prev)=>sameFileList(prev,files)?prev:files)}else if(currentTab==="changes"){let wantBranch=scopeRef.current==="branch"&&baseRef.current!=null,entries=wantBranch?await statusFilesBranch(path22,baseRef.current,signal):await statusFiles(path22,signal);if(signal?.aborted||seq!==fetchSeq.current||pathRef.current!==path22)return;if(!wantBranch&&entries.length===0&&!scopeManualRef.current&&baseRef.current!=null){setScope("branch");return}setChanges((prev)=>sameStatusEntries(prev,entries)?prev:entries)}}catch(err){if(signal?.aborted)return;let message=errorMessage(err);if(seq===fetchSeq.current&&pathRef.current===path22)setError(message)}},[]);import_react64.useEffect(()=>{setAllFiles(null),setChanges(null),setError(null),setCursorIndex(0),setExpandedDirs(new Set),setScope("working"),setScopeManual(!1);let controller=new AbortController;return refetch(tabRef.current,props.worktreePath,controller.signal),()=>controller.abort()},[props.worktreePath,refetch]),import_react64.useEffect(()=>{let path22=props.worktreePath;if(path22==null){setBase(null);return}let disposed=!1,controller=new AbortController;return resolveBase(path22,props.prBaseRef,controller.signal).then((b3)=>{if(!disposed)setBase(b3)}).catch(()=>{if(!disposed)setBase(null)}),()=>{disposed=!0,controller.abort()}},[props.worktreePath,props.prBaseRef]),import_react64.useEffect(()=>{if(tabRef.current!=="changes")return;let path22=pathRef.current;if(path22==null)return;let controller=new AbortController;return refetch("changes",path22,controller.signal),()=>controller.abort()},[scope,base,refetch]),import_react64.useEffect(()=>{let path22=props.worktreePath;if(path22==null)return;if(process.env.KOBE_FILETREE_WATCH==="0")return;return watchWorktree(path22,()=>setRefreshTick((n2)=>n2+1))},[props.worktreePath]),import_react64.useEffect(()=>{setCursorIndex(0);let path22=pathRef.current;if(path22==null)return;let controller=new AbortController;if(tab==="all"){if(allFilesRef.current==null)refetch("all",path22,controller.signal)}else if(tab==="changes"){if(changesRef.current==null)refetch("changes",path22,controller.signal)}return()=>controller.abort()},[tab,refetch]),import_react64.useEffect(()=>{if(refreshTick===0)return;let path22=pathRef.current;if(path22==null)return;let controller=new AbortController;return refetch(tabRef.current,path22,controller.signal),()=>controller.abort()},[refreshTick,refetch]);let tree=import_react64.useMemo(()=>allFiles==null?null:buildTree(allFiles),[allFiles]),prevRows=import_react64.useRef([]),rows=import_react64.useMemo(()=>{let next=[];if(tab==="all"){if(tree!=null)flattenTree(tree,expandedDirs,0,next)}else if(tab==="changes"){if(changes!=null)next.push(...statusRows(changes,expandedDirs))}let reconciled=reconcileRows(prevRows.current,next);return prevRows.current=reconciled,reconciled},[tab,tree,expandedDirs,changes]);import_react64.useEffect(()=>{if(rows.length===0)return;setCursorIndex((i2)=>i2>rows.length-1?rows.length-1:i2)},[rows]);let statWidths=import_react64.useMemo(()=>computeStatWidths(rows),[rows]),paneWidth=props.paneWidth??dims.width,pathBudget=import_react64.useMemo(()=>computePathBudget(paneWidth,statWidths),[paneWidth,statWidths]);function applyNav(action){if(!action)return;if(action.type==="cursor")setCursorIndex(action.index);else if(action.type==="expand")setExpandedDirs((prev)=>new Set(prev).add(action.path));else setExpandedDirs((prev)=>toggleDir(prev,action.path))}let activateRow=import_react64.useCallback((row)=>{if(row.kind==="dir"||row.path.endsWith("/"))setExpandedDirs((prev)=>toggleDir(prev,row.path));else onOpenFileRef.current(row.path)},[]),handleRowActivate=import_react64.useCallback((row,index)=>{setCursorIndex(index),activateRow(row)},[activateRow]),markKeysUsed=usePaneHintMark("files");useBindings(()=>({enabled:props.focused??!0,bindings:fileTreeBindings({moveDown:()=>{if(markKeysUsed(),rows.length===0)return;setCursorIndex((i2)=>Math.min(i2+1,rows.length-1))},moveUp:()=>{if(markKeysUsed(),rows.length===0)return;setCursorIndex((i2)=>Math.max(i2-1,0))},setTab,currentTab:()=>tab,openCurrent:()=>{markKeysUsed();let row=rows[cursorIndex];if(row)activateRow(row)},mentionCurrent:()=>{let row=rows[cursorIndex];if(!row||row.kind==="dir"||row.path.endsWith("/"))return;props.onMention?.(row.path)},openExternal:()=>{let row=rows[cursorIndex];if(!row||row.kind==="dir"||row.path.endsWith("/"))return;if(!props.worktreePath)return;openExternally(`${props.worktreePath}/${row.path}`)},refresh:()=>{setRefreshTick((n2)=>n2+1)},toggleScope:()=>{if(tab!=="changes")return;if(base==null)return;setScopeManual(!0),setScope((s2)=>s2==="working"?"branch":"working")},openDiff:()=>{let row=rows[cursorIndex];if(!row||row.kind==="dir"||row.path.endsWith("/"))return;props.onOpenDiff?.(row.path,scope==="branch"&&base!=null?base:void 0)},expandOrDescend:()=>applyNav(expandOrDescendAction(rows,cursorIndex)),collapseOrParent:()=>applyNav(collapseOrParentAction(rows,cursorIndex))})}));let scrollRef=import_react64.useRef(null);import_react64.useEffect(()=>{let scroll=scrollRef.current;if(!scroll||rows.length===0)return;let y3=followScrollTop(scroll.scrollTop,scroll.viewport.height,cursorIndex);if(y3!=null)scroll.scrollTo({x:0,y:y3})},[cursorIndex,rows]);let loaded=tab==="all"&&allFiles!=null||tab==="changes"&&changes!=null;return $jsxs("box",{flexDirection:"column",flexGrow:1,paddingLeft:0,paddingRight:0,children:[$jsx(FileTreeHeaderView,{tab,scope,base,onSelectTab:setTab,onZenToggle:props.onZenToggle,onCreatePR:props.onCreatePR}),$jsx("scrollbox",{ref:(r6)=>{scrollRef.current=r6},flexGrow:1,verticalScrollbarOptions:{trackOptions:{foregroundColor:"transparent"}},children:props.worktreePath==null?$jsx("box",{paddingTop:1,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:t3("files.empty.noTask")})}):error!=null?$jsxs("box",{paddingTop:1,paddingLeft:1,flexDirection:"column",gap:0,children:[$jsx("text",{fg:theme.error,wrapMode:"word",children:summarizeGitError(error,t3)}),$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:t3("files.error.retryHint")})]}):rows.length===0&&loaded?$jsx("box",{paddingTop:1,paddingLeft:1,children:$jsx("text",{fg:theme.textMuted,children:tab==="all"?t3("files.empty.noFiles"):t3("files.empty.noChanges")})}):rows.length>0?$jsx("box",{flexShrink:0,gap:0,paddingRight:1,children:rows.map((row,index)=>$jsx(FileTreeRowView,{row,index,cursor:index===cursorIndex,statWidths,pathBudget,onActivate:handleRowActivate},`${row.kind}:${row.path}`))}):null}),props.worktreePath!=null?$jsx("box",{flexDirection:"row",justifyContent:"flex-end",paddingTop:1,flexShrink:0,children:$jsx(PaneKeyHint,{pane:"files"})}):null]})}var import_react64;var init_FileTree=__esm(async()=>{init_git2();init_keys_core();init_open_external2();init_pane_core();init_rows();init_i18n2();init_use_latest();init_jsx_runtime();await __promiseAll([init_react(),init_keyboard_hints2(),init_theme(),init_keymap(),init_header_view(),init_row_view()]);import_react64=__toESM(require_react_production(),1)});function HostFilesPane(props){let{theme}=useTheme(),focus=useFocus(),dims=useTerminalDimensions(),inactiveBorder=theme.borderActive,available=Math.max(WORKTREE_TOOLS_MIN_WIDTH,dims.width-sidebarWidthFor(dims.width)),width=Math.max(WORKTREE_TOOLS_MIN_WIDTH,Math.min(WORKTREE_TOOLS_MAX_WIDTH,Math.floor(available/3)));return $jsx("box",{width,flexShrink:0,borderStyle:"rounded",borderColor:focus.focused==="files"?theme.focusAccent:inactiveBorder,onMouseUp:()=>focus.setFocused("files"),children:$jsx(FileTree,{worktreePath:props.worktree,paneWidth:width-2,prBaseRef:props.prBaseRef,focused:props.focused,onOpenFile:props.onOpenFile,onOpenDiff:props.onOpenDiff,onMention:props.onMention,onZenToggle:props.onZenToggle,onCreatePR:props.taskKind==="main"?void 0:props.onCreatePR})})}var WORKTREE_TOOLS_MIN_WIDTH=22,WORKTREE_TOOLS_MAX_WIDTH=34;var init_host_files_pane=__esm(async()=>{init_view_core();init_jsx_runtime();await __promiseAll([init_react(),init_focus(),init_theme(),init_FileTree()])});function ratioBar(ratio,width=8){let cells=Math.min(1,Math.max(0,ratio))*width,full=Math.floor(cells),eighth=Math.round((cells-full)*8);if(eighth===8)full+=1,eighth=0;let partial=full<width?EIGHTHS[eighth]??"":"";return`${"\u2588".repeat(full)}${partial}`.padEnd(width,"\u2591")}var EIGHTHS;var init_progress_bar=__esm(()=>{EIGHTHS=["","\u258F","\u258E","\u258D","\u258C","\u258B","\u258A","\u2589"]});function formatReset(resetsAt,nowMs){if(resetsAt==null||resetsAt<=nowMs)return"";let d2=new Date(resetsAt),clock=`${pad2(d2.getHours())}:${pad2(d2.getMinutes())}`;if(resetsAt-nowMs<86400000)return`\u2192 ${clock}`;return`\u2192 ${d2.getMonth()+1}/${d2.getDate()} ${clock}`}function usageChips(usage,nowMs){return usage.windows.map((w4)=>({label:w4.label,percentText:`${w4.percent}%`,resetText:formatReset(w4.resetsAt,nowMs),tone:toneOf(w4.percent)}))}function narrowUsageChip(usage,nowMs){let w4=usage.windows.find((win)=>win.kind==="session")??usage.windows[0];if(!w4)return null;return{label:w4.label,percentText:`${w4.percent}%`,resetText:formatReset(w4.resetsAt,nowMs),tone:toneOf(w4.percent)}}function fullChipCells(chip,index){let label=index===0?chip.label:`\xB7 ${chip.label}`,parts=[displayWidth(label),displayWidth(chip.percentText)];if(chip.resetText)parts.push(displayWidth(chip.resetText));return parts.reduce((a2,b3)=>a2+b3,0)+(parts.length-1)}function fullVendorCells(vendor){return displayWidth(vendor.vendor)+vendor.chips.reduce((sum,chip,i2)=>sum+fullChipCells(chip,i2),0)+vendor.chips.length}function usageChipsBudget(opts){return Math.max(0,opts.terminalWidth-4-opts.hintCells)}function buildFooterChips(opts){let entries=[...opts.usage.entries()].map(([id,snapshot])=>({vendor:opts.vendorLabel(id).toUpperCase(),snapshot,chips:usageChips(snapshot,opts.nowMs)})).filter((entry)=>entry.chips.length>0);if(entries.length===0)return null;if(!opts.forceCompact){let fulls=entries.map((entry)=>({vendor:entry.vendor,chips:entry.chips}));if(fulls.reduce((sum,v3)=>sum+fullVendorCells(v3),0)+(fulls.length-1)*2<=opts.budget)return{form:"full",vendors:fulls}}let vendors=[],remaining=opts.budget;for(let entry of entries){let chip=narrowUsageChip(entry.snapshot,opts.nowMs);if(!chip)continue;let gap=vendors.length>0?2:0,need=displayWidth(entry.vendor)+1+displayWidth(chip.percentText);if(need+gap<=remaining){vendors.push({vendor:entry.vendor,percentText:chip.percentText,tone:chip.tone}),remaining-=need+gap;continue}let nameBudget=remaining-gap-1-displayWidth(chip.percentText);if(nameBudget>=3)vendors.push({vendor:truncateEndCells(entry.vendor,nameBudget,approxCharCells),percentText:chip.percentText,tone:chip.tone});break}return{form:"compact",vendors}}function usageRows(usage,nowMs){let labelWidth=Math.min(8,usage.windows.reduce((w4,win)=>Math.max(w4,win.label.length),2));return usage.windows.map((w4)=>({label:(w4.label.length>labelWidth?w4.label.slice(0,labelWidth):w4.label).padEnd(labelWidth),bar:ratioBar(w4.percent/100,USAGE_BAR_WIDTH),percentText:`${String(w4.percent).padStart(3)}%`,resetText:formatReset(w4.resetsAt,nowMs),tone:toneOf(w4.percent)}))}var USAGE_BAR_WIDTH=10,toneOf=(percent)=>percent>=95?"crit":percent>=75?"warn":"ok",pad2=(n2)=>String(n2).padStart(2,"0");var init_usage_core=__esm(()=>{init_progress_bar()});function UsageChips(props){let{theme}=useTheme(),usage=useAccessor(props.orchestrator.usageSnapshotSignal()),toneColor2={ok:theme.success,warn:theme.warning,crit:theme.error},now=Date.now(),view=usage&&usage.size>0?buildFooterChips({usage,budget:props.budget,nowMs:now,vendorLabel:engineDisplayName,forceCompact:props.narrow}):null;if(!view)return null;if(view.form==="full")return $jsx("box",{flexDirection:"row",gap:2,children:view.vendors.map((vendor)=>$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:vendor.vendor}),vendor.chips.map((chip,i2)=>$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:i2===0?chip.label:`\xB7 ${chip.label}`}),$jsx("text",{fg:toneColor2[chip.tone],wrapMode:"none",children:chip.percentText}),chip.resetText?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:chip.resetText}):null]},chip.label))]},vendor.vendor))});return $jsx("box",{flexDirection:"row",gap:2,children:view.vendors.map((vendor,index)=>$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:vendor.vendor}),$jsx("text",{fg:toneColor2[vendor.tone],wrapMode:"none",children:vendor.percentText})]},`${vendor.vendor}-${index}`))})}function WorkspaceFrame(props){let{theme}=useTheme(),dims=useTerminalDimensions(),narrow=isNarrowWidth(dims.width),usage=useAccessor(props.orchestrator.usageSnapshotSignal()),hintItems=useStatusKeyHintItems({onOpenSettings:narrow?void 0:props.onOpenSettings,compact:narrow}),footerVisible=usage!=null&&usage.size>0||hintItems.length>0,hintCells=hintItems.reduce((sum,item,index)=>sum+displayWidth(item.text)+(index>0?3:0),0),chipsBudget=usageChipsBudget({terminalWidth:dims.width,hintCells});return $jsx(ShortcutRevealProvider,{children:$jsxs("box",{flexDirection:"column",flexGrow:1,backgroundColor:theme.background,children:[props.banner,$jsx("box",{flexDirection:"row",flexGrow:1,children:props.children}),footerVisible?$jsxs("box",{flexDirection:"row",flexShrink:0,height:1,paddingLeft:1,paddingRight:1,gap:2,children:[$jsx("box",{flexGrow:1,flexShrink:1,flexDirection:"row",overflow:"hidden",children:$jsx(UsageChips,{orchestrator:props.orchestrator,narrow,budget:chipsBudget})}),$jsx(StatusKeyHintBar,{onOpenSettings:narrow?void 0:props.onOpenSettings,compact:narrow})]}):null]})})}var init_host_footer=__esm(async()=>{init_interactive_command();init_usage_core();init_use_accessor();init_jsx_runtime();await __promiseAll([init_react(),init_keyboard_hints2(),init_shortcut_reveal2(),init_theme()])});function workspacePagesClosed(s2){return!s2.dialogOpen&&!s2.settingsOpen&&!s2.worktreesOpen&&!s2.updateOpen}function settingsCloseKeysEnabled(s2){return s2.settingsOpen&&!s2.dialogOpen}function nextFocusedPane(current,delta,opts){let reachable=PANE_CYCLE.filter((pane)=>pane!=="files"||opts.filesVisible),idx=reachable.indexOf(current);if(idx<0)return(delta>0?reachable[reachable.length-1]:reachable[0])??null;let next=Math.min(Math.max(idx+delta,0),reachable.length-1);return next===idx?null:reachable[next]??null}var PANE_CYCLE;var init_keybinding_gates=__esm(()=>{PANE_CYCLE=["sidebar","workspace","files"]});function firePluginBinding(binding){let verb=binding.kind==="pane"?["plugin","pane","open",binding.target]:["plugin","action","invoke",binding.target],[cmd,...rest]=[...roveCliInvocation(),...verb];spawnDetached(cmd,rest,{onError:(err)=>console.warn(`[rove/plugins] ${binding.target}: ${String(err)}`)})}function usePluginKeybindings(enabled){useBindings(()=>({enabled,bindings:pluginKeybindings().map((binding)=>({key:binding.chord,cmd:()=>firePluginBinding(binding)}))}))}var init_use_plugin_keybindings=__esm(async()=>{init_invocation();init_spawn_detached();init_keybindings_user();await init_keymap()});function useWorkspaceKeybindings(deps){let{focus,dialog}=deps,t3=useT(),renderer=useRenderer();function exitApp(){try{renderer?.destroy()}catch(err){console.error("Rove: renderer.destroy() failed during quit:",err)}process.exit(0)}async function quit(){if(await DialogConfirm.show(dialog,t3("workspace.quit.confirmTitle"),t3("workspace.quit.confirmBody"),t3("common.cancel"),t3("workspace.quit.confirmLabel")))exitApp()}function cyclePane(delta){let next=nextFocusedPane(focus.focused,delta,{filesVisible:deps.filesPaneVisible!==!1});if(next)focus.setFocused(next)}let pages={dialogOpen:deps.dialog.stack.length>0,settingsOpen:deps.pages.settingsOpen,worktreesOpen:deps.pages.worktreesOpen,updateOpen:deps.pages.updateOpen,kanbanOpen:deps.pages.kanbanOpen,automationsOpen:deps.pages.automationsOpen,workItemsOpen:deps.pages.workItemsOpen},pagesClosed=workspacePagesClosed(pages);useBindings(()=>({enabled:pagesClosed,bindings:[...bindByIds({"help.open":()=>HelpDialog.show(dialog,focus.focused),"focus.previous":prefixAction(()=>cyclePane(-1)),"focus.next":prefixAction(()=>cyclePane(1)),"workspace.zenToggle":prefixAction(()=>deps.toggleZen()),"attention.next":()=>deps.jumpToNextAttention(),"inbox.show":prefixAction(()=>deps.openInbox()),"kanban.open":prefixAction(()=>deps.pages.openKanban()),"automations.open":prefixAction(()=>deps.pages.openAutomations()),"workItems.open":prefixAction(()=>deps.pages.openWorkItems()),"task.moveMode":prefixAction(()=>deps.enterMoveMode()),"settings.open":prefixAction(()=>deps.pages.openSettings()),"files.createPR":prefixAction(()=>{let row=focus.focused==="sidebar"?deps.cursorTaskId():null;if(row!==null&&row!==deps.selectedId)deps.createPRFor(row);else deps.createPR()}),"task.openEditor":prefixAction(()=>{let id=(focus.focused==="sidebar"?deps.cursorTaskId():null)??deps.selectedId;if(id)deps.openTaskWorktree(id)})})]})),useBindings(()=>({enabled:!pages.dialogOpen&&!pages.settingsOpen&&!deps.searchActive,bindings:bindByIds({"task.new.global":()=>deps.createTask()})})),useBindings(()=>({enabled:pagesClosed&&focus.focused!=="sidebar",bindings:bindByIds({"focus.sidebar":()=>focus.setFocused("sidebar")})})),useBindings(()=>({enabled:pagesClosed&&focus.focused==="sidebar"&&!deps.searchActive,bindings:bindByIds({"app.quit":(_evt,slot)=>{if(slot===1){exitApp();return}quit()},"settings.open.sidebar":()=>deps.pages.openSettings(),"worktrees.open.sidebar":()=>deps.pages.openWorktrees(),"tasks.update":()=>deps.pages.openUpdate()})})),useBindings(()=>({enabled:pagesClosed&&focus.focused==="sidebar"&&!deps.searchActive,bindings:bindByIds({"task.new":()=>deps.createTask(),"tasks.openWorktree":()=>{let id=deps.cursorTaskId();if(id)deps.openTaskWorktree(id)},"tasks.renameBranch":()=>{let id=deps.cursorTaskId();if(id)deps.renameBranch(id)},"tasks.cycleEngine":()=>{let id=deps.cursorTaskId();if(id)deps.cycleVendor(id)},"tasks.focusEngine":()=>focus.setFocused("workspace"),"sidebar.sort":()=>deps.toggleSortMode()})})),useBindings(()=>({enabled:settingsCloseKeysEnabled(pages),bindings:pageCloseBindings(deps.pages.closeSettings)})),usePluginKeybindings(pagesClosed)}var init_host_keybindings=__esm(async()=>{init_keymap_dispatch();init_keybindings2();init_i18n2();init_keybinding_gates();await __promiseAll([init_react(),init_help_dialog(),init_keymap(),init_dialog_confirm(),init_use_plugin_keybindings()])});function focusPaneForNav(nav){return nav==="terminal"?"sidebar":"workspace"}var SIDEBAR_NAV_ITEMS;var init_nav_core=__esm(()=>{SIDEBAR_NAV_ITEMS=[{nav:"kanban",labelKey:"tasks.nav.kanban",bindingId:"kanban.open"},{nav:"automations",labelKey:"tasks.nav.automations",bindingId:"automations.open"},{nav:"issues",labelKey:"tasks.nav.issues",bindingId:"workItems.open"}]});function relativeBuckets(absMs){let minutes=Math.round(absMs/60000),hours=Math.round(minutes/60);return{minutes,hours,days:Math.round(hours/24)}}function dividerRule(terminalWidth){return"\u2500".repeat(Math.max(1,terminalWidth))}function nextComposerField(field,delta=1){let index=COMPOSER_FIELDS.indexOf(field);if(index<0)return"name";let next=(index+delta+COMPOSER_FIELDS.length)%COMPOSER_FIELDS.length;return COMPOSER_FIELDS[next]}function canSubmitDraft(draft){return draft.name.trim().length>0&&draft.repo.trim().length>0&&draft.prompt.trim().length>0&&isValidCron(draft.schedule.trim())}function firstIncompleteField(draft){if(draft.name.trim().length===0)return"name";if(draft.repo.trim().length===0)return"repo";if(draft.prompt.trim().length===0)return"prompt";if(!isValidCron(draft.schedule.trim()))return"schedule";return null}function previewSchedule(expression,nowMs){let trimmed=expression.trim();if(!isValidCron(trimmed))return{kind:"invalid"};let nextRunMs;try{nextRunMs=nextCronAfter(trimmed,nowMs)}catch{return{kind:"never"}}return{kind:"ok",nextRunMs,relative:formatRelative(nextRunMs-nowMs),absolute:formatAbsolute(nextRunMs,nowMs)}}function formatRelative(deltaMs){let{minutes,hours,days}=relativeBuckets(deltaMs);if(minutes<60)return`in ${Math.max(1,minutes)}m`;if(hours<24)return`in ${hours}h`;return`in ${days}d`}function formatAbsolute(atMs,nowMs){let at2=new Date(atMs),time=`${String(at2.getHours()).padStart(2,"0")}:${String(at2.getMinutes()).padStart(2,"0")}`,now=new Date(nowMs);if(at2.getFullYear()===now.getFullYear()&&at2.getMonth()===now.getMonth()&&at2.getDate()===now.getDate())return time;let weekday=WEEKDAYS[at2.getDay()]??"";if(atMs-nowMs<518400000)return`${weekday} ${time}`;return`${weekday} ${MONTHS[at2.getMonth()]??""} ${at2.getDate()}, ${time}`}var COMPOSER_FIELDS,EMPTY_DRAFT,WEEKDAYS,MONTHS;var init_automation_composer=__esm(()=>{init_cron();COMPOSER_FIELDS=["name","repo","prompt","schedule","confirm"];EMPTY_DRAFT={name:"",repo:"",prompt:"",schedule:"0 9 * * MON-FRI"};WEEKDAYS=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],MONTHS=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function splitCron(expression){let parts=expression.trim().split(/\s+/).filter(Boolean);return CRON_SEGMENTS.map((_4,index)=>parts[index]??"*")}function joinCron(parts){return CRON_SEGMENTS.map((_4,index)=>parts[index]??"*").join(" ")}function range(from,to){let out=[];for(let n2=from;n2<=to;n2++)out.push(String(n2));return out}function stepSegment(segment,current,delta){let ladder=LADDERS[segment],index=ladder.indexOf(current.trim().toUpperCase());if(index<0)return(delta>0?ladder[0]:ladder[ladder.length-1])??current;let next=(index+delta+ladder.length)%ladder.length;return ladder[next]??current}function moveSegmentCursor(cursor,delta){return Math.min(Math.max(cursor+delta,0),CRON_SEGMENTS.length-1)}function setSegment(expression,index,value){let parts=splitCron(expression);if(index<0||index>=CRON_SEGMENTS.length)return joinCron(parts);return parts[index]=value,joinCron(parts)}function describeCron(expression){let[minute,hour,dom,month,dow]=splitCron(expression);if(month!=="*"||dom!=="*")return null;if(minute===void 0||hour===void 0||dow===void 0)return null;let at2=describeTimeOfDay(minute,hour);if(!at2)return null;if(dow==="*")return at2.startsWith("every ")?at2:`every day ${at2}`;if(dow==="MON-FRI")return`weekdays ${at2}`;if(dow==="SAT,SUN")return`weekends ${at2}`;let named=DOW_NAMES[dow.toUpperCase()];if(named)return`${named} ${at2}`;return null}function describeTimeOfDay(minute,hour){if(hour==="*"){if(minute==="*")return"every minute";if(minute.startsWith("*/"))return`every ${minute.slice(2)}m`;if(/^\d+$/.test(minute))return`hourly at :${minute.padStart(2,"0")}`;return null}if(hour.startsWith("*/")&&minute==="0")return`every ${hour.slice(2)}h`;if(/^\d+$/.test(hour)&&/^\d+$/.test(minute))return`at ${hour.padStart(2,"0")}:${minute.padStart(2,"0")}`;return null}var CRON_SEGMENTS,MINUTE_LADDER,HOUR_LADDER,DOM_LADDER,MONTH_LADDER,DOW_LADDER,DOW_NAMES,LADDERS;var init_cron_segments=__esm(()=>{CRON_SEGMENTS=["minute","hour","dayOfMonth","month","dayOfWeek"];MINUTE_LADDER=["*","*/5","*/10","*/15","*/30",...range(0,59)],HOUR_LADDER=["*","*/2","*/3","*/4","*/6","*/12",...range(0,23)],DOM_LADDER=["*",...range(1,31)],MONTH_LADDER=["*","JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],DOW_LADDER=["*","MON-FRI","SAT,SUN","MON","TUE","WED","THU","FRI","SAT","SUN"],DOW_NAMES={MON:"Mondays",TUE:"Tuesdays",WED:"Wednesdays",THU:"Thursdays",FRI:"Fridays",SAT:"Saturdays",SUN:"Sundays"};LADDERS={minute:MINUTE_LADDER,hour:HOUR_LADDER,dayOfMonth:DOM_LADDER,month:MONTH_LADDER,dayOfWeek:DOW_LADDER}});function fuzzyMatch(query,haystack){if(!query)return!0;let q2=query.toLowerCase(),h2=haystack.toLowerCase(),qi=0;for(let hi=0;hi<h2.length&&qi<q2.length;hi++)if(h2.charCodeAt(hi)===q2.charCodeAt(qi))qi++;return qi===q2.length}function compareRecent(a2,b3){let byTime=taskTime(b3)-taskTime(a2);if(byTime!==0)return byTime;return String(b3.id).localeCompare(String(a2.id))}function taskTime(task){let parsed=Date.parse(task.updatedAt||task.createdAt);return Number.isFinite(parsed)?parsed:0}function repoBasename(repo){let segments=repo.split("/").filter(Boolean);return segments[segments.length-1]??repo}function sidebarProjectKey(repo){return repo.trim().replace(/[\\/]+$/,"")||repo}function sidebarProjectLabel(repo,repos){let base=repoBasename(repo);if(!repos.some((r6)=>r6!==repo&&repoBasename(r6)===base))return base;return repo.replace(/[\\/]+$/,"").split(/[\\/]+/).slice(-2).join("/")}var init_groups=()=>{};import{TextAttributes as TextAttributes12}from"@opentui/core";function PickerList(props){let{theme}=useTheme(),t3=useT(),below=props.window.total-props.window.start-props.window.items.length;return $jsxs("box",{gap:0,paddingLeft:2,paddingBottom:props.paddingBottom,children:[props.window.start>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("newTask.picker.moreAbove",{count:props.window.start})}):null,props.rows.map((row,i2)=>{let absoluteIndex=props.window.start+i2,isCursor=absoluteIndex===props.cursor,fg=isCursor?theme.primary:row.accent?theme.accent:theme.textMuted,attributes=isCursor?TextAttributes12.BOLD:void 0;if(!row.dim)return $jsxs("text",{fg,attributes,wrapMode:"none",onMouseUp:()=>props.onPick(absoluteIndex),children:[isCursor?"\u25B8 ":" ",row.body]},row.key);return $jsxs("box",{flexDirection:"row",onMouseUp:()=>props.onPick(absoluteIndex),children:[$jsxs("text",{fg,attributes,wrapMode:"none",flexShrink:0,children:[isCursor?"\u25B8 ":" ",row.body]}),$jsx("box",{flexGrow:1}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:1,children:` ${row.dim}`})]},row.key)}),below>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("newTask.picker.moreBelow",{count:below})}):null,props.footer]})}var init_picker_list=__esm(async()=>{init_i18n2();init_jsx_runtime();await init_theme()});import{TextAttributes as TextAttributes13}from"@opentui/core";function AutomationComposerView(props){let{theme}=useTheme(),dialog=useDialog(),t3=useT(),padX=useDialogPaddingX(),[draft,setDraft]=import_react68.useState(()=>({...EMPTY_DRAFT,repo:props.defaultRepo??props.repos[0]??""})),[field,setField]=import_react68.useState("name"),[repoCursor,setRepoCursor]=import_react68.useState(()=>{let at2=props.repos.indexOf(props.defaultRepo??"");return at2>=0?at2:0}),[error,setError]=import_react68.useState(null),[segmentCursor,setSegmentCursor]=import_react68.useState(0),segmentValues=splitCron(draft.schedule),selectSegment=(index)=>{setField("schedule"),setSegmentCursor(Math.min(Math.max(index,0),CRON_SEGMENTS.length-1))},cancel=()=>{props.onCancel(),dialog.clear()},patch=(next)=>{setDraft((prev)=>({...prev,...next})),setError(null)},pickRepoAt=(index)=>{let repo=props.repos[clampCursor(index,props.repos.length)];if(!repo)return;setRepoCursor(clampCursor(index,props.repos.length)),patch({repo})};function commit(){if(canSubmitDraft(draft)){props.onSubmit({name:draft.name.trim(),repo:draft.repo.trim(),prompt:draft.prompt.trim(),schedule:draft.schedule.trim()}),dialog.clear();return}let gap=firstIncompleteField(draft);if(gap)setField(gap),setError(t3(`automations.missing.${gap}`))}let preview=previewSchedule(draft.schedule,Date.now()),repoWindow=windowAround(props.repos,repoCursor),repoRows=repoWindow.items.map((repo,index)=>({key:repo,body:sidebarProjectLabel(repo,props.repos),accent:repoWindow.start+index===repoCursor}));return useBindings(()=>({bindings:[{key:"tab",cmd:()=>setField((f2)=>nextComposerField(f2,1))},{key:"shift+tab",cmd:()=>setField((f2)=>nextComposerField(f2,-1))},...field==="repo"?[{key:"up",cmd:()=>pickRepoAt(repoCursor-1)},{key:"down",cmd:()=>pickRepoAt(repoCursor+1)}]:[],...field==="schedule"?[{key:"left",cmd:()=>setSegmentCursor((c2)=>moveSegmentCursor(c2,-1))},{key:"right",cmd:()=>setSegmentCursor((c2)=>moveSegmentCursor(c2,1))},{key:"up",cmd:()=>{let seg=CRON_SEGMENTS[segmentCursor];if(!seg)return;patch({schedule:setSegment(draft.schedule,segmentCursor,stepSegment(seg,segmentValues[segmentCursor]??"*",1))})}},{key:"down",cmd:()=>{let seg=CRON_SEGMENTS[segmentCursor];if(!seg)return;patch({schedule:setSegment(draft.schedule,segmentCursor,stepSegment(seg,segmentValues[segmentCursor]??"*",-1))})}}]:[],...field==="confirm"?[{key:"return",cmd:()=>commit()}]:[]]})),$jsxs("box",{paddingLeft:padX,paddingRight:padX,gap:1,children:[$jsx(DialogHeader,{title:t3("automations.newTitle"),onClose:()=>cancel()}),$jsx(DialogSection,{label:t3("automations.fieldName"),focused:field==="name",onPress:()=>setField("name"),children:$jsx(DialogField,{focused:field==="name",children:$jsx("input",{value:draft.name,placeholder:t3("automations.namePlaceholder"),focused:field==="name",onMouseUp:()=>setField("name"),onInput:(v3)=>patch({name:v3}),onSubmit:()=>setField(nextComposerField("name"))})})}),$jsx(DialogSection,{label:t3("automations.fieldRepo"),focused:field==="repo",hint:props.repos.length===0?void 0:"\u2191/\u2193",onPress:()=>setField("repo"),children:props.repos.length===0?$jsx("text",{fg:theme.textMuted,children:t3("automations.needRepo")}):$jsx(DialogField,{focused:field==="repo",children:$jsx(PickerList,{window:repoWindow,cursor:repoCursor,rows:repoRows,onPick:pickRepoAt})})}),$jsx(DialogSection,{label:t3("automations.fieldPrompt"),focused:field==="prompt",onPress:()=>setField("prompt"),children:$jsx(DialogField,{focused:field==="prompt",children:$jsx("input",{value:draft.prompt,placeholder:t3("automations.promptPlaceholder"),focused:field==="prompt",onMouseUp:()=>setField("prompt"),onInput:(v3)=>patch({prompt:v3}),onSubmit:()=>setField(nextComposerField("prompt"))})})}),$jsx(DialogSection,{label:t3("automations.fieldSchedule"),focused:field==="schedule",hint:"\u2190/\u2192 \u2191/\u2193",onPress:()=>setField("schedule"),children:$jsxs(DialogField,{focused:field==="schedule",children:[$jsx("box",{flexDirection:"row",gap:2,children:CRON_SEGMENTS.map((segment,index)=>{let activeCell=field==="schedule"&&index===segmentCursor;return $jsxs("box",{flexDirection:"column",onMouseUp:()=>selectSegment(index),children:[$jsx("text",{fg:activeCell?theme.primary:theme.text,attributes:activeCell?TextAttributes13.BOLD|TextAttributes13.UNDERLINE:void 0,wrapMode:"none",children:segmentValues[index]??"*"}),$jsx("text",{fg:activeCell?theme.textMuted:theme.borderSubtle,wrapMode:"none",children:t3(`automations.cronField.${segment}`)})]},segment)})}),preview.kind==="ok"?$jsx("text",{fg:theme.success,wrapMode:"none",children:`${describeCron(draft.schedule)??""}${describeCron(draft.schedule)?" \xB7 ":""}${preview.relative} \xB7 ${preview.absolute}`}):$jsx("text",{fg:theme.error,wrapMode:"none",children:preview.kind==="never"?t3("automations.cronNever"):t3("automations.cronInvalid")})]})}),error?$jsxs("text",{fg:theme.error,wrapMode:"word",children:["\u203B ",error]}):null,$jsx(DialogFooter,{children:t3("automations.composerLegend")}),$jsx(DialogActions,{label:t3("common.create"),focused:field==="confirm",onPress:()=>commit()})]})}var import_react68,AutomationComposer;var init_automation_composer_dialog=__esm(async()=>{init_automation_composer();init_cron_segments();init_state();init_groups();init_i18n2();init_jsx_runtime();await __promiseAll([init_theme(),init_keymap(),init_dialog(),init_dialog_parts(),init_picker_list()]);import_react68=__toESM(require_react_production(),1);AutomationComposer={show(dialog,opts){return showDialog(dialog,(resolve17)=>$jsx(AutomationComposerView,{repos:opts.repos,...opts.defaultRepo?{defaultRepo:opts.defaultRepo}:{},onSubmit:(draft)=>resolve17(draft),onCancel:()=>resolve17(void 0)}))}}});import{TextAttributes as TextAttributes14}from"@opentui/core";function formatWhen(iso,now){if(!iso)return"\u2014";let at2=Date.parse(iso);if(!Number.isFinite(at2))return"\u2014";let deltaMs=at2-now,{minutes,hours}=relativeBuckets(Math.abs(deltaMs));if(minutes<1)return deltaMs>=0?"now":"just now";if(minutes<60)return deltaMs>=0?`in ${minutes}m`:`${minutes}m ago`;if(hours<24)return deltaMs>=0?`in ${hours}h`:`${hours}h ago`;return new Date(at2).toLocaleDateString()}function repoLabel(repo){return repo.split("/").filter(Boolean).pop()??repo}function AutomationsPage(props){let{theme}=useTheme(),dialog=useDialog(),t3=useT(),dims=useTerminalDimensions(),notif=useNotifications();function notifyError(message){notif.notify({kind:"error",taskId:"",tabId:"",title:message})}let[automations,setAutomations]=import_react70.useState(null),[keepsDaemonAlive,setKeepsDaemonAlive]=import_react70.useState(!1),[runs,setRuns]=import_react70.useState([]),[reloadTick,setReloadTick]=import_react70.useState(0),[busyId,setBusyId]=import_react70.useState(null),[notice,setNotice]=import_react70.useState(null),refetch=()=>setReloadTick((tick)=>tick+1);import_react70.useEffect(()=>{let disposed=!1,orch=props.orchestrator;if(!orch){setAutomations([]);return}let load=()=>{orch.listAutomations().then((result)=>{if(disposed)return;setAutomations(result.automations),setKeepsDaemonAlive(result.keepsDaemonAlive)}).catch(()=>{if(!disposed)setAutomations((prev)=>prev??[])})};load();let timer=setInterval(load,POLL_MS2);return()=>{disposed=!0,clearInterval(timer)}},[props.orchestrator,reloadTick]);let rows=automations??[],[cursor,setCursor]=import_react70.useState(0);import_react70.useEffect(()=>{setCursor((c2)=>clampCursor(c2,rows.length))},[rows.length]);let selected=rows[cursor];import_react70.useEffect(()=>{let disposed=!1,orch=props.orchestrator;if(!orch||!selected){setRuns([]);return}return orch.automationRuns(selected.id).then((result)=>{if(!disposed)setRuns(result.runs)}).catch(()=>{if(!disposed)setRuns([])}),()=>{disposed=!0}},[props.orchestrator,selected,reloadTick]);async function toggleEnabled(){let orch=props.orchestrator;if(!orch||!selected||busyId)return;setBusyId(selected.id);try{await orch.setAutomationEnabled(selected.id,!selected.enabled),refetch()}catch(err){console.error("[rove automations] toggle failed:",err),notifyError(t3("automations.failed",{error:errorMessage(err)}))}finally{setBusyId(null)}}async function runNow(){let orch=props.orchestrator;if(!orch||!selected||busyId)return;setBusyId(selected.id),setNotice(t3("automations.running",{name:selected.name}));try{let result=await orch.runAutomationNow(selected.id);setNotice(t3("automations.ranWith",{name:selected.name,status:result.status})),refetch()}catch(err){console.error("[rove automations] run now failed:",err),notifyError(t3("automations.failed",{error:errorMessage(err)}))}finally{setBusyId(null)}}async function createAutomation(){let orch=props.orchestrator;if(!orch||busyId)return;let repos=[...new Set(orch.listTasks().map((task)=>task.repo))].filter(Boolean);if(repos.length===0){setNotice(t3("automations.needRepo"));return}let draft=await AutomationComposer.show(dialog,{repos,...props.focusRepo?{defaultRepo:props.focusRepo}:{}});if(!draft)return;setBusyId("new");try{await orch.createAutomation(draft),refetch()}catch(err){console.error("[rove automations] create failed:",err),notifyError(t3("automations.failed",{error:errorMessage(err)}))}finally{setBusyId(null)}}async function requestDelete(){let orch=props.orchestrator;if(!orch||!selected||busyId)return;if(await DialogConfirm.show(dialog,t3("automations.deleteTitle"),t3("automations.deleteBody",{name:selected.name}),t3("common.cancel"),t3("automations.deleteButton"),{danger:!0})!==!0)return;setBusyId(selected.id);try{await orch.deleteAutomation(selected.id),refetch()}catch(err){console.error("[rove automations] delete failed:",err),notifyError(t3("automations.failed",{error:errorMessage(err)}))}finally{setBusyId(null)}}useBindings(()=>({enabled:props.focused!==!1,bindings:[...pageCloseBindings(props.onClose),{key:"j",cmd:()=>setCursor((c2)=>clampCursor(c2+1,rows.length))},{key:"down",cmd:()=>setCursor((c2)=>clampCursor(c2+1,rows.length))},{key:"k",cmd:()=>setCursor((c2)=>clampCursor(c2-1,rows.length))},{key:"up",cmd:()=>setCursor((c2)=>clampCursor(c2-1,rows.length))},{key:"n",cmd:()=>void createAutomation()},{key:"r",cmd:()=>refetch()},{key:"e",cmd:()=>void toggleEnabled()},{key:"s",cmd:()=>void runNow()},{key:"d",cmd:()=>void requestDelete()},{key:"return",cmd:()=>{let taskId=runs.find((run3)=>run3.taskId)?.taskId;if(taskId)props.onOpenTask?.(taskId)}}]}));let now=Date.now();return $jsxs("box",{flexDirection:"column",flexGrow:1,paddingTop:1,paddingLeft:2,paddingRight:2,children:[$jsxs("box",{flexDirection:"row",gap:1,flexShrink:0,children:[$jsx("text",{attributes:TextAttributes14.BOLD,fg:theme.text,wrapMode:"none",flexShrink:0,children:t3("automations.title")}),$jsx("text",{fg:theme.borderSubtle,wrapMode:"none",flexBasis:0,flexGrow:1,flexShrink:1,children:dividerRule(dims.width)}),$jsx("text",{fg:keepsDaemonAlive?theme.success:theme.textMuted,wrapMode:"none",flexShrink:0,children:keepsDaemonAlive?t3("automations.holdingDaemon"):t3("automations.notHolding")})]}),automations===null?$jsx("box",{paddingTop:1,children:$jsx("text",{fg:theme.textMuted,children:t3("common.loading")})}):rows.length===0?$jsxs("box",{flexDirection:"column",paddingTop:1,gap:1,children:[$jsx("text",{fg:theme.textMuted,children:t3("automations.empty")}),$jsx("text",{fg:theme.text,children:t3("automations.emptyHint")})]}):$jsx("box",{flexDirection:"column",marginTop:1,flexGrow:1,gap:0,children:rows.map((automation,index)=>{let isCursor=index===cursor;return $jsxs("box",{flexDirection:"row",flexShrink:0,...FRAME,borderColor:isCursor?theme.borderActive:theme.borderSubtle,paddingLeft:1,paddingRight:1,gap:1,...isCursor?{backgroundColor:theme.backgroundElement}:{},children:[$jsx("text",{fg:automation.enabled?theme.text:theme.textMuted,attributes:isCursor?TextAttributes14.BOLD:void 0,wrapMode:"none",flexShrink:1,children:automation.name}),$jsx("text",{fg:theme.borderSubtle,wrapMode:"none",flexBasis:0,flexGrow:1,flexShrink:1,children:dividerRule(dims.width)}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:1,children:`${repoLabel(automation.repo)} \xB7 ${automation.schedule}`}),automation.enabled?null:$jsx("text",{fg:theme.warning,wrapMode:"none",flexShrink:0,children:`${t3("automations.paused")} \xB7`}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:formatWhen(automation.nextRunAt,now)})]},automation.id)})}),$jsx("box",{flexDirection:"column",marginTop:1,...FRAME,borderColor:theme.border,padding:1,flexShrink:0,children:selected?$jsxs($Fragment2,{children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",gap:2,children:[$jsx("text",{fg:theme.text,wrapMode:"none",flexShrink:1,flexGrow:1,children:selected.prompt}),$jsx("text",{fg:busyId===selected.id?theme.textMuted:theme.primary,attributes:TextAttributes14.BOLD,wrapMode:"none",flexShrink:0,onMouseUp:()=>void runNow(),children:t3("automations.runNow")})]}),selected.precheck?$jsx("text",{fg:theme.textMuted,children:t3("automations.precheck",{command:selected.precheck.command})}):null,$jsx("text",{attributes:TextAttributes14.BOLD,fg:theme.text,children:t3("automations.recentRuns")}),runs.length===0?$jsx("text",{fg:theme.textMuted,children:t3("automations.noRuns")}):runs.slice(0,5).map((run3)=>{let tone=RUN_TONE[run3.status]??"muted",color=tone==="success"?theme.success:tone==="warning"?theme.warning:tone==="error"?theme.error:theme.textMuted;return $jsx("text",{fg:color,children:`#${run3.runNumber} ${run3.status}${run3.error?` \u2014 ${run3.error}`:""} ${formatWhen(run3.at,now)}`},run3.id)})]}):$jsx("text",{fg:theme.textMuted,children:t3("automations.noSelection")})}),notice?$jsx("text",{fg:theme.textMuted,children:notice}):null]})}var import_react70,POLL_MS2=5000,RUN_TONE;var init_automations_page=__esm(async()=>{init_state();init_notifications();init_i18n2();init_frame();init_jsx_runtime();await __promiseAll([init_react(),init_theme(),init_keymap(),init_dialog(),init_dialog_confirm(),init_automation_composer_dialog()]);import_react70=__toESM(require_react_production(),1),RUN_TONE={dispatched:"success",skipped_precheck:"muted",skipped_missed:"warning",skipped_unavailable:"warning",dispatch_failed:"error"}});function statusDisposition(status){return DISPOSITIONS[status]??"parked"}var DISPOSITIONS;var init_status_disposition=__esm(()=>{DISPOSITIONS={backlog:"active",in_progress:"active",in_review:"parked",error:"parked",done:"terminal",canceled:"terminal",open:"active",doing:"active",hold:"parked"}});function moveBoardSelection(columns,currentId,dir){let firstVisible=columns.find((column)=>column.issues.length>0)?.issues[0]?.id??null;if(currentId==null)return firstVisible;let col=-1,row=-1;for(let[c2,column]of columns.entries()){let r6=column.issues.findIndex((issue)=>issue.id===currentId);if(r6!==-1){col=c2,row=r6;break}}if(col===-1)return firstVisible;if(dir==="up"||dir==="down"){let column=columns[col]?.issues??[],next=dir==="up"?row-1:row+1;return column[Math.max(0,Math.min(next,column.length-1))]?.id??currentId}let step=dir==="left"?-1:1;for(let c2=col+step;c2>=0&&c2<columns.length;c2+=step){let column=columns[c2]?.issues??[];if(column.length===0)continue;return column[Math.min(row,column.length-1)]?.id??currentId}return currentId}function issueColumnKey(issue,taskExists){let disposition=statusDisposition(issue.status);if(disposition==="terminal")return"done";if(disposition==="parked")return"parked";if(issue.taskId!==void 0&&issue.taskId!==""&&(taskExists?.(issue.taskId)??!0))return"in_progress";return"backlog"}function isBoardAttentionState(state){return state!==void 0&&BOARD_ATTENTION_STATES.includes(state)}function applyBoardAttention(columns,stateOf){let attentionCount=0;return{columns:columns.map((col)=>{if(col.key!=="in_progress")return col;let attention=[],rest=[];for(let issue of col.issues)if(issue.taskId!==void 0&&issue.taskId!==""&&isBoardAttentionState(stateOf(issue.taskId)))attention.push(issue);else rest.push(issue);return attentionCount=attention.length,attention.length===0?col:{...col,issues:[...attention,...rest]}}),attentionCount}}function compareIssues(a2,b3){if(a2.created!==b3.created)return a2.created<b3.created?1:-1;return b3.id-a2.id}function buildIssueBoard(issues,taskExists){let buckets={backlog:[],in_progress:[],parked:[],done:[]};for(let issue of issues)buckets[issueColumnKey(issue,taskExists)].push(issue);return BOARD_COLUMN_ORDER.map((key)=>{let capped=key==="done"||key==="parked",sorted2=buckets[key].sort(compareIssues);if(!capped||sorted2.length<=COLUMN_CAP)return{key,issues:sorted2,hiddenCount:0};return{key,issues:sorted2.slice(0,COLUMN_CAP),hiddenCount:sorted2.length-COLUMN_CAP}})}var BOARD_COLUMN_ORDER,COLUMN_CAP=20,BOARD_ATTENTION_STATES;var init_issue_board=__esm(()=>{init_status_disposition();BOARD_COLUMN_ORDER=["backlog","in_progress","parked","done"];BOARD_ATTENTION_STATES=["permission_needed","rate_limited","error"]});function quickForkComposerOptions(repo,engines,defaultVendor,branchFrom=repo){return{repoLabel:repoBasename(repo),engines,defaultVendor,defaultBaseRef:getCurrentBranch(branchFrom)??getCurrentBranch(repo)??DEFAULT_BASE_REF,engineLabel:engineDisplayName}}function quickForkDefaultVendor(repo,detected){let pref=resolvePreferredVendor(repo);if(detected.length===0||detected.includes(pref))return pref;return detected[0]??pref}async function createQuickForkTask(orch,repo,baseRef,vendor){return setRepoLastActiveVendor(repo,vendor),addSavedRepo(repo),orch.createTask({repo,baseRef,vendor})}async function runQuickFork(orch,repo,result,hooks){try{let task=await createQuickForkTask(orch,repo,result.baseRef,result.vendor);return hooks.selectTask(task.id),await hooks.enterTask(task.id),task.id}catch(err){console.error("[rove workspace] quick-fork task.create failed:",err),hooks.notifyError(`Couldn't fork task: ${errorMessage(err)}`);return}}async function runAgainTask(orch,task,hooks){let prompt=task.prompt;if(prompt===void 0)return;let baseRef=task.baseRef??getCurrentBranch(task.worktreePath||task.repo)??DEFAULT_BASE_REF,vendor=task.vendor??DEFAULT_TASK_VENDOR,taskId=await runQuickFork(orch,task.repo,{baseRef,vendor},hooks);if(taskId===void 0)return;return await orch.setPrompt(taskId,prompt).catch(()=>{return}),taskId}function useQuickFork(orch,hooks){let[pending,setPending]=import_react71.useState(null);async function onQuickFork(repo,result){let taskId=await runQuickFork(orch,repo,result,hooks);if(taskId)setPending({taskId,prompt:appendAttachmentRefs(result.prompt,result.attachments)})}async function onRunAgain(task){let taskId=await runAgainTask(orch,task,hooks);if(taskId&&task.prompt!==void 0)setPending({taskId,prompt:task.prompt})}function initialPromptFor(taskId){return taskId&&pending?.taskId===taskId?pending.prompt:void 0}return{onQuickFork:(repo,result)=>void onQuickFork(repo,result),initialPromptFor,runAgain:(task)=>void onRunAgain(task)}}var import_react71;var init_quick_fork=__esm(()=>{init_interactive_command();init_repos();init_vendor_prefs();init_attachments();init_git_snapshot();init_groups();init_task();import_react71=__toESM(require_react_production(),1)});function promptHeader(issue){let lines=[`Work on user story #${issue.id}: ${issue.title}`,""],body=issue.body.trim();if(body)lines.push(body,"");return lines}function issueWorktreePrompt(issue,api,product){return[...promptHeader(issue),`Treat this as the story's dedicated ${product} task session: work only in this task worktree, and preserve any repo init instructions already delivered to the session.`,"Before finishing, verify the acceptance criteria implied by the story and summarize what changed plus any verification still needed.","Then merge the task branch back into the current project's main branch after the worktree is clean and checks pass.",`When the work lands, run: ${api} issue-set-status --repo . --id ${issue.id} --status done`].join(`
730
730
  `)}function issueProjectPrompt(issue,api){return[...promptHeader(issue),"You are working directly in the project checkout \u2014 no dedicated worktree or branch was created. Keep changes reviewable and do not switch branches unless asked.","Before finishing, verify the acceptance criteria implied by the story and summarize what changed plus any verification still needed.",`When the work lands, run: ${api} issue-set-status --repo . --id ${issue.id} --status done`].join(`
731
731
  `)}function displayProductName(){return ROVE_PRODUCT_NAME.charAt(0).toUpperCase()+ROVE_PRODUCT_NAME.slice(1)}function nextPlaceholderIndex(body){let matches=body.match(/^(?:images|pdf)\[\d+\]:/gm);return matches?matches.length:0}function withImagePlaceholders(body,paths){let next=body.replace(/\s+$/,""),index=nextPlaceholderIndex(body);for(let path22 of paths){let line=`${attachmentLabel(path22,index)}: ${path22}`;next=next.length>0?`${next}
732
732
  ${line}`:line,index+=1}return next}function issueChatTaskTitle(issue){return`#${issue.id} ${issue.title}`}function issueWorktreePrompt2(issue,api="rove api"){return issueWorktreePrompt(issue,api,displayProductName())}function issueProjectPrompt2(issue,api="rove api"){return issueProjectPrompt(issue,api)}var ISSUE_CHAT_PLACEMENTS;var init_issue_chat=__esm(()=>{init_product();init_attachments();ISSUE_CHAT_PLACEMENTS=["worktree","projectWorktree","project"]});function relativeAgeMs(ms,nowMs=Date.now()){let secs=Math.max(0,Math.floor((nowMs-ms)/1000));if(secs<60)return`${secs}s`;let mins=Math.floor(secs/60);if(mins<60)return`${mins}m`;let hours=Math.floor(mins/60);if(hours<24)return`${hours}h`;return`${Math.floor(hours/24)}d`}var init_message_core=()=>{};function str2(value){return typeof value==="string"?value:""}function detailFragment(event){let detail=event.detail;if(!detail)return"";let{tool,compact,subagent}=detail,fragment=str2(tool?.name)||str2(compact?.trigger)||str2(subagent?.type)||str2(detail.note);return truncateEnd(fragment,FRAGMENT_MAX)}function eventRows(events,nowMs,limit=EVENT_FEED_LIMIT){return events.slice(-limit).reverse().map((event,index)=>{let tail2=[detailFragment(event),str2(event.vendor)].filter((part)=>part.length>0);return{key:`${event.at}:${index}`,age:relativeAgeMs(event.at,nowMs),kind:event.kind,tail:tail2.join(" \xB7 ")}})}var EVENT_FEED_LIMIT=12,FRAGMENT_MAX=40;var init_issue_events_core=__esm(()=>{init_message_core()});function IssueEventsSection(props){let{theme}=useTheme(),t3=useT(),[rows,setRows]=import_react72.useState(null);return import_react72.useEffect(()=>{let orch=props.orchestrator;if(!orch){setRows([]);return}let live=!0;return orch.recentTaskEvents(props.taskId).then((result)=>{if(live)setRows(eventRows(result.events,Date.now(),EVENT_FEED_LIMIT))}).catch(()=>{if(live)setRows([])}),()=>{live=!1}},[props.orchestrator,props.taskId]),$jsxs("box",{gap:0,children:[$jsx(DialogLabel,{label:t3("kanban.detail.eventsLabel"),focused:!1}),rows===null?$jsx("text",{fg:theme.textMuted,children:t3("kanban.detail.eventsLoading")}):rows.length===0?$jsx("text",{fg:theme.textMuted,children:t3("kanban.detail.eventsNone")}):rows.map((row)=>$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:row.age.padStart(AGE_CELLS)}),$jsx("text",{fg:theme.text,wrapMode:"none",children:row.kind}),row.tail?$jsxs("text",{fg:theme.textMuted,wrapMode:"none",children:["\xB7 ",row.tail]}):null]},row.key))]})}var import_react72,AGE_CELLS=4;var init_issue_detail_parts=__esm(async()=>{init_i18n2();init_issue_events_core();init_jsx_runtime();await __promiseAll([init_theme(),init_dialog_parts()]);import_react72=__toESM(require_react_production(),1)});import{TextAttributes as TextAttributes15}from"@opentui/core";function IssueDetailDialogView(props){let dialog=useDialog(),{theme}=useTheme(),t3=useT(),padX=useDialogPaddingX(),issue=props.issue,create=props.mode==="create",linkedTaskId=!create&&issue.taskId&&issue.taskId!==""?issue.taskId:null,startable=create||!linkedTaskId&&issue.status!=="done",[vendor,setVendor]=import_react74.useState(props.defaultVendor),[placement,setPlacement]=import_react74.useState(ISSUE_CHAT_PLACEMENTS[0]??"worktree"),[jump,setJump]=import_react74.useState(!1),[draftTitle,setDraftTitle]=import_react74.useState(issue.title),[draftBody,setDraftBody]=import_react74.useState(issue.body),[field,setField]=import_react74.useState(create?"title":startable?"workspace":linkedTaskId?"open":"title"),bodyEl=import_react74.useRef(null),fields=startable?["title","description","engine","workspace","jump"]:linkedTaskId?["title","description","open","unlink"]:["title","description"];function insertPlaceholders(paths){if(paths.length===0)return;let next=withImagePlaceholders(bodyEl.current?.plainText??draftBody,paths);bodyEl.current?.setText(next),setDraftBody(next)}usePaste((event)=>{let paths=asAttachmentPaths(new TextDecoder().decode(event.bytes));if(!paths)return;event.preventDefault(),insertPlaceholders(paths)});function pasteClipboardImage(){captureClipboardAttachment().then((path22)=>{if(path22)insertPlaceholders([path22])})}function cycleField(dir){setField((current)=>{let i2=Math.max(0,fields.indexOf(current));return fields[(i2+dir+fields.length)%fields.length]??"title"})}function stepEngine(dir){let list2=props.engines;if(list2.length===0)return;setVendor((v3)=>{let i2=Math.max(0,list2.indexOf(v3));return list2[(i2+dir+list2.length)%list2.length]??v3})}function stepPlacement(dir){setPlacement((p3)=>{let i2=ISSUE_CHAT_PLACEMENTS.indexOf(p3);return ISSUE_CHAT_PLACEMENTS[(i2+dir+ISSUE_CHAT_PLACEMENTS.length)%ISSUE_CHAT_PLACEMENTS.length]??p3})}function draft(){return{title:draftTitle.trim()||issue.title,body:bodyEl.current?.plainText??draftBody}}function requireTitle(){if(draftTitle.trim().length>0)return!0;return setField("title"),!1}function commit(){if(create){if(!requireTitle())return;props.onSubmit({kind:"create",start:{vendor,placement,jump},...draft()})}else if(startable)props.onSubmit({kind:"start",vendor,placement,jump,...draft()});else if(linkedTaskId)props.onSubmit({kind:"open",taskId:linkedTaskId,...draft()});else return;dialog.clear()}function saveOnly(){if(!create||!requireTitle())return;props.onSubmit({kind:"create",start:null,...draft()}),dialog.clear()}function unlink13(){props.onSubmit({kind:"unlink",...draft()}),dialog.clear()}function close(){if(create)props.onCancel();else props.onSubmit({kind:"close",...draft()});dialog.clear()}useBindings(()=>({bindings:[{key:"escape",cmd:()=>close()},{key:"tab",cmd:()=>cycleField(1)},{key:"shift+tab",cmd:()=>cycleField(-1)},{key:"ctrl+return",cmd:()=>commit()},...create?[{key:"ctrl+s",cmd:()=>saveOnly()}]:[],{key:"ctrl+v",cmd:()=>pasteClipboardImage()},...field==="engine"?[{key:"left",cmd:()=>stepEngine(-1)},{key:"right",cmd:()=>stepEngine(1)},{key:"return",cmd:()=>commit()}]:[],...field==="workspace"?[{key:"up",cmd:()=>stepPlacement(-1)},{key:"down",cmd:()=>stepPlacement(1)},{key:"return",cmd:()=>commit()}]:[],...field==="jump"?[{key:"left",cmd:()=>setJump((v3)=>!v3)},{key:"right",cmd:()=>setJump((v3)=>!v3)},{key:"return",cmd:()=>commit()}]:[],...field==="open"?[{key:"return",cmd:()=>commit()}]:[],...field==="unlink"?[{key:"return",cmd:()=>unlink13()}]:[]]}));let statusFg=issue.status==="done"?theme.success:issue.status==="hold"?theme.warning:issue.status==="doing"?theme.accent:theme.textMuted;return $jsxs("box",{paddingLeft:padX,paddingRight:padX,gap:1,children:[create?$jsx(DialogHeader,{title:t3("kanban.detail.newStory"),onClose:()=>close()}):$jsx(DialogHeader,{onClose:()=>close(),children:$jsxs("box",{flexDirection:"row",gap:2,children:[$jsxs("text",{fg:theme.textMuted,attributes:TextAttributes15.BOLD,wrapMode:"none",children:["#",issue.id]}),$jsx("text",{fg:statusFg,attributes:TextAttributes15.BOLD,wrapMode:"none",children:t3(`kanban.detail.status.${issue.status}`)}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("kanban.detail.created",{date:issue.created})}),linkedTaskId?$jsx("text",{fg:theme.accent,wrapMode:"none",children:t3("kanban.detail.linked")}):null]})}),$jsx(DialogSection,{label:t3("kanban.detail.titleLabel"),focused:field==="title",onPress:()=>setField("title"),children:$jsx(DialogField,{focused:field==="title",children:$jsx("input",{value:draftTitle,focused:field==="title",onMouseUp:()=>setField("title"),onInput:(v3)=>setDraftTitle(stripNewlines(v3)),onSubmit:()=>setField("description")})})}),$jsx(DialogSection,{label:t3("kanban.detail.description"),focused:field==="description",hint:t3("kanban.detail.attachHint"),onPress:()=>setField("description"),children:$jsx(DialogField,{focused:field==="description",children:$jsx("textarea",{ref:(el)=>{bodyEl.current=el},initialValue:issue.body,placeholder:t3("kanban.detail.noDescription"),focused:field==="description",height:DESCRIPTION_ROWS,wrapMode:"word",onMouseUp:()=>setField("description"),onContentChange:()=>setDraftBody(bodyEl.current?.plainText??"")})})}),startable?$jsxs("box",{gap:0,children:[$jsx(DialogSection,{label:t3("kanban.detail.engine"),focused:field==="engine",hint:"\u2190/\u2192",children:$jsx(ChipRow,{choices:props.engines,selected:vendor,display:props.engineLabel,paddingBottom:1,onPick:(engine3)=>{setField("engine"),setVendor(engine3)}})}),$jsx(DialogSection,{label:t3("kanban.detail.workspace"),focused:field==="workspace",hint:"\u2191/\u2193",paddingBottom:1,children:$jsx(DialogField,{focused:field==="workspace",children:ISSUE_CHAT_PLACEMENTS.map((option)=>{let active=option===placement;return $jsxs("text",{fg:active?theme.primary:theme.textMuted,attributes:active?TextAttributes15.BOLD:void 0,onMouseUp:()=>{setField("workspace"),setPlacement(option)},children:[active?"\u25B8 ":" ",t3(`kanban.detail.placement.${option}`)]},option)})})}),$jsx(DialogSection,{label:t3("kanban.detail.jumpLabel"),focused:field==="jump",hint:"\u2190/\u2192",paddingBottom:1,children:$jsx(ChipRow,{choices:["stay","follow"],selected:jump?"follow":"stay",display:(option)=>t3(option==="follow"?"kanban.detail.jump.follow":"kanban.detail.jump.stay"),onPick:(option)=>{setField("jump"),setJump(option==="follow")}})}),$jsx(DialogFooter,{children:create?t3("kanban.detail.createLegend"):t3("kanban.detail.startLegend")})]}):linkedTaskId?$jsxs("box",{gap:1,children:[$jsx(DialogSection,{label:t3("kanban.detail.sessionLabel"),focused:field==="open",children:$jsxs("box",{flexDirection:"row",gap:1,children:[$jsx(ChipButton,{label:t3("kanban.detail.openAction"),selected:field==="open",tone:"text",onPress:()=>{setField("open"),commit()}}),$jsx(ChipButton,{label:t3("kanban.detail.unlinkAction"),selected:field==="unlink",onPress:()=>{setField("unlink"),unlink13()}})]})}),$jsx(IssueEventsSection,{taskId:linkedTaskId,orchestrator:props.orchestrator??null}),$jsx(DialogFooter,{children:t3("kanban.detail.openLegend")})]}):$jsx(DialogFooter,{children:t3("kanban.detail.doneNote")})]})}function show2(dialog,opts){return showDialog(dialog,(resolve17)=>$jsx(IssueDetailDialogView,{...opts,onSubmit:(outcome)=>resolve17(outcome),onCancel:()=>resolve17(void 0)}),{size:"large"})}var import_react74,DESCRIPTION_ROWS=8,IssueDetailDialog;var init_issue_detail_dialog=__esm(async()=>{init_issue_chat();init_state();init_attachments();init_i18n2();init_jsx_runtime();await __promiseAll([init_react(),init_theme(),init_keymap(),init_dialog(),init_dialog_parts(),init_issue_detail_parts()]);import_react74=__toESM(require_react_production(),1);IssueDetailDialog={show:show2}});import{TextAttributes as TextAttributes16}from"@opentui/core";function KanbanCard(props){let{theme,transparentBackground:transparentBackground2}=useTheme(),t3=useT(),{issue,column,selected}=props,columnBorder=transparentBackground2?theme.border:theme.borderSubtle,fg=column==="done"?theme.textMuted:theme.text,description=issue.body.trim(),badge=props.activity?ACTIVITY_BADGE[props.activity]:void 0,needsAttention=isBoardAttentionState(props.activity),badgeTone={accent:theme.accent,warning:theme.warning,error:theme.error,success:theme.success};return $jsxs("box",{...FRAME,borderColor:selected?theme.primary:needsAttention?theme.warning:columnBorder,backgroundColor:transparentBackground2?"transparent":theme.backgroundElement,paddingLeft:1,paddingRight:1,marginBottom:1,onMouseUp:()=>selected?props.onOpen():props.onSelect(),children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",children:[$jsx("text",{fg,attributes:TextAttributes16.BOLD,wrapMode:"word",flexShrink:1,children:issue.title}),$jsxs("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,paddingLeft:1,children:["#",issue.id]})]}),$jsx("box",{height:2,overflow:"hidden",children:description?$jsx("text",{fg:theme.textMuted,wrapMode:"word",children:description}):null}),$jsxs("box",{flexDirection:"row",justifyContent:"space-between",children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:issue.created}),badge?$jsx("text",{fg:badgeTone[badge.tone],wrapMode:"none",children:t3(badge.labelKey)}):null]})]})}var ACTIVITY_BADGE;var init_kanban_card=__esm(async()=>{init_issue_board();init_i18n2();init_frame();init_jsx_runtime();await init_theme();ACTIVITY_BADGE={running:{labelKey:"tasks.activity.working",tone:"accent"},turn_complete:{labelKey:"kanban.turnComplete",tone:"success"},rate_limited:{labelKey:"tasks.activity.rateLimited",tone:"warning"},permission_needed:{labelKey:"tasks.activity.permissionNeeded",tone:"warning"},error:{labelKey:"tasks.activity.error",tone:"error"},dead:{labelKey:"tasks.activity.dead",tone:"error"}}});function useKanbanBoards(args2){let[boards,setBoards]=import_react75.useState(null),[reloadTick,setReloadTick]=import_react75.useState(0),[activeRepo,setActiveRepo]=import_react75.useState(null),[selectedId,setSelectedId]=import_react75.useState(null),{orchestrator,focusTask}=args2;return import_react75.useEffect(()=>{let disposed=!1;if(!orchestrator){setBoards([]);return}let repos=[...new Set(orchestrator.listTasks().map((task)=>task.repo))];Promise.all(repos.map((repo)=>orchestrator.listIssues(repo).catch(()=>null))).then((results)=>{if(disposed)return;let next=results.filter((res)=>res!==null);next.sort((a2,b3)=>a2.repoRoot.localeCompare(b3.repoRoot)),setBoards(next);let norm=(p3)=>p3.replace(/^\/private\//,"/").replace(/\/+$/,""),activeId=orchestrator.activeTaskSignal().get(),targetRepo=focusTask?.repo??orchestrator.listTasks().find((task)=>task.id===activeId)?.repo,initialBoard=targetRepo?next.find((board)=>norm(board.repoRoot)===norm(targetRepo)):void 0;setActiveRepo((prev)=>prev??initialBoard?.repoRoot??null);let focusId=focusTask?.id,linked=focusId?initialBoard?.issues.find((issue)=>issue.taskId===focusId):void 0;if(linked)setSelectedId((prev)=>prev??linked.id)});let timer=setInterval(()=>setReloadTick((tick)=>tick+1),POLL_MS3);return()=>{disposed=!0,clearInterval(timer)}},[orchestrator,reloadTick,focusTask]),{boards,activeRepo,setActiveRepo,selectedId,setSelectedId,reload:()=>setReloadTick((tick)=>tick+1)}}var import_react75,POLL_MS3=5000;var init_use_kanban_boards=__esm(()=>{import_react75=__toESM(require_react_production(),1)});import{TextAttributes as TextAttributes17}from"@opentui/core";function KanbanPage(props){let{theme,transparentBackground:transparentBackground2}=useTheme(),columnBorder=transparentBackground2?theme.border:theme.borderSubtle,t3=useT(),dialog=useDialog(),notif=useNotifications();function notifyError(message){notif.notify({kind:"error",taskId:"",tabId:"",title:message})}let narrow=isNarrowWidth(useTerminalDimensions().width),[engines,setEngines]=import_react77.useState([]);import_react77.useEffect(()=>{let disposed=!1;return availableEngineIds().then((ids)=>{if(!disposed)setEngines(ids)}),()=>{disposed=!0}},[]);let{boards,activeRepo,setActiveRepo,selectedId,setSelectedId,reload}=useKanbanBoards({orchestrator:props.orchestrator,focusTask:props.focusTask}),boardList=boards??[],activeIndex=Math.max(0,boardList.findIndex((board2)=>board2.repoRoot===activeRepo)),activeBoard=boardList[activeIndex],repoRoots=boardList.map((board2)=>board2.repoRoot),knownTaskIds=new Set((props.orchestrator?.listTasks()??[]).map((task)=>task.id)),{columns,attentionCount}=applyBoardAttention(activeBoard?buildIssueBoard(activeBoard.issues,knownTaskIds.size===0?void 0:(taskId)=>knownTaskIds.has(taskId)):[],(taskId)=>props.engineStates?.get(taskId)?.state);function cycleProject(delta){if(boardList.length===0)return;let next=(activeIndex+delta+boardList.length)%boardList.length;setActiveRepo(boardList[next]?.repoRoot??null),setSelectedId(null)}function moveCursor(dir){let next=moveBoardSelection(columns,selectedId,dir);if(next!=null)setSelectedId(next)}function moveOrCycle(dir){if(columns.some((column2)=>column2.issues.length>0))moveCursor(dir);else cycleProject(dir==="left"?-1:1)}function openDetail(issue){let board2=activeBoard;if(!board2)return;setSelectedId(issue.id),IssueDetailDialog.show(dialog,{issue,engines,defaultVendor:quickForkDefaultVendor(board2.repoRoot,engines),engineLabel:engineDisplayName,orchestrator:props.orchestrator}).then(async(outcome)=>{if(!outcome)return;let patch={title:outcome.title,body:outcome.body};if(patch.title!==issue.title||patch.body!==issue.body)await props.orchestrator?.mutateIssue(board2.repoRoot,{type:"update",id:issue.id,...patch}).catch((err)=>{console.error("[rove kanban] issue update failed:",err),notifyError(t3("kanban.updateFailed",{id:String(issue.id),error:errorMessage(err)}))}),reload();if(outcome.kind==="open"){props.onOpenTask(outcome.taskId);return}if(outcome.kind==="unlink"){await props.orchestrator?.mutateIssue(board2.repoRoot,{type:"unlink",id:issue.id}).catch((err)=>{console.error("[rove kanban] issue unlink failed:",err),notifyError(t3("kanban.unlinkFailed",{id:String(issue.id),error:errorMessage(err)}))}),reload();return}if(outcome.kind!=="start")return;props.onStartChat({repoRoot:board2.repoRoot,issue:{...issue,...patch},vendor:outcome.vendor,placement:outcome.placement,jump:outcome.jump})})}function openIntake(){let board2=activeBoard;if(!board2)return;let blank={id:board2.nextId,title:"",status:"open",created:new Date().toISOString().slice(0,10),body:""};IssueDetailDialog.show(dialog,{issue:blank,mode:"create",engines,defaultVendor:quickForkDefaultVendor(board2.repoRoot,engines),engineLabel:engineDisplayName}).then(async(outcome)=>{if(!outcome||outcome.kind!=="create")return;let orch=props.orchestrator;if(!orch)return;try{let state=await orch.mutateIssue(board2.repoRoot,{type:"create",title:outcome.title,body:outcome.body});if(reload(),!outcome.start)return;let created=state.issues.find((entry)=>entry.id===board2.nextId)??state.issues.reduce((max,entry)=>max&&max.id>entry.id?max:entry,null);if(!created)return;props.onStartChat({repoRoot:board2.repoRoot,issue:created,vendor:outcome.start.vendor,placement:outcome.start.placement,jump:outcome.start.jump})}catch(err){console.error("[rove kanban] issue create failed:",err),notifyError(t3("kanban.createFailed",{error:errorMessage(err)}))}})}function requestDelete(){let board2=activeBoard,issue=board2?.issues.find((entry)=>entry.id===selectedId);if(!board2||!issue)return;DialogConfirm.show(dialog,t3("kanban.confirmDelete.title",{id:String(issue.id)}),t3("kanban.confirmDelete.body",{title:issue.title}),void 0,void 0,{danger:!0}).then((confirmed)=>{if(!confirmed)return;props.orchestrator?.mutateIssue(board2.repoRoot,{type:"delete",id:issue.id}).then(()=>{setSelectedId(null),reload()}).catch((err)=>{console.error("[rove kanban] issue delete failed:",err),notifyError(t3("kanban.deleteFailed",{id:String(issue.id),error:errorMessage(err)}))})})}useBindings(()=>({enabled:dialog.stack.length===0&&props.focused!==!1,bindings:[...pageCloseBindings(props.onClose),{key:"r",cmd:()=>reload()},{key:"tab",cmd:()=>cycleProject(1)},{key:"up",cmd:()=>moveCursor("up")},{key:"down",cmd:()=>moveCursor("down")},{key:"right",cmd:()=>moveOrCycle("right")},{key:"left",cmd:()=>moveOrCycle("left")},{key:"return",cmd:()=>{let issue=activeBoard?.issues.find((entry)=>entry.id===selectedId);if(issue)openDetail(issue)}},{key:"n",cmd:()=>openIntake()},{key:"d",cmd:()=>requestDelete()}]}));let columnAccent={backlog:theme.textMuted,in_progress:theme.accent,parked:theme.warning,done:theme.success};function card(issue,column2){let activity=(column2==="in_progress"||column2==="parked")&&issue.taskId?props.engineStates?.get(issue.taskId)?.state:void 0;return $jsx(KanbanCard,{issue,column:column2,selected:issue.id===selectedId,activity,onSelect:()=>setSelectedId(issue.id),onOpen:()=>openDetail(issue)},issue.id)}function projectSelector(active){return $jsxs("box",{flexDirection:"row",justifyContent:"space-between",paddingTop:1,children:[$jsxs("box",{flexDirection:"row",onMouseUp:()=>cycleProject(1),children:[$jsx("text",{fg:theme.primary,attributes:TextAttributes17.BOLD,wrapMode:"none",flexShrink:0,children:sidebarProjectLabel(active.repoRoot,repoRoots)}),boardList.length>1?$jsxs("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:[" ",activeIndex+1,"/",boardList.length]}):null,narrow?null:$jsxs("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:1,children:[" ",active.repoRoot]})]}),active.issues.length===0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:1,children:t3("kanban.empty")}):null]})}function column(col,opts){return $jsxs("box",{flexGrow:1,flexBasis:0,...FRAME,borderColor:columnBorder,paddingLeft:1,paddingRight:1,children:[opts?.header??!0?$jsxs("box",{flexDirection:"row",justifyContent:"space-between",children:[$jsxs("text",{fg:columnAccent[col.key],attributes:TextAttributes17.BOLD,wrapMode:"none",children:[t3(COLUMN_LABEL_KEY[col.key])," (",col.issues.length+col.hiddenCount,")"]}),col.key==="in_progress"&&attentionCount>0?$jsx("text",{fg:theme.warning,attributes:TextAttributes17.BOLD,wrapMode:"none",children:t3("kanban.attention",{count:String(attentionCount)})}):null]}):null,$jsxs("scrollbox",{flexGrow:1,paddingTop:1,paddingRight:1,verticalScrollbarOptions:{showArrows:!1,trackOptions:{foregroundColor:"transparent"}},horizontalScrollbarOptions:{visible:!1},children:[col.issues.map((issue)=>card(issue,col.key)),col.issues.length===0&&col.hiddenCount===0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("kanban.columnEmpty")}):null,col.hiddenCount>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("kanban.more",{count:String(col.hiddenCount)})}):null]})]},col.key)}function narrowBoard(){let active=columns.find((col)=>col.issues.some((issue)=>issue.id===selectedId))??columns.find((col)=>col.issues.length>0)??columns[0];if(!active)return null;return $jsxs("box",{flexDirection:"column",flexGrow:1,paddingTop:1,children:[$jsx("box",{flexDirection:"row",gap:2,children:columns.map((col)=>$jsxs("text",{fg:col.key===active.key?columnAccent[col.key]:theme.textMuted,attributes:col.key===active.key?TextAttributes17.BOLD:void 0,wrapMode:"none",onMouseUp:()=>{let first=col.issues[0];if(first)setSelectedId(first.id)},children:[t3(COLUMN_LABEL_KEY[col.key])," (",col.issues.length+col.hiddenCount,")"]},col.key))}),column(active,{header:!1})]})}function board(){if(narrow)return narrowBoard();return $jsx("box",{flexDirection:"row",gap:1,flexGrow:1,paddingTop:1,children:columns.map((col)=>column(col))})}let loading=boards===null;return $jsxs("box",{flexGrow:1,backgroundColor:theme.background,paddingTop:1,paddingBottom:1,paddingLeft:2,paddingRight:2,children:[$jsxs("box",{flexDirection:"row",justifyContent:"space-between",gap:2,children:[$jsx("text",{attributes:TextAttributes17.BOLD,fg:theme.text,wrapMode:"none",flexShrink:0,children:t3("kanban.title")}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:1,children:t3("kanban.hint")})]}),loading?$jsx("text",{fg:theme.textMuted,children:t3("kanban.loading")}):boardList.length===0||!activeBoard?$jsx("text",{fg:theme.textMuted,children:t3("kanban.noRepos")}):$jsxs($Fragment2,{children:[projectSelector(activeBoard),board()]})]})}var import_react77,COLUMN_LABEL_KEY;var init_kanban_page=__esm(async()=>{init_account_detect();init_interactive_command();init_issue_board();init_groups();init_notifications();init_i18n2();init_frame();init_quick_fork();init_use_kanban_boards();init_jsx_runtime();await __promiseAll([init_react(),init_theme(),init_keymap(),init_dialog(),init_dialog_confirm(),init_issue_detail_dialog(),init_kanban_card()]);import_react77=__toESM(require_react_production(),1),COLUMN_LABEL_KEY={backlog:"kanban.column.backlog",in_progress:"kanban.column.inProgress",parked:"kanban.column.parked",done:"kanban.column.done"}});function themeRowId(name){return`theme:${name}`}function languageRowId(locale){return`language:${locale}`}function focusAccentRowId(slot){return`accent:${slot}`}function engineRowId(vendor){return`engine:${vendor}`}function splitStyleRowId(style){return`split-style:${style}`}function prefixTapPresentationRowId(presentation){return`prefix-tap:${presentation}`}function pluginRowId(pluginId){return`plugin:${pluginId}`}function pluginSettingRowId(pluginId,key){return`plugin:${pluginId}:${key}`}function generalRows(input){return[...input.themeNames.map((name)=>({id:themeRowId(name),kind:"theme",name})),...LOCALES.map((l2)=>({id:languageRowId(l2.id),kind:"language",locale:l2.id})),{id:"transparent",kind:"transparent"},...input.focusAccentSlots.map((slot)=>({id:focusAccentRowId(slot),kind:"focusAccent",slot})),...SPLIT_STYLES.map((style)=>({id:splitStyleRowId(style),kind:"splitStyle",style})),{id:"toast",kind:"toast"},{id:"sound",kind:"sound"},{id:"cross-task",kind:"crossTask"},{id:"key-hints",kind:"keyHints"},{id:"zen-default-on",kind:"zenDefaultOn"},{id:"zen-keep-tasks",kind:"zenKeepTasks"},{id:"editor-kind",kind:"editorKind"},{id:"editor-custom",kind:"editorCustom"},{id:"worktree-base",kind:"worktreeBase"},{id:"worktree-custom",kind:"worktreeCustom"},{id:"scrollback-rows",kind:"scrollbackRows"},{id:"tab-strip-hide-single",kind:"tabStripHideSingle"}]}function engineRows(engineList){return[...engineList.map((vendor)=>({id:engineRowId(vendor),kind:"engine",vendor})),{id:"add-engine",kind:"engineAdd"}]}function pluginRows(plugins){return plugins.flatMap(({id,settingKeys})=>[{id:pluginRowId(id),kind:"pluginToggle",pluginId:id},...settingKeys.map((key)=>({id:pluginSettingRowId(id,key),kind:"pluginSetting",pluginId:id,key}))])}function feedbackRows(){return[{id:"feedback-title",kind:"feedbackTitle"},{id:"feedback-body",kind:"feedbackBody"},{id:"feedback-send",kind:"feedbackSend"}]}function keybindingRows(keybindingsFileExists){return[...PREFIX_TAP_PRESENTATIONS.map((presentation)=>({id:prefixTapPresentationRowId(presentation),kind:"prefixTapPresentation",presentation})),...keybindingsFileExists?[]:[{id:"keys-create",kind:"keysCreate"}]]}function devRows(hasDaemon){return[{id:"dev-reset",kind:"devReset"},...hasDaemon?[{id:"dev-restart",kind:"devRestartDaemon"}]:[],{id:"remote-projects",kind:"devRemoteProjects"},{id:"auto-status",kind:"devAutoStatus"},{id:"dispatcher",kind:"devDispatcher"},{id:"composer-gate",kind:"devComposerGate"}]}function sectionRows(section,input){switch(section){case"general":return generalRows(input);case"engines":return engineRows(input.engineList);case"keys":return keybindingRows(input.keybindingsFileExists);case"plugins":return pluginRows(input.plugins);case"feedback":return feedbackRows();case"dev":return devRows(input.hasDaemon)}}function rowIndex(rows,id){return rows.findIndex((row)=>row.id===id)}function rowAt(rows,index){return rows[index]}function generalLabelLayout(width,dialogPadX){let rowCells=width-dialogPadX*2-SECTIONS_SIDEBAR_WIDTH-SECTIONS_COLUMN_GAP-ROW_PADDING_X;if(rowCells>=LABEL_COLUMN_MAX+HINT_MIN_CELLS)return{labelColumn:LABEL_COLUMN_MAX,showHint:!0};if(rowCells>=LABEL_NATURAL_MAX+HINT_MIN_CELLS)return{labelColumn:rowCells-HINT_MIN_CELLS,showHint:!0};return{labelColumn:0,showHint:!1}}var SECTIONS,SECTIONS_SIDEBAR_WIDTH=14,SECTIONS_COLUMN_GAP=2,ROW_PADDING_X=2,LABEL_COLUMN_MAX=30,LABEL_NATURAL_MAX=24,HINT_MIN_CELLS=18;var init_model=__esm(()=>{init_split_style();init_catalog();init_prefix_tap_presentation();SECTIONS=[{id:"general",label:"General"},{id:"engines",label:"Engines"},{id:"plugins",label:"Plugins"},{id:"keys",label:"Keybindings"},{id:"feedback",label:"Feedback"},{id:"dev",label:"Dev"}]});import{existsSync as existsSync34,mkdirSync as mkdirSync19,writeFileSync as writeFileSync16}from"fs";import{dirname as dirname21}from"path";function createKeybindingsFile(path22){if(existsSync34(path22))return!1;return mkdirSync19(dirname21(path22),{recursive:!0}),writeFileSync16(path22,KEYBINDINGS_STARTER),!0}var KEYBINDINGS_STARTER;var init_keybindings_starter=__esm(()=>{init_keymap_dispatch();KEYBINDINGS_STARTER=`# Rove keybindings \u2014 every line below is an example, commented out.
@@ -782,7 +782,7 @@ Follow these steps to create a PR:
782
782
  - Push to origin.
783
783
  - Use \`gh pr create --base {{targetBranch}}\` to create a PR onto the target branch. Keep the title under 80 characters. Keep the description under five sentences. Describe not just changes made in this session but ALL changes since the branch diverged from the target.
784
784
 
785
- If any of these steps fail, ask the user for help.`,PR_INSTRUCTION_RELS;var init_pr_prompt=__esm(()=>{init_git_env();init_background_poll();PR_INSTRUCTION_RELS=[path23.join(".rove","pr-instructions.md"),path23.join(".kobe","pr-instructions.md")]});function createPRAction(deps){let gather=deps.gather??gatherPRPromptState,build=deps.build??buildPRPrompt;return async function(){let wt=deps.worktree,send2=deps.sendToEngineFn.current;if(!wt||!send2)return;let state=await gather(wt);if(state.branch===state.targetBranch)return deps.notifyError(deps.t("files.toast.prOnTargetBranch",{branch:state.branch}));let prompt=await build(wt,state);if(deps.selectedWorktreeRef.current!==wt||deps.sendToEngineFn.current!==send2)return;send2(prompt)}}function requestCreatePR(taskId){pendingCreatePR=taskId}function takeCreatePR(taskId){if(taskId===null||pendingCreatePR!==taskId)return!1;return pendingCreatePR=null,!0}function useCreatePR(args2){let t3=useT();return createPRAction({...args2,t:t3})}var pendingCreatePR=null;var init_use_create_pr=__esm(()=>{init_pr_prompt();init_i18n2()});function useOptimisticEngineState(engineState){let optimisticMarks=useAccessor(optimisticActivityStore),merged=import_react131.useMemo(()=>mergeOptimisticActivity(engineState,optimisticMarks),[engineState,optimisticMarks]);return import_react131.useEffect(()=>{for(let taskId of supersededMarks(engineState,optimisticMarks))clearOptimisticMark(taskId)},[engineState,optimisticMarks]),merged}function useAnsweredTabStates(tabStates){let answers=useAccessor(answeredTabsStore),merged=import_react131.useMemo(()=>mergeAnsweredTabs(tabStates,answers),[tabStates,answers]);return import_react131.useEffect(()=>{clearAnsweredTabs(supersededAnswers(tabStates,answers))},[tabStates,answers]),merged}var import_react131;var init_use_optimistic_engine_state=__esm(()=>{init_use_accessor();init_optimistic_activity();import_react131=__toESM(require_react_production(),1)});function useDaemonState(orchestrator){let tasks=useAccessor(orchestrator.tasksSignal()),activeTaskId=useAccessor(orchestrator.activeTaskSignal()),engineState=useAccessor(orchestrator.engineStateSignal()),engineLifecycle=useAccessor(orchestrator.engineLifecycleSignal()),engineTabState=useAnsweredTabStates(useAccessor(orchestrator.engineTabStatesSignal())),sidebarEngineState=useOptimisticEngineState(engineState),inboxItems=useAccessor(orchestrator.attentionInboxSignal()),taskJobs=useAccessor(orchestrator.taskJobsSignal()),worktreeChanges2=useAccessor(orchestrator.worktreeChangesSignal()),transcriptActivity=useAccessor(orchestrator.transcriptActivitySignal());return{tasks,activeTaskId,engineState,engineLifecycle,engineTabState,sidebarEngineState,inboxItems,taskJobs,worktreeChanges:worktreeChanges2,transcriptActivity}}var init_use_daemon_state=__esm(()=>{init_use_accessor();init_use_optimistic_engine_state()});import{basename as basename14}from"path";function tryPluginFileOpen(absPath){let handler=null;try{handler=findFileHandler(basename14(absPath))}catch{return!1}if(!handler)return!1;let[cmd,...rest]=[...kobeCliInvocation(),"plugin","action","invoke",handler.qualifiedAction,absPath];return spawnDetached(cmd,rest,{onError:(err)=>console.warn(`[rove/plugins] ${handler?.qualifiedAction}: ${String(err)}`)})}var init_plugin_file_open=__esm(()=>{init_invocation();init_settings_env();init_spawn_detached()});import{join as join49}from"path";function useFileOpenActions(deps){let{orch,worktree,selectedId,focus,openEditorTabFn,openDiffTabFn,selectedWorktreeRef}=deps;async function openFileInEditor(relPath){let wt=worktree;if(!wt)return;let abs=join49(wt,relPath);orch.reportUiEvent("file.will-open",selectedId??void 0,{path:abs});let opened=(via)=>orch.reportUiEvent("file.opened",selectedId??void 0,{path:abs,via});if(tryPluginFileOpen(abs))return opened("plugin");let openEditorTab2=openEditorTabFn.current,launch=openEditorTab2?await resolveEditorLaunch(wt,abs):null;if(!launch)return openExternally(abs),opened("external");if(selectedWorktreeRef.current!==wt||openEditorTabFn.current!==openEditorTab2)return;openEditorTab2?.(["sh","-c",launch.command],launch.label),opened("editor"),focus.setFocused("workspace")}function openDiff(relPath,base){let label=pathLeaf(relPath);openDiffTabFn.current?.(relPath,label,base)}return{openFileInEditor,openDiff}}var init_use_file_open_actions=__esm(()=>{init_editor_launch();init_path_helpers();init_open_external2();init_plugin_file_open()});function mentionText(relPath){return`@${relPath}`}function mentionAction(pasteToEngineFn){return(relPath)=>{pasteToEngineFn.current?.(mentionText(relPath))}}function useEditorHandles(opts){let{orchestrator,worktree,selectedId,focus,notifyError}=opts,openEditorTabFn=import_react132.useRef(null),sendToEngineFn=import_react132.useRef(null),pasteToEngineFn=import_react132.useRef(null),openDiffTabFn=import_react132.useRef(null),selectedWorktreeRef=useLatest(worktree),createPR=useCreatePR({worktree,sendToEngineFn,selectedWorktreeRef,notifyError}),{openFileInEditor,openDiff}=useFileOpenActions({orch:orchestrator,worktree,selectedId,focus,openEditorTabFn,openDiffTabFn,selectedWorktreeRef});return{onEditorTabReady:(open2)=>{openEditorTabFn.current=open2},onEngineSendReady:(send2)=>{if(sendToEngineFn.current=send2,takeCreatePR(selectedId))createPR()},onEnginePasteReady:(paste)=>{pasteToEngineFn.current=paste},onDiffTabReady:(open2)=>{openDiffTabFn.current=open2},onOpenFile:openFileInEditor,onOpenDiff:openDiff,onCreatePR:()=>void createPR(),onMention:mentionAction(pasteToEngineFn)}}var import_react132;var init_use_editor_handles=__esm(()=>{init_use_latest();init_use_create_pr();init_use_file_open_actions();import_react132=__toESM(require_react_production(),1)});function itemColor(state,theme){if(state==="permission_needed")return theme.warning;if(state==="turn_complete")return theme.success;if(state==="prompt_deferred")return theme.warning;if(state==="rate_limited")return theme.warning;return theme.error}function itemGlyph(state){if(state==="permission_needed")return"?";if(state==="turn_complete")return"\u2713";if(state==="rate_limited")return"\u25F7";if(state==="dead")return"\u2020";if(state==="prompt_deferred")return"\u2261";return"!"}function itemStateKey(state){if(state==="permission_needed")return"workspace.inbox.state.needsInput";if(state==="turn_complete")return"workspace.inbox.state.done";if(state==="rate_limited")return"workspace.inbox.state.rateLimited";if(state==="dead")return"workspace.inbox.state.dead";if(state==="prompt_deferred")return"workspace.inbox.state.promptDeferred";return"workspace.inbox.state.error"}function quotaResumeNote(state,task,t3){if(state!=="rate_limited")return null;let raw=task?.quotaResume?.resumeAt;if(!raw)return null;let at2=Date.parse(raw);if(!Number.isFinite(at2))return null;return t3("workspace.inbox.resumesAt",{time:new Date(at2).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"})})}import{TextAttributes as TextAttributes34}from"@opentui/core";function taskTabLabel(taskId,tabId,task,kv){let tab=tabId?knownTaskTab(kv,taskId,tabId):void 0;return tab?tabTitleStable(tab,task?.vendor??DEFAULT_TASK_VENDOR):""}function tabLabel(item,task,kv){return{label:taskTabLabel(item.taskId,item.tabId,task,kv),available:isAttentionInboxItemAvailable(item,task,(tabId)=>taskTabExists(kv,item.taskId,tabId))}}function runningBadge(opts){if(opts.activity?.state!=="running")return;let frames=DEFAULT_SPINNER_FRAMES;return{glyph:frames[opts.frame%frames.length]??frames[0]??"\u280B",label:opts.t("workspace.inbox.state.running"),color:opts.theme.textMuted}}function useSpinnerFrame2(active){return import_react134.useSyncExternalStore(active?subscribeSpinnerFrame:NOOP_SUBSCRIBE2,active?spinnerFrameSnapshot:ZERO_FRAME2)}function InboxCard(props){let{theme}=useTheme(),dimensions=useTerminalDimensions(),rowCells=Math.min(80,dimensions.width-2)-6,ageText=` ${props.age}`,fullBadge=props.badge?` ${props.badge.glyph} ${props.badge.label}`:"",cells=(s2)=>[...s2].reduce((n2,ch)=>n2+approxCharCells(ch.codePointAt(0)??0),0),identityRoom=rowCells-cells(ageText)-cells(fullBadge),dropLabel=props.badge!==void 0&&identityRoom<IDENTITY_FLOOR_CELLS,badgeText=props.badge?dropLabel?` ${props.badge.glyph}`:fullBadge:"",identity=truncateEndCells(props.identity,rowCells-cells(ageText)-cells(badgeText),approxCharCells),subtitle=truncateEndCells(props.subtitle,rowCells,approxCharCells),selection=resolveRowSelectionChrome(theme,{cursor:props.active});return $jsxs("box",{flexDirection:"row",paddingRight:2,backgroundColor:selection.backgroundColor,onMouseUp:(event)=>{event.stopPropagation(),props.onOpen()},children:[$jsxs("box",{flexDirection:"column",flexShrink:0,paddingRight:1,children:[$jsx("text",{fg:selection.markerColor,wrapMode:"none",children:selection.marker}),$jsx("text",{fg:selection.markerColor,wrapMode:"none",children:selection.marker})]}),$jsxs("box",{flexDirection:"column",flexBasis:0,flexGrow:1,flexShrink:1,children:[$jsxs("box",{flexDirection:"row",children:[$jsx("text",{fg:theme.text,attributes:props.active?TextAttributes34.BOLD:void 0,wrapMode:"none",flexBasis:0,flexGrow:1,flexShrink:1,children:identity}),props.badge?$jsx("text",{fg:props.badge.color,wrapMode:"none",flexShrink:0,children:badgeText}):null,$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:ageText})]}),$jsx("box",{flexDirection:"row",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexBasis:0,flexGrow:1,flexShrink:1,children:subtitle})})]})]})}function AttentionInboxPane(props){let{theme}=useTheme(),t3=useT(),dimensions=useTerminalDimensions(),[cursor,setCursor]=import_react134.useState(0),[now,setNow]=import_react134.useState(()=>Date.now()),{availableItems}=import_react134.useMemo(()=>partitionAttentionInboxAvailability(props.items,props.tasks,(taskId,tabId)=>taskTabExists(props.kv,taskId,tabId)),[props.items,props.tasks,props.kv]),visits=import_react134.useMemo(()=>readInboxVisits(props.kv),[props.kv]),selectedTabId=props.selectedId?activeTabIdFor(props.selectedId):null,rows=import_react134.useMemo(()=>inboxRows(availableItems,props.tasks,{selectedId:props.selectedId,selectedTabId,visits,tabExists:(taskId,tabId)=>taskTabExists(props.kv,taskId,tabId)}),[availableItems,props.tasks,props.selectedId,selectedTabId,visits,props.kv]),attentionCount=rows.filter((row)=>row.kind==="attention").length,anyRunning=rows.some((row)=>row.kind==="recent"&&props.engineStates?.get(row.task.id)?.state==="running"),spinnerFrame=useSpinnerFrame2(anyRunning),maxVisibleCards=Math.max(1,Math.min(MAX_VISIBLE_CARDS,Math.floor((dimensions.height-DIALOG_CHROME_ROWS)/CARD_ROWS_WITH_GAP))),safeCursor=clampSelectableRow(rows,cursor),{visible,hiddenAbove,hiddenBelow}=windowInboxRows(rows,safeCursor,maxVisibleCards),repos=[...new Set(props.tasks.map((task)=>task.repo))];import_react134.useEffect(()=>{if(cursor!==safeCursor)setCursor(safeCursor)},[cursor,safeCursor]),import_react134.useEffect(()=>{let timer2=setInterval(()=>setNow(Date.now()),AGE_REFRESH_MS);return()=>clearInterval(timer2)},[]);function move(delta){if(rows.length===0)return;setCursor(nextSelectableRow(rows,safeCursor,delta))}function selected(){return rows[safeCursor]}function open2(row){if(row.kind==="recent"){props.onOpenTask(row.task.id,row.tabId);return}if(row.kind!=="attention")return;let task=props.tasks.find((candidate)=>candidate.id===row.item.taskId);props.onOpen(row.item,tabLabel(row.item,task,props.kv).available)}return useBindings(()=>({bindings:bindByIds({"inbox.nav":(_event,slot)=>move((slot??0)%2===0?1:-1),"inbox.open":()=>{let row=selected();if(row)open2(row)},"inbox.delete":()=>{let row=selected();if(row?.kind==="attention")props.onDelete(row.item)}})})),$jsxs("box",{flexDirection:"column",paddingLeft:1,paddingRight:1,children:[$jsxs("box",{flexDirection:"row",flexShrink:0,justifyContent:"space-between",children:[$jsxs("box",{flexDirection:"row",children:[$jsx("text",{fg:theme.focusAccent,attributes:TextAttributes34.BOLD,wrapMode:"none",children:t3("workspace.inbox.title")}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:` ${attentionCount}`})]}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",onMouseUp:props.onClose,children:"esc"})]}),rows.length===0?$jsx("box",{paddingTop:1,paddingBottom:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("workspace.inbox.empty")})}):$jsxs("box",{flexDirection:"column",gap:1,paddingTop:1,paddingBottom:1,children:[hiddenAbove>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:t3("workspace.inbox.more",{count:String(hiddenAbove)})}):null,visible.map((row)=>{let absoluteIndex=rows.indexOf(row);if(row.kind==="header")return $jsx("text",{fg:theme.textMuted,attributes:TextAttributes34.BOLD,wrapMode:"none",flexShrink:0,children:t3(`workspace.inbox.section.${row.section}`)},row.id);let active=absoluteIndex===safeCursor,openRow=()=>{setCursor(absoluteIndex),open2(row)};if(row.kind==="recent"){let project2=sidebarProjectLabel(row.task.repo,repos),title2=row.task.kind==="main"?project2:row.task.title,tab2=taskTabLabel(row.task.id,row.tabId,row.task,props.kv);return $jsx(InboxCard,{identity:tab2?`${project2} \u203A ${tab2}`:title2===project2?project2:`${project2} \u203A ${title2}`,subtitle:title2,badge:runningBadge({activity:props.engineStates?.get(row.task.id),task:row.task,frame:spinnerFrame,theme,t:t3}),age:relativeAgeMs(row.at,now),active,onOpen:openRow},row.id)}let item=row.item,task=props.tasks.find((candidate)=>candidate.id===item.taskId),tab=tabLabel(item,task,props.kv),title=task?.title??item.taskId,resumeNote=quotaResumeNote(item.state,task,t3),project=task?sidebarProjectLabel(task.repo,repos):"";return $jsx(InboxCard,{identity:tab.label?`${project} \u203A ${tab.label}`:project||title,subtitle:resumeNote?`${title} \xB7 ${resumeNote}`:title,badge:{glyph:itemGlyph(item.state),label:t3(itemStateKey(item.state)),color:itemColor(item.state,theme)},age:relativeAgeMs(item.at,now),active,onOpen:openRow},row.id)}),hiddenBelow>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:t3("workspace.inbox.more",{count:String(hiddenBelow)})}):null]}),$jsxs("box",{flexDirection:"row",flexShrink:0,gap:2,paddingTop:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("workspace.inbox.openHint")}),$jsx("text",{fg:theme.textMuted,attributes:selected()?.kind==="attention"?void 0:TextAttributes34.DIM,wrapMode:"none",children:t3("workspace.inbox.clearHint")})]})]})}function AttentionInboxDialog(props){let dialog=useDialog(),kv=useKV(),items=useAccessor(props.orchestrator.attentionInboxSignal()),tasks=useAccessor(props.orchestrator.tasksSignal()),engineStates=useAccessor(props.orchestrator.engineStateSignal());return $jsx(AttentionInboxPane,{items,tasks,kv,selectedId:props.selectedId,engineStates,onOpen:props.onOpen,onOpenTask:props.onOpenTask,onDelete:props.onDelete,onClose:()=>dialog.clear()})}var import_react134,MAX_VISIBLE_CARDS=6,CARD_ROWS_WITH_GAP=3,DIALOG_CHROME_ROWS=12,AGE_REFRESH_MS=30000,IDENTITY_FLOOR_CELLS=16,NOOP_SUBSCRIBE2=()=>()=>{},ZERO_FRAME2=()=>0;var init_AttentionInboxPane=__esm(async()=>{init_spinner_frames();init_message_core();init_spinner_frame_store();init_groups();init_terminal_tabs_core();init_task();init_keybindings2();init_kv();init_i18n2();init_use_accessor();init_attention_inbox_core();init_terminal_tabs_shared();init_jsx_runtime();await __promiseAll([init_react(),init_theme(),init_keymap(),init_dialog()]);import_react134=__toESM(require_react_production(),1);AttentionInboxDialog.show=(dialog,props)=>{dialog.replace(()=>$jsx(AttentionInboxDialog,{...props})),dialog.setSize("medium"),dialog.setPlacement("upper-fifth")}});async function insertDeferredPrompt(args2){let outcome=await args2.orch.releaseDeferredPrompt(args2.deferredId);if(outcome==="inserted"||outcome==="deferred-again"||outcome==="unavailable")return outcome;if(outcome==="in-flight")return"deferred-again";if(outcome==="missing")return"missing";throw Error(`deferred prompt ${args2.deferredId} was delivered but cleanup is still pending`)}function notifyInboxRpcFailure(request,action,notifyError){request.catch((err)=>notifyError(`Couldn't ${action}: ${errorMessage(err)}`))}var init_inbox_rpc_errors=()=>{};function requestInboxItemOpen(item,available,rpc,notifyError){return notifyInboxRpcFailure(rpc.dismissAttention(item.taskId,item.tabId,item.at),"dismiss",notifyError),available}var init_inbox_open_action=__esm(()=>{init_inbox_rpc_errors()});function episodeKey(item){return`${attentionInboxKey(item)}\x00${item.at}`}function episodeSignature(items){return items.map(episodeKey).sort().join(`
785
+ If any of these steps fail, ask the user for help.`,PR_INSTRUCTION_RELS;var init_pr_prompt=__esm(()=>{init_git_env();init_background_poll();PR_INSTRUCTION_RELS=[path23.join(".rove","pr-instructions.md"),path23.join(".kobe","pr-instructions.md")]});function createPRAction(deps){let gather=deps.gather??gatherPRPromptState,build=deps.build??buildPRPrompt;return async function(){let wt=deps.worktree,send2=deps.sendToEngineFn.current;if(!wt||!send2)return;let state=await gather(wt);if(state.branch===state.targetBranch)return deps.notifyError(deps.t("files.toast.prOnTargetBranch",{branch:state.branch}));let prompt=await build(wt,state);if(deps.selectedWorktreeRef.current!==wt||deps.sendToEngineFn.current!==send2)return;send2(prompt)}}function requestCreatePR(taskId){pendingCreatePR=taskId}function takeCreatePR(taskId){if(taskId===null||pendingCreatePR!==taskId)return!1;return pendingCreatePR=null,!0}function useCreatePR(args2){let t3=useT();return createPRAction({...args2,t:t3})}var pendingCreatePR=null;var init_use_create_pr=__esm(()=>{init_pr_prompt();init_i18n2()});function useOptimisticEngineState(engineState){let optimisticMarks=useAccessor(optimisticActivityStore),merged=import_react131.useMemo(()=>mergeOptimisticActivity(engineState,optimisticMarks),[engineState,optimisticMarks]);return import_react131.useEffect(()=>{for(let taskId of supersededMarks(engineState,optimisticMarks))clearOptimisticMark(taskId)},[engineState,optimisticMarks]),merged}function useAnsweredTabStates(tabStates){let answers=useAccessor(answeredTabsStore),merged=import_react131.useMemo(()=>mergeAnsweredTabs(tabStates,answers),[tabStates,answers]);return import_react131.useEffect(()=>{clearAnsweredTabs(supersededAnswers(tabStates,answers))},[tabStates,answers]),merged}var import_react131;var init_use_optimistic_engine_state=__esm(()=>{init_use_accessor();init_optimistic_activity();import_react131=__toESM(require_react_production(),1)});function useDaemonState(orchestrator){let tasks=useAccessor(orchestrator.tasksSignal()),activeTaskId=useAccessor(orchestrator.activeTaskSignal()),engineState=useAccessor(orchestrator.engineStateSignal()),engineLifecycle=useAccessor(orchestrator.engineLifecycleSignal()),engineTabState=useAnsweredTabStates(useAccessor(orchestrator.engineTabStatesSignal())),sidebarEngineState=useOptimisticEngineState(engineState),inboxItems=useAccessor(orchestrator.attentionInboxSignal()),taskJobs=useAccessor(orchestrator.taskJobsSignal()),worktreeChanges2=useAccessor(orchestrator.worktreeChangesSignal()),transcriptActivity=useAccessor(orchestrator.transcriptActivitySignal());return{tasks,activeTaskId,engineState,engineLifecycle,engineTabState,sidebarEngineState,inboxItems,taskJobs,worktreeChanges:worktreeChanges2,transcriptActivity}}var init_use_daemon_state=__esm(()=>{init_use_accessor();init_use_optimistic_engine_state()});import{basename as basename14}from"path";function tryPluginFileOpen(absPath){let handler=null;try{handler=findFileHandler(basename14(absPath))}catch{return!1}if(!handler)return!1;let[cmd,...rest]=[...roveCliInvocation(),"plugin","action","invoke",handler.qualifiedAction,absPath];return spawnDetached(cmd,rest,{onError:(err)=>console.warn(`[rove/plugins] ${handler?.qualifiedAction}: ${String(err)}`)})}var init_plugin_file_open=__esm(()=>{init_invocation();init_settings_env();init_spawn_detached()});import{join as join49}from"path";function useFileOpenActions(deps){let{orch,worktree,selectedId,focus,openEditorTabFn,openDiffTabFn,selectedWorktreeRef}=deps;async function openFileInEditor(relPath){let wt=worktree;if(!wt)return;let abs=join49(wt,relPath);orch.reportUiEvent("file.will-open",selectedId??void 0,{path:abs});let opened=(via)=>orch.reportUiEvent("file.opened",selectedId??void 0,{path:abs,via});if(tryPluginFileOpen(abs))return opened("plugin");let openEditorTab2=openEditorTabFn.current,launch=openEditorTab2?await resolveEditorLaunch(wt,abs):null;if(!launch)return openExternally(abs),opened("external");if(selectedWorktreeRef.current!==wt||openEditorTabFn.current!==openEditorTab2)return;openEditorTab2?.(["sh","-c",launch.command],launch.label),opened("editor"),focus.setFocused("workspace")}function openDiff(relPath,base){let label=pathLeaf(relPath);openDiffTabFn.current?.(relPath,label,base)}return{openFileInEditor,openDiff}}var init_use_file_open_actions=__esm(()=>{init_editor_launch();init_path_helpers();init_open_external2();init_plugin_file_open()});function mentionText(relPath){return`@${relPath}`}function mentionAction(pasteToEngineFn){return(relPath)=>{pasteToEngineFn.current?.(mentionText(relPath))}}function useEditorHandles(opts){let{orchestrator,worktree,selectedId,focus,notifyError}=opts,openEditorTabFn=import_react132.useRef(null),sendToEngineFn=import_react132.useRef(null),pasteToEngineFn=import_react132.useRef(null),openDiffTabFn=import_react132.useRef(null),selectedWorktreeRef=useLatest(worktree),createPR=useCreatePR({worktree,sendToEngineFn,selectedWorktreeRef,notifyError}),{openFileInEditor,openDiff}=useFileOpenActions({orch:orchestrator,worktree,selectedId,focus,openEditorTabFn,openDiffTabFn,selectedWorktreeRef});return{onEditorTabReady:(open2)=>{openEditorTabFn.current=open2},onEngineSendReady:(send2)=>{if(sendToEngineFn.current=send2,takeCreatePR(selectedId))createPR()},onEnginePasteReady:(paste)=>{pasteToEngineFn.current=paste},onDiffTabReady:(open2)=>{openDiffTabFn.current=open2},onOpenFile:openFileInEditor,onOpenDiff:openDiff,onCreatePR:()=>void createPR(),onMention:mentionAction(pasteToEngineFn)}}var import_react132;var init_use_editor_handles=__esm(()=>{init_use_latest();init_use_create_pr();init_use_file_open_actions();import_react132=__toESM(require_react_production(),1)});function itemColor(state,theme){if(state==="permission_needed")return theme.warning;if(state==="turn_complete")return theme.success;if(state==="prompt_deferred")return theme.warning;if(state==="rate_limited")return theme.warning;return theme.error}function itemGlyph(state){if(state==="permission_needed")return"?";if(state==="turn_complete")return"\u2713";if(state==="rate_limited")return"\u25F7";if(state==="dead")return"\u2020";if(state==="prompt_deferred")return"\u2261";return"!"}function itemStateKey(state){if(state==="permission_needed")return"workspace.inbox.state.needsInput";if(state==="turn_complete")return"workspace.inbox.state.done";if(state==="rate_limited")return"workspace.inbox.state.rateLimited";if(state==="dead")return"workspace.inbox.state.dead";if(state==="prompt_deferred")return"workspace.inbox.state.promptDeferred";return"workspace.inbox.state.error"}function quotaResumeNote(state,task,t3){if(state!=="rate_limited")return null;let raw=task?.quotaResume?.resumeAt;if(!raw)return null;let at2=Date.parse(raw);if(!Number.isFinite(at2))return null;return t3("workspace.inbox.resumesAt",{time:new Date(at2).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"})})}import{TextAttributes as TextAttributes34}from"@opentui/core";function taskTabLabel(taskId,tabId,task,kv){let tab=tabId?knownTaskTab(kv,taskId,tabId):void 0;return tab?tabTitleStable(tab,task?.vendor??DEFAULT_TASK_VENDOR):""}function tabLabel(item,task,kv){return{label:taskTabLabel(item.taskId,item.tabId,task,kv),available:isAttentionInboxItemAvailable(item,task,(tabId)=>taskTabExists(kv,item.taskId,tabId))}}function runningBadge(opts){if(opts.activity?.state!=="running")return;let frames=DEFAULT_SPINNER_FRAMES;return{glyph:frames[opts.frame%frames.length]??frames[0]??"\u280B",label:opts.t("workspace.inbox.state.running"),color:opts.theme.textMuted}}function useSpinnerFrame2(active){return import_react134.useSyncExternalStore(active?subscribeSpinnerFrame:NOOP_SUBSCRIBE2,active?spinnerFrameSnapshot:ZERO_FRAME2)}function InboxCard(props){let{theme}=useTheme(),dimensions=useTerminalDimensions(),rowCells=Math.min(80,dimensions.width-2)-6,ageText=` ${props.age}`,fullBadge=props.badge?` ${props.badge.glyph} ${props.badge.label}`:"",cells=(s2)=>[...s2].reduce((n2,ch)=>n2+approxCharCells(ch.codePointAt(0)??0),0),identityRoom=rowCells-cells(ageText)-cells(fullBadge),dropLabel=props.badge!==void 0&&identityRoom<IDENTITY_FLOOR_CELLS,badgeText=props.badge?dropLabel?` ${props.badge.glyph}`:fullBadge:"",identity=truncateEndCells(props.identity,rowCells-cells(ageText)-cells(badgeText),approxCharCells),subtitle=truncateEndCells(props.subtitle,rowCells,approxCharCells),selection=resolveRowSelectionChrome(theme,{cursor:props.active});return $jsxs("box",{flexDirection:"row",paddingRight:2,backgroundColor:selection.backgroundColor,onMouseUp:(event)=>{event.stopPropagation(),props.onOpen()},children:[$jsxs("box",{flexDirection:"column",flexShrink:0,paddingRight:1,children:[$jsx("text",{fg:selection.markerColor,wrapMode:"none",children:selection.marker}),$jsx("text",{fg:selection.markerColor,wrapMode:"none",children:selection.marker})]}),$jsxs("box",{flexDirection:"column",flexBasis:0,flexGrow:1,flexShrink:1,children:[$jsxs("box",{flexDirection:"row",children:[$jsx("text",{fg:theme.text,attributes:props.active?TextAttributes34.BOLD:void 0,wrapMode:"none",flexBasis:0,flexGrow:1,flexShrink:1,children:identity}),props.badge?$jsx("text",{fg:props.badge.color,wrapMode:"none",flexShrink:0,children:badgeText}):null,$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:ageText})]}),$jsx("box",{flexDirection:"row",children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexBasis:0,flexGrow:1,flexShrink:1,children:subtitle})})]})]})}function AttentionInboxPane(props){let{theme}=useTheme(),t3=useT(),dimensions=useTerminalDimensions(),[cursor,setCursor]=import_react134.useState(0),[now,setNow]=import_react134.useState(()=>Date.now()),{availableItems}=import_react134.useMemo(()=>partitionAttentionInboxAvailability(props.items,props.tasks,(taskId,tabId)=>taskTabExists(props.kv,taskId,tabId)),[props.items,props.tasks,props.kv]),visits=import_react134.useMemo(()=>readInboxVisits(props.kv),[props.kv]),selectedTabId=props.selectedId?activeTabIdFor(props.selectedId):null,rows=import_react134.useMemo(()=>inboxRows(availableItems,props.tasks,{selectedId:props.selectedId,selectedTabId,visits,tabExists:(taskId,tabId)=>taskTabExists(props.kv,taskId,tabId)}),[availableItems,props.tasks,props.selectedId,selectedTabId,visits,props.kv]),attentionCount=rows.filter((row)=>row.kind==="attention").length,anyRunning=rows.some((row)=>row.kind==="recent"&&props.engineStates?.get(row.task.id)?.state==="running"),spinnerFrame=useSpinnerFrame2(anyRunning),maxVisibleCards=Math.max(1,Math.min(MAX_VISIBLE_CARDS,Math.floor((dimensions.height-DIALOG_CHROME_ROWS)/CARD_ROWS_WITH_GAP))),safeCursor=clampSelectableRow(rows,cursor),{visible,hiddenAbove,hiddenBelow}=windowInboxRows(rows,safeCursor,maxVisibleCards),repos=[...new Set(props.tasks.map((task)=>task.repo))];import_react134.useEffect(()=>{if(cursor!==safeCursor)setCursor(safeCursor)},[cursor,safeCursor]),import_react134.useEffect(()=>{let timer2=setInterval(()=>setNow(Date.now()),AGE_REFRESH_MS);return()=>clearInterval(timer2)},[]);function move(delta){if(rows.length===0)return;setCursor(nextSelectableRow(rows,safeCursor,delta))}function selected(){return rows[safeCursor]}function open2(row){if(row.kind==="recent"){props.onOpenTask(row.task.id,row.tabId);return}if(row.kind!=="attention")return;let task=props.tasks.find((candidate)=>candidate.id===row.item.taskId);props.onOpen(row.item,tabLabel(row.item,task,props.kv).available)}return useBindings(()=>({bindings:bindByIds({"inbox.nav":(_event,slot)=>move((slot??0)%2===0?1:-1),"inbox.open":()=>{let row=selected();if(row)open2(row)},"inbox.delete":()=>{let row=selected();if(row?.kind==="attention")props.onDelete(row.item)}})})),$jsxs("box",{flexDirection:"column",paddingLeft:1,paddingRight:1,children:[$jsxs("box",{flexDirection:"row",flexShrink:0,justifyContent:"space-between",children:[$jsxs("box",{flexDirection:"row",children:[$jsx("text",{fg:theme.focusAccent,attributes:TextAttributes34.BOLD,wrapMode:"none",children:t3("workspace.inbox.title")}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:` ${attentionCount}`})]}),$jsx("text",{fg:theme.textMuted,wrapMode:"none",onMouseUp:props.onClose,children:"esc"})]}),rows.length===0?$jsx("box",{paddingTop:1,paddingBottom:1,children:$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("workspace.inbox.empty")})}):$jsxs("box",{flexDirection:"column",gap:1,paddingTop:1,paddingBottom:1,children:[hiddenAbove>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:t3("workspace.inbox.more",{count:String(hiddenAbove)})}):null,visible.map((row)=>{let absoluteIndex=rows.indexOf(row);if(row.kind==="header")return $jsx("text",{fg:theme.textMuted,attributes:TextAttributes34.BOLD,wrapMode:"none",flexShrink:0,children:t3(`workspace.inbox.section.${row.section}`)},row.id);let active=absoluteIndex===safeCursor,openRow=()=>{setCursor(absoluteIndex),open2(row)};if(row.kind==="recent"){let project2=sidebarProjectLabel(row.task.repo,repos),title2=row.task.kind==="main"?project2:row.task.title,tab2=taskTabLabel(row.task.id,row.tabId,row.task,props.kv);return $jsx(InboxCard,{identity:tab2?`${project2} \u203A ${tab2}`:title2===project2?project2:`${project2} \u203A ${title2}`,subtitle:title2,badge:runningBadge({activity:props.engineStates?.get(row.task.id),task:row.task,frame:spinnerFrame,theme,t:t3}),age:relativeAgeMs(row.at,now),active,onOpen:openRow},row.id)}let item=row.item,task=props.tasks.find((candidate)=>candidate.id===item.taskId),tab=tabLabel(item,task,props.kv),title=task?.title??item.taskId,resumeNote=quotaResumeNote(item.state,task,t3),project=task?sidebarProjectLabel(task.repo,repos):"";return $jsx(InboxCard,{identity:tab.label?`${project} \u203A ${tab.label}`:project||title,subtitle:resumeNote?`${title} \xB7 ${resumeNote}`:title,badge:{glyph:itemGlyph(item.state),label:t3(itemStateKey(item.state)),color:itemColor(item.state,theme)},age:relativeAgeMs(item.at,now),active,onOpen:openRow},row.id)}),hiddenBelow>0?$jsx("text",{fg:theme.textMuted,wrapMode:"none",flexShrink:0,children:t3("workspace.inbox.more",{count:String(hiddenBelow)})}):null]}),$jsxs("box",{flexDirection:"row",flexShrink:0,gap:2,paddingTop:1,children:[$jsx("text",{fg:theme.textMuted,wrapMode:"none",children:t3("workspace.inbox.openHint")}),$jsx("text",{fg:theme.textMuted,attributes:selected()?.kind==="attention"?void 0:TextAttributes34.DIM,wrapMode:"none",children:t3("workspace.inbox.clearHint")})]})]})}function AttentionInboxDialog(props){let dialog=useDialog(),kv=useKV(),items=useAccessor(props.orchestrator.attentionInboxSignal()),tasks=useAccessor(props.orchestrator.tasksSignal()),engineStates=useAccessor(props.orchestrator.engineStateSignal());return $jsx(AttentionInboxPane,{items,tasks,kv,selectedId:props.selectedId,engineStates,onOpen:props.onOpen,onOpenTask:props.onOpenTask,onDelete:props.onDelete,onClose:()=>dialog.clear()})}var import_react134,MAX_VISIBLE_CARDS=6,CARD_ROWS_WITH_GAP=3,DIALOG_CHROME_ROWS=12,AGE_REFRESH_MS=30000,IDENTITY_FLOOR_CELLS=16,NOOP_SUBSCRIBE2=()=>()=>{},ZERO_FRAME2=()=>0;var init_AttentionInboxPane=__esm(async()=>{init_spinner_frames();init_message_core();init_spinner_frame_store();init_groups();init_terminal_tabs_core();init_task();init_keybindings2();init_kv();init_i18n2();init_use_accessor();init_attention_inbox_core();init_terminal_tabs_shared();init_jsx_runtime();await __promiseAll([init_react(),init_theme(),init_keymap(),init_dialog()]);import_react134=__toESM(require_react_production(),1);AttentionInboxDialog.show=(dialog,props)=>{dialog.replace(()=>$jsx(AttentionInboxDialog,{...props})),dialog.setSize("medium"),dialog.setPlacement("upper-fifth")}});async function insertDeferredPrompt(args2){let outcome=await args2.orch.releaseDeferredPrompt(args2.deferredId);if(outcome==="inserted"||outcome==="deferred-again"||outcome==="unavailable")return outcome;if(outcome==="in-flight")return"deferred-again";if(outcome==="missing")return"missing";throw Error(`deferred prompt ${args2.deferredId} was delivered but cleanup is still pending`)}function notifyInboxRpcFailure(request,action,notifyError){request.catch((err)=>notifyError(`Couldn't ${action}: ${errorMessage(err)}`))}var init_inbox_rpc_errors=()=>{};function requestInboxItemOpen(item,available,rpc,notifyError){return notifyInboxRpcFailure(rpc.dismissAttention(item.taskId,item.tabId,item.at),"dismiss",notifyError),available}var init_inbox_open_action=__esm(()=>{init_inbox_rpc_errors()});function episodeKey(item){return`${attentionInboxKey(item)}\x00${item.at}`}function episodeSignature(items){return items.map(episodeKey).sort().join(`
786
786
  `)}function useInboxHost(args2){let{orchestrator:orch}=args2,t3=useT(),{availableItems,unavailableItems}=import_react135.useMemo(()=>partitionAttentionInboxAvailability(args2.items,args2.tasks,(taskId,tabId)=>taskTabExists(args2.kv,taskId,tabId)),[args2.items,args2.tasks,args2.kv]),viewingResolved=args2.selectedId?new Set(visitResolvedEpisodes(availableItems,{taskId:args2.selectedId,tabId:activeTabIdFor(args2.selectedId)}).map(episodeKey)):null,visibleItems=viewingResolved&&viewingResolved.size>0?availableItems.filter((item)=>!viewingResolved.has(episodeKey(item))):availableItems,counts=attentionInboxCounts(visibleItems),notifyErrorRef=useLatest(args2.notifyError),unavailableItemsRef=useLatest(unavailableItems),unavailableSignature=episodeSignature(unavailableItems),attemptedUnavailable=import_react135.useRef(new Set);import_react135.useEffect(()=>{let currentItems=unavailableItemsRef.current;if(episodeSignature(currentItems)!==unavailableSignature)return;let currentKeys=new Set(currentItems.map(episodeKey));for(let attempted of attemptedUnavailable.current)if(!currentKeys.has(attempted))attemptedUnavailable.current.delete(attempted);for(let item of currentItems){let key=episodeKey(item);if(attemptedUnavailable.current.has(key))continue;attemptedUnavailable.current.add(key),notifyInboxRpcFailure(orch.dismissAttention(item.taskId,item.tabId,item.at),"dismiss",notifyErrorRef.current)}},[unavailableSignature,orch]);async function releaseDeferredPrompt(item,deferredId){try{let outcome=await insertDeferredPrompt({orch,deferredId});if(outcome==="missing"){notifyInboxRpcFailure(orch.dismissAttention(item.taskId,item.tabId,item.at),"dismiss",args2.notifyError);return}if(outcome==="deferred-again")args2.notifyInfo(t3("workspace.inbox.deferredStillQueued"));else if(outcome==="unavailable")args2.notifyInfo(t3("workspace.inbox.deferredUnavailable"))}catch{args2.notifyError(t3("workspace.inbox.deferredInsertFailed"))}}function openItem(item,knownAvailable){let task=orch.getTask(item.taskId),available=knownAvailable??isAttentionInboxItemAvailable(item,task,(tabId)=>taskTabExists(args2.kv,item.taskId,tabId)),deferredId=item.detail?.deferredPrompt?.id;if(item.state==="prompt_deferred"&&item.tabId&&deferredId){if(args2.dialog.stack.length>0)args2.dialog.clear({refocus:!1});args2.selectTask(item.taskId),requestTabActivation(item.taskId,item.tabId),args2.focusWorkspace(),releaseDeferredPrompt(item,deferredId);return}if(!requestInboxItemOpen(item,available,orch,args2.notifyError))return;if(args2.dialog.stack.length>0)args2.dialog.clear({refocus:!1});if(args2.selectTask(item.taskId),item.tabId)requestTabActivation(item.taskId,item.tabId);args2.focusWorkspace()}function openTask(taskId,tabId){if(args2.dialog.stack.length>0)args2.dialog.clear({refocus:!1});if(args2.selectTask(taskId),tabId)requestTabActivation(taskId,tabId);args2.focusWorkspace()}function show11(){AttentionInboxDialog.show(args2.dialog,{orchestrator:orch,selectedId:args2.selectedId,onOpen:openItem,onOpenTask:openTask,onDelete:(item)=>notifyInboxRpcFailure(orch.dismissAttention(item.taskId,item.tabId,item.at),"dismiss",args2.notifyError)})}let availableItemsRef=useLatest(availableItems),availableSignature=episodeSignature(availableItems),selectedIdRef=useLatest(args2.selectedId),attemptedResolved=import_react135.useRef(new Set),resolveEpisodes=import_react135.useCallback((items,visit)=>{let currentKeys=new Set(items.map(episodeKey));for(let attempted of attemptedResolved.current)if(!currentKeys.has(attempted))attemptedResolved.current.delete(attempted);for(let item of visitResolvedEpisodes(items,visit)){let key=episodeKey(item);if(attemptedResolved.current.has(key))continue;attemptedResolved.current.add(key),notifyInboxRpcFailure(orch.dismissAttention(item.taskId,item.tabId,item.at),"dismiss",notifyErrorRef.current)}},[orch]);function resolveVisited(taskId,tabId){resolveEpisodes(availableItemsRef.current,{taskId,tabId}),writeInboxVisit(args2.kv,{taskId,tabId,at:Date.now()})}return import_react135.useEffect(()=>{let currentItems=availableItemsRef.current;if(episodeSignature(currentItems)!==availableSignature)return;let selectedId=selectedIdRef.current;if(!selectedId)return;let activeTab=activeTabIdFor(selectedId);if(!activeTab)return;resolveEpisodes(currentItems,{taskId:selectedId,tabId:activeTab})},[availableSignature,resolveEpisodes]),{availableItems:visibleItems,counts,openItem,show:show11,resolveVisited}}var import_react135;var init_use_inbox_host=__esm(async()=>{init_i18n2();init_use_latest();init_attention_inbox_core();init_inbox_open_action();init_inbox_rpc_errors();init_terminal_tabs_shared();await init_AttentionInboxPane();import_react135=__toESM(require_react_production(),1)});function buildIssueChatBackgroundSpawn(input){let base=interactiveEngineCommand(input.vendor),{sessionId}=withPinnedSessionId(base,input.vendor),fresh=initialTabs(),tab={...fresh.tabs[0],sessionId},state={...fresh,tabs:[tab]},spawn14=engineTabSpawnFor(state,tab,base,{live:!1,shell:input.shell??defaultShell(),prompt:issueWorktreePrompt2(input.issue,input.api),task:{id:input.taskId,kind:"task",vendor:input.vendor,repo:input.repoRoot},worktreePath:input.worktreePath});return{ptyKey:tabPtyKey(input.taskId,tab.id),command:spawn14.command,initialInput:spawn14.initialInput,firstMessage:spawn14.firstMessage,engineBin:spawn14.engineBin,tabsSnapshot:setTabSpawned(state,tab.id,!0)}}function buildIssueTabSpawn(input){let base=interactiveEngineCommand(input.vendor),fresh={...input.tab,spawned:!1},synthetic={tabs:[fresh],activeId:fresh.id,nextOrdinal:fresh.ordinal+1},spawn14=engineTabSpawnFor(synthetic,fresh,base,{live:!1,shell:input.shell??defaultShell(),prompt:input.prompt,task:{id:input.taskId,kind:"main",vendor:input.vendor,repo:input.repoRoot},worktreePath:input.worktreePath});return{ptyKey:tabPtyKey(input.taskId,fresh.id),command:spawn14.command,firstMessage:spawn14.firstMessage,engineBin:spawn14.engineBin}}var init_issue_chat_spawn=__esm(()=>{init_engine_presets();init_interactive_command();init_issue_chat();init_pty_types();init_terminal_tabs_core()});function useIssueChat(orch,hooks){let t3=useT(),kv=useKV();async function enter(taskId){hooks.closeKanban(),hooks.selectTask(taskId),await hooks.enterTask(taskId)}async function finish2(request,enterTaskId){if(request.jump)await enter(enterTaskId);else hooks.notifyInfo(t3("kanban.detail.startedBackground",{title:issueChatTaskTitle(request.issue)}))}async function startProjectTab(request,api){let{repoRoot,issue,vendor}=request,main=await orch.ensureMainTask(repoRoot);await orch.setVendor(main.id,vendor),await orch.mutateIssue(repoRoot,{type:"setStatus",id:issue.id,status:"doing"}).catch((err)=>{console.error("[rove kanban] issue setStatus failed:",err),hooks.notifyError(t3("kanban.statusFailed",{id:String(issue.id),error:errorMessage(err)}))});let{tab}=appendBackgroundEngineTab(kv,main.id,defaultShell(),{vendor}),spawn14=buildIssueTabSpawn({taskId:main.id,repoRoot,worktreePath:main.worktreePath,tab,vendor,prompt:issueProjectPrompt2(issue,api)});getDefaultPtyRegistry().acquire(spawn14.ptyKey,main.worktreePath,{command:spawn14.command,firstMessage:spawn14.firstMessage,engineBin:spawn14.engineBin}),await finish2(request,main.id)}async function startWorktreeTask(request,api){let{repoRoot,issue,vendor}=request;setRepoLastActiveVendor(repoRoot,vendor),addSavedRepo(repoRoot);let task=await orch.createTask({repo:repoRoot,title:issueChatTaskTitle(issue),vendor});await orch.mutateIssue(repoRoot,{type:"link",id:issue.id,taskId:task.id}).catch((err)=>{console.error("[rove kanban] issue link failed:",err),hooks.notifyError(t3("kanban.linkFailed",{id:String(issue.id),error:errorMessage(err)}))});let worktreePath=await orch.ensureWorktree(task.id),spawn14=buildIssueChatBackgroundSpawn({issue,taskId:task.id,repoRoot,worktreePath,vendor,api});return getDefaultPtyRegistry().acquire(spawn14.ptyKey,worktreePath,{command:spawn14.command,initialInput:spawn14.initialInput,firstMessage:spawn14.firstMessage,engineBin:spawn14.engineBin}),kv.set(terminalTabsKey(task.id),spawn14.tabsSnapshot),{task,worktreePath,tab:spawn14.tabsSnapshot.tabs[0]}}async function start(request){try{let api=kobeApiInvocation();if(request.placement==="project"){await startProjectTab(request,api);return}let{task,worktreePath,tab}=await startWorktreeTask(request,api);if(request.placement==="projectWorktree"){let main=await orch.ensureMainTask(request.repoRoot);appendBackgroundEngineTab(kv,main.id,defaultShell(),{vendor:request.vendor,sessionId:tab.sessionId??null,ptyTask:{id:task.id,worktree:worktreePath}}),await finish2(request,main.id);return}await finish2(request,task.id)}catch(err){hooks.notifyError(`Couldn't start issue chat: ${errorMessage(err)}`)}}return{start}}var init_use_issue_chat=__esm(()=>{init_interactive_command();init_issue_chat();init_repos();init_vendor_prefs();init_pty_types();init_registry3();init_issue_chat_spawn();init_kv();init_i18n2();init_terminal_tabs_shared()});import{readlinkSync as readlinkSync2}from"fs";function parseLsofCwd(output){for(let line of output.split(`
787
787
  `))if(line.startsWith("n")&&line.length>1)return line.slice(1);return null}async function processCwd(pid,lsof=lsofCwd){if(!Number.isInteger(pid)||pid<=0)return null;try{return readlinkSync2(`/proc/${pid}/cwd`)}catch{}try{return parseLsofCwd(await lsof(pid))}catch{return null}}var lsofCwd=async(pid)=>{let proc=Bun.spawn(["lsof","-a","-p",String(pid),"-d","cwd","-Fn"],{stdout:"pipe",stderr:"ignore"});return await new Response(proc.stdout).text()};var init_process_cwd=()=>{};function decideScratchAdopt(input){if(!input.repoRoot||!input.harnessLive)return{kind:"stay"};let owners=input.ownerTasks.filter((task)=>task.dir!=="");if(input.cwd){let cwd=input.cwd,managed=owners.find((task)=>task.kind==="task"&&inDir(cwd,task.dir));if(managed)return{kind:"fold",taskId:managed.id}}for(let kind of["main","dir"]){let owned=owners.find((task)=>task.kind===kind&&(task.dir===input.cwd||task.dir===input.repoRoot));if(owned)return{kind:"fold",taskId:owned.id}}return{kind:"adopt",repo:input.repoRoot,known:input.knownRepos.has(input.repoRoot)}}var inDir=(path24,dir)=>path24===dir||path24.startsWith(`${dir}/`);async function renameHostedSession(from,to){if((process.env.KOBE_TERMINAL_BACKEND??"hosted")!=="hosted")return!1;try{return(await(await getSharedPtyClient()).request("pty.rename",{from,to})).renamed===!0}catch{return!1}}async function foldScratchShell(io,scratchTaskId,targetTaskId){let rename6=io.rename??renameHostedSession,scratchTabIds=(knownTaskTabs(io.kv,scratchTaskId)?.tabs??[{id:"tab-1"}]).map((tab)=>tab.id),next=1+(knownTaskTabs(io.kv,targetTaskId)?.tabs??[]).reduce((max,tab)=>Math.max(max,tabNumber(tab.id)),0),folded=[];for(let tabId of scratchTabIds){let from=tabPtyKey(scratchTaskId,tabId),ok=await rename6(from,tabPtyKey(targetTaskId,`tab-${next}`));if(!ok)next++,ok=await rename6(from,tabPtyKey(targetTaskId,`tab-${next}`));if(!ok)continue;folded.push(`tab-${next}`),next++}if(folded.length===0)return null;return adoptTaskTabs(io.kv,targetTaskId,folded),{activeTabId:folded[0]}}var tabNumber=(id)=>Number(/^tab-(\d+)$/.exec(id)?.[1]??0);var init_scratch_fold=__esm(()=>{init_pty_hosted_client();init_terminal_tabs_core();init_terminal_tabs_adopt();init_terminal_tabs_shared()});function scratchOwnerTasks(tasks){return tasks.filter((task)=>!task.deletion&&task.scratch!==!0&&task.worktreePath!=="").map((task)=>({id:task.id,kind:task.kind??"task",dir:canonPath(task.worktreePath)}))}function useScratchAdopt(deps){let{tasks,orchestrator,kv,notifyInfo}=deps,onFoldRef=useLatest(deps.onFold),enabled=deps.enabled??!0,scratchIds=tasks.filter((t3)=>t3.kind==="dir"&&t3.scratch===!0).map((t3)=>t3.id).join(",");import_react136.useEffect(()=>{if(!enabled||scratchIds==="")return;let cancelled=!1,inFlight=new Set,tick2=async()=>{let scratch=tasks.filter((t3)=>t3.kind==="dir"&&t3.scratch===!0);if(scratch.length===0)return;let known=new Set([...getSavedRepos(),...tasks.map((t3)=>t3.repo)]),owners=scratchOwnerTasks(tasks),registry=getDefaultPtyRegistry(),liveEngines=getDefaultLiveEngines();for(let task of scratch){if(inFlight.has(task.id))continue;let key=tabPtyKey(task.id,"tab-1"),pid=registry.get(key)?.shellPid??null;if(pid===null||pid===void 0)continue;if(!liveEngines.get(key))continue;let rawCwd=await processCwd(pid);if(cancelled||!rawCwd)continue;let cwd=canonPath(rawCwd),repoRoot=canonPath(resolveMainRepoRoot(cwd)),decision=decideScratchAdopt({cwd,repoRoot:isGitRepo(repoRoot)?repoRoot:null,harnessLive:!0,knownRepos:known,ownerTasks:owners});if(cancelled||decision.kind==="stay")continue;inFlight.add(task.id);try{if(decision.kind==="fold"){let folded=await foldScratchShell({kv},task.id,decision.taskId);if(!folded)throw Error("fold did not move any session");await onFoldRef.current(task.id,decision.taskId,folded.activeTabId);continue}if(await orchestrator.adoptScratchRepo(task.id,decision.repo),!decision.known)notifyInfo(t("tasks.toast.scratchAdopted",{repo:repoBasename(decision.repo)}))}catch{inFlight.delete(task.id)}}};tick2();let timer2=setInterval(()=>void tick2(),POLL_MS5);return()=>{cancelled=!0,clearInterval(timer2)}},[enabled,scratchIds,orchestrator,kv,notifyInfo,tasks])}var import_react136,POLL_MS5=5000;var init_use_scratch_adopt=__esm(()=>{init_process_cwd();init_core_helpers();init_repos();init_i18n();init_groups();init_registry3();init_live_engine();init_terminal_tabs_core();init_use_latest();init_scratch_fold();import_react136=__toESM(require_react_production(),1)});import{homedir as homedir38}from"os";function useScratchShell(deps){let{orchestrator,enterTask,forgetTaskTabs:forgetTaskTabs2,notifyError}=deps;return useScratchAdopt({tasks:deps.tasks,orchestrator,kv:deps.kv,notifyInfo:deps.notifyInfo,onFold:async(scratchTaskId,targetTaskId,tabId)=>{if(deps.selectedId()===scratchTaskId)deps.selectTask(targetTaskId),requestTabActivation(targetTaskId,tabId);await orchestrator.deleteTask(scratchTaskId),forgetTaskTabs2(scratchTaskId)}}),{openScratchShell:()=>{orchestrator.openDirectoryTask({dir:homedir38(),scratch:!0}).then((task)=>enterTask(task.id)).catch((err)=>notifyError(t("tasks.toast.scratchOpenFailed",{message:err instanceof Error?err.message:String(err)})))},onScratchExit:(taskId)=>{if(scratchTeardowns.has(taskId))return;scratchTeardowns.add(taskId),(async()=>{try{await orchestrator.deleteTask(taskId),forgetTaskTabs2(taskId),await finishDeletedTaskFlow({orch:orchestrator,tasks:deps.tasks,taskId,logger:console,logPrefix:"[rove scratch]",updateActiveTask:!0})}catch(err){notifyError(t("tasks.toast.scratchCloseFailed",{message:err instanceof Error?err.message:String(err)}))}})()}}}var scratchTeardowns;var init_use_scratch_shell=__esm(()=>{init_i18n();init_task_actions();init_terminal_tabs_shared();init_use_scratch_adopt();scratchTeardowns=new Set});function activationErrorMessage(error,translate){let message=errorMessage(error);if(message.includes(TASK_DELETING_CODE))return translate("tasks.toast.worktreeErrorDeleting");if(/not a git repository|does not appear to be a git repo/i.test(message))return translate("tasks.toast.worktreeErrorNotGit");return translate("tasks.toast.worktreeErrorGeneric",{message})}async function activateWorkspaceTask(opts,id){let task=opts.getTask(id);if(task?.deletion)return opts.reportError(new TaskDeletingError(id)),!1;if(!task?.worktreePath)try{await opts.ensureWorktree(id)}catch(error){return opts.reportError(error),!1}if(opts.isCurrent?.()===!1)return!1;return opts.selectTask(id),opts.focusWorkspace(),!0}function firstSelectableTask(tasks,activeId,lastActiveId){let alive=(id)=>id?tasks.find((task)=>task.id===id&&!task.deletion):void 0,active=alive(activeId)??alive(lastActiveId);if(active)return active;let live=tasks.filter((task)=>!task.deletion),newest=(pool)=>pool.length>0?pool.reduce((best,task)=>task.updatedAt>best.updatedAt?task:best):void 0;return newest(live.filter((task)=>task.routine===void 0))??newest(live)??tasks.find((task)=>!task.deletion)}var init_use_task_selection=__esm(()=>{init_errors()});function useWorkspaceSelection(args2){let{orch,tasks,activeTaskId,kv}=args2,t3=useT(),[selectedId,setSelectedId]=import_react137.useState(()=>orch.activeTaskSignal()()??readLastActiveTaskId()),focusRestoredRef=import_react137.useRef(!1),userPickedRef=import_react137.useRef(!1),bootFocusRef=import_react137.useRef(!1);import_react137.useEffect(()=>{if(!focusRestoredRef.current&&activeTaskId&&tasks.some((task)=>task.id===activeTaskId)){if(focusRestoredRef.current=!0,!userPickedRef.current&&selectedId!==activeTaskId){setSelectedId(activeTaskId);return}}if(!bootFocusRef.current&&!userPickedRef.current&&selectedId&&tasks.some((task)=>task.id===selectedId))bootFocusRef.current=!0,args2.focusWorkspace();if(selectedId&&tasks.some((task)=>task.id===selectedId&&!task.deletion))return;setSelectedId(firstSelectableTask(tasks,activeTaskId,readLastActiveTaskId())?.id??null)},[tasks,activeTaskId,selectedId,args2.focusWorkspace]),import_react137.useEffect(()=>{if(tasks.length===0)return;sweepOrphanTabsSnapshots(kv,tasks.map((task)=>task.id))},[tasks,kv]);let notifyWorktreeGoneRef=useLatest(args2.notifyWorktreeGone),liveTaskIdsRef=import_react137.useRef(new Set),worktreePathsRef=import_react137.useRef(new Map);import_react137.useEffect(()=>{let next=new Set(tasks.filter((task)=>!task.deletion).map((task)=>task.id)),registry=getDefaultPtyRegistry();for(let id of liveTaskIdsRef.current)if(!next.has(id))registry.releaseWhere((key)=>key===id||key.startsWith(`${id}::`));liveTaskIdsRef.current=next;let paths=new Map;for(let task of tasks)paths.set(task.id,task.worktreePath);for(let[id,prevPath]of worktreePathsRef.current)if(paths.get(id)===""&&prevPath!==""){let closed=knownTaskTabs(kv,id)?.tabs.length??0;registry.releaseWhere((key)=>key===id||key.startsWith(`${id}::`)),forgetTaskTabs(kv,id);let task=tasks.find((candidate)=>candidate.id===id);notifyWorktreeGoneRef.current?.({taskId:id,title:task?.title??id,branch:task?.branch??"",closed})}worktreePathsRef.current=paths},[tasks,kv]);function selectTask(id){if(userPickedRef.current=!0,selectedId===id){if(orch.activeTaskSignal()()!==id)orch.setActiveTask(id).catch((error)=>console.error("[rove workspace] setActiveTask failed:",error));return}setSelectedId(id),orch.setActiveTask(id).catch((error)=>console.error("[rove workspace] setActiveTask failed:",error));let kind=tasks.find((task)=>task.id===id)?.kind==="main"?"project.opened":"task.opened";orch.reportUiEvent(kind,id)}let activationGenerationRef=import_react137.useRef(0);async function activateTask(id){let generation=++activationGenerationRef.current;reviveEmptiedTabs(kv,id,defaultShell()),await activateWorkspaceTask({getTask:(taskId)=>tasks.find((task)=>task.id===taskId),ensureWorktree:(taskId)=>orch.ensureWorktree(taskId),selectTask,focusWorkspace:args2.focusWorkspace,reportError:(error)=>{console.error("[rove workspace] task.ensureWorktree failed:",error),args2.notifyError?.(activationErrorMessage(error,t3))},isCurrent:()=>activationGenerationRef.current===generation},id)}let selectedTask=selectedId?tasks.find((task)=>task.id===selectedId):void 0;return{selectedId,setSelectedId,selectedTask,selectTask,activateTask}}var import_react137;var init_use_workspace_selection=__esm(()=>{init_last_active();init_pty_types();init_registry3();init_i18n2();init_use_latest();init_terminal_tabs_shared();init_use_task_selection();import_react137=__toESM(require_react_production(),1)});function useZenMode(deps){let{kv,focus}=deps,[zen,setZen]=import_react138.useState(()=>kv.get(ZEN_ACTIVE_KEY,!1)===!0);function toggleZen(){let next=!zen;if(setZen(next),kv.set(ZEN_ACTIVE_KEY,next),next)focus.setFocused("workspace")}return import_react138.useEffect(()=>{if(focus.focused==="files")setZen(!1)},[focus.focused]),{zen,toggleZen}}var import_react138;var init_use_zen_mode=__esm(()=>{import_react138=__toESM(require_react_production(),1)});var exports_host={};__export(exports_host,{startWorkspaceHost:()=>startWorkspaceHost,WorkspaceRoot:()=>WorkspaceRoot});function WorkspaceRoot(props){let{theme}=useTheme(),inactiveBorder=theme.borderActive,dialog=useDialog(),kv=useKV(),focus=useFocus(),dims=useTerminalDimensions(),notif=useNotifications(),orch=props.orchestrator;useDaemonNotices(orch,notif.notify,dialog);let{tasks,activeTaskId,engineState,engineLifecycle,engineTabState,sidebarEngineState,inboxItems,taskJobs,worktreeChanges:worktreeChanges2,transcriptActivity}=useDaemonState(orch),[searchActive,setSearchActive]=import_react140.useState(!1),t3=useT(),notifyWorktreeGone=(event)=>{notif.notify({kind:"error",taskId:event.taskId,tabId:"",title:t3("tasks.toast.worktreeGoneTitle",{title:event.title}),body:t3("tasks.toast.worktreeGoneBody",{count:String(event.closed),branch:event.branch||"\u2014"})})},notifyActivationError=(message)=>{notif.notify({kind:"error",taskId:"",tabId:"",title:message})},{selectedId,setSelectedId,selectedTask,selectTask,activateTask}=useWorkspaceSelection({orch,tasks,activeTaskId,focusWorkspace:()=>focus.setFocused("workspace"),kv,notifyWorktreeGone,notifyError:notifyActivationError}),worktree=selectedTask?.worktreePath||null,{sortMode,toggleSortMode,moveMode,setMoveMode,notifyError,notifyInfo,onLocalMergeRequest}=useSidebarHostState({kv,notif,tasks,selectedId,setSelectedId}),inbox=useInboxHost({orchestrator:orch,items:inboxItems,tasks,kv,dialog,selectedId,selectTask,focusWorkspace:()=>focus.setFocused("workspace"),notifyError,notifyInfo}),{jumpToNextAttention}=useAttention({tasks,engineState,engineTabState,inboxItems:inbox.availableItems,selectedId,kv,notif,openAttention:inbox.openItem,noTasksMessage:t3("workspace.attention.none")}),{createTask,deleteTask:deleteTask2,renameTask,renameBranch:renameBranch2,cycleVendor,pickVendor,setVendor,togglePin,moveTask,setStatus,copyTaskField,showFieldNotes,confirmRunAgain,landTask:landTask2}=useWorkspaceTaskActions({orchestrator:orch,tasks:()=>tasks,dialog,notifyError,notifyInfo,notifyNeedsInput:(message)=>notif.notify({kind:"needs_input",taskId:"",tabId:"",title:message}),t:t3,selectedId:()=>selectedId,setSelectedId,selectedTask:()=>selectedTask,activateTask,forgetTaskTabs:(id)=>forgetTaskTabs(kv,id)}),editor=useEditorHandles({orchestrator:orch,worktree,selectedId,focus,notifyError}),quickFork=useQuickFork(orch,{selectTask:setSelectedId,enterTask:activateTask,notifyError}),scratch=useScratchShell({orchestrator:orch,tasks,kv,selectedId:()=>selectedId,selectTask:setSelectedId,enterTask:(id)=>void activateTask(id),forgetTaskTabs:(id)=>forgetTaskTabs(kv,id),notifyError,notifyInfo}),{zen,toggleZen}=useZenMode({kv,focus});import_react140.useEffect(()=>{return setUiEventReporter((kind,taskId,detail)=>orch.reportUiEvent(kind,taskId,detail)),()=>setUiEventReporter(null)},[orch]);let pages=useHostPagesState(focus),selectedTabId=selectedId===null?null:activeTabIdFor(selectedId),issueChat=useIssueChat(orch,{selectTask:setSelectedId,enterTask:activateTask,closeKanban:pages.closeKanban,notifyError,notifyInfo}),pageRender=useHostPagesRender({orchestrator:orch,pages,focus,dialog,kv,dims,selectedTask,activeTaskId,tasks,engineState,startIssueChat:issueChat.start,activateTask}),openTaskWorktree=(id)=>openTaskWorktreeFor(id,{tasks,ensureWorktree:orch.ensureWorktree.bind(orch),notifyError}),cursorTaskIdRef=import_react140.useRef(()=>null);useWorkspaceKeybindings({focus,dialog,pages,filesPaneVisible:!zen&&pages.nav==="terminal"&&pageRender.showSidebar&&pageRender.showContent,searchActive,selectedId,cursorTaskId:()=>cursorTaskIdRef.current(),openTaskWorktree,createTask:()=>void createTask(),renameBranch:(id)=>void renameBranch2(id),cycleVendor:(id)=>void cycleVendor(id),toggleZen,jumpToNextAttention,openInbox:inbox.show,createPR:()=>void editor.onCreatePR(),createPRFor:(id)=>{requestCreatePR(id),activateTask(id)},enterMoveMode:()=>{let target=selectedId??tasks[0]?.id;if(!target)return;focus.setFocused("sidebar"),setSelectedId(String(target)),setMoveMode(!0)},toggleSortMode});let activePane=dialog.stack.length>0?null:focus.focused,banner=useHostBanner(orch,dims.width),fullWindow=pageRender.settingsPage??pageRender.fullWindowPage;if(fullWindow)return $jsx(FullWindowPage,{banner:banner.element,background:theme.background,children:fullWindow});return $jsxs(WorkspaceFrame,{orchestrator:orch,onOpenSettings:pages.openSettings,banner:banner.element,children:[pageRender.showSidebar?$jsx(HostSidebar,{width:pageRender.showContent?sidebarWidthFor(dims.width):dims.width,nav:pages.nav,onNavChange:pages.goToNav,tasks,selectedId,selectedTabId,onSelect:(id)=>{selectTask(id),pages.setNav("terminal")},onActivate:(id)=>{pages.setNav("terminal"),activateTask(id)},onSelectTab:(taskId,tabId)=>{let reClick=pages.nav==="terminal"&&focus.focused!=="sidebar"&&taskId===selectedId&&tabId===selectedTabId;pages.setNav("terminal"),requestTabActivation(taskId,tabId),focus.setFocused(reClick?"sidebar":"workspace")},engineState:sidebarEngineState,engineTabState,engineLifecycle,taskJobs,worktreeChanges:worktreeChanges2,transcriptActivity,focused:activePane==="sidebar",onAddTask:()=>void createTask(),onDeleteRequest:(id)=>void deleteTask2(id),onLandRequest:(id)=>void landTask2(id),onRenameRequest:(id)=>void renameTask(id),onPinRequest:(id)=>void togglePin(id),onSetStatusRequest:(id)=>void setStatus(id),onCopyRequest:(id,field)=>copyTaskField(id,field),onOpenEditorRequest:openTaskWorktree,onRenameBranchRequest:(id)=>void renameBranch2(id),onChangeEngineRequest:(id)=>void pickVendor(id),onFieldNotesRequest:showFieldNotes,onRunAgainRequest:(id)=>void confirmRunAgain(id).then((task)=>task&&quickFork.runAgain(task)),moveMode,onMoveRequest:(id,delta)=>void moveTask(id,delta),onMoveModeExit:()=>setMoveMode(!1),onLocalMergeRequest,onSearchActiveChange:setSearchActive,sortMode,headerStatus:{label:`${t3("workspace.inbox.title")} ${inbox.counts.total}`,emphasize:inbox.counts.total>0},onHeaderStatusClick:inbox.show,updateChip:banner.update?.hasUpdate?{label:t3("update.chip",{version:banner.update.latest})}:null,onUpdateChipClick:pages.openUpdate,zenActive:zen,onZenClick:toggleZen,onFocusRequest:()=>focus.setFocused("sidebar"),recentTask:pageRender.recentTask,cursorTaskIdRef}):null,pageRender.showContent?$jsx("box",{flexGrow:1,flexShrink:1,borderStyle:"rounded",borderColor:focus.focused==="workspace"?theme.focusAccent:inactiveBorder,onMouseUp:()=>focus.setFocused("workspace"),children:pageRender.contentPage??$jsx(ShowWorkspace,{task:selectedTask,worktree,orchestrator:orch,focused:activePane==="workspace",onRequestFocus:()=>focus.setFocused("workspace"),onEditorTabReady:editor.onEditorTabReady,onEngineSendReady:editor.onEngineSendReady,onEnginePasteReady:editor.onEnginePasteReady,onDiffTabReady:editor.onDiffTabReady,onQuickFork:quickFork.onQuickFork,initialPrompt:quickFork.initialPromptFor(selectedTask?.id),onTabVisited:inbox.resolveVisited,onScratchExit:scratch.onScratchExit,onOpenScratch:scratch.openScratchShell,onEngineChosen:setVendor})}):null,!zen&&pageRender.contentPage==null&&pageRender.showSidebar&&pageRender.showContent?$jsx(HostFilesPane,{worktree,prBaseRef:selectedTask?.prStatus?.baseRef,focused:activePane==="files",onOpenFile:(relPath)=>void editor.onOpenFile(relPath),onOpenDiff:editor.onOpenDiff,onMention:editor.onMention,onZenToggle:toggleZen,onCreatePR:()=>void editor.onCreatePR(),taskKind:selectedTask?.kind}):null,$jsx(ToastOverlay,{}),$jsx(PrefixHud,{left:1,width:sidebarWidthFor(dims.width)-2})]})}async function startWorkspaceHost(){await bootPaneHost({logContext:"workspace",providers:{kv:!0,focus:!0,notifications:!0},setup:async()=>{let client=await connectOrStartDaemon(),orchestrator=new RemoteOrchestrator(client,{role:"gui"});return await orchestrator.init(),process.env.KOBE_DAEMON_SOCKET_PATH=client.socketPath,{root:()=>$jsx(WorkspaceRoot,{orchestrator}),onDestroy:()=>{orchestrator.dispose(),getDefaultPtyRegistry().detachAll()}}}})}var import_react140;var init_host=__esm(async()=>{init_daemon_process();init_remote_orchestrator();init_view_core();init_registry3();init_kv();init_notifications();init_i18n2();init_use_sidebar_host_state();init_open_task_worktree();init_quick_fork();init_terminal_tabs_shared();init_use_attention();init_use_create_pr();init_use_daemon_state();init_use_editor_handles();init_use_issue_chat();init_use_scratch_shell();init_use_workspace_selection();init_use_zen_mode();init_jsx_runtime();await __promiseAll([init_react(),init_prefix_hud2(),init_toast_overlay(),init_focus(),init_theme(),init_host_boot(),init_use_daemon_notices(),init_dialog(),init_host_banner(),init_host_files_pane(),init_host_footer(),init_host_keybindings(),init_host_pages(),init_host_sidebar(),init_host_task_actions(),init_show_workspace(),init_use_inbox_host()]);import_react140=__toESM(require_react_production(),1)});var exports_tui={};__export(exports_tui,{startTui:()=>startTui});async function startTui(){enforceResetGate(),publishKobeTerminalTitle(),await maybeHintSkillInstall(),await ensureGlobalKobeHooks();let{loadPluginEngines:loadPluginEngines2}=await Promise.resolve().then(() => (init_plugin_engines(),exports_plugin_engines));loadPluginEngines2();let{startWorkspaceHost:startWorkspaceHost2}=await init_host().then(() => exports_host);await startWorkspaceHost2()}var init_tui=__esm(()=>{init_hook_cmd();init_reset_gate();init_skill_install()});import{statSync as statSync18}from"fs";import{resolve as resolve17}from"path";function isPathLikeArg(arg){return arg==="."||arg===".."||arg.startsWith("./")||arg.startsWith("../")||arg.startsWith("/")||arg==="~"||arg.startsWith("~/")}async function projectRootFor(dir){let{isGitRepo:isGitRepo2,resolveRepoRoot:resolveRepoRoot2}=await Promise.resolve().then(() => (init_repos(),exports_repos)),{projectRejection:projectRejection2}=await Promise.resolve().then(() => (init_project_eligibility(),exports_project_eligibility)),top=resolveRepoRoot2(dir);if(top!==dir)return null;return projectRejection2(top,isGitRepo2,"explicit")?null:top}async function runOpenDirectory(arg){let dir=resolve17(process.cwd(),expandTilde(arg)),isDir=!1;try{isDir=statSync18(dir).isDirectory()}catch{isDir=!1}if(!isDir)process.stderr.write(`${activeCliName()}: "${arg}" is not a directory (resolved to ${dir}).
788
788
  `),process.exit(1);let projectRoot=await projectRootFor(dir);await withDaemonOrLocal({daemon:async(client)=>{let taskId;if(projectRoot)taskId=(await client.request("task.ensureMain",{repo:projectRoot})).task.id;else taskId=(await client.request("task.openDir",{dir})).taskId;await client.request("task.setActive",{taskId})},local:async(orch)=>{let task=projectRoot?await orch.ensureMainTask(projectRoot):await orch.openDirectoryTask({dir}),{writeLastActiveTaskId:writeLastActiveTaskId2}=await Promise.resolve().then(() => (init_last_active(),exports_last_active));writeLastActiveTaskId2(String(task.id))}});let{publishKobeTerminalTitle:publishKobeTerminalTitle2}=await Promise.resolve().then(() => exports_outer_terminal_title);publishKobeTerminalTitle2();let{startTui:startTui2}=await Promise.resolve().then(() => (init_tui(),exports_tui));await startTui2()}var init_open_dir_cmd=__esm(()=>{init_path_home();init_orchestrator_bridge();init_rename_compat()});function topLevelUsage(cliName=activeCliName()){return[`${cliName} ${CURRENT_VERSION2}`,"",`Usage: ${cliName} [command] [options]`,"","Run with no command to launch PureTUI.",`Run \`${cliName} .\` (or \`${cliName} <path>\`) to open a directory as a standalone task.`,"","Commands:"," web [options] Launch the browser dashboard"," completions <shell> Generate shell completion script (bash/zsh/fish)"," add [path] Save a repo path for the new-task picker"," remove [path] Forget a saved project (inverse of add; non-destructive)"," adopt [glob] Import existing git worktrees as tasks"," export [--csv|--json] Print the task list (json/csv/table; daemon-free)"," repo <verb> Per-repo init script + first prompt (show|set|unset)",` api <verb> Scriptable RPC surface for agents (see \`${cliName} api --help\`)`," daemon <verb> Manage the daemon (start|stop|status|restart)"," doctor [--report|--fix] Diagnose daemon/PTY/engines/git; --fix walks the remedies",` config [--path] Open ${cliName}'s config file (state.json) in your editor`," reset [--hard] Stop runtimes; optionally wipe task/UI state"," theme <verb> Manage user themes (list|add|remove)",` skill <verb> Install the ${cliName} agent skill (install|status|command|print)`," plugin <verb> Install and run plugins (install|link|list|action|\u2026)"," feedback Send feedback to GitHub Discussions",` update [version|channel|list] Self-update ${cliName}, switch channel, or list versions`,"","Options:"," -v, --version Print version"," -h, --help Print this help"," --skill Print the agent skill file and exit"].join(`