@sma1lboy/rove 0.9.148 → 0.9.150

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 (59) hide show
  1. package/dist/cli/{chunk-xzrqnpmh.js → chunk-0h4cfy44.js} +2 -2
  2. package/dist/cli/chunk-0kn7xxqm.js +6 -0
  3. package/dist/cli/{chunk-cbkje3aw.js → chunk-0tw42ad1.js} +1 -1
  4. package/dist/cli/{chunk-49s2zc0h.js → chunk-1cqtm24j.js} +1 -1
  5. package/dist/cli/{chunk-adez6hq4.js → chunk-1gpx52qj.js} +2 -2
  6. package/dist/cli/{chunk-dkxhmj9k.js → chunk-1ps9qzp1.js} +1 -1
  7. package/dist/cli/{chunk-bj59a9mg.js → chunk-1z9ae43v.js} +1 -1
  8. package/dist/cli/{chunk-39s1ndtm.js → chunk-2ffbcsm6.js} +6 -6
  9. package/dist/cli/{chunk-m0fz6g32.js → chunk-2hgt2esq.js} +3 -3
  10. package/dist/cli/{chunk-xbc3gcry.js → chunk-2t62vct7.js} +1 -1
  11. package/dist/cli/{chunk-91j0an0j.js → chunk-2w4zymkv.js} +1 -1
  12. package/dist/cli/{chunk-h5j8b87f.js → chunk-4d7bbh87.js} +1 -1
  13. package/dist/cli/{chunk-1x0vahnn.js → chunk-5b6940vk.js} +1 -1
  14. package/dist/cli/{chunk-3rqa4pyt.js → chunk-5gn4chrm.js} +2 -2
  15. package/dist/cli/{chunk-s66eh0pw.js → chunk-5kkm6tjz.js} +2 -2
  16. package/dist/cli/{chunk-dvabncrk.js → chunk-6h9tc9vn.js} +1 -1
  17. package/dist/cli/{chunk-jvpzy378.js → chunk-6xhtf9jx.js} +1 -1
  18. package/dist/cli/{chunk-a4a4qaa2.js → chunk-71m4ak4t.js} +1 -1
  19. package/dist/cli/chunk-7j8zpeer.js +3 -0
  20. package/dist/cli/{chunk-jfqbq12b.js → chunk-7sgtpyr0.js} +1 -1
  21. package/dist/cli/{chunk-eq5f3z2f.js → chunk-84aks78e.js} +1 -1
  22. package/dist/cli/{chunk-np07kccr.js → chunk-8x0h6rwa.js} +1 -1
  23. package/dist/cli/{chunk-me77sx3d.js → chunk-a0rxr20w.js} +1 -1
  24. package/dist/cli/{chunk-gbasmvsc.js → chunk-b24ykek8.js} +1 -1
  25. package/dist/cli/{chunk-8sbevss4.js → chunk-bjat0fyy.js} +1 -1
  26. package/dist/cli/{chunk-0dv2xssg.js → chunk-bzz4ta7g.js} +5 -7
  27. package/dist/cli/{chunk-dx6b3dv8.js → chunk-cjxwzzq7.js} +1 -1
  28. package/dist/cli/{chunk-7ngv7v9g.js → chunk-db57060b.js} +1 -1
  29. package/dist/cli/{chunk-v5893dx3.js → chunk-dk3pvrw6.js} +1 -1
  30. package/dist/cli/{chunk-y2yq6zca.js → chunk-fbg4fkmg.js} +1 -1
  31. package/dist/cli/{chunk-5ar3vspk.js → chunk-fhfqyfpf.js} +1 -1
  32. package/dist/cli/{chunk-x930m5fs.js → chunk-fyjj9ast.js} +1 -1
  33. package/dist/cli/{chunk-0b48bpkd.js → chunk-h9xpeqn6.js} +1 -1
  34. package/dist/cli/{chunk-pbqwegjy.js → chunk-hpj8xjxb.js} +1 -1
  35. package/dist/cli/{chunk-vqpa27cf.js → chunk-k2gfqqmg.js} +1 -1
  36. package/dist/cli/chunk-k5k0ecka.js +4 -0
  37. package/dist/cli/{chunk-7pfnda5z.js → chunk-khp1ga68.js} +1 -1
  38. package/dist/cli/{chunk-mggca3k4.js → chunk-mfvy10ep.js} +1 -1
  39. package/dist/cli/{chunk-8g456mmt.js → chunk-ppe5myr0.js} +1 -1
  40. package/dist/cli/{chunk-yn5a7xcv.js → chunk-r26g5ree.js} +1 -1
  41. package/dist/cli/{chunk-vzxbe80f.js → chunk-r2w8qgyd.js} +3 -3
  42. package/dist/cli/chunk-sm1vhrb6.js +3 -0
  43. package/dist/cli/{chunk-b8d162tf.js → chunk-tfdx5ve6.js} +1 -1
  44. package/dist/cli/chunk-vwjec3m6.js +3 -0
  45. package/dist/cli/{chunk-nrnjt5b6.js → chunk-vzvy1s1d.js} +1 -1
  46. package/dist/cli/{chunk-pcvk98rr.js → chunk-y34fff4t.js} +1 -1
  47. package/dist/cli/{chunk-wsvf9eka.js → chunk-yeytzg1x.js} +1 -1
  48. package/dist/cli/chunk-z3va3mt0.js +34 -0
  49. package/dist/cli/index.js +3 -3
  50. package/dist/cli/kobe.js +1 -1
  51. package/dist/cli/pty-host-node.mjs +113 -76
  52. package/dist/cli/rove.js +1 -1
  53. package/package.json +2 -2
  54. package/dist/cli/chunk-df7qe9y7.js +0 -4
  55. package/dist/cli/chunk-q7dr9eh6.js +0 -3
  56. package/dist/cli/chunk-t0kta7rb.js +0 -5
  57. package/dist/cli/chunk-yhcz2d2r.js +0 -34
  58. package/dist/cli/chunk-ykvk2546.js +0 -3
  59. package/dist/cli/chunk-ympakh8w.js +0 -6
@@ -1,34 +0,0 @@
1
- // @bun
2
- import{CONTRIB_ENGINE_IDS,contribEngineEntry,copilotConfigPath,detectClaudeAccount,detectCodexAccount,detectCopilotAccount,detectKimiAccount,isContribEngine,isJsonlLineWithinBound,pluginEngineIds,readTextFileBounded,vendorConfigHome}from"./chunk-df7qe9y7.js";import{spawnCapture}from"./chunk-gwcneg6c.js";import{ClaudeHookAdapter,GATED_TOOL_VERBS,JsonHookAdapter,kobeHookInvocation,updateSharedJsonSync}from"./chunk-7nhdvr5v.js";import{quoteShellArgv}from"./chunk-2fypr41w.js";import{BUILTIN_VENDORS,isBuiltinVendor}from"./chunk-h82kzdsn.js";var claudeCapabilities={},claudeIdentity={vendorId:"claude",shortName:"Claude"};import{readFile}from"fs/promises";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 readFile(path.join(dir,".credentials.json"),"utf8"))}catch{return null}}async function readKeychainCredentials(){if(process.platform!=="darwin")return null;let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),3000);try{let result=await spawnCapture("security",["find-generic-password","-a",userInfo().username,"-w","-s",KEYCHAIN_SERVICE],{cwd: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)}}var CLAUDE_SCREEN_MANIFEST={rules:[],composerEmpty:[{bottomLines:6,all:["\u276F"],lineRegex:["^\\s*\u276F\\s*(?:[\xB7\u2022]\\s*(?:\u2190[^\\n]*)?)?$"]}]};import{homedir as homedir2}from"os";import path2 from"path";function trustClaudeWorktree(worktreePath,home=homedir2()){updateSharedJsonSync(path2.join(home,".claude.json"),(raw)=>{if(raw===void 0)return{};try{return JSON.parse(raw)}catch{return{}}},(doc)=>{let projects={...doc.projects??{}},existing=projects[worktreePath]??{};if(existing.hasTrustDialogAccepted===!0)return;return projects[worktreePath]={...existing,hasTrustDialogAccepted:!0,hasCompletedProjectOnboarding:!0},JSON.stringify({...doc,projects},null,2)})}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 isObject(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)=>!isObject(b)||b.type!=="tool_result")}function num(v){return typeof v==="number"&&Number.isFinite(v)?v:0}function readUsage(v){if(!isObject(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
- `)){let trimmed=line.trim();if(!trimmed||!isJsonlLineWithinBound(trimmed))continue;let record;try{record=JSON.parse(trimmed)}catch{continue}if(!isObject(record)||isSyntheticClaudeRecord(record))continue;let inner=isObject(record.message)?record.message:record,at=typeof record.timestamp==="string"?Date.parse(record.timestamp):Number.NaN;if(!Number.isFinite(at))continue;let sessionId=typeof record.sessionId==="string"?record.sessionId:fallbackSessionId;if(inner.role==="user"){if(!opensTurn(inner.content))continue;if(draft){let done=finish(draft);if(done)out.push(done)}draft={id:"",sessionId,startedAt:at,endedAt:at,usageByMessage:new Map};continue}if(inner.role!=="assistant"||!draft)continue;if(draft.endedAt=at,typeof inner.model==="string")draft.model=inner.model;let messageId=typeof inner.id==="string"?inner.id:"";if(messageId)draft.id=messageId;let usage=readUsage(inner.usage);if(usage&&messageId)draft.usageByMessage.set(messageId,usage)}if(draft){let done=finish(draft);if(done)out.push(done)}return out}async function readClaudeTurns(transcriptPath){try{let raw=await readTextFileBounded(transcriptPath);return parseClaudeTurns(raw)}catch{return[]}}var HEX_RE=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;function parseHex(value){let match=HEX_RE.exec(value);if(!match)return[0,0,0];return[Number.parseInt(match[1],16),Number.parseInt(match[2],16),Number.parseInt(match[3],16)]}function luminance([red,green,blue]){return(red*0.2126+green*0.7152+blue*0.0722)/255}function blend(from,to,amount){return[Math.round(from[0]+(to[0]-from[0])*amount),Math.round(from[1]+(to[1]-from[1])*amount),Math.round(from[2]+(to[2]-from[2])*amount)]}function codexUserMessageBackground(background){return luminance(background)>0.5?blend(background,[0,0,0],0.04):blend(background,[255,255,255],0.12)}function transcriptRewrite(palette){let foreground=parseHex(palette.foreground),background=parseHex(palette.background),backgroundIsLight=luminance(background)>0.5;return{matchBackground:codexUserMessageBackground(background),foreground:backgroundIsLight?foreground:background,background:backgroundIsLight?background:foreground}}var codexTerminalPresentation={alternateScreenStyleRewrites:(palette)=>[transcriptRewrite(palette)]};var codexCapabilities={terminalPresentation:codexTerminalPresentation},codexIdentity={vendorId:"codex",shortName:"Codex"};import{homedir as homedir3}from"os";import{join}from"path";var EVENT_MAP=[{event:"SessionStart",verb:"session-start"},{event:"UserPromptSubmit",verb:"turn-start"},{event:"Stop",verb:"turn-complete"},{event:"PreCompact",verb:"pre-compact"},{event:"PostCompact",verb:"post-compact"},{event:"PreToolUse",verb:"tool-pre"},{event:"PostToolUse",verb:"tool-post"}],KOBE_CODEX_HOOK_EVENTS=EVENT_MAP.map((e)=>e.event);function codexHooksPath(){return join(homedir3(),".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{readdir,stat,unlink}from"fs/promises";import path3 from"path";import{createHash}from"crypto";function createAppendParseCache(opts){let maxFiles=opts.maxFiles??8,cache=new Map;function hashPrefix(raw,length){return createHash("sha256").update(raw.slice(0,length)).digest("hex")}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
- `)+1,entry=cache.get(filePath),prefixState;if(entry&&entry.prefixLength<=stableLength&&hashPrefix(raw,entry.prefixLength)===entry.prefixHash)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(!entry||entry.prefixLength!==stableLength||entry.state!==prefixState)remember(filePath,{prefixLength:stableLength,prefixHash:hashPrefix(raw,stableLength),state:prefixState});let tail=raw.slice(stableLength);return tail.trim().length>0?opts.parseChunk(tail,prefixState,ctx):prefixState}}function sortByTimestamp(messages){return messages.map((msg,idx)=>({msg,idx})).sort((a,b)=>{if(a.msg.timestamp<b.msg.timestamp)return-1;if(a.msg.timestamp>b.msg.timestamp)return 1;return a.idx-b.idx}).map((entry)=>entry.msg)}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(!isObject2(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 isObject2(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 messages=prev.messages.slice(),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(!isObject3(parsed))continue;if(parsed.type==="response_item"){let payload=isObject3(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)messages.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}:{}};stampLastUsageOnLastAssistant(messages,usageFields.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,latestUsage,latestUsageTimestampMs}}function codexUsageFields(parsed){if(parsed.type==="event_msg"){let payload=isObject3(parsed.payload)?parsed.payload:void 0;if(payload?.type!=="token_count")return;let info=isObject3(payload.info)?payload.info:void 0,usage=info&&isObject3(info.total_token_usage)?info.total_token_usage:void 0;if(!usage)return;let lastUsage=info&&isObject3(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=isObject3(parsed.usage)?parsed.usage:void 0;return usage?{usage,lastUsage:usage,contextWindow:void 0}:void 0}return}function stampLastUsageOnLastAssistant(messages,lastUsage){if(!lastUsage)return;for(let i=messages.length-1;i>=0;i--){let msg=messages[i];if(msg?.role!=="assistant")continue;let usage=codexLastUsageToMessageUsage(lastUsage);if(usage)messages[i]={...msg,usage};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}}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"]);return{role:"assistant",timestamp,sessionId,blocks:[{type:"tool_call",callId,name,input},{type:"tool_result",callId,output,isError:!1}]}}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(!isObject3(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 isObject3(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}var defaultHistoryDeps={sessionsDir(){return path3.join(vendorConfigHome("codex"),"sessions")},async readdir(p){try{return await readdir(p)}catch{return[]}},async readFile(p){return await readTextFileBounded(p)},stat},MAX_ROLLOUT_FILES=5000,warnedRolloutTruncation=!1;async function listRolloutFiles(deps=defaultHistoryDeps){let root=deps.sessionsDir(),years=(await deps.readdir(root)).sort().reverse(),out=[];for(let y of years){let yp=path3.join(root,y),months=(await deps.readdir(yp)).sort().reverse();for(let m of months){let mp=path3.join(yp,m),days=(await deps.readdir(mp)).sort().reverse();for(let d of days){let dp=path3.join(mp,d),files=(await deps.readdir(dp)).filter((f)=>f.startsWith("rollout-")&&f.endsWith(".jsonl"));files.sort().reverse();for(let f of files)if(out.push(path3.join(dp,f)),out.length>=MAX_ROLLOUT_FILES){if(!warnedRolloutTruncation)warnedRolloutTruncation=!0,console.warn(`[codex history] rollout scan truncated at ${MAX_ROLLOUT_FILES} files; older sessions may be omitted`);return out}}}}return out}async function findRolloutFile(sessionId,deps=defaultHistoryDeps){if(!sessionId)return;let want=sessionId.toLowerCase(),all=await listRolloutFiles(deps);for(let p of all)if(path3.basename(p).match(UUID_AT_END)?.[1]?.toLowerCase()===want)return p;return}var 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;function rolloutCwd(raw){for(let line of raw.split(`
6
- `)){let trimmed=line.trim();if(!trimmed)continue;if(!isJsonlLineWithinBound(trimmed))return"";try{let rec=JSON.parse(trimmed);if(rec.type==="session_meta")return rec.payload?.cwd??""}catch{}return""}return""}var rolloutCwdCaches=new WeakMap;async function rolloutCwdForFile(file,deps){let cache2=rolloutCwdCaches.get(deps);if(!cache2)cache2=new Map,rolloutCwdCaches.set(deps,cache2);let hit=cache2.get(file);if(hit!==void 0)return hit;let raw;try{raw=await deps.readFile(file)}catch{return null}let cwd=rolloutCwd(raw);if(cwd)cache2.set(file,cwd);return cwd}var MAX_WORKTREE_SCAN=200;async function listSessionIdsForWorktree(worktree,deps=defaultHistoryDeps){if(!worktree)return[];let files=await listRolloutFiles(deps),matches=[],scanned=0;for(let file of files){if(scanned>=MAX_WORKTREE_SCAN)break;if(scanned++,await rolloutCwdForFile(file,deps)!==worktree)continue;let id=path3.basename(file).match(UUID_AT_END)?.[1];if(id)matches.push(id)}return matches.reverse()}var MAX_MTIME_SCAN=12;async function findLatestRolloutForWorktree(worktree,deps=defaultHistoryDeps){if(!worktree)return null;let files=await listRolloutFiles(deps),scanned=0,best=null;for(let file of files){if(scanned>=MAX_MTIME_SCAN)break;if(scanned++,await rolloutCwdForFile(file,deps)!==worktree)continue;try{let mtimeMs=(await deps.stat(file)).mtimeMs;if(!best||mtimeMs>best.mtimeMs)best={path:file,mtimeMs}}catch{}}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||!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_SCREEN_MANIFEST={rules:[],composerEmpty:[{bottomLines:2,all:["\u203A"],lineRegex:["^\\s*\u203A\\s*$"]},{bottomLines:2,all:["\u203A"],lineRegex:["^\\s*\u203A\\s+Ask Codex to do anything\\s*$"],dimmed:["Ask Codex to do anything"]}]};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,existsSync,mkdirSync,openSync,readFileSync,unlinkSync,writeFileSync}from"fs";import{homedir as homedir4}from"os";import path4 from"path";var TRUST_LINE='trust_level = "trusted"',LOCK_NAME="config.toml.rove.lock",LOCK_TIMEOUT_MS=5000,LOCK_POLL_MS=10;function trustCodexWorktree(worktreePath,home=homedir4()){let dir=path4.join(home,".codex"),file=path4.join(dir,"config.toml"),header=`[projects.${JSON.stringify(worktreePath)}]`;mkdirSync(dir,{recursive:!0}),withConfigLock(path4.join(dir,LOCK_NAME),()=>{let text=readConfig(file),healed=dedupeOurTrustStanzas(text);if(healed.changed)text=healed.text,writeFileSync(file,text);if(text.includes(header))return;if(!existsSync(file))writeFileSync(file,"");let lead=text.length>0&&!text.endsWith(`
8
- `)?`
9
- `:"";appendFileSync(file,`${lead}
10
- ${header}
11
- ${TRUST_LINE}
12
- `)})}function readConfig(file){try{return readFileSync(file,"utf8")}catch{return""}}function dedupeOurTrustStanzas(text){let lines=text.split(`
13
- `),seenHeaders=new Set,out=[],changed=!1;for(let i=0;i<lines.length;i++){let line=lines[i];if(line.startsWith("[projects."))if(seenHeaders.has(line)){if(lines[i+1]===TRUST_LINE){changed=!0,i++;continue}}else seenHeaders.add(line);out.push(line)}return{text:out.join(`
14
- `),changed}}function withConfigLock(lockPath,fn){let fd,deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;)try{fd=openSync(lockPath,"wx");break}catch(err){if(err.code!=="EEXIST")throw err;if(Date.now()>=deadline){fd=void 0;break}sleepSync(LOCK_POLL_MS)}if(fd===void 0){fn();return}try{writeFileSync(fd,String(process.pid)),fn()}finally{closeSync(fd);try{unlinkSync(lockPath)}catch{}}}function sleepSync(ms){let end=Date.now()+ms;while(Date.now()<end);}function isObject4(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(`
15
- `)){let trimmed=line.trim();if(!trimmed||!isJsonlLineWithinBound(trimmed))continue;let record;try{record=JSON.parse(trimmed)}catch{continue}if(!isObject4(record))continue;let payload=isObject4(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=isObject4(payload.info)?payload.info:void 0,last=info&&isObject4(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 homedir5}from"os";function splitJsoncHeader(raw){let lines=raw.split(`
16
- `),i=0;while(i<lines.length&&(lines[i].trim().startsWith("//")||lines[i].trim()===""))i++;return{header:lines.slice(0,i).join(`
17
- `),body:lines.slice(i).join(`
18
- `)}}function trustCopilotWorktree(worktreePath,home=homedir5()){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}
19
- ${body}
20
- `:`${body}
21
- `})}import path8 from"path";import{appendFile,mkdir,readdir as readdir2,stat as stat2,unlink as unlink2}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)=>prev.concat(parseJsonl2(chunk,sessionId))});function parseSessionRaw(filePath,raw,sessionId){return sortByTimestamp(cache2(filePath,raw,sessionId))}function parseJsonl2(raw,sessionId){let out=[];for(let line of raw.split(`
22
- `)){let trimmed=line.trim();if(!trimmed)continue;if(!isJsonlLineWithinBound(trimmed))continue;let parsed;try{parsed=JSON.parse(trimmed)}catch{continue}if(!isObject5(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=isObject5(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(!isObject5(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}:{}}}function isObject5(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}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(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)){if((await readWorkspace(dir,deps)).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
- `)){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:[],toolNameById:new Map,sessionId:fallbackSessionId,usageMetrics:void 0,firstUserMessage:null}}var eventsCache=createAppendParseCache({initial:initialParseState,parseChunk:(chunk,prev)=>foldEvents(chunk,prev)});function foldEvents(raw,prev){let messages=prev.messages.slice(),toolNameById=new Map(prev.toolNameById),sessionId=prev.sessionId,usageMetrics=prev.usageMetrics,firstUserMessage=prev.firstUserMessage;for(let line of raw.split(`
24
- `)){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");messages.push({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)messages.push({role:"assistant",blocks,timestamp,sessionId});continue}if(record.type==="tool.execution_start"){let callId=typeof data.toolCallId==="string"?data.toolCallId:void 0,name=typeof data.toolName==="string"?data.toolName:"tool";if(callId)toolNameById.set(callId,name);continue}if(record.type==="tool.execution_complete"){let callId=typeof data.toolCallId==="string"?data.toolCallId:void 0;if(!callId)continue;let name=toolNameById.get(callId)??(typeof data.toolName==="string"?data.toolName:"tool"),output=data.result??(data.success===!1?{success:!1}:void 0);messages.push({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,toolNameById,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(`
25
- `)){if(!line.trim())continue;try{let{sessionId,sessionDir,workDir}=JSON.parse(line);if(sessionId&&sessionDir&&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 listSessionIdsForWorktree3(worktree,deps=defaultDeps3){if(!worktree)return[];let matches=[];for(let entry of await sessionIndex(deps)){if(entry.workDir!==worktree)continue;let mtimeMs=await deps.stat(wirePath(entry.sessionDir)).then((s)=>s.mtimeMs).catch(()=>null);if(mtimeMs===null)continue;matches.push({id:entry.sessionId,mtimeMs})}return matches.sort((a,b)=>a.mtimeMs-b.mtimeMs).map((m)=>m.id)}async function transcriptMtime(file,deps=defaultDeps3){return await deps.stat(file).then((s)=>s.mtimeMs).catch(()=>0)}async function transcriptPath(sessionId,deps=defaultDeps3){if(!sessionId)return null;let entry=(await sessionIndex(deps)).find((e)=>e.sessionId===sessionId);if(!entry)return null;let file=wirePath(entry.sessionDir);return await deps.stat(file).then(()=>file).catch(()=>null)}var EMPTY_HISTORY={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},claudeHistoryReader={async listSessionIdsForWorktree(worktree){return[...await listSessionFilesForWorktree(worktree)].sort((a,b)=>a.mtimeMs-b.mtimeMs).map((f)=>f.sessionId)},readHistory:(sessionId)=>readHistory2(sessionId),readUsageSnapshot:(sessionId)=>readUsageSnapshot(sessionId),async transcriptPath(sessionId,worktree){return(await listSessionFilesForWorktree(worktree)).find((f)=>f.sessionId===sessionId)?.path??null},latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree2(worktree)},codexHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree(worktree),readHistory:(sessionId)=>readHistory(sessionId),readUsageSnapshot:async(sessionId)=>(await readHistoryWithMetrics(sessionId)).usageMetrics,transcriptPath:async(sessionId)=>await findRolloutFile(sessionId)??null,latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree(worktree)},copilotHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree2(worktree),readHistory:(sessionId)=>readHistory3(sessionId),readUsageSnapshot:async(sessionId)=>(await readHistoryWithMetrics2(sessionId)).usageMetrics,async transcriptPath(sessionId){let dir=await findSessionDir(sessionId);return dir?path8.join(dir,"events.jsonl"):null},latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree3(worktree)},kimiHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree3(worktree),readHistory:EMPTY_HISTORY.readHistory,transcriptPath:(sessionId)=>transcriptPath(sessionId),async latestTranscriptMtimeForWorktree(worktree){let newest=(await listSessionIdsForWorktree3(worktree)).at(-1);if(!newest)return 0;let file=await transcriptPath(newest);return file?await transcriptMtime(file):0}};import{existsSync as existsSync2}from"fs";import{mkdir as mkdir2,readFile as readFile2,writeFile}from"fs/promises";import{homedir as homedir6}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=homedir6()){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"]);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
- `)}function removeKimiHookBlock(content){let lines=content.split(`
27
- `),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(`
28
- `)}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}
29
-
30
- `:""}${renderKimiHookBlock(inv,opts)}
31
- `}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(!existsSync2(dirname(settingsFilePath)))return;await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!0,void 0,opts))}async removeActivityHooks(settingsFilePath){if(!existsSync2(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 readFile2(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 )"]}],composerEmpty:[{bottomLines:2,all:[">"],lineRegex:["^\\s*\u2502?\\s*>\\s*[\u2026]?\\s*\u2502?\\s*$"]}]};import{createHash as createHash2}from"crypto";import{existsSync as existsSync3,mkdirSync as mkdirSync2,realpathSync,writeFileSync as writeFileSync2}from"fs";import{homedir as homedir7}from"os";import path9 from"path";function resolvedWorktree(worktreePath){try{return realpathSync(worktreePath)}catch{return worktreePath}}function kimiTrustFilePath(worktreePath,home=homedir7()){let resolved=resolvedWorktree(worktreePath),hash=createHash2("sha256").update(resolved).digest("hex").slice(0,12),dir=path9.basename(resolved).toLowerCase();return path9.join(home,".kimi-code","workspace-trust",`wd_${dir}_${hash}`)}function trustKimiWorktree(worktreePath,home=homedir7()){let file=kimiTrustFilePath(worktreePath,home);if(existsSync3(file))return;mkdirSync2(path9.dirname(file),{recursive:!0,mode:448}),writeFileSync2(file,JSON.stringify({root:resolvedWorktree(worktreePath),trustedAt:Date.now()}),{mode:384})}import{readFile as readFile3,stat as stat5}from"fs/promises";class EngineTurnDetector{supportsCompletionMarkers(){return!0}async latestCompletion(worktree){return(await this.latestActivity(worktree)).marker}async latestActivityInFile(_transcriptPath){return null}}function createEngineTurnDetector(vendor){return engineEntry(vendor).createTurnDetector()}var statMtimeMs=(path10)=>stat5(path10).then((s)=>s.mtimeMs,()=>0),defaultClaudeDeps={listSessionFiles:(worktree)=>listSessionFilesForWorktree(worktree),readFile:(path10)=>readFile3(path10,"utf8"),statMtimeMs};class ClaudeTurnDetector extends EngineTurnDetector{deps;vendor="claude";cache=new Map;constructor(deps=defaultClaudeDeps){super();this.deps=deps}async latestActivity(worktree){let files=await this.deps.listSessionFiles(worktree),mtimeMs=files[0]?.mtimeMs??0,latest=null,next=new Map;for(let file of files.slice(0,4)){let hit=this.cache.get(file.path),marker;if(hit&&file.mtimeMs>0&&hit.mtimeMs===file.mtimeMs)marker=hit.marker;else{let raw=await this.deps.readFile(file.path).catch(()=>"");marker=latestClaudeCompletionMarkerFromJsonl(raw,file.path,file.mtimeMs)}if(next.set(file.path,{mtimeMs:file.mtimeMs,marker}),marker&&(!latest||marker.timestampMs>latest.timestampMs))latest=marker}return this.cache=next,{marker:latest,mtimeMs}}async latestActivityInFile(transcriptPath2){let mtimeMs=await(this.deps.statMtimeMs??statMtimeMs)(transcriptPath2);if(mtimeMs===0)return null;let raw=await this.deps.readFile(transcriptPath2).catch(()=>"");return{marker:latestClaudeCompletionMarkerFromJsonl(raw,transcriptPath2,mtimeMs),mtimeMs}}}var defaultCodexDeps={findLatestRollout:(worktree)=>findLatestRolloutForWorktree(worktree),readFile:(path10)=>readFile3(path10,"utf8")};class CodexTurnDetector extends EngineTurnDetector{deps;vendor="codex";cache=null;constructor(deps=defaultCodexDeps){super();this.deps=deps}async latestActivity(worktree){if(!worktree)return{marker:null,mtimeMs:0};let found=await this.deps.findLatestRollout(worktree);if(!found)return{marker:null,mtimeMs:0};if(this.cache&&this.cache.path===found.path&&found.mtimeMs>0&&this.cache.mtimeMs===found.mtimeMs)return{marker:this.cache.marker,mtimeMs:found.mtimeMs};let raw=await this.deps.readFile(found.path).catch(()=>"");if(!raw)return{marker:null,mtimeMs:found.mtimeMs};let marker=latestCodexCompletionMarkerFromJsonl(raw,found.path);return this.cache={path:found.path,mtimeMs:found.mtimeMs,marker},{marker,mtimeMs:found.mtimeMs}}}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(`
32
- `)){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(`
33
- `)){lineNo++;let record=parseJsonLine(line);if(!record||!isCodexCompletionRecord(record))continue;let timestampMs=timestampFromRecord(record,0),marker={id:`codex:${sourceId}:${timestampMs}:${lineNo}`,timestampMs,source:"codex"};if(!latest||marker.timestampMs>=latest.timestampMs)latest=marker}return latest}function parseJsonLine(line){let trimmed=line.trim();if(!trimmed)return null;try{let parsed=JSON.parse(trimmed);return isObject8(parsed)?parsed:null}catch{return null}}function timestampFromRecord(record,fallback){let ts=typeof record.timestamp==="string"?Date.parse(record.timestamp):Number.NaN;return Number.isFinite(ts)?ts:fallback}function isObject8(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}var BUILTIN_ENGINES={claude:{vendor:"claude",builtin:!0,displayName:claudeIdentity.shortName,defaultCommand:["claude"],history:claudeHistoryReader,detectAccount:(deps)=>detectClaudeAccount(deps),createHookAdapter:()=>new ClaudeHookAdapter,createTurnDetector:()=>new ClaudeTurnDetector,capabilities:claudeCapabilities,identity:claudeIdentity,trustWorktree:trustClaudeWorktree,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},sessionIdentity:{pinFlag:"--session-id",sessionControlFlags:["--session-id","--resume","-r","--continue","-c","--from-pr"],resumeArgv:(base,id)=>[...base,"--resume",id],forkArgv:(base,sourceId,newId)=>{let forked=[...base,"--resume",sourceId,"--fork-session"];return newId?[...forked,"--session-id",newId]:forked}},quotaUsage:()=>fetchClaudeQuotaUsage(),readTurns:readClaudeTurns,screenManifest:CLAUDE_SCREEN_MANIFEST},codex:{vendor:"codex",builtin:!0,displayName:codexIdentity.shortName,defaultCommand:["codex"],effortLevels:["none","low","medium","high","xhigh","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,screenManifest:CODEX_SCREEN_MANIFEST,terminalTitle:{ownsStatus:!0,launchArgs:["-c",'tui.terminal_title=["activity","thread-title"]'],statusPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],workingPrefixes:["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],sessionIdFromTitle:codexSessionIdFromTitle},sessionIdentity:{resumeArgv:(base,id)=>{let[bin,...rest]=base;return bin?[bin,"resume",...rest,id]:base},forkArgv:(base,sourceId)=>{let[bin,...rest]=base;return bin?[bin,"fork",...rest,sourceId]:null}},quotaUsage:()=>fetchCodexQuotaUsage()},copilot:{vendor:"copilot",builtin:!0,displayName:"Copilot",defaultCommand:["copilot"],history:copilotHistoryReader,detectAccount:(deps)=>detectCopilotAccount(deps),createHookAdapter:()=>new NoopHookAdapter("copilot"),createTurnDetector:()=>new UnknownTurnDetector("copilot"),trustWorktree:trustCopilotWorktree,screenManifest:COPILOT_SCREEN_MANIFEST},kimi:{vendor:"kimi",builtin:!0,displayName:"Kimi",defaultCommand:["kimi"],firstMessageDelivery:"paste",processNames:["kimi-co"],trustWorktree:trustKimiWorktree,history:kimiHistoryReader,detectAccount:(deps)=>detectKimiAccount(deps),createHookAdapter:()=>new KimiHookAdapter,createTurnDetector:()=>new UnknownTurnDetector("kimi"),sessionIdentity:{sessionControlFlags:["-S","--session","-c","--continue"],resumeArgv:(base,id)=>[...base,"-S",id]},screenManifest:KIMI_SCREEN_MANIFEST}};function stripStatusPrefix(title,prefixes){for(let prefix of[...prefixes].sort((a,b)=>b.length-a.length)){if(!title.startsWith(prefix))continue;let rest=title.slice(prefix.length).trimStart();if(rest.length===0)return title;return rest}return title}function titleTurnHint(config,title){let working=config?.workingPrefixes;if(config?.ownsStatus!==!0||!working||working.length===0)return null;let trimmed=title.trim();if(trimmed.length===0)return null;return working.some((prefix)=>trimmed.startsWith(prefix))?"working":"rest"}function titleSessionId(config,title){let trimmed=title.trim();if(!trimmed)return null;return config?.sessionIdFromTitle?.(trimmed)??null}function titleIsPlaceholder(config,title){return titleSessionId(config,title)!==null}function customEngineEntry(vendor){return{vendor,builtin:!1,displayName:vendor,defaultCommand:[vendor],history:EMPTY_HISTORY,createHookAdapter:()=>new NoopHookAdapter(vendor),createTurnDetector:()=>new UnknownTurnDetector(vendor)}}function engineEntry(vendor){if(isBuiltinVendor(vendor))return BUILTIN_ENGINES[vendor];let custom=customEngineEntry(vendor);return isContribEngine(vendor)?contribEngineEntry(vendor,custom):custom}function identifiableEngineIds(){return[...BUILTIN_VENDORS,...CONTRIB_ENGINE_IDS,...pluginEngineIds()]}function supportsStructuredHistory(vendor){return engineEntry(vendor).history.readHistory!==EMPTY_HISTORY.readHistory}var ALL_STATUS_PREFIXES=[...new Set(Object.values(BUILTIN_ENGINES).flatMap((entry)=>entry.terminalTitle?.statusPrefixes??[]))];function engineStatusPrefixes(vendor){let declared=engineEntry(vendor).terminalTitle?.statusPrefixes;return declared&&declared.length>0?declared:ALL_STATUS_PREFIXES}function stripEngineStatusPrefix(title,vendor){return stripStatusPrefix(title,vendor?engineStatusPrefixes(vendor):ALL_STATUS_PREFIXES)}function engineTitleTurnHint(vendor,title){return titleTurnHint(engineEntry(vendor).terminalTitle,title)}function engineSessionIdFromTitle(vendor,title){return titleSessionId(engineEntry(vendor).terminalTitle,title)}function isEnginePlaceholderTitle(title,vendor){return titleIsPlaceholder(engineEntry(vendor).terminalTitle,title)}function getCapabilities(vendor){return engineEntry(vendor).capabilities}function vendorsWithQuotaProbe(){return Object.values(BUILTIN_ENGINES).filter((entry)=>entry.quotaUsage).map((entry)=>entry.vendor)}function vendorsWithTurnReader(){return Object.values(BUILTIN_ENGINES).filter((entry)=>entry.readTurns).map((entry)=>entry.vendor)}function createEngineHookAdapter(vendor){return engineEntry(vendor).createHookAdapter()}class NoopHookAdapter{vendor;constructor(vendor){this.vendor=vendor}supportsHooks(){return!1}globalSettingsPath(){return""}activityDetailFromPayload(){return}sessionFromPayload(){return}async installActivityHooks(){}async removeActivityHooks(){}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async removeWorktreeWatchHook(){}}
34
- export{createEngineHookAdapter,createEngineTurnDetector,engineEntry,identifiableEngineIds,supportsStructuredHistory,engineStatusPrefixes,stripEngineStatusPrefix,engineTitleTurnHint,engineSessionIdFromTitle,isEnginePlaceholderTitle,getCapabilities,vendorsWithQuotaProbe,vendorsWithTurnReader};
@@ -1,3 +0,0 @@
1
- // @bun
2
- import{loadPluginRegistry,readPluginManifest}from"./chunk-jyv82gf0.js";import{clearPluginEngines,registerPluginEngine,resetAvailableVendorsCache}from"./chunk-df7qe9y7.js";import{getCustomEngineIds}from"./chunk-k3ksts6g.js";function loadPluginEngines(homeDir){let registered=[];try{for(let entry of loadPluginRegistry(homeDir).plugins){if(!entry.enabled)continue;try{let{manifest}=readPluginManifest(entry.root);for(let engine of manifest.engines){let identity={vendorId:engine.id,shortName:engine.identity?.shortName??engine.name};if(registerPluginEngine(engine.id,{displayName:engine.name,defaultCommand:engine.command,...engine.processNames?{processNames:engine.processNames}:{},screenManifest:{rules:engine.rules},identity,...engine.firstMessageDelivery?{firstMessageDelivery:engine.firstMessageDelivery}:{}}))registered.push(engine.id);else console.warn(`[rove] plugin ${entry.id}: engine id \`${engine.id}\` shadows a built-in or shipped engine \u2014 skipped`)}}catch{}}}catch{}return registered}function reloadPluginEngines(homeDir){clearPluginEngines();let registered=loadPluginEngines(homeDir);return loadedOnce=registered,resetAvailableVendorsCache(),registered}var loadedOnce;function ensurePluginEnginesLoaded(){return loadedOnce??=loadPluginEngines(),loadedOnce}function registeredEngineIds(){return[...getCustomEngineIds(),...ensurePluginEnginesLoaded()]}
3
- export{loadPluginEngines,reloadPluginEngines,ensurePluginEnginesLoaded,registeredEngineIds};
@@ -1,6 +0,0 @@
1
- // @bun
2
- function toError(err){if(err instanceof Error)return err;let text;try{text=typeof err==="string"?err:JSON.stringify(err)}catch{text=String(err)}return Error(text)}function formatCrashEntry(kind,err,now=new Date){let e=toError(err);return`[${now.toISOString()}] daemon ${kind}: ${e.stack??`${e.name}: ${e.message}`}
3
- `}function formatDaemonError(subsystem,err,now=new Date){let e=toError(err);return`[${now.toISOString()}] daemon error [${subsystem}]: ${e.stack??`${e.name}: ${e.message}`}
4
- `}function logDaemonError(subsystem,err){process.stderr.write(formatDaemonError(subsystem,err))}function formatDaemonInfo(subsystem,message,now=new Date){return`[${now.toISOString()}] daemon [${subsystem}]: ${message}
5
- `}function logDaemonInfo(subsystem,message){process.stderr.write(formatDaemonInfo(subsystem,message))}var onRejection,onException;function installDaemonCrashHandlers(log=(l)=>process.stderr.write(l)){if(onRejection||onException)return;onRejection=(reason)=>log(formatCrashEntry("unhandledRejection",reason)),onException=(err)=>log(formatCrashEntry("uncaughtException",err)),process.on("unhandledRejection",onRejection),process.on("uncaughtException",onException)}class ClientWriter{socket;highWaterMark;onOverflow;queue=[];queuedBytes=0;paused=!1;draining=!1;droppedFrames=0;overflowed=!1;constructor(socket,options={}){this.socket=socket,this.highWaterMark=options.highWaterMark??8388608,this.onOverflow=options.onOverflow}get isPaused(){return this.paused}get pendingBytes(){return this.queuedBytes}get pendingCount(){return this.queue.length}get dropped(){return this.droppedFrames}write(line,critical){if(this.overflowed)return;if(!this.paused){if(this.safeWrite(line))return;this.pause();return}this.enqueue({line,bytes:Buffer.byteLength(line),critical})}enqueue(frame){if(this.queue.push(frame),this.queuedBytes+=frame.bytes,this.queuedBytes<=this.highWaterMark)return;let survivors=[];for(let queued of this.queue){if(this.queuedBytes>this.highWaterMark&&!queued.critical){this.queuedBytes-=queued.bytes,this.droppedFrames++;continue}survivors.push(queued)}if(this.queue=survivors,this.queuedBytes<=this.highWaterMark||!this.onOverflow)return;this.overflowed=!0,this.queue=[],this.queuedBytes=0,this.onOverflow()}pause(){if(this.draining)return;this.paused=!0,this.draining=!0,this.socket.once("drain",()=>{this.draining=!1,this.paused=!1,this.flush()})}flush(){while(this.queue.length>0){let frame=this.queue[0],ok=this.safeWrite(frame.line);if(this.queue.shift(),this.queuedBytes-=frame.bytes,!ok){this.pause();return}}}safeWrite(line){try{return this.socket.write(line)}catch{return!0}}}import{lstat,symlink,unlink}from"fs/promises";import{dirname}from"path";async function linkLegacyRuntimePath(canonical,legacy){if(canonical===legacy)return!1;try{if(!await lstat(dirname(legacy)).catch(()=>null))return!1;let existing=await lstat(legacy).catch(()=>null);if(existing&&!existing.isSymbolicLink())return!1;if(existing)await unlink(legacy).catch(()=>{});return await symlink(canonical,legacy),!0}catch{return!1}}function objectPayload(payload){if(!payload||typeof payload!=="object"||Array.isArray(payload))return{};return payload}function requireString(payload,key){let value=payload[key];if(typeof value!=="string"||value.length===0)throw Error(`${key} is required`);return value}function optionalString(payload,key){let value=payload[key];if(value===void 0||value===null||value==="")return;if(typeof value!=="string")throw Error(`${key} must be a string`);return value}function optionalBoolean(payload,key){let value=payload[key];if(value===void 0||value===null)return;if(typeof value!=="boolean")throw Error(`${key} must be a boolean`);return value}function requireNumber(payload,key){let value=payload[key];if(typeof value!=="number"||!Number.isFinite(value))throw Error(`${key} must be a finite number`);return value}function optionalNumber(payload,key){let value=payload[key];if(value===void 0||value===null)return;if(typeof value!=="number"||!Number.isFinite(value))throw Error(`${key} must be a finite number`);return value}function optionalVendor(payload,key){let value=optionalString(payload,key);return value&&value.trim().length>0?value:void 0}function optionalActivityDetail(payload){let raw=payload.detail;if(!raw||typeof raw!=="object"||Array.isArray(raw))return;let d=raw,out={};if(d.failure==="rate_limit"||d.failure==="billing"||d.failure==="other")out.failure=d.failure;if(d.waiting==="permission"||d.waiting==="input")out.waiting=d.waiting;if(typeof d.note==="string")out.note=d.note;let tool=d.tool;if(tool&&typeof tool==="object"&&!Array.isArray(tool))out.tool={...typeof tool.name==="string"?{name:tool.name}:{},...typeof tool.id==="string"?{id:tool.id}:{}};let compact=d.compact;if(compact&&typeof compact==="object"&&!Array.isArray(compact))out.compact=compact.trigger==="manual"||compact.trigger==="auto"?{trigger:compact.trigger}:{};let subagent=d.subagent;if(subagent&&typeof subagent==="object"&&!Array.isArray(subagent))out.subagent={...typeof subagent.type==="string"?{type:subagent.type}:{},...typeof subagent.id==="string"?{id:subagent.id}:{}};return Object.keys(out).length>0?out:void 0}
6
- export{logDaemonError,logDaemonInfo,installDaemonCrashHandlers,ClientWriter,linkLegacyRuntimePath,objectPayload,requireString,optionalString,optionalBoolean,requireNumber,optionalNumber,optionalVendor,optionalActivityDetail};