@sma1lboy/rove 0.9.254 → 0.9.257

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.
Files changed (81) hide show
  1. package/dist/cli/{chunk-68pcd00x.js → chunk-0862e617.js} +1 -1
  2. package/dist/cli/{chunk-xdhs40fx.js → chunk-08hhcnn5.js} +1 -1
  3. package/dist/cli/{chunk-4mxn5jg6.js → chunk-0fcadpxs.js} +1 -1
  4. package/dist/cli/{chunk-qkd4eweb.js → chunk-21jnwk9j.js} +1 -1
  5. package/dist/cli/{chunk-pahcf9td.js → chunk-33gjfdep.js} +1 -1
  6. package/dist/cli/{chunk-n3wdy4z4.js → chunk-3k96p4ah.js} +1 -1
  7. package/dist/cli/{chunk-7wga6bet.js → chunk-4fr7n89r.js} +1 -1
  8. package/dist/cli/chunk-4kqpm5y2.js +2 -0
  9. package/dist/cli/{chunk-5fhrns31.js → chunk-791y8d6t.js} +1 -1
  10. package/dist/cli/{chunk-j84zbw79.js → chunk-80t4dn9b.js} +2 -2
  11. package/dist/cli/chunk-85k50vxw.js +2 -0
  12. package/dist/cli/{chunk-n5xj11ps.js → chunk-8j3n1b9z.js} +1 -1
  13. package/dist/cli/{chunk-6g5wvt5m.js → chunk-8m1633va.js} +1 -1
  14. package/dist/cli/{chunk-mxkm0snt.js → chunk-a02z5xw3.js} +1 -1
  15. package/dist/cli/{chunk-k9ahks28.js → chunk-apdbxnwc.js} +1 -1
  16. package/dist/cli/{chunk-jwtqe209.js → chunk-b7jf2yf6.js} +1 -1
  17. package/dist/cli/{chunk-4myck788.js → chunk-cyb62hnb.js} +1 -1
  18. package/dist/cli/{chunk-6zvh002j.js → chunk-d2t6cbzn.js} +1 -1
  19. package/dist/cli/{chunk-5b7pd8j5.js → chunk-d45wtawm.js} +1 -1
  20. package/dist/cli/{chunk-rf4z7b6g.js → chunk-d6qdwa8p.js} +1 -1
  21. package/dist/cli/{chunk-x7ryv67y.js → chunk-dbhy9fd4.js} +2 -2
  22. package/dist/cli/{chunk-e5vnptx5.js → chunk-emz4gsxn.js} +1 -1
  23. package/dist/cli/{chunk-ddc4t38t.js → chunk-eqvksmzv.js} +1 -1
  24. package/dist/cli/{chunk-j7831wcj.js → chunk-es5p91ga.js} +1 -1
  25. package/dist/cli/{chunk-vjvkkrzc.js → chunk-f5n0tgky.js} +1 -1
  26. package/dist/cli/{chunk-pvah9q79.js → chunk-fh1ef13n.js} +1 -1
  27. package/dist/cli/{chunk-mpdfhvgs.js → chunk-gr2vm64w.js} +2 -2
  28. package/dist/cli/{chunk-sxhjvr0w.js → chunk-h176cbnr.js} +1 -1
  29. package/dist/cli/{chunk-18dpws0y.js → chunk-jxgyj4b4.js} +1 -1
  30. package/dist/cli/{chunk-rn97jntv.js → chunk-k9v0bjkm.js} +1 -1
  31. package/dist/cli/{chunk-kwd59v51.js → chunk-kkts9g9r.js} +1 -1
  32. package/dist/cli/{chunk-r7q7s63y.js → chunk-me51qw02.js} +2 -2
  33. package/dist/cli/{chunk-tnft1xw4.js → chunk-mmeb5qh7.js} +1 -1
  34. package/dist/cli/{chunk-tewt7vre.js → chunk-mq308gxv.js} +1 -1
  35. package/dist/cli/{chunk-d48g9zzm.js → chunk-ncyqgz8p.js} +3 -3
  36. package/dist/cli/{chunk-x951qvk5.js → chunk-nvxamc2c.js} +3 -12
  37. package/dist/cli/{chunk-v9fgdd90.js → chunk-nzrk8b0z.js} +1 -1
  38. package/dist/cli/{chunk-d4mvprvq.js → chunk-pbkf3140.js} +11 -2
  39. package/dist/cli/{chunk-6wxnkz3c.js → chunk-qh4j4mtc.js} +4 -4
  40. package/dist/cli/{chunk-gqpka00s.js → chunk-qw5x38ww.js} +1 -1
  41. package/dist/cli/chunk-qz565f17.js +52 -0
  42. package/dist/cli/{chunk-9dendh71.js → chunk-rc2nwsdd.js} +1 -1
  43. package/dist/cli/chunk-rdq9zq3h.js +2 -0
  44. package/dist/cli/{chunk-ef7ckm5b.js → chunk-rpmvjq9c.js} +1 -1
  45. package/dist/cli/{chunk-5a6b4kv9.js → chunk-s801n2e7.js} +1 -1
  46. package/dist/cli/{chunk-vzn94t0z.js → chunk-syc003b2.js} +1 -1
  47. package/dist/cli/{chunk-1yzg4hzy.js → chunk-szq376t1.js} +1 -1
  48. package/dist/cli/{chunk-13msr643.js → chunk-t1r5pc33.js} +1 -1
  49. package/dist/cli/{chunk-fwt0t2h7.js → chunk-tabj0acy.js} +1 -1
  50. package/dist/cli/{chunk-yebn33mf.js → chunk-tacaks6s.js} +1 -1
  51. package/dist/cli/{chunk-j19gkhzh.js → chunk-tgmmd30n.js} +1 -1
  52. package/dist/cli/{chunk-8bd054vx.js → chunk-tngev75p.js} +1 -1
  53. package/dist/cli/{chunk-wsv6tw1b.js → chunk-wnvsxke8.js} +1 -1
  54. package/dist/cli/{chunk-hqp8b49k.js → chunk-xfz92v4r.js} +2 -2
  55. package/dist/cli/chunk-xk22erkp.js +3 -0
  56. package/dist/cli/{chunk-tbq3t259.js → chunk-xqjh64fq.js} +1 -1
  57. package/dist/cli/{chunk-pyv2ywxr.js → chunk-y3bfa8kk.js} +2 -2
  58. package/dist/cli/{chunk-ykdpg0zd.js → chunk-yfxhvxws.js} +5 -5
  59. package/dist/cli/{chunk-hzzq6pdb.js → chunk-ymad1xkk.js} +1 -1
  60. package/dist/cli/{chunk-6d5csfp4.js → chunk-ymy2pers.js} +1 -1
  61. package/dist/cli/{chunk-x40h0f1w.js → chunk-yxhtary9.js} +1 -1
  62. package/dist/cli/{chunk-sxt12set.js → chunk-zrf78ztr.js} +1 -1
  63. package/dist/cli/index.js +4 -4
  64. package/dist/cli/pty-host-node.mjs +5 -2
  65. package/dist/cli/rove.js +4 -4
  66. package/dist/completions/rove.bash +1 -1
  67. package/dist/completions/rove.fish +1 -1
  68. package/dist/completions/rove.zsh +1 -1
  69. package/dist/skills/rove/SKILL.md +1 -1
  70. package/dist/skills/rove/references/api-flags.md +16 -13
  71. package/dist/web/assets/index-BiUiNIOp.css +1 -0
  72. package/dist/web/assets/index-jy27XaL0.js +109 -0
  73. package/dist/web/index.html +2 -2
  74. package/package.json +6 -4
  75. package/dist/cli/chunk-0g1me47p.js +0 -2
  76. package/dist/cli/chunk-cm923k09.js +0 -52
  77. package/dist/cli/chunk-j9c9tdfg.js +0 -2
  78. package/dist/cli/chunk-m0cbndc2.js +0 -3
  79. package/dist/cli/chunk-wn2w5ar9.js +0 -2
  80. package/dist/web/assets/index-BZjPWX0N.css +0 -1
  81. package/dist/web/assets/index-BydepNFM.js +0 -109
@@ -1,5 +1,14 @@
1
1
  // @bun
2
- import{protocolEntry}from"./chunk-rf4z7b6g.js";import{isObject}from"./chunk-7ghwdjdc.js";import{getPersistedString,getPersistedValue}from"./chunk-xkr7fwvb.js";import{acquireSync,releaseSync}from"./chunk-qk5f6p3e.js";import{secretsPath}from"./chunk-prqeddy7.js";function bottomRegion(captureText,lines){return captureText.split(`
2
+ import{execHostForWorktreePath}from"./chunk-dehnv06q.js";import{protocolEntry}from"./chunk-d6qdwa8p.js";import{parseNumstatRows}from"./chunk-t7j8g9f6.js";import{parsePorcelainRows,unquoteGitPath}from"./chunk-dmzg9zdc.js";import{readHeadSha,resolveGitDirs}from"./chunk-kg9kmwt9.js";import{READ_ONLY_GIT_ENV}from"./chunk-6xppe9bj.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{isObject}from"./chunk-7ghwdjdc.js";import{getPersistedString,getPersistedValue}from"./chunk-xkr7fwvb.js";import{recordSpawn}from"./chunk-40dgv828.js";import{acquireSync,releaseSync}from"./chunk-qk5f6p3e.js";import{secretsPath}from"./chunk-prqeddy7.js";import{t}from"./chunk-tq6pq1ws.js";async function runWorktreeGit(worktreePath,args,options={}){if(!worktreePath)return{stdout:"",stderr:"worktreePath is required",status:-1};let exec=(options.execForPath??execHostForWorktreePath)(worktreePath),controller=options.timeoutMs&&options.timeoutMs>0?new AbortController:null,timedOut=!1,timer=controller?setTimeout(()=>{timedOut=!0,controller.abort()},options.timeoutMs):null,signal=controller&&options.signal?AbortSignal.any([controller.signal,options.signal]):controller?.signal??options.signal,result;try{recordSpawn("worktree.content",["git",...args],worktreePath),result=await exec.run(["git",...args],{cwd:worktreePath,env:READ_ONLY_GIT_ENV,signal})}catch(err){if(timer)clearTimeout(timer);return{stdout:"",stderr:errorMessage(err),status:-1}}if(timer)clearTimeout(timer);if(timedOut&&result.exitCode===-1&&!result.stderr)return{stdout:result.stdout,stderr:`git ${args.join(" ")} timed out after ${options.timeoutMs}ms`,status:-1};return{stdout:result.stdout,stderr:result.stderr,status:result.exitCode}}function readLocalWorktreeHead(worktreePath,deps={}){if(!worktreePath||(deps.execForPath??execHostForWorktreePath)(worktreePath).isRemote)return null;try{let dirs=resolveGitDirs(worktreePath);return dirs?readHeadSha(dirs):null}catch{return null}}function worktreeFilePath(worktreePath,relPath){if(!worktreePath||!relPath)return null;if(/^[/\\]/.test(relPath)||/^[a-zA-Z]:[/\\]/.test(relPath))return null;if(relPath.split(/[/\\]/).some((part)=>part===".."))return null;let parts=relPath.split("/");return`${worktreePath.replace(/\/+$/,"")}/${parts.filter(Boolean).join("/")}`}async function worktreeFileSize(worktreePath,relPath,deps={}){let path=worktreeFilePath(worktreePath,relPath);if(!path)return null;let exec=(deps.execForPath??execHostForWorktreePath)(worktreePath);try{let res=await exec.run(["wc","-c",path]);if(res.exitCode!==0)return null;let n=Number.parseInt(res.stdout.trim().split(/\s+/)[0]??"",10);return Number.isFinite(n)?n:null}catch{return null}}async function readWorktreeFile(worktreePath,relPath,deps={}){let path=worktreeFilePath(worktreePath,relPath);if(!path)return null;let exec=(deps.execForPath??execHostForWorktreePath)(worktreePath);try{return await exec.readFile(path)}catch{return null}}function filetypeOf(relPath){switch(relPath.slice(relPath.lastIndexOf(".")+1).toLowerCase()){case"ts":case"tsx":case"mts":case"cts":return"typescript";case"js":case"jsx":case"mjs":case"cjs":return"javascript";case"md":case"markdown":return"markdown";default:return}}function isCombinedPathspec(relPath){return relPath==="."||relPath.endsWith("/")}function hunklessPatchNote(patch){if(/^@@/m.test(patch))return null;let binary=!1,from,to,renameFrom,renameTo,emptyChange;for(let line of patch.split(`
3
+ `))if(line.startsWith("old mode "))from=line.slice(9).trim();else if(line.startsWith("new mode "))to=line.slice(9).trim();else if(line.startsWith("rename from "))renameFrom=unquoteGitPath(line.slice(12));else if(line.startsWith("rename to "))renameTo=unquoteGitPath(line.slice(10));else if(line.startsWith("new file mode "))emptyChange="added";else if(line.startsWith("deleted file mode "))emptyChange="deleted";else if(line.startsWith("Binary files ")||line.startsWith("GIT binary patch"))binary=!0;if(binary)return{kind:"binary"};if(renameFrom!=null&&renameTo!=null)return{kind:"rename",from:renameFrom,to:renameTo};if(emptyChange)return{kind:"empty-file",change:emptyChange};if(from!=null&&to!=null)return{kind:"mode",from,to};return null}function sidePath(field){let raw=field.replace(/\t[\s\S]*$/,"");if(raw==="/dev/null")return null;let path=unquoteGitPath(raw);return path.startsWith("a/")||path.startsWith("b/")?path.slice(2):path}function headerPath(header){if(header.startsWith('"'))return sidePath(unquoteGitPath(header))??header;for(let i=header.indexOf(" b/");i>=0;i=header.indexOf(" b/",i+1)){let a=sidePath(header.slice(0,i)),b=sidePath(header.slice(i+1));if(a!=null&&a===b)return b}let last=header.lastIndexOf(" b/");return(last>=0?sidePath(header.slice(last+1)):null)??header}function unifiedDiffFiles(text){let files=[],current=null,push=()=>{if(!current)return;let patch=`${current.lines.join(`
4
+ `)}
5
+ `,path=current.plus??current.minus??current.path,note=hunklessPatchNote(patch);files.push({path,text:patch,lines:current.rows,...note?{note}:{}})};for(let line of text.split(`
6
+ `)){if(line.startsWith("diff --git ")){push(),current={path:headerPath(line.slice(11)),lines:[line],rows:0};continue}if(!current)continue;if(current.lines.push(line),line.startsWith("rename to "))current.path=unquoteGitPath(line.slice(10));else if(line.startsWith("copy to "))current.path=unquoteGitPath(line.slice(8));else if(line.startsWith("+++ "))current.plus=sidePath(line.slice(4))??void 0;else if(line.startsWith("--- "))current.minus=sidePath(line.slice(4))??void 0;else if(/^[ +-]/.test(line))current.rows+=1}return push(),files}var IMAGE_EXTS=new Set(["png","jpg","jpeg","gif","webp","bmp","ico","tif","tiff","avif","heic"]);function isImagePath(relPath){return IMAGE_EXTS.has(relPath.slice(relPath.lastIndexOf(".")+1).toLowerCase())}function looksBinaryText(text){return text.slice(0,8192).includes("\x00")}async function pairRename(worktree,spec,relPath){let listed=await runWorktreeGit(worktree,["diff",spec,"--name-status","--find-renames","-z"]);if(listed.status!==0)return null;let fields=listed.stdout.split("\x00");for(let i=0;i<fields.length;i+=1){let code=fields[i];if(code==null||!/^[RC]\d*$/.test(code))continue;let orig=fields[i+1],neu=fields[i+2];if(i+=2,orig==null||neu!==relPath)continue;let paired=await runWorktreeGit(worktree,["--literal-pathspecs","diff",spec,"--",relPath,orig]);if(paired.status!==0||paired.stdout.trim().length===0)return null;return{text:paired.stdout,origPath:orig}}return null}async function loadPreviewData(worktree,relPath,range){if(isImagePath(relPath))return{kind:"binary",image:!0,sizeBytes:await worktreeFileSize(worktree,relPath)};let spec=range?`${range.base}...HEAD`:"HEAD",res=await runWorktreeGit(worktree,["--literal-pathspecs","diff",spec,"--",relPath]);if(res.status!==0&&(range||isCombinedPathspec(relPath)))return{kind:"error",message:(res.stderr??"").trim()||`git diff ${spec} exited with code ${res.status??-1}`};let diff=res.status===0?res.stdout:"",origPath;if(diff.trim().length>0){if(!isCombinedPathspec(relPath)){if(/^new file mode /m.test(diff)){let paired=await pairRename(worktree,spec,relPath);if(paired)diff=paired.text,origPath=paired.origPath}let note=hunklessPatchNote(diff);if(note)return{kind:"patch-note",note,sizeBytes:await worktreeFileSize(worktree,relPath)}}return{kind:"diff",text:diff,...origPath?{origPath}:{}}}if(isCombinedPathspec(relPath))return{kind:"empty"};let text=await readWorktreeFile(worktree,relPath);if(text===null)return{kind:"error",message:t("ops.preview.readFailed",{path:relPath})};if(looksBinaryText(text))return{kind:"binary",image:!1,sizeBytes:await worktreeFileSize(worktree,relPath)};return{kind:"code",text}}async function runGit(args,cwd,signal){if(!cwd)throw Error("git(): cwd is required");let result=await runWorktreeGit(cwd,args,{signal}),exitCode=result.status??-1;if(exitCode!==0){let stderr=(result.stderr??"").trim(),stdout=(result.stdout??"").trim();throw Error(`git ${args.join(" ")} (cwd=${cwd}) exited with code ${exitCode}: ${stderr||stdout||"(no output)"}`)}return result.stdout??""}async function listFiles(worktreePath,signal){let lines=(await runGit(["ls-files","--cached","--others","--exclude-standard","--full-name"],worktreePath,signal)).split(`
7
+ `).map((l)=>unquoteGitPath(l.replace(/\r$/,""))),set=new Set;for(let line of lines)if(line.length>0)set.add(line);return Array.from(set).sort()}async function statusFiles(worktreePath,signal){let out=await runGit(["status","--porcelain"],worktreePath,signal),entries=parseStatusEntries(out),stats=new Map;try{let diffOut=await runGit(["diff","--no-color","--numstat","-z","HEAD"],worktreePath,signal);stats=new Map(parseNumstat(diffOut).map((n)=>[n.path,{added:n.added,deleted:n.deleted}]))}catch{try{let cachedOut=await runGit(["diff","--no-color","--numstat","-z","--cached"],worktreePath,signal);stats=new Map(parseNumstat(cachedOut).map((n)=>[n.path,{added:n.added,deleted:n.deleted}]))}catch{stats=new Map}}let merged=entries.map((e)=>{let s=stats.get(e.path);if(s)return{...e,added:s.added,deleted:s.deleted};return e});if(merged.some(isUntrackedDir))try{let others=(await runGit(["ls-files","--others","--exclude-standard","--full-name"],worktreePath,signal)).split(`
8
+ `).filter((l)=>l.length>0);attachUntrackedChildren(merged,others)}catch{}let untracked=[];for(let e of merged){if(e.status!=="?")continue;if(e.children)untracked.push(...e.children);else if(e.added==null&&!e.path.endsWith("/"))untracked.push(e)}if(untracked.length>0)await Promise.all(untracked.map(async(e)=>{let added=await countAddedLines(worktreePath,e.path,signal);if(added!=null)e.added=added,e.deleted=0}));for(let e of merged){if(!e.children)continue;let sum=0,counted=!1;for(let c of e.children)if(c.added!=null)sum+=c.added,counted=!0;if(counted)e.added=sum,e.deleted=0}return merged}function isUntrackedDir(e){return e.status==="?"&&e.path.endsWith("/")}function attachUntrackedChildren(entries,others){for(let e of entries){if(!isUntrackedDir(e))continue;e.children=others.filter((p)=>p.startsWith(e.path)).map((p)=>({path:p,status:"?"}))}}var BASE_TTL_MS=300000,baseCache=new Map;async function resolveBase(worktreePath,prBaseRef,signal){if(prBaseRef&&prBaseRef.trim().length>0)return prBaseRef.trim();let hit=baseCache.get(worktreePath);if(hit&&Date.now()-hit.at<BASE_TTL_MS){if(hit.head===void 0)return hit.base;if((readLocalWorktreeHead(worktreePath)??await revParse("HEAD",worktreePath,signal))===hit.head)return hit.base}let resolved=await resolveBaseUncached(worktreePath,signal);if(!signal?.aborted)baseCache.set(worktreePath,{...resolved,at:Date.now()});return resolved.base}async function resolveBaseUncached(worktreePath,signal){try{let head2=(await runGit(["symbolic-ref","--short","refs/remotes/origin/HEAD"],worktreePath,signal)).trim();if(head2.length>0)return{base:head2}}catch{}for(let guess of["origin/main","origin/master"])try{return await runGit(["rev-parse","--verify","--quiet",guess],worktreePath,signal),{base:guess}}catch{}let head=await revParse("HEAD",worktreePath,signal);for(let guess of["main","master"]){let sha=await revParse(guess,worktreePath,signal);if(sha!=null&&sha!==head)return{base:guess,head}}return{base:null,head}}async function revParse(ref,worktreePath,signal){try{let out=(await runGit(["rev-parse","--verify","--quiet",ref],worktreePath,signal)).trim();return out.length>0?out:null}catch{return null}}async function statusFilesBranch(worktreePath,base,signal){let range=`${base}...HEAD`,[nameStatusOut,numstatOut]=await Promise.all([runGit(["diff","--no-color","--name-status",range],worktreePath,signal),runGit(["diff","--no-color","--numstat","-z",range],worktreePath,signal)]),counts=new Map(parseNumstat(numstatOut).map((n)=>[n.path,{added:n.added,deleted:n.deleted}])),entries=[];for(let{status,path}of parseNameStatus(nameStatusOut)){let c=counts.get(path);entries.push({path,status,added:c?.added,deleted:c?.deleted})}return entries}function parseNameStatus(raw){let out=[];for(let rawLine of raw.split(`
9
+ `)){let line=rawLine.replace(/\r$/,"");if(line.length===0)continue;let tab1=line.indexOf("\t");if(tab1<0)continue;let code=line[0],path;if(code==="R"||code==="C"){let tab2=line.indexOf("\t",tab1+1);path=unquoteGitPath(tab2<0?line.slice(tab1+1):line.slice(tab2+1))}else path=unquoteGitPath(line.slice(tab1+1));if(path.length===0||path.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})}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 i=0;i<text.length;i++)if(text[i]===`
10
+ `)count++;if(!text.endsWith(`
11
+ `))count++;return count}function parseNumstat(raw){return parseNumstatRows(raw).map((r)=>({path:r.path,added:r.added,deleted:r.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 path=row.path;if(path.length===0)continue;if(path.endsWith("/")&&status!=="?")continue;out.push({path,status})}return out}function bottomRegion(captureText,lines){return captureText.split(`
3
12
  `).filter((l)=>l.trim().length>0).slice(-lines)}function ruleMatches(rule,region){let haystack=region.join(`
4
13
  `).toLowerCase();if(rule.all&&!rule.all.every((s)=>haystack.includes(s.toLowerCase())))return!1;if(rule.any&&!rule.any.some((s)=>haystack.includes(s.toLowerCase())))return!1;if(rule.lineRegex){let regexes=rule.lineRegex.map((r)=>new RegExp(r,"i"));if(!region.some((line)=>regexes.some((re)=>re.test(line))))return!1}return Boolean(rule.all||rule.any||rule.lineRegex)}function classifyScreen(manifest,captureText){for(let rule of manifest.rules){let region=bottomRegion(captureText,rule.bottomLines??12);if(region.length===0)continue;if(ruleMatches(rule,region))return rule.state}return null}var MAX_ERROR_ROWS=6;function screenErrorLine(errorLine,rows,opts={}){let filled=rows.flatMap((row,index)=>row.trim()?[index]:[]),window=filled.slice(-12);for(let k=window.length-1;k>=0;k--){let start=window[k];if(!errorLine.test(rows[start]??""))continue;let end=start+1;while(end<rows.length&&end-start<MAX_ERROR_ROWS&&rows[end]?.trim())end++;if(opts.last&&filled.some((index)=>index>=end))return;return rows.slice(start,end).map((row)=>row.trim()).join(" ")}return}var AUTO_ROUTING_TIERS=["swift","standard","deep"];function isAutoRoutingTier(value){return AUTO_ROUTING_TIERS.includes(value??"")}var DEFAULT_AUTO_ROUTING={swift:{engine:"claude",model:"sonnet"},standard:{engine:"claude",model:"opus"},deep:{engine:"claude",model:"fable"}};function autoRoutingKey(tier,field){return`autoRouting.${tier}.${field}`}function stringAt(get,key){let raw=get(key);return typeof raw==="string"?raw:void 0}function readAutoRoutingTable(get=getPersistedString){let table={};for(let tier of AUTO_ROUTING_TIERS){let base=DEFAULT_AUTO_ROUTING[tier],engine=stringAt(get,autoRoutingKey(tier,"engine"));if(engine!==void 0&&!engine.trim())return null;let model=stringAt(get,autoRoutingKey(tier,"model")),effort=stringAt(get,autoRoutingKey(tier,"effort")),resolvedModel=model===void 0?base.model:model.trim()||void 0,resolvedEffort=effort===void 0?base.effort:effort.trim()||void 0;table[tier]={engine:engine?.trim()||base.engine,...resolvedModel?{model:resolvedModel}:{},...resolvedEffort?{effort:resolvedEffort}:{}}}return table}function tierBlock(target,deps){let{engine}=target;if(!deps.engineIds.has(engine))return{kind:"engine",engine};if(deps.accountKind(engine)==="none")return{kind:"account",engine};let entry=protocolEntry(engine);if(target.model&&!entry.modelArgv)return{kind:"model",engine,model:target.model};if(target.effort){let levels=entry.effortLevels??[];if(!levels.includes(target.effort))return{kind:"effort",engine,effort:target.effort,levels}}return null}function describeTierBlock(block){switch(block.kind){case"engine":return`engine ${block.engine} is not one engine-list names`;case"account":return`engine ${block.engine} is not logged in`;case"model":return`engine ${block.engine} declares no model flag, so model ${JSON.stringify(block.model)} cannot be passed`;case"effort":return block.levels.length===0?`engine ${block.engine} declares no reasoning effort levels`:`engine ${block.engine} does not accept effort ${JSON.stringify(block.effort)} \u2014 it declares ${block.levels.join(", ")}`}}import{mkdirSync,readFileSync,readdirSync,renameSync,unlinkSync,writeFileSync}from"fs";import{basename,dirname,join}from"path";var HINT_TAIL=4;function readStored(path){let raw;try{raw=readFileSync(path,"utf8")}catch{return{}}try{let parsed=JSON.parse(raw);if(isObject(parsed))return parsed}catch{}return"corrupt"}function readAll(){let stored=readStored(secretsPath());if(stored==="corrupt")return{};let out={};for(let[k,v]of Object.entries(stored))if(typeof v==="string")out[k]=v;return out}function stagingPath(path){return`${path}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`}function sweepStagingFiles(path){let dir=dirname(path),prefix=`${basename(path)}.`,entries;try{entries=readdirSync(dir)}catch{return}for(let entry of entries){if(!entry.startsWith(prefix)||!entry.endsWith(".tmp"))continue;try{unlinkSync(join(dir,entry))}catch{}}}function transact(mutate){let path=secretsPath();mkdirSync(dirname(path),{recursive:!0,mode:448});let lockPath=`${path}.lock`,token=acquireSync(lockPath);try{sweepStagingFiles(path);let secrets=readStored(path);if(secrets==="corrupt")renameSync(path,`${path}.corrupt-${Date.now()}`),secrets={};if(mutate(secrets),Object.keys(secrets).length===0){try{unlinkSync(path)}catch(err){if(err?.code!=="ENOENT")throw err}return}let tmp=stagingPath(path);writeFileSync(tmp,JSON.stringify(secrets),{encoding:"utf8",mode:384}),renameSync(tmp,path)}finally{releaseSync(lockPath,token)}}function readSecret(name){let v=readAll()[name];return v?.trim()?v.trim():void 0}function resolveSecret(name,env=process.env){return env[name]?.trim()||readSecret(name)}function secretStatus(name,env=process.env){let stored=readAll()[name]?.trim(),hint=stored?secretHint(stored):"";if(env[name]?.trim())return{source:"env",hint};return{source:stored?"file":"none",hint}}function secretHint(value){let v=value.trim();return v.length<=HINT_TAIL?"\u2026":`\u2026${v.slice(-HINT_TAIL)}`}function writeSecret(name,value){transact((secrets)=>{let v=value.trim();if(v)secrets[name]=v;else delete secrets[name]})}var SUM_TOLERANCE=0.02,bad=(why)=>({ok:!1,why});function readConfidence(v){return typeof v==="number"&&Number.isFinite(v)&&v>=0&&v<=1?v:void 0}function readChoiceAnswer(answer){if(!isObject(answer))return bad("answer is not an object");let choice=answer.choice;if(typeof choice!=="string"||!isAutoRoutingTier(choice))return bad(`choice ${JSON.stringify(choice)} is not one of the offered tiers`);let probs=answer.probabilities;if(!isObject(probs))return bad("probabilities is not an object");let keys=Object.keys(probs).sort(),expected=[...AUTO_ROUTING_TIERS].sort();if(keys.length!==expected.length||keys.some((k,i)=>k!==expected[i]))return bad(`probabilities keys ${keys.join(",")} do not match the offered tiers`);let values={},sum=0;for(let tier of AUTO_ROUTING_TIERS){let p=probs[tier];if(typeof p!=="number"||!Number.isFinite(p)||p<0||p>1)return bad(`probability for ${tier} is not a number in [0,1]`);values[tier]=p,sum+=p}if(Math.abs(sum-1)>SUM_TOLERANCE)return bad(`probabilities sum to ${sum.toFixed(3)}`);for(let tier of AUTO_ROUTING_TIERS)if(values[tier]>values[choice])return bad(`choice ${choice} is not the most likely tier`);let confidence=readConfidence(answer.confidence);if(confidence===void 0)return bad("confidence is missing or out of range");return{ok:!0,value:{tier:choice,confidence,probabilities:values}}}function readJevAnswer(payload){if(!isObject(payload))return bad("response is not an object");let answers=payload.answers;if(!isObject(answers))return bad("response has no answers");return readChoiceAnswer(answers.verdict)}function readPlainAnswer(payload){if(!isObject(payload))return bad("response is not an object");let tier=payload.tier;if(typeof tier!=="string"||!isAutoRoutingTier(tier))return bad(`tier ${JSON.stringify(tier)} is not one of ${AUTO_ROUTING_TIERS.join(", ")}`);let confidence=readConfidence(payload.confidence);if(confidence===void 0)return bad("confidence is missing or not a number in [0,1]");return{ok:!0,value:{tier,confidence}}}var DEFAULT_TIER_RUBRIC={role:"\u4F60\u5728\u7ED9\u4E00\u6761\u300C\u7528\u6237\u65B0\u5EFA coding task \u65F6\u5199\u7684\u7B2C\u4E00\u53E5\u8BDD\u300D\u6253\u6DF1\u5EA6\u6863\u3002",criterion:"\u53EA\u6709\u4E00\u4E2A\u5224\u636E\uFF1A\u7528\u6237\u7684\u6307\u4EE4\u91CC\uFF0C\u6709\u591A\u5C11\u6D41\u7A0B\u9700\u8981\u6A21\u578B\u81EA\u5DF1\u63A8\u7406\u51FA\u6765\u3002\u4E0D\u770B\u5DE5\u4F5C\u91CF\uFF0C\u4E0D\u770B\u96BE\u5EA6\uFF0C\u4E0D\u770B\u6587\u672C\u957F\u77ED\uFF0C\u4E0D\u770B\u8BED\u8A00\u3002\u4E09\u6863\u6CA1\u6709\u76EE\u6807\u6BD4\u4F8B\u3002",criteria:{swift:{what:`- \u8BF4\u4E86\u600E\u4E48\u505A\uFF1Astep-by-step\u3001\u6307\u5230\u4E86\u6587\u4EF6/\u914D\u7F6E/\u9009\u9879\u3001\u7ED9\u4E86\u53C2\u8003\u5B9E\u73B0\uFF08\u300C\u53C2\u8003 vuetify \u540C\u540D prop\u300D\u300C\u50CF fzf \u90A3\u6837\u300D\uFF09\u3002
5
14
  - \u7528\u6237\u5DF2\u7ECF\u5B9A\u4F4D\u8FC7\u4E86\uFF1A\u300Cprofile \u4E86\u4E00\u4E0B\u53D1\u73B0\u662F X\uFF0C\u7F13\u5B58\u4E00\u4E0B\u5427\u300D\u2014\u2014\u539F\u56E0\u627E\u5230\u4E86\uFF0C\u5269\u4E0B\u7167\u505A\u3002
@@ -11,4 +20,4 @@ import{protocolEntry}from"./chunk-rf4z7b6g.js";import{isObject}from"./chunk-7ghw
11
20
  - **\u75C7\u72B6\u5E26\u6761\u4EF6\u3001\u4E0D\u7A33\u5B9A\u590D\u73B0\u3001\u6CA1\u6709\u4EFB\u4F55\u731C\u6D4B**\uFF1A\u300C\u6709\u65F6\u5019\u4F1A\u8DD1\u5230\u5C4F\u5E55\u5916\uFF0C\u591A\u5C4F\u60C5\u51B5\u4E0B\u300D\u300C\u611F\u89C9\u5361\u4E00\u4E0B\u300D\u300Cresults feel stale\u300D\u300C\u8D85\u8FC7 200 \u884C\u5C31\u7A7A\u767D\u300D\u2014\u2014\u5148\u8981\u627E\u5230\u89E6\u53D1\u6761\u4EF6\u624D\u6709\u76EE\u6807\u3002`,\u{8fb9}\u{754c}:"\u548C standard \u7684\u5206\u754C\uFF1A\u7528\u6237\u6709\u6CA1\u6709\u8BF4\u8981\u505A\u6210\u4EC0\u4E48\uFF1F\u6CA1\u6709 \u2192 deep\u3002\u4F46 deep \u8BF4\u7684\u662F\u300C\u8981\u5148\u8C03\u67E5\u624D\u77E5\u9053\u505A\u6210\u4EC0\u4E48\u6837\u300D\uFF0C\u4E0D\u662F\u300C\u8FD9\u53E5\u8BDD\u91CC\u6CA1\u6709\u6D3B\u300D\u3002\u4E00\u53E5\u5DF2\u7ECF\u5B8C\u6574\u3001\u53EF\u4EE5\u76F4\u63A5\u56DE\u7B54\u7684\u8BDD\u4E0D\u662F deep\uFF0C\u662F swift\u3002"}},examples:[{task:"\u80FD\u4E0D\u80FD\u8C03\u67E5\u4E00\u4E0B\u4E3A\u4EC0\u4E48\u5BA1\u8BA1\u65E5\u5FD7\u8868\u6700\u8FD1\u6DA8\u5F97\u8FD9\u4E48\u5FEB",tier:"deep"},{task:"\u641C\u7D22\u7ED3\u679C\u70B9\u8FDB\u53BB\u7ECF\u5E38\u662F\u6B7B\u94FE,404,\u9EBB\u70E6\u67E5\u4E00\u4E0B\u662F\u4E0D\u662F\u6784\u5EFA\u7684\u65F6\u5019\u8DEF\u7531\u6CA1\u540C\u6B65",tier:"standard"},{task:"\u6DF1\u8272\u6A21\u5F0F\u4EE3\u7801\u5757\u80CC\u666F\u8272\u8DDF\u6B63\u6587\u80CC\u666F\u4E00\u4E2A\u989C\u8272 \u770B\u4E0D\u51FA\u533A\u522B",tier:"swift"},{task:"Tooltip \u5728 iframe \u91CC\u5B9A\u4F4D\u5B8C\u5168\u662F\u9519\u7684",tier:"swift"},{task:"Table \u7EC4\u4EF6\u8868\u5934\u56FA\u5B9A\u4E4B\u540E\u6A2A\u5411\u6EDA\u52A8\u6761\u6D88\u5931\u4E86",tier:"standard"},{task:"Preferences window doesn't remember size after quit\n\n`PreferencesWindowController.swift` never persists its frame via `setFrameAutosaveName`. Add an autosave name and call it in `windowDidLoad`, so resizing the window sticks across relaunches like the main status window already does.",tier:"swift"},{task:"what would it take to add keyboard-only card creation (no mouse) to the board view?",tier:"deep"},{task:"Add a `--json` flag to the `board list` command\n\nRight now `board list` only prints an ASCII table (src/commands/list.ts). Add a `--json` flag that dumps the same data as JSON to stdout instead, and update the `--help` text in `cli.ts` to document it. Useful for piping into `jq` in scripts.",tier:"swift"},{task:"Scheduled job leaks DB connections\n\n`ReportGenerationJob.java` opens a `Connection` manually in `run()` but never closes it in the catch block when an exception is thrown mid-query. Under load this exhausts the HikariCP pool within a couple hours. Wrap it in try-with-resources and add a test that simulates a query failure and asserts pool size returns to baseline.",tier:"swift"},{task:"\u8DD1\u5927\u8868\u7684\u65F6\u5019\u62A5\u4E86\u4E2A\u5185\u5B58\u9519\u8BEF\n```\nMemoryError: Unable to allocate 3.2 GiB for an array\n```\n\u770B\u770B\u80FD\u4E0D\u80FD\u6D41\u5F0F\u5904\u7406\u4E0D\u8981\u4E00\u6B21\u8BFB\u5168\u90E8",tier:"standard"},{task:`\u89D2\u8272\u6743\u9650\u7F13\u5B58\u6CA1\u6709\u5931\u6548\u673A\u5236
12
21
 
13
22
  PermissionCacheService.java \u7528 Guava Cache \u5B58\u6743\u9650,\u6CA1\u8BBE TTL,\u7BA1\u7406\u5458\u5728\u540E\u53F0\u6539\u4E86\u67D0\u4E2A\u89D2\u8272\u7684\u6743\u9650\u4E4B\u540E,\u5DF2\u7ECF\u767B\u5F55\u7684\u7528\u6237\u90A3\u8FB9\u8FD8\u662F\u8BFB\u5230\u65E7\u7684\u7F13\u5B58\u503C,\u8981\u91CD\u542F\u670D\u52A1\u624D\u4F1A\u5237\u65B0\u3002\u60F3\u52A0\u4E24\u5757:\u4E00\u662F\u7ED9\u7F13\u5B58\u52A0\u4E2A\u5408\u7406\u7684 TTL \u515C\u5E95,\u4E8C\u662F\u5728 RoleController.updateRole \u4FDD\u5B58\u6210\u529F\u4E4B\u540E\u4E3B\u52A8\u8C03\u7528\u4E00\u6B21\u7F13\u5B58\u5931\u6548,\u628A\u6539\u52A8\u7ACB\u523B\u751F\u6548\u3002\u987A\u4FBF\u8865\u4E00\u4E2A\u8986\u76D6\u8FD9\u4E2A\u5931\u6548\u903B\u8F91\u7684\u5355\u6D4B\u3002`,tier:"swift"},{task:"any chance we could speed up the parquet export path? it feels way slower than the csv one for the same row count",tier:"deep"},{task:"could we support opening files in $EDITOR from the file manager instead of always using vi?",tier:"deep"},{task:"\u6253\u602A\u6389\u94B1\u7684\u51E0\u7387\u597D\u50CF\u592A\u9AD8\u4E86,\u80FD\u4E0D\u80FD\u914D\u7F6E\u5316",tier:"standard"},{task:"\u7535\u91CF\u56FE\u6807\u5728\u5145\u6EE1\u7535\u4E4B\u540E\u6CA1\u6709\u53D8\u7EFF,\u770B\u4E0B",tier:"standard"},{task:"any ideas on how to make undo/redo work across card moves, not just edits?",tier:"deep"},{task:"Getting this on startup after bumping api-version in plugin.yml:\n```\njava.lang.NoSuchMethodError: 'void org.bukkit.entity.Player.sendActionBar(net.md_5.bungee.api.chat.BaseComponent)'\n```\nLooks like a Paper API compat issue, please fix.",tier:"standard"},{task:"is there a way to make the Select component support async options loading?",tier:"deep"},{task:"websocket \u4EE3\u7406\u8001\u662F\u65AD\u8FDE,http \u7684\u6CA1\u95EE\u9898,\u662F\u4E0D\u662F upstream \u7684 timeout \u8BBE\u7F6E\u592A\u77ED\u4E86",tier:"standard"},{task:"OrderController \u7684\u5206\u9875\u63A5\u53E3,pageSize \u4F20\u8D85\u8FC7 1000 \u4F1A\u76F4\u63A5 OOM,\u52A0\u4E2A max pageSize \u6821\u9A8C,\u8D85\u8FC7\u5C31 400,\u987A\u4FBF\u628A error message \u91CC\u90A3\u53E5\u82F1\u6587\u6539\u6210\u4E2D\u6587",tier:"swift"},{task:"\u8BBE\u7F6E\u9762\u677F\u91CC\u52A0\u4E00\u4E2A\u300C\u5F00\u673A\u81EA\u542F\u300D\u7684\u5F00\u5173,\u7528 SMAppService \u90A3\u5957\u65B0 API(macOS 13+),\u72B6\u6001\u5B58\u8FDB UserDefaults \u7684 launchAtLogin \u952E,UI \u7167\u6284\u73B0\u5728\u300C\u663E\u793A\u79D2\u6570\u300D\u90A3\u4E2A toggle \u7684\u6837\u5F0F\u5C31\u884C",tier:"swift"},{task:"\u611F\u89C9\u542F\u52A8\u901F\u5EA6\u53EF\u4EE5\u518D\u5FEB\u70B9,\u8C03\u67E5\u4E00\u4E0B\u74F6\u9888\u5728\u54EA",tier:"deep"},{task:"\u6587\u4EF6\u6811\u6EDA\u52A8\u7684\u65F6\u5019\u611F\u89C9\u5361\u4E00\u4E0B \u80FD\u4E0D\u80FD\u67E5\u4E00\u4E0B\u662F\u4E0D\u662F\u91CD\u7ED8\u7684\u95EE\u9898",tier:"deep"},{task:"health check \u7684 interval \u73B0\u5728\u5199\u6B7B 5s,\u80FD\u4E0D\u80FD\u505A\u6210\u6BCF\u4E2A upstream \u53EF\u914D\u7F6E?",tier:"standard"}]};var JEV_ENDPOINT="https://api.typesafe.ai/v1/systemone",PROMPT_LIMIT=1200,DEFAULT_THRESHOLD=0.5,DEFAULT_TIMEOUT_MS=4000,DEFAULT_MODEL="jev-latest",DEFAULT_KEY_ENV="TYPESAFE_API_KEY";function stringAt2(get,key){let raw=get(key);return typeof raw==="string"&&raw.trim()?raw.trim():void 0}function numberAt(get,key,fallback,min,max){let raw=get(key);if(typeof raw==="string"&&!raw.trim())return fallback;let n=typeof raw==="number"?raw:Number(typeof raw==="string"?raw:Number.NaN);if(!Number.isFinite(n)||n<min||n>max)return fallback;return n}function isLoopback(hostname){let host=hostname.replace(/^\[|\]$/g,"").toLowerCase();return host==="localhost"||host.endsWith(".localhost")||host==="::1"||/^127\.\d+\.\d+\.\d+$/.test(host)}function endpointMode(raw){let url;try{url=new URL(raw)}catch{return{kind:"off"}}if(url.protocol==="https:")return{kind:"url",url:raw};if(url.protocol!=="http:")return{kind:"off"};if(isLoopback(url.hostname))return{kind:"url",url:raw};return{kind:"refused",why:`http:// is only accepted for a loopback address; use https:// for ${url.hostname}`}}function readClassifierConfig(get=getPersistedValue){let raw=stringAt2(get,"autoRouting.classifier")??"off",mode=raw==="jev"?{kind:"jev"}:raw==="off"?{kind:"off"}:endpointMode(raw),keyEnv=mode.kind==="jev"?stringAt2(get,"autoRouting.classifierKeyEnv")??DEFAULT_KEY_ENV:stringAt2(get,"autoRouting.classifierCustomKeyEnv");return{mode,threshold:numberAt(get,"autoRouting.classifierThreshold",DEFAULT_THRESHOLD,0,1),timeoutMs:numberAt(get,"autoRouting.classifierTimeoutMs",DEFAULT_TIMEOUT_MS,200,60000),model:stringAt2(get,"autoRouting.classifierModel")??DEFAULT_MODEL,...keyEnv?{keyEnv}:{}}}var declined=(reason,detail)=>({kind:"declined",reason,...detail?{detail}:{}});async function classifyTier(text,config,deps={}){if(config.mode.kind==="off")return declined("off");if(config.mode.kind==="refused")return declined("refused",config.mode.why);let prompt=text.trim().slice(0,PROMPT_LIMIT);if(!prompt)return declined("blank");let env=deps.env??process.env,key=config.keyEnv?(deps.readSecret??resolveSecret)(config.keyEnv,env):void 0;if(config.mode.kind==="jev"&&!key)return declined("no-key",`no ${config.keyEnv} in the environment or ~/.rove/secrets.json`);let doFetch=deps.fetch??globalThis.fetch,controller=new AbortController,timer=setTimeout(()=>controller.abort(),config.timeoutMs);try{let request=config.mode.kind==="jev"?{url:JEV_ENDPOINT,body:jevRequest(prompt,config.model,deps.rubric??DEFAULT_TIER_RUBRIC)}:{url:config.mode.url,body:{text:prompt}},res=await doFetch(request.url,{method:"POST",headers:{"content-type":"application/json",...key?{authorization:`Bearer ${key}`}:{}},body:JSON.stringify(request.body),signal:controller.signal,redirect:"error"});if(!res.ok)return declined("failed",describeHttpFailure(res));let payload=await res.json(),verdict=config.mode.kind==="jev"?readJevAnswer(payload):readPlainAnswer(payload);if(!verdict.ok)return declined("failed",verdict.why);if(verdict.value.confidence<config.threshold)return declined("low-confidence",`${verdict.value.tier} at ${verdict.value.confidence.toFixed(2)}`);return{kind:"picked",verdict:verdict.value}}catch(err){let why=err instanceof Error&&err.name==="AbortError"?`timed out after ${config.timeoutMs}ms`:String(err);return declined("failed",why)}finally{clearTimeout(timer)}}function describeHttpFailure(res){let status=`HTTP ${res.status}`;if(res.status!==429)return status;let after=res.headers?.get?.("retry-after"),when=after?`, retry-after ${after}`:"";return`${status} \u2014 upstream pool rate limit, not necessarily your quota${when}`}function jevRequest(prompt,model,rubric){return{model,state:{task_text:prompt,labelled_examples:rubric.examples.map((e)=>({task:e.task,tier:e.tier}))},questions:{verdict:{type:"choice",criteria:rubric.criteria,instructions:{role:rubric.role,criterion:rubric.criterion}}}}}var TASK_GROUPS=["waiting-on-you","landing","ready-for-review","working","idle","unknown"];function taskGroupRank(group){return TASK_GROUPS.indexOf(group)}var ERROR_SETTLE_MS=20000,DEAD_SETTLE_MS=60000;function actedOn(task){if(task.status==="done"||task.status==="canceled")return!0;let lifecycle=task.prStatus?.lifecycle;return lifecycle==="merged"||lifecycle==="closed"}function autoResumes(task,now){let at=task.quotaResume?.resumeAt;if(!at)return!1;let ms=Date.parse(at);return!Number.isNaN(ms)&&ms>now}function deriveTaskGroup(input){let{task,now}=input,activity=input.activity??null,state=activity?.state,age=activity?Math.max(0,now-activity.at):0;if(task.deletion?.phase==="error")return"waiting-on-you";if(state==="permission_needed")return"waiting-on-you";if(state==="rate_limited"&&!autoResumes(task,now))return"waiting-on-you";if(state==="error"&&age>=ERROR_SETTLE_MS)return"waiting-on-you";if(activity&&!task.report&&age>=DEAD_SETTLE_MS&&(state==="dead"||input.tabAlive===!1))return"waiting-on-you";if(state==="running"&&input.tabAlive!==!1)return"working";if(state==="rate_limited")return"working";let pr=task.prStatus;if((pr?.lifecycle==="open"||pr?.lifecycle==="ready_to_merge")&&(pr.reviewDecision??"").toUpperCase()==="APPROVED")return"landing";if((task.report!==void 0||state==="turn_complete")&&!actedOn(task))return"ready-for-review";return activity?"idle":"unknown"}function taskGroupOf(input){let group=deriveTaskGroup(input);return{group,rank:taskGroupRank(group)}}
14
- export{classifyScreen,screenErrorLine,secretStatus,writeSecret,AUTO_ROUTING_TIERS,isAutoRoutingTier,autoRoutingKey,readAutoRoutingTable,tierBlock,describeTierBlock,readClassifierConfig,classifyTier,taskGroupRank,deriveTaskGroup,taskGroupOf};
23
+ export{classifyScreen,screenErrorLine,secretStatus,writeSecret,AUTO_ROUTING_TIERS,isAutoRoutingTier,autoRoutingKey,readAutoRoutingTable,tierBlock,describeTierBlock,readClassifierConfig,classifyTier,taskGroupRank,deriveTaskGroup,taskGroupOf,worktreeFilePath,filetypeOf,isCombinedPathspec,unifiedDiffFiles,isImagePath,loadPreviewData,listFiles,statusFiles,resolveBase,statusFilesBranch};