@sma1lboy/rove 0.9.160 → 0.9.161
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/{chunk-zmvsqfad.js → chunk-07m61r5j.js} +5 -5
- package/dist/cli/chunk-0j4d6w8x.js +2 -0
- package/dist/cli/{chunk-ttnpek4s.js → chunk-0rsh0hk3.js} +1 -1
- package/dist/cli/{chunk-wdhcrcre.js → chunk-0zsechc5.js} +1 -1
- package/dist/cli/{chunk-144wtkqt.js → chunk-109g1rks.js} +1 -1
- package/dist/cli/chunk-13mw2v47.js +2 -0
- package/dist/cli/{chunk-kt1ppyje.js → chunk-1kz2syvp.js} +1 -1
- package/dist/cli/chunk-1pht7ydx.js +2 -0
- package/dist/cli/{chunk-cz7qj1p8.js → chunk-2h9nz0zv.js} +1 -1
- package/dist/cli/{chunk-39x1ztey.js → chunk-2qkj3wsg.js} +1 -1
- package/dist/cli/chunk-3bcx9dyb.js +2 -0
- package/dist/cli/{chunk-5w26jqne.js → chunk-44cy59kn.js} +1 -1
- package/dist/cli/chunk-4wswdvzj.js +2 -0
- package/dist/cli/{chunk-91f68r6e.js → chunk-5ec9ydqp.js} +1 -1
- package/dist/cli/{chunk-0am6gj8j.js → chunk-5emg1pra.js} +1 -1
- package/dist/cli/{chunk-56wver0a.js → chunk-5q3gsvne.js} +1 -1
- package/dist/cli/{chunk-vj2vdx3w.js → chunk-632q2pg7.js} +1 -1
- package/dist/cli/{chunk-t0y9ty67.js → chunk-6ndddtg5.js} +1 -1
- package/dist/cli/{chunk-8vec42df.js → chunk-6rc52z3j.js} +1 -1
- package/dist/cli/{chunk-a2xndedd.js → chunk-6tvrvekq.js} +1 -1
- package/dist/cli/{chunk-ztx1pfqv.js → chunk-7027e3rb.js} +1 -1
- package/dist/cli/{chunk-qy855bd5.js → chunk-74h1frdb.js} +1 -1
- package/dist/cli/{chunk-z49thwax.js → chunk-7zmsb99k.js} +1 -1
- package/dist/cli/{chunk-wdq5p44p.js → chunk-89843565.js} +1 -1
- package/dist/cli/{chunk-caqpt09m.js → chunk-932ymm0m.js} +1 -1
- package/dist/cli/{chunk-y7szq7xb.js → chunk-97h1gbh8.js} +2 -2
- package/dist/cli/{chunk-sfv15era.js → chunk-9esrwvqc.js} +1 -1
- package/dist/cli/{chunk-yrawhw9y.js → chunk-9fvdqhj9.js} +1 -1
- package/dist/cli/{chunk-qpd817w4.js → chunk-a6jcy2y3.js} +1 -1
- package/dist/cli/chunk-aedbpxbr.js +2 -0
- package/dist/cli/{chunk-ynknvkrw.js → chunk-amt0tw20.js} +1 -1
- package/dist/cli/chunk-ayhhgfsz.js +3 -0
- package/dist/cli/{chunk-6pt23vas.js → chunk-b3pxf5xd.js} +1 -1
- package/dist/cli/{chunk-gkmpfpmn.js → chunk-bpkg51p5.js} +2 -2
- package/dist/cli/{chunk-9h4kbsk5.js → chunk-bt5s6ft2.js} +1 -1
- package/dist/cli/{chunk-ksqdd9zh.js → chunk-bybwrdrn.js} +1 -1
- package/dist/cli/{chunk-ds9qf1w1.js → chunk-dx4xyegr.js} +1 -1
- package/dist/cli/{chunk-0hn7ctj6.js → chunk-ea0tf083.js} +1 -1
- package/dist/cli/{chunk-0bayctej.js → chunk-em5cnbrc.js} +3 -3
- package/dist/cli/{chunk-myewzjst.js → chunk-ep7exzsb.js} +1 -1
- package/dist/cli/{chunk-pas1rh6m.js → chunk-fex98vjg.js} +1 -1
- package/dist/cli/{chunk-hj08heah.js → chunk-ffj7jp3k.js} +1 -1
- package/dist/cli/{chunk-ny31s73y.js → chunk-ftpbjbg9.js} +1 -1
- package/dist/cli/{chunk-9wn8m2rt.js → chunk-gs8kf0me.js} +1 -1
- package/dist/cli/chunk-gyc4fj15.js +3 -0
- package/dist/cli/{chunk-aak5ttgt.js → chunk-hfh1wgtr.js} +1 -1
- package/dist/cli/{chunk-5v893waj.js → chunk-j75axe29.js} +1 -1
- package/dist/cli/{chunk-w68k2kdb.js → chunk-k1qe5qqa.js} +1 -1
- package/dist/cli/{chunk-y8yyk9hq.js → chunk-k43kf7qa.js} +1 -1
- package/dist/cli/{chunk-39fjx5fq.js → chunk-mnk7byzm.js} +2 -2
- package/dist/cli/chunk-mv7ptt5w.js +3 -0
- package/dist/cli/{chunk-j91yq51m.js → chunk-mw1x9nh0.js} +3 -3
- package/dist/cli/chunk-n4cwdgv2.js +2 -0
- package/dist/cli/chunk-n55jst34.js +7 -0
- package/dist/cli/{chunk-cfg0s90c.js → chunk-n5c3k1dg.js} +1 -1
- package/dist/cli/{chunk-zftxrnwh.js → chunk-naexhh9c.js} +1 -1
- package/dist/cli/chunk-njzwyy8v.js +2 -0
- package/dist/cli/{chunk-47nevjck.js → chunk-pc3djc2b.js} +2 -2
- package/dist/cli/{chunk-1ckc04zj.js → chunk-pfvpvxz2.js} +1 -1
- package/dist/cli/{chunk-zz788rt4.js → chunk-q0s362r7.js} +2 -2
- package/dist/cli/chunk-q16pxc1j.js +2 -0
- package/dist/cli/{chunk-cs50jnwn.js → chunk-qs80x1cd.js} +1 -1
- package/dist/cli/chunk-r79ht9kg.js +2 -0
- package/dist/cli/chunk-rqwx8wqx.js +2 -0
- package/dist/cli/chunk-s6mcrm5g.js +2 -0
- package/dist/cli/{chunk-wbt845s6.js → chunk-sx8fw2qd.js} +1 -1
- package/dist/cli/{chunk-4502n1bk.js → chunk-tngnng9q.js} +1 -1
- package/dist/cli/chunk-tp48wamv.js +3 -0
- package/dist/cli/{chunk-t7xhb2jx.js → chunk-tqat428f.js} +1 -1
- package/dist/cli/{chunk-ntt7gy5a.js → chunk-ttd78mrr.js} +1 -1
- package/dist/cli/{chunk-84s62bex.js → chunk-v8mscj31.js} +1 -1
- package/dist/cli/chunk-wc0g8kzq.js +2 -0
- package/dist/cli/chunk-wzdrq5es.js +2 -0
- package/dist/cli/{chunk-t27t2x9b.js → chunk-xcgb5q15.js} +1 -1
- package/dist/cli/{chunk-x6hevxs5.js → chunk-y9xr3c66.js} +1 -1
- package/dist/cli/chunk-ycdeav89.js +2 -0
- package/dist/cli/{chunk-zvfgzpw6.js → chunk-ygnfyfq9.js} +1 -1
- package/dist/cli/chunk-ykrvv6bc.js +4 -0
- package/dist/cli/{chunk-1aqmmea7.js → chunk-yrwkh92f.js} +1 -1
- package/dist/cli/{chunk-qr3e1m00.js → chunk-ytxw3rvn.js} +1 -1
- package/dist/cli/{chunk-g48s150x.js → chunk-yv913can.js} +1 -1
- package/dist/cli/{chunk-ccjmtajy.js → chunk-ywcx78mv.js} +1 -1
- package/dist/cli/{chunk-s59cymtd.js → chunk-zf45ap00.js} +1 -1
- package/dist/cli/{chunk-e85ttr8r.js → chunk-zk9yzb09.js} +1 -1
- package/dist/cli/index.js +7 -7
- package/dist/cli/kobe.js +1 -1
- package/dist/cli/pty-host-node.mjs +0 -13
- package/dist/cli/rove.js +1 -1
- package/package.json +1 -1
- package/dist/cli/chunk-0fhab4tq.js +0 -2
- package/dist/cli/chunk-1y37w7zq.js +0 -4
- package/dist/cli/chunk-22yhtgcy.js +0 -7
- package/dist/cli/chunk-4jf0yq4v.js +0 -2
- package/dist/cli/chunk-6b474j5g.js +0 -2
- package/dist/cli/chunk-7x88845e.js +0 -2
- package/dist/cli/chunk-959a71qj.js +0 -2
- package/dist/cli/chunk-a3a9gdc4.js +0 -3
- package/dist/cli/chunk-azsmk821.js +0 -2
- package/dist/cli/chunk-cdxme5y4.js +0 -2
- package/dist/cli/chunk-cfghdnev.js +0 -2
- package/dist/cli/chunk-dmdpsw2y.js +0 -2
- package/dist/cli/chunk-dzd1wy5a.js +0 -2
- package/dist/cli/chunk-kw0nnzdp.js +0 -2
- package/dist/cli/chunk-mhs6yywx.js +0 -2
- package/dist/cli/chunk-mp8v5gn8.js +0 -2
- package/dist/cli/chunk-mqqnk8w7.js +0 -3
- package/dist/cli/chunk-nm0pq5r6.js +0 -3
- package/dist/cli/chunk-rc668r26.js +0 -2
- package/dist/cli/chunk-w06vgba4.js +0 -3
- package/dist/cli/chunk-yzmvmt89.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{CONTRIB_ENGINE_IDS,contribEngineEntry,detectClaudeAccount,detectCodexAccount,detectCopilotAccount,detectKimiAccount,isContribEngine,pluginEngineIds}from"./chunk-
|
|
2
|
+
import{CONTRIB_ENGINE_IDS,contribEngineEntry,detectClaudeAccount,detectCodexAccount,detectCopilotAccount,detectKimiAccount,isContribEngine,pluginEngineIds}from"./chunk-9esrwvqc.js";import{TomlError,parse}from"./chunk-w7zv47mp.js";import{spawnCapture}from"./chunk-gwcneg6c.js";import{ClaudeHookAdapter,GATED_TOOL_VERBS,JsonHookAdapter,isObject,kobeHookInvocation,readSharedConfigSync,updateSharedJsonSync}from"./chunk-6tvrvekq.js";import{claudeGlobalConfigPath,copilotConfigPath,isJsonlLineWithinBound,readFirstLineBounded,readTextFileBounded,readTextFileIfRegular,vendorConfigHome,vendorWriteHomeDeps}from"./chunk-7jkf3tvr.js";import{quoteShellArgv}from"./chunk-2fypr41w.js";import{BUILTIN_VENDORS,isBuiltinVendor}from"./chunk-bq3fyc0p.js";var claudeCapabilities={},claudeIdentity={vendorId:"claude",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)}}var CLAUDE_SCREEN_MANIFEST={rules:[],composerEmpty:[{bottomLines:6,all:["\u276F"],lineRegex:["^\\s*\u276F\\s*(?:[\xB7\u2022]\\s*(?:\u2190[^\\n]*)?)?$"]}]};function trustClaudeWorktree(worktreePath,home){let deps=vendorWriteHomeDeps(home);updateSharedJsonSync(claudeGlobalConfigPath(deps.env,deps.home()),(raw)=>{if(raw===void 0)return{};let doc=JSON.parse(raw);if(!isObject(doc))throw Error("Claude trust config must be a JSON object");return doc},(doc)=>{if(doc.projects!==void 0&&!isObject(doc.projects))throw Error("Claude trust projects must be an object");let projects={...doc.projects},existing=Object.hasOwn(projects,worktreePath)?projects[worktreePath]:{};if(!isObject(existing))throw Error("Claude trust project must be an object");if(existing.hasTrustDialogAccepted===!0)return;return projects[worktreePath]={...existing,hasTrustDialogAccepted:!0,hasCompletedProjectOnboarding:!0},JSON.stringify({...doc,projects},null,2)})}function isSyntheticClaudeRecord(record){return record.isMeta===!0||record.isCompactSummary===!0}function isClaudeCommandBreadcrumb(blocks){if(blocks.length===0)return!1;for(let b of blocks){if(b.type!=="text")return!1;let t=b.text.trim();if(!t.startsWith("<command-name>")&&!t.startsWith("<command-message>")&&!t.startsWith("<local-command"))return!1}return!0}function isObject2(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function opensTurn(content){if(typeof content==="string")return content.trim().length>0;if(!Array.isArray(content))return!1;return content.some((b)=>!isObject2(b)||b.type!=="tool_result")}function num(v){return typeof v==="number"&&Number.isFinite(v)?v:0}function readUsage(v){if(!isObject2(v))return;return{input_tokens:num(v.input_tokens),output_tokens:num(v.output_tokens),cache_read_input_tokens:num(v.cache_read_input_tokens),cache_creation_input_tokens:num(v.cache_creation_input_tokens)}}function finish(draft){if(!draft.id)return null;let totals={input_tokens:0,output_tokens:0,cache_read_input_tokens:0,cache_creation_input_tokens:0};for(let u of draft.usageByMessage.values())totals.input_tokens+=u.input_tokens,totals.output_tokens+=u.output_tokens,totals.cache_read_input_tokens+=u.cache_read_input_tokens,totals.cache_creation_input_tokens+=u.cache_creation_input_tokens;return{id:draft.id,sessionId:draft.sessionId,...draft.model?{model:draft.model}:{},startedAt:draft.startedAt,endedAt:draft.endedAt,...draft.usageByMessage.size>0?{usage:totals}:{}}}function parseClaudeTurns(raw,fallbackSessionId=""){let out=[],draft=null;for(let line of raw.split(`
|
|
3
3
|
`)){let trimmed=line.trim();if(!trimmed||!isJsonlLineWithinBound(trimmed))continue;let record;try{record=JSON.parse(trimmed)}catch{continue}if(!isObject2(record)||isSyntheticClaudeRecord(record))continue;let inner=isObject2(record.message)?record.message:record,at=typeof record.timestamp==="string"?Date.parse(record.timestamp):Number.NaN;if(!Number.isFinite(at))continue;let sessionId=typeof record.sessionId==="string"?record.sessionId:fallbackSessionId;if(inner.role==="user"){if(!opensTurn(inner.content))continue;if(draft){let done=finish(draft);if(done)out.push(done)}draft={id:"",sessionId,startedAt:at,endedAt:at,usageByMessage:new Map};continue}if(inner.role!=="assistant"||!draft)continue;if(draft.endedAt=at,typeof inner.model==="string")draft.model=inner.model;let messageId=typeof inner.id==="string"?inner.id:"";if(messageId)draft.id=messageId;let usage=readUsage(inner.usage);if(usage&&messageId)draft.usageByMessage.set(messageId,usage)}if(draft){let done=finish(draft);if(done)out.push(done)}return out}async function readClaudeTurns(transcriptPath){try{let raw=await readTextFileBounded(transcriptPath);return parseClaudeTurns(raw)}catch{return[]}}var HEX_RE=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i;function parseHex(value){let match=HEX_RE.exec(value);if(!match)return[0,0,0];return[Number.parseInt(match[1],16),Number.parseInt(match[2],16),Number.parseInt(match[3],16)]}function luminance([red,green,blue]){return(red*0.2126+green*0.7152+blue*0.0722)/255}function blend(from,to,amount){return[Math.round(from[0]+(to[0]-from[0])*amount),Math.round(from[1]+(to[1]-from[1])*amount),Math.round(from[2]+(to[2]-from[2])*amount)]}function codexUserMessageBackground(background){return luminance(background)>0.5?blend(background,[0,0,0],0.04):blend(background,[255,255,255],0.12)}function transcriptRewrite(palette){let foreground=parseHex(palette.foreground),background=parseHex(palette.background),backgroundIsLight=luminance(background)>0.5;return{matchBackground:codexUserMessageBackground(background),foreground:backgroundIsLight?foreground:background,background:backgroundIsLight?background:foreground}}var codexTerminalPresentation={alternateScreenStyleRewrites:(palette)=>[transcriptRewrite(palette)]};var codexCapabilities={terminalPresentation:codexTerminalPresentation},codexIdentity={vendorId:"codex",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:"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(vendorConfigHome("codex"),"hooks.json")}class CodexHookAdapter extends JsonHookAdapter{vendor="codex";eventMap=EVENT_MAP;globalSettingsPath(){return codexHooksPath()}activityDetailFromPayload(kind,payload){if(kind==="tool-pre"||kind==="tool-post")return{tool:{...typeof payload.tool_name==="string"?{name:payload.tool_name}:{}}};if(kind==="pre-compact"||kind==="post-compact")return{compact:{trigger:payload.trigger==="manual"?"manual":"auto"}};return}sessionFromPayload(payload){if(typeof payload.session_id!=="string"||!payload.session_id)return;return{sessionId:payload.session_id,...typeof payload.transcript_path==="string"&&payload.transcript_path?{transcriptPath:payload.transcript_path}:{}}}}import{createHash}from"crypto";function createAppendParseCache(opts){let maxFiles=opts.maxFiles??8,cache=new Map;function remember(filePath,entry){if(cache.delete(filePath),cache.set(filePath,entry),cache.size>maxFiles){let oldest=cache.keys().next().value;if(oldest!==void 0)cache.delete(oldest)}}return function(filePath,raw,ctx){let stableLength=raw.lastIndexOf(`
|
|
4
4
|
`)+1,entry=cache.get(filePath),verifiedLength=Math.min(entry?.prefixLength??0,stableLength),hash=createHash("sha256").update(raw.slice(0,verifiedLength)),unchanged=entry!==void 0&&Object.is(entry.context,ctx)&&entry.prefixLength<=stableLength&&hash.copy().digest("hex")===entry.prefixHash,prefixState;if(unchanged)prefixState=entry.prefixLength<stableLength?opts.parseChunk(raw.slice(entry.prefixLength,stableLength),entry.state,ctx):entry.state;else prefixState=opts.parseChunk(raw.slice(0,stableLength),opts.initial(ctx),ctx);if(!unchanged||entry.prefixLength!==stableLength||entry.state!==prefixState)remember(filePath,{context:ctx,prefixLength:stableLength,prefixHash:hash.update(raw.slice(verifiedLength,stableLength)).digest("hex"),state:prefixState});let tail=raw.slice(stableLength);return tail.trim().length>0?opts.parseChunk(tail,prefixState,ctx):prefixState}}var sortedMessages=new WeakMap;function sortByTimestamp(messages){let hit=sortedMessages.get(messages);if(hit)return hit;let sorted=[...messages].sort((a,b)=>a.timestamp<b.timestamp?-1:a.timestamp>b.timestamp?1:0);return sortedMessages.set(messages,sorted),sorted}function normalizeCodexContent(raw){if(typeof raw==="string")return raw.length>0?[{type:"text",text:raw}]:[];if(!Array.isArray(raw))return[];let blocks=[];for(let item of raw){if(typeof item==="string"){if(item.length>0)blocks.push({type:"text",text:item});continue}if(!isObject3(item))continue;let t=typeof item.type==="string"?item.type:void 0;if(t==="input_text"||t==="output_text"){let text=typeof item.text==="string"?item.text:"";if(text.length>0)blocks.push({type:"text",text});continue}if(t)blocks.push({type:"text",text:`[codex: ${t}]`})}return blocks}function isObject3(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}function isSyntheticCodexUserRow(blocks){if(blocks.length===0)return!1;for(let b of blocks){if(b.type!=="text")return!1;let t=(b.text??"").trim();if(!isTagEnvelope(t)&&!isInstructionsEnvelope(t))return!1}return!0}var ENVELOPE_TAGS=["environment_context","recommended_plugins","user_instructions"];function isTagEnvelope(text){return ENVELOPE_TAGS.some((tag)=>text.startsWith(`<${tag}>`)&&text.endsWith(`</${tag}>`))}function isInstructionsEnvelope(text){return text.startsWith("# AGENTS.md instructions")&&text.includes("<INSTRUCTIONS>")}function codexUsageToSnapshot(usage,opts={}){let totalInput=numberOr(usage.input_tokens,0),cachedInput=numberOr(usage.cached_input_tokens,0),output=numberOr(usage.output_tokens,0),nonCachedInput=Math.max(0,totalInput-cachedInput);if(totalInput<=0&&output<=0&&cachedInput<=0)return;return{input_tokens:nonCachedInput,output_tokens:output,...cachedInput>0?{cache_read_input_tokens:cachedInput}:{},...validPositive(opts.contextWindowTokens)?{context_window_tokens:opts.contextWindowTokens}:{}}}function numberOr(v,fallback){return typeof v==="number"&&Number.isFinite(v)?v:fallback}function validPositive(v){return typeof v==="number"&&Number.isFinite(v)&&v>0}var emptyState={messages:[],latestUsage:void 0,latestUsageTimestampMs:null},cache=createAppendParseCache({initial:()=>emptyState,parseChunk:foldRolloutChunk});function parseRolloutRaw(filePath,raw,sessionId){let state=cache(filePath,raw,sessionId);return{messages:sortByTimestamp(state.messages),...state.latestUsage?{usageMetrics:state.latestUsage}:{}}}function foldRolloutChunk(chunk,prev,sessionId){let updatedMessages,writableMessages=()=>{return updatedMessages??=[...prev.messages],updatedMessages},latestUsage=prev.latestUsage,latestUsageTimestampMs=prev.latestUsageTimestampMs;for(let line of chunk.split(`
|
|
5
5
|
`)){let trimmed=line.trim();if(!trimmed)continue;if(!isJsonlLineWithinBound(trimmed))continue;let parsed;try{parsed=JSON.parse(trimmed)}catch{continue}if(!isObject4(parsed))continue;if(parsed.type==="response_item"){let payload=isObject4(parsed.payload)?parsed.payload:void 0;if(!payload)continue;let ts=typeof parsed.timestamp==="string"?parsed.timestamp:new Date().toISOString(),msg=normalizeCodexResponseItem(payload,ts,sessionId);if(msg)writableMessages().push(msg);continue}let usageFields=codexUsageFields(parsed);if(!usageFields)continue;let base=codexUsageToSnapshot(usageFields.usage,{contextWindowTokens:usageFields.contextWindow});if(!base)continue;let lastPrompt=usageFields.lastUsage?numberOr2(usageFields.lastUsage.input_tokens):0,snapshot={...base,...lastPrompt>0?{context_tokens:lastPrompt}:{}},lastUsage=usageFields.lastUsage&&codexLastUsageToMessageUsage(usageFields.lastUsage);if(lastUsage){let messages=updatedMessages??prev.messages,index=messages.findLastIndex((message2)=>message2.role==="assistant"),message=messages[index];if(message)writableMessages()[index]={...message,usage:lastUsage}}let timestampMs=typeof parsed.timestamp==="string"?parseTimestampMs(parsed.timestamp):null;if(timestampMs!==null&&(latestUsageTimestampMs===null||timestampMs>latestUsageTimestampMs))latestUsageTimestampMs=timestampMs,latestUsage=snapshot;else if(latestUsageTimestampMs===null)latestUsage=snapshot}return{messages:updatedMessages??prev.messages,latestUsage,latestUsageTimestampMs}}function codexUsageFields(parsed){if(parsed.type==="event_msg"){let payload=isObject4(parsed.payload)?parsed.payload:void 0;if(payload?.type!=="token_count")return;let info=isObject4(payload.info)?payload.info:void 0,usage=info&&isObject4(info.total_token_usage)?info.total_token_usage:void 0;if(!usage)return;let lastUsage=info&&isObject4(info.last_token_usage)?info.last_token_usage:void 0,contextWindow=typeof info?.model_context_window==="number"?info.model_context_window:void 0;return{usage,lastUsage,contextWindow}}if(parsed.type==="turn.completed"){let usage=isObject4(parsed.usage)?parsed.usage:void 0;return usage?{usage,lastUsage:usage,contextWindow:void 0}:void 0}return}function codexLastUsageToMessageUsage(usage){let totalInput=numberOr2(usage.input_tokens),cachedInput=numberOr2(usage.cached_input_tokens),output=numberOr2(usage.output_tokens);if(totalInput<=0&&output<=0&&cachedInput<=0)return;return{input_tokens:Math.max(0,totalInput-cachedInput),output_tokens:output,...cachedInput>0?{cache_read_input_tokens:cachedInput}:{}}}function numberOr2(v){return typeof v==="number"&&Number.isFinite(v)?v:0}function normalizeCodexResponseItem(payload,timestamp,sessionId){if(payload.type==="message"){let role=payload.role;if(role!=="user"&&role!=="assistant"&&role!=="system")return;let blocks=normalizeCodexContent(payload.content);if(role==="user"&&isSyntheticCodexUserRow(blocks))return;return{role,blocks,timestamp,sessionId}}if(payload.type==="reasoning")return normalizeCodexReasoning(payload,timestamp,sessionId);if(payload.type==="function_call")return normalizeCodexToolCall(payload,timestamp,sessionId,{name:stringOr(payload.name,"function_call"),input:parseMaybeJson(payload.arguments)});if(payload.type==="custom_tool_call")return normalizeCodexToolCall(payload,timestamp,sessionId,{name:stringOr(payload.name,"custom_tool_call"),input:parseMaybeJson(payload.input)});if(payload.type==="tool_search_call")return normalizeCodexToolCall(payload,timestamp,sessionId,{name:"tool_search_call",input:stripPayload(payload,["type","call_id","status"])});if(payload.type==="function_call_output"||payload.type==="custom_tool_call_output")return normalizeCodexToolResult(payload,timestamp,sessionId,parseMaybeJson(payload.output));if(payload.type==="tool_search_output")return normalizeCodexToolResult(payload,timestamp,sessionId,stripPayload(payload,["type","call_id"]));if(payload.type==="web_search_call"||payload.type==="image_generation_call"||payload.type==="local_shell_call")return normalizeSingleRecordTool(payload,timestamp,sessionId);return}function normalizeCodexReasoning(payload,timestamp,sessionId){let text=reasoningTextFromItem(payload);if(text.length===0)return;return{role:"assistant",blocks:[{type:"thinking",text}],timestamp,sessionId}}function normalizeCodexToolCall(payload,timestamp,sessionId,args){let callId=typeof payload.call_id==="string"?payload.call_id:void 0;if(!callId)return;return{role:"assistant",blocks:[{type:"tool_call",callId,name:args.name,input:args.input}],timestamp,sessionId}}function normalizeCodexToolResult(payload,timestamp,sessionId,output){let callId=typeof payload.call_id==="string"?payload.call_id:void 0;if(!callId)return;return{role:"user",blocks:[{type:"tool_result",callId,output,isError:!1}],timestamp,sessionId}}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(!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(`
|
|
@@ -21,9 +21,9 @@ ${TRUST_LINE}`);if(!isObject(prior.projects)||!isObject(duplicate.projects))brea
|
|
|
21
21
|
${body}
|
|
22
22
|
`:`${body}
|
|
23
23
|
`})}import path7 from"path";import{appendFile,mkdir,readdir as readdir2,stat as stat2,unlink}from"fs/promises";import path4 from"path";function normalizeClaudeContent(content){if(typeof content==="string")return content.length>0?[{type:"text",text:content}]:[];if(!Array.isArray(content))return[];let out=[];for(let block of content){if(typeof block==="string"){if(block.length>0)out.push({type:"text",text:block});continue}if(!block||typeof block!=="object")continue;let b=block;if(b.type==="text"&&typeof b.text==="string"){out.push({type:"text",text:b.text});continue}if(b.type==="tool_use"){out.push({type:"tool_call",callId:typeof b.id==="string"?b.id:"",name:typeof b.name==="string"?b.name:"",input:b.input});continue}if(b.type==="tool_result"){out.push({type:"tool_result",callId:typeof b.tool_use_id==="string"?b.tool_use_id:"",output:b.content,isError:b.is_error===!0});continue}if(b.type==="thinking"&&typeof b.thinking==="string")out.push({type:"thinking",text:b.thinking})}return out}var cache2=createAppendParseCache({initial:()=>[],parseChunk:(chunk,prev,sessionId)=>{let added=parseJsonl2(chunk,sessionId);return added.length?prev.concat(added):prev}});function parseSessionRaw(filePath,raw,sessionId){return sortByTimestamp(cache2(filePath,raw,sessionId))}function parseJsonl2(raw,sessionId){let out=[];for(let line of raw.split(`
|
|
24
|
-
`)){let trimmed=line.trim();if(!trimmed)continue;if(!isJsonlLineWithinBound(trimmed))continue;let parsed;try{parsed=JSON.parse(trimmed)}catch{continue}if(!
|
|
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(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)){if((await readWorkspace(dir,deps)).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(!
|
|
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
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(entry.workDir!==worktree)continue;let file=wirePath(entry.sessionDir),info=await deps.stat(file).catch(()=>null);if(info)matches.push({id:entry.sessionId,mtimeMs:info.mtimeMs})}return matches.sort((a,b)=>a.mtimeMs-b.mtimeMs)}async function listSessionIdsForWorktree3(worktree,deps=defaultDeps3){return(await worktreeSessionFiles(worktree,deps)).map((file)=>file.id)}async function latestTranscriptMtimeForWorktree4(worktree,deps=defaultDeps3){return(await worktreeSessionFiles(worktree,deps)).at(-1)?.mtimeMs??0}async function transcriptPath(sessionId,deps=defaultDeps3){if(!sessionId)return null;let entry=(await sessionIndex(deps)).find((e)=>e.sessionId===sessionId);if(!entry)return null;let file=wirePath(entry.sessionDir);return await deps.stat(file).then(()=>file).catch(()=>null)}var EMPTY_HISTORY={async listSessionIdsForWorktree(){return[]},async readHistory(){return[]},async transcriptPath(){return null},async latestTranscriptMtimeForWorktree(){return 0}},claudeHistoryReader={async listSessionIdsForWorktree(worktree){return[...await listSessionFilesForWorktree(worktree)].sort((a,b)=>a.mtimeMs-b.mtimeMs).map((f)=>f.sessionId)},readHistory:(sessionId)=>readHistory2(sessionId),readUsageSnapshot:(sessionId)=>readUsageSnapshot(sessionId),async transcriptPath(sessionId,worktree){return(await listSessionFilesForWorktree(worktree)).find((f)=>f.sessionId===sessionId)?.path??null},latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree2(worktree)},codexHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree(worktree),readHistory:(sessionId)=>readHistory(sessionId),readUsageSnapshot:async(sessionId)=>(await readHistoryWithMetrics(sessionId)).usageMetrics,transcriptPath:async(sessionId)=>await findRolloutFile(sessionId)??null,latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree(worktree)},copilotHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree2(worktree),readHistory:(sessionId)=>readHistory3(sessionId),readUsageSnapshot:async(sessionId)=>(await readHistoryWithMetrics2(sessionId)).usageMetrics,async transcriptPath(sessionId){let dir=await findSessionDir(sessionId);return dir?path7.join(dir,"events.jsonl"):null},latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree3(worktree)},kimiHistoryReader={listSessionIdsForWorktree:(worktree)=>listSessionIdsForWorktree3(worktree),readHistory:EMPTY_HISTORY.readHistory,transcriptPath:(sessionId)=>transcriptPath(sessionId),latestTranscriptMtimeForWorktree:(worktree)=>latestTranscriptMtimeForWorktree4(worktree)};import{existsSync}from"fs";import{mkdir as mkdir2,readFile,writeFile}from"fs/promises";import{homedir as homedir3}from"os";import{dirname,join as join2}from"path";var KIMI_HOOK_EVENT_MAP=[{event:"SessionStart",verb:"session-start"},{event:"UserPromptSubmit",verb:"turn-start"},{event:"Stop",verb:"turn-complete"},{event:"StopFailure",verb:"turn-failed"},{event:"Interrupt",verb:"turn-interrupted"},{event:"PermissionRequest",verb:"awaiting-input"},{event:"SessionEnd",verb:"session-end"},{event:"PreCompact",verb:"pre-compact"},{event:"PostCompact",verb:"post-compact"},{event:"SubagentStart",verb:"subagent-start"},{event:"SubagentStop",verb:"subagent-stop"},{event:"PreToolUse",verb:"tool-pre"},{event:"PostToolUse",verb:"tool-post"},{event:"PostToolUseFailure",verb:"tool-failed"}],KOBE_KIMI_HOOK_EVENTS=[...new Set(KIMI_HOOK_EVENT_MAP.map((e)=>e.event))],BLOCK_BEGIN="# >>> rove hooks",BLOCK_END="# <<< rove hooks",HOOK_TIMEOUT_SECONDS=10;function kimiConfigPath(home=homedir3()){return join2(vendorConfigHome("kimi",{env:(k)=>process.env[k],home:()=>home}),"config.toml")}function renderKimiHookBlock(inv=kobeHookInvocation(),opts={}){let lines=[BLOCK_BEGIN];for(let spec of KIMI_HOOK_EVENT_MAP){if(!opts.toolEvents&&GATED_TOOL_VERBS.has(spec.verb))continue;let command=quoteShellArgv([...inv,"hook",spec.verb,"--engine","kimi"]);if(lines.push("[[hooks]]"),lines.push(`event = ${JSON.stringify(spec.event)}`),spec.matcher)lines.push(`matcher = ${JSON.stringify(spec.matcher)}`);lines.push(`command = ${JSON.stringify(command)}`),lines.push(`timeout = ${HOOK_TIMEOUT_SECONDS}`),lines.push("")}return lines.push(BLOCK_END),lines.join(`
|
|
28
28
|
`)}function removeKimiHookBlock(content){let lines=content.split(`
|
|
29
29
|
`),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,6 +31,6 @@ ${body}
|
|
|
31
31
|
|
|
32
32
|
`:""}${renderKimiHookBlock(inv,opts)}
|
|
33
33
|
`}function kimiFailureDetail(payload){let type=typeof payload.error_type==="string"?payload.error_type:"",message=typeof payload.error_message==="string"?payload.error_message:"",note=type||void 0;return{failure:(()=>{if(type==="APIProviderRateLimitError"||message.includes("provider.rate_limit"))return"rate_limit";if(type==="APIProviderQuotaExhaustedError")return"rate_limit";if(message.includes("provider.auth_error"))return"billing";return"other"})(),...note?{note}:{}}}class KimiHookAdapter{vendor="kimi";supportsHooks(){return!0}globalSettingsPath(){return kimiConfigPath()}activityDetailFromPayload(kind,payload){if(kind==="turn-failed")return kimiFailureDetail(payload);if(kind==="awaiting-input")return{waiting:"permission"};if(kind==="tool-pre"||kind==="tool-post"||kind==="tool-failed")return{tool:{...typeof payload.tool_name==="string"?{name:payload.tool_name}:{}}};return}sessionFromPayload(payload){if(typeof payload.session_id!=="string"||!payload.session_id)return;return{sessionId:payload.session_id}}async installActivityHooks(settingsFilePath,opts={}){if(!existsSync(dirname(settingsFilePath)))return;await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!0,void 0,opts))}async removeActivityHooks(settingsFilePath){if(!existsSync(settingsFilePath))return;await editTomlConfig(settingsFilePath,(cur)=>mergeKimiHooks(cur,!1))}supportsWorktreeSync(){return!1}async removeWorktreeSyncHook(){}async removeWorktreeWatchHook(){}}async function editTomlConfig(path8,transform){try{let current="";try{current=await readFile(path8,"utf8")}catch(error){if(!(error&&typeof error==="object"&&("code"in error)&&error.code==="ENOENT"))return}let next=transform(current);if(next===current)return;await mkdir2(dirname(path8),{recursive:!0}),await writeFile(path8,next)}catch{}}var KIMI_SCREEN_MANIFEST={rules:[{state:"blocked",all:["\u21B5 confirm"],any:["approve","reject","revise"]},{state:"blocked",all:["\u2191\u2193 navigate","esc exit"]},{state:"blocked",all:["\u2191\u2193 select","esc cancel"]},{state:"working",lineRegex:["^\\s*(\uD83C\uDF15|\uD83C\uDF16|\uD83C\uDF17|\uD83C\uDF18|\uD83C\uDF11|\uD83C\uDF12|\uD83C\uDF13|\uD83C\uDF14)","^\\s*[\\u2800-\\u28FF]+\\s*(thinking|working|using )"]}],composerEmpty:[{bottomLines:2,all:[">"],lineRegex:["^\\s*\u2502?\\s*>\\s*[\u2026]?\\s*\u2502?\\s*$"]}]};import{createHash as createHash2}from"crypto";import{mkdirSync as mkdirSync2,realpathSync,writeFileSync as writeFileSync2}from"fs";import path8 from"path";function resolvedWorktree(worktreePath){try{return realpathSync(worktreePath)}catch{return worktreePath}}function kimiTrustFilePath(worktreePath,home){let resolved=resolvedWorktree(worktreePath),hash=createHash2("sha256").update(resolved).digest("hex").slice(0,12),dir=path8.basename(resolved).toLowerCase();return path8.join(vendorConfigHome("kimi",vendorWriteHomeDeps(home)),"workspace-trust",`wd_${dir}_${hash}`)}function trustKimiWorktree(worktreePath,home){let file=kimiTrustFilePath(worktreePath,home);mkdirSync2(path8.dirname(file),{recursive:!0,mode:448});try{writeFileSync2(file,JSON.stringify({root:resolvedWorktree(worktreePath),trustedAt:Date.now()}),{mode:384,flag:"wx"})}catch(error){if(!(error instanceof Error&&("code"in error)&&error.code==="EEXIST"))throw error}}import{stat as stat5}from"fs/promises";class EngineTurnDetector{supportsCompletionMarkers(){return!0}async latestCompletion(worktree){return(await this.latestActivity(worktree)).marker}async latestActivityInFile(_transcriptPath){return null}}function createEngineTurnDetector(vendor){return engineEntry(vendor).createTurnDetector()}var statFile=(path9)=>stat5(path9).catch(()=>null);function completionReader(deps,parse2){let cache3=new Map;return async(path9,knownMtime)=>{let info=deps.statFile?await deps.statFile(path9):null;if(deps.statFile&&!info)return null;let mtimeMs=info?.mtimeMs??knownMtime??await(deps.statMtimeMs??(async(p)=>(await statFile(p))?.mtimeMs??0))(path9);if(!info&&knownMtime===void 0&&mtimeMs===0)return null;let key=info?`${info.dev}:${info.ino}:${info.size}:${info.mtimeMs}:${info.ctimeMs}`:String(mtimeMs),hit=cache3.get(path9);if(mtimeMs>0&&hit?.key===key)return hit.scan;let raw;try{raw=await deps.readFile(path9)}catch{return cache3.delete(path9),null}if(raw===null)return cache3.delete(path9),null;let scan={marker:parse2(raw,path9,mtimeMs),mtimeMs};if(cache3.delete(path9),cache3.set(path9,{key,scan}),cache3.size>8){let oldest=cache3.keys().next().value;if(oldest!==void 0)cache3.delete(oldest)}return scan}}var defaultClaudeDeps={listSessionFiles:(worktree)=>listSessionFilesForWorktree(worktree),readFile:readTextFileIfRegular,statFile};class ClaudeTurnDetector extends EngineTurnDetector{deps;vendor="claude";readCompletion;constructor(deps=defaultClaudeDeps){super();this.deps=deps;this.readCompletion=completionReader(deps,latestClaudeCompletionMarkerFromJsonl)}async latestActivity(worktree){let files=await this.deps.listSessionFiles(worktree),mtimeMs=files[0]?.mtimeMs??0,latest=null;for(let file of files.slice(0,4)){let marker=(await this.readCompletion(file.path,file.mtimeMs))?.marker;if(marker&&(!latest||marker.timestampMs>latest.timestampMs))latest=marker}return{marker:latest,mtimeMs}}latestActivityInFile(transcriptPath2){return this.readCompletion(transcriptPath2)}}var defaultCodexDeps={findLatestRollout:(worktree)=>findLatestRolloutForWorktree(worktree),readFile:readTextFileIfRegular,statFile};class CodexTurnDetector extends EngineTurnDetector{deps;vendor="codex";readCompletion;constructor(deps=defaultCodexDeps){super();this.deps=deps;this.readCompletion=completionReader(deps,latestCodexCompletionMarkerFromJsonl)}latestActivityInFile(transcriptPath2){return this.readCompletion(transcriptPath2)}async latestActivity(worktree){if(!worktree)return{marker:null,mtimeMs:0};let found=await this.deps.findLatestRollout(worktree);return found?await this.readCompletion(found.path,found.mtimeMs)??{marker:null,mtimeMs:0}:{marker:null,mtimeMs:0}}}class UnknownTurnDetector extends EngineTurnDetector{vendor;constructor(vendor){super();this.vendor=vendor}supportsCompletionMarkers(){return!1}async latestActivity(){return{marker:null,mtimeMs:0}}}var CLAUDE_TURN_END_STOP_REASONS=new Set(["end_turn","stop_sequence","max_tokens","refusal"]);function latestClaudeCompletionMarkerFromJsonl(raw,sourceId="claude",fallbackMtimeMs=0){let latest=null,lineNo=0;for(let line of raw.split(`
|
|
34
|
-
`)){lineNo++;let record=parseJsonLine(line);if(!record)continue;let inner=
|
|
35
|
-
`)){lineNo++;let record=parseJsonLine(line);if(!record||!isCodexCompletionRecord(record))continue;let timestampMs=timestampFromRecord(record,0),marker={id:`codex:${sourceId}:${timestampMs}:${lineNo}`,timestampMs,source:"codex"};if(!latest||marker.timestampMs>=latest.timestampMs)latest=marker}return latest}function parseJsonLine(line){if(!isJsonlLineWithinBound(line))return null;let trimmed=line.trim();if(!trimmed)return null;try{let parsed=JSON.parse(trimmed);return
|
|
34
|
+
`)){lineNo++;let record=parseJsonLine(line);if(!record)continue;let inner=isObject8(record.message)?record.message:record;if(inner.role!=="assistant")continue;if(typeof inner.stop_reason!=="string")continue;if(!CLAUDE_TURN_END_STOP_REASONS.has(inner.stop_reason))continue;let timestampMs=timestampFromRecord(record,fallbackMtimeMs),marker={id:`claude:${sourceId}:${timestampMs}:${lineNo}`,timestampMs,source:"claude"};if(!latest||marker.timestampMs>=latest.timestampMs)latest=marker}return latest}var CODEX_ROLLOUT_DONE_EVENTS=new Set(["task_complete","turn_complete","turn_aborted"]);function isCodexCompletionRecord(record){if(record.type==="turn.completed")return!0;if(record.type!=="event_msg")return!1;let payload=isObject8(record.payload)?record.payload:void 0;return typeof payload?.type==="string"&&CODEX_ROLLOUT_DONE_EVENTS.has(payload.type)}function latestCodexCompletionMarkerFromJsonl(raw,sourceId="codex"){let latest=null,lineNo=0;for(let line of raw.split(`
|
|
35
|
+
`)){lineNo++;let record=parseJsonLine(line);if(!record||!isCodexCompletionRecord(record))continue;let timestampMs=timestampFromRecord(record,0),marker={id:`codex:${sourceId}:${timestampMs}:${lineNo}`,timestampMs,source:"codex"};if(!latest||marker.timestampMs>=latest.timestampMs)latest=marker}return latest}function parseJsonLine(line){if(!isJsonlLineWithinBound(line))return null;let trimmed=line.trim();if(!trimmed)return null;try{let parsed=JSON.parse(trimmed);return isObject8(parsed)?parsed:null}catch{return null}}function timestampFromRecord(record,fallback){let ts=typeof record.timestamp==="string"?Date.parse(record.timestamp):Number.NaN;return Number.isFinite(ts)?ts:fallback}function isObject8(v){return typeof v==="object"&&v!==null&&!Array.isArray(v)}var BUILTIN_ENGINES={claude:{vendor:"claude",builtin:!0,displayName:claudeIdentity.shortName,defaultCommand:["claude"],history:claudeHistoryReader,detectAccount:(deps)=>detectClaudeAccount(deps),createHookAdapter:()=>new ClaudeHookAdapter,createTurnDetector:()=>new ClaudeTurnDetector,capabilities:claudeCapabilities,identity:claudeIdentity,trustWorktree:trustClaudeWorktree,terminalTitle:{ownsStatus:!0,statusPrefixes:["\u2733","\u2802","\u2810","\u25D0","\u25D1"],workingPrefixes:["\u2802","\u2810","\u25D0","\u25D1"]},sessionIdentity:{pinFlag:"--session-id",sessionControlFlags:["--session-id","--resume","-r","--continue","-c","--from-pr"],resumeArgv:(base,id)=>[...base,"--resume",id],forkArgv:(base,sourceId,newId)=>{let forked=[...base,"--resume",sourceId,"--fork-session"];return newId?[...forked,"--session-id",newId]:forked}},quotaUsage:()=>fetchClaudeQuotaUsage(),readTurns:readClaudeTurns,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(){}}
|
|
36
36
|
export{createEngineHookAdapter,createEngineTurnDetector,engineEntry,identifiableEngineIds,supportsStructuredHistory,engineStatusPrefixes,stripEngineStatusPrefix,engineTitleTurnHint,engineSessionIdFromTitle,isEnginePlaceholderTitle,getCapabilities,vendorsWithQuotaProbe,vendorsWithTurnReader};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{ensureGlobalKobeHooks,readTextWithTimeout,runHookSubcommand}from"./chunk-ea0tf083.js";import"./chunk-3e5n28t6.js";import"./chunk-r2pztgm6.js";import"./chunk-38272eqv.js";import"./chunk-jvxh93nz.js";import"./chunk-tngnng9q.js";import"./chunk-gyc4fj15.js";import"./chunk-0wnfq5sx.js";import"./chunk-7j5372wb.js";import"./chunk-mnqxgvyb.js";import"./chunk-07m61r5j.js";import"./chunk-9esrwvqc.js";import"./chunk-w7zv47mp.js";import"./chunk-gwcneg6c.js";import"./chunk-6tvrvekq.js";import"./chunk-7jkf3tvr.js";import"./chunk-2fypr41w.js";import"./chunk-1kz2syvp.js";import"./chunk-j75axe29.js";import"./chunk-k1qe5qqa.js";import"./chunk-xy8be792.js";import"./chunk-ayhhgfsz.js";import"./chunk-2brn8e1y.js";import"./chunk-3wj69b0a.js";import"./chunk-ch9b1d5y.js";import"./chunk-bq3fyc0p.js";import"./chunk-mv7ptt5w.js";import"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";export{runHookSubcommand,readTextWithTimeout,ensureGlobalKobeHooks};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{applyFixes,daemonRestartFix,defaultFixRuntime,engineTabsManualFix,humanOnlyFix,killOrphansManualFix,noEngineFix,probeEngines,probeGit,reinstallManualFix,resetManualFix,skillInstallFix,spawnHelperFix}from"./chunk-
|
|
2
|
+
import{applyFixes,daemonRestartFix,defaultFixRuntime,engineTabsManualFix,humanOnlyFix,killOrphansManualFix,noEngineFix,probeEngines,probeGit,reinstallManualFix,resetManualFix,skillInstallFix,spawnHelperFix}from"./chunk-yv913can.js";import{formatBytes}from"./chunk-my20q579.js";import"./chunk-ftpbjbg9.js";import"./chunk-97h1gbh8.js";import"./chunk-2qkj3wsg.js";import"./chunk-41ahvk51.js";import{kobeSkillState,skillInstallCommand}from"./chunk-bpkg51p5.js";import{inspectLegacyTmux,legacyTmuxDoctorLines}from"./chunk-dqndd97s.js";import"./chunk-rz8zs7j8.js";import"./chunk-h4n8ffqy.js";import"./chunk-vyb5a2rh.js";import"./chunk-r2pztgm6.js";import"./chunk-38272eqv.js";import"./chunk-5f80ggc3.js";import{CURRENT_VERSION,package_default}from"./chunk-zk9yzb09.js";import{resolveNodeBinary}from"./chunk-0zsechc5.js";import"./chunk-k43kf7qa.js";import"./chunk-1cjd7h8p.js";import"./chunk-b99tf0jr.js";import"./chunk-y9xr3c66.js";import{t}from"./chunk-gs8kf0me.js";import"./chunk-tp48wamv.js";import"./chunk-sdyzxayr.js";import"./chunk-jvxh93nz.js";import{isStaleInstallError,resolveKobeSpawn}from"./chunk-tngnng9q.js";import"./chunk-gyc4fj15.js";import{KobeDaemonClient}from"./chunk-0wnfq5sx.js";import{isForeignDaemonHome}from"./chunk-7j5372wb.js";import"./chunk-mnqxgvyb.js";import"./chunk-7027e3rb.js";import"./chunk-07m61r5j.js";import"./chunk-9esrwvqc.js";import"./chunk-w7zv47mp.js";import"./chunk-gwcneg6c.js";import"./chunk-6tvrvekq.js";import"./chunk-7jkf3tvr.js";import"./chunk-2fypr41w.js";import"./chunk-1kz2syvp.js";import"./chunk-j75axe29.js";import{readableLegacyIndexPath}from"./chunk-k1qe5qqa.js";import"./chunk-xy8be792.js";import"./chunk-ayhhgfsz.js";import"./chunk-2brn8e1y.js";import"./chunk-3wj69b0a.js";import{homeDir,kvStatePath,roveStateDir}from"./chunk-ch9b1d5y.js";import"./chunk-bq3fyc0p.js";import{readPidFile}from"./chunk-mv7ptt5w.js";import{activeCliName}from"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import{LEGACY_KOBE_STATE_DIR_BASENAME}from"./chunk-g56kvet6.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import"./chunk-nyv7a76k.js";import"./chunk-rxvbm4vt.js";import{defaultDaemonLogPath,defaultDaemonPidPath,defaultDaemonSocketPath,defaultPtyHostLogPath,defaultPtyHostPidPath,defaultPtyHostSocketPath}from"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import{__require}from"./chunk-wqfp8d9w.js";import{existsSync,readFileSync as readFileSync2,statSync as statSync2}from"fs";import{join as join2}from"path";var MIN_BUN_VERSION=package_default.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0";function parseBunVersion(raw){return raw.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function isBunAtLeast(raw,minimum=MIN_BUN_VERSION){let found=parseBunVersion(raw),floor=parseBunVersion(minimum);if(!found||!floor)return!0;let a=found.split(".").map(Number),b=floor.split(".").map(Number);for(let i=0;i<3;i++){let av=a[i]??0,bv=b[i]??0;if(av!==bv)return av>bv}return!0}function classifyHookChannel(input){let total=0,hooked=0;for(let tabs of Object.values(input.tabs))for(let entry of Object.values(tabs))if(total++,entry.source==="hook")hooked++;if(total===0)return{kind:"no-tabs"};if(hooked===0)return{kind:"down",totalTabs:total};return{kind:"live",hookTabs:hooked,totalTabs:total}}function hookChannelDoctorLines(verdict,input,cliName){if(verdict.kind==="no-tabs")return["hooks: \u2014 no engine tabs yet (nothing to check)"];if(verdict.kind==="live")return[`hooks: \u2713 engine hook channel live (${verdict.hookTabs}/${verdict.totalTabs} tab(s) hook-sourced)`];let out=[`hooks: \u2717 NO hook events reaching the daemon (0/${verdict.totalTabs} tab(s) hook-sourced)`," badges fall back to a ~10s poll, so activity looks seconds late",` daemon socket: ${input.socketPath}`];return out.push(' \u2192 compare with an engine tab\'s own path: `ps eww -p <engine-pid> | tr " " "\\n" | grep DAEMON_SOCKET_PATH`',` \u2192 restart the engine tabs (they may hold a stale socket path), or run \`${cliName} daemon restart\``,` \u2192 debug one hook directly: \`KOBE_HOOK_DEBUG=1 echo '{}' | ${cliName} hook turn-start --engine claude\``),out}import{readdirSync,statSync}from"fs";import{createRequire}from"module";import{dirname,join}from"path";function installedSpawnHelpers(){let pkg;try{pkg=dirname(createRequire(import.meta.url).resolve("node-pty/package.json"))}catch{return[]}let prebuilds=join(pkg,"prebuilds"),arches;try{arches=readdirSync(prebuilds).filter((name)=>name.startsWith("darwin-"))}catch{return[]}let helpers=[];for(let arch of arches){let path=join(prebuilds,arch,"spawn-helper");try{helpers.push({path,executable:(statSync(path).mode&64)!==0})}catch{}}return helpers}function spawnHelperDoctorLines(helpers){let broken=helpers.filter((helper)=>!helper.executable).map((helper)=>helper.path);if(helpers.length===0)return{lines:["node-pty: ? no darwin spawn-helper found next to node-pty"],broken};if(broken.length===0)return{lines:[`node-pty: \u2713 spawn-helper executable (${helpers.length} arch)`],broken};return{lines:["node-pty: \u2717 spawn-helper is not executable \u2014 every node-pty PTY spawn fails",...broken.map((path)=>` ${path}`),` \u2192 chmod 755 ${broken.join(" ")}`],broken}}import{readFileSync}from"fs";var PTY_MARKER="KOBE_TERMINAL_PTY=1",run=async(argv)=>{try{let proc=Bun.spawn([...argv],{stdin:"ignore",stdout:"pipe",stderr:"ignore"}),[stdout,code]=await Promise.all([new Response(proc.stdout).text().catch(()=>""),proc.exited]);return{code,stdout}}catch{return{code:127,stdout:""}}};function parsePsRows(output){let rows=[];for(let line of output.split(`
|
|
3
3
|
`)){let parts=line.trim().split(/\s+/);if(parts.length<6)continue;let[pid,ppid,pgid]=[parts[0],parts[1],parts[2]].map((value)=>Number.parseInt(value??"",10)),rssKb=Number.parseInt(parts[4]??"",10);if(!Number.isFinite(pid)||!Number.isFinite(ppid)||!Number.isFinite(pgid)||!Number.isFinite(rssKb))continue;rows.push({pid,ppid,pgid,etime:parts[3]??"",rssKb,command:parts.slice(5).join(" ")})}return rows}function pidAlive(pid,rows){return rows.some((row)=>row.pid===pid)}function orphanCandidates(rows,selfPgid,liveSessionPids){return rows.filter((row)=>row.ppid===1&&row.pgid!==selfPgid&&!liveSessionPids.has(row.pgid)&&!pidAlive(row.pgid,rows))}async function markedPids(pids,deps={}){let runProbe=deps.run??run,readEnviron=deps.readEnviron??((pid)=>readFileSync(`/proc/${pid}/environ`,"utf8")),marked=new Set;if(pids.length===0)return{marked,failed:null};if((deps.platform??process.platform)==="linux"){let refused=null;for(let pid of pids)try{if(readEnviron(pid).split("\x00").includes(PTY_MARKER))marked.add(pid)}catch(err){let code=err.code;if(code!=="ENOENT"&&code!=="ESRCH")refused??=`/proc/${pid}/environ: ${code??"unreadable"}`}return{marked,failed:refused}}let result=await runProbe(["ps","eww","-o","pid=,command=","-p",pids.join(",")]);if(result.code!==0)return{marked,failed:`ps eww exited ${result.code}`};let marker=new RegExp(`(^|\\s)${PTY_MARKER}(\\s|$)`);for(let line of result.stdout.split(`
|
|
4
4
|
`)){let pid=Number.parseInt(line.trim().split(/\s+/)[0]??"",10);if(Number.isFinite(pid)&&marker.test(line))marked.add(pid)}return{marked,failed:null}}async function ownPgid(runProbe){let result=await runProbe(["ps","-o","pgid=","-p",String(process.pid)]),pgid=Number.parseInt(result.stdout.trim(),10);return Number.isFinite(pgid)?pgid:-1}async function collectOrphans(liveSessionPids,deps={}){let runProbe=deps.run??run;if((deps.platform??process.platform)==="win32")return{orphans:[],error:null};let ps=await runProbe(["ps","-A","-o","pid=,ppid=,pgid=,etime=,rss=,command="]);if(ps.code!==0)return{orphans:[],error:`could not read the process table \u2014 ps exited ${ps.code}`};let rows=parsePsRows(ps.stdout),candidates=orphanCandidates(rows,await ownPgid(runProbe),liveSessionPids),{marked,failed}=await markedPids(candidates.map((row)=>row.pid),deps);if(failed)return{orphans:[],error:`could not read process environments \u2014 ${failed}`};return{orphans:candidates.filter((row)=>marked.has(row.pid)),error:null}}function formatMb(rssKb){return`${(rssKb/1024).toFixed(0)} MB`}function orphanDoctorLines(orphans,error,cliName,killing=!1){if(error)return[`orphans: \u2717 ${error}`];if(orphans.length===0)return["orphans: \u2713 none \u2014 no processes left behind by a dead PTY session"];let totalMb=orphans.reduce((sum,row)=>sum+row.rssKb,0)/1024,lines=[`orphans: \u26A0 ${orphans.length} process(es) outlived the PTY session that spawned them (${totalMb.toFixed(0)} MB RSS)`," each is reparented to init, carries Rove's PTY marker, and its process"," group leader is gone \u2014 no live task owns them"];for(let row of[...orphans].sort((a,b)=>b.rssKb-a.rssKb))lines.push(` pid ${row.pid} (group ${row.pgid}) up ${row.etime}, ${formatMb(row.rssKb)}: ${row.command.slice(0,90)}`);if(!killing)lines.push(` \u2192 \`${cliName} doctor --kill-orphans\` ends those process groups (SIGTERM, then SIGKILL)`," read the list first: something you backgrounded from a Rove terminal and then"," closed the tab on looks exactly like a leak, and doctor cannot tell them apart");return lines}var GROUP_EXIT_GRACE_MS=2000,GROUP_POLL_MS=100;function groupAlive(pgid){try{return process.kill(-pgid,0),!0}catch(err){return err.code!=="ESRCH"}}async function killOrphanGroups(orphans){let groups=[...new Set(orphans.map((row)=>row.pgid))];for(let pgid of groups)try{process.kill(-pgid,"SIGTERM")}catch{}let deadline=Date.now()+GROUP_EXIT_GRACE_MS,survivors=groups.filter(groupAlive);while(survivors.length>0&&Date.now()<deadline)await new Promise((resolve)=>setTimeout(resolve,GROUP_POLL_MS)),survivors=survivors.filter(groupAlive);for(let pgid of survivors)try{process.kill(-pgid,"SIGKILL")}catch{}return await new Promise((resolve)=>setTimeout(resolve,GROUP_POLL_MS)),{groups,survivors:survivors.filter(groupAlive)}}function multiplexerLabel(env){if(env.TMUX)return"tmux";if(env.ZELLIJ)return"zellij";if(env.STY)return"screen";return"no"}function terminalEnvLines(env){let show=(v)=>v&&v.length>0?v:"(unset)",program=env.TERM_PROGRAM?`${env.TERM_PROGRAM}${env.TERM_PROGRAM_VERSION?` v${env.TERM_PROGRAM_VERSION}`:""}`:"(unset)";return[`terminal: TERM=${show(env.TERM)} TERM_PROGRAM=${program} COLORTERM=${show(env.COLORTERM)}`,` running inside a multiplexer: ${multiplexerLabel(env)}`]}function parseKittyProbeReply(data){let kitty=data.match(/\x1b\[\?(\d+)u/);if(kitty?.[1]!==void 0)return{kind:"supported",flags:Number.parseInt(kitty[1],10)};if(/\x1b\[\?[\d;]*c/.test(data))return{kind:"unsupported"};return null}function kittyProbeLine(result){switch(result.kind){case"supported":return` kitty keyboard protocol: \u2713 answered (flags=${result.flags})`;case"unsupported":return[" kitty keyboard protocol: \u2717 not supported \u2014 legacy key path"," (ctrl+h/ctrl+j arrive as C0 backspace/linefeed bytes; the"," split chords ctrl+\\ and ctrl+= cannot be encoded at all)"].join(`
|
|
5
5
|
`);case"no-response":return" kitty keyboard protocol: ? no reply (terminal ignored both the kitty query and DA1)";case"skipped":return` kitty keyboard protocol: skipped (${result.reason})`}}async function probeKittyKeyboard(timeoutMs=300){let stdin=process.stdin;if(!stdin.isTTY||!process.stdout.isTTY)return{kind:"skipped",reason:"not an interactive terminal"};let wasRaw=stdin.isRaw===!0,buffer="";return await new Promise((resolve)=>{let done=!1,finish=(result)=>{if(done)return;if(done=!0,clearTimeout(timer),stdin.off("data",onData),stdin.pause(),!wasRaw)stdin.setRawMode(!1);resolve(result)},onData=(chunk)=>{buffer+=chunk.toString("latin1");let decided=parseKittyProbeReply(buffer);if(decided)finish(decided)},timer=setTimeout(()=>finish({kind:"no-response"}),timeoutMs);stdin.setRawMode(!0),stdin.resume(),stdin.on("data",onData),process.stdout.write("\x1B[?u\x1B[c")})}async function terminalDoctorLines(){return[...terminalEnvLines(process.env),kittyProbeLine(await probeKittyKeyboard())]}var CLI_NAME=activeCliName();function isProcessAlive(pid){try{return process.kill(pid,0),!0}catch(err){return err.code==="EPERM"}}async function requestIfReachable(socketPath,name){let client=new KobeDaemonClient(socketPath);try{return await client.request(name,{})}catch{return null}finally{client.close()}}function fmtDuration(ms){let seconds=Math.floor(ms/1000);if(seconds<60)return`${seconds}s`;let minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m ${seconds%60}s`;return`${Math.floor(minutes/60)}h ${minutes%60}m`}function describeFile(path){try{let stat=statSync2(path);return`present (${formatBytes(stat.size)}, modified ${stat.mtime.toISOString()})`}catch{return"absent"}}function taskCount(path){try{let parsed=JSON.parse(readFileSync2(path,"utf8"));return Array.isArray(parsed.tasks)?parsed.tasks.length:null}catch{return null}}function tailFile(path,count){try{return readFileSync2(path,"utf8").split(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{logDaemonInfo}from"./chunk-1cjd7h8p.js";import{resolveKobeSpawn,spawnDetachedDaemon,testDaemonResponds}from"./chunk-
|
|
2
|
+
import{logDaemonInfo}from"./chunk-1cjd7h8p.js";import{resolveKobeSpawn,spawnDetachedDaemon,testDaemonResponds}from"./chunk-tngnng9q.js";import{stopDaemonProcess}from"./chunk-gyc4fj15.js";import{KobeDaemonClient}from"./chunk-0wnfq5sx.js";import{isProcessAlive,readPidFile}from"./chunk-mv7ptt5w.js";import{defaultPtyHostLogPath,defaultPtyHostPidPath,defaultPtyHostSocketPath}from"./chunk-mcdv19rs.js";import{spawn}from"child_process";import{existsSync}from"fs";import{rename,rm}from"fs/promises";import{basename,delimiter,dirname,join,resolve}from"path";import{fileURLToPath}from"url";var PTY_HOST_START_ARGS=["pty-host"],PTY_HOST_NODE_BUNDLE="pty-host-node.mjs",PTY_HOST_NODE_DEV_CACHE="../../.cache/pty-host-node.mjs",PTY_HOST_NODE_ENTRY="../daemon/pty-host-node-entry.ts";function resolveNodeBinary(env=process.env,exists=existsSync,platform=process.platform){let dirs=(env.PATH??env.Path??"").split(delimiter).filter((dir)=>dir.length>0),suffixes=platform==="win32"?(env.PATHEXT??".EXE;.CMD;.BAT").split(";").filter((ext)=>ext.length>0):[""];for(let dir of dirs)for(let suffix of suffixes){let candidate=join(dir,`node${suffix}`);if(exists(candidate))return candidate}return null}async function bundleWithBun(entry,outFile,io){let{build,rename:move,discard}=io??{build:(config)=>Bun.build(config),rename,discard:(path)=>rm(path,{force:!0})},staging=`${outFile}.${process.pid}.tmp`,built=await build({entrypoints:[entry],outdir:dirname(staging),target:"node",format:"esm",naming:basename(staging),external:["node-pty"]});if(!built.success)return await discard(staging).catch(()=>{}),built;return await move(staging,outFile),built}async function resolveNodePtyHostSpawn(deps={}){let platform=deps.platform??process.platform;if(platform!=="win32")return null;let here=deps.moduleDir??dirname(fileURLToPath(import.meta.url)),exists=deps.exists??existsSync,bundle=deps.bundle??bundleWithBun,node=resolveNodeBinary(deps.env??process.env,exists,platform);if(!node)throw Error("Rove: the Windows PTY host runs under node, but no node was found on PATH. "+"Install Node.js (https://nodejs.org) and restart Rove \u2014 engine and terminal sessions cannot start without it.");let packaged=resolve(here,PTY_HOST_NODE_BUNDLE);if(exists(packaged))return[node,packaged];let entry=resolve(here,PTY_HOST_NODE_ENTRY);if(!exists(entry))throw Error(`Rove: no Windows PTY host found (looked for ${packaged} and ${entry})`);let cache=resolve(here,PTY_HOST_NODE_DEV_CACHE),built=await bundle(entry,cache);if(!built.success)throw Error(`Rove: could not build the Windows PTY host \u2014 ${built.logs.map(String).join("; ")}`);return[node,cache]}var BUSY_PTY_HOST_GRACE_MS=15000;async function liveChildCount(pid){try{let proc=spawn("/bin/ps",["-A","-o","ppid="],{stdio:["ignore","pipe","ignore"]});return(await new Promise((done)=>{let out="";proc.stdout.on("data",(chunk)=>{out+=String(chunk)}),proc.on("close",()=>done(out)),proc.on("error",()=>done(""))})).split(`
|
|
3
3
|
`).filter((row)=>Number(row.trim())===pid).length}catch{return 0}}async function ensurePtyHostReachable(){let socketPath=defaultPtyHostSocketPath();if(await testDaemonResponds(socketPath))return socketPath;let hostPid=await readPidFile(defaultPtyHostPidPath());if(hostPid!==null&&hostPid!==process.pid&&isProcessAlive(hostPid)){let deadline2=Date.now()+BUSY_PTY_HOST_GRACE_MS;while(Date.now()<deadline2){if(await new Promise((resolveTimer)=>setTimeout(resolveTimer,250)),await testDaemonResponds(socketPath))return socketPath;if(!isProcessAlive(hostPid))break}if(isProcessAlive(hostPid)){let sessions=await liveChildCount(hostPid);if(sessions>0)throw Error(`rove: the pty host (pid ${hostPid}) is not answering but still holds ${sessions} live session(s) \u2014 refusing to restart it, which would kill every engine running in them. Inspect it with \`rove api pty-list\`, or kill ${hostPid} yourself once you have accepted losing those sessions.`)}}await stopDaemonProcess(socketPath,defaultPtyHostPidPath()).catch(()=>{});let[command,...args]=await resolveNodePtyHostSpawn()??resolveKobeSpawn(PTY_HOST_START_ARGS);spawnDetachedDaemon(command??"",args,process.env,defaultPtyHostLogPath());let deadline=Date.now()+5000;while(Date.now()<deadline){if(await testDaemonResponds(socketPath))return socketPath;await new Promise((resolveTimer)=>setTimeout(resolveTimer,100))}throw Error(`rove: pty host did not start (or stayed wedged) at ${socketPath}`)}async function sweepPtyHostSessions(liveTaskIds,homeDir){let client=new KobeDaemonClient(defaultPtyHostSocketPath(homeDir));try{await client.connect();let{sessions}=await client.request("pty.list"),currentTasks;for(let session of sessions){if(!currentTasks){let ids=liveTaskIds();if(ids===null)return;currentTasks=new Set(ids)}if(currentTasks.has(session.key.split("::")[0]??session.key))continue;if(!session.generation){logDaemonInfo("pty-sweep",`skipped ${session.key}: host has no session generation; restart it when sessions can be interrupted`);continue}await client.request("pty.kill",{key:session.key,expectedGeneration:session.generation}),currentTasks=void 0}}catch{}finally{client.close()}}async function ptyHostHasLiveSessions(homeDir){let client=new KobeDaemonClient(defaultPtyHostSocketPath(homeDir));try{await client.connect();let result=await client.request("pty.list");if(!Array.isArray(result.sessions)||result.sessions.some((s)=>typeof s.alive!=="boolean"))return null;return result.sessions.some((s)=>s.alive)}catch(err){if(err instanceof Error&&"code"in err&&(err.code==="ENOENT"||err.code==="ECONNREFUSED")){let pid=await readPidFile(defaultPtyHostPidPath(homeDir));return pid!==null&&isProcessAlive(pid)?null:!1}return null}finally{client.close()}}
|
|
4
4
|
export{resolveNodeBinary,ensurePtyHostReachable,sweepPtyHostSessions,ptyHostHasLiveSessions};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{API_SCHEMA_VERSION,API_VERBS,VERBS,VERB_GROUPS,VerbArgs,apiUsage,buildCountPlan,defaultApiRuntime,deliverPrompt,findVerb,fullSchema,parseAgentsSpec,parseFlags,schemaIndex,takeIdentityWarning,unknownVerbError,validateAgainstSpec,verbHelp,verbSchema}from"./chunk-
|
|
2
|
+
import{API_SCHEMA_VERSION,API_VERBS,VERBS,VERB_GROUPS,VerbArgs,apiUsage,buildCountPlan,defaultApiRuntime,deliverPrompt,findVerb,fullSchema,parseAgentsSpec,parseFlags,schemaIndex,takeIdentityWarning,unknownVerbError,validateAgainstSpec,verbHelp,verbSchema}from"./chunk-mw1x9nh0.js";import{ensurePluginEnginesLoaded}from"./chunk-ttd78mrr.js";import{openDaemonSession}from"./chunk-yrwkh92f.js";import"./chunk-ep7exzsb.js";import"./chunk-3e5n28t6.js";import"./chunk-r05r01nv.js";import"./chunk-b3pxf5xd.js";import"./chunk-r2pztgm6.js";import"./chunk-38272eqv.js";import"./chunk-5f80ggc3.js";import"./chunk-qkehg2c1.js";import"./chunk-zk9yzb09.js";import"./chunk-msr1xtay.js";import{ApiError,splitDaemonCode}from"./chunk-ywcx78mv.js";import"./chunk-bt5s6ft2.js";import"./chunk-fex98vjg.js";import"./chunk-dx4xyegr.js";import"./chunk-bkba9c4n.js";import"./chunk-g2advs8t.js";import"./chunk-0zsechc5.js";import"./chunk-k43kf7qa.js";import"./chunk-7q67dz4c.js";import"./chunk-1cjd7h8p.js";import"./chunk-b99tf0jr.js";import"./chunk-xcgb5q15.js";import"./chunk-hape5vwj.js";import"./chunk-y9xr3c66.js";import"./chunk-amt0tw20.js";import"./chunk-gs8kf0me.js";import"./chunk-tp48wamv.js";import"./chunk-sdyzxayr.js";import"./chunk-zqfbyq0a.js";import"./chunk-jvxh93nz.js";import"./chunk-tngnng9q.js";import"./chunk-gyc4fj15.js";import"./chunk-0wnfq5sx.js";import"./chunk-7j5372wb.js";import"./chunk-mnqxgvyb.js";import"./chunk-7027e3rb.js";import"./chunk-07m61r5j.js";import"./chunk-9esrwvqc.js";import"./chunk-w7zv47mp.js";import"./chunk-gwcneg6c.js";import"./chunk-6tvrvekq.js";import"./chunk-7jkf3tvr.js";import"./chunk-2fypr41w.js";import"./chunk-1kz2syvp.js";import"./chunk-j75axe29.js";import"./chunk-k1qe5qqa.js";import"./chunk-xy8be792.js";import"./chunk-ayhhgfsz.js";import{errorMessage}from"./chunk-2brn8e1y.js";import"./chunk-3wj69b0a.js";import"./chunk-ch9b1d5y.js";import"./chunk-bq3fyc0p.js";import"./chunk-mv7ptt5w.js";import"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import"./chunk-rxvbm4vt.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";function emit(value,pretty){let warning=takeIdentityWarning(),payload=warning&&value&&typeof value==="object"&&!Array.isArray(value)?{...value,identityWarning:warning}:value,text=pretty?JSON.stringify(payload,null,2):JSON.stringify(payload);process.stdout.write(`${text}
|
|
3
3
|
`)}function fail(message,code,exitCode=1,data){process.stderr.write(`${JSON.stringify({error:{message,code,...data}})}
|
|
4
4
|
`),process.exit(exitCode)}function makeContext(verb,flags,client,runtime){return{args:new VerbArgs(verb,flags),client,runtime}}var USAGE_ERROR_CODES=new Set(["BAD_VERB","UNKNOWN_VERB","BAD_FLAG","MISSING_FLAG","MISSING_VERB","BAD_DAEMON"]);function toApiError(err){if(err instanceof ApiError)return err;let message=errorMessage(err);if(/task not found/i.test(message))return new ApiError(message,"TASK_NOT_FOUND",{hint:"that task id does not exist (deleted or mistyped) \u2014 list live tasks and retry with a real id",nextCommandArgs:["api","list"]});if(/unknown daemon request:/i.test(message))return versionSkewError(message);let coded=splitDaemonCode(message);if(coded)return new ApiError(coded.rest,coded.code);return new ApiError(message,"RPC_ERROR")}function versionSkewError(message){return new ApiError(message,"DAEMON_VERSION_SKEW",{hint:"the running daemon is a different build than this CLI, so it does not serve this verb \u2014 restart the daemon to pick up this build, then retry (if the verb is gone for good, `rove api schema` lists what this daemon actually serves)",nextCommandArgs:["daemon","restart"]})}async function invokeVerb(verbName,argv,deps){let verb=findVerb(verbName);if(!verb)throw unknownVerbError(verbName);let booleanFlags=new Set(verb.flags.filter((f)=>f.type==="bool").map((f)=>f.name)),parsed=parseFlags(argv,booleanFlags);validateAgainstSpec(verb,parsed.flags);try{return await verb.handler(makeContext(verb,parsed.flags,deps.client,deps.runtime??defaultApiRuntime))}catch(err){throw toApiError(err)}}async function runApiSubcommand(argv){let[verbName,...rest]=argv;if(!verbName||verbName==="--help"||verbName==="-h"||verbName==="help"){if(!verbName)fail(apiUsage(),"MISSING_VERB",2);process.stdout.write(`${apiUsage()}
|
|
5
5
|
`);return}ensurePluginEnginesLoaded();let verb=findVerb(verbName);if(!verb){let err=unknownVerbError(verbName);fail(`${err.message}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{PS_PROBE_TIMEOUT_MS,PsProbeUnavailableError,engineProcessIn,foregroundEngine,foregroundEngineIn,hasAncestor,parsePsSnapshot,psSnapshot,psSnapshotWith,vendorFromArgv}from"./chunk-7027e3rb.js";import"./chunk-07m61r5j.js";import"./chunk-9esrwvqc.js";import"./chunk-w7zv47mp.js";import"./chunk-gwcneg6c.js";import"./chunk-6tvrvekq.js";import"./chunk-7jkf3tvr.js";import"./chunk-2fypr41w.js";import"./chunk-1kz2syvp.js";import"./chunk-j75axe29.js";import"./chunk-k1qe5qqa.js";import"./chunk-xy8be792.js";import"./chunk-ayhhgfsz.js";import"./chunk-2brn8e1y.js";import"./chunk-3wj69b0a.js";import"./chunk-ch9b1d5y.js";import"./chunk-bq3fyc0p.js";import"./chunk-mv7ptt5w.js";import"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";export{vendorFromArgv,psSnapshotWith,psSnapshot,parsePsSnapshot,hasAncestor,foregroundEngineIn,foregroundEngine,engineProcessIn,PsProbeUnavailableError,PS_PROBE_TIMEOUT_MS};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{getPersistedBool,loadStateFile,patchStateFile,readSavedRepos,updateStateFile}from"./chunk-
|
|
2
|
+
import{getPersistedBool,loadStateFile,patchStateFile,readSavedRepos,updateStateFile}from"./chunk-j75axe29.js";import{projectRejection}from"./chunk-3wj69b0a.js";import{kvStatePath}from"./chunk-ch9b1d5y.js";import{spawnSync}from"child_process";import{realpathSync}from"fs";function isRemoteRepoKey(key){return key.startsWith("ssh://")}function isRemoteProjectsEnabled(){return getPersistedBool("experimental.remoteProjects",!1)}function remoteRepoKey(host,user,port,basePath){let authority=port?`${user}@${host}:${port}`:`${user}@${host}`,base=(basePath??"").trim().replace(/\/+$/,"");if(!base)return`ssh://${authority}`;return`ssh://${authority}${base.startsWith("/")?base:`/${base}`}`}function readRemoteRepos(state){let raw=state.remoteRepos;if(!raw||typeof raw!=="object"||Array.isArray(raw))return{};return raw}function getRemoteRepoConfig(key){return readRemoteRepos(loadStateFile())[key]??null}function getRemoteRepos(){return readRemoteRepos(loadStateFile())}function addRemoteRepo(config){let key=remoteRepoKey(config.host,config.user,config.port,config.basePath),added=!1;return updateStateFile((state)=>{let repos={...readRemoteRepos(state)},legacyKey=remoteRepoKey(config.host,config.user,config.port);if(key!==legacyKey&&repos[legacyKey]?.basePath===config.basePath)key=legacyKey;repos[key]=config,state.remoteRepos=repos;let saved=readSavedRepos(state);if(added=!saved.includes(key),added)state.savedRepos=[...saved,key];return}),{key,added}}function resolveRepoRoot(absPath){if(isRemoteRepoKey(absPath))return absPath;let r=spawnSync("git",["rev-parse","--show-toplevel"],{cwd:absPath,encoding:"utf8",shell:!1});if(r.status!==0)return absPath;let top=(r.stdout??"").trim();if(!top)return absPath;try{if(realpathSync(absPath)===realpathSync(top))return absPath}catch{}return top}function isGitRepo(absPath){if(isRemoteRepoKey(absPath))return!1;let r=spawnSync("git",["rev-parse","--is-inside-work-tree"],{cwd:absPath,encoding:"utf8",shell:!1});return r.status===0&&(r.stdout??"").trim()==="true"}function resolveMainRepoRoot(absPath){if(isRemoteRepoKey(absPath))return absPath;let r=spawnSync("git",["worktree","list","--porcelain"],{cwd:absPath,encoding:"utf8",shell:!1});if(r.status!==0)return resolveRepoRoot(absPath);return(r.stdout??"").split(/\r?\n/).find((line)=>line.startsWith("worktree "))?.slice(9).trim()||resolveRepoRoot(absPath)}function statePath(){return kvStatePath()}function getSavedRepos(){return readSavedRepos(loadStateFile())}function getPersistedString(key){let value=loadStateFile()[key];return typeof value==="string"?value:void 0}function setPersistedString(key,value){patchStateFile({[key]:value})}function getCustomEngineIds(){let raw=loadStateFile().customEngineIds;if(!Array.isArray(raw))return[];return raw.filter((s)=>typeof s==="string"&&s.trim().length>0)}function getDisabledEngineIds(){let raw=loadStateFile().disabledEngineIds;if(!Array.isArray(raw))return[];return raw.filter((s)=>typeof s==="string"&&s.trim().length>0)}function addSavedRepo(absPath,opts={}){let normalized=resolveMainRepoRoot(absPath),rejected=opts.skipGate?null:projectRejection(normalized,isGitRepo,opts.intent??"explicit");if(rejected)return{added:!1,path:normalized,total:getSavedRepos().length,rejected};let result={added:!1,path:normalized,total:0};return updateStateFile((state)=>{let cur=readSavedRepos(state);if(cur.includes(normalized))return result={added:!1,path:normalized,total:cur.length},!1;state.savedRepos=[...cur,normalized],result={added:!0,path:normalized,total:cur.length+1};return}),result}function backfillSavedReposFromProjects(mainRepos){let added=[];for(let repo of mainRepos)if(addSavedRepo(repo,{intent:"explicit"}).added)added.push(repo);return added}function normalizeSavedRepos(){let cur=getSavedRepos(),seen=new Set,next=[],changed=!1;for(let p of cur){let top=resolveMainRepoRoot(p);if(top!==p)changed=!0;if(seen.has(top)){changed=!0;continue}seen.add(top),next.push(top)}if(!changed)return;patchStateFile({savedRepos:next})}function readRepoConfigs(state){let raw=state.repoConfigs;if(!raw||typeof raw!=="object"||Array.isArray(raw))return{};return raw}function coerceOverride(entry){if(!entry||typeof entry!=="object")return{};let e=entry;return{initScript:typeof e.initScript==="string"&&e.initScript.length>0?e.initScript:void 0,initPrompt:typeof e.initPrompt==="string"&&e.initPrompt.length>0?e.initPrompt:void 0}}function getRepoInitOverride(repoRoot){return coerceOverride(readRepoConfigs(loadStateFile())[resolveRepoRoot(repoRoot)])}function setRepoInitOverride(repoRoot,patch){let normalized=resolveRepoRoot(repoRoot),next={};return updateStateFile((state)=>{let configs={...readRepoConfigs(state)},cur=coerceOverride(configs[normalized]),nextScript=patch.initScript===void 0?cur.initScript:patch.initScript||void 0,nextPrompt=patch.initPrompt===void 0?cur.initPrompt:patch.initPrompt||void 0;if(next={...nextScript?{initScript:nextScript}:{},...nextPrompt?{initPrompt:nextPrompt}:{}},!next.initScript&&!next.initPrompt){let{[normalized]:_dropped,...rest}=configs;state.repoConfigs=rest}else configs[normalized]=next,state.repoConfigs=configs;return}),next}function removeSavedRepo(absPath){let result={removed:!1,path:absPath,total:0};return updateStateFile((state)=>{let cur=readSavedRepos(state);if(!cur.includes(absPath))return result={removed:!1,path:absPath,total:cur.length},!1;if(state.savedRepos=cur.filter((p)=>p!==absPath),isRemoteRepoKey(absPath)){let remotes=readRemoteRepos(state);if(absPath in remotes){let next={...remotes};delete next[absPath],state.remoteRepos=next}}result={removed:!0,path:absPath,total:cur.length-1};return}),result}
|
|
3
3
|
export{isRemoteRepoKey,isRemoteProjectsEnabled,remoteRepoKey,getRemoteRepoConfig,getRemoteRepos,addRemoteRepo,resolveRepoRoot,isGitRepo,resolveMainRepoRoot,statePath,getSavedRepos,getPersistedString,setPersistedString,getCustomEngineIds,getDisabledEngineIds,addSavedRepo,backfillSavedReposFromProjects,normalizeSavedRepos,getRepoInitOverride,setRepoInitOverride,removeSavedRepo};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{API_VERBS,RETIRED_VERBS,VERBS,VERB_ALIASES,VERB_GROUPS,findVerb,unknownVerbError}from"./chunk-mw1x9nh0.js";import"./chunk-ttd78mrr.js";import"./chunk-yrwkh92f.js";import"./chunk-ep7exzsb.js";import"./chunk-3e5n28t6.js";import"./chunk-r05r01nv.js";import"./chunk-b3pxf5xd.js";import"./chunk-r2pztgm6.js";import"./chunk-38272eqv.js";import"./chunk-5f80ggc3.js";import"./chunk-qkehg2c1.js";import"./chunk-zk9yzb09.js";import"./chunk-msr1xtay.js";import"./chunk-ywcx78mv.js";import"./chunk-bt5s6ft2.js";import"./chunk-fex98vjg.js";import"./chunk-dx4xyegr.js";import"./chunk-bkba9c4n.js";import"./chunk-g2advs8t.js";import"./chunk-0zsechc5.js";import"./chunk-k43kf7qa.js";import"./chunk-7q67dz4c.js";import"./chunk-1cjd7h8p.js";import"./chunk-b99tf0jr.js";import"./chunk-xcgb5q15.js";import"./chunk-hape5vwj.js";import"./chunk-y9xr3c66.js";import"./chunk-amt0tw20.js";import"./chunk-gs8kf0me.js";import"./chunk-tp48wamv.js";import"./chunk-sdyzxayr.js";import"./chunk-zqfbyq0a.js";import"./chunk-jvxh93nz.js";import"./chunk-tngnng9q.js";import"./chunk-gyc4fj15.js";import"./chunk-0wnfq5sx.js";import"./chunk-7j5372wb.js";import"./chunk-mnqxgvyb.js";import"./chunk-7027e3rb.js";import"./chunk-07m61r5j.js";import"./chunk-9esrwvqc.js";import"./chunk-w7zv47mp.js";import"./chunk-gwcneg6c.js";import"./chunk-6tvrvekq.js";import"./chunk-7jkf3tvr.js";import"./chunk-2fypr41w.js";import"./chunk-1kz2syvp.js";import"./chunk-j75axe29.js";import"./chunk-k1qe5qqa.js";import"./chunk-xy8be792.js";import"./chunk-ayhhgfsz.js";import"./chunk-2brn8e1y.js";import"./chunk-3wj69b0a.js";import"./chunk-ch9b1d5y.js";import"./chunk-bq3fyc0p.js";import"./chunk-mv7ptt5w.js";import"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import"./chunk-rxvbm4vt.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";export{unknownVerbError,findVerb,VERB_GROUPS,VERB_ALIASES,VERBS,RETIRED_VERBS,API_VERBS};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{BREAKING_VERSIONS,CURRENT_VERSION,compareSemver}from"./chunk-
|
|
2
|
+
import{BREAKING_VERSIONS,CURRENT_VERSION,compareSemver}from"./chunk-zk9yzb09.js";import{loadStateFile,patchStateFile}from"./chunk-j75axe29.js";import{activeCliName}from"./chunk-v0zxyqrq.js";var LAST_RUN_VERSION_KEY="app.lastRunVersion";function resetGateBlockers(lastRun,current=CURRENT_VERSION,breaking=BREAKING_VERSIONS){if(typeof lastRun!=="string"||lastRun.length===0)return[];let[lo,hi]=compareSemver(lastRun,current)<=0?[lastRun,current]:[current,lastRun];return breaking.filter((b)=>compareSemver(b,lo)>0&&compareSemver(b,hi)<=0)}function enforceResetGate(){let cliName=activeCliName(),lastRun=loadStateFile()[LAST_RUN_VERSION_KEY],blockers=resetGateBlockers(lastRun);if(blockers.length>0){let from=typeof lastRun==="string"?lastRun:"unknown";console.error([`${cliName} ${CURRENT_VERSION}: cannot start \u2014 version ${blockers.join(", ")} introduced breaking changes`,`(last run: ${from}). Your daemon/session state may be incompatible.`,"","Run:",` ${cliName} reset # stop daemon + PTY host + sessions (tasks kept)`,` ${cliName} reset --hard # additionally wipe the task index + UI state`,"","Then relaunch Rove. Worktrees are never touched."].join(`
|
|
3
3
|
`)),process.exit(1)}if(lastRun!==CURRENT_VERSION)stampResetGate()}function stampResetGate(){try{patchStateFile({[LAST_RUN_VERSION_KEY]:CURRENT_VERSION})}catch{}}
|
|
4
4
|
export{LAST_RUN_VERSION_KEY,enforceResetGate,stampResetGate};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{loadPluginRegistry,pluginConfigDir,pluginDataDir,pluginLogPath,pluginRegistryPath,pluginStateDir,pluginsRootDir}from"./chunk-38272eqv.js";import{logDaemonError}from"./chunk-1cjd7h8p.js";import{OWNER_ONLY_DIR_MODE,OWNER_ONLY_FILE_MODE}from"./chunk-
|
|
2
|
+
import{loadPluginRegistry,pluginConfigDir,pluginDataDir,pluginLogPath,pluginRegistryPath,pluginStateDir,pluginsRootDir}from"./chunk-38272eqv.js";import{logDaemonError}from"./chunk-1cjd7h8p.js";import{OWNER_ONLY_DIR_MODE,OWNER_ONLY_FILE_MODE}from"./chunk-mv7ptt5w.js";import{ROVE_STATE_DIR_BASENAME,readRoveHomeDirEnv}from"./chunk-r3k9rbwm.js";import{chmodSync}from"fs";function tighten(path,mode){try{chmodSync(path,mode)}catch{}}function tightenPluginPermissions(id,homeDir){tighten(pluginDataDir(id,homeDir),OWNER_ONLY_DIR_MODE),tighten(pluginConfigDir(id,homeDir),OWNER_ONLY_DIR_MODE),tighten(pluginStateDir(id,homeDir),OWNER_ONLY_DIR_MODE),tighten(`${pluginConfigDir(id,homeDir)}/.env`,OWNER_ONLY_FILE_MODE),tighten(pluginLogPath(id,homeDir),OWNER_ONLY_FILE_MODE)}function tightenInstalledPluginPermissions(homeDir){tighten(pluginsRootDir(homeDir),OWNER_ONLY_DIR_MODE),tighten(pluginRegistryPath(homeDir),OWNER_ONLY_FILE_MODE);for(let entry of loadPluginRegistry(homeDir).plugins)tightenPluginPermissions(entry.id,homeDir)}import{execFile as execFile2}from"child_process";import{readFile}from"fs/promises";import{homedir}from"os";import{join,resolve as resolve2}from"path";import{promisify as promisify2}from"util";import{randomUUID}from"crypto";import{mkdir,rename,writeFile}from"fs/promises";import{dirname}from"path";async function writeJsonAtomic(path,body,{mode,compact=!1}={}){await mkdir(dirname(path),{recursive:!0});let tmp=`${path}.tmp-${process.pid}-${randomUUID()}`,text=compact?JSON.stringify(body):JSON.stringify(body,null,2);await writeFile(tmp,`${text}
|
|
3
3
|
`,{encoding:"utf8",mode}),await rename(tmp,path)}var locks=new Map;function serialized(key,fn){let run=(locks.get(key)??Promise.resolve()).then(fn),settled=run.then(()=>{return},()=>{return});return locks.set(key,settled),settled.then(()=>{if(locks.get(key)===settled)locks.delete(key)}),run}import{execFile}from"child_process";import{realpath,stat}from"fs/promises";import{isAbsolute,resolve}from"path";import{promisify}from"util";var execFileAsync=promisify(execFile);async function gitCommonDir(path){let{stdout}=await execFileAsync("git",["-C",path,"rev-parse","--git-common-dir"]),dir=stdout.trim();return realpath(isAbsolute(dir)?dir:resolve(path,dir))}async function gitMainWorktree(path){let{stdout}=await execFileAsync("git",["-C",path,"worktree","list","--porcelain"]),first=stdout.split(/\r?\n/).find((line)=>line.startsWith("worktree "))?.slice(9).trim();return first?await realpath(first):null}async function gitTopLevel(path){let{stdout}=await execFileAsync("git",["-C",path,"rev-parse","--show-toplevel"]);return stdout.trim()}async function resolveRepoRoot(raw){let absolute=resolve(raw);if(!(await stat(absolute).catch(()=>null))?.isDirectory())throw Error("repoRoot does not exist");let[repoRoot,repoKey]=await Promise.all([gitMainWorktree(absolute),gitCommonDir(absolute)]);return{repoRoot,repoKey}}var execFileAsync2=promisify2(execFile2),ISSUE_STATUSES=["open","doing","hold","done"],ISSUE_NOT_FOUND_CODE="ISSUE_NOT_FOUND",ISSUE_STORE_UNREADABLE_CODE="ISSUE_STORE_UNREADABLE";function isGitNotRepositoryError(err){return(err instanceof Error?err.message:String(err)).includes("not a git repository")}function defaultIssuesStorePath(homeDir=readRoveHomeDirEnv()??homedir()){return join(homeDir,ROVE_STATE_DIR_BASENAME,"issues.json")}function isValidStatus(value){return typeof value==="string"&&ISSUE_STATUSES.includes(value)}function normalizeIssue(entry){if(entry===null||typeof entry!=="object"||Array.isArray(entry))return null;let raw=entry;if(typeof raw.id!=="number")return null;return{id:raw.id,title:typeof raw.title==="string"?raw.title:"(untitled)",status:isValidStatus(raw.status)?raw.status:"open",created:typeof raw.created==="string"?raw.created:"",body:typeof raw.body==="string"?raw.body:"",taskId:typeof raw.taskId==="string"?raw.taskId:void 0}}function emptyStore(){return{version:1,repos:{}}}function nextIdFallback(entries){let max=0;for(let entry of entries){let id=Number(entry?.id);if(Number.isFinite(id)&&id>max)max=Math.trunc(id)}return max+1}function todayStamp(){let pinned=process.env.KOBE_ISSUES_TODAY;if(pinned&&/^\d{4}-\d{2}-\d{2}$/.test(pinned))return pinned;let d=new Date,mm=String(d.getMonth()+1).padStart(2,"0"),dd=String(d.getDate()).padStart(2,"0");return`${d.getFullYear()}-${mm}-${dd}`}async function resolveRepo(raw){if(typeof raw!=="string"||raw.length===0)throw Error("repoRoot is required");try{let{repoRoot,repoKey}=await resolveRepoRoot(raw);return{repoRoot:repoRoot??await gitTopLevel(resolve2(raw)),repoKey}}catch(err){if(isGitNotRepositoryError(err))throw Error("repoRoot is not a git repository");throw err}}function unreadableCount(raw){if(raw!==null&&typeof raw==="object"&&!Array.isArray(raw))return Math.max(1,Object.keys(raw).length);return 1}function readRecord(value){let record=value,base={repoRoot:typeof record.repoRoot==="string"?record.repoRoot:"",nextId:typeof record.nextId==="number"?record.nextId:1};if(record.issues!==void 0&&!Array.isArray(record.issues))return{record:{...base,issues:[],unusable:[],unreadable:{raw:value}},dropped:unreadableCount(record.issues)};let entries=Array.isArray(record.issues)?record.issues:[],issues=entries.map(normalizeIssue).filter((issue)=>issue!==null),unusable=entries.filter((entry)=>normalizeIssue(entry)===null);return{record:{repoRoot:base.repoRoot,nextId:typeof record.nextId==="number"?record.nextId:nextIdFallback(entries),issues,unusable},dropped:unusable.length}}async function readStore(path){try{let raw=JSON.parse(await readFile(path,"utf8")),repos={},skipped=new Map;if(raw.repos&&typeof raw.repos==="object")for(let[key,value]of Object.entries(raw.repos)){if(!value||typeof value!=="object")continue;let{record,dropped}=readRecord(value);if(dropped>0){skipped.set(key,dropped);let why=record.unreadable?'"issues" is not an array':"id is not a number";logDaemonError("issues-store-read",Error(`${key}: dropped ${dropped} unreadable issue entr${dropped===1?"y":"ies"} (${why})`))}repos[key]=record}return{file:{version:1,repos},skipped}}catch(err){if(err.code==="ENOENT")return{file:emptyStore(),skipped:new Map};throw Error(`${path}: ${err instanceof Error?err.message:String(err)}`)}}function serializeRecord(record){if(record.unreadable)return record.unreadable.raw;return{repoRoot:record.repoRoot,nextId:record.nextId,issues:[...record.issues,...record.unusable]}}async function writeStore(path,store){let repos={};for(let[key,record]of Object.entries(store.repos))repos[key]=serializeRecord(record);await writeJsonAtomic(path,{version:store.version,repos})}function response(repoRoot,record,skipped=0){return{repoRoot,exists:record!==null,nextId:record?.nextId??1,issues:record?.issues??[],skipped}}class IssuesStore{path;constructor(path=defaultIssuesStorePath()){this.path=path}async list(repo){let{repoRoot,repoKey}=await resolveRepo(repo);return serialized(this.path,async()=>{let{file:store,skipped}=await readStore(this.path),record=store.repos[repoKey]??null;if(record&&!record.unreadable&&record.repoRoot!==repoRoot)record.repoRoot=repoRoot,await writeStore(this.path,store);return response(repoRoot,record,skipped.get(repoKey)??0)})}async repos(){return serialized(this.path,async()=>{let{file}=await readStore(this.path);return Object.values(file.repos).map((record)=>record.repoRoot).filter((root)=>root.length>0)})}async mirrorTaskDone(repo,taskId){let{repoRoot,repoKey}=await resolveRepo(repo);if(!taskId)return null;return serialized(this.path,async()=>{let{file:store,skipped}=await readStore(this.path),record=store.repos[repoKey];if(!record)return null;let issue=record.issues.find((i)=>i.taskId===taskId);if(!issue||issue.status==="done")return null;return issue.status="done",record.repoRoot=repoRoot,await writeStore(this.path,store),response(repoRoot,record,skipped.get(repoKey)??0)})}async unlinkTask(repo,taskId){let{repoRoot,repoKey}=await resolveRepo(repo);if(!taskId)return null;return serialized(this.path,async()=>{let{file:store,skipped}=await readStore(this.path),record=store.repos[repoKey];if(!record)return null;let issue=record.issues.find((i)=>i.taskId===taskId);if(!issue)return null;return issue.taskId=void 0,record.repoRoot=repoRoot,await writeStore(this.path,store),response(repoRoot,record,skipped.get(repoKey)??0)})}async mutate(repo,op){let{repoRoot,repoKey}=await resolveRepo(repo);if(!op||typeof op!=="object"||Array.isArray(op)||typeof op.type!=="string")throw Error("missing op");return serialized(this.path,async()=>{let{file:store,skipped}=await readStore(this.path),record=store.repos[repoKey];if(!record)record={repoRoot,nextId:1,issues:[],unusable:[]},store.repos[repoKey]=record;if(record.unreadable)throw Error(`${ISSUE_STORE_UNREADABLE_CODE}: ${repoRoot}'s record in ${this.path} has a non-array "issues" \u2014 refusing to write over stories this build cannot read`);record.repoRoot=repoRoot;let typed=op;if(typed.type==="create"){if(typeof typed.title!=="string"||typed.title.trim().length===0)throw Error("create requires a non-empty title");if(typed.body!==void 0&&typeof typed.body!=="string")throw Error("body must be a string");record.issues=[{id:record.nextId,title:typed.title,status:"open",created:todayStamp(),body:typeof typed.body==="string"?typed.body:""},...record.issues],record.nextId+=1}else if(typed.type==="setStatus"){if(typeof typed.id!=="number")throw Error("setStatus requires a numeric id");if(!isValidStatus(typed.status))throw Error(`invalid status: must be one of ${ISSUE_STATUSES.join(", ")}`);let issue=record.issues.find((i)=>i.id===typed.id);if(!issue)throw Error(`${ISSUE_NOT_FOUND_CODE}: no issue #${typed.id}`);issue.status=typed.status}else if(typed.type==="update"){if(typeof typed.id!=="number")throw Error("update requires a numeric id");if(typed.title!==void 0&&(typeof typed.title!=="string"||typed.title.trim().length===0))throw Error("title must be a non-empty string");if(typed.body!==void 0&&typeof typed.body!=="string")throw Error("body must be a string");if(typed.taskId!==void 0&&typed.taskId!==null&&(typeof typed.taskId!=="string"||typed.taskId.length===0))throw Error("taskId must be a non-empty string or null");let issue=record.issues.find((i)=>i.id===typed.id);if(!issue)throw Error(`${ISSUE_NOT_FOUND_CODE}: no issue #${typed.id}`);if(typeof typed.title==="string")issue.title=typed.title;if(typeof typed.body==="string")issue.body=typed.body;if(typed.taskId!==void 0)issue.taskId=typed.taskId===null?void 0:typed.taskId}else if(typed.type==="link"){if(typeof typed.id!=="number")throw Error("link requires a numeric id");if(typeof typed.taskId!=="string"||typed.taskId.length===0)throw Error("link requires a non-empty taskId");let issue=record.issues.find((i)=>i.id===typed.id);if(!issue)throw Error(`${ISSUE_NOT_FOUND_CODE}: no issue #${typed.id}`);issue.taskId=typed.taskId}else if(typed.type==="unlink"){if(typeof typed.id!=="number")throw Error("unlink requires a numeric id");let issue=record.issues.find((i)=>i.id===typed.id);if(!issue)throw Error(`${ISSUE_NOT_FOUND_CODE}: no issue #${typed.id}`);issue.taskId=void 0}else if(typed.type==="delete"){if(typeof typed.id!=="number")throw Error("delete requires a numeric id");let nextIssues=record.issues.filter((i)=>i.id!==typed.id);if(nextIssues.length===record.issues.length)throw Error(`${ISSUE_NOT_FOUND_CODE}: no issue #${typed.id}`);record.issues=nextIssues}else throw Error(`unknown op type: ${typed.type}`);return await writeStore(this.path,store),response(repoRoot,record,skipped.get(repoKey)??0)})}}var MONTH_NAMES=new Map([["JAN",1],["FEB",2],["MAR",3],["APR",4],["MAY",5],["JUN",6],["JUL",7],["AUG",8],["SEP",9],["OCT",10],["NOV",11],["DEC",12]]),DAY_NAMES=new Map([["SUN",0],["MON",1],["TUE",2],["WED",3],["THU",4],["FRI",5],["SAT",6]]);function fieldNumber(raw,names,field){let token=raw.toUpperCase(),named=names?.get(token);if(named!==void 0)return named;if(!/^\d+$/.test(token))throw Error(`invalid cron ${field}: ${raw}`);return Number(token)}function parseField(args){let out=new Set;for(let part of args.value.split(",")){if(part.length===0)throw Error(`invalid cron ${args.field}: ${args.value}`);let[spec,stepRaw,...extra]=part.split("/");if(extra.length>0||spec===void 0)throw Error(`invalid cron ${args.field}: ${part}`);let step=1;if(stepRaw!==void 0){if(!/^\d+$/.test(stepRaw))throw Error(`invalid cron ${args.field} step: ${part}`);if(step=Number(stepRaw),step<1)throw Error(`invalid cron ${args.field} step: ${part}`)}let lo,hi;if(spec==="*")lo=args.min,hi=args.max;else if(spec.includes("-")){let[loRaw,hiRaw,...rest]=spec.split("-");if(rest.length>0||loRaw===void 0||hiRaw===void 0)throw Error(`invalid cron ${args.field} range: ${part}`);lo=fieldNumber(loRaw,args.names,args.field),hi=fieldNumber(hiRaw,args.names,args.field)}else lo=fieldNumber(spec,args.names,args.field),hi=stepRaw===void 0?lo:args.max;if(lo<args.min||hi>args.max||lo>hi)throw Error(`cron ${args.field} out of range: ${part}`);for(let v=lo;v<=hi;v+=step)out.add(args.normalize?args.normalize(v):v)}return out}function parseCron(expression){if(expression.length>256)throw Error("cron expression is too long");let fields=expression.trim().split(/\s+/).filter(Boolean);if(fields.length!==5)throw Error(`cron expression needs 5 fields (minute hour day month weekday), got ${fields.length}`);let[minute,hour,dayOfMonth,month,dayOfWeek]=fields;return{minutes:parseField({value:minute,min:0,max:59,field:"minute"}),hours:parseField({value:hour,min:0,max:23,field:"hour"}),daysOfMonth:parseField({value:dayOfMonth,min:1,max:31,field:"day-of-month"}),months:parseField({value:month,min:1,max:12,field:"month",names:MONTH_NAMES}),daysOfWeek:parseField({value:dayOfWeek,min:0,max:7,field:"weekday",names:DAY_NAMES,normalize:(v)=>v%7}),dayOfMonthRestricted:dayOfMonth!=="*",dayOfWeekRestricted:dayOfWeek!=="*"}}function isValidCron(expression){try{return parseCron(expression),!0}catch{return!1}}function instantOf(d,hour,minute){return new Date(d.year,d.month-1,d.day,hour,minute,0,0).getTime()}function localDayOf(ms){let d=new Date(ms);return{year:d.getFullYear(),month:d.getMonth()+1,day:d.getDate()}}function shiftDay(d,delta){return localDayOf(new Date(d.year,d.month-1,d.day+delta,12,0,0,0).getTime())}function dayMatches(rule,d){if(!rule.months.has(d.month))return!1;let domMatch=rule.daysOfMonth.has(d.day),dowMatch=rule.daysOfWeek.has(new Date(d.year,d.month-1,d.day).getDay());if(rule.dayOfMonthRestricted&&rule.dayOfWeekRestricted)return domMatch||dowMatch;if(rule.dayOfMonthRestricted)return domMatch;if(rule.dayOfWeekRestricted)return dowMatch;return!0}function floorToMinute(ms){return ms-ms%60000}function sorted(values,direction){return[...values].sort((a,b)=>(a-b)*direction)}function nextCronAfter(expression,afterMs){let rule=parseCron(expression),hours=sorted(rule.hours,1),minutes=sorted(rule.minutes,1),from=new Date(floorToMinute(afterMs)+60000),day=localDayOf(from.getTime()),fromHour=from.getHours(),fromMinute=from.getMinutes();for(let i=0;i<3294;i++){if(dayMatches(rule,day))for(let hour of hours){if(hour<fromHour)continue;for(let minute of minutes){if(hour===fromHour&&minute<fromMinute)continue;let at=instantOf(day,hour,minute);if(at>afterMs)return at}}day=shiftDay(day,1),fromHour=0,fromMinute=0}throw Error(`cron expression never matches: ${expression}`)}function latestCronAtOrBefore(expression,nowMs,notBeforeMs){if(nowMs<notBeforeMs)return null;let rule=parseCron(expression),hours=sorted(rule.hours,-1),minutes=sorted(rule.minutes,-1),from=new Date(floorToMinute(nowMs)),day=localDayOf(from.getTime()),fromHour=from.getHours(),fromMinute=from.getMinutes();for(let i=0;i<3294;i++){if(instantOf(day,23,59)<notBeforeMs)return null;if(dayMatches(rule,day))for(let hour of hours){if(hour>fromHour)continue;for(let minute of minutes){if(hour===fromHour&&minute>fromMinute)continue;let at=instantOf(day,hour,minute);if(at>nowMs)continue;return at>=notBeforeMs?at:null}}day=shiftDay(day,-1),fromHour=23,fromMinute=59}return null}function countCronBetween(expression,fromMs,beforeMs,cap=500){if(!(fromMs<beforeMs))return 0;let count=0,cursor=fromMs-1;while(count<cap){let at;try{at=nextCronAfter(expression,cursor)}catch{return count}if(at>=beforeMs)return count;count+=1,cursor=at}return count}
|
|
4
4
|
export{tightenPluginPermissions,tightenInstalledPluginPermissions,writeJsonAtomic,serialized,isValidCron,nextCronAfter,latestCronAtOrBefore,countCronBetween,resolveRepoRoot,ISSUE_STATUSES,defaultIssuesStorePath,IssuesStore};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{INIT_PROMPT_FILENAME,INIT_SCRIPT_FILENAME,describeRepoInitSources,missingDependenciesCoda,resolveEngineLaunchInit,resolveRepoInit}from"./chunk-xcgb5q15.js";import"./chunk-hape5vwj.js";import"./chunk-y9xr3c66.js";import"./chunk-jvxh93nz.js";import"./chunk-07m61r5j.js";import"./chunk-9esrwvqc.js";import"./chunk-w7zv47mp.js";import"./chunk-gwcneg6c.js";import"./chunk-6tvrvekq.js";import"./chunk-7jkf3tvr.js";import"./chunk-2fypr41w.js";import"./chunk-1kz2syvp.js";import"./chunk-j75axe29.js";import"./chunk-k1qe5qqa.js";import"./chunk-xy8be792.js";import"./chunk-ayhhgfsz.js";import"./chunk-2brn8e1y.js";import"./chunk-3wj69b0a.js";import"./chunk-ch9b1d5y.js";import"./chunk-bq3fyc0p.js";import"./chunk-mv7ptt5w.js";import"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";export{resolveRepoInit,resolveEngineLaunchInit,missingDependenciesCoda,describeRepoInitSources,INIT_SCRIPT_FILENAME,INIT_PROMPT_FILENAME};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{SUBCOMMAND_VERBS,TOP_LEVEL_SUBCOMMANDS}from"./chunk-s76r56rj.js";import{activeCliName}from"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-r3k9rbwm.js";import{__require}from"./chunk-wqfp8d9w.js";async function collectSubVerbs(){let{API_VERBS}=await import("./chunk-
|
|
2
|
+
import{SUBCOMMAND_VERBS,TOP_LEVEL_SUBCOMMANDS}from"./chunk-s76r56rj.js";import{activeCliName}from"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-r3k9rbwm.js";import{__require}from"./chunk-wqfp8d9w.js";async function collectSubVerbs(){let{API_VERBS}=await import("./chunk-1pht7ydx.js"),merged={...SUBCOMMAND_VERBS,api:API_VERBS};return Object.keys(merged).sort().map((command)=>[command,merged[command]??[]])}function completionUsage(cliName){return[`Usage: ${cliName} completions <bash|zsh|fish>`,"",`Generate a shell completion script for ${cliName} and print it to stdout.`,"","Install:",` zsh source <(${cliName} completions zsh) # one-off, or in ~/.zshrc after compinit`," # or the fpath way:",` # ${cliName} completions zsh > ~/.zsh/completions/_${cliName}`," # fpath=(~/.zsh/completions $fpath) # in ~/.zshrc, BEFORE compinit"," # rm -f ~/.zcompdump && exec zsh # rebuild the completion cache",` bash ${cliName} completions bash > ~/.bash_completion.d/${cliName} # source it from ~/.bashrc`,` fish ${cliName} completions fish > ~/.config/fish/completions/${cliName}.fish`,""].join(`
|
|
3
3
|
`)}function generateBashCompletions(cliName,subVerbs){let subcommands=TOP_LEVEL_SUBCOMMANDS.join(" "),fn=`_${cliName}`;return[`# ${cliName} bash completions`,`# Source: ${cliName} completions bash`,"",`${fn}() {`," local cur prev"," COMPREPLY=()",' cur="${COMP_WORDS[COMP_CWORD]}"',' prev="${COMP_WORDS[COMP_CWORD-1]}"'," if [[ ${COMP_CWORD} -eq 1 ]]; then",` COMPREPLY=( $(compgen -W "${subcommands}" -- "\${cur}") )`," return"," fi"," if [[ ${COMP_CWORD} -eq 2 ]]; then",' case "${prev}" in',...subVerbs.map(([command,verbs])=>` ${command}) COMPREPLY=( $(compgen -W "${verbs.join(" ")}" -- "\${cur}") ) ;;`)," esac"," fi","}",`complete -F ${fn} ${cliName}`,""].join(`
|
|
4
4
|
`)}function generateZshCompletions(cliName,subVerbs){let subcommandsList=TOP_LEVEL_SUBCOMMANDS.map((s)=>`"${s}"`).join(" "),fn=`_${cliName}`;return[`#compdef ${cliName}`,`# ${cliName} zsh completions`,`# Source: ${cliName} completions zsh`,"",`${fn}() {`," local -a subcommands verbs",` subcommands=(${subcommandsList})`,""," if (( CURRENT == 2 )); then"," _describe -t commands 'subcommand' subcommands"," return"," fi",""," verbs=()",' case "${words[2]}" in',...subVerbs.map(([command,verbs])=>` ${command}) verbs=(${verbs.map((v)=>`"${v}"`).join(" ")}) ;;`)," esac"," if (( CURRENT == 3 && ${#verbs} > 0 )); then"," _describe -t verbs 'verb' verbs"," fi","}","","# Autoloaded from $fpath -> run as the completion function;","# sourced directly -> register with compdef instead.",`if [ "\${funcstack[1]}" = "${fn}" ]; then`,` ${fn} "$@"`,"elif (( $+functions[compdef] )); then",` compdef ${fn} ${cliName}`,"fi",""].join(`
|
|
5
5
|
`)}function generateFishCompletions(cliName,subVerbs){let lines=[...TOP_LEVEL_SUBCOMMANDS.map((s)=>`complete -c ${cliName} -f -n __fish_use_subcommand -a ${s}`),...subVerbs.map(([command,verbs])=>`complete -c ${cliName} -f -n "__fish_seen_subcommand_from ${command}" -a "${verbs.join(" ")}"`)];return`# ${cliName} fish completions
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{getGlobalDefaultVendor,getRepoLastActiveVendor,resolvePreferredVendor,setGlobalDefaultVendor,setRepoLastActiveVendor}from"./chunk-932ymm0m.js";import"./chunk-1kz2syvp.js";import"./chunk-j75axe29.js";import"./chunk-xy8be792.js";import"./chunk-ayhhgfsz.js";import"./chunk-3wj69b0a.js";import"./chunk-ch9b1d5y.js";import"./chunk-bq3fyc0p.js";import"./chunk-mv7ptt5w.js";import"./chunk-g56kvet6.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";export{setRepoLastActiveVendor,setGlobalDefaultVendor,resolvePreferredVendor,getRepoLastActiveVendor,getGlobalDefaultVendor};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{StaleInstallError,autospawnDaemonEnv,connectIfRunning,connectOrStartDaemon,detachOptions,ensureDaemonReachable,isStaleInstallError,probeDaemonSocket,resolveKobeSpawn,spawnDetachedDaemon,testDaemonResponds,tryAcquireSpawnLock}from"./chunk-
|
|
2
|
+
import{StaleInstallError,autospawnDaemonEnv,connectIfRunning,connectOrStartDaemon,detachOptions,ensureDaemonReachable,isStaleInstallError,probeDaemonSocket,resolveKobeSpawn,spawnDetachedDaemon,testDaemonResponds,tryAcquireSpawnLock}from"./chunk-tngnng9q.js";import"./chunk-gyc4fj15.js";import"./chunk-0wnfq5sx.js";import"./chunk-7j5372wb.js";import"./chunk-mnqxgvyb.js";import"./chunk-mv7ptt5w.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";export{tryAcquireSpawnLock,testDaemonResponds,spawnDetachedDaemon,resolveKobeSpawn,probeDaemonSocket,isStaleInstallError,ensureDaemonReachable,detachOptions,connectOrStartDaemon,connectIfRunning,autospawnDaemonEnv,StaleInstallError};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{stampResetGate}from"./chunk-
|
|
2
|
+
import{stampResetGate}from"./chunk-2h9nz0zv.js";import{stopLegacyTmux}from"./chunk-dqndd97s.js";import"./chunk-zk9yzb09.js";import{stopDaemonProcess}from"./chunk-gyc4fj15.js";import"./chunk-0wnfq5sx.js";import"./chunk-7j5372wb.js";import"./chunk-mnqxgvyb.js";import"./chunk-j75axe29.js";import"./chunk-ayhhgfsz.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{kvStatePath,legacyKobeKvStatePath,legacyKobeStateDir,roveStateDir}from"./chunk-ch9b1d5y.js";import"./chunk-mv7ptt5w.js";import{activeCliName}from"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-k2ckx8zw.js";import"./chunk-pw6yfj10.js";import{defaultDaemonPidPath,defaultDaemonSocketPath,defaultPtyHostPidPath,defaultPtyHostSocketPath}from"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";import{readFileSync}from"fs";import{unlink}from"fs/promises";import{join}from"path";import{createInterface}from"readline";var CLI_NAME=activeCliName();function printUsage(out){out.write([`Usage: ${CLI_NAME} reset [--hard] [--yes]`,"","Recover a wedged install: stop the daemon, Hosted PTY host, and any pre-v0.8 tmux sessions.","This ends background terminal and engine sessions; the next launch starts fresh.","Never touches your git worktrees.","","Options:"," --hard Also wipe the task index + UI state"," -y, --yes Skip the interactive confirmation"," -h, --help Print this help",""].join(`
|
|
3
3
|
`))}function taskCount(path){try{let parsed=JSON.parse(readFileSync(path,"utf8"));return Array.isArray(parsed.tasks)?parsed.tasks.length:null}catch{return null}}async function confirmTty(prompt){let readline=createInterface({input:process.stdin,output:process.stdout});try{let answer=await new Promise((resolve)=>readline.question(prompt,resolve));return/^y(es)?$/i.test(answer.trim())}finally{readline.close()}}async function removeStateFile(path,label){try{await unlink(path),console.log(` removed ${label} (${path})`)}catch(err){if(err.code==="ENOENT")console.log(` ${label}: already absent`);else throw Error(`failed to remove ${label} (${path}): ${errorMessage(err)}`)}}async function runResetSubcommand(argv){if(argv.some((arg)=>arg==="--help"||arg==="-h"||arg==="help")){printUsage(process.stdout);return}let known=new Set(["--hard","--yes","-y"]),unknown=argv.find((arg)=>!known.has(arg));if(unknown!==void 0)process.stderr.write(`${CLI_NAME} reset: unknown argument "${unknown}"
|
|
4
4
|
|
|
5
5
|
`),printUsage(process.stderr),process.exit(2);let hard=argv.includes("--hard"),yes=argv.includes("--yes")||argv.includes("-y"),daemonSocket=defaultDaemonSocketPath(),tasksPath=join(roveStateDir(),"tasks.json"),legacyTasksPath=join(legacyKobeStateDir(),"tasks.json"),statePath=kvStatePath(),legacyStatePath=legacyKobeKvStatePath();if(console.log(`${CLI_NAME} reset will:`),console.log(" \u2022 stop the Rove daemon (graceful \u2192 SIGTERM \u2192 SIGKILL)"),console.log(` \u2022 remove its socket + pidfile (${daemonSocket})`),console.log(" \u2022 stop the standalone Hosted PTY host and all background terminal/engine sessions"),console.log(" \u2022 stop any pre-v0.8 tmux sessions after SIGTERM-ing their pane process groups"),hard){let count=taskCount(tasksPath)??taskCount(legacyTasksPath);console.log(` \u2022 DELETE the task index${count===null?"":` (${count} task(s))`} \u2014 ${tasksPath}`),console.log(` \u2022 DELETE the UI state \u2014 ${statePath}`),console.log(" \u2022 DELETE the pre-Rove task/UI indexes too, so migration cannot restore reset state")}if(console.log(" \u2022 NOT touch your git worktrees under ~/.rove/worktrees/, ~/.kobe/worktrees/, or repo-local roots"),!hard)console.log(" (your task list & worktrees are kept \u2014 add --hard to also wipe task and UI state)");if(!yes){if(!process.stdin.isTTY){console.log(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{writeOutdatedCache}from"./chunk-n4nntq73.js";import{PluginCliError,installPlugin}from"./chunk-
|
|
2
|
+
import{writeOutdatedCache}from"./chunk-n4nntq73.js";import{PluginCliError,installPlugin}from"./chunk-ygnfyfq9.js";import{loadPluginRegistry,pluginCheckoutDir,pluginConfigDir,pluginDataDir,pluginStateDir,removePluginEntry,savePluginRegistry}from"./chunk-38272eqv.js";import"./chunk-zk9yzb09.js";import"./chunk-mnqxgvyb.js";import"./chunk-w7zv47mp.js";import"./chunk-ch9b1d5y.js";import{activeCliName}from"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";import{execFileSync}from"child_process";import{existsSync,mkdirSync,readdirSync,renameSync}from"fs";import{join}from"path";function gitOut(args,cwd){try{return execFileSync("git",args,{cwd,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return null}}function checkEntry(entry){let repoSpec=entry.source.spec.split("/").slice(0,2).join("/"),localSha=gitOut(["rev-parse","HEAD"],pluginCheckoutDir(entry.id)),remote=gitOut(["ls-remote",`https://github.com/${repoSpec}.git`,"HEAD"]),remoteSha=remote?remote.split(/\s+/)[0]??null:null;return{id:entry.id,spec:entry.source.spec,version:entry.version,localSha,remoteSha,behind:Boolean(localSha&&remoteSha&&localSha!==remoteSha)}}function listOutdated(){let rows=loadPluginRegistry().plugins.filter((p)=>p.source.kind==="github").map(checkEntry);return writeOutdatedCache(rows.filter((r)=>r.behind).map((r)=>r.id)),rows}function printOutdated(){let rows=listOutdated();if(rows.length===0){console.log("no GitHub-installed plugins.");return}for(let r of rows){let status=r.behind?"update available":r.remoteSha===null?"remote unreachable":r.localSha===null?"local sha unreadable":"up to date";console.log(`${r.id} v${r.version} ${status}`)}}function migrateRenamedPlugin(oldId,newId){for(let dirOf of[pluginConfigDir,pluginStateDir]){let from=dirOf(oldId),to=dirOf(newId);if(!existsSync(from))continue;mkdirSync(to,{recursive:!0});for(let entry of readdirSync(from)){if(existsSync(join(to,entry)))continue;renameSync(join(from,entry),join(to,entry))}}savePluginRegistry(removePluginEntry(loadPluginRegistry(),oldId)),console.log(`renamed ${oldId} \u2192 ${newId}: settings and state carried over, old entry unregistered`),console.log(` leftover checkout (safe to remove): ${pluginDataDir(oldId)}`)}async function updatePlugins(ids,opts){let rows=listOutdated(),targets;if(opts.all){if(targets=rows.filter((r)=>r.behind),targets.length===0){console.log("all plugins up to date.");return}}else{if(ids.length===0)throw new PluginCliError("update takes plugin ids or --all");targets=ids.map((id)=>{let row=rows.find((r)=>r.id===id);if(!row)throw new PluginCliError(`\`${id}\` is not a GitHub-installed plugin; see \`${activeCliName()} plugin list\``);return row})}for(let target of targets){if(!target.behind&&!ids.includes(target.id))continue;console.log(`updating ${target.id} (${target.spec})\u2026`);let installedId=await installPlugin(target.spec,{yes:opts.yes});if(installedId!==target.id)migrateRenamedPlugin(target.id,installedId)}listOutdated()}export{updatePlugins,printOutdated};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{canonicalize}from"./chunk-
|
|
2
|
+
import{canonicalize}from"./chunk-b3pxf5xd.js";import{applyJitter,exponentialBackoff}from"./chunk-gwcneg6c.js";import{getRemoteRepoConfig,isRemoteRepoKey,resolveRepoRoot}from"./chunk-1kz2syvp.js";var canonPath=canonicalize;function randomDirTaskSuffix(){return Math.random().toString(36).slice(2,6).padEnd(4,"0")}function titleFromRepo(repo){let segs=repo.split(/[/\\]/).filter(Boolean);return segs.length>0?segs[segs.length-1]??repo:repo}function normalizeMainRepo(repo){let normalized=resolveRepoRoot(repo);return{repo:normalized,key:isRemoteRepoKey(normalized)?normalized:canonPath(normalized)}}function repoWorkingDir(repo){return getRemoteRepoConfig(repo)?.basePath??repo}var GH_PR_VIEW_FIELDS="number,url,title,state,baseRefName,reviewDecision,mergeable,statusCheckRollup";function lifecycleFromState(state,reviewDecision){switch((state??"").toUpperCase()){case"MERGED":return"merged";case"CLOSED":return"closed";case"OPEN":return(reviewDecision??"").toUpperCase()==="APPROVED"?"ready_to_merge":"open";default:return"unknown"}}function entryCheckState(entry){let status=(entry.status??"").toUpperCase(),conclusion=(entry.conclusion??"").toUpperCase(),contextState=(entry.state??"").toUpperCase();if(status&&status!=="COMPLETED")return"pending";if(conclusion){if(conclusion==="SUCCESS"||conclusion==="NEUTRAL"||conclusion==="SKIPPED")return"passing";return"failing"}if(contextState==="SUCCESS")return"passing";if(contextState==="PENDING"||contextState==="EXPECTED")return"pending";if(contextState==="FAILURE"||contextState==="ERROR")return"failing";return"unknown"}function checkStateFromRollup(rollup){if(!rollup||rollup.length===0)return"none";let sawPending=!1,sawPassing=!1;for(let entry of rollup){let s=entryCheckState(entry);if(s==="failing")return"failing";if(s==="pending")sawPending=!0;else if(s==="passing")sawPassing=!0}if(sawPending)return"pending";if(sawPassing)return"passing";return"unknown"}function mapGhPrView(view,at){if(!view||typeof view.number!=="number")return null;return{provider:"github",lifecycle:lifecycleFromState(view.state,view.reviewDecision),checkState:checkStateFromRollup(view.statusCheckRollup),number:view.number,url:view.url,title:view.title,baseRef:view.baseRefName,reviewDecision:view.reviewDecision||void 0,mergeable:view.mergeable||void 0,lastCheckedAt:at}}function samePrStatus(a,b){if(a===b)return!0;if(!a||!b)return!1;return a.provider===b.provider&&a.lifecycle===b.lifecycle&&a.checkState===b.checkState&&a.number===b.number&&a.url===b.url&&a.title===b.title&&a.baseRef===b.baseRef&&a.reviewDecision===b.reviewDecision&&a.mergeable===b.mergeable}var NO_REMOTE_PATTERNS=["none of the git remotes","no git remote","to use github cli in a github repository","not a github repository"],AUTH_PATTERNS=["gh auth login","authentication required","not logged in","http 401","bad credentials","requires authentication"],NETWORK_PATTERNS=["could not resolve host","no such host","dial tcp","connection refused","connection reset","network is unreachable","i/o timeout","timeout","tls handshake","http 5","rate limit","try again"];function matchesAny(haystack,needles){return needles.some((n)=>haystack.includes(n))}function classifyGhFailure(s){if(s.parseError)return{kind:"error",error:"parse"};if(s.timedOut)return{kind:"error",error:"timeout"};if(s.spawnError)return{kind:"error",error:"missing-binary"};let err=(s.stderr??"").toLowerCase();if(matchesAny(err,NO_REMOTE_PATTERNS))return{kind:"error",error:"no-remote"};if(matchesAny(err,AUTH_PATTERNS))return{kind:"error",error:"auth"};if(matchesAny(err,NETWORK_PATTERNS))return{kind:"error",error:"network"};return{kind:"error",error:"unknown"}}function nextPrPoll(outcome,prevFailures,now,cfg,rand=Math.random){let at=(delay)=>now+applyJitter(delay,cfg.jitterRatio,rand);if(outcome.kind==="pr")return{nextAllowedAt:at(outcome.settled?cfg.settledMs:cfg.tickMs),failures:0};if(outcome.kind==="empty")return{nextAllowedAt:at(cfg.noPrMs),failures:0};if(outcome.error==="no-remote")return{nextAllowedAt:at(cfg.noRemoteMs),failures:0};let failures=prevFailures+1;return{nextAllowedAt:at(exponentialBackoff(cfg.failureBaseMs,failures-1,cfg.failureCapMs)),failures}}function checkResolutionNotify(prev,next){if(prev!=="pending")return null;if(next==="passing"||next==="failing")return next;return null}
|
|
3
3
|
export{GH_PR_VIEW_FIELDS,mapGhPrView,samePrStatus,classifyGhFailure,nextPrPoll,checkResolutionNotify,canonPath,randomDirTaskSuffix,titleFromRepo,normalizeMainRepo,repoWorkingDir};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{RemoteExecHost}from"./chunk-bkba9c4n.js";import{getKeychainPassword,isKeychainSupported,remoteKeychainRef,setKeychainPassword}from"./chunk-g2advs8t.js";import"./chunk-2fypr41w.js";import{addRemoteRepo,isRemoteProjectsEnabled}from"./chunk-
|
|
2
|
+
import{RemoteExecHost}from"./chunk-bkba9c4n.js";import{getKeychainPassword,isKeychainSupported,remoteKeychainRef,setKeychainPassword}from"./chunk-g2advs8t.js";import"./chunk-2fypr41w.js";import{addRemoteRepo,isRemoteProjectsEnabled}from"./chunk-1kz2syvp.js";import"./chunk-j75axe29.js";import"./chunk-ayhhgfsz.js";import{errorMessage}from"./chunk-2brn8e1y.js";import"./chunk-3wj69b0a.js";import{remoteControlSocketPath}from"./chunk-ch9b1d5y.js";import"./chunk-mv7ptt5w.js";import{activeCliName}from"./chunk-v0zxyqrq.js";import"./chunk-e29hx18x.js";import"./chunk-g56kvet6.js";import"./chunk-mcdv19rs.js";import"./chunk-r3k9rbwm.js";import"./chunk-wqfp8d9w.js";import{createInterface}from"readline";var CLI_NAME=activeCliName(),USAGE=`Usage: ${CLI_NAME} add --remote --host <host> --user <user> --path <basePath>
|
|
3
3
|
[--port N] [--key [path] | --password]
|
|
4
4
|
|
|
5
5
|
Register an experimental SSH-backed project. Worktrees are created on <host>
|