@sma1lboy/rove 0.9.203 → 0.9.204

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 (77) hide show
  1. package/dist/cli/{chunk-qp1c4qtg.js → chunk-055hmbbv.js} +1 -1
  2. package/dist/cli/chunk-05jej26n.js +3 -0
  3. package/dist/cli/chunk-0ks58ddm.js +4 -0
  4. package/dist/cli/{chunk-1bhs1kxj.js → chunk-0q8pcjgw.js} +1 -1
  5. package/dist/cli/{chunk-94qwnxmy.js → chunk-107fmq07.js} +1 -1
  6. package/dist/cli/{chunk-d25zh5xt.js → chunk-10r5p67t.js} +1 -1
  7. package/dist/cli/{chunk-vexwz9n0.js → chunk-153e8g4p.js} +1 -1
  8. package/dist/cli/{chunk-jz16atrn.js → chunk-1zsdsvvb.js} +1 -1
  9. package/dist/cli/{chunk-2qn635sf.js → chunk-2vtps463.js} +2 -2
  10. package/dist/cli/{chunk-6qjnrr19.js → chunk-362kcf8b.js} +1 -1
  11. package/dist/cli/{chunk-ty92vjhd.js → chunk-39ak805c.js} +1 -1
  12. package/dist/cli/{chunk-m01pfp6f.js → chunk-3aabx1rd.js} +1 -1
  13. package/dist/cli/{chunk-kdzm4eec.js → chunk-3rfqykw4.js} +1 -1
  14. package/dist/cli/{chunk-dfr8n4g5.js → chunk-46kxbsdm.js} +17 -17
  15. package/dist/cli/{chunk-9gav47zz.js → chunk-4drqykd5.js} +1 -1
  16. package/dist/cli/{chunk-z05ez321.js → chunk-5gsgv4kv.js} +1 -1
  17. package/dist/cli/{chunk-7xsarvx0.js → chunk-5p5saavr.js} +1 -1
  18. package/dist/cli/{chunk-r9vttnhs.js → chunk-633j3g6j.js} +1 -1
  19. package/dist/cli/{chunk-pr25rf3v.js → chunk-6kqbfc0n.js} +1 -1
  20. package/dist/cli/{chunk-gyjnat5t.js → chunk-6tqg80qs.js} +1 -1
  21. package/dist/cli/{chunk-rq84d4y4.js → chunk-7286gtss.js} +1 -1
  22. package/dist/cli/{chunk-e3xewvjj.js → chunk-7d54wzap.js} +1 -1
  23. package/dist/cli/{chunk-kg7gdnp5.js → chunk-8093r5r2.js} +1 -1
  24. package/dist/cli/{chunk-22xpja6c.js → chunk-8bbmdkz8.js} +1 -1
  25. package/dist/cli/{chunk-b2xm6bkc.js → chunk-8kpxyqjx.js} +1 -1
  26. package/dist/cli/{chunk-xvk5ezrv.js → chunk-8nw96qrm.js} +1 -1
  27. package/dist/cli/{chunk-s6s1jbha.js → chunk-8zerm1yt.js} +2 -2
  28. package/dist/cli/{chunk-7jdg0f6m.js → chunk-9fc0j6ng.js} +1 -1
  29. package/dist/cli/{chunk-9ehq34zz.js → chunk-a77djvch.js} +1 -1
  30. package/dist/cli/{chunk-nkmp8a0n.js → chunk-ab5h3yxn.js} +1 -1
  31. package/dist/cli/{chunk-kphxy9dk.js → chunk-aep7gvh4.js} +2 -2
  32. package/dist/cli/{chunk-1a7a84p1.js → chunk-agw0gz3e.js} +1 -1
  33. package/dist/cli/{chunk-5y78ectn.js → chunk-aydz15es.js} +1 -1
  34. package/dist/cli/{chunk-anbg32vr.js → chunk-b71td6yh.js} +2 -2
  35. package/dist/cli/{chunk-3573ad7s.js → chunk-ba0ygf1w.js} +1 -1
  36. package/dist/cli/{chunk-z51wbt8g.js → chunk-bea5j9gq.js} +2 -2
  37. package/dist/cli/chunk-bq9shn2d.js +4 -0
  38. package/dist/cli/{chunk-x58ps43j.js → chunk-c1qt6xpr.js} +1 -1
  39. package/dist/cli/{chunk-e3132x9e.js → chunk-cc66fxva.js} +1 -1
  40. package/dist/cli/{chunk-n5sn2593.js → chunk-cckrwr2v.js} +1 -1
  41. package/dist/cli/{chunk-11tmmmgd.js → chunk-ch7sta42.js} +1 -1
  42. package/dist/cli/{chunk-e7zezjyz.js → chunk-d7csztr7.js} +1 -1
  43. package/dist/cli/{chunk-fqzjcvmm.js → chunk-fgn4qk9p.js} +1 -1
  44. package/dist/cli/{chunk-yrjcc4fx.js → chunk-fst31ad0.js} +1 -1
  45. package/dist/cli/{chunk-cag7vr4x.js → chunk-gmy7cw0c.js} +1 -1
  46. package/dist/cli/{chunk-57c6qpsz.js → chunk-h3y0npdb.js} +1 -1
  47. package/dist/cli/{chunk-ftdf4c2r.js → chunk-hagvh4x1.js} +1 -1
  48. package/dist/cli/{chunk-kw6kph35.js → chunk-kr5xvfjf.js} +1 -1
  49. package/dist/cli/{chunk-weqp6z1v.js → chunk-me2vvqpe.js} +1 -1
  50. package/dist/cli/{chunk-5bhb6crg.js → chunk-mkc6rmcn.js} +1 -1
  51. package/dist/cli/{chunk-68fn783r.js → chunk-p08g04w4.js} +1 -1
  52. package/dist/cli/{chunk-nacf66kr.js → chunk-p9es0m6n.js} +2 -2
  53. package/dist/cli/{chunk-9rztj9fk.js → chunk-pe3sfy2w.js} +3 -3
  54. package/dist/cli/{chunk-gbrpfsdn.js → chunk-ps4xfv9k.js} +1 -1
  55. package/dist/cli/{chunk-g5r45hbw.js → chunk-qm3x7d6f.js} +1 -1
  56. package/dist/cli/{chunk-appj4ar3.js → chunk-qr1qj8pb.js} +1 -1
  57. package/dist/cli/{chunk-v2ys7wcy.js → chunk-qyh2sf97.js} +1 -1
  58. package/dist/cli/{chunk-wf030dcz.js → chunk-r1sh08tf.js} +1 -1
  59. package/dist/cli/{chunk-sw41m5ts.js → chunk-rxpbxrqp.js} +1 -1
  60. package/dist/cli/{chunk-5w3qsfd2.js → chunk-sd7xdnr0.js} +1 -1
  61. package/dist/cli/{chunk-bfgzzft3.js → chunk-thrvgwbk.js} +1 -1
  62. package/dist/cli/{chunk-et88q83v.js → chunk-tm7sb32d.js} +1 -1
  63. package/dist/cli/{chunk-136w8tj5.js → chunk-v3sapafp.js} +1 -1
  64. package/dist/cli/{chunk-zrdh2rsy.js → chunk-v8e24gbf.js} +1 -1
  65. package/dist/cli/{chunk-ztm0sgc4.js → chunk-wahj6696.js} +2 -2
  66. package/dist/cli/{chunk-fj755cwc.js → chunk-xa1rtnhk.js} +1 -1
  67. package/dist/cli/{chunk-kw0t6qq6.js → chunk-xcxgac4t.js} +2 -2
  68. package/dist/cli/{chunk-8q4xmd10.js → chunk-xd9kw4hh.js} +1 -1
  69. package/dist/cli/index.js +3 -3
  70. package/dist/cli/kobe.js +1 -1
  71. package/dist/cli/rove.js +1 -1
  72. package/dist/skills/rove/SKILL.md +1 -1
  73. package/dist/skills/rove/references/api-flags.md +3 -3
  74. package/package.json +1 -1
  75. package/dist/cli/chunk-gtxjrp9g.js +0 -4
  76. package/dist/cli/chunk-h2m7em1e.js +0 -3
  77. package/dist/cli/chunk-rkvd45mg.js +0 -4
@@ -1,37 +1,37 @@
1
1
  // @bun
2
- import{CONTRIB_ENGINE_IDS,contribEngineEntry,defaultDetectDeps,detectClaudeAccount,detectCodexAccount,detectCopilotAccount,detectKimiAccount,hasStringDeep,isContribEngine,isRecord,pluginEngineIds,probeBinary}from"./chunk-rkvd45mg.js";import{TomlError,parse}from"./chunk-w7zv47mp.js";import{spawnCapture}from"./chunk-khj0apc7.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{ClaudeHookAdapter,GATED_TOOL_VERBS,JsonHookAdapter,hookCommandQuoting,isObject,kobeHookInvocation,readSharedConfigSync,updateSharedJsonSync}from"./chunk-wf030dcz.js";import{bobAuthSecretsPath,claudeGlobalConfigPath,copilotConfigPath,isJsonlLineWithinBound,readFirstLineBounded,readTextFileBounded,readTextFileIfRegular,vendorAgentDir,vendorConfigHome,vendorWriteHomeDeps}from"./chunk-kphxy9dk.js";import{quoteShellArgv}from"./chunk-7kysxgbq.js";import{BUILTIN_VENDORS,isBuiltinVendor}from"./chunk-h2m7em1e.js";import{samePath}from"./chunk-f10n6063.js";var BOB_TOKEN_KEYS=["access_token","refresh_token","accessToken","refreshToken","id_token"];async function detectBobAccount(deps=defaultDetectDeps){let binary=await probeBinary(()=>deps.findBobBinary()),key=deps.env("BOB_API_KEY")??deps.env("BOBSHELL_API_KEY");if(typeof key==="string"&&key.trim().length>0)return{binary,account:{kind:"apikey"}};let secretsPath=bobAuthSecretsPath(deps.env,deps.home()),raw;try{raw=deps.readFile(secretsPath)}catch(err){return{binary,account:{kind:"none"},accountError:`read ${secretsPath}: ${errorMessage(err)}`}}if(raw===null)return{binary,account:{kind:"none"}};let parsed;try{parsed=JSON.parse(raw)}catch(err){return{binary,account:{kind:"none"},accountError:`parse ${secretsPath}: ${errorMessage(err)}`}}if(!isRecord(parsed))return{binary,account:{kind:"none"}};for(let value of Object.values(parsed)){let record=typeof value==="string"?parseJsonRecord(value):value;if(hasStringDeep(record,BOB_TOKEN_KEYS))return{binary,account:{kind:"oauth"}}}return{binary,account:{kind:"none"}}}function parseJsonRecord(text){try{return JSON.parse(text)}catch{return null}}var BOB_SCREEN_MANIFEST={rules:[{state:"blocked",any:["do you trust this folder?"]},{state:"blocked",all:["trust this folder","don't trust"]},{state:"blocked",all:["approve once"],any:["reject","approve for task","always allow command"]},{state:"blocked",all:["enter to resume","esc to close"]},{state:"blocked",all:["mcp server authentication"]},{state:"blocked",any:["press ctrl+c again to exit"]}]};import{mkdirSync,readFileSync,writeFileSync}from"fs";import{homedir}from"os";import path from"path";var TRUST_STORE_VERSION=1,TRUST_FOLDER="TRUST_FOLDER";function bobTrustStorePath(home=homedir()){return path.join(home,".bob","trustedFolders.json")}function readStore(file){let parsed;try{parsed=JSON.parse(readFileSync(file,"utf8"))}catch{return{version:TRUST_STORE_VERSION,folders:{}}}if(typeof parsed!=="object"||parsed===null||Array.isArray(parsed))return{version:TRUST_STORE_VERSION,folders:{}};let record=parsed,folders=typeof record.folders==="object"&&record.folders!==null&&!Array.isArray(record.folders)?{...record.folders}:{};return{version:typeof record.version==="number"?record.version:TRUST_STORE_VERSION,folders}}function trustBobWorktree(worktreePath,home){let file=bobTrustStorePath(home),store=readStore(file);if(store.folders[worktreePath]===TRUST_FOLDER)return;store.folders[worktreePath]=TRUST_FOLDER,mkdirSync(path.dirname(file),{recursive:!0,mode:448}),writeFileSync(file,JSON.stringify(store,null,2),{mode:384})}var claudeCapabilities={interruptSequence:"\x1B"},claudeIdentity={shortName:"Claude"};import{homedir as homedir2,userInfo}from"os";import path2 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(path2.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:homedir2(),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-0ks58ddm.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-r1sh08tf.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={preparePromptSubmission:(prompt)=>{return/^[\/!]/.test(prompt.trimStart())?prompt:`${prompt} `},beforePromptSubmit:"\x1B[F",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
- `)){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 path3 from"path";var defaultHistoryDeps={sessionsDir:()=>path3.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(`
6
- `)){if(!isJsonlLineWithinBound(line))return"";if(!line.trim())continue;try{let record=JSON.parse(line);if(typeof record!=="object"||record===null||!("type"in record)||record.type!=="session_meta")return"";if(!("payload"in record)||typeof record.payload!=="object"||record.payload===null)return"";return"cwd"in record.payload&&typeof record.payload.cwd==="string"?record.payload.cwd:""}catch{return""}}return""}class RolloutCatalog{root;deps;directories=new Map;metadata=new Map;located=new Map;refreshing;constructor(root,deps){this.root=root;this.deps=deps}async names(dir){let stamp=await this.deps.stat(dir).catch(()=>null),hit=this.directories.get(dir);if(!stamp)return this.directories.delete(dir),[];if(stamp?.ctimeMs!==void 0&&hit&&sameStamp(hit.stamp,stamp))return hit.names;let names;try{names=(await this.deps.readdir(dir)).sort().reverse()}catch{return hit?.names??[]}if(stamp)this.directories.set(dir,{stamp,names});return names}async*files(){let visited=new Set([this.root]);for(let year of await this.names(this.root)){if(!/^\d{4}$/.test(year))continue;let yp=path3.join(this.root,year);visited.add(yp);for(let month of await this.names(yp)){if(!/^(0[1-9]|1[0-2])$/.test(month))continue;let mp=path3.join(yp,month);visited.add(mp);for(let day of await this.names(mp)){if(!/^(0[1-9]|[12]\d|3[01])$/.test(day))continue;let dp=path3.join(mp,day);visited.add(dp);for(let name of await this.names(dp))if(name.startsWith("rollout-")&&name.endsWith(".jsonl"))yield path3.join(dp,name)}}}for(let dir of this.directories.keys())if(!visited.has(dir))this.directories.delete(dir)}async locate(sessionId){if(!FULL_UUID.test(sessionId))return;let id=sessionId.toLowerCase(),hit=this.located.get(id);if(hit&&await this.isFile(hit))return hit;this.located.delete(id);for await(let file of this.files()){if(path3.basename(file).match(UUID_AT_END)?.[1]?.toLowerCase()!==id||!await this.isFile(file))continue;if(this.located.size>=256){let oldest=this.located.keys().next().value;if(oldest!==void 0)this.located.delete(oldest)}return this.located.set(id,file),file}return}async isFile(file){let info=await this.deps.stat(file).catch(()=>null);return info!==null&&(info.isFile?.()??!0)}sessions(){if(!this.refreshing)this.refreshing=this.refresh().finally(()=>{this.refreshing=void 0});return this.refreshing}async refresh(){let next=new Map,files=[];for await(let file of this.files())files.push(file);let cursor=0,readNext=async()=>{while(cursor<files.length){let file=files[cursor++];if(file===void 0)break;let stamp=await this.deps.stat(file).catch(()=>null);if(!stamp)continue;let hit=this.metadata.get(file);if(hit&&sameStamp(hit.stamp,stamp)){next.set(file,hit);continue}let raw=await(this.deps.readHead??this.deps.readFile)(file).catch(()=>""),cwd=rolloutCwd(raw),sessionId=path3.basename(file).match(UUID_AT_END)?.[1];if(cwd&&sessionId)next.set(file,{path:file,sessionId,cwd,stamp})}};return await Promise.all(Array.from({length:Math.min(IO_CONCURRENCY,files.length)},readNext)),this.metadata=next,files.flatMap((file)=>{let entry=next.get(file);return entry?[entry]:[]})}}var catalogs=new WeakMap;function catalog(deps){let root=deps.sessionsDir(),current=catalogs.get(deps);if(!current||current.root!==root)current=new RolloutCatalog(root,deps),catalogs.set(deps,current);return current}async function listRolloutFiles(deps=defaultHistoryDeps){let files=[];for await(let file of catalog(deps).files())files.push(file);return files}function findRolloutFile(sessionId,deps=defaultHistoryDeps){return catalog(deps).locate(sessionId)}async function listSessionIdsForWorktree(worktree,deps=defaultHistoryDeps){if(!worktree)return[];return(await catalog(deps).sessions()).filter((file)=>samePath(file.cwd,worktree)).map((file)=>file.sessionId).reverse()}async function findLatestRolloutForWorktree(worktree,deps=defaultHistoryDeps){if(!worktree)return null;let best=null;for(let file of await catalog(deps).sessions())if(samePath(file.cwd,worktree)&&(!best||file.stamp.mtimeMs>best.mtimeMs))best={path:file.path,mtimeMs:file.stamp.mtimeMs};return best}async function latestTranscriptMtimeForWorktree(worktree,deps=defaultHistoryDeps){return(await findLatestRolloutForWorktree(worktree,deps))?.mtimeMs??0}async function readHistory(sessionId,deps=defaultHistoryDeps){return(await readHistoryWithMetrics(sessionId,deps)).messages}async function readHistoryWithMetrics(sessionId,deps=defaultHistoryDeps){let file=await findRolloutFile(sessionId,deps);if(!file)return{messages:[]};let raw;try{raw=await deps.readFile(file)}catch{return{messages:[]}}return parseRolloutRaw(file,raw,sessionId)}var MAX_ROLLOUTS_SCANNED=5;function windowLabel2(minutes){if(minutes%1440===0)return`${minutes/1440}d`;if(minutes%60===0)return`${minutes/60}h`;return`${minutes}m`}function toWindow(kind,raw,nowMs){if(!raw||typeof raw.used_percent!=="number"||typeof raw.window_minutes!=="number")return null;let resetsAt=typeof raw.resets_at==="number"&&raw.resets_at>0?raw.resets_at*1000:null;if(resetsAt==null||resetsAt<=nowMs)return null;return{kind,label:windowLabel2(raw.window_minutes),percent:Math.min(100,Math.max(0,Math.round(raw.used_percent))),resetsAt}}function usageFromRolloutRaw(raw,nowMs){let lines=raw.split(`
7
- `);for(let i=lines.length-1;i>=0;i--){let line=lines[i];if(!line||!isJsonlLineWithinBound(line)||!line.includes('"rate_limits"'))continue;let limits;try{limits=JSON.parse(line).payload?.rate_limits}catch{continue}if(!limits)continue;let windows=[toWindow("primary",limits.primary,nowMs),toWindow("secondary",limits.secondary,nowMs)].filter((w)=>w!=null);if(windows.length)return{windows,capturedAt:nowMs}}return null}async function fetchCodexQuotaUsage(now=Date.now,deps=defaultHistoryDeps){try{let files=(await listRolloutFiles(deps)).slice(0,MAX_ROLLOUTS_SCANNED);for(let file of files){let usage=usageFromRolloutRaw(await deps.readFile(file),now());if(usage)return usage}}catch{}return null}var CODEX_THREAD_ID=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function codexSessionIdFromTitle(title){let trimmed=title.trim();return CODEX_THREAD_ID.test(trimmed)?trimmed.toLowerCase():null}import{appendFileSync,closeSync,mkdirSync as mkdirSync2,openSync,unlinkSync,writeFileSync as writeFileSync2}from"fs";import path4 from"path";var TRUST_LINE='trust_level = "trusted"',LOCK_NAME="config.toml.rove.lock",LOCK_TIMEOUT_MS=5000,LOCK_POLL_MS=10,MAX_DUPLICATE_REPAIRS=5;function trustCodexWorktree(worktreePath,home){let dir=vendorConfigHome("codex",vendorWriteHomeDeps(home)),file=path4.join(dir,"config.toml"),header=`[projects.${JSON.stringify(worktreePath)}]`;mkdirSync2(dir,{recursive:!0}),withConfigLock(path4.join(dir,LOCK_NAME),()=>{let before=readSharedConfigSync(file)??"",{text,doc}=parseTrustConfig(before),exists=isObject(doc.projects)&&Object.hasOwn(doc.projects,worktreePath),lead=text.length>0&&!text.endsWith(`
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(`
6
+ `)){if(!isJsonlLineWithinBound(line))return"";if(!line.trim())continue;try{let record=JSON.parse(line);if(typeof record!=="object"||record===null||!("type"in record)||record.type!=="session_meta")return"";if(!("payload"in record)||typeof record.payload!=="object"||record.payload===null)return"";return"cwd"in record.payload&&typeof record.payload.cwd==="string"?record.payload.cwd:""}catch{return""}}return""}class RolloutCatalog{root;deps;directories=new Map;metadata=new Map;located=new Map;refreshing;constructor(root,deps){this.root=root;this.deps=deps}async names(dir){let stamp=await this.deps.stat(dir).catch(()=>null),hit=this.directories.get(dir);if(!stamp)return this.directories.delete(dir),[];if(stamp?.ctimeMs!==void 0&&hit&&sameStamp(hit.stamp,stamp))return hit.names;let names;try{names=(await this.deps.readdir(dir)).sort().reverse()}catch{return hit?.names??[]}if(stamp)this.directories.set(dir,{stamp,names});return names}async*files(){let visited=new Set([this.root]);for(let year of await this.names(this.root)){if(!/^\d{4}$/.test(year))continue;let yp=path2.join(this.root,year);visited.add(yp);for(let month of await this.names(yp)){if(!/^(0[1-9]|1[0-2])$/.test(month))continue;let mp=path2.join(yp,month);visited.add(mp);for(let day of await this.names(mp)){if(!/^(0[1-9]|[12]\d|3[01])$/.test(day))continue;let dp=path2.join(mp,day);visited.add(dp);for(let name of await this.names(dp))if(name.startsWith("rollout-")&&name.endsWith(".jsonl"))yield path2.join(dp,name)}}}for(let dir of this.directories.keys())if(!visited.has(dir))this.directories.delete(dir)}async locate(sessionId){if(!FULL_UUID.test(sessionId))return;let id=sessionId.toLowerCase(),hit=this.located.get(id);if(hit&&await this.isFile(hit))return hit;this.located.delete(id);for await(let file of this.files()){if(path2.basename(file).match(UUID_AT_END)?.[1]?.toLowerCase()!==id||!await this.isFile(file))continue;if(this.located.size>=256){let oldest=this.located.keys().next().value;if(oldest!==void 0)this.located.delete(oldest)}return this.located.set(id,file),file}return}async isFile(file){let info=await this.deps.stat(file).catch(()=>null);return info!==null&&(info.isFile?.()??!0)}sessions(){if(!this.refreshing)this.refreshing=this.refresh().finally(()=>{this.refreshing=void 0});return this.refreshing}async refresh(){let next=new Map,files=[];for await(let file of this.files())files.push(file);let cursor=0,readNext=async()=>{while(cursor<files.length){let file=files[cursor++];if(file===void 0)break;let stamp=await this.deps.stat(file).catch(()=>null);if(!stamp)continue;let hit=this.metadata.get(file);if(hit&&sameStamp(hit.stamp,stamp)){next.set(file,hit);continue}let raw=await(this.deps.readHead??this.deps.readFile)(file).catch(()=>""),cwd=rolloutCwd(raw),sessionId=path2.basename(file).match(UUID_AT_END)?.[1];if(cwd&&sessionId)next.set(file,{path:file,sessionId,cwd,stamp})}};return await Promise.all(Array.from({length:Math.min(IO_CONCURRENCY,files.length)},readNext)),this.metadata=next,files.flatMap((file)=>{let entry=next.get(file);return entry?[entry]:[]})}}var catalogs=new WeakMap;function catalog(deps){let root=deps.sessionsDir(),current=catalogs.get(deps);if(!current||current.root!==root)current=new RolloutCatalog(root,deps),catalogs.set(deps,current);return current}async function listRolloutFiles(deps=defaultHistoryDeps){let files=[];for await(let file of catalog(deps).files())files.push(file);return files}function findRolloutFile(sessionId,deps=defaultHistoryDeps){return catalog(deps).locate(sessionId)}async function listSessionIdsForWorktree(worktree,deps=defaultHistoryDeps){if(!worktree)return[];return(await catalog(deps).sessions()).filter((file)=>samePath(file.cwd,worktree)).map((file)=>file.sessionId).reverse()}async function findLatestRolloutForWorktree(worktree,deps=defaultHistoryDeps){if(!worktree)return null;let best=null;for(let file of await catalog(deps).sessions())if(samePath(file.cwd,worktree)&&(!best||file.stamp.mtimeMs>best.mtimeMs))best={path:file.path,mtimeMs:file.stamp.mtimeMs};return best}async function latestTranscriptMtimeForWorktree(worktree,deps=defaultHistoryDeps){return(await findLatestRolloutForWorktree(worktree,deps))?.mtimeMs??0}async function readHistory(sessionId,deps=defaultHistoryDeps){return(await readHistoryWithMetrics(sessionId,deps)).messages}async function readHistoryWithMetrics(sessionId,deps=defaultHistoryDeps){let file=await findRolloutFile(sessionId,deps);if(!file)return{messages:[]};let raw;try{raw=await deps.readFile(file)}catch{return{messages:[]}}return parseRolloutRaw(file,raw,sessionId)}var MAX_ROLLOUTS_SCANNED=5;function windowLabel2(minutes){if(minutes%1440===0)return`${minutes/1440}d`;if(minutes%60===0)return`${minutes/60}h`;return`${minutes}m`}function toWindow(kind,raw,nowMs){if(!raw||typeof raw.used_percent!=="number"||typeof raw.window_minutes!=="number")return null;let resetsAt=typeof raw.resets_at==="number"&&raw.resets_at>0?raw.resets_at*1000:null;if(resetsAt==null||resetsAt<=nowMs)return null;return{kind,label:windowLabel2(raw.window_minutes),percent:Math.min(100,Math.max(0,Math.round(raw.used_percent))),resetsAt}}function usageFromRolloutRaw(raw,nowMs){let lines=raw.split(`
7
+ `);for(let i=lines.length-1;i>=0;i--){let line=lines[i];if(!line||!isJsonlLineWithinBound(line)||!line.includes('"rate_limits"'))continue;let limits;try{limits=JSON.parse(line).payload?.rate_limits}catch{continue}if(!limits)continue;let windows=[toWindow("primary",limits.primary,nowMs),toWindow("secondary",limits.secondary,nowMs)].filter((w)=>w!=null);if(windows.length)return{windows,capturedAt:nowMs}}return null}async function fetchCodexQuotaUsage(now=Date.now,deps=defaultHistoryDeps){try{let files=(await listRolloutFiles(deps)).slice(0,MAX_ROLLOUTS_SCANNED);for(let file of files){let usage=usageFromRolloutRaw(await deps.readFile(file),now());if(usage)return usage}}catch{}return null}var CODEX_THREAD_ID=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function codexSessionIdFromTitle(title){let trimmed=title.trim();return CODEX_THREAD_ID.test(trimmed)?trimmed.toLowerCase():null}import{appendFileSync,closeSync,mkdirSync,openSync,unlinkSync,writeFileSync}from"fs";import path3 from"path";var TRUST_LINE='trust_level = "trusted"',LOCK_NAME="config.toml.rove.lock",LOCK_TIMEOUT_MS=5000,LOCK_POLL_MS=10,MAX_DUPLICATE_REPAIRS=5;function trustCodexWorktree(worktreePath,home){let dir=vendorConfigHome("codex",vendorWriteHomeDeps(home)),file=path3.join(dir,"config.toml"),header=`[projects.${JSON.stringify(worktreePath)}]`;mkdirSync(dir,{recursive:!0}),withConfigLock(path3.join(dir,LOCK_NAME),()=>{let before=readSharedConfigSync(file)??"",{text,doc}=parseTrustConfig(before),exists=isObject(doc.projects)&&Object.hasOwn(doc.projects,worktreePath),lead=text.length>0&&!text.endsWith(`
8
8
  `)?`
9
9
  `:"",addition=exists?"":`${lead}
10
10
  ${header}
11
11
  ${TRUST_LINE}
12
- `;try{parse(text+addition)}catch{throw Error("Cannot add Codex trust without changing existing TOML")}if(text!==before)writeFileSync2(file,text+addition,{mode:384});else if(addition)appendFileSync(file,addition,{mode:384})})}function parseTrustConfig(original){let text=original;for(let repairs=0;;repairs++)try{return{text,doc:parse(text)}}catch(error){if(!(error instanceof TomlError)||repairs>=MAX_DUPLICATE_REPAIRS)break;let lines=text.split(`
12
+ `;try{parse(text+addition)}catch{throw Error("Cannot add Codex trust without changing existing TOML")}if(text!==before)writeFileSync(file,text+addition,{mode:384});else if(addition)appendFileSync(file,addition,{mode:384})})}function parseTrustConfig(original){let text=original;for(let repairs=0;;repairs++)try{return{text,doc:parse(text)}}catch(error){if(!(error instanceof TomlError)||repairs>=MAX_DUPLICATE_REPAIRS)break;let lines=text.split(`
13
13
  `),index=error.line-1,header=lines[index];if(!header||!/^\[projects\."(?:[^"\\]|\\.)*"\]$/.test(header)||lines[index+1]!==TRUST_LINE)break;let next=index+2;while(next<lines.length&&lines[next].trim()==="")next++;if(next<lines.length&&!lines[next].startsWith("["))break;try{let prior=parse(lines.slice(0,index).join(`
14
14
  `)),duplicate=parse(`${header}
15
15
  ${TRUST_LINE}`);if(!isObject(prior.projects)||!isObject(duplicate.projects))break;let project=Object.keys(duplicate.projects)[0];if(!project||!Object.hasOwn(prior.projects,project))break;let trusted=prior.projects[project];if(!isObject(trusted)||Object.keys(trusted).length!==1||trusted.trust_level!=="trusted")break}catch{break}lines.splice(index,2),text=lines.join(`
16
- `)}throw Error("Codex trust config is invalid; leaving it unchanged")}function withConfigLock(lockPath,fn){let fd,deadline=Date.now()+LOCK_TIMEOUT_MS,sleeper=new Int32Array(new SharedArrayBuffer(4));for(;;)try{fd=openSync(lockPath,"wx");break}catch(error){if(!(error instanceof Error&&("code"in error)&&error.code==="EEXIST"))throw error;if(Date.now()>=deadline)throw Error("Timed out waiting for Codex config lock");Atomics.wait(sleeper,0,0,LOCK_POLL_MS)}try{writeFileSync2(fd,String(process.pid)),fn()}finally{closeSync(fd);try{unlinkSync(lockPath)}catch{}}}function isObject5(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function num2(v){return typeof v==="number"&&Number.isFinite(v)?v:0}function parseCodexTurns(raw,fallbackSessionId=""){let out=[],drafts=new Map,sessionId=fallbackSessionId,openTurnId="";for(let line of raw.split(`
17
- `)){let trimmed=line.trim();if(!trimmed||!isJsonlLineWithinBound(trimmed))continue;let record;try{record=JSON.parse(trimmed)}catch{continue}if(!isObject5(record))continue;let payload=isObject5(record.payload)?record.payload:void 0;if(!payload)continue;let at=typeof record.timestamp==="string"?Date.parse(record.timestamp):Number.NaN;if(record.type==="session_meta"){let id=payload.session_id??payload.id;if(typeof id==="string"&&id)sessionId=id;continue}if(record.type==="turn_context"){let turnId2=typeof payload.turn_id==="string"?payload.turn_id:"",model=typeof payload.model==="string"?payload.model:"";if(!turnId2||!model)continue;let draft2=drafts.get(turnId2);if(draft2)draft2.model=model;else drafts.set(turnId2,{...emptyDraft(turnId2,Number.NaN),model});continue}if(record.type!=="event_msg")continue;if(payload.type==="task_started"){let turnId2=typeof payload.turn_id==="string"?payload.turn_id:"";if(!turnId2)continue;let model=drafts.get(turnId2)?.model,startedAt=Number.isFinite(at)?at:num2(payload.started_at)*1000;drafts.set(turnId2,{...emptyDraft(turnId2,startedAt),...model?{model}:{},...typeof payload.model_context_window==="number"?{contextWindow:payload.model_context_window}:{}}),openTurnId=turnId2;continue}if(payload.type==="token_count"){let draft2=drafts.get(openTurnId);if(!draft2)continue;let info=isObject5(payload.info)?payload.info:void 0,last=info&&isObject5(info.last_token_usage)?info.last_token_usage:void 0;if(!last)continue;if(draft2.input+=num2(last.input_tokens),draft2.cachedInput+=num2(last.cached_input_tokens),draft2.output+=num2(last.output_tokens),draft2.sawUsage=!0,draft2.contextWindow===void 0&&typeof info?.model_context_window==="number")draft2.contextWindow=info.model_context_window;continue}if(payload.type!=="task_complete")continue;let turnId=typeof payload.turn_id==="string"?payload.turn_id:"",draft=turnId?drafts.get(turnId):void 0;if(!draft||!Number.isFinite(draft.startedAt))continue;if(drafts.delete(turnId),openTurnId===turnId)openTurnId="";let endedAt=Number.isFinite(at)?at:num2(payload.completed_at)*1000,usage=draft.sawUsage?codexUsageToSnapshot({input_tokens:draft.input,cached_input_tokens:draft.cachedInput,output_tokens:draft.output},draft.contextWindow!==void 0?{contextWindowTokens:draft.contextWindow}:{}):void 0;out.push({id:draft.turnId,sessionId,...draft.model?{model:draft.model}:{},startedAt:draft.startedAt,endedAt,...usage?{usage}:{}})}return out}function emptyDraft(turnId,startedAt){return{turnId,startedAt,input:0,cachedInput:0,output:0,sawUsage:!1}}async function readCodexTurns(transcriptPath){try{let raw=await readTextFileBounded(transcriptPath);return parseCodexTurns(raw)}catch{return[]}}var COPILOT_SCREEN_MANIFEST={rules:[{state:"blocked",any:["enter to select","enter to confirm","enter to submit","enter accept"],all:["esc"]},{state:"working",any:["esc to cancel","esc cancel","esc again to cancel","esc interrupt"]}]};import{homedir as homedir3}from"os";function splitJsoncHeader(raw){let lines=raw.split(`
16
+ `)}throw Error("Codex trust config is invalid; leaving it unchanged")}function withConfigLock(lockPath,fn){let fd,deadline=Date.now()+LOCK_TIMEOUT_MS,sleeper=new Int32Array(new SharedArrayBuffer(4));for(;;)try{fd=openSync(lockPath,"wx");break}catch(error){if(!(error instanceof Error&&("code"in error)&&error.code==="EEXIST"))throw error;if(Date.now()>=deadline)throw Error("Timed out waiting for Codex config lock");Atomics.wait(sleeper,0,0,LOCK_POLL_MS)}try{writeFileSync(fd,String(process.pid)),fn()}finally{closeSync(fd);try{unlinkSync(lockPath)}catch{}}}function isObject5(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function num2(v){return typeof v==="number"&&Number.isFinite(v)?v:0}function parseCodexTurns(raw,fallbackSessionId=""){let out=[],drafts=new Map,sessionId=fallbackSessionId,openTurnId="";for(let line of raw.split(`
17
+ `)){let trimmed=line.trim();if(!trimmed||!isJsonlLineWithinBound(trimmed))continue;let record;try{record=JSON.parse(trimmed)}catch{continue}if(!isObject5(record))continue;let payload=isObject5(record.payload)?record.payload:void 0;if(!payload)continue;let at=typeof record.timestamp==="string"?Date.parse(record.timestamp):Number.NaN;if(record.type==="session_meta"){let id=payload.session_id??payload.id;if(typeof id==="string"&&id)sessionId=id;continue}if(record.type==="turn_context"){let turnId2=typeof payload.turn_id==="string"?payload.turn_id:"",model=typeof payload.model==="string"?payload.model:"";if(!turnId2||!model)continue;let draft2=drafts.get(turnId2);if(draft2)draft2.model=model;else drafts.set(turnId2,{...emptyDraft(turnId2,Number.NaN),model});continue}if(record.type!=="event_msg")continue;if(payload.type==="task_started"){let turnId2=typeof payload.turn_id==="string"?payload.turn_id:"";if(!turnId2)continue;let model=drafts.get(turnId2)?.model,startedAt=Number.isFinite(at)?at:num2(payload.started_at)*1000;drafts.set(turnId2,{...emptyDraft(turnId2,startedAt),...model?{model}:{},...typeof payload.model_context_window==="number"?{contextWindow:payload.model_context_window}:{}}),openTurnId=turnId2;continue}if(payload.type==="token_count"){let draft2=drafts.get(openTurnId);if(!draft2)continue;let info=isObject5(payload.info)?payload.info:void 0,last=info&&isObject5(info.last_token_usage)?info.last_token_usage:void 0;if(!last)continue;if(draft2.input+=num2(last.input_tokens),draft2.cachedInput+=num2(last.cached_input_tokens),draft2.output+=num2(last.output_tokens),draft2.sawUsage=!0,draft2.contextWindow===void 0&&typeof info?.model_context_window==="number")draft2.contextWindow=info.model_context_window;continue}if(payload.type!=="task_complete")continue;let turnId=typeof payload.turn_id==="string"?payload.turn_id:"",draft=turnId?drafts.get(turnId):void 0;if(!draft||!Number.isFinite(draft.startedAt))continue;if(drafts.delete(turnId),openTurnId===turnId)openTurnId="";let endedAt=Number.isFinite(at)?at:num2(payload.completed_at)*1000,usage=draft.sawUsage?codexUsageToSnapshot({input_tokens:draft.input,cached_input_tokens:draft.cachedInput,output_tokens:draft.output},draft.contextWindow!==void 0?{contextWindowTokens:draft.contextWindow}:{}):void 0;out.push({id:draft.turnId,sessionId,...draft.model?{model:draft.model}:{},startedAt:draft.startedAt,endedAt,...usage?{usage}:{}})}return out}function emptyDraft(turnId,startedAt){return{turnId,startedAt,input:0,cachedInput:0,output:0,sawUsage:!1}}async function readCodexTurns(transcriptPath){try{let raw=await readTextFileBounded(transcriptPath);return parseCodexTurns(raw)}catch{return[]}}var COPILOT_SCREEN_MANIFEST={rules:[{state:"blocked",any:["enter to select","enter to confirm","enter to submit","enter accept"],all:["esc"]},{state:"working",any:["esc to cancel","esc cancel","esc again to cancel","esc interrupt"]}]};import{homedir as homedir2}from"os";function splitJsoncHeader(raw){let lines=raw.split(`
18
18
  `),i=0;while(i<lines.length&&(lines[i].trim().startsWith("//")||lines[i].trim()===""))i++;return{header:lines.slice(0,i).join(`
19
19
  `),body:lines.slice(i).join(`
20
- `)}}function trustCopilotWorktree(worktreePath,home=homedir3()){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}
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 path9 from"path";import{appendFile,mkdir,readdir as readdir2,stat as stat2,unlink}from"fs/promises";import path5 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
- `)){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 path5.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=path5.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=path5.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=path5.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 path6 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=path6.join(deps.copilotDir(),"session-state");return(await deps.readdir(root)).map((name)=>path6.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??path6.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(path6.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=path6.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(path6.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(path6.join(dir,"workspace.yaml")).catch(()=>"");return parseWorkspaceYaml(raw)}function parseWorkspaceYaml(raw){let out={};for(let rawLine 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
+ `)){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
- `)){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 path7 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(path7.join(deps.kimiDir(),"session_index.jsonl")).catch(()=>"");return parseSessionIndex(raw)}function wirePath(sessionDir){return path7.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 homedir4,tmpdir}from"os";import path8 from"path";var defaultPiHistoryDeps={home:()=>homedir4(),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 path8.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=path8.relative(root,p);if(rel==="")return"";if(rel.startsWith("..")||path8.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=path8.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=path8.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(path8.join(root,dir))}catch{continue}let match=entries.find((entry)=>sessionIdFromFileName(entry)===sessionId);if(match)return path8.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?path9.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 homedir5}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=homedir5()){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(`
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)}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(`
29
29
  `)}function removeKimiHookBlock(content){let lines=content.split(`
30
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(`
31
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}
32
32
 
33
33
  `:""}${renderKimiHookBlock(inv,opts)}
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(path10,transform){try{let current="";try{current=await readFile(path10,"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(path10),{recursive:!0}),await writeFile(path10,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 mkdirSync3,realpathSync as realpathSync2,writeFileSync as writeFileSync3}from"fs";import path10 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=path10.basename(resolved).toLowerCase();return path10.join(vendorConfigHome("kimi",vendorWriteHomeDeps(home)),"workspace-trust",`wd_${dir}_${hash}`)}function trustKimiWorktree(worktreePath,home){let file=kimiTrustFilePath(worktreePath,home);mkdirSync3(path10.dirname(file),{recursive:!0,mode:448});try{writeFileSync3(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 path11 from"path";function renderPiExtensionSource(opts){let{vendor,invocation,toolEvents=!1}=opts,tool=toolEvents?TOOL_SECTION:"";return`/**
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
35
  * Rove activity hook \u2014 GENERATED, installed and rewritten by Rove on every
36
36
  * launch (${vendor}). Local edits are overwritten; to stop reporting, delete
37
37
  * this file or turn Rove's global hooks off.
@@ -148,8 +148,8 @@ ${tool}}
148
148
  tool_name: field(event, "toolName"),
149
149
  }),
150
150
  )
151
- `;var ACTIVITY_EXTENSION_FILE="rove-activity.ts";function piExtensionsDir(vendor,deps){return path11.join(vendorAgentDir(vendor,deps),"extensions")}function piActivityExtensionPath(vendor,deps){return path11.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=path11.dirname(path11.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(path11.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 mkdirSync4,readFileSync as readFileSync2,realpathSync as realpathSync3,writeFileSync as writeFileSync4}from"fs";import path12 from"path";function canonical(p){try{return realpathSync3(p)}catch{return p}}function piTrustPath(deps){return path12.join(vendorAgentDir("pi",deps),"trust.json")}function trustPiWorktree(worktreePath,deps){let file=piTrustPath(deps);try{let existing={};if(existsSync3(file)){let parsed=JSON.parse(readFileSync2(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,mkdirSync4(path12.dirname(file),{recursive:!0}),writeFileSync4(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=(path13)=>stat6(path13).catch(()=>null);function completionReader(deps,parse2){let cache4=new Map;return async(path13,knownMtime)=>{let info=deps.statFile?await deps.statFile(path13):null;if(deps.statFile&&!info)return null;let mtimeMs=info?.mtimeMs??knownMtime??await(deps.statMtimeMs??(async(p)=>(await statFile(p))?.mtimeMs??0))(path13);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(path13);if(mtimeMs>0&&hit?.key===key)return hit.scan;let raw;try{raw=await deps.readFile(path13)}catch{return cache4.delete(path13),null}if(raw===null)return cache4.delete(path13),null;let scan={marker:parse2(raw,path13,mtimeMs),mtimeMs};if(cache4.delete(path13),cache4.set(path13,{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(`
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(`
153
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(`
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},bob:{vendor:"bob",builtin:!0,displayName:"IBM Bob",defaultCommand:["bob","chat","--trust"],trustWorktree:trustBobWorktree,firstMessageDelivery:"paste",history:EMPTY_HISTORY,detectAccount:(deps)=>detectBobAccount(deps),createHookAdapter:()=>new NoopHookAdapter("bob"),createTurnDetector:()=>new UnknownTurnDetector("bob"),sessionIdentity:{sessionControlFlags:["-r","--resume"],resumeArgv:(base,id)=>[...base,"--resume",id]},screenManifest:BOB_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(){}}
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(){}}
155
155
  export{createEngineHookAdapter,createEngineTurnDetector,engineEntry,identifiableEngineIds,supportsStructuredHistory,engineStatusPrefixes,stripEngineStatusPrefix,engineTitleTurnHint,engineSessionIdFromTitle,isEnginePlaceholderTitle,getCapabilities,vendorsWithQuotaProbe,vendorsWithTurnReader};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{isEngineActivityKind}from"./chunk-3e5n28t6.js";import{loadPluginRegistry,readPluginManifest}from"./chunk-gtxjrp9g.js";import{connectIfRunning}from"./chunk-965jm56m.js";import{createEngineHookAdapter}from"./chunk-dfr8n4g5.js";import{flagValue}from"./chunk-jvxh93nz.js";import{getPersistedString,setPersistedString}from"./chunk-crt11rmj.js";import{ALL_VENDORS}from"./chunk-h2m7em1e.js";import{activeCliName}from"./chunk-00ehck55.js";import{readRoveEnv}from"./chunk-hq4b3fca.js";import{__require}from"./chunk-wqfp8d9w.js";import{join,resolve}from"path";var STDIN_READ_TIMEOUT_MS=500;async function readTextWithTimeout(read,timeoutMs=STDIN_READ_TIMEOUT_MS){let raceTimer;try{return await Promise.race([read(),new Promise((resolve2)=>{raceTimer=setTimeout(()=>resolve2(""),timeoutMs)})])}finally{if(raceTimer!==void 0)clearTimeout(raceTimer)}}async function readStdinPayload(){try{let text=await readTextWithTimeout(()=>Bun.stdin.text());if(!text.trim())return{};let parsed=JSON.parse(text);return parsed&&typeof parsed==="object"&&!Array.isArray(parsed)?parsed:{}}catch{return{}}}async function runHookSubcommand(argv){let[verb,...rest]=argv;if(verb==="setup"){await runHookSetup(rest);return}if(verb==="cleanup"){await runHookCleanup();return}try{if(!verb||!isEngineActivityKind(verb))return;let payload=await readStdinPayload(),payloadFlag=flagValue(rest,"--payload");if(payloadFlag)try{let extra=JSON.parse(payloadFlag);if(extra&&typeof extra==="object"&&!Array.isArray(extra))Object.assign(payload,extra)}catch{}let taskId=flagValue(rest,"--task-id"),cwd=typeof payload.cwd==="string"&&payload.cwd?payload.cwd:process.cwd(),envTaskId=process.env.KOBE_TASK_ID,envTabId=process.env.KOBE_TAB_ID,engine=flagValue(rest,"--engine"),adapters=activityHookAdapters().filter((a)=>!engine||a.vendor===engine),detail;for(let adapter of adapters)if(detail=adapter.activityDetailFromPayload(verb,payload),detail)break;let session;for(let adapter of adapters)if(session=adapter.sessionFromPayload(payload),session)break;let client=await connectIfRunning();if(!client)return;try{let effectiveTaskId=taskId??envTaskId;await client.request("engine.reportEvent",{...effectiveTaskId?{taskId:effectiveTaskId}:{cwd},kind:verb,...engine?{engine}:{},...envTabId?{tabId:envTabId}:{},...detail?{detail}:{},...session?{sessionId:session.sessionId}:{},...session?.transcriptPath?{transcriptPath:session.transcriptPath}:{}})}finally{client.close()}}catch(err){if(readRoveEnv("HOOK_DEBUG"))console.error(`[rove hook] ${verb} failed:`,err instanceof Error?err.message:String(err))}}var SYNC_SETTING_KEY="externalWorktreeSync";function worktreeSyncAdapters(){return ALL_VENDORS.map((v)=>createEngineHookAdapter(v)).filter((a)=>a.supportsWorktreeSync())}function activityHookAdapters(){return ALL_VENDORS.map((v)=>createEngineHookAdapter(v)).filter((a)=>a.supportsHooks())}function globalSettingsPath(){return worktreeSyncAdapters()[0]?.globalSettingsPath()}function persistedSyncPath(stored){if(!stored||stored==="off")return;if(stored==="global")return globalSettingsPath();if(stored.startsWith("repo:"))return join(resolve(stored.slice(5)),".claude","settings.json");return stored}async function ensureGlobalKobeHooks(){try{let{isRovePluginEnabled,detectLegacyInstalls,migrationHint}=await import("./chunk-1a7a84p1.js"),pluginMode=isRovePluginEnabled();if(pluginMode){let hint=migrationHint(detectLegacyInstalls(),activeCliName());if(hint)process.stderr.write(`
2
+ import{isEngineActivityKind}from"./chunk-3e5n28t6.js";import{loadPluginRegistry,readPluginManifest}from"./chunk-bq9shn2d.js";import{connectIfRunning}from"./chunk-965jm56m.js";import{createEngineHookAdapter}from"./chunk-46kxbsdm.js";import{flagValue}from"./chunk-jvxh93nz.js";import{getPersistedString,setPersistedString}from"./chunk-crt11rmj.js";import{ALL_VENDORS}from"./chunk-05jej26n.js";import{activeCliName}from"./chunk-00ehck55.js";import{readRoveEnv}from"./chunk-hq4b3fca.js";import{__require}from"./chunk-wqfp8d9w.js";import{join,resolve}from"path";var STDIN_READ_TIMEOUT_MS=500;async function readTextWithTimeout(read,timeoutMs=STDIN_READ_TIMEOUT_MS){let raceTimer;try{return await Promise.race([read(),new Promise((resolve2)=>{raceTimer=setTimeout(()=>resolve2(""),timeoutMs)})])}finally{if(raceTimer!==void 0)clearTimeout(raceTimer)}}async function readStdinPayload(){try{let text=await readTextWithTimeout(()=>Bun.stdin.text());if(!text.trim())return{};let parsed=JSON.parse(text);return parsed&&typeof parsed==="object"&&!Array.isArray(parsed)?parsed:{}}catch{return{}}}async function runHookSubcommand(argv){let[verb,...rest]=argv;if(verb==="setup"){await runHookSetup(rest);return}if(verb==="cleanup"){await runHookCleanup();return}try{if(!verb||!isEngineActivityKind(verb))return;let payload=await readStdinPayload(),payloadFlag=flagValue(rest,"--payload");if(payloadFlag)try{let extra=JSON.parse(payloadFlag);if(extra&&typeof extra==="object"&&!Array.isArray(extra))Object.assign(payload,extra)}catch{}let taskId=flagValue(rest,"--task-id"),cwd=typeof payload.cwd==="string"&&payload.cwd?payload.cwd:process.cwd(),envTaskId=process.env.KOBE_TASK_ID,envTabId=process.env.KOBE_TAB_ID,engine=flagValue(rest,"--engine"),adapters=activityHookAdapters().filter((a)=>!engine||a.vendor===engine),detail;for(let adapter of adapters)if(detail=adapter.activityDetailFromPayload(verb,payload),detail)break;let session;for(let adapter of adapters)if(session=adapter.sessionFromPayload(payload),session)break;let client=await connectIfRunning();if(!client)return;try{let effectiveTaskId=taskId??envTaskId;await client.request("engine.reportEvent",{...effectiveTaskId?{taskId:effectiveTaskId}:{cwd},kind:verb,...engine?{engine}:{},...envTabId?{tabId:envTabId}:{},...detail?{detail}:{},...session?{sessionId:session.sessionId}:{},...session?.transcriptPath?{transcriptPath:session.transcriptPath}:{}})}finally{client.close()}}catch(err){if(readRoveEnv("HOOK_DEBUG"))console.error(`[rove hook] ${verb} failed:`,err instanceof Error?err.message:String(err))}}var SYNC_SETTING_KEY="externalWorktreeSync";function worktreeSyncAdapters(){return ALL_VENDORS.map((v)=>createEngineHookAdapter(v)).filter((a)=>a.supportsWorktreeSync())}function activityHookAdapters(){return ALL_VENDORS.map((v)=>createEngineHookAdapter(v)).filter((a)=>a.supportsHooks())}function globalSettingsPath(){return worktreeSyncAdapters()[0]?.globalSettingsPath()}function persistedSyncPath(stored){if(!stored||stored==="off")return;if(stored==="global")return globalSettingsPath();if(stored.startsWith("repo:"))return join(resolve(stored.slice(5)),".claude","settings.json");return stored}async function ensureGlobalKobeHooks(){try{let{isRovePluginEnabled,detectLegacyInstalls,migrationHint}=await import("./chunk-agw0gz3e.js"),pluginMode=isRovePluginEnabled();if(pluginMode){let hint=migrationHint(detectLegacyInstalls(),activeCliName());if(hint)process.stderr.write(`
3
3
  ${hint}
4
4
  `)}let toolEvents=pluginsWantToolEvents();for(let a of activityHookAdapters()){if(pluginMode&&a.vendor==="claude")continue;let enginePath=a.globalSettingsPath();if(!enginePath)continue;await a.installActivityHooks(enginePath,{toolEvents}),await a.removeWorktreeWatchHook(enginePath)}await cleanupWorktreeSyncHook()}catch{}}function pluginsWantToolEvents(){try{for(let entry of loadPluginRegistry().plugins){if(!entry.enabled)continue;try{if(readPluginManifest(entry.root).manifest.events.some((e)=>e.on.startsWith("tool.")))return!0}catch{}}}catch{}return!1}async function cleanupWorktreeSyncHook(){let adapters=worktreeSyncAdapters();if(adapters.length===0)return;let stored=getPersistedString(SYNC_SETTING_KEY),paths=new Set;for(let adapter of adapters){let file=adapter.globalSettingsPath();if(file)paths.add(file)}let prev=persistedSyncPath(stored);if(prev)paths.add(prev);for(let a of adapters)for(let p of paths)await a.removeWorktreeSyncHook(p);if(stored!=="off")setPersistedString(SYNC_SETTING_KEY,"off")}async function runHookCleanup(){let claude=activityHookAdapters().find((a)=>a.vendor==="claude"),path=claude?.globalSettingsPath();if(!claude||!path){process.stdout.write(`rove hook cleanup: no Claude hook adapter \u2014 nothing to do.
5
5
  `);return}await claude.removeActivityHooks(path),await claude.removeWorktreeWatchHook(path),process.stdout.write([`rove hook cleanup: removed Rove's settings-managed hooks from ${path}.`,"Only Rove's own entries were touched; your other hooks are intact.","The Claude Code plugin's hooks.json now carries these events (if the plugin","is not installed, the next Rove launch reinstalls the settings-managed set).",""].join(`
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{deriveTitleFromPrompt}from"./chunk-xb9b93ts.js";import{TaskDeletingError}from"./chunk-ce2hj8b7.js";import{awaitEngineProcess,buildEngineSessionLaunch,deliverToHostedKey,enginePresence,ensureHostedEngine,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,killHostedSessions,listHostedSessions,openHostedSessionHost,pastePromptWhenEngineUp,trustEngineWorktree}from"./chunk-sw41m5ts.js";import{resolveLoginShell}from"./chunk-b99tf0jr.js";import{engineLaunchArgv,protocolEntry}from"./chunk-zrdh2rsy.js";import{DEFAULT_TASK_VENDOR}from"./chunk-xy8be792.js";var MAX_SESSIONS_SCANNED=8;function titleFromMessages(messages){let firstUser=messages.find((m)=>m.role==="user");if(!firstUser)return"";let text=firstUser.blocks.filter((b)=>b.type==="text").map((b)=>b.text).join(" "),title=deriveTitleFromPrompt(text);return title.length>0?Buffer.from(title,"utf8").toString("utf8"):title}async function deriveTitleFromSession(worktree,vendor=DEFAULT_TASK_VENDOR){if(!worktree)return"";let{history}=protocolEntry(vendor),ids=await history.listSessionIdsForWorktree(worktree);for(let sessionId of ids.slice(0,MAX_SESSIONS_SCANNED)){let title=titleFromMessages(await history.readHistory(sessionId));if(title)return title}return""}async function deriveTitleFromSessionId(vendor,sessionId){if(!sessionId)return"";try{return titleFromMessages(await protocolEntry(vendor).history.readHistory(sessionId))}catch{return""}}async function getTask(link,taskId){let{task}=await link.request("task.get",{taskId});return task}async function ensureTaskWorktree(link,taskId){let task=await getTask(link,taskId);if(task.deletion)throw new TaskDeletingError(taskId);if(task.worktreePath)return{task,worktreePath:task.worktreePath};let{worktreePath}=await link.request("task.ensureWorktree",{taskId});if(!worktreePath)throw Error(`task ${taskId} has no worktree`);return{task,worktreePath}}async function ensureTaskSessionAdapter(link,taskId){let{task,worktreePath}=await ensureTaskWorktree(link,taskId),launch=taskEngineLaunch(task,worktreePath,{kind:"repo-init"}),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)throw Error(`failed to start hosted engine session for ${taskId}`);if(launch.firstMessage){let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort})[0];await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs}).catch(()=>!1)}}finally{host.close()}return{session:launch.key,worktreePath}}async function startTaskSessionWithPromptAdapter(link,taskId,prompt){let{task,worktreePath}=await ensureTaskWorktree(link,taskId);await link.request("task.observeLanguage",{taskId,text:prompt}).catch(()=>{});let launch=taskEngineLaunch(task,worktreePath,{kind:"new-task",prompt}),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)return{started:!1,error:"hosted session did not open"};let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort})[0],wait={initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs};if(launch.firstMessage){if(await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}if(await awaitEngineProcess(host.rpc,launch.key,engineBin,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}finally{host.close()}}async function startFailureReason(rpc,key){let tail=await hostedSessionFailureLine(rpc,key),base="engine process never started";return tail?`engine process never started; last session output: ${tail}`:"engine process never started"}function taskEngineLaunch(task,worktreePath,promptIntent){return trustEngineWorktree(task.vendor,worktreePath),buildEngineSessionLaunch({task:{id:task.id,kind:task.kind,vendor:task.vendor,repo:task.repo},worktreePath,shell:resolveLoginShell({fallback:"/bin/zsh"}),argv:engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort}),promptIntent})}async function deliverPromptToLiveEngineAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return!1;try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0]);if(!key)return!1;let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return!1;return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})!==null}catch{return!1}finally{host.close()}}function tabIdFromHostedKey(key){return key.split("::")[1]??"tab-1"}async function deliverPromptToLiveEngineDetailedAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0]);if(!key)return{outcome:"no-session"};let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:tabIdFromHostedKey(key)};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:tabIdFromHostedKey(key)}}catch{return{outcome:"no-session"}}finally{host.close()}}async function deliverPromptToLiveEngineTabDetailedAdapter(target,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let key=`${target.id}::${target.tabId}`,sessions;try{sessions=await listHostedSessions(host.rpc)}catch{return{outcome:"no-session"}}let session=sessions.find((candidate)=>candidate.alive&&candidate.key===key);if(!session)return{outcome:"no-session"};let engineArgv=engineLaunchArgv({command:target.command,vendor:target.vendor}),presence=await enginePresence(session.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:target.tabId};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:target.tabId}}finally{host.close()}}async function tearDownTaskSessionAdapter(taskId){let host=await openHostedSessionHost();if(!host)return;try{await killHostedSessions(host.rpc,hostedTaskKeys(await listHostedSessions(host.rpc),taskId))}catch{}finally{host.close()}}
2
+ import{deriveTitleFromPrompt}from"./chunk-xb9b93ts.js";import{TaskDeletingError}from"./chunk-ce2hj8b7.js";import{awaitEngineProcess,buildEngineSessionLaunch,deliverToHostedKey,enginePresence,ensureHostedEngine,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,killHostedSessions,listHostedSessions,openHostedSessionHost,pastePromptWhenEngineUp,trustEngineWorktree}from"./chunk-rxpbxrqp.js";import{resolveLoginShell}from"./chunk-b99tf0jr.js";import{engineLaunchArgv,protocolEntry}from"./chunk-v8e24gbf.js";import{DEFAULT_TASK_VENDOR}from"./chunk-xy8be792.js";var MAX_SESSIONS_SCANNED=8;function titleFromMessages(messages){let firstUser=messages.find((m)=>m.role==="user");if(!firstUser)return"";let text=firstUser.blocks.filter((b)=>b.type==="text").map((b)=>b.text).join(" "),title=deriveTitleFromPrompt(text);return title.length>0?Buffer.from(title,"utf8").toString("utf8"):title}async function deriveTitleFromSession(worktree,vendor=DEFAULT_TASK_VENDOR){if(!worktree)return"";let{history}=protocolEntry(vendor),ids=await history.listSessionIdsForWorktree(worktree);for(let sessionId of ids.slice(0,MAX_SESSIONS_SCANNED)){let title=titleFromMessages(await history.readHistory(sessionId));if(title)return title}return""}async function deriveTitleFromSessionId(vendor,sessionId){if(!sessionId)return"";try{return titleFromMessages(await protocolEntry(vendor).history.readHistory(sessionId))}catch{return""}}async function getTask(link,taskId){let{task}=await link.request("task.get",{taskId});return task}async function ensureTaskWorktree(link,taskId){let task=await getTask(link,taskId);if(task.deletion)throw new TaskDeletingError(taskId);if(task.worktreePath)return{task,worktreePath:task.worktreePath};let{worktreePath}=await link.request("task.ensureWorktree",{taskId});if(!worktreePath)throw Error(`task ${taskId} has no worktree`);return{task,worktreePath}}async function ensureTaskSessionAdapter(link,taskId){let{task,worktreePath}=await ensureTaskWorktree(link,taskId),launch=taskEngineLaunch(task,worktreePath,{kind:"repo-init"}),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)throw Error(`failed to start hosted engine session for ${taskId}`);if(launch.firstMessage){let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort})[0];await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs}).catch(()=>!1)}}finally{host.close()}return{session:launch.key,worktreePath}}async function startTaskSessionWithPromptAdapter(link,taskId,prompt){let{task,worktreePath}=await ensureTaskWorktree(link,taskId);await link.request("task.observeLanguage",{taskId,text:prompt}).catch(()=>{});let launch=taskEngineLaunch(task,worktreePath,{kind:"new-task",prompt}),host=await ensureHostedSessionHost();try{if(!(await ensureHostedEngine(host.rpc,worktreePath,launch)).alive)return{started:!1,error:"hosted session did not open"};let engineBin=engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort})[0],wait={initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs};if(launch.firstMessage){if(await pastePromptWhenEngineUp(host.rpc,launch.key,engineBin,launch.firstMessage,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}if(await awaitEngineProcess(host.rpc,launch.key,engineBin,wait)!==null)return{started:!0};return{started:!1,error:await startFailureReason(host.rpc,launch.key)}}finally{host.close()}}async function startFailureReason(rpc,key){let tail=await hostedSessionFailureLine(rpc,key),base="engine process never started";return tail?`engine process never started; last session output: ${tail}`:"engine process never started"}function taskEngineLaunch(task,worktreePath,promptIntent){return trustEngineWorktree(task.vendor,worktreePath),buildEngineSessionLaunch({task:{id:task.id,kind:task.kind,vendor:task.vendor,repo:task.repo},worktreePath,shell:resolveLoginShell({fallback:"/bin/zsh"}),argv:engineLaunchArgv({command:task.command,vendor:task.vendor,effort:task.modelEffort}),promptIntent})}async function deliverPromptToLiveEngineAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return!1;try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0]);if(!key)return!1;let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return!1;return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})!==null}catch{return!1}finally{host.close()}}function tabIdFromHostedKey(key){return key.split("::")[1]??"tab-1"}async function deliverPromptToLiveEngineDetailedAdapter(task,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let sessions=await listHostedSessions(host.rpc),engineArgv=engineLaunchArgv({command:task.command,vendor:task.vendor}),key=findHostedEngineKey(sessions,task.id,engineArgv[0]);if(!key)return{outcome:"no-session"};let presence=await enginePresence(sessions.find((s)=>s.key===key)?.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:tabIdFromHostedKey(key)};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:tabIdFromHostedKey(key)}}catch{return{outcome:"no-session"}}finally{host.close()}}async function deliverPromptToLiveEngineTabDetailedAdapter(target,prompt){let host=await openHostedSessionHost();if(!host)return{outcome:"no-session"};try{let key=`${target.id}::${target.tabId}`,sessions;try{sessions=await listHostedSessions(host.rpc)}catch{return{outcome:"no-session"}}let session=sessions.find((candidate)=>candidate.alive&&candidate.key===key);if(!session)return{outcome:"no-session"};let engineArgv=engineLaunchArgv({command:target.command,vendor:target.vendor}),presence=await enginePresence(session.pid,engineArgv);if(presence.kind!=="engine")return{outcome:"no-engine",tabId:target.tabId};return await deliverToHostedKey(host.rpc,key,prompt,{vendor:presence.vendor})===null?{outcome:"no-session"}:{outcome:"delivered",tabId:target.tabId}}finally{host.close()}}async function tearDownTaskSessionAdapter(taskId){let host=await openHostedSessionHost();if(!host)return;try{await killHostedSessions(host.rpc,hostedTaskKeys(await listHostedSessions(host.rpc),taskId))}catch{}finally{host.close()}}
3
3
  export{deriveTitleFromSession,deriveTitleFromSessionId,ensureTaskSessionAdapter,startTaskSessionWithPromptAdapter,deliverPromptToLiveEngineAdapter,deliverPromptToLiveEngineDetailedAdapter,deliverPromptToLiveEngineTabDetailedAdapter,tearDownTaskSessionAdapter};