@sma1lboy/rove 0.9.190 → 0.9.192

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 (136) hide show
  1. package/dist/cli/chunk-05jej26n.js +3 -0
  2. package/dist/cli/{chunk-xjnd1hwr.js → chunk-06agxrff.js} +1 -1
  3. package/dist/cli/{chunk-qvf2zh14.js → chunk-072m1jjt.js} +1 -1
  4. package/dist/cli/chunk-22jgttzv.js +3 -0
  5. package/dist/cli/{chunk-j7kh6qj1.js → chunk-2a3ecfth.js} +1 -1
  6. package/dist/cli/{chunk-p94469k0.js → chunk-2whb5300.js} +1 -1
  7. package/dist/cli/chunk-3xkh6kf7.js +2 -0
  8. package/dist/cli/chunk-40dgv828.js +4 -0
  9. package/dist/cli/{chunk-h3gqr77q.js → chunk-42sc0emk.js} +3 -3
  10. package/dist/cli/{chunk-2pv5vb5a.js → chunk-4jrad3q0.js} +1 -1
  11. package/dist/cli/chunk-4kyjgysj.js +3 -0
  12. package/dist/cli/{chunk-myewhxvp.js → chunk-646ss2m1.js} +1 -1
  13. package/dist/cli/{chunk-wm14aqwc.js → chunk-65b2xnba.js} +1 -1
  14. package/dist/cli/chunk-66ay20qj.js +1 -1
  15. package/dist/cli/{chunk-wdrgfezn.js → chunk-674es6he.js} +1 -1
  16. package/dist/cli/{chunk-mrszjfxd.js → chunk-6d7rjjbb.js} +1 -1
  17. package/dist/cli/{chunk-jj4x05y6.js → chunk-6e07s3qj.js} +1 -1
  18. package/dist/cli/chunk-6ey2nr4j.js +2 -0
  19. package/dist/cli/chunk-6txd5jtt.js +2 -0
  20. package/dist/cli/{chunk-pjk7jxjb.js → chunk-6ymf66mq.js} +1 -1
  21. package/dist/cli/{chunk-nn099hrx.js → chunk-738d2s48.js} +2 -2
  22. package/dist/cli/chunk-7vjv237v.js +8 -0
  23. package/dist/cli/chunk-8gmwa1fs.js +2 -0
  24. package/dist/cli/chunk-9756pmqx.js +2 -0
  25. package/dist/cli/chunk-9cca6hh0.js +4 -0
  26. package/dist/cli/chunk-9d4tfysz.js +1 -1
  27. package/dist/cli/{chunk-px6axbd9.js → chunk-9fc0j6ng.js} +1 -1
  28. package/dist/cli/{chunk-0pazt6mk.js → chunk-9kf9v85y.js} +1 -1
  29. package/dist/cli/{chunk-mqh8f3zv.js → chunk-9nv53s3m.js} +1 -1
  30. package/dist/cli/{chunk-hz8ynrv6.js → chunk-9qf62gnc.js} +1 -1
  31. package/dist/cli/chunk-9va1mbqk.js +2 -0
  32. package/dist/cli/{chunk-w4y5cmbs.js → chunk-9vqkh1jv.js} +1 -1
  33. package/dist/cli/chunk-9ydhv2zb.js +3 -0
  34. package/dist/cli/{chunk-7jkf3tvr.js → chunk-aep7gvh4.js} +2 -2
  35. package/dist/cli/chunk-bq9shn2d.js +4 -0
  36. package/dist/cli/{chunk-j6tmzwc9.js → chunk-c60a4k2q.js} +1 -1
  37. package/dist/cli/{chunk-kyr0cyq1.js → chunk-c8xm2s8h.js} +1 -1
  38. package/dist/cli/{chunk-1x7xjh3h.js → chunk-cckrwr2v.js} +1 -1
  39. package/dist/cli/chunk-d4fvkzp3.js +1 -1
  40. package/dist/cli/{chunk-ectyq178.js → chunk-d7bdt1td.js} +1 -1
  41. package/dist/cli/{chunk-mamm5f66.js → chunk-day3fqg9.js} +1 -1
  42. package/dist/cli/{chunk-rc0sqhdh.js → chunk-dg8bsyb9.js} +1 -1
  43. package/dist/cli/chunk-e4804kqb.js +2 -0
  44. package/dist/cli/chunk-ejbhw0y1.js +2 -0
  45. package/dist/cli/{chunk-p0zrjj7n.js → chunk-f60f0zqm.js} +3 -3
  46. package/dist/cli/{chunk-hgczkz57.js → chunk-fcd3w4v9.js} +2 -2
  47. package/dist/cli/{chunk-5ygc7rce.js → chunk-fgn4qk9p.js} +1 -1
  48. package/dist/cli/{chunk-hex5xwyk.js → chunk-fgx4gnwc.js} +1 -1
  49. package/dist/cli/{chunk-1mdah6n8.js → chunk-frprsqdw.js} +1 -1
  50. package/dist/cli/{chunk-ar48zb4b.js → chunk-g1jhm3pb.js} +1 -1
  51. package/dist/cli/chunk-g8ap5366.js +4 -0
  52. package/dist/cli/chunk-gg6p708e.js +2 -0
  53. package/dist/cli/{chunk-9n3agxv0.js → chunk-grdk12w7.js} +1 -1
  54. package/dist/cli/chunk-hkx2y96a.js +1 -1
  55. package/dist/cli/{chunk-a0ytx1ab.js → chunk-hxmzxn22.js} +1 -1
  56. package/dist/cli/{chunk-bkm7vxr5.js → chunk-j5przd8x.js} +1 -1
  57. package/dist/cli/chunk-k6nxyxyh.js +3 -0
  58. package/dist/cli/chunk-k9xpebq8.js +1 -1
  59. package/dist/cli/chunk-kks0vy2x.js +2 -0
  60. package/dist/cli/{chunk-r9gfh1zz.js → chunk-krpsfcda.js} +1 -1
  61. package/dist/cli/chunk-kx3kydwv.js +4 -0
  62. package/dist/cli/{chunk-vvyg65jf.js → chunk-ms69jdrr.js} +1 -1
  63. package/dist/cli/{chunk-ex0tesmv.js → chunk-ms9pzccb.js} +1 -1
  64. package/dist/cli/{chunk-dc8hk7a7.js → chunk-n4zhfjrv.js} +1 -1
  65. package/dist/cli/chunk-na3tmp41.js +2 -0
  66. package/dist/cli/chunk-ndtbxgyp.js +1 -1
  67. package/dist/cli/{chunk-86938f2g.js → chunk-np8mrc2m.js} +2 -2
  68. package/dist/cli/{chunk-61ak2y9n.js → chunk-p4wqpc6a.js} +6 -6
  69. package/dist/cli/chunk-pf4jey48.js +2 -0
  70. package/dist/cli/{chunk-hm1fg4b1.js → chunk-pkckq6ns.js} +1 -1
  71. package/dist/cli/{chunk-p3stdyd2.js → chunk-psgaps88.js} +1 -1
  72. package/dist/cli/{chunk-gc1x5v4n.js → chunk-qadaqgnz.js} +1 -1
  73. package/dist/cli/{chunk-0rsjdc2p.js → chunk-r120ye6v.js} +1 -1
  74. package/dist/cli/{chunk-pdnq8dbm.js → chunk-r92b9j14.js} +1 -1
  75. package/dist/cli/chunk-s0snbj93.js +2 -0
  76. package/dist/cli/chunk-s9y0ebgh.js +2 -0
  77. package/dist/cli/{chunk-8s5yzt7z.js → chunk-sceaevbq.js} +2 -2
  78. package/dist/cli/{chunk-sms43h4t.js → chunk-sz0fjg3e.js} +1 -1
  79. package/dist/cli/chunk-tfqyddnn.js +7 -0
  80. package/dist/cli/{chunk-18rdsr2j.js → chunk-tgafcwp9.js} +1 -1
  81. package/dist/cli/{chunk-xqdhp9y5.js → chunk-th4jd4sd.js} +2 -2
  82. package/dist/cli/chunk-ts0078by.js +2 -0
  83. package/dist/cli/{chunk-92d2t5sk.js → chunk-v3fqkype.js} +1 -1
  84. package/dist/cli/{chunk-p682ggqt.js → chunk-vas2mpdv.js} +2 -2
  85. package/dist/cli/chunk-whe3w5jh.js +8 -0
  86. package/dist/cli/{chunk-r85jw4qg.js → chunk-x2c7ehve.js} +1 -1
  87. package/dist/cli/{chunk-jpdf97cx.js → chunk-xd9kw4hh.js} +1 -1
  88. package/dist/cli/{chunk-d3qmrnc6.js → chunk-xdc8zk9x.js} +1 -1
  89. package/dist/cli/{chunk-f48pdjby.js → chunk-yhhkw0az.js} +1 -1
  90. package/dist/cli/chunk-yk2q890q.js +2 -0
  91. package/dist/cli/chunk-yqffntmy.js +2 -0
  92. package/dist/cli/chunk-yybpg7fh.js +10 -0
  93. package/dist/cli/{chunk-71k66b8f.js → chunk-zb55a46t.js} +124 -5
  94. package/dist/cli/{chunk-vhq2dhx2.js → chunk-ztwz2465.js} +1 -1
  95. package/dist/cli/chunk-zw9q9da9.js +2 -0
  96. package/dist/cli/index.js +7 -7
  97. package/dist/cli/kobe.js +1 -1
  98. package/dist/cli/rove.js +1 -1
  99. package/dist/completions/kobe.bash +25 -0
  100. package/dist/completions/kobe.fish +27 -0
  101. package/dist/completions/kobe.zsh +35 -0
  102. package/dist/completions/rove.bash +25 -0
  103. package/dist/completions/rove.fish +27 -0
  104. package/dist/completions/rove.zsh +35 -0
  105. package/dist/skills/rove/SKILL.md +1 -1
  106. package/dist/skills/rove/references/api-flags.md +2 -2
  107. package/package.json +2 -2
  108. package/dist/cli/chunk-0waq0d0k.js +0 -2
  109. package/dist/cli/chunk-16rt509n.js +0 -2
  110. package/dist/cli/chunk-1b0cmce4.js +0 -2
  111. package/dist/cli/chunk-2w9pqcc3.js +0 -12
  112. package/dist/cli/chunk-55qxr553.js +0 -2
  113. package/dist/cli/chunk-5zh5fcpe.js +0 -4
  114. package/dist/cli/chunk-8v4hq025.js +0 -2
  115. package/dist/cli/chunk-9nngww22.js +0 -8
  116. package/dist/cli/chunk-ba4c8qjw.js +0 -2
  117. package/dist/cli/chunk-bq3fyc0p.js +0 -3
  118. package/dist/cli/chunk-bsg826q0.js +0 -2
  119. package/dist/cli/chunk-bveqt1bn.js +0 -2
  120. package/dist/cli/chunk-c2aqag1z.js +0 -2
  121. package/dist/cli/chunk-d6x4gama.js +0 -7
  122. package/dist/cli/chunk-ejqs2ta9.js +0 -3
  123. package/dist/cli/chunk-f01z7hw8.js +0 -2
  124. package/dist/cli/chunk-f62n9xqs.js +0 -2
  125. package/dist/cli/chunk-g2e1dmxh.js +0 -4
  126. package/dist/cli/chunk-g6x26jt2.js +0 -2
  127. package/dist/cli/chunk-gq81y9jt.js +0 -2
  128. package/dist/cli/chunk-kkt6ct7g.js +0 -4
  129. package/dist/cli/chunk-nhsr87w7.js +0 -2
  130. package/dist/cli/chunk-nk1d8t3a.js +0 -3
  131. package/dist/cli/chunk-p9gnqtfe.js +0 -2
  132. package/dist/cli/chunk-r8j5zpt9.js +0 -2
  133. package/dist/cli/chunk-t6mq1dnw.js +0 -3
  134. package/dist/cli/chunk-w7a39tk8.js +0 -2
  135. package/dist/cli/chunk-xqw5d5rv.js +0 -3
  136. package/dist/cli/chunk-zj8y4f4x.js +0 -4
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{spawnCapture}from"./chunk-khj0apc7.js";import{CONTRIB_ENGINE_IDS,contribEngineEntry,detectClaudeAccount,detectCodexAccount,detectCopilotAccount,detectKimiAccount,isContribEngine,pluginEngineIds}from"./chunk-5zh5fcpe.js";import{TomlError,parse}from"./chunk-w7zv47mp.js";import{ClaudeHookAdapter,GATED_TOOL_VERBS,JsonHookAdapter,hookCommandQuoting,isObject,kobeHookInvocation,readSharedConfigSync,updateSharedJsonSync}from"./chunk-pdnq8dbm.js";import{claudeGlobalConfigPath,copilotConfigPath,isJsonlLineWithinBound,readFirstLineBounded,readTextFileBounded,readTextFileIfRegular,vendorConfigHome,vendorWriteHomeDeps}from"./chunk-7jkf3tvr.js";import{quoteShellArgv}from"./chunk-7kysxgbq.js";import{BUILTIN_VENDORS,isBuiltinVendor}from"./chunk-bq3fyc0p.js";import{samePath}from"./chunk-f10n6063.js";var claudeCapabilities={interruptSequence:"\x1B"},claudeIdentity={shortName:"Claude"};import{homedir,userInfo}from"os";import path from"path";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";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}var clampPercent=(value)=>Math.min(100,Math.max(0,Math.round(value)));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}}var isFresh=(c)=>c.expiresAt===void 0||c.expiresAt>Date.now();async function readFileCredentials(dir){try{return parseCredentials(await readTextFileBounded(path.join(dir,".credentials.json")))}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:homedir(),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(vendorConfigHome("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)}}function trustClaudeWorktree(worktreePath,home){let deps=vendorWriteHomeDeps(home);updateSharedJsonSync(claudeGlobalConfigPath(deps.env,deps.home()),(raw)=>{if(raw===void 0)return{};let doc=JSON.parse(raw);if(!isObject(doc))throw Error("Claude trust config must be a JSON object");return doc},(doc)=>{if(doc.projects!==void 0&&!isObject(doc.projects))throw Error("Claude trust projects must be an object");let projects={...doc.projects},existing=Object.hasOwn(projects,worktreePath)?projects[worktreePath]:{};if(!isObject(existing))throw Error("Claude trust project must be an object");if(existing.hasTrustDialogAccepted===!0)return;return projects[worktreePath]={...existing,hasTrustDialogAccepted:!0,hasCompletedProjectOnboarding:!0},JSON.stringify({...doc,projects},null,2)})}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(`
2
+ import{CONTRIB_ENGINE_IDS,contribEngineEntry,detectClaudeAccount,detectCodexAccount,detectCopilotAccount,detectKimiAccount,isContribEngine,pluginEngineIds}from"./chunk-kx3kydwv.js";import{TomlError,parse}from"./chunk-w7zv47mp.js";import{spawnCapture}from"./chunk-khj0apc7.js";import{ClaudeHookAdapter,GATED_TOOL_VERBS,JsonHookAdapter,hookCommandQuoting,isObject,kobeHookInvocation,readSharedConfigSync,updateSharedJsonSync}from"./chunk-r92b9j14.js";import{claudeGlobalConfigPath,copilotConfigPath,isJsonlLineWithinBound,readFirstLineBounded,readTextFileBounded,readTextFileIfRegular,vendorAgentDir,vendorConfigHome,vendorWriteHomeDeps}from"./chunk-aep7gvh4.js";import{quoteShellArgv}from"./chunk-7kysxgbq.js";import{BUILTIN_VENDORS,isBuiltinVendor}from"./chunk-05jej26n.js";import{samePath}from"./chunk-f10n6063.js";var claudeCapabilities={interruptSequence:"\x1B"},claudeIdentity={shortName:"Claude"};import{homedir,userInfo}from"os";import path from"path";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";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}var clampPercent=(value)=>Math.min(100,Math.max(0,Math.round(value)));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}}var isFresh=(c)=>c.expiresAt===void 0||c.expiresAt>Date.now();async function readFileCredentials(dir){try{return parseCredentials(await readTextFileBounded(path.join(dir,".credentials.json")))}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:homedir(),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(vendorConfigHome("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)}}function trustClaudeWorktree(worktreePath,home){let deps=vendorWriteHomeDeps(home);updateSharedJsonSync(claudeGlobalConfigPath(deps.env,deps.home()),(raw)=>{if(raw===void 0)return{};let doc=JSON.parse(raw);if(!isObject(doc))throw Error("Claude trust config must be a JSON object");return doc},(doc)=>{if(doc.projects!==void 0&&!isObject(doc.projects))throw Error("Claude trust projects must be an object");let projects={...doc.projects},existing=Object.hasOwn(projects,worktreePath)?projects[worktreePath]:{};if(!isObject(existing))throw Error("Claude trust project must be an object");if(existing.hasTrustDialogAccepted===!0)return;return projects[worktreePath]={...existing,hasTrustDialogAccepted:!0,hasCompletedProjectOnboarding:!0},JSON.stringify({...doc,projects},null,2)})}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(`
3
3
  `)){let trimmed=line.trim();if(!trimmed||!isJsonlLineWithinBound(trimmed))continue;let record;try{record=JSON.parse(trimmed)}catch{continue}if(!isObject2(record)||isSyntheticClaudeRecord(record))continue;let inner=isObject2(record.message)?record.message:record,at=typeof record.timestamp==="string"?Date.parse(record.timestamp):Number.NaN;if(!Number.isFinite(at))continue;let sessionId=typeof record.sessionId==="string"?record.sessionId:fallbackSessionId;if(inner.role==="user"){if(!opensTurn(inner.content))continue;if(draft){let done=finish(draft);if(done)out.push(done)}draft={id:"",sessionId,startedAt:at,endedAt:at,usageByMessage:new Map};continue}if(inner.role!=="assistant"||!draft)continue;if(draft.endedAt=at,typeof inner.model==="string")draft.model=inner.model;let messageId=typeof inner.id==="string"?inner.id:"";if(messageId)draft.id=messageId;let usage=readUsage(inner.usage);if(usage&&messageId)draft.usageByMessage.set(messageId,usage)}if(draft){let done=finish(draft);if(done)out.push(done)}return out}async function readClaudeTurns(transcriptPath){try{let raw=await readTextFileBounded(transcriptPath);return parseClaudeTurns(raw)}catch{return[]}}var HEX_RE=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;function parseHex(value){let match=HEX_RE.exec(value);if(!match)return[0,0,0];return[Number.parseInt(match[1],16),Number.parseInt(match[2],16),Number.parseInt(match[3],16)]}function luminance([red,green,blue]){return(red*0.2126+green*0.7152+blue*0.0722)/255}function blend(from,to,amount){return[Math.round(from[0]+(to[0]-from[0])*amount),Math.round(from[1]+(to[1]-from[1])*amount),Math.round(from[2]+(to[2]-from[2])*amount)]}function codexUserMessageBackground(background){return luminance(background)>0.5?blend(background,[0,0,0],0.04):blend(background,[255,255,255],0.12)}function transcriptRewrite(palette){let foreground=parseHex(palette.foreground),background=parseHex(palette.background),backgroundIsLight=luminance(background)>0.5;return{matchBackground:codexUserMessageBackground(background),foreground:backgroundIsLight?foreground:background,background:backgroundIsLight?background:foreground}}var codexTerminalPresentation={alternateScreenStyleRewrites:(palette)=>[transcriptRewrite(palette)]};var codexCapabilities={terminalPresentation:codexTerminalPresentation,interruptSequence:"\x1B"},codexIdentity={shortName:"Codex"};import{join}from"path";var EVENT_MAP=[{event:"SessionStart",verb:"session-start"},{event:"UserPromptSubmit",verb:"turn-start"},{event:"Stop",verb:"turn-complete"},{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"}],KOBE_CODEX_HOOK_EVENTS=EVENT_MAP.map((e)=>e.event);function codexHooksPath(){return join(vendorConfigHome("codex"),"hooks.json")}class CodexHookAdapter extends JsonHookAdapter{vendor="codex";eventMap=EVENT_MAP;globalSettingsPath(){return codexHooksPath()}activityDetailFromPayload(kind,payload){if(kind==="tool-pre"||kind==="tool-post")return{tool:{...typeof payload.tool_name==="string"?{name:payload.tool_name}:{}}};if(kind==="pre-compact"||kind==="post-compact")return{compact:{trigger:payload.trigger==="manual"?"manual":"auto"}};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}:{}}}}import{createHash}from"crypto";function createAppendParseCache(opts){let maxFiles=opts.maxFiles??8,cache=new Map;function remember(filePath,entry){if(cache.delete(filePath),cache.set(filePath,entry),cache.size>maxFiles){let oldest=cache.keys().next().value;if(oldest!==void 0)cache.delete(oldest)}}return function(filePath,raw,ctx){let stableLength=raw.lastIndexOf(`
4
4
  `)+1,entry=cache.get(filePath),verifiedLength=Math.min(entry?.prefixLength??0,stableLength),hash=createHash("sha256").update(raw.slice(0,verifiedLength)),unchanged=entry!==void 0&&Object.is(entry.context,ctx)&&entry.prefixLength<=stableLength&&hash.copy().digest("hex")===entry.prefixHash,prefixState;if(unchanged)prefixState=entry.prefixLength<stableLength?opts.parseChunk(raw.slice(entry.prefixLength,stableLength),entry.state,ctx):entry.state;else prefixState=opts.parseChunk(raw.slice(0,stableLength),opts.initial(ctx),ctx);if(!unchanged||entry.prefixLength!==stableLength||entry.state!==prefixState)remember(filePath,{context:ctx,prefixLength:stableLength,prefixHash:hash.update(raw.slice(verifiedLength,stableLength)).digest("hex"),state:prefixState});let tail=raw.slice(stableLength);return tail.trim().length>0?opts.parseChunk(tail,prefixState,ctx):prefixState}}var sortedMessages=new WeakMap;function sortByTimestamp(messages){let hit=sortedMessages.get(messages);if(hit)return hit;let sorted=[...messages].sort((a,b)=>a.timestamp<b.timestamp?-1:a.timestamp>b.timestamp?1:0);return sortedMessages.set(messages,sorted),sorted}function normalizeCodexContent(raw){if(typeof raw==="string")return raw.length>0?[{type:"text",text:raw}]:[];if(!Array.isArray(raw))return[];let blocks=[];for(let item of raw){if(typeof item==="string"){if(item.length>0)blocks.push({type:"text",text:item});continue}if(!isObject3(item))continue;let t=typeof item.type==="string"?item.type:void 0;if(t==="input_text"||t==="output_text"){let text=typeof item.text==="string"?item.text:"";if(text.length>0)blocks.push({type:"text",text});continue}if(t)blocks.push({type:"text",text:`[codex: ${t}]`})}return blocks}function isObject3(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function isSyntheticCodexUserRow(blocks){if(blocks.length===0)return!1;for(let b of blocks){if(b.type!=="text")return!1;let t=(b.text??"").trim();if(!isTagEnvelope(t)&&!isInstructionsEnvelope(t))return!1}return!0}var ENVELOPE_TAGS=["environment_context","recommended_plugins","user_instructions"];function isTagEnvelope(text){return ENVELOPE_TAGS.some((tag)=>text.startsWith(`<${tag}>`)&&text.endsWith(`</${tag}>`))}function isInstructionsEnvelope(text){return text.startsWith("# AGENTS.md instructions")&&text.includes("<INSTRUCTIONS>")}function codexUsageToSnapshot(usage,opts={}){let totalInput=numberOr(usage.input_tokens,0),cachedInput=numberOr(usage.cached_input_tokens,0),output=numberOr(usage.output_tokens,0),nonCachedInput=Math.max(0,totalInput-cachedInput);if(totalInput<=0&&output<=0&&cachedInput<=0)return;return{input_tokens:nonCachedInput,output_tokens:output,...cachedInput>0?{cache_read_input_tokens:cachedInput}:{},...validPositive(opts.contextWindowTokens)?{context_window_tokens:opts.contextWindowTokens}:{}}}function numberOr(v,fallback){return typeof v==="number"&&Number.isFinite(v)?v:fallback}function validPositive(v){return typeof v==="number"&&Number.isFinite(v)&&v>0}var emptyState={messages:[],latestUsage:void 0,latestUsageTimestampMs:null},cache=createAppendParseCache({initial:()=>emptyState,parseChunk:foldRolloutChunk});function parseRolloutRaw(filePath,raw,sessionId){let state=cache(filePath,raw,sessionId);return{messages:sortByTimestamp(state.messages),...state.latestUsage?{usageMetrics:state.latestUsage}:{}}}function foldRolloutChunk(chunk,prev,sessionId){let updatedMessages,writableMessages=()=>{return updatedMessages??=[...prev.messages],updatedMessages},latestUsage=prev.latestUsage,latestUsageTimestampMs=prev.latestUsageTimestampMs;for(let line of chunk.split(`
5
5
  `)){let trimmed=line.trim();if(!trimmed)continue;if(!isJsonlLineWithinBound(trimmed))continue;let parsed;try{parsed=JSON.parse(trimmed)}catch{continue}if(!isObject4(parsed))continue;if(parsed.type==="response_item"){let payload=isObject4(parsed.payload)?parsed.payload:void 0;if(!payload)continue;let ts=typeof parsed.timestamp==="string"?parsed.timestamp:new Date().toISOString(),msg=normalizeCodexResponseItem(payload,ts,sessionId);if(msg)writableMessages().push(msg);continue}let usageFields=codexUsageFields(parsed);if(!usageFields)continue;let base=codexUsageToSnapshot(usageFields.usage,{contextWindowTokens:usageFields.contextWindow});if(!base)continue;let lastPrompt=usageFields.lastUsage?numberOr2(usageFields.lastUsage.input_tokens):0,snapshot={...base,...lastPrompt>0?{context_tokens:lastPrompt}:{}},lastUsage=usageFields.lastUsage&&codexLastUsageToMessageUsage(usageFields.lastUsage);if(lastUsage){let messages=updatedMessages??prev.messages,index=messages.findLastIndex((message2)=>message2.role==="assistant"),message=messages[index];if(message)writableMessages()[index]={...message,usage:lastUsage}}let timestampMs=typeof parsed.timestamp==="string"?parseTimestampMs(parsed.timestamp):null;if(timestampMs!==null&&(latestUsageTimestampMs===null||timestampMs>latestUsageTimestampMs))latestUsageTimestampMs=timestampMs,latestUsage=snapshot;else if(latestUsageTimestampMs===null)latestUsage=snapshot}return{messages:updatedMessages??prev.messages,latestUsage,latestUsageTimestampMs}}function codexUsageFields(parsed){if(parsed.type==="event_msg"){let payload=isObject4(parsed.payload)?parsed.payload:void 0;if(payload?.type!=="token_count")return;let info=isObject4(payload.info)?payload.info:void 0,usage=info&&isObject4(info.total_token_usage)?info.total_token_usage:void 0;if(!usage)return;let lastUsage=info&&isObject4(info.last_token_usage)?info.last_token_usage:void 0,contextWindow=typeof info?.model_context_window==="number"?info.model_context_window:void 0;return{usage,lastUsage,contextWindow}}if(parsed.type==="turn.completed"){let usage=isObject4(parsed.usage)?parsed.usage:void 0;return usage?{usage,lastUsage:usage,contextWindow:void 0}:void 0}return}function codexLastUsageToMessageUsage(usage){let totalInput=numberOr2(usage.input_tokens),cachedInput=numberOr2(usage.cached_input_tokens),output=numberOr2(usage.output_tokens);if(totalInput<=0&&output<=0&&cachedInput<=0)return;return{input_tokens:Math.max(0,totalInput-cachedInput),output_tokens:output,...cachedInput>0?{cache_read_input_tokens:cachedInput}:{}}}function numberOr2(v){return typeof v==="number"&&Number.isFinite(v)?v:0}function normalizeCodexResponseItem(payload,timestamp,sessionId){if(payload.type==="message"){let role=payload.role;if(role!=="user"&&role!=="assistant"&&role!=="system")return;let blocks=normalizeCodexContent(payload.content);if(role==="user"&&isSyntheticCodexUserRow(blocks))return;return{role,blocks,timestamp,sessionId}}if(payload.type==="reasoning")return normalizeCodexReasoning(payload,timestamp,sessionId);if(payload.type==="function_call")return normalizeCodexToolCall(payload,timestamp,sessionId,{name:stringOr(payload.name,"function_call"),input:parseMaybeJson(payload.arguments)});if(payload.type==="custom_tool_call")return normalizeCodexToolCall(payload,timestamp,sessionId,{name:stringOr(payload.name,"custom_tool_call"),input:parseMaybeJson(payload.input)});if(payload.type==="tool_search_call")return normalizeCodexToolCall(payload,timestamp,sessionId,{name:"tool_search_call",input:stripPayload(payload,["type","call_id","status"])});if(payload.type==="function_call_output"||payload.type==="custom_tool_call_output")return normalizeCodexToolResult(payload,timestamp,sessionId,parseMaybeJson(payload.output));if(payload.type==="tool_search_output")return normalizeCodexToolResult(payload,timestamp,sessionId,stripPayload(payload,["type","call_id"]));if(payload.type==="web_search_call"||payload.type==="image_generation_call"||payload.type==="local_shell_call")return normalizeSingleRecordTool(payload,timestamp,sessionId);return}function normalizeCodexReasoning(payload,timestamp,sessionId){let text=reasoningTextFromItem(payload);if(text.length===0)return;return{role:"assistant",blocks:[{type:"thinking",text}],timestamp,sessionId}}function normalizeCodexToolCall(payload,timestamp,sessionId,args){let callId=typeof payload.call_id==="string"?payload.call_id:void 0;if(!callId)return;return{role:"assistant",blocks:[{type:"tool_call",callId,name:args.name,input:args.input}],timestamp,sessionId}}function normalizeCodexToolResult(payload,timestamp,sessionId,output){let callId=typeof payload.call_id==="string"?payload.call_id:void 0;if(!callId)return;return{role:"user",blocks:[{type:"tool_result",callId,output,isError:!1}],timestamp,sessionId}}var CODEX_OK_STATUSES=new Set(["completed","in_progress"]);function normalizeSingleRecordTool(payload,timestamp,sessionId){let type=typeof payload.type==="string"?payload.type:"tool",callId=typeof payload.call_id==="string"&&payload.call_id.length>0?payload.call_id:`${type}:${timestamp}`,name=stringOr(payload.name,type),input=stripPayload(payload,["type","call_id","status"]),output=stripPayload(payload,["type","call_id"]),status=payload.status,isError=typeof status==="string"&&!CODEX_OK_STATUSES.has(status);return{role:"assistant",timestamp,sessionId,blocks:[{type:"tool_call",callId,name,input},{type:"tool_result",callId,output,isError}]}}function reasoningTextFromItem(item){let content=textFromReasoningValue(item.content);if(content.length>0)return content;let text=typeof item.text==="string"?item.text:"";if(text.length>0)return text;return textFromReasoningValue(item.summary)}function textFromReasoningValue(value){if(typeof value==="string")return value;if(!Array.isArray(value))return"";let parts=[];for(let entry of value){if(typeof entry==="string"){parts.push(entry);continue}if(!isObject4(entry))continue;let text=typeof entry.text==="string"?entry.text:"";if(text.length>0)parts.push(text)}return parts.join("")}function stripPayload(payload,keys){let out={};for(let[key,value]of Object.entries(payload))if(!keys.includes(key))out[key]=value;return out}function stringOr(value,fallback){return typeof value==="string"&&value.length>0?value:fallback}function parseMaybeJson(value){if(typeof value!=="string")return value;try{return JSON.parse(value)}catch{return value}}function parseTimestampMs(value){let ms=new Date(value).getTime();return Number.isFinite(ms)?ms:null}function isObject4(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}import{readdir,stat}from"fs/promises";import path2 from"path";var defaultHistoryDeps={sessionsDir:()=>path2.join(vendorConfigHome("codex"),"sessions"),readdir:(p)=>readdir(p),readFile:readTextFileBounded,readHead:readFirstLineBounded,stat},UUID_AT_END=/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i,FULL_UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,IO_CONCURRENCY=8;function sameStamp(a,b){return a.mtimeMs===b.mtimeMs&&a.size===b.size&&a.ctimeMs===b.ctimeMs&&a.ino===b.ino&&a.dev===b.dev}function rolloutCwd(raw){for(let line of raw.split(`
@@ -20,17 +20,136 @@ ${TRUST_LINE}`);if(!isObject(prior.projects)||!isObject(duplicate.projects))brea
20
20
  `)}}function trustCopilotWorktree(worktreePath,home=homedir2()){let carriedHeader="";updateSharedJsonSync(copilotConfigPath((name)=>process.env[name],home),(raw)=>{if(carriedHeader="",raw===void 0)return{};let{header,body}=splitJsoncHeader(raw);carriedHeader=header;try{return JSON.parse(body)}catch{return{}}},(doc)=>{let existing=Array.isArray(doc.trustedFolders)?doc.trustedFolders:[];if(existing.some((entry)=>entry===worktreePath))return;let merged={...doc,trustedFolders:[...existing,worktreePath]},body=JSON.stringify(merged,null,2);return carriedHeader?`${carriedHeader}
21
21
  ${body}
22
22
  `:`${body}
23
- `})}import path7 from"path";import{appendFile,mkdir,readdir as readdir2,stat as stat2,unlink}from"fs/promises";import path4 from"path";function normalizeClaudeContent(content){if(typeof content==="string")return content.length>0?[{type:"text",text:content}]:[];if(!Array.isArray(content))return[];let out=[];for(let block of content){if(typeof block==="string"){if(block.length>0)out.push({type:"text",text:block});continue}if(!block||typeof block!=="object")continue;let b=block;if(b.type==="text"&&typeof b.text==="string"){out.push({type:"text",text:b.text});continue}if(b.type==="tool_use"){out.push({type:"tool_call",callId:typeof b.id==="string"?b.id:"",name:typeof b.name==="string"?b.name:"",input:b.input});continue}if(b.type==="tool_result"){out.push({type:"tool_result",callId:typeof b.tool_use_id==="string"?b.tool_use_id:"",output:b.content,isError:b.is_error===!0});continue}if(b.type==="thinking"&&typeof b.thinking==="string")out.push({type:"thinking",text:b.thinking})}return out}var cache2=createAppendParseCache({initial:()=>[],parseChunk:(chunk,prev,sessionId)=>{let added=parseJsonl2(chunk,sessionId);return added.length?prev.concat(added):prev}});function parseSessionRaw(filePath,raw,sessionId){return sortByTimestamp(cache2(filePath,raw,sessionId))}function parseJsonl2(raw,sessionId){let out=[];for(let line of raw.split(`
23
+ `})}import path8 from"path";import{appendFile,mkdir,readdir as readdir2,stat as stat2,unlink}from"fs/promises";import path4 from"path";function normalizeClaudeContent(content){if(typeof content==="string")return content.length>0?[{type:"text",text:content}]:[];if(!Array.isArray(content))return[];let out=[];for(let block of content){if(typeof block==="string"){if(block.length>0)out.push({type:"text",text:block});continue}if(!block||typeof block!=="object")continue;let b=block;if(b.type==="text"&&typeof b.text==="string"){out.push({type:"text",text:b.text});continue}if(b.type==="tool_use"){out.push({type:"tool_call",callId:typeof b.id==="string"?b.id:"",name:typeof b.name==="string"?b.name:"",input:b.input});continue}if(b.type==="tool_result"){out.push({type:"tool_result",callId:typeof b.tool_use_id==="string"?b.tool_use_id:"",output:b.content,isError:b.is_error===!0});continue}if(b.type==="thinking"&&typeof b.thinking==="string")out.push({type:"thinking",text:b.thinking})}return out}var cache2=createAppendParseCache({initial:()=>[],parseChunk:(chunk,prev,sessionId)=>{let added=parseJsonl2(chunk,sessionId);return added.length?prev.concat(added):prev}});function parseSessionRaw(filePath,raw,sessionId){return sortByTimestamp(cache2(filePath,raw,sessionId))}function parseJsonl2(raw,sessionId){let out=[];for(let line of raw.split(`
24
24
  `)){let trimmed=line.trim();if(!trimmed)continue;if(!isJsonlLineWithinBound(trimmed))continue;let parsed;try{parsed=JSON.parse(trimmed)}catch{continue}if(!isObject(parsed))continue;let msg=extractMessage(parsed,sessionId);if(msg)out.push(msg)}return out}function extractMessage(record,fallbackSessionId){if(isSyntheticClaudeRecord(record))return null;let inner=isObject(record.message)?record.message:record,role=inner.role;if(role!=="user"&&role!=="assistant"&&role!=="system")return null;if(!("content"in inner))return null;let blocks=normalizeClaudeContent(inner.content);if(role==="user"&&isClaudeCommandBreadcrumb(blocks))return null;let ts=typeof record.timestamp==="string"?record.timestamp:new Date().toISOString(),sid=typeof record.sessionId==="string"?record.sessionId:fallbackSessionId,usage=extractUsage(inner.usage);return usage?{role,blocks,timestamp:ts,sessionId:sid,usage}:{role,blocks,timestamp:ts,sessionId:sid}}function extractUsage(v){if(!isObject(v))return;let inTok=typeof v.input_tokens==="number"?v.input_tokens:void 0,outTok=typeof v.output_tokens==="number"?v.output_tokens:void 0;if(inTok===void 0||outTok===void 0)return;let cacheRead=typeof v.cache_read_input_tokens==="number"?v.cache_read_input_tokens:void 0,cacheCreate=typeof v.cache_creation_input_tokens==="number"?v.cache_creation_input_tokens:void 0;return{input_tokens:inTok,output_tokens:outTok,...cacheRead!==void 0?{cache_read_input_tokens:cacheRead}:{},...cacheCreate!==void 0?{cache_creation_input_tokens:cacheCreate}:{}}}var defaultDeps={projectsDir(){return path4.join(vendorConfigHome("claude"),"projects")},async readdir(p){try{return await readdir2(p)}catch{return[]}},async readFile(p){return await readTextFileBounded(p)},async pathExists(p){try{return await readdir2(p),!0}catch{return!1}}};function encodeCwd(cwd){return cwd.replace(/[^a-zA-Z0-9]/g,"-")}async function listSessionFilesForWorktree(worktree){if(!worktree)return[];let dir=path4.join(vendorConfigHome("claude"),"projects",encodeCwd(worktree)),entries;try{entries=await readdir2(dir)}catch{return[]}let out=[];for(let entry of entries){if(!entry.endsWith(".jsonl"))continue;let full=path4.join(dir,entry),mtimeMs=0;try{mtimeMs=(await stat2(full)).mtimeMs}catch{}out.push({sessionId:entry.slice(0,-6),path:full,mtimeMs})}return out.sort((a,b)=>b.mtimeMs-a.mtimeMs),out}async function latestTranscriptMtimeForWorktree2(worktree){return(await listSessionFilesForWorktree(worktree))[0]?.mtimeMs??0}async function readHistory2(sessionId,deps=defaultDeps){let root=deps.projectsDir(),projectDirs=await deps.readdir(root);for(let dir of projectDirs){let candidate=path4.join(root,dir,`${sessionId}.jsonl`),raw;try{raw=await deps.readFile(candidate)}catch{continue}return parseSessionRaw(candidate,raw,sessionId)}return[]}async function readUsageSnapshot(sessionId,deps=defaultDeps){let messages=await readHistory2(sessionId,deps),input=0,output=0,cacheRead=0,cacheCreate=0,lastContext=0;for(let message of messages){let usage=message.usage;if(!usage)continue;input+=usage.input_tokens,output+=usage.output_tokens;let read=usage.cache_read_input_tokens??0,create=usage.cache_creation_input_tokens??0;cacheRead+=read,cacheCreate+=create,lastContext=usage.input_tokens+read+create}if(input===0&&output===0)return;return{input_tokens:input,output_tokens:output,...cacheRead>0?{cache_read_input_tokens:cacheRead}:{},...cacheCreate>0?{cache_creation_input_tokens:cacheCreate}:{},...lastContext>0?{context_tokens:lastContext,context_tokens_approximate:!0}:{}}}import{readdir as readdir3,rm,stat as stat3}from"fs/promises";import path5 from"path";function copilotUsageToSnapshot(value){if(!isObject6(value))return;let modelMetrics=isObject6(value.modelMetrics)?value.modelMetrics:void 0;if(!modelMetrics)return;let input=0,output=0,cached=0;for(let metrics of Object.values(modelMetrics)){if(!isObject6(metrics)||!isObject6(metrics.usage))continue;input+=numberOr3(metrics.usage.inputTokens,0),output+=numberOr3(metrics.usage.outputTokens,0),cached+=numberOr3(metrics.usage.cacheReadTokens,0)}let context=numberOr3(value.currentTokens,0);if(input===0&&output===0&&cached===0&&context===0)return;return{input_tokens:input,output_tokens:output,...cached>0?{cache_read_input_tokens:cached}:{},...context>0?{context_tokens:context}:{}}}function isObject6(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function numberOr3(value,fallback){return typeof value==="number"&&Number.isFinite(value)?value:fallback}var defaultDeps2={copilotDir(){return vendorConfigHome("copilot")},async readdir(p){try{return await readdir3(p)}catch{return[]}},async readFile(p){return await readTextFileBounded(p)},stat:stat3,async rm(p){await rm(p,{recursive:!0,force:!0})}};async function listSessionDirs(deps=defaultDeps2){let root=path5.join(deps.copilotDir(),"session-state");return(await deps.readdir(root)).map((name)=>path5.join(root,name))}async function listSessionIdsForWorktree2(worktree,deps=defaultDeps2){let matches=[];for(let dir of await listSessionDirs(deps)){let workspace=await readWorkspace(dir,deps);if(!samePath(workspace.cwd,worktree))continue;matches.push({id:workspace.id??path5.basename(dir),updatedAt:workspace.updatedAt??""})}return matches.sort((a,b)=>a.updatedAt.localeCompare(b.updatedAt)).map((m)=>m.id)}async function latestTranscriptMtimeForWorktree3(worktree,deps=defaultDeps2){if(!worktree)return 0;let newest=0;for(let dir of await listSessionDirs(deps)){let workspace=await readWorkspace(dir,deps);if(!samePath(workspace.cwd,worktree))continue;try{let{mtimeMs}=await deps.stat(path5.join(dir,"events.jsonl"));if(mtimeMs>newest)newest=mtimeMs}catch{}}return newest}async function readHistoryWithMetrics2(sessionId,deps=defaultDeps2){let dir=await findSessionDir(sessionId,deps);if(!dir)return{messages:[]};let file=path5.join(dir,"events.jsonl"),raw=await deps.readFile(file).catch(()=>""),state=eventsCache(file,raw,sessionId);return{messages:state.messages,...state.usageMetrics?{usageMetrics:state.usageMetrics}:{}}}async function readHistory3(sessionId,deps=defaultDeps2){return(await readHistoryWithMetrics2(sessionId,deps)).messages}async function findSessionDir(sessionId,deps=defaultDeps2){for(let dir of await listSessionDirs(deps)){if(path5.basename(dir)===sessionId)return dir;let workspace=await readWorkspace(dir,deps);if(workspace.id===sessionId||workspace.name?.toLowerCase()===sessionId.toLowerCase())return dir}return}async function readWorkspace(dir,deps=defaultDeps2){let raw=await deps.readFile(path5.join(dir,"workspace.yaml")).catch(()=>"");return parseWorkspaceYaml(raw)}function parseWorkspaceYaml(raw){let out={};for(let rawLine of raw.split(`
25
25
  `)){let match=rawLine.replace(/\r$/,"").match(/^([A-Za-z_]+):\s*(.*)$/);if(!match)continue;let key=match[1],value=match[2]??"";if(value.startsWith('"')&&value.endsWith('"'))value=value.slice(1,-1).replace(/\\"/g,'"');out[key]=value}return{id:out.id,cwd:out.cwd,name:out.name,updatedAt:out.updated_at,createdAt:out.created_at}}function initialParseState(fallbackSessionId){return{messages:[],sessionId:fallbackSessionId,usageMetrics:void 0,firstUserMessage:null}}var eventsCache=createAppendParseCache({initial:initialParseState,parseChunk:(chunk,prev)=>foldEvents(chunk,prev)});function foldEvents(raw,prev){let updatedMessages,appendMessage=(message)=>{updatedMessages??=[...prev.messages],updatedMessages.push(message)},sessionId=prev.sessionId,usageMetrics=prev.usageMetrics,firstUserMessage=prev.firstUserMessage;for(let line of raw.split(`
26
26
  `)){let trimmed=line.trim();if(!trimmed)continue;if(!isJsonlLineWithinBound(trimmed))continue;let record;try{record=JSON.parse(trimmed)}catch{continue}if(!isObject7(record)||typeof record.type!=="string")continue;let timestamp=typeof record.timestamp==="string"?record.timestamp:new Date().toISOString(),data=isObject7(record.data)?record.data:{};if(record.type==="session.start"){let sid=typeof data.sessionId==="string"?data.sessionId:void 0;if(sid)sessionId=sid;continue}if(record.type==="user.message"){let text=typeof data.content==="string"?data.content:"";if(!text)continue;if(!firstUserMessage)firstUserMessage=Buffer.from(text.slice(0,PREVIEW_CHAR_CAP),"utf8").toString("utf8");appendMessage({role:"user",blocks:[{type:"text",text}],timestamp,sessionId});continue}if(record.type==="assistant.message"){let blocks=[],text=typeof data.content==="string"?data.content:"";if(text)blocks.push({type:"text",text});let toolRequests=Array.isArray(data.toolRequests)?data.toolRequests:[];for(let req of toolRequests){if(!isObject7(req))continue;let callId=typeof req.id==="string"?req.id:typeof req.toolCallId==="string"?req.toolCallId:"tool",name=typeof req.name==="string"?req.name:typeof req.toolName==="string"?req.toolName:"tool";blocks.push({type:"tool_call",callId,name,input:req.arguments??{}})}if(blocks.length>0)appendMessage({role:"assistant",blocks,timestamp,sessionId});continue}if(record.type==="tool.execution_complete"){let callId=typeof data.toolCallId==="string"?data.toolCallId:void 0;if(!callId)continue;let output=data.result??(data.success===!1?{success:!1}:void 0);appendMessage({role:"assistant",blocks:[{type:"tool_result",callId,output,isError:data.success===!1}],timestamp,sessionId});continue}if(record.type==="session.shutdown")usageMetrics=copilotUsageToSnapshot(data)}return{messages:updatedMessages??prev.messages,sessionId,usageMetrics,firstUserMessage}}var PREVIEW_CHAR_CAP=200;function isObject7(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}import{stat as stat4}from"fs/promises";import path6 from"path";var defaultDeps3={kimiDir(){return vendorConfigHome("kimi")},async readFile(p){return await readTextFileBounded(p)},stat:stat4};function parseSessionIndex(raw){let out=[];for(let line of raw.split(`
27
- `)){if(!isJsonlLineWithinBound(line)||!line.trim())continue;try{let record=JSON.parse(line);if(typeof record!=="object"||record===null)continue;if(!("sessionId"in record)||!("sessionDir"in record)||!("workDir"in record))continue;let{sessionId,sessionDir,workDir}=record;if(typeof sessionId==="string"&&sessionId&&typeof sessionDir==="string"&&sessionDir&&typeof workDir==="string"&&workDir)out.push({sessionId,sessionDir,workDir})}catch{}}return out}async function sessionIndex(deps){let raw=await deps.readFile(path6.join(deps.kimiDir(),"session_index.jsonl")).catch(()=>"");return parseSessionIndex(raw)}function wirePath(sessionDir){return path6.join(sessionDir,"agents","main","wire.jsonl")}async function worktreeSessionFiles(worktree,deps){if(!worktree)return[];let matches=[];for(let entry of await sessionIndex(deps)){if(!samePath(entry.workDir,worktree))continue;let file=wirePath(entry.sessionDir),info=await deps.stat(file).catch(()=>null);if(info)matches.push({id:entry.sessionId,mtimeMs:info.mtimeMs})}return matches.sort((a,b)=>a.mtimeMs-b.mtimeMs)}async function listSessionIdsForWorktree3(worktree,deps=defaultDeps3){return(await worktreeSessionFiles(worktree,deps)).map((file)=>file.id)}async function latestTranscriptMtimeForWorktree4(worktree,deps=defaultDeps3){return(await worktreeSessionFiles(worktree,deps)).at(-1)?.mtimeMs??0}async function transcriptPath(sessionId,deps=defaultDeps3){if(!sessionId)return null;let entry=(await sessionIndex(deps)).find((e)=>e.sessionId===sessionId);if(!entry)return null;let file=wirePath(entry.sessionDir);return await deps.stat(file).then(()=>file).catch(()=>null)}var EMPTY_HISTORY={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},claudeHistoryReader={async listSessionIdsForWorktree(worktree){return[...await listSessionFilesForWorktree(worktree)].sort((a,b)=>a.mtimeMs-b.mtimeMs).map((f)=>f.sessionId)},readHistory:(sessionId)=>readHistory2(sessionId),readUsageSnapshot:(sessionId)=>readUsageSnapshot(sessionId),async transcriptPath(sessionId,worktree){return(await listSessionFilesForWorktree(worktree)).find((f)=>f.sessionId===sessionId)?.path??null},latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree2(worktree)},codexHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree(worktree),readHistory:(sessionId)=>readHistory(sessionId),readUsageSnapshot:async(sessionId)=>(await readHistoryWithMetrics(sessionId)).usageMetrics,transcriptPath:async(sessionId)=>await findRolloutFile(sessionId)??null,latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree(worktree)},copilotHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree2(worktree),readHistory:(sessionId)=>readHistory3(sessionId),readUsageSnapshot:async(sessionId)=>(await readHistoryWithMetrics2(sessionId)).usageMetrics,async transcriptPath(sessionId){let dir=await findSessionDir(sessionId);return dir?path7.join(dir,"events.jsonl"):null},latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree3(worktree)},kimiHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree3(worktree),readHistory:EMPTY_HISTORY.readHistory,transcriptPath:(sessionId)=>transcriptPath(sessionId),latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree4(worktree)};import{existsSync}from"fs";import{mkdir as mkdir2,readFile,writeFile}from"fs/promises";import{homedir as homedir3}from"os";import{dirname,join as join2}from"path";var 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))],BLOCK_BEGIN="# >>> rove hooks",BLOCK_END="# <<< rove hooks",HOOK_TIMEOUT_SECONDS=10;function kimiConfigPath(home=homedir3()){return join2(vendorConfigHome("kimi",{env:(k)=>process.env[k],home:()=>home}),"config.toml")}function renderKimiHookBlock(inv=kobeHookInvocation(),opts={}){let lines=[BLOCK_BEGIN];for(let spec of KIMI_HOOK_EVENT_MAP){if(!opts.toolEvents&&GATED_TOOL_VERBS.has(spec.verb))continue;let command=quoteShellArgv([...inv,"hook",spec.verb,"--engine","kimi"],hookCommandQuoting());if(lines.push("[[hooks]]"),lines.push(`event = ${JSON.stringify(spec.event)}`),spec.matcher)lines.push(`matcher = ${JSON.stringify(spec.matcher)}`);lines.push(`command = ${JSON.stringify(command)}`),lines.push(`timeout = ${HOOK_TIMEOUT_SECONDS}`),lines.push("")}return lines.push(BLOCK_END),lines.join(`
27
+ `)){if(!isJsonlLineWithinBound(line)||!line.trim())continue;try{let record=JSON.parse(line);if(typeof record!=="object"||record===null)continue;if(!("sessionId"in record)||!("sessionDir"in record)||!("workDir"in record))continue;let{sessionId,sessionDir,workDir}=record;if(typeof sessionId==="string"&&sessionId&&typeof sessionDir==="string"&&sessionDir&&typeof workDir==="string"&&workDir)out.push({sessionId,sessionDir,workDir})}catch{}}return out}async function sessionIndex(deps){let raw=await deps.readFile(path6.join(deps.kimiDir(),"session_index.jsonl")).catch(()=>"");return parseSessionIndex(raw)}function wirePath(sessionDir){return path6.join(sessionDir,"agents","main","wire.jsonl")}async function worktreeSessionFiles(worktree,deps){if(!worktree)return[];let matches=[];for(let entry of await sessionIndex(deps)){if(!samePath(entry.workDir,worktree))continue;let file=wirePath(entry.sessionDir),info=await deps.stat(file).catch(()=>null);if(info)matches.push({id:entry.sessionId,mtimeMs:info.mtimeMs})}return matches.sort((a,b)=>a.mtimeMs-b.mtimeMs)}async function listSessionIdsForWorktree3(worktree,deps=defaultDeps3){return(await worktreeSessionFiles(worktree,deps)).map((file)=>file.id)}async function latestTranscriptMtimeForWorktree4(worktree,deps=defaultDeps3){return(await worktreeSessionFiles(worktree,deps)).at(-1)?.mtimeMs??0}async function transcriptPath(sessionId,deps=defaultDeps3){if(!sessionId)return null;let entry=(await sessionIndex(deps)).find((e)=>e.sessionId===sessionId);if(!entry)return null;let file=wirePath(entry.sessionDir);return await deps.stat(file).then(()=>file).catch(()=>null)}function normalizePiContent(content){if(typeof content==="string")return content.length>0?[{type:"text",text:content}]:[];if(!Array.isArray(content))return[];let out=[];for(let block of content){if(typeof block==="string"){if(block.length>0)out.push({type:"text",text:block});continue}if(!block||typeof block!=="object")continue;let b=block;if(b.type==="text"&&typeof b.text==="string"){out.push({type:"text",text:b.text});continue}if(b.type==="thinking"&&typeof b.thinking==="string"){out.push({type:"thinking",text:b.thinking});continue}if(b.type==="toolCall"||b.type==="tool_use"){out.push({type:"tool_call",callId:typeof b.id==="string"?b.id:"",name:typeof b.name==="string"?b.name:"",input:b.arguments??b.input});continue}if(b.type==="toolResult"||b.type==="tool_result")out.push({type:"tool_result",callId:typeof b.toolCallId==="string"?b.toolCallId:typeof b.tool_use_id==="string"?b.tool_use_id:"",output:b.content,isError:b.isError===!0||b.is_error===!0})}return out}var ROLE_MAP={user:"user",assistant:"assistant",toolResult:"assistant",system:"system"},emptyState2={messages:[],usage:void 0},cache3=createAppendParseCache({initial:()=>emptyState2,parseChunk:foldChunk});function parsePiSessionRaw(filePath,raw,sessionId){let state=cache3(filePath,raw,sessionId);return{messages:sortByTimestamp(state.messages),...state.usage?{usageMetrics:state.usage}:{}}}function foldChunk(chunk,prev,sessionId){let messages,usage=prev.usage;for(let line of chunk.split(`
28
+ `)){let trimmed=line.trim();if(!trimmed||!isJsonlLineWithinBound(trimmed))continue;let record;try{record=JSON.parse(trimmed)}catch{continue}if(!record||typeof record!=="object")continue;let entry=record;if(entry.type!=="message")continue;let message=entry.message;if(!message||typeof message!=="object")continue;let m=message,role=typeof m.role==="string"?ROLE_MAP[m.role]:void 0;if(!role)continue;let blocks=m.role==="toolResult"?[{type:"tool_result",callId:typeof m.toolCallId==="string"?m.toolCallId:"",output:m.content,isError:m.isError===!0}]:normalizePiContent(m.content);if(blocks.length===0)continue;let usageSnapshot=role==="assistant"?usageFromMessage(m):void 0;if(usageSnapshot)usage=usageSnapshot;if(!messages)messages=[...prev.messages];messages.push({role,blocks,timestamp:timestampOf(entry,m),sessionId,...usageSnapshot?{usage:usageSnapshot}:{}})}return messages?{messages,usage}:{messages:prev.messages,usage}}function timestampOf(entry,message){if(typeof entry.timestamp==="string")return entry.timestamp;let ms=typeof message.timestamp==="number"?message.timestamp:void 0;return ms===void 0?new Date(0).toISOString():new Date(ms).toISOString()}function usageFromMessage(message){let usage=message.usage;if(!usage||typeof usage!=="object")return;let u=usage,num3=(v)=>typeof v==="number"&&Number.isFinite(v)?v:0,input=u.input??u.input_tokens,output=u.output??u.output_tokens;if(input===void 0&&output===void 0)return;let cacheRead=u.cacheRead??u.cache_read_input_tokens,cacheWrite=u.cacheWrite??u.cache_creation_input_tokens;return{input_tokens:num3(input),output_tokens:num3(output),...typeof cacheRead==="number"?{cache_read_input_tokens:cacheRead}:{},...typeof cacheWrite==="number"?{cache_creation_input_tokens:cacheWrite}:{}}}import{realpathSync}from"fs";import{readdir as readdir4,stat as stat5}from"fs/promises";import{homedir as homedir3,tmpdir}from"os";import path7 from"path";var defaultPiHistoryDeps={home:()=>homedir3(),env:(name)=>process.env[name],tmpdir:()=>tmpdir(),realpath:(p)=>{try{return realpathSync(p)}catch{return p}},readdir:async(p)=>readdir4(p),stat:async(p)=>{try{let s=await stat5(p);return{mtimeMs:s.mtimeMs,isFile:s.isFile()}}catch{return null}},readFile:(p)=>readTextFileIfRegular(p)};function piSessionsRoot(vendor,deps=defaultPiHistoryDeps){return path7.join(vendorAgentDir(vendor,{env:deps.env,home:deps.home}),"sessions")}function encodeAbsolute(p){return`--${p.replace(/^[/\\]/,"").replace(/[/\\:]/g,"-")}--`}function encodeRelative(prefix,relative){let encoded=relative.replace(/[/\\:]/g,"-");if(!encoded)return prefix;return prefix.endsWith("-")?`${prefix}${encoded}`:`${prefix}-${encoded}`}function within(root,p){let rel=path7.relative(root,p);if(rel==="")return"";if(rel.startsWith("..")||path7.isAbsolute(rel))return null;return rel}function sessionDirNamesForWorktree(vendor,worktree,deps=defaultPiHistoryDeps){let resolved=deps.realpath(worktree),names=[],add=(name)=>{if(!names.includes(name))names.push(name)};if(vendor==="omp"){let home=within(deps.realpath(deps.home()),resolved);if(home!==null)add(encodeRelative("-",home));let temp=within(deps.realpath(deps.tmpdir()),resolved);if(temp!==null)add(encodeRelative("-tmp",temp))}return add(encodeAbsolute(resolved)),names}function sessionIdFromFileName(fileName){if(!fileName.endsWith(".jsonl"))return null;let base=fileName.slice(0,-6),separator=base.lastIndexOf("_"),id=separator>=0?base.slice(separator+1):base;return id.length>0?id:null}async function worktreeSessionFiles2(vendor,worktree,deps=defaultPiHistoryDeps){let root=piSessionsRoot(vendor,deps),out=[];for(let dirName of sessionDirNamesForWorktree(vendor,worktree,deps)){let dir=path7.join(root,dirName),entries;try{entries=await deps.readdir(dir)}catch{continue}for(let entry of entries){let sessionId=sessionIdFromFileName(entry);if(!sessionId)continue;let file=path7.join(dir,entry),info=await deps.stat(file);if(!info?.isFile)continue;out.push({sessionId,path:file,mtimeMs:info.mtimeMs})}}return out.sort((a,b)=>a.mtimeMs-b.mtimeMs)}async function listSessionIdsForWorktree4(vendor,worktree,deps=defaultPiHistoryDeps){return(await worktreeSessionFiles2(vendor,worktree,deps)).map((f)=>f.sessionId)}async function latestTranscriptMtimeForWorktree5(vendor,worktree,deps=defaultPiHistoryDeps){return(await worktreeSessionFiles2(vendor,worktree,deps)).at(-1)?.mtimeMs??0}async function transcriptPath2(vendor,sessionId,worktree,deps=defaultPiHistoryDeps){return(await worktreeSessionFiles2(vendor,worktree,deps)).find((f)=>f.sessionId===sessionId)?.path??null}async function findSessionFile(vendor,sessionId,deps=defaultPiHistoryDeps){let root=piSessionsRoot(vendor,deps),dirs;try{dirs=await deps.readdir(root)}catch{return null}for(let dir of dirs){let entries;try{entries=await deps.readdir(path7.join(root,dir))}catch{continue}let match=entries.find((entry)=>sessionIdFromFileName(entry)===sessionId);if(match)return path7.join(root,dir,match)}return null}async function readHistory4(vendor,sessionId,deps=defaultPiHistoryDeps){let file=await findSessionFile(vendor,sessionId,deps);if(!file)return[];let raw=await deps.readFile(file);if(raw===null)return[];return parsePiSessionRaw(file,raw,sessionId).messages}var EMPTY_HISTORY={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},claudeHistoryReader={async listSessionIdsForWorktree(worktree){return[...await listSessionFilesForWorktree(worktree)].sort((a,b)=>a.mtimeMs-b.mtimeMs).map((f)=>f.sessionId)},readHistory:(sessionId)=>readHistory2(sessionId),readUsageSnapshot:(sessionId)=>readUsageSnapshot(sessionId),async transcriptPath(sessionId,worktree){return(await listSessionFilesForWorktree(worktree)).find((f)=>f.sessionId===sessionId)?.path??null},latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree2(worktree)},codexHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree(worktree),readHistory:(sessionId)=>readHistory(sessionId),readUsageSnapshot:async(sessionId)=>(await readHistoryWithMetrics(sessionId)).usageMetrics,transcriptPath:async(sessionId)=>await findRolloutFile(sessionId)??null,latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree(worktree)},copilotHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree2(worktree),readHistory:(sessionId)=>readHistory3(sessionId),readUsageSnapshot:async(sessionId)=>(await readHistoryWithMetrics2(sessionId)).usageMetrics,async transcriptPath(sessionId){let dir=await findSessionDir(sessionId);return dir?path8.join(dir,"events.jsonl"):null},latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree3(worktree)},kimiHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree3(worktree),readHistory:EMPTY_HISTORY.readHistory,transcriptPath:(sessionId)=>transcriptPath(sessionId),latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree4(worktree)};function piFamilyHistoryReader(vendor){return{listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree4(vendor,worktree),readHistory:(sessionId)=>readHistory4(vendor,sessionId),readUsageSnapshot:async(sessionId)=>{let file=await findSessionFile(vendor,sessionId);if(!file)return;let raw=await readTextFileIfRegular(file);if(raw===null)return;return parsePiSessionRaw(file,raw,sessionId).usageMetrics},transcriptPath:(sessionId,worktree)=>transcriptPath2(vendor,sessionId,worktree),latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree5(vendor,worktree)}}var piHistoryReader=piFamilyHistoryReader("pi"),ompHistoryReader=piFamilyHistoryReader("omp");import{existsSync}from"fs";import{mkdir as mkdir2,readFile,writeFile}from"fs/promises";import{homedir as homedir4}from"os";import{dirname,join as join2}from"path";var 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))],BLOCK_BEGIN="# >>> rove hooks",BLOCK_END="# <<< rove hooks",HOOK_TIMEOUT_SECONDS=10;function kimiConfigPath(home=homedir4()){return join2(vendorConfigHome("kimi",{env:(k)=>process.env[k],home:()=>home}),"config.toml")}function renderKimiHookBlock(inv=kobeHookInvocation(),opts={}){let lines=[BLOCK_BEGIN];for(let spec of KIMI_HOOK_EVENT_MAP){if(!opts.toolEvents&&GATED_TOOL_VERBS.has(spec.verb))continue;let command=quoteShellArgv([...inv,"hook",spec.verb,"--engine","kimi"],hookCommandQuoting());if(lines.push("[[hooks]]"),lines.push(`event = ${JSON.stringify(spec.event)}`),spec.matcher)lines.push(`matcher = ${JSON.stringify(spec.matcher)}`);lines.push(`command = ${JSON.stringify(command)}`),lines.push(`timeout = ${HOOK_TIMEOUT_SECONDS}`),lines.push("")}return lines.push(BLOCK_END),lines.join(`
28
29
  `)}function removeKimiHookBlock(content){let lines=content.split(`
29
30
  `),out=[],inBlock=!1;for(let line of lines){if(line.trim()===BLOCK_BEGIN){if(inBlock=!0,out.length>0&&out[out.length-1]==="")out.pop();continue}if(inBlock){if(line.trim()===BLOCK_END)inBlock=!1;continue}out.push(line)}return out.join(`
30
31
  `)}function mergeKimiHooks(content,install,inv=kobeHookInvocation(),opts={}){let base=removeKimiHookBlock(content);if(!install)return base;let trimmed=base.replace(/\n+$/,"");return`${trimmed.length>0?`${trimmed}
31
32
 
32
33
  `:""}${renderKimiHookBlock(inv,opts)}
33
- `}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(!existsSync(dirname(settingsFilePath)))return{ok:!0};return await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!0,void 0,opts)),{ok:!0}}async removeActivityHooks(settingsFilePath){if(!existsSync(settingsFilePath))return;await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!1))}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async removeWorktreeWatchHook(){}}async function editTomlConfig(path8,transform){try{let current="";try{current=await readFile(path8,"utf8")}catch(error){if(!(error&&typeof error==="object"&&("code"in error)&&error.code==="ENOENT"))return}let next=transform(current);if(next===current)return;await mkdir2(dirname(path8),{recursive:!0}),await writeFile(path8,next)}catch{}}var KIMI_SCREEN_MANIFEST={rules:[{state:"blocked",all:["\u21B5 confirm"],any:["approve","reject","revise"]},{state:"blocked",all:["\u2191\u2193 navigate","esc exit"]},{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 )"]}]};import{createHash as createHash2}from"crypto";import{mkdirSync as mkdirSync2,realpathSync,writeFileSync as writeFileSync2}from"fs";import path8 from"path";function resolvedWorktree(worktreePath){try{return realpathSync(worktreePath)}catch{return worktreePath}}function kimiTrustFilePath(worktreePath,home){let resolved=resolvedWorktree(worktreePath),hash=createHash2("sha256").update(resolved).digest("hex").slice(0,12),dir=path8.basename(resolved).toLowerCase();return path8.join(vendorConfigHome("kimi",vendorWriteHomeDeps(home)),"workspace-trust",`wd_${dir}_${hash}`)}function trustKimiWorktree(worktreePath,home){let file=kimiTrustFilePath(worktreePath,home);mkdirSync2(path8.dirname(file),{recursive:!0,mode:448});try{writeFileSync2(file,JSON.stringify({root:resolvedWorktree(worktreePath),trustedAt:Date.now()}),{mode:384,flag:"wx"})}catch(error){if(!(error instanceof Error&&("code"in error)&&error.code==="EEXIST"))throw error}}import{stat as stat5}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()}var statFile=(path9)=>stat5(path9).catch(()=>null);function completionReader(deps,parse2){let cache3=new Map;return async(path9,knownMtime)=>{let info=deps.statFile?await deps.statFile(path9):null;if(deps.statFile&&!info)return null;let mtimeMs=info?.mtimeMs??knownMtime??await(deps.statMtimeMs??(async(p)=>(await statFile(p))?.mtimeMs??0))(path9);if(!info&&knownMtime===void 0&&mtimeMs===0)return null;let key=info?`${info.dev}:${info.ino}:${info.size}:${info.mtimeMs}:${info.ctimeMs}`:String(mtimeMs),hit=cache3.get(path9);if(mtimeMs>0&&hit?.key===key)return hit.scan;let raw;try{raw=await deps.readFile(path9)}catch{return cache3.delete(path9),null}if(raw===null)return cache3.delete(path9),null;let scan={marker:parse2(raw,path9,mtimeMs),mtimeMs};if(cache3.delete(path9),cache3.set(path9,{key,scan}),cache3.size>8){let oldest=cache3.keys().next().value;if(oldest!==void 0)cache3.delete(oldest)}return scan}}var defaultClaudeDeps={listSessionFiles:(worktree)=>listSessionFilesForWorktree(worktree),readFile:readTextFileIfRegular,statFile};class ClaudeTurnDetector extends EngineTurnDetector{deps;vendor="claude";readCompletion;constructor(deps=defaultClaudeDeps){super();this.deps=deps;this.readCompletion=completionReader(deps,latestClaudeCompletionMarkerFromJsonl)}async latestActivity(worktree){let files=await this.deps.listSessionFiles(worktree),mtimeMs=files[0]?.mtimeMs??0,latest=null;for(let file of files.slice(0,4)){let marker=(await this.readCompletion(file.path,file.mtimeMs))?.marker;if(marker&&(!latest||marker.timestampMs>latest.timestampMs))latest=marker}return{marker:latest,mtimeMs}}latestActivityInFile(transcriptPath2){return this.readCompletion(transcriptPath2)}}var defaultCodexDeps={findLatestRollout:(worktree)=>findLatestRolloutForWorktree(worktree),readFile:readTextFileIfRegular,statFile};class CodexTurnDetector extends EngineTurnDetector{deps;vendor="codex";readCompletion;constructor(deps=defaultCodexDeps){super();this.deps=deps;this.readCompletion=completionReader(deps,latestCodexCompletionMarkerFromJsonl)}latestActivityInFile(transcriptPath2){return this.readCompletion(transcriptPath2)}async latestActivity(worktree){if(!worktree)return{marker:null,mtimeMs:0};let found=await this.deps.findLatestRollout(worktree);return found?await this.readCompletion(found.path,found.mtimeMs)??{marker:null,mtimeMs:0}:{marker:null,mtimeMs:0}}}class UnknownTurnDetector extends EngineTurnDetector{vendor;constructor(vendor){super();this.vendor=vendor}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}}var CLAUDE_TURN_END_STOP_REASONS=new Set(["end_turn","stop_sequence","max_tokens","refusal"]);function latestClaudeCompletionMarkerFromJsonl(raw,sourceId="claude",fallbackMtimeMs=0){let latest=null,lineNo=0;for(let line of raw.split(`
34
+ `}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(!existsSync(dirname(settingsFilePath)))return{ok:!0};return await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!0,void 0,opts)),{ok:!0}}async removeActivityHooks(settingsFilePath){if(!existsSync(settingsFilePath))return;await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!1))}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async removeWorktreeWatchHook(){}}async function editTomlConfig(path9,transform){try{let current="";try{current=await readFile(path9,"utf8")}catch(error){if(!(error&&typeof error==="object"&&("code"in error)&&error.code==="ENOENT"))return}let next=transform(current);if(next===current)return;await mkdir2(dirname(path9),{recursive:!0}),await writeFile(path9,next)}catch{}}var KIMI_SCREEN_MANIFEST={rules:[{state:"blocked",all:["\u21B5 confirm"],any:["approve","reject","revise"]},{state:"blocked",all:["\u2191\u2193 navigate","esc exit"]},{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 )"]}]};import{createHash as createHash2}from"crypto";import{mkdirSync as mkdirSync2,realpathSync as realpathSync2,writeFileSync as writeFileSync2}from"fs";import path9 from"path";function resolvedWorktree(worktreePath){try{return realpathSync2(worktreePath)}catch{return worktreePath}}function kimiTrustFilePath(worktreePath,home){let resolved=resolvedWorktree(worktreePath),hash=createHash2("sha256").update(resolved).digest("hex").slice(0,12),dir=path9.basename(resolved).toLowerCase();return path9.join(vendorConfigHome("kimi",vendorWriteHomeDeps(home)),"workspace-trust",`wd_${dir}_${hash}`)}function trustKimiWorktree(worktreePath,home){let file=kimiTrustFilePath(worktreePath,home);mkdirSync2(path9.dirname(file),{recursive:!0,mode:448});try{writeFileSync2(file,JSON.stringify({root:resolvedWorktree(worktreePath),trustedAt:Date.now()}),{mode:384,flag:"wx"})}catch(error){if(!(error instanceof Error&&("code"in error)&&error.code==="EEXIST"))throw error}}var piCapabilities={interruptSequence:"\x1B"},ompCapabilities={interruptSequence:"\x1B"},piIdentity={shortName:"Pi"},ompIdentity={shortName:"OMP"};import{existsSync as existsSync2}from"fs";import{mkdir as mkdir3,readFile as readFile2,rm as rm2,writeFile as writeFile2}from"fs/promises";import path10 from"path";function renderPiExtensionSource(opts){let{vendor,invocation,toolEvents=!1}=opts,tool=toolEvents?TOOL_SECTION:"";return`/**
35
+ * Rove activity hook \u2014 GENERATED, installed and rewritten by Rove on every
36
+ * launch (${vendor}). Local edits are overwritten; to stop reporting, delete
37
+ * this file or turn Rove's global hooks off.
38
+ *
39
+ * It subscribes to ${vendor}'s session/agent lifecycle and shells out to
40
+ * \`${invocation.join(" ")} hook <verb> --engine ${vendor}\`. Best-effort by
41
+ * construction: every report is fire-and-forget (except the final one, which
42
+ * is awaited so it survives process exit) and every failure is swallowed \u2014
43
+ * a badge must never break a turn.
44
+ */
45
+
46
+ const ENGINE = ${JSON.stringify(vendor)}
47
+ const INVOCATION = ${JSON.stringify(invocation)}
48
+
49
+ /** Normalize an untrusted field: the CLI's payload types are wider than ours. */
50
+ function text(value) {
51
+ return typeof value === "string" && value.length > 0 ? value : undefined
52
+ }
53
+
54
+ function field(value, key) {
55
+ if (!value || typeof value !== "object") return undefined
56
+ return value[key]
57
+ }
58
+
59
+ /** Session identity + cwd, read off the hook context (absent fields omitted). */
60
+ function context(ctx) {
61
+ const out = {}
62
+ const sm = field(ctx, "sessionManager")
63
+ try {
64
+ const id = text(field(sm, "getSessionId") && sm.getSessionId())
65
+ if (id) out.session_id = id
66
+ const file = text(field(sm, "getSessionFile") && sm.getSessionFile())
67
+ if (file) out.transcript_path = file
68
+ } catch {
69
+ /* a context that cannot answer is simply unidentified */
70
+ }
71
+ const cwd = text(field(ctx, "cwd"))
72
+ if (cwd) out.cwd = cwd
73
+ return out
74
+ }
75
+
76
+ function emit(pi, verb, ctx, extra, wait) {
77
+ try {
78
+ const payload = Object.assign(context(ctx), extra)
79
+ const args = INVOCATION.slice(1).concat([
80
+ "hook",
81
+ verb,
82
+ "--engine",
83
+ ENGINE,
84
+ "--payload",
85
+ JSON.stringify(payload),
86
+ ])
87
+ const run = pi.exec(INVOCATION[0], args)
88
+ // Every spawn is fire-and-forget EXCEPT the final session-end, which is
89
+ // returned so the hook runner awaits it before the process exits. The
90
+ // rejection is handled either way: a failed hook must not surface as an
91
+ // engine error.
92
+ if (run && typeof run.catch === "function") run.catch(() => {})
93
+ return wait ? run : undefined
94
+ } catch {
95
+ /* never let observability break the engine */
96
+ }
97
+ }
98
+
99
+ export default function (pi) {
100
+ pi.on("session_start", (_event, ctx) => emit(pi, "session-start", ctx))
101
+ pi.on("turn_start", (_event, ctx) => emit(pi, "turn-start", ctx))
102
+ pi.on("agent_end", (event, ctx) => {
103
+ // A continuation is already scheduled (auto-retry, queued follow-up), so
104
+ // this is not the end of the user's turn \u2014 reporting completion here would
105
+ // light the "done" lamp and immediately clear it.
106
+ if (field(event, "willContinue") === true) return
107
+ emit(pi, "turn-complete", ctx)
108
+ })
109
+ pi.on("message_end", (event, ctx) => {
110
+ const message = field(event, "message")
111
+ if (field(message, "role") !== "assistant") return
112
+ const stopReason = field(message, "stopReason")
113
+ // The provider call itself failed, or the user interrupted it. Both are
114
+ // turn EDGES the completion path cannot see (no agent_end follows a
115
+ // failed request on pi, and an abort reports through the message).
116
+ if (stopReason === "error") {
117
+ emit(pi, "turn-failed", ctx, { error_message: field(message, "errorMessage") })
118
+ } else if (stopReason === "aborted") {
119
+ emit(pi, "turn-interrupted", ctx)
120
+ }
121
+ })
122
+ pi.on("auto_retry_end", (event, ctx) => {
123
+ if (field(event, "success") === false) {
124
+ emit(pi, "turn-failed", ctx, { error_message: field(event, "finalError") })
125
+ }
126
+ })
127
+ // Not gated on the tool family below: the question tool blocks on a human
128
+ // exactly like an approval prompt does (omp's own title goes to \`\u03C0 !\`), and
129
+ // this spawns only for that one tool, so it costs nothing per ordinary call.
130
+ pi.on("tool_call", (event, ctx) => {
131
+ if (field(event, "toolName") === "ask") emit(pi, "awaiting-input", ctx, { waiting: "input" })
132
+ })
133
+ pi.on("tool_approval_requested", (_event, ctx) => emit(pi, "awaiting-input", ctx, { waiting: "permission" }))
134
+ pi.on("tool_approval_resolved", (_event, ctx) => {
135
+ // Approved or denied, the engine resumes the same turn \u2014 which is the
136
+ // "running" state Rove's reducer reads out of turn-start.
137
+ emit(pi, "turn-start", ctx)
138
+ })
139
+ pi.on("session_before_compact", (_event, ctx) => emit(pi, "pre-compact", ctx))
140
+ pi.on("session_compact", (_event, ctx) => emit(pi, "post-compact", ctx))
141
+ pi.on("session_shutdown", (_event, ctx) => emit(pi, "session-end", ctx, undefined, true))
142
+ ${tool}}
143
+ `}var TOOL_SECTION=` pi.on("tool_call", (event, ctx) =>
144
+ emit(pi, "tool-pre", ctx, { tool_name: field(event, "toolName") }),
145
+ )
146
+ pi.on("tool_result", (event, ctx) =>
147
+ emit(pi, field(event, "isError") === true ? "tool-failed" : "tool-post", ctx, {
148
+ tool_name: field(event, "toolName"),
149
+ }),
150
+ )
151
+ `;var ACTIVITY_EXTENSION_FILE="rove-activity.ts";function piExtensionsDir(vendor,deps){return path10.join(vendorAgentDir(vendor,deps),"extensions")}function piActivityExtensionPath(vendor,deps){return path10.join(piExtensionsDir(vendor,deps),ACTIVITY_EXTENSION_FILE)}function piFailureDetail(payload){let raw=typeof payload.error_message==="string"?payload.error_message:"",message=raw.toLowerCase(),note=raw?raw.slice(0,200):void 0;return{failure:(()=>{if(/insufficient|credit|billing|payment required|\b402\b|quota exceeded|out of credits/.test(message))return"billing";if(/rate.?limit|too many requests|\b429\b|overloaded|capacity/.test(message))return"rate_limit";return"other"})(),...note?{note}:{}}}class PiFamilyHookAdapter{family;vendor;constructor(family){this.family=family;this.vendor=family}supportsHooks(){return!0}globalSettingsPath(){return piActivityExtensionPath(this.family)}activityDetailFromPayload(kind,payload){if(kind==="turn-failed")return piFailureDetail(payload);if(kind==="awaiting-input")return{waiting:payload.waiting==="input"?"input":"permission"};if(kind==="tool-pre"||kind==="tool-post"||kind==="tool-failed"){let name=typeof payload.tool_name==="string"?payload.tool_name:void 0;return{tool:{...name?{name}:{}}}}return}sessionFromPayload(payload){let sessionId=typeof payload.session_id==="string"?payload.session_id:void 0;if(!sessionId)return;let transcriptPath3=typeof payload.transcript_path==="string"?payload.transcript_path:void 0;return{sessionId,...transcriptPath3?{transcriptPath:transcriptPath3}:{}}}async installActivityHooks(settingsFilePath,opts={}){let agentDir=path10.dirname(path10.dirname(settingsFilePath));if(!existsSync2(agentDir))return{ok:!0};let source=renderPiExtensionSource({vendor:this.family,invocation:kobeHookInvocation(),toolEvents:opts.toolEvents??!1});return await writeIfChanged(settingsFilePath,source),{ok:!0}}async removeActivityHooks(settingsFilePath){try{await rm2(settingsFilePath,{force:!0})}catch{}}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async removeWorktreeWatchHook(){}}async function writeIfChanged(file,content){try{if(await readFile2(file,"utf8").catch(()=>{return})===content)return;await mkdir3(path10.dirname(file),{recursive:!0}),await writeFile2(file,content)}catch{}}var OMP_SCREEN_MANIFEST={rules:[{state:"blocked",all:["allow tool"],any:["approve","deny"]},{state:"working",lineRegex:["^\\s*[\\u2800-\\u28FF]{1,2}\\s+\\d+s\\s+\xB7"]},{state:"idle",lineRegex:["^\\s*\xB7\\s+\\S+.*\xB7"]}]},PI_SCREEN_MANIFEST={rules:[{state:"blocked",all:["trust project folder?"]},{state:"blocked",all:["\u2191\u2193 navigate","escape/ctrl+c cancel"]},{state:"working",any:["working..."]},{state:"idle",lineRegex:["^\\s*[\u2191\u2193]\\s*\\d"]}]};var OMP_SPINNER_FRAMES=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];var OMP_WORKING_PREFIXES=OMP_SPINNER_FRAMES.map((frame)=>`${"\u03C0"} ${frame}`),OMP_ATTENTION_PREFIXES=[`${"\u03C0"} !`],OMP_STATUS_PREFIXES=[...OMP_WORKING_PREFIXES,...OMP_ATTENTION_PREFIXES,`${"\u03C0"} >`,`${"\u03C0"}:`],PI_STATUS_PREFIXES=[`${"\u03C0"} -`];import{existsSync as existsSync3,mkdirSync as mkdirSync3,readFileSync,realpathSync as realpathSync3,writeFileSync as writeFileSync3}from"fs";import path11 from"path";function canonical(p){try{return realpathSync3(p)}catch{return p}}function piTrustPath(deps){return path11.join(vendorAgentDir("pi",deps),"trust.json")}function trustPiWorktree(worktreePath,deps){let file=piTrustPath(deps);try{let existing={};if(existsSync3(file)){let parsed=JSON.parse(readFileSync(file,"utf8"));if(!parsed||typeof parsed!=="object"||Array.isArray(parsed))return;for(let[key,value]of Object.entries(parsed))existing[key]=value===!0}existing[canonical(worktreePath)]=!0,mkdirSync3(path11.dirname(file),{recursive:!0}),writeFileSync3(file,`${JSON.stringify(existing,null,2)}
152
+ `)}catch{}}import{stat as stat6}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()}var statFile=(path12)=>stat6(path12).catch(()=>null);function completionReader(deps,parse2){let cache4=new Map;return async(path12,knownMtime)=>{let info=deps.statFile?await deps.statFile(path12):null;if(deps.statFile&&!info)return null;let mtimeMs=info?.mtimeMs??knownMtime??await(deps.statMtimeMs??(async(p)=>(await statFile(p))?.mtimeMs??0))(path12);if(!info&&knownMtime===void 0&&mtimeMs===0)return null;let key=info?`${info.dev}:${info.ino}:${info.size}:${info.mtimeMs}:${info.ctimeMs}`:String(mtimeMs),hit=cache4.get(path12);if(mtimeMs>0&&hit?.key===key)return hit.scan;let raw;try{raw=await deps.readFile(path12)}catch{return cache4.delete(path12),null}if(raw===null)return cache4.delete(path12),null;let scan={marker:parse2(raw,path12,mtimeMs),mtimeMs};if(cache4.delete(path12),cache4.set(path12,{key,scan}),cache4.size>8){let oldest=cache4.keys().next().value;if(oldest!==void 0)cache4.delete(oldest)}return scan}}var defaultClaudeDeps={listSessionFiles:(worktree)=>listSessionFilesForWorktree(worktree),readFile:readTextFileIfRegular,statFile};class ClaudeTurnDetector extends EngineTurnDetector{deps;vendor="claude";readCompletion;constructor(deps=defaultClaudeDeps){super();this.deps=deps;this.readCompletion=completionReader(deps,latestClaudeCompletionMarkerFromJsonl)}async latestActivity(worktree){let files=await this.deps.listSessionFiles(worktree),mtimeMs=files[0]?.mtimeMs??0,latest=null;for(let file of files.slice(0,4)){let marker=(await this.readCompletion(file.path,file.mtimeMs))?.marker;if(marker&&(!latest||marker.timestampMs>latest.timestampMs))latest=marker}return{marker:latest,mtimeMs}}latestActivityInFile(transcriptPath3){return this.readCompletion(transcriptPath3)}}var defaultCodexDeps={findLatestRollout:(worktree)=>findLatestRolloutForWorktree(worktree),readFile:readTextFileIfRegular,statFile};class CodexTurnDetector extends EngineTurnDetector{deps;vendor="codex";readCompletion;constructor(deps=defaultCodexDeps){super();this.deps=deps;this.readCompletion=completionReader(deps,latestCodexCompletionMarkerFromJsonl)}latestActivityInFile(transcriptPath3){return this.readCompletion(transcriptPath3)}async latestActivity(worktree){if(!worktree)return{marker:null,mtimeMs:0};let found=await this.deps.findLatestRollout(worktree);return found?await this.readCompletion(found.path,found.mtimeMs)??{marker:null,mtimeMs:0}:{marker:null,mtimeMs:0}}}class UnknownTurnDetector extends EngineTurnDetector{vendor;constructor(vendor){super();this.vendor=vendor}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}}var CLAUDE_TURN_END_STOP_REASONS=new Set(["end_turn","stop_sequence","max_tokens","refusal"]);function latestClaudeCompletionMarkerFromJsonl(raw,sourceId="claude",fallbackMtimeMs=0){let latest=null,lineNo=0;for(let line of raw.split(`
34
153
  `)){lineNo++;let record=parseJsonLine(line);if(!record)continue;let inner=isObject8(record.message)?record.message:record;if(inner.role!=="assistant")continue;if(typeof inner.stop_reason!=="string")continue;if(!CLAUDE_TURN_END_STOP_REASONS.has(inner.stop_reason))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}var CODEX_ROLLOUT_DONE_EVENTS=new Set(["task_complete","turn_complete","turn_aborted"]);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(`
35
- `)){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){if(!isJsonlLineWithinBound(line))return null;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 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},codex:{vendor:"codex",builtin:!0,displayName:codexIdentity.shortName,defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh","max"],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,readTurns:readCodexTurns,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"),trustWorktree:trustCopilotWorktree,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 identifiableEngineIds(){return[...BUILTIN_VENDORS,...CONTRIB_ENGINE_IDS,...pluginEngineIds()]}function supportsStructuredHistory(vendor){return engineEntry(vendor).history.readHistory!==EMPTY_HISTORY.readHistory}var ALL_STATUS_PREFIXES=[...new Set(Object.values(BUILTIN_ENGINES).flatMap((entry)=>entry.terminalTitle?.statusPrefixes??[]))];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)}function vendorsWithTurnReader(){return Object.values(BUILTIN_ENGINES).filter((entry)=>entry.readTurns).map((entry)=>entry.vendor)}function createEngineHookAdapter(vendor){return engineEntry(vendor).createHookAdapter()}class NoopHookAdapter{vendor;constructor(vendor){this.vendor=vendor}supportsHooks(){return!1}globalSettingsPath(){return""}activityDetailFromPayload(){return}sessionFromPayload(){return}async installActivityHooks(){return{ok:!0}}async removeActivityHooks(){}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async removeWorktreeWatchHook(){}}
154
+ `)){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){if(!isJsonlLineWithinBound(line))return null;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 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},codex:{vendor:"codex",builtin:!0,displayName:codexIdentity.shortName,defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh","max"],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,readTurns:readCodexTurns,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"),trustWorktree:trustCopilotWorktree,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},pi:{vendor:"pi",builtin:!0,displayName:piIdentity.shortName,defaultCommand:["pi"],effortLevels:["off","minimal","low","medium","high","xhigh","max"],effortArgv:(base,level)=>[...base,"--thinking",level],history:piHistoryReader,createHookAdapter:()=>new PiFamilyHookAdapter("pi"),createTurnDetector:()=>new UnknownTurnDetector("pi"),capabilities:piCapabilities,identity:piIdentity,trustWorktree:trustPiWorktree,terminalTitle:{ownsStatus:!1,statusPrefixes:PI_STATUS_PREFIXES},sessionIdentity:{pinFlag:"--session-id",sessionControlFlags:["--session-id","--session","-c","--continue","-r","--resume","--fork"],resumeArgv:(base,id)=>[...base,"--session",id],forkArgv:(base,sourceId)=>[...base,"--fork",sourceId]},screenManifest:PI_SCREEN_MANIFEST},omp:{vendor:"omp",builtin:!0,displayName:ompIdentity.shortName,defaultCommand:["omp"],effortLevels:["off","minimal","low","medium","high","xhigh","max"],effortArgv:(base,level)=>[...base,"--thinking",level],history:ompHistoryReader,createHookAdapter:()=>new PiFamilyHookAdapter("omp"),createTurnDetector:()=>new UnknownTurnDetector("omp"),capabilities:ompCapabilities,identity:ompIdentity,terminalTitle:{ownsStatus:!0,statusPrefixes:OMP_STATUS_PREFIXES,workingPrefixes:OMP_WORKING_PREFIXES,attentionPrefixes:OMP_ATTENTION_PREFIXES},sessionIdentity:{sessionControlFlags:["-c","--continue","-r","--resume"],resumeArgv:(base,id)=>[...base,"-r",id]},screenManifest:OMP_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;if(config.attentionPrefixes?.some((prefix)=>trimmed.startsWith(prefix)))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 identifiableEngineIds(){return[...BUILTIN_VENDORS,...CONTRIB_ENGINE_IDS,...pluginEngineIds()]}function supportsStructuredHistory(vendor){return engineEntry(vendor).history.readHistory!==EMPTY_HISTORY.readHistory}var ALL_STATUS_PREFIXES=[...new Set(Object.values(BUILTIN_ENGINES).flatMap((entry)=>entry.terminalTitle?.statusPrefixes??[]))];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)}function vendorsWithTurnReader(){return Object.values(BUILTIN_ENGINES).filter((entry)=>entry.readTurns).map((entry)=>entry.vendor)}function createEngineHookAdapter(vendor){return engineEntry(vendor).createHookAdapter()}class NoopHookAdapter{vendor;constructor(vendor){this.vendor=vendor}supportsHooks(){return!1}globalSettingsPath(){return""}activityDetailFromPayload(){return}sessionFromPayload(){return}async installActivityHooks(){return{ok:!0}}async removeActivityHooks(){}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async removeWorktreeWatchHook(){}}
36
155
  export{createEngineHookAdapter,createEngineTurnDetector,engineEntry,identifiableEngineIds,supportsStructuredHistory,engineStatusPrefixes,stripEngineStatusPrefix,engineTitleTurnHint,engineSessionIdFromTitle,isEnginePlaceholderTitle,getCapabilities,vendorsWithQuotaProbe,vendorsWithTurnReader};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{PROJECT_DIR_TOKEN,WORKTREE_BASE_KEY,defaultLocalWorktreesRoot,legacyLocalWorktreesRoot,managedWorktreeRootsFor,normalizeWorktreeBase,worktreeRootFor}from"./chunk-63wmhbqs.js";import{execHostForRepo}from"./chunk-rc0sqhdh.js";import{getRemoteRepoConfig,isRemoteRepoKey}from"./chunk-ejqs2ta9.js";import{loadStateFile}from"./chunk-3jh78dmc.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{pathWithin}from"./chunk-f10n6063.js";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"}}class TaskNotFoundError extends Error{constructor(taskId){super(`task not found: ${taskId}`);this.name="TaskNotFoundError"}}class CannotDeleteMainTaskError extends Error{constructor(){super("cannot delete a main task; remove the repo from saved repos instead");this.name="CannotDeleteMainTaskError"}}var DIRTY_WORKTREE_CODE="DIRTY_WORKTREE";function describeDirtyWorktreeWork(ignored){return ignored==="unknown"?"gitignored work this check could not read (git status --ignored failed) \u2014 nothing here can confirm it is empty":ignored.length>0?`gitignored work git status cannot see: ${ignored.join(", ")}`:"uncommitted or untracked changes"}class DirtyWorktreeError extends Error{taskId;ignored;constructor(taskId,ignored=[]){super(`${DIRTY_WORKTREE_CODE}: task ${taskId} worktree has ${describeDirtyWorktreeWork(ignored)}`);this.taskId=taskId;this.ignored=ignored;this.name="DirtyWorktreeError"}}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"}}var TASK_DELETING_CODE="TASK_DELETING";class TaskDeletingError extends Error{taskId;constructor(taskId){super(`${TASK_DELETING_CODE}: task ${taskId} is being deleted`);this.taskId=taskId;this.name="TaskDeletingError"}}var MAIN_CHECKOUT_DIRTY_CODE="MAIN_CHECKOUT_DIRTY";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"}}var EMPTY_BRANCH_CODE="EMPTY_BRANCH";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"}}var EMPTY_BRANCH_DIRTY_WORKTREE_CODE="EMPTY_BRANCH_DIRTY_WORKTREE";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"}}var MISSING_REF_CODE="MISSING_REF";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"}}var LAND_CONFLICT_CODE="LAND_CONFLICT";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"}}var GIT_COMMAND_FAILED_CODE="GIT_COMMAND_FAILED";class GitCommandFailedError extends Error{command;stderr;constructor(command,stderr,hint){let detail=stderr.trim()||"(git printed nothing on stderr)";super(`${GIT_COMMAND_FAILED_CODE}: \`git ${command}\` failed \u2014 ${detail}${hint?`; ${hint}`:""}`);this.command=command;this.stderr=stderr;this.name="GitCommandFailedError"}}var WORKTREE_NAME_TAKEN_CODE="WORKTREE_NAME_TAKEN";class WorktreeNameTakenError extends Error{worktreeName;constructor(worktreeName){super(`${WORKTREE_NAME_TAKEN_CODE}: worktree name '${worktreeName}' is already in use in this repo \u2014 pick another, or omit --worktree-name for a generated one`);this.worktreeName=worktreeName;this.name="WorktreeNameTakenError"}}var INVALID_WORKTREE_NAME_CODE="INVALID_WORKTREE_NAME";class InvalidWorktreeNameError extends Error{worktreeName;constructor(worktreeName){super(`${INVALID_WORKTREE_NAME_CODE}: worktree name '${worktreeName}' must be a single path segment of letters, digits, '.', '_' or '-' (no '/', no '..', not starting with '.')`);this.worktreeName=worktreeName;this.name="InvalidWorktreeNameError"}}import fs from"fs";import path from"path";var WORKTREE_BASE_CUSTOM_KEY="worktree.basePath.custom",PROJECT_SIBLING_BASE=`${PROJECT_DIR_TOKEN}/..`;function worktreeBaseKindOf(raw){let trimmed=raw.trim();if(!trimmed)return"default";if(trimmed.replace(/\/+$/,"")===PROJECT_SIBLING_BASE)return"nextToProject";return"custom"}function getWorktreeBaseOverride(projectDir){let value=loadStateFile()[WORKTREE_BASE_KEY];return normalizeWorktreeBase(typeof value==="string"?value:null,projectDir)}function worktreeRootFor2(repo){return worktreeRootFor(repo,getWorktreeBaseOverride(repo))}function managedWorktreeRootsFor2(repo){return managedWorktreeRootsFor(repo,getWorktreeBaseOverride(repo))}function worktreePathFor(repo,slug){if(!slug||/[/\\\0]/.test(slug))throw Error(`worktreePathFor: invalid slug: ${JSON.stringify(slug)}`);return path.join(worktreeRootFor2(repo),slug)}async function listWorktreeDirNames(repo){if(isRemoteRepoKey(repo)){let basePath=getRemoteRepoConfig(repo)?.basePath;if(!basePath)return[];let names2=new Set,host=execHostForRepo(repo),entries=await Promise.all(remoteManagedWorktreeRootsFor(basePath).map((root)=>host.readdir(root)));for(let list of entries)for(let name of list)names2.add(name);return[...names2]}let names=new Set;for(let root of managedWorktreeRootsFor2(repo))try{for(let e of fs.readdirSync(root,{withFileTypes:!0}))if(e.isDirectory())names.add(e.name)}catch{}return[...names]}function managedWorktreeRootForPath(repo,candidate){if(!path.isAbsolute(repo)||!path.isAbsolute(candidate))return null;let target=canonicalize(candidate);for(let rootPath of managedWorktreeRootsFor2(repo)){let root=canonicalize(rootPath),rel=pathWithin(root,target);if(rel!==null&&rel!=="")return rootPath}return null}function isKobeManagedPath(repo,candidate){return managedWorktreeRootForPath(repo,candidate)!==null}function isUnderManagedWorktreesRoot(candidate,projectDir){if(!path.isAbsolute(candidate))return!1;let target=canonicalize(candidate),roots=[getWorktreeBaseOverride(projectDir)??"",defaultLocalWorktreesRoot(),legacyLocalWorktreesRoot()];for(let rootPath of roots){if(!rootPath)continue;let root=canonicalize(rootPath),rel=pathWithin(root,target);if(rel===null)continue;if(rel.split("/").filter(Boolean).length===2)return!0}return!1}function remoteWorktreeRootFor(basePath){return`${stripTrailingSlash(basePath)}/.rove/worktrees`}function remoteManagedWorktreeRootsFor(basePath){let base=stripTrailingSlash(basePath);return[`${base}/.rove/worktrees`,`${base}/.kobe/worktrees`]}function remoteWorktreePathFor(basePath,slug){if(!slug||/[/\\\0]/.test(slug))throw Error(`remoteWorktreePathFor: invalid slug: ${JSON.stringify(slug)}`);return`${remoteWorktreeRootFor(basePath)}/${slug}`}function remoteManagedRootForPath(basePath,candidate){for(let root of remoteManagedWorktreeRootsFor(basePath))if(candidate===root||candidate.startsWith(`${root}/`))return root;return null}function stripTrailingSlash(p){return p.length>1&&p.endsWith("/")?p.replace(/\/+$/,""):p}function requireAbsolute(name,value){if(!value||!path.isAbsolute(value))throw Error(`${name} must be an absolute path, got: ${JSON.stringify(value)}`)}function canonicalize(p){try{return fs.realpathSync(p)}catch{return path.resolve(p)}}
2
+ import{PROJECT_DIR_TOKEN,WORKTREE_BASE_KEY,defaultLocalWorktreesRoot,legacyLocalWorktreesRoot,managedWorktreeRootsFor,normalizeWorktreeBase,worktreeRootFor}from"./chunk-63wmhbqs.js";import{execHostForRepo}from"./chunk-dg8bsyb9.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{getRemoteRepoConfig,isRemoteRepoKey}from"./chunk-9ydhv2zb.js";import{loadStateFile}from"./chunk-3jh78dmc.js";import{pathWithin}from"./chunk-f10n6063.js";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"}}class TaskNotFoundError extends Error{constructor(taskId){super(`task not found: ${taskId}`);this.name="TaskNotFoundError"}}class CannotDeleteMainTaskError extends Error{constructor(){super("cannot delete a main task; remove the repo from saved repos instead");this.name="CannotDeleteMainTaskError"}}var DIRTY_WORKTREE_CODE="DIRTY_WORKTREE";function describeDirtyWorktreeWork(ignored){return ignored==="unknown"?"gitignored work this check could not read (git status --ignored failed) \u2014 nothing here can confirm it is empty":ignored.length>0?`gitignored work git status cannot see: ${ignored.join(", ")}`:"uncommitted or untracked changes"}class DirtyWorktreeError extends Error{taskId;ignored;constructor(taskId,ignored=[]){super(`${DIRTY_WORKTREE_CODE}: task ${taskId} worktree has ${describeDirtyWorktreeWork(ignored)}`);this.taskId=taskId;this.ignored=ignored;this.name="DirtyWorktreeError"}}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"}}var TASK_DELETING_CODE="TASK_DELETING";class TaskDeletingError extends Error{taskId;constructor(taskId){super(`${TASK_DELETING_CODE}: task ${taskId} is being deleted`);this.taskId=taskId;this.name="TaskDeletingError"}}var MAIN_CHECKOUT_DIRTY_CODE="MAIN_CHECKOUT_DIRTY";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"}}var EMPTY_BRANCH_CODE="EMPTY_BRANCH";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"}}var EMPTY_BRANCH_DIRTY_WORKTREE_CODE="EMPTY_BRANCH_DIRTY_WORKTREE";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"}}var MISSING_REF_CODE="MISSING_REF";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"}}var LAND_CONFLICT_CODE="LAND_CONFLICT";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"}}var GIT_COMMAND_FAILED_CODE="GIT_COMMAND_FAILED";class GitCommandFailedError extends Error{command;stderr;constructor(command,stderr,hint){let detail=stderr.trim()||"(git printed nothing on stderr)";super(`${GIT_COMMAND_FAILED_CODE}: \`git ${command}\` failed \u2014 ${detail}${hint?`; ${hint}`:""}`);this.command=command;this.stderr=stderr;this.name="GitCommandFailedError"}}var WORKTREE_NAME_TAKEN_CODE="WORKTREE_NAME_TAKEN";class WorktreeNameTakenError extends Error{worktreeName;constructor(worktreeName){super(`${WORKTREE_NAME_TAKEN_CODE}: worktree name '${worktreeName}' is already in use in this repo \u2014 pick another, or omit --worktree-name for a generated one`);this.worktreeName=worktreeName;this.name="WorktreeNameTakenError"}}var INVALID_WORKTREE_NAME_CODE="INVALID_WORKTREE_NAME";class InvalidWorktreeNameError extends Error{worktreeName;constructor(worktreeName){super(`${INVALID_WORKTREE_NAME_CODE}: worktree name '${worktreeName}' must be a single path segment of letters, digits, '.', '_' or '-' (no '/', no '..', not starting with '.')`);this.worktreeName=worktreeName;this.name="InvalidWorktreeNameError"}}import fs from"fs";import path from"path";var WORKTREE_BASE_CUSTOM_KEY="worktree.basePath.custom",PROJECT_SIBLING_BASE=`${PROJECT_DIR_TOKEN}/..`;function worktreeBaseKindOf(raw){let trimmed=raw.trim();if(!trimmed)return"default";if(trimmed.replace(/\/+$/,"")===PROJECT_SIBLING_BASE)return"nextToProject";return"custom"}function getWorktreeBaseOverride(projectDir){let value=loadStateFile()[WORKTREE_BASE_KEY];return normalizeWorktreeBase(typeof value==="string"?value:null,projectDir)}function worktreeRootFor2(repo){return worktreeRootFor(repo,getWorktreeBaseOverride(repo))}function managedWorktreeRootsFor2(repo){return managedWorktreeRootsFor(repo,getWorktreeBaseOverride(repo))}function worktreePathFor(repo,slug){if(!slug||/[/\\\0]/.test(slug))throw Error(`worktreePathFor: invalid slug: ${JSON.stringify(slug)}`);return path.join(worktreeRootFor2(repo),slug)}async function listWorktreeDirNames(repo){if(isRemoteRepoKey(repo)){let basePath=getRemoteRepoConfig(repo)?.basePath;if(!basePath)return[];let names2=new Set,host=execHostForRepo(repo),entries=await Promise.all(remoteManagedWorktreeRootsFor(basePath).map((root)=>host.readdir(root)));for(let list of entries)for(let name of list)names2.add(name);return[...names2]}let names=new Set;for(let root of managedWorktreeRootsFor2(repo))try{for(let e of fs.readdirSync(root,{withFileTypes:!0}))if(e.isDirectory())names.add(e.name)}catch{}return[...names]}function managedWorktreeRootForPath(repo,candidate){if(!path.isAbsolute(repo)||!path.isAbsolute(candidate))return null;let target=canonicalize(candidate);for(let rootPath of managedWorktreeRootsFor2(repo)){let root=canonicalize(rootPath),rel=pathWithin(root,target);if(rel!==null&&rel!=="")return rootPath}return null}function isKobeManagedPath(repo,candidate){return managedWorktreeRootForPath(repo,candidate)!==null}function isUnderManagedWorktreesRoot(candidate,projectDir){if(!path.isAbsolute(candidate))return!1;let target=canonicalize(candidate),roots=[getWorktreeBaseOverride(projectDir)??"",defaultLocalWorktreesRoot(),legacyLocalWorktreesRoot()];for(let rootPath of roots){if(!rootPath)continue;let root=canonicalize(rootPath),rel=pathWithin(root,target);if(rel===null)continue;if(rel.split("/").filter(Boolean).length===2)return!0}return!1}function remoteWorktreeRootFor(basePath){return`${stripTrailingSlash(basePath)}/.rove/worktrees`}function remoteManagedWorktreeRootsFor(basePath){let base=stripTrailingSlash(basePath);return[`${base}/.rove/worktrees`,`${base}/.kobe/worktrees`]}function remoteWorktreePathFor(basePath,slug){if(!slug||/[/\\\0]/.test(slug))throw Error(`remoteWorktreePathFor: invalid slug: ${JSON.stringify(slug)}`);return`${remoteWorktreeRootFor(basePath)}/${slug}`}function remoteManagedRootForPath(basePath,candidate){for(let root of remoteManagedWorktreeRootsFor(basePath))if(candidate===root||candidate.startsWith(`${root}/`))return root;return null}function stripTrailingSlash(p){return p.length>1&&p.endsWith("/")?p.replace(/\/+$/,""):p}function requireAbsolute(name,value){if(!value||!path.isAbsolute(value))throw Error(`${name} must be an absolute path, got: ${JSON.stringify(value)}`)}function canonicalize(p){try{return fs.realpathSync(p)}catch{return path.resolve(p)}}
3
3
  export{IllegalTransitionError,TaskNotFoundError,CannotDeleteMainTaskError,DIRTY_WORKTREE_CODE,describeDirtyWorktreeWork,DirtyWorktreeError,WorktreeRemoveFailedError,TASK_DELETING_CODE,TaskDeletingError,MainCheckoutDirtyError,EmptyBranchError,EMPTY_BRANCH_DIRTY_WORKTREE_CODE,EmptyBranchDirtyWorktreeError,MissingRefError,LandConflictError,GitCommandFailedError,WorktreeNameTakenError,InvalidWorktreeNameError,WORKTREE_BASE_CUSTOM_KEY,PROJECT_SIBLING_BASE,worktreeBaseKindOf,worktreePathFor,listWorktreeDirNames,managedWorktreeRootForPath,isKobeManagedPath,isUnderManagedWorktreesRoot,remoteWorktreePathFor,remoteManagedRootForPath,requireAbsolute,canonicalize};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{ensureGlobalKobeHooks,readTextWithTimeout,runHookSubcommand}from"./chunk-hxmzxn22.js";import"./chunk-3e5n28t6.js";import"./chunk-r2pztgm6.js";import"./chunk-bq9shn2d.js";import"./chunk-te8g5azg.js";import"./chunk-y13681dw.js";import"./chunk-b5mbpv97.js";import"./chunk-re5ke4fz.js";import"./chunk-mnqxgvyb.js";import"./chunk-zb55a46t.js";import"./chunk-kx3kydwv.js";import"./chunk-w7zv47mp.js";import"./chunk-khj0apc7.js";import"./chunk-jvxh93nz.js";import"./chunk-2brn8e1y.js";import"./chunk-r92b9j14.js";import"./chunk-aep7gvh4.js";import"./chunk-7kysxgbq.js";import"./chunk-krpsfcda.js";import"./chunk-xy8be792.js";import"./chunk-9ydhv2zb.js";import"./chunk-40dgv828.js";import"./chunk-3jh78dmc.js";import"./chunk-ddcxvbme.js";import"./chunk-0q6h4vt4.js";import"./chunk-pw6yfj10.js";import"./chunk-05jej26n.js";import"./chunk-81p6mm0p.js";import"./chunk-q5jhy3t8.js";import"./chunk-t915by6w.js";import"./chunk-f10n6063.js";import"./chunk-9prawccj.js";import"./chunk-8cjr5ypt.js";import"./chunk-00ehck55.js";import"./chunk-fxs82dsx.js";import"./chunk-sb0ns0c7.js";import"./chunk-hq4b3fca.js";import"./chunk-wqfp8d9w.js";export{runHookSubcommand,readTextWithTimeout,ensureGlobalKobeHooks};
package/dist/cli/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{matchPathGlob}from"./chunk-kg11c1py.js";import{CURRENT_VERSION}from"./chunk-nk1d8t3a.js";import{argvHasFlag}from"./chunk-jvxh93nz.js";import{expandTilde}from"./chunk-fczqwtmq.js";import{connectIfRunning}from"./chunk-te8g5azg.js";import"./chunk-y13681dw.js";import"./chunk-b5mbpv97.js";import"./chunk-re5ke4fz.js";import"./chunk-mnqxgvyb.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{BUILTIN_VENDORS,coerceVendorId,isBuiltinVendor}from"./chunk-bq3fyc0p.js";import{rejectionReason}from"./chunk-81p6mm0p.js";import"./chunk-q5jhy3t8.js";import"./chunk-t915by6w.js";import"./chunk-9prawccj.js";import{activeCliName,prepareCliEnvironment}from"./chunk-00ehck55.js";import"./chunk-fxs82dsx.js";import"./chunk-sb0ns0c7.js";import"./chunk-0q6h4vt4.js";import"./chunk-pw6yfj10.js";import{pathSyntax}from"./chunk-f10n6063.js";import"./chunk-8cjr5ypt.js";import"./chunk-hq4b3fca.js";import{__require}from"./chunk-wqfp8d9w.js";import{resolve as resolve2}from"path";function debugEnabled(env){return env.KOBE_DEBUG==="1"||env.ROVE_DEBUG==="1"}function failureSubject(cliName,argv){let verb=argv[2];return verb&&!verb.startsWith("-")&&!verb.includes("/")?`${cliName} ${verb}`:cliName}function summarizeCliGitError(message,cwd){if(!/not a git repository/i.test(message))return null;return`${cwd} is not a git repository \u2014 run this inside one, or pass a repo path.`}function formatCliFailure(err,opts){let subject=failureSubject(opts.cliName,opts.argv);if(debugEnabled(opts.env))return`${subject}: ${String(err instanceof Error?err.stack??err:err)}`;let raw=errorMessage(err);return`${subject}: ${summarizeCliGitError(raw,opts.cwd)??raw}`}var DYNAMIC_COMMANDS=new Map([["completions",async(args)=>{let{runCompletionsSubcommand}=await import("./chunk-2w9pqcc3.js");await runCompletionsSubcommand(args)}],["export",async(args)=>{let{runExportSubcommand}=await import("./chunk-p94469k0.js");await runExportSubcommand(args)}],["repo",async(args)=>{let{runRepoSubcommand}=await import("./chunk-p682ggqt.js");await runRepoSubcommand(args)}],["api",async(args)=>{let{runApiSubcommand}=await import("./chunk-hm1fg4b1.js");await runApiSubcommand(args)}],["update",async(args)=>{let{runUpdateSubcommand}=await import("./chunk-8s5yzt7z.js");await runUpdateSubcommand(args)}],["theme",async(args)=>{let{runThemeSubcommand}=await import("./chunk-mqh8f3zv.js");await runThemeSubcommand(args)}],["feedback",async(args)=>{let{runFeedbackSubcommand}=await import("./chunk-d3qmrnc6.js");await runFeedbackSubcommand(args)}],["daemon",async(args)=>{let{runDaemonSubcommand}=await import("./chunk-p3stdyd2.js");await runDaemonSubcommand(args)}],["machine",async(args)=>{let{runMachineSubcommand}=await import("./chunk-j7kh6qj1.js");await runMachineSubcommand(args)}],["doctor",async(args)=>{let{runDoctorSubcommand}=await import("./chunk-vvyg65jf.js");await runDoctorSubcommand(args)}],["config",async(args)=>{let{runConfigSubcommand}=await import("./chunk-d6x4gama.js");await runConfigSubcommand(args)}],["reset",async(args)=>{let{runResetSubcommand}=await import("./chunk-ectyq178.js");await runResetSubcommand(args)}],["pty-host",async(args)=>{let{runPtyHostSubcommand}=await import("./chunk-0pazt6mk.js");await runPtyHostSubcommand(args)}],["skill",async(args)=>{let{runSkillSubcommand}=await import("./chunk-hgczkz57.js");await runSkillSubcommand(args)}],["plugin",async(args)=>{let{runPluginSubcommand}=await import("./chunk-nn099hrx.js");await runPluginSubcommand(args)}],["hook",async(args)=>{let{runHookSubcommand}=await import("./chunk-8v4hq025.js");await runHookSubcommand(args)}]]);import{statSync}from"fs";import{resolve}from"path";async function openLocalOrchestrator(){let{TaskIndexStore}=await import("./chunk-gq81y9jt.js"),{GitWorktreeManager}=await import("./chunk-bsg826q0.js"),{Orchestrator}=await import("./chunk-g6x26jt2.js"),store=new TaskIndexStore;return await store.load(),new Orchestrator({store,worktrees:new GitWorktreeManager})}async function withDaemonOrLocal(bridge){let client=await connectIfRunning();if(client)try{return await bridge.daemon(client)}finally{client.close()}let orch=await openLocalOrchestrator();return bridge.local(orch)}function isPathLikeArg(arg){return arg==="."||arg===".."||arg.startsWith("./")||arg.startsWith("../")||arg.startsWith(".\\")||arg.startsWith("..\\")||pathSyntax(arg).isAbsolute(arg)||arg.startsWith("/")||arg==="~"||arg.startsWith("~/")||arg.startsWith("~\\")}async function projectRootFor(dir){let{isGitRepo,resolveRepoRoot}=await import("./chunk-1b0cmce4.js"),{projectRejection}=await import("./chunk-ndtbxgyp.js"),top=resolveRepoRoot(dir);if(top!==dir)return null;return projectRejection(top,isGitRepo,"explicit")?null:top}async function runOpenDirectory(arg){let dir=resolve(process.cwd(),expandTilde(arg)),isDir=!1;try{isDir=statSync(dir).isDirectory()}catch{isDir=!1}if(!isDir)process.stderr.write(`${activeCliName()}: "${arg}" is not a directory (resolved to ${dir}).
4
- `),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}=await import("./chunk-66ay20qj.js");writeLastActiveTaskId(String(task.id))}});let{publishKobeTerminalTitle}=await import("./chunk-1tx1s5v6.js");publishKobeTerminalTitle();let{startTui}=await import("./chunk-f01z7hw8.js");await startTui()}function topLevelUsage(cliName=activeCliName()){return[`${cliName} ${CURRENT_VERSION}`,"",`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:"," 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)"," machine <verb> Other computers running Rove (add|remove|list)"," 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(`
3
+ import{matchPathGlob}from"./chunk-kg11c1py.js";import{expandTilde}from"./chunk-fczqwtmq.js";import{connectIfRunning}from"./chunk-te8g5azg.js";import"./chunk-y13681dw.js";import"./chunk-b5mbpv97.js";import"./chunk-re5ke4fz.js";import"./chunk-mnqxgvyb.js";import{CURRENT_VERSION}from"./chunk-4kyjgysj.js";import{argvHasFlag}from"./chunk-jvxh93nz.js";import{errorMessage}from"./chunk-2brn8e1y.js";import"./chunk-0q6h4vt4.js";import"./chunk-pw6yfj10.js";import{BUILTIN_VENDORS,coerceVendorId,isBuiltinVendor}from"./chunk-05jej26n.js";import{rejectionReason}from"./chunk-81p6mm0p.js";import"./chunk-q5jhy3t8.js";import"./chunk-t915by6w.js";import{pathSyntax}from"./chunk-f10n6063.js";import"./chunk-9prawccj.js";import"./chunk-8cjr5ypt.js";import{activeCliName,prepareCliEnvironment}from"./chunk-00ehck55.js";import"./chunk-fxs82dsx.js";import"./chunk-sb0ns0c7.js";import"./chunk-hq4b3fca.js";import{__require}from"./chunk-wqfp8d9w.js";import{resolve as resolve2}from"path";function debugEnabled(env){return env.KOBE_DEBUG==="1"||env.ROVE_DEBUG==="1"}function failureSubject(cliName,argv){let verb=argv[2];return verb&&!verb.startsWith("-")&&!verb.includes("/")?`${cliName} ${verb}`:cliName}function summarizeCliGitError(message,cwd){if(!/not a git repository/i.test(message))return null;return`${cwd} is not a git repository \u2014 run this inside one, or pass a repo path.`}function formatCliFailure(err,opts){let subject=failureSubject(opts.cliName,opts.argv);if(debugEnabled(opts.env))return`${subject}: ${String(err instanceof Error?err.stack??err:err)}`;let raw=errorMessage(err);return`${subject}: ${summarizeCliGitError(raw,opts.cwd)??raw}`}var DYNAMIC_COMMANDS=new Map([["completions",async(args)=>{let{runCompletionsSubcommand}=await import("./chunk-whe3w5jh.js");await runCompletionsSubcommand(args)}],["export",async(args)=>{let{runExportSubcommand}=await import("./chunk-2whb5300.js");await runExportSubcommand(args)}],["repo",async(args)=>{let{runRepoSubcommand}=await import("./chunk-vas2mpdv.js");await runRepoSubcommand(args)}],["api",async(args)=>{let{runApiSubcommand}=await import("./chunk-pkckq6ns.js");await runApiSubcommand(args)}],["update",async(args)=>{let{runUpdateSubcommand}=await import("./chunk-sceaevbq.js");await runUpdateSubcommand(args)}],["theme",async(args)=>{let{runThemeSubcommand}=await import("./chunk-9nv53s3m.js");await runThemeSubcommand(args)}],["feedback",async(args)=>{let{runFeedbackSubcommand}=await import("./chunk-xdc8zk9x.js");await runFeedbackSubcommand(args)}],["daemon",async(args)=>{let{runDaemonSubcommand}=await import("./chunk-psgaps88.js");await runDaemonSubcommand(args)}],["machine",async(args)=>{let{runMachineSubcommand}=await import("./chunk-2a3ecfth.js");await runMachineSubcommand(args)}],["doctor",async(args)=>{let{runDoctorSubcommand}=await import("./chunk-ms69jdrr.js");await runDoctorSubcommand(args)}],["config",async(args)=>{let{runConfigSubcommand}=await import("./chunk-tfqyddnn.js");await runConfigSubcommand(args)}],["reset",async(args)=>{let{runResetSubcommand}=await import("./chunk-d7bdt1td.js");await runResetSubcommand(args)}],["pty-host",async(args)=>{let{runPtyHostSubcommand}=await import("./chunk-9kf9v85y.js");await runPtyHostSubcommand(args)}],["skill",async(args)=>{let{runSkillSubcommand}=await import("./chunk-fcd3w4v9.js");await runSkillSubcommand(args)}],["plugin",async(args)=>{let{runPluginSubcommand}=await import("./chunk-738d2s48.js");await runPluginSubcommand(args)}],["hook",async(args)=>{let{runHookSubcommand}=await import("./chunk-zw9q9da9.js");await runHookSubcommand(args)}]]);import{statSync}from"fs";import{resolve}from"path";async function openLocalOrchestrator(){let{TaskIndexStore}=await import("./chunk-yk2q890q.js"),{GitWorktreeManager}=await import("./chunk-9va1mbqk.js"),{Orchestrator}=await import("./chunk-6ey2nr4j.js"),store=new TaskIndexStore;return await store.load(),new Orchestrator({store,worktrees:new GitWorktreeManager})}async function withDaemonOrLocal(bridge){let client=await connectIfRunning();if(client)try{return await bridge.daemon(client)}finally{client.close()}let orch=await openLocalOrchestrator();return bridge.local(orch)}function isPathLikeArg(arg){return arg==="."||arg===".."||arg.startsWith("./")||arg.startsWith("../")||arg.startsWith(".\\")||arg.startsWith("..\\")||pathSyntax(arg).isAbsolute(arg)||arg.startsWith("/")||arg==="~"||arg.startsWith("~/")||arg.startsWith("~\\")}async function projectRootFor(dir){let{isGitRepo,resolveRepoRoot}=await import("./chunk-6txd5jtt.js"),{projectRejection}=await import("./chunk-ndtbxgyp.js"),top=resolveRepoRoot(dir);if(top!==dir)return null;return projectRejection(top,isGitRepo,"explicit")?null:top}async function runOpenDirectory(arg){let dir=resolve(process.cwd(),expandTilde(arg)),isDir=!1;try{isDir=statSync(dir).isDirectory()}catch{isDir=!1}if(!isDir)process.stderr.write(`${activeCliName()}: "${arg}" is not a directory (resolved to ${dir}).
4
+ `),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}=await import("./chunk-66ay20qj.js");writeLastActiveTaskId(String(task.id))}});let{publishKobeTerminalTitle}=await import("./chunk-1tx1s5v6.js");publishKobeTerminalTitle();let{startTui}=await import("./chunk-ts0078by.js");await startTui()}function topLevelUsage(cliName=activeCliName()){return[`${cliName} ${CURRENT_VERSION}`,"",`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:"," 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)"," machine <verb> Other computers running Rove (add|remove|list)"," 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(`
5
5
  `)}prepareCliEnvironment();var CLI_NAME=activeCliName(),ADD_USAGE=[`Usage: ${CLI_NAME} add [path]`,` ${CLI_NAME} add --remote --host <host> --user <user> --path <basePath> [--port N] [--key [path] | --password]`,"","Save a repo for the new-task picker. With --remote, register an SSH-backed","project whose worktrees live on <host>; engine launch over SSH is pending.",""].join(`
6
- `);async function runAddSubcommand(rest){let arg=rest[0];if(arg==="--help"||arg==="-h"||arg==="help"){process.stdout.write(ADD_USAGE);return}if(arg==="--remote"){let{runAddRemote}=await import("./chunk-hex5xwyk.js");await runAddRemote(rest.slice(1));return}if(arg?.startsWith("-"))process.stderr.write(`${CLI_NAME} add: unknown flag "${arg}"
6
+ `);async function runAddSubcommand(rest){let arg=rest[0];if(arg==="--help"||arg==="-h"||arg==="help"){process.stdout.write(ADD_USAGE);return}if(arg==="--remote"){let{runAddRemote}=await import("./chunk-fgx4gnwc.js");await runAddRemote(rest.slice(1));return}if(arg?.startsWith("-"))process.stderr.write(`${CLI_NAME} add: unknown flag "${arg}"
7
7
 
8
- ${ADD_USAGE}`),process.exit(2);let target=resolve2(process.cwd(),expandTilde(arg&&arg.length>0?arg:".")),{addSavedRepo}=await import("./chunk-1b0cmce4.js"),result=addSavedRepo(target);if(result.rejected)process.stderr.write(`${CLI_NAME} add: "${arg&&arg.length>0?arg:"."}" cannot be a project \u2014 ${rejectionReason(result.rejected)} (resolved to ${result.path}).
8
+ ${ADD_USAGE}`),process.exit(2);let target=resolve2(process.cwd(),expandTilde(arg&&arg.length>0?arg:".")),{addSavedRepo}=await import("./chunk-6txd5jtt.js"),result=addSavedRepo(target);if(result.rejected)process.stderr.write(`${CLI_NAME} add: "${arg&&arg.length>0?arg:"."}" cannot be a project \u2014 ${rejectionReason(result.rejected)} (resolved to ${result.path}).
9
9
  `),process.exit(1);if(result.added)console.log(`added ${result.path} (${result.total} saved repo${result.total===1?"":"s"} total)`);else console.log(`already saved: ${result.path}`);await ensureProjectMainTask(result.path),await adoptAllWorktrees(result.path)}async function ensureProjectMainTask(repo){try{await withDaemonOrLocal({daemon:(client)=>client.request("task.ensureMain",{repo}),local:(orch)=>orch.ensureMainTask(repo)})}catch(err){console.error(`(skipped project main-task setup: ${errorMessage(err)})`)}}var PURGE_FLAG="--purge-credentials",REMOVE_USAGE=[`Usage: ${CLI_NAME} remove [path] [--purge-credentials]`,"","Forget a saved project (drop it from the new-task picker). Non-destructive:","the repo's files, worktrees, branches and tasks all stay on disk. A remote","(ssh://) project also has its stored connection config dropped.",""," path defaults to the current directory. Pass an exact saved entry (e.g. a"," remote `ssh://user@host` key) to remove it verbatim. Run with no match to"," print the current saved projects.",""," --purge-credentials also delete the remote project's SSH password from"," the OS keychain. Off by default: forgetting a project"," should not silently destroy a stored secret.",""].join(`
10
10
  `);async function runRemoveSubcommand(rest){let purgeCredentials=argvHasFlag(rest,PURGE_FLAG),arg=rest.filter((a)=>a!==PURGE_FLAG&&!a.startsWith(`${PURGE_FLAG}=`))[0];if(arg==="--help"||arg==="-h"||arg==="help"){process.stdout.write(REMOVE_USAGE);return}if(arg?.startsWith("-"))process.stderr.write(`${CLI_NAME} remove: unknown flag "${arg}"
11
11
 
12
- ${REMOVE_USAGE}`),process.exit(2);let{getRemoteRepoConfig,getSavedRepos,resolveRepoRoot}=await import("./chunk-1b0cmce4.js"),saved=getSavedRepos();if(saved.length===0){console.log("no saved projects to remove.");return}let raw=arg&&arg.length>0?arg:".",target=saved.includes(raw)?raw:(()=>{let abs=resolve2(process.cwd(),expandTilde(raw)),top=resolveRepoRoot(abs);if(saved.includes(top))return top;if(saved.includes(abs))return abs;return null})();if(target===null){process.stderr.write(`${CLI_NAME} remove: "${raw}" is not a saved project.
12
+ ${REMOVE_USAGE}`),process.exit(2);let{getRemoteRepoConfig,getSavedRepos,resolveRepoRoot}=await import("./chunk-6txd5jtt.js"),saved=getSavedRepos();if(saved.length===0){console.log("no saved projects to remove.");return}let raw=arg&&arg.length>0?arg:".",target=saved.includes(raw)?raw:(()=>{let abs=resolve2(process.cwd(),expandTilde(raw)),top=resolveRepoRoot(abs);if(saved.includes(top))return top;if(saved.includes(abs))return abs;return null})();if(target===null){process.stderr.write(`${CLI_NAME} remove: "${raw}" is not a saved project.
13
13
 
14
14
  Saved projects:
15
15
  `);for(let p of saved)process.stderr.write(` ${p}
@@ -18,8 +18,8 @@ Saved projects:
18
18
 
19
19
  ${ADOPT_USAGE}
20
20
  `),process.exit(2)}async function runAdoptSubcommand(args){let glob,repoArg,vendorArg,yes=!1;for(let i=0;i<args.length;i++){let a=args[i];if(a==="--help"||a==="-h"||a==="help"){process.stdout.write(`${ADOPT_USAGE}
21
- `);return}if(a==="--repo"){if(repoArg=args[++i],repoArg===void 0)adoptUsageError("--repo requires a value")}else if(a==="--vendor"){if(vendorArg=args[++i],vendorArg===void 0)adoptUsageError("--vendor requires a value")}else if(a==="--yes"||a==="-y")yes=!0;else if(a&&!a.startsWith("-")&&glob===void 0)glob=a;else adoptUsageError(`unexpected argument "${a}"`)}let{getCustomEngineIds,resolveRepoRoot}=await import("./chunk-1b0cmce4.js"),repo=resolveRepoRoot(resolve2(process.cwd(),expandTilde(repoArg&&repoArg.length>0?repoArg:"."))),typed=vendorArg?.trim();if(typed&&!isBuiltinVendor(typed)&&!getCustomEngineIds().includes(typed)){let known=[...BUILTIN_VENDORS,...getCustomEngineIds()].join(", ");adoptUsageError(`unknown engine "${typed}" \u2014 no task was created. Known engines: ${known}`)}let vendor=coerceVendorId(vendorArg),orch=await openLocalOrchestrator(),worktrees=await orch.discoverAdoptableWorktrees(repo);if(worktrees.length===0){console.log(`no adoptable worktrees for ${repo} \u2014 every git worktree here is already a task`);return}let isMatch=(w)=>!glob||matchPathGlob(glob,w.path);console.log(`adoptable worktrees in ${repo}:`);for(let w of worktrees){let hit=glob?isMatch(w)?"*":" ":"-",tags=[w.dirty===!0?"dirty":w.dirty===null?"dirty?":"",w.kobeManaged?"":"external"].filter(Boolean).join(",");console.log(` ${hit} ${w.branch} ${w.path}${tags?` (${tags})`:""}`)}if(!glob){console.log(`
21
+ `);return}if(a==="--repo"){if(repoArg=args[++i],repoArg===void 0)adoptUsageError("--repo requires a value")}else if(a==="--vendor"){if(vendorArg=args[++i],vendorArg===void 0)adoptUsageError("--vendor requires a value")}else if(a==="--yes"||a==="-y")yes=!0;else if(a&&!a.startsWith("-")&&glob===void 0)glob=a;else adoptUsageError(`unexpected argument "${a}"`)}let{getCustomEngineIds,resolveRepoRoot}=await import("./chunk-6txd5jtt.js"),repo=resolveRepoRoot(resolve2(process.cwd(),expandTilde(repoArg&&repoArg.length>0?repoArg:"."))),typed=vendorArg?.trim();if(typed&&!isBuiltinVendor(typed)&&!getCustomEngineIds().includes(typed)){let known=[...BUILTIN_VENDORS,...getCustomEngineIds()].join(", ");adoptUsageError(`unknown engine "${typed}" \u2014 no task was created. Known engines: ${known}`)}let vendor=coerceVendorId(vendorArg),orch=await openLocalOrchestrator(),worktrees=await orch.discoverAdoptableWorktrees(repo);if(worktrees.length===0){console.log(`no adoptable worktrees for ${repo} \u2014 every git worktree here is already a task`);return}let isMatch=(w)=>!glob||matchPathGlob(glob,w.path);console.log(`adoptable worktrees in ${repo}:`);for(let w of worktrees){let hit=glob?isMatch(w)?"*":" ":"-",tags=[w.dirty===!0?"dirty":w.dirty===null?"dirty?":"",w.kobeManaged?"":"external"].filter(Boolean).join(",");console.log(` ${hit} ${w.branch} ${w.path}${tags?` (${tags})`:""}`)}if(!glob){console.log(`
22
22
  pass a path glob to adopt, e.g. ${CLI_NAME} adopt '${repo}/*' --yes`);return}let matched=worktrees.filter(isMatch);if(matched.length===0){console.log(`
23
23
  no worktrees match glob ${JSON.stringify(glob)}`);return}if(!yes){console.log(`
24
24
  ${matched.length} worktree(s) match \u2014 re-run with --yes to adopt them`);return}await adoptWorktreesInto(orch,repo,matched,vendor),console.log(`done \u2014 adopted ${matched.length} worktree(s)`)}function printTopLevelUsage(out){out.write(`${topLevelUsage()}
25
- `)}var COMMANDS=new Map([["add",runAddSubcommand],["remove",runRemoveSubcommand],["adopt",runAdoptSubcommand],...DYNAMIC_COMMANDS]);async function main(){let[,,...rawArgs]=process.argv,[subcommand,...rest]=rawArgs;if(subcommand==="--version"||subcommand==="-v"||subcommand==="version"){let{CURRENT_VERSION:CURRENT_VERSION2}=await import("./chunk-w4y5cmbs.js");console.log(`${CLI_NAME} ${CURRENT_VERSION2}`);return}if(subcommand==="--help"||subcommand==="-h"||subcommand==="help"){printTopLevelUsage(process.stdout);return}if(subcommand==="--skill"){let{runSkillSubcommand}=await import("./chunk-hgczkz57.js");await runSkillSubcommand(["print"]);return}let handler=subcommand!==void 0?COMMANDS.get(subcommand):void 0;if(handler){await handler(rest);return}if(subcommand!==void 0&&isPathLikeArg(subcommand)){await runOpenDirectory(subcommand);return}if(subcommand!==void 0)console.error(`${CLI_NAME}: unknown command '${subcommand}'`),printTopLevelUsage(process.stderr),process.exit(2);let{publishKobeTerminalTitle}=await import("./chunk-1tx1s5v6.js");publishKobeTerminalTitle();let{maybeRunOnboarding}=await import("./chunk-bveqt1bn.js");if(await maybeRunOnboarding())return;let{startTui}=await import("./chunk-f01z7hw8.js");await startTui()}main().catch((err)=>{console.error(formatCliFailure(err,{cliName:CLI_NAME,argv:process.argv,cwd:process.cwd(),env:process.env})),process.exit(1)});
25
+ `)}var COMMANDS=new Map([["add",runAddSubcommand],["remove",runRemoveSubcommand],["adopt",runAdoptSubcommand],...DYNAMIC_COMMANDS]);async function main(){let[,,...rawArgs]=process.argv,[subcommand,...rest]=rawArgs;if(subcommand==="--version"||subcommand==="-v"||subcommand==="version"){let{CURRENT_VERSION:CURRENT_VERSION2}=await import("./chunk-9vqkh1jv.js");console.log(`${CLI_NAME} ${CURRENT_VERSION2}`);return}if(subcommand==="--help"||subcommand==="-h"||subcommand==="help"){printTopLevelUsage(process.stdout);return}if(subcommand==="--skill"){let{runSkillSubcommand}=await import("./chunk-fcd3w4v9.js");await runSkillSubcommand(["print"]);return}let handler=subcommand!==void 0?COMMANDS.get(subcommand):void 0;if(handler){await handler(rest);return}if(subcommand!==void 0&&isPathLikeArg(subcommand)){await runOpenDirectory(subcommand);return}if(subcommand!==void 0)console.error(`${CLI_NAME}: unknown command '${subcommand}'`),printTopLevelUsage(process.stderr),process.exit(2);let{publishKobeTerminalTitle}=await import("./chunk-1tx1s5v6.js");publishKobeTerminalTitle();let{maybeRunOnboarding}=await import("./chunk-kks0vy2x.js");if(await maybeRunOnboarding())return;let{startTui}=await import("./chunk-ts0078by.js");await startTui()}main().catch((err)=>{console.error(formatCliFailure(err,{cliName:CLI_NAME,argv:process.argv,cwd:process.cwd(),env:process.env})),process.exit(1)});
package/dist/cli/kobe.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{join as z1}from"node:path";import{createInterface as $1}from"node:readline/promises";import{pathToFileURL as J1}from"node:url";import{spawnSync as j}from"node:child_process";import{constants as m,accessSync as u}from"node:fs";import{homedir as l}from"node:os";import{basename as t,delimiter as o,dirname as r,join as Y}from"node:path";import{fileURLToPath as O}from"node:url";var g={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.190",description:"Rove — 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 scripts/render-track.mjs",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","smol-toml":"^1.7.1",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.19","@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 C="rove",V="kobe";var T=V;var k=C;var d="ROVE_INVOKED_AS";function F(W=process.env){return W[d]===k?k:T}var x="ROVE_BUN",i="ROVE_NO_BUN_BOOTSTRAP",B="ROVE_SKIP_BUN_CHECK",G=g.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0",A=(W)=>{try{return u(W,m.X_OK),!0}catch{return!1}},a=(W)=>W==="win32"?"bun.exe":"bun",n=(W)=>{let b=j(W,["--version"],{encoding:"utf8",timeout:5000});if(b.error||b.status!==0)return null;return b.stdout?.split(`
2
+ import{join as z1}from"node:path";import{createInterface as $1}from"node:readline/promises";import{pathToFileURL as J1}from"node:url";import{spawnSync as j}from"node:child_process";import{constants as m,accessSync as u}from"node:fs";import{homedir as l}from"node:os";import{basename as t,delimiter as o,dirname as r,join as Y}from"node:path";import{fileURLToPath as O}from"node:url";var g={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.192",description:"Rove — 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/completions","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 scripts/render-track.mjs",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","smol-toml":"^1.7.1",ws:"^8.18.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/kobe-daemon":"0.7.19","@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 C="rove",V="kobe";var T=V;var k=C;var d="ROVE_INVOKED_AS";function F(W=process.env){return W[d]===k?k:T}var x="ROVE_BUN",i="ROVE_NO_BUN_BOOTSTRAP",B="ROVE_SKIP_BUN_CHECK",G=g.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0",A=(W)=>{try{return u(W,m.X_OK),!0}catch{return!1}},a=(W)=>W==="win32"?"bun.exe":"bun",n=(W)=>{let b=j(W,["--version"],{encoding:"utf8",timeout:5000});if(b.error||b.status!==0)return null;return b.stdout?.split(`
3
3
  `)[0]?.trim()??""};function L(W){return W.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function K(W,b=G){let z=L(W),Q=L(b);if(!z||!Q)return!0;let J=z.split(".").map(Number),$=Q.split(".").map(Number);for(let X=0;X<3;X++){let H=J[X]??0,q=$[X]??0;if(H!==q)return H>q}return!0}function P(W=process.env){return W[B]==="1"}function h(W={}){let b=W.env??process.env,z=W.platform??process.platform,Q=W.home??b.HOME??b.USERPROFILE??l(),J=a(z),$=[],X=b[x]?.trim();if(X)$.push(X);for(let U of(b.PATH??b.Path??"").split(o))if(U)$.push(Y(U,J));let H=b.BUN_INSTALL?.trim();if(H)$.push(Y(H,"bin",J));if(Q)$.push(Y(Q,".bun","bin",J));let q=W.launcherDir;if(q)$.push(Y(q,"..","..","node_modules","bun","bin",J)),$.push(Y(q,"..","..","..","bun","bin",J));return $}function e(W={}){let b=W.isExecutable??A;return h(W).find((z)=>b(z))??null}function D(W={}){let b=W.isExecutable??A,z=W.bunVersionOf??n;if(P(W.env??process.env))return{bun:e(W),stale:null,unusable:null};let Q=null,J=null;for(let $ of h(W)){if(!b($))continue;let X=z($);if(X===null){J??=$;continue}if(K(X))return{bun:$,stale:Q,unusable:J};Q??={path:$,version:L(X)??X}}return{bun:null,stale:Q,unusable:J}}function p(W){return r(O(W))}function I(W){return t(O(W)).replace(/\.[cm]?[jt]s$/,"")}function W1(W=process.platform){return W==="win32"?["powershell","-NoProfile","-Command","irm bun.sh/install.ps1 | iex"]:["bash","-c","curl -fsSL https://bun.sh/install | bash"]}function R(W=F(),b=process.platform){let z=b==="win32"?'powershell -c "irm bun.sh/install.ps1 | iex"':"curl -fsSL https://bun.sh/install | bash";return[`${W}: Rove runs on the Bun runtime, and no Bun was found on this machine.`,"","Install Bun, then run this command again:",` ${z}`," npm install -g bun # any platform, if you already have npm","","Or install Bun and Rove together in one step:"," curl -fsSL https://rove.run/install.sh | sh","",`Already have Bun somewhere unusual? Point Rove at it: ${x}=/path/to/bun`,""].join(`
4
4
  `)}function w(W,b,z=F()){return[`${z}: this machine's Bun is too old for Rove — found ${b} at ${W}, need ${G} or newer.`,"","Rove's terminals are built on Bun's PTY API. An older Bun ignores it silently,","so every terminal and engine tab would open empty and stay empty.","","Upgrade Bun, then run this command again:"," bun upgrade # Bun installed itself (~/.bun)"," brew upgrade bun # Homebrew"," npm install -g bun@latest # npm-managed Bun","",`Have a newer Bun elsewhere? Point Rove at it: ${x}=/path/to/bun`,`Run on this one anyway (unsupported, terminals will be blank): ${B}=1`,""].join(`
5
5
  `)}function y(W,b=F()){return[`${b}: the Bun at ${W} could not be run — \`${W} --version\` failed or never returned.`,"","Rove skipped it rather than starting through it, which would hang or fail","with a message from that binary instead of this one.","","Reinstall Bun, then run this command again:"," curl -fsSL https://bun.sh/install | bash","",`Have a working Bun elsewhere? Point Rove at it: ${x}=/path/to/bun`,""].join(`