@rahularya01/pi-cursor 1.4.7 → 1.4.8

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.4.8] - 2026-08-02
4
+
5
+ ### Fixed
6
+
7
+ - **`stale_checkpoint` error after tool calls when the bridge is lost.** Root cause traced via the durable journal: `commitStoredCheckpoint` records `checkpointTurnCount = completedTurns + 1` (it includes the just-finished turn). When a tool-result recovery request arrives, `turns.length` is still the pre-tool count (one less), so `discardStaleCheckpointIfNeeded` treated the valid checkpoint as stale, cleared both the checkpoint and mid-pause metadata, and left `planRecovery` with nothing to work with. The staleness check now allows the off-by-one when `midPause` metadata confirms the request is a tool continuation for that exact turn — the checkpoint is preserved for `planRecovery` to use.
8
+
3
9
  ## [1.4.7] - 2026-08-02
4
10
 
5
11
  ### Fixed
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ ${s}`).join(`
27
27
 
28
28
  `)}function qr(e){return {byteLength:e.byteLength,sha256:createHash("sha256").update(e).digest("hex").slice(0,16)}}function xn(e){if(e==null||typeof e=="string"||typeof e=="number"||typeof e=="boolean")return e;if(e instanceof Uint8Array||Buffer.isBuffer(e)){let t=e instanceof Uint8Array?e:new Uint8Array(e);return {__bytes:qr(t)}}return Array.isArray(e)?e.map(t=>xn(t)):typeof e=="object"?Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,xn(n)])):String(e)}function _r(e){return {mimeType:e.mimeType,...qr(e.data)}}function Gn(e){let t=e.map(n=>({userText:n.userText,userImages:(n.userImages??[]).map(_r),steps:n.steps.map(s=>s.kind==="assistantText"?{kind:s.kind,text:s.text}:{kind:s.kind,toolCallId:s.toolCallId,toolName:s.toolName,arguments:xn(s.arguments),result:s.result?{content:s.result.content,isError:s.result.isError,images:(s.result.images??[]).map(_r)}:void 0})}));return createHash("sha256").update(JSON.stringify(t)).digest("hex")}function De(e){delete e.midPausePendingToolCalls,delete e.midPauseTurnCount,delete e.midPauseHistoryFingerprint,delete e.midPauseRecordedAtMs;}function _l(e){if(e==null||typeof e!="object")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}function jl(e){return {data:new Uint8Array(e.data),mimeType:e.mimeType}}function In(e){return {userText:e.userText,steps:e.steps.map(t=>t.kind==="assistantText"?{kind:"assistantText",text:t.text}:{kind:"toolCall",toolCallId:t.toolCallId,toolName:t.toolName,arguments:_l(t.arguments)}),...e.userImages?.length?{userImages:e.userImages.map(jl)}:{}}}function Le(e){return e!==""}function Hl(e,t){return e.size===t.size&&[...e].every(n=>t.has(n))}function re(e,t,n,s){return {kind:"skip",reason:e,hadStoredCheckpoint:t,...n!==void 0?{expected:n}:{},...s!==void 0?{received:s}:{}}}function Ol(e,t){let n=new Set(e),s=new Set(t);return n.size!==e.length||s.size!==t.length||!Hl(n,s)?{ok:false,expected:e,received:t}:{ok:true}}function $r(e,t){let n=new Set(e),s=new Set(t);return n.size!==e.length||s.size!==t.length||[...n].some(r=>!s.has(r))?{ok:false,expected:e,received:t}:{ok:true}}function ql(e,t,n){let s=e.stored.midPausePendingToolCalls;if(!s?.length)return re("no_midpause_snapshot",t);if(e.stored.sessionScoped&&e.stored.sessionId!==e.sessionId)return re("session_mismatch",t);let o=e.completedTurns.length;if(e.stored.midPauseTurnCount!==o)return De(e.stored),re("midpause_turn_count_mismatch",t);let r=Gn(e.completedTurns);if(e.stored.midPauseHistoryFingerprint!==r)return De(e.stored),re("midpause_history_fingerprint_mismatch",t);let a=e.stored.midPauseRecordedAtMs,i=e.midPauseRebuildMaxAgeMs??Pl(process.env.PI_CURSOR_MIDPAUSE_REBUILD_MAX_AGE_MS),d=e.nowMs??Date.now();if(a===void 0||d-a>i)return De(e.stored),re("midpause_metadata_stale",t);let l=e.inFlightTurn?In(e.inFlightTurn):void 0,c=l?.steps.filter(S=>S.kind==="toolCall").map(S=>S.toolCallId).filter(Le)??[];if(!l||c.length===0||e.toolResults.length===0)return re("no_inflight_tool_continuation",t);let u=s.map(S=>S.toolCallId).filter(Le),h=e.toolResults.map(S=>S.toolCallId).filter(Le),R=$r(u,h),M=Ol(c,h);return R.ok?M.ok?{kind:"rebuild_full_history",hadStoredCheckpoint:t,conversationId:e.stored.conversationId,completedTurns:e.completedTurns,inFlightTurn:l,toolResults:e.toolResults,blobStore:e.stored.blobStore,wrappedText:Mn(e.toolResults),rebuildReason:n}:re("pending_tool_call_mismatch",t,M.expected,M.received):re("pending_tool_call_mismatch",t,R.expected,R.received)}function ea(e){let t=!!e.stored?.checkpoint;if(!e.stored)return re("no_stored_conversation",false);let n=a=>ql(e,t,a);if(!e.stored.checkpoint)return n(e.rebuildReason??"no_checkpoint");if(e.discardStaleCheckpoint?.(e.stored,e.completedTurns,e.requestId,e.convKey),!e.stored.checkpoint){let a=n("stale_checkpoint");return a.kind!=="skip"?a:re("stale_checkpoint",t)}let s=(e.stored.midPausePendingToolCalls??[]).map(a=>a.toolCallId).filter(Le),o=e.toolResults.map(a=>a.toolCallId).filter(Le),r=$r(s,o);if(!r.ok){let a=n("checkpoint_tool_mismatch");return a.kind!=="skip"?a:re("pending_tool_call_mismatch",true,r.expected,r.received)}return {kind:"recover",hadStoredCheckpoint:true,checkpoint:e.stored.checkpoint,conversationId:e.stored.conversationId,blobStore:e.stored.blobStore,wrappedText:Mn(e.toolResults)}}function Ae(e){return e==null?"":typeof e=="string"?e:e.filter(t=>t.type==="text"&&t.text).map(t=>t.text).join(`
29
29
  `)}function $l(e){return Array.isArray(e)&&e.some(t=>t.type==="image_url"&&!!t.image_url?.url||t.type==="image"&&!!t.data&&!!t.mimeType)}function yn(e,t={}){if(e==null||typeof e=="string")return [];let n=[];for(let s of e)if(s.type==="image_url"&&s.image_url?.url){let o=Ts(s.image_url.url,t);o&&n.push(o);}else if(s.type==="image"&&s.data&&s.mimeType){let o=lt(s.data,s.mimeType,t);o&&n.push(o);}return n}function ec(e){let t=new Map;for(let n of e??[]){if(!n?.toolCallId||!Array.isArray(n.images))continue;let s=n.images.map(o=>lt(o.data,o.mimeType,{enforceCursorCliLimits:true,dropInvalid:true})).filter(o=>!!o);s.length!==0&&t.set(n.toolCallId,ct(t.get(n.toolCallId),s)??[]);}return t}function tc(e){return e.role==="user"&&Ae(e.content).trim()==="Attached image(s) from tool result:"&&$l(e.content)}function na(e){return e.kind==="toolCall"&&e.result!==void 0}function nc(e,t){if(t.length===0)return;let n=e.steps.filter(na).filter(r=>!r.result.images?.length);if(n.length===0)return;let s=n.filter(r=>r.result.content.trim()==="(see attached image)");if(s.length===t.length){s.forEach((r,a)=>{r.result={...r.result,content:"",images:[t[a]]};});return}let o=s.length===1?s[0]:n.at(-1);o.result={...o.result,content:o.result.content.trim()==="(see attached image)"?"":o.result.content,images:ct(o.result.images,t)};}function sc(e,t){return t?.length&&e.trim()==="(see attached image)"?"":e}function vt(e){try{let t=JSON.parse(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:{value:t}}catch{return e?{__raw:e}:{}}}function oc(e){return e.kind==="toolCall"}function sa(e){let t=new Map;for(let n of e.steps)n.kind==="toolCall"&&n.result&&t.set(n.toolCallId,n.result);return t}function Vn(e,t){if(!t)return;let n=e.steps.at(-1);n?.kind==="assistantText"?n.text+=t:e.steps.push({kind:"assistantText",text:t});}function ta(e){return {userText:e.userText,steps:e.steps,...e.userImages?.length?{userImages:e.userImages}:{}}}function vn(e){return In(e)}function oa(e){return zr(e)}function Zn(e,t){e=oa(e);let n="You are a helpful assistant.",s=[],o=ec(t);f("parse_messages.start",{messages:e});let r=e.filter(m=>m.role==="system").map(m=>Ae(m.content));r.length>0&&(n=r.join(`
30
- `));let a=e.filter(m=>m.role!=="system"),i=a.reduce((m,b,g)=>b.role==="user"?g:m,-1),d=m=>({enforceCursorCliLimits:true,dropInvalid:m!==i}),l=null,c=()=>{l&&(s.push(ta(l)),l=null);};for(let[m,b]of a.entries()){if(l&&tc(b)){l.steps.some(G=>G.kind==="toolCall"&&G.result?.images?.length)||nc(l,yn(b.content,{enforceCursorCliLimits:true,dropInvalid:true}));continue}if(b.role==="user"){c();let g=yn(b.content,d(m));l={userText:Ae(b.content),steps:[],...g.length>0?{userImages:g}:{},toolCallById:new Map,sawToolResult:false,sawAssistantAfterToolResult:false};continue}if(l){if(b.role==="assistant"){let g=Ae(b.content);g&&(l.sawToolResult&&(l.sawAssistantAfterToolResult=true),l.steps.push({kind:"assistantText",text:g}));for(let G of b.tool_calls??[]){let y={kind:"toolCall",toolCallId:G.id,toolName:G.function.name,arguments:vt(G.function.arguments)};l.steps.push(y),l.toolCallById.set(y.toolCallId,y);}continue}if(b.role==="tool"){let g=b.tool_call_id??"",G=yn(b.content,d(m)),y=ct(G,o.get(g)),C=sc(Ae(b.content),y),x=b.is_error===true,V=g?l.toolCallById.get(g):void 0;if(V)V.result={content:C,images:y,isError:x};else {let T={kind:"toolCall",toolCallId:g,toolName:"",arguments:{},result:{content:C,images:y,isError:x}};l.steps.push(T),g&&l.toolCallById.set(g,T);}l.sawToolResult=true;}}}let u="",h=[],R=[],M;if(l){let m=l.steps.filter(oc),b=m.some(y=>y.result),G=l.steps.at(-1)?.kind==="toolCall";l.steps.length===0||G?(u=l.userText,h=l.userImages??[],m.length>0&&(M=vn(l)),b&&(R=m.filter(na).map(y=>({toolCallId:y.toolCallId,content:y.result.content,...y.result.images?.length?{images:y.result.images}:{},...y.result.isError?{isError:true}:{}})))):s.push(ta(l));}let S={systemPrompt:n,userText:u,userImages:h,turns:s,toolResults:R,inFlightTurn:M};return f("parse_messages.end",S),S}var aa=1,cc="run-journal",ia=1440*60*1e3;function la(){let e=ke();if(!e)return;let t=join(e,cc);try{return mkdirSync(t,{recursive:!0}),t}catch{return}}function Bn(e){let t=la();if(!t)return;let n=e.replace(/[^a-zA-Z0-9._-]/g,"_").slice(0,64);return join(t,`${n}.json`)}function dc(e,t=64){let n=[],s=[...e.entries()],o=s.length>t?s.slice(s.length-t):s;for(let[r,a]of o)n.push({id:r,data:Buffer.from(a).toString("base64")});return n}function uc(e){let t=new Map;if(!e)return t;for(let n of e)try{t.set(n.id,new Uint8Array(Buffer.from(n.data,"base64")));}catch{}return t}function gc(e,t,n=Date.now()){return {version:aa,convKey:e,savedAt:n,conversationId:t.conversationId,sessionScoped:t.sessionScoped,...t.sessionId?{sessionId:t.sessionId}:{},checkpoint:t.checkpoint?Buffer.from(t.checkpoint).toString("base64"):null,...t.checkpointSource?{checkpointSource:t.checkpointSource}:{},...t.checkpointTurnCount!==void 0?{checkpointTurnCount:t.checkpointTurnCount}:{},...t.checkpointHistoryFingerprint?{checkpointHistoryFingerprint:t.checkpointHistoryFingerprint}:{},...t.midPausePendingToolCalls?{midPausePendingToolCalls:t.midPausePendingToolCalls}:{},...t.midPauseTurnCount!==void 0?{midPauseTurnCount:t.midPauseTurnCount}:{},...t.midPauseHistoryFingerprint?{midPauseHistoryFingerprint:t.midPauseHistoryFingerprint}:{},...t.midPauseRecordedAtMs!==void 0?{midPauseRecordedAtMs:t.midPauseRecordedAtMs}:{},blobs:dc(t.blobStore),lastAccessMs:t.lastAccessMs||n}}function mc(e){if(e.version!==aa||!e.conversationId||!e.convKey)return;let t=null;if(e.checkpoint)try{t=new Uint8Array(Buffer.from(e.checkpoint,"base64"));}catch{t=null;}return {conversationId:e.conversationId,checkpoint:t,...e.checkpointSource?{checkpointSource:e.checkpointSource}:{},...e.checkpointTurnCount!==void 0?{checkpointTurnCount:e.checkpointTurnCount}:{},...e.checkpointHistoryFingerprint?{checkpointHistoryFingerprint:e.checkpointHistoryFingerprint}:{},...e.midPausePendingToolCalls?{midPausePendingToolCalls:e.midPausePendingToolCalls}:{},...e.midPauseTurnCount!==void 0?{midPauseTurnCount:e.midPauseTurnCount}:{},...e.midPauseHistoryFingerprint?{midPauseHistoryFingerprint:e.midPauseHistoryFingerprint}:{},...e.midPauseRecordedAtMs!==void 0?{midPauseRecordedAtMs:e.midPauseRecordedAtMs}:{},sessionScoped:!!e.sessionScoped,...e.sessionId?{sessionId:e.sessionId}:{},blobStore:uc(e.blobs),lastAccessMs:e.lastAccessMs||e.savedAt||Date.now()}}function ca(e,t){let n=Bn(e);if(!n)return false;try{let s=gc(e,t),o=`${n}.${process.pid}.${Date.now()}.tmp`;return writeFileSync(o,JSON.stringify(s),"utf8"),renameSync(o,n),f("journal.write",{convKey:e,hasCheckpoint:!!t.checkpoint,midPause:!!t.midPausePendingToolCalls?.length,blobCount:t.blobStore.size}),!0}catch(s){return f("journal.write_failed",{convKey:e,message:s instanceof Error?s.message:String(s)}),false}}function da(e,t){let n=Bn(e);if(n)try{let s=readFileSync(n,"utf8"),o=JSON.parse(s),r=t?.now??Date.now(),a=t?.maxAgeMs??ia,i=r-(o.savedAt||o.lastAccessMs||0);if(!Number.isFinite(i)||i<0||i>a){f("journal.stale",{convKey:e,age:i});return}let d=mc(o);return d?(f("journal.read",{convKey:e,hasCheckpoint:!!d.checkpoint,midPause:!!d.midPausePendingToolCalls?.length}),d):void 0}catch{return}}function Tn(e){let t=Bn(e);if(t)try{unlinkSync(t);}catch{}}function ua(e=Date.now(),t=ia){let n=la();if(!n)return 0;let s=0;try{for(let o of readdirSync(n)){if(!o.endsWith(".json"))continue;let r=join(n,o);try{let a=readFileSync(r,"utf8"),i=JSON.parse(a),d=e-(i.savedAt||i.lastAccessMs||0);(!Number.isFinite(d)||d>t)&&(unlinkSync(r),s+=1);}catch{try{unlinkSync(r),s+=1;}catch{}}}}catch{return s}return s>0&&f("journal.evict",{removed:s}),s}var H=new Map,Zt=new Map;function Yn(e,t){ca(e,t);}function kn(e){let t=H.get(e);if(t)return t;let n=da(e);if(n)return H.set(e,n),n}function Nn(e=Date.now()){for(let[t,n]of H)!n.sessionScoped&&e-n.lastAccessMs>18e5&&(f("conversation.evict",{key:t,stored:n,now:e}),H.delete(t),Tn(t));ua(e);}function Me(e){return Gn(e)}function Xn(e){De(e);}function hc(e,t=false){e.checkpoint=null,delete e.checkpointSource,delete e.checkpointTurnCount,delete e.checkpointHistoryFingerprint,Xn(e),t&&e.blobStore.clear();}function Sc(e){try{return fromBinary(Ce,e),!0}catch{return false}}function Un(e,t,n,s){if(!e.checkpoint)return;let o=t.length,r=Me(t),a=e.checkpointTurnCount,i=e.checkpointHistoryFingerprint,d=Sc(e.checkpoint)?a===void 0||!i?"missing_checkpoint_metadata":a!==o?"completed_turn_count_mismatch":i!==r?"completed_history_fingerprint_mismatch":void 0:"checkpoint_undecodable";d&&(f("chat.discard_checkpoint",{requestId:n,convKey:s,reason:d,storedCheckpointTurnCount:a,currentTurnCount:o,storedCheckpointHistoryFingerprint:i,currentHistoryFingerprint:r}),hc(e,true));}function ma(e,t=134217728){let n=0;for(let o of e.values())n+=o.byteLength;if(n<=t)return {removed:0,totalBytes:n};let s=0;for(let o of e.keys()){if(n<=t)break;let r=e.get(o);r&&(n-=r.byteLength,e.delete(o),s+=1);}return {removed:s,totalBytes:n}}function Pe(e,t){for(let[s,o]of t)e.blobStore.delete(s),e.blobStore.set(s,o);let n=ma(e.blobStore);n.removed>0&&f("conversation.blob_store_trimmed",{removed:n.removed,totalBytes:n.totalBytes,maxBytes:134217728}),e.lastAccessMs=Date.now();}function Wt(e,t,n,s,o,r){let a=[...s,o];Pe(e,n),e.checkpoint=t,e.checkpointSource="upstream",e.checkpointTurnCount=a.length,e.checkpointHistoryFingerprint=Me(a),Xn(e),e.lastAccessMs=Date.now(),r&&Yn(r,e);}function Ft(e,t,n,s,o){let r=H.get(e);r&&(t?Wt(r,t,n,s,o,e):(Pe(r,n),r.lastAccessMs=Date.now(),Yn(e,r)),f("native.stream.abort_state_saved",{convKey:e,hasCheckpoint:!!t,completedTurnCount:s.length,currentTurn:o}));}function _e(e,t,n,s,o,r){Pe(e,n);let a=Me(s);t?(e.checkpoint=t,e.checkpointSource="upstream",e.checkpointTurnCount=s.length,e.checkpointHistoryFingerprint=a):(e.checkpoint=null,e.checkpointSource="absent",delete e.checkpointTurnCount,delete e.checkpointHistoryFingerprint),e.midPausePendingToolCalls=o.map(i=>({toolCallId:i.toolCallId,toolName:i.toolName})),e.midPauseTurnCount=s.length,e.midPauseHistoryFingerprint=a,e.midPauseRecordedAtMs=Date.now(),e.lastAccessMs=Date.now(),r&&Yn(r,e);}function je(e){return e.stored?(_e(e.stored,e.latestCheckpoint,e.blobStore,e.completedTurns,e.pendingExecs,e.convKey),{committed:true}):{committed:false}}function pa(e){let t=Bt(e);return t?`session:${t}`:`anonymous:${Tt(e.messages)}`}async function Aa(e,t){let n=Zt.get(e)??Promise.resolve(),s,o=new Promise(a=>{s=a;}),r=n.catch(()=>{}).then(()=>o);Zt.set(e,r),await n.catch(()=>{});try{return await t()}finally{s(),Zt.get(e)===r&&Zt.delete(e);}}function Bt(e){let t=e.pi_session_id??e.user;if(typeof t!="string")return;let n=t.trim();return n||void 0}function Jn(e){return createHash("sha256").update(`bridge:${e}`).digest("hex").slice(0,16)}function wn(e){return createHash("sha256").update(`conv:${e}`).digest("hex").slice(0,16)}function Qn(e,t){if(t)return Jn(t);let n=e.find(o=>o.role==="user"),s=n?Ae(n.content):"";return createHash("sha256").update(`bridge:${s.slice(0,200)}`).digest("hex").slice(0,16)}function Tt(e,t){if(t)return wn(t);let n=e.find(o=>o.role==="user"),s=n?Ae(n.content):"";return createHash("sha256").update(`conv:${s.slice(0,200)}`).digest("hex").slice(0,16)}function Kn(e){if(!e)return;let t=Jn(e),n=wn(e),s=ee.get(t);f("session.cleanup",{sessionId:e,bridgeKey:t,convKey:n,hasActiveBridge:!!s,hadConversation:H.has(n)}),s&&Ee(s.bridge,s.heartbeatTimer,t),H.delete(n),Tn(n);}function Dn(e){let t=createHash("sha256").update(`cursor-conv-id:${e}`).digest("hex").slice(0,32);return [t.slice(0,8),t.slice(8,12),`4${t.slice(13,16)}`,`${(8|parseInt(t[16],16)&3).toString(16)}${t.slice(17,20)}`,t.slice(20,32)].join("-")}var ha="model-catalog.json",Ln=1,Cc=720*60*60*1e3,Fe;function Yt(){if(Fe!==void 0)return Fe??void 0;Fe=null;let e=Ie(ha);if(e)try{let t=JSON.parse(readFileSync(e,"utf8"));return t?.version!==Ln||typeof t.savedAt!="number"||!Array.isArray(t.rawModels)||!Array.isArray(t.parameterizedModels)||Date.now()-t.savedAt>Cc||t.rawModels.length===0&&t.parameterizedModels.length===0?void 0:(Fe={version:Ln,tokenHash:typeof t.tokenHash=="string"?t.tokenHash:"",savedAt:t.savedAt,rawModels:t.rawModels,parameterizedModels:t.parameterizedModels},Fe)}catch{return}}function zn(e){if(e.rawModels.length===0&&e.parameterizedModels.length===0)return;let t={version:Ln,tokenHash:e.tokenHash,savedAt:Date.now(),rawModels:e.rawModels,parameterizedModels:e.parameterizedModels};Fe=t;let n=Ie(ha);if(n)try{writeFileSync(n,JSON.stringify(t),{mode:384});}catch{}}async function Pn(e){if(at())try{let s=await Vs({accessToken:e.accessToken,rpcPath:e.rpcPath,requestBody:e.requestBody,url:e.url,timeoutMs:e.timeoutMs,signal:e.signal}),o=s.status>=200&&s.status<300;return {body:s.body,exitCode:o?0:1,timedOut:!1}}catch{if(e.signal?.aborted)return {body:new Uint8Array(0),exitCode:1,timedOut:true}}let t=Ur()({accessToken:e.accessToken,rpcPath:e.rpcPath,url:e.url,unary:true}),n=[];return new Promise(s=>{let o=false,r=e.timeoutMs??5e3,a=r>0?setTimeout(()=>{o=true;try{t.proc.kill();}catch{}},r):void 0;t.onData(i=>{n.push(Buffer.from(i));}),t.onClose(i=>{a&&clearTimeout(a),s({body:Buffer.concat(n),exitCode:i,timedOut:o});}),t.write(e.requestBody),t.end();})}var kt=null,Nt=null,Ra=300*1e3;function _n(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}async function fa(e,t){let n=_n(e);if(kt?.tokenHash===n&&Date.now()<kt.expiresAt)return kt.models;try{let s=create(on,{}),o=toBinary(on,s),r=await Pn({accessToken:e,rpcPath:"/agent.v1.AgentService/GetUsableModels",requestBody:o,url:ue(),signal:t?.signal});if(!r.timedOut&&r.exitCode===0&&r.body.length>0){let a=null;try{a=fromBinary(rn,r.body);}catch{let i=Ca(r.body);if(i)try{a=fromBinary(rn,i);}catch{a=null;}}if(a?.models?.length){let i=Mc(a.models);if(i.length>0)return kt={tokenHash:n,models:i,expiresAt:Date.now()+Ra},i}}}catch(s){console.error("[cursor-provider] Model discovery failed:",s instanceof Error?s.message:s);}return console.warn("[cursor-provider] Model discovery returned no models"),[]}function Ca(e){if(e.length<5)return null;let t=0;for(;t+5<=e.length;){let n=e[t],o=new DataView(e.buffer,e.byteOffset+t,e.byteLength-t).getUint32(1,false),r=t+5+o;if(r>e.length||(n&1)!==0)return null;if((n&2)===0)return e.subarray(t+5,r);t=r;}return null}async function ba(e,t){let n=_n(e);if(Nt?.tokenHash===n&&Date.now()<Nt.expiresAt)return Nt.models;try{let s=await Pn({accessToken:e,rpcPath:"/aiserver.v1.AiService/AvailableModels",requestBody:pr(),signal:t?.signal});if(s.timedOut||s.exitCode!==0||s.body.length===0)return [];let o=Ca(s.body)??s.body,r=Ar(o);return Nt={tokenHash:n,models:r,expiresAt:Date.now()+Ra},r}catch(s){return console.error("[cursor-provider] Parameterized model discovery failed:",s instanceof Error?s.message:s),[]}}async function He(e,t){let[n,s]=await Promise.all([fa(e,t),ba(e,t)]);return (n.length>0||s.length>0)&&zn({tokenHash:_n(e),rawModels:n,parameterizedModels:s}),{rawModels:n,parameterizedModels:s}}function xa(e,t){let n=`${e} ${t}`.toLowerCase();return /\b1\s*m\b|(?:^|-)1m(?:-|$)/.test(n)?1e6:/\b272\s*k\b|(?:^|-)272k(?:-|$)/.test(n)?272e3:2e5}function Mc(e){let t=new Map;for(let n of e){let s=n,o=s?.modelId?.trim?.();if(!o)continue;let r=s.displayName||s.displayNameShort||s.displayModelId||o;t.set(o,{id:o,name:r,reasoning:!!s.thinkingDetails,contextWindow:xa(o,r),maxTokens:64e3});}return [...t.values()].sort((n,s)=>n.id.localeCompare(s.id))}var Gc=/\b(401|403|unauthenticated|unauthorized|forbidden|invalid[_ ]token|token (?:expired|revoked)|auth(?:entication|orization) (?:failed|error))\b/i,Ic=/\b(429|resource_exhausted|rate[_ ]?limit|too many requests)\b/i,yc=/\bGOAWAY\b/i,Vc=/\b(ECONNRESET|ENOTFOUND|EAI_AGAIN|EPIPE|socket hang up|connection reset)\b/i,vc=/\b(ETIMEDOUT|timed? ?out|timeout)\b/i,Zc=/\b(protocol|protobuf|wire drift|invalid argument|failed_precondition)\b/i;function jn(e){let t=(e.stderr||"").trim(),s=[(e.endErrorMessage||"").trim(),t].filter(Boolean).join(" | ");return e.exitCode===2||yc.test(s)?{kind:"goaway",retryable:true,refreshAuth:false,message:s?`Cursor upstream closed the connection (GOAWAY): ${s}`:"Cursor upstream closed the connection (GOAWAY).",exitCode:e.exitCode,stderr:t||void 0}:Gc.test(s)?{kind:"authentication",retryable:true,refreshAuth:true,message:s||"Cursor authentication failed.",exitCode:e.exitCode,stderr:t||void 0}:Ic.test(s)?{kind:"rate_limit",retryable:true,refreshAuth:false,message:s||"Cursor rate limited the request.",exitCode:e.exitCode,stderr:t||void 0}:vc.test(s)?{kind:"socket_timeout",retryable:true,refreshAuth:false,message:s||"Cursor transport timed out.",exitCode:e.exitCode,stderr:t||void 0}:Vc.test(s)?{kind:"connection_reset",retryable:true,refreshAuth:false,message:s||"Cursor connection was reset.",exitCode:e.exitCode,stderr:t||void 0}:Zc.test(s)?{kind:"protocol_drift",retryable:false,refreshAuth:false,message:s||"Cursor protocol mismatch.",exitCode:e.exitCode,stderr:t||void 0}:e.exitCode!==0?{kind:"bridge_crash",retryable:true,refreshAuth:false,message:s?`Bridge connection lost (exit ${e.exitCode}): ${s}`:`Bridge connection lost (exit ${e.exitCode}).`,exitCode:e.exitCode,stderr:t||void 0}:{kind:"unknown",retryable:false,refreshAuth:false,message:s||"Bridge closed cleanly.",exitCode:e.exitCode,stderr:t||void 0}}function Hn(e){let t=[];return e.retryable&&t.push("A checkpoint/history recovery may continue the turn."),e.refreshAuth&&t.push("Token may need refresh \u2014 run /login cursor or check /cursor.doctor tokenSource."),e.kind==="protocol_drift"&&t.push("Pin PI_CURSOR_CLIENT_VERSION or regenerate proto if wire drift persists."),t.length?`${e.message} ${t.join(" ")}`:e.message}var On="[pi-cursor] The previous upstream stream was interrupted. Continue exactly where you left off. Do not repeat content already produced.";function qn(e,t){if(!t)return e;let n="",s=e;return s.endsWith("-fast")?(n="-fast",s=s.slice(0,-5)):s.endsWith("-thinking")&&(n="-thinking",s=s.slice(0,-9)),`${s}-${t}${n}`}function Ea(e){return !!e&&typeof e=="object"&&typeof e.modelId=="string"}function Ma(e,t,n){if(typeof e=="string"){let a=typeof n=="string"?n.trim():"";return a||qn(e,t)}let o=(n instanceof Map?n:void 0)?.get(e.id),r;return Ea(o)?r=o:o&&(r=o[t??""]??o.none??o.medium??o.high??Object.values(o).find(Ea)),{modelId:r?.modelId??qn(e.id,t),maxMode:!!(r?.requestedMaxMode??r?.requiresMaxMode),parameters:r?.parameters,requestedMaxMode:r?.requestedMaxMode,requiresMaxMode:r?.requiresMaxMode}}var Wc=/\b(unauthenticated|unauthorized|permission[_ ]?denied|auth(?:entication)?[_ ]?failed|invalid[_ ]?token|expired[_ ]?token|401)\b/i,Fc=/\b(failed to parse|decode|invalid wire|protocol|connect error|unknown field|premature eof)\b/i;function $n(e){return Wc.test(e)}function Bc(e){return Fc.test(e)}function Tc(e){let t=Se();return `${e} [protocol-hint: Cursor wire may have drifted. clientVersion=${t}. Try bumping PI_CURSOR_CLIENT_VERSION or re-run /cursor.doctor.]`}function Ga(e){let t=mt();if(!t)return e;let n=gt()?"unhandled wire messages \u2014 the turn may have been left waiting on one":"unknown wire fields \u2014 schema is likely behind Cursor";return `${e} [wire-drift: ${n}. Observed: ${t}. Regenerate the schema (see proto/README.md) or bump PI_CURSOR_CLIENT_VERSION; /cursor.doctor shows the full list.]`}function Ia(e){return $n(e)?`${e} [auth-hint: token may be expired. Idle stream retries force-refresh credentials; if this persists run /login cursor or check /cursor.doctor tokenSource.]`:Bc(e)?Ga(Tc(e)):Ga(e)}function Uc(e,t){let n=Fr(t),s=false,o=false,r,a=()=>{s||(s=true,e.push({type:"start",partial:n}));},i=()=>{if(!r||r.ended)return;let l=n.content[r.contentIndex];r.kind==="text"&&l?.type==="text"?e.push({type:"text_end",contentIndex:r.contentIndex,content:l.text,partial:n}):r.kind==="thinking"&&l?.type==="thinking"&&e.push({type:"thinking_end",contentIndex:r.contentIndex,content:l.thinking,partial:n}),r.ended=true,r=void 0;},d=l=>{if(a(),r?.kind===l&&!r.ended)return r.contentIndex;i();let c=n.content.length;return l==="text"?(n.content.push({type:"text",text:""}),e.push({type:"text_start",contentIndex:c,partial:n})):(n.content.push({type:"thinking",thinking:""}),e.push({type:"thinking_start",contentIndex:c,partial:n})),r={kind:l,contentIndex:c,ended:false},c};return {output:n,get closed(){return o},start:a,text(l){if(o||!l)return;let c=d("text"),u=n.content[c];u?.type==="text"&&(u.text+=l,e.push({type:"text_delta",contentIndex:c,delta:l,partial:n}));},thinking(l){if(o||!l)return;let c=d("thinking"),u=n.content[c];u?.type==="thinking"&&(u.thinking+=l,e.push({type:"thinking_delta",contentIndex:c,delta:l,partial:n}));},toolCall(l){if(o)return;a(),i();let c=n.content.length,u=vt(l.decodedArgs),h={type:"toolCall",id:l.toolCallId,name:l.toolName,arguments:{}};n.content.push(h),e.push({type:"toolcall_start",contentIndex:c,partial:n}),h.arguments=u,e.push({type:"toolcall_delta",contentIndex:c,delta:l.decodedArgs,partial:n}),e.push({type:"toolcall_end",contentIndex:c,toolCall:{type:"toolCall",id:l.toolCallId,name:l.toolName,arguments:u},partial:n});},done(l,c){o||(a(),i(),Cn(n,t,c),n.stopReason=l,e.push({type:"done",reason:l,message:n}),o=true,e.end(n));},error(l,c,u){o||(a(),i(),Cn(n,t,u),n.stopReason=c,n.errorMessage=l,e.push({type:"error",reason:c,error:n}),o=true,e.end(n));}}}function ya(){return Hr()}function q(e){return En(e)}function Va(e){return Or(e)}function Ut(e){return e.flatMap(t=>(t.images??[]).map(Ys))}function Jc(e){return e.some(t=>t.content.includes("[Recovered tool output after upstream bridge loss")||t.content.includes("[End recovered tool output"))}function wc(e){return (e.userImages?.length??0)>0}function va(e,t){let n={requestId:t.requestId,bridgeKeyPrefix:q(t.bridgeKey),convKey:t.convKey,modelId:t.modelId,rebuildReason:t.decision.rebuildReason,completedTurnCount:t.decision.completedTurns.length,inFlightTurnHasImages:wc(t.decision.inFlightTurn),toolResultCount:t.decision.toolResults.length,pendingToolCallIds:t.decision.toolResults.map(o=>o.toolCallId),sentinelInjectionDetected:Jc(t.decision.toolResults)};f(e,n);let s={metric:"cursor_provider.rebuild_full_history",reason:t.decision.rebuildReason,model:t.modelId,count:1,requestId:t.requestId,bridgeKeyPrefix:q(t.bridgeKey),convKey:t.convKey};f("metric.cursor_provider.rebuild_full_history",s),Qs("metric.cursor_provider.rebuild_full_history",s);}function Za(e){return ea({...e,discardStaleCheckpoint:Un})}function Wa(e){return (t,n,s)=>{let o=createAssistantMessageEventStream(),r=Uc(o,t);return r.start(),(async()=>{let a=Yr(t,n,s,e);if(s?.onPayload){let i=await s.onPayload(a,t);i&&typeof i=="object"&&(a=i);}await Aa(pa(a),async()=>{if(r.closed)return;let i=await e.getAccessToken();await Qc(a,i,t,s,r,Ks(),e.getAccessToken);});})().catch(a=>{r.error(a instanceof Error?a.message:String(a),"error");}),o}}async function Qc(e,t,n,s,o,r,a){let i;try{i=Zn(e.messages,e.cursor_tool_result_images);}catch(Z){o.error(Z instanceof Error?Z.message:String(Z),"error");return}let d=kr(e);if(d){f("native.unsupported_parameters",{requestId:r,message:d}),o.error(d,"error");return}let l=Nr(e.tools??[],e.tool_choice);if("error"in l){f("native.unsupported_tool_choice",{requestId:r,tool_choice:e.tool_choice}),o.error(l.error,"error");return}let{systemPrompt:c,userText:u,userImages:h,turns:R,toolResults:M,inFlightTurn:S}=i,m=l.tools.length>0&&M.length===0&&h.length===0&&pn(u),b=m?[]:l.tools;m&&(L("tools_omitted_trivial_turn"),se("tools_omitted",{requestId:r,reason:"trivial_conversational_turn",originalToolCount:l.tools.length}));let g=Dc(e.model,e.reasoning_effort,e.cursor_model_id),G=typeof e.cursor_model_max_mode=="boolean"?e.cursor_model_max_mode:e.cursor_requires_max_mode===true,y=Bt(e),C=Qn(e.messages,y),x=Tt(e.messages,y),V=ee.get(C);if(f("native.request",{requestId:r,sessionId:y,bridgeKey:C,convKey:x,model:e.model,resolvedModelId:g,cursorModelId:e.cursor_model_id,cursorModelParameters:e.cursor_model_parameters,cursorRequiresMaxMode:e.cursor_requires_max_mode,cursorModelMaxMode:e.cursor_model_max_mode,maxMode:G,messageCount:e.messages.length,turnCount:R.length,userText:u,toolResults:M,inFlightTurn:S,hasActiveBridge:!!V}),!u&&h.length===0&&M.length===0){o.error("No user message found","error");return}if(M.length>0){let Z=Mt(process.env.PI_CURSOR_RESUME_IDLE_TIMEOUT_MS);if(V){We(C);let Y=Me(R),w=!!y||V.historyFingerprint===Y;if(w||(f("bridge.active_history_mismatch",{requestId:r,bridgeKey:C,bridgeKeyPrefix:q(C),convKey:x,storedFingerprint:V.historyFingerprint,currentFingerprint:Y}),L("active_bridge_history_mismatch")),V.bridge.alive&&w){Kc(V,M,{accessToken:t,systemPrompt:c,model:n,modelId:g,bridgeKey:C,convKey:x,sessionId:y,completedTurns:R,maxMode:G,cursorModelParameters:e.cursor_model_parameters??[],getAccessToken:a},o,s,r);return}clearInterval(V.heartbeatTimer),V.bridge.end();}let I=kn(x),E=Za({stored:I,toolResults:M,completedTurns:R,inFlightTurn:S,sessionId:y,requestId:r,convKey:x});if(E.kind==="recover"){L("recovered_via_checkpoint"),f("bridge.recovered_via_checkpoint",{requestId:r,bridgeKey:C,bridgeKeyPrefix:q(C),convKey:x,recoveryPath:"stored_checkpoint",pendingToolCallIds:M.map(ne=>ne.toolCallId)});let Y=xt(b),w=Ut(M),ie={userText:E.wrappedText,steps:[],...w.length?{userImages:w}:{}},ge=pe({modelId:g,systemPrompt:c,userText:E.wrappedText,userImages:w,turns:R,conversationId:E.conversationId,checkpoint:E.checkpoint,existingBlobStore:E.blobStore,maxMode:G,cursorModelParameters:e.cursor_model_parameters,mcpTools:Y});ge.mcpTools=Y,Oe({accessToken:t,requestBytes:ge.requestBytes,blobStore:ge.blobStore,mcpTools:ge.mcpTools,model:n,modelId:g,bridgeKey:C,convKey:x,completedTurns:R,currentTurn:ie,writer:o,options:s,requestId:r,streamIdleTimeoutMs:Z,getAccessToken:a,systemPrompt:c,conversationId:E.conversationId,maxMode:G,cursorModelParameters:e.cursor_model_parameters??[]});return}if(E.kind==="rebuild_full_history"){L("rebuild_full_history"),va("native.rebuild_full_history",{requestId:r,bridgeKey:C,convKey:x,modelId:g,decision:E});let Y=xt(b),w=[...E.completedTurns,E.inFlightTurn],ie=Ut(E.toolResults),ge={userText:E.wrappedText,steps:[],...ie.length?{userImages:ie}:{}},ne=pe({modelId:g,systemPrompt:c,userText:E.wrappedText,userImages:ie,turns:w,conversationId:E.conversationId,checkpoint:null,existingBlobStore:E.blobStore,maxMode:G,cursorModelParameters:e.cursor_model_parameters,mcpTools:Y});ne.mcpTools=Y,I&&(I.lastAccessMs=Date.now()),Oe({accessToken:t,requestBytes:ne.requestBytes,blobStore:ne.blobStore,mcpTools:ne.mcpTools,model:n,modelId:g,bridgeKey:C,convKey:x,completedTurns:w,currentTurn:ge,writer:o,options:s,requestId:r,streamIdleTimeoutMs:Z,getAccessToken:a,systemPrompt:c,conversationId:E.conversationId,maxMode:G,cursorModelParameters:e.cursor_model_parameters??[]});return}bs(E.reason),L(`recovery_skipped:${E.reason}`),f("bridge.recovery_skipped",{requestId:r,bridgeKey:C,bridgeKeyPrefix:q(C),convKey:x,skipReason:E.reason,hadStoredCheckpoint:E.hadStoredCheckpoint,...E.expected!==void 0?{expected:E.expected}:{},...E.received!==void 0?{received:E.received}:{}});let D=`${ya()} ${Va({bridgeKey:C,hadStoredCheckpoint:E.hadStoredCheckpoint,skipReason:E.reason})}`;f("native.lost_tool_continuation",{requestId:r,bridgeKey:C,bridgeKeyPrefix:q(C),convKey:x,skipReason:E.reason,toolResults:M,message:D}),o.error(D,"error");return}V&&ee.has(C)&&(clearInterval(V.heartbeatTimer),V.bridge.end(),We(C));let T=kn(x);T||(T={conversationId:Dn(x),checkpoint:null,sessionScoped:!!y,...y?{sessionId:y}:{},blobStore:new Map,lastAccessMs:Date.now()},H.set(x,T)),T.lastAccessMs=Date.now(),Nn(),Un(T,R,r,x);let U=xt(b),X=u,N=u||h.length>0?h:[],z=pe(g,c,X,R,T.conversationId,T.checkpoint,T.blobStore,G,e.cursor_model_parameters,U,N);z.mcpTools=U;let te={userText:X,steps:[],...N.length>0?{userImages:N}:{}},F=An({systemPrompt:c,userText:X,tools:b,mcpTools:U,requestBytes:z.requestBytes,blobStore:z.blobStore,turnCount:R.length}),v=`approxTokens=${F.approxInputTokens} systemChars=${F.systemChars} userChars=${F.userChars} tools=${F.toolCount} toolJsonChars=${F.toolJsonChars} mcpSchemaBytes=${F.mcpSchemaBytes} requestBytes=${F.requestBytes} blobBytes=${F.blobBytes} wireBytes=${F.wireBytes} turns=${F.turnCount}`;Ms(v),se("request_size",{requestId:r,bridgeKey:q(C),convKey:x,modelId:g,...F}),f("native.dispatch_stream",{requestId:r,bridgeKey:C,convKey:x,conversationId:T.conversationId,hasCheckpoint:!!T.checkpoint,requestSize:F,payload:z}),Oe({accessToken:t,requestBytes:z.requestBytes,blobStore:z.blobStore,mcpTools:z.mcpTools,model:n,modelId:g,bridgeKey:C,convKey:x,completedTurns:R,currentTurn:te,writer:o,options:s,requestId:r,getAccessToken:a,recoverBeforeRetry:true,systemPrompt:c,conversationId:T.conversationId,maxMode:G,cursorModelParameters:e.cursor_model_parameters??[]});}function Fa(e,t,n,s,o,r,a,i,d,l,c,u,h,R,M=Sn(process.env.PI_CURSOR_STREAM_IDLE_TIMEOUT_MS),S={current:null}){f("native.stream.start",{requestId:h,bridgeKey:a,convKey:i,modelId:r,attempt:R?.currentAttempt??1,maxRetries:R?.maxRetries??0}),se("stream_start",{requestId:h,bridgeKey:q(a),convKey:i,modelId:r,attempt:R?.currentAttempt??1});let m={toolCallIndex:0,pendingExecs:[],outputTokens:0,totalTokens:0},b=vr(),g=false,G=false,y=null,C=false,x=[],V=false,T,U=()=>T??=Me(d),X=Ir({timeoutMs:M,onTimeout:()=>{if(G||c.closed)return;G=true,X.clear();let v=R?.currentAttempt??1,Z=R?.maxRetries??0,I={emittedUserVisibleContent:C,latestCheckpoint:S.current,blobStore:n,completedTurns:d,currentTurn:l};f("native.stream.idle_timeout",{requestId:h,bridgeKey:a,convKey:i,modelId:r,timeoutMs:M,attempt:v,maxRetries:Z,emittedUserVisibleContent:C,hasCheckpoint:!!S.current}),Gs({timeoutMs:M,attempt:v,event:"idle_timeout"}),Ft(i,S.current,n,d,l),Ee(e,t,a),u?.signal?.removeEventListener("abort",N);let E=yt({emittedUserVisibleContent:C,hasCheckpoint:!!S.current});if(R?.recoverBeforeRetry&&E){f("native.stream.idle_recovery_before_retry",{requestId:h,bridgeKey:a,bridgeKeyPrefix:q(a),convKey:i,modelId:r,attempt:v,maxRetries:Z,hasCheckpoint:!!S.current,emittedUserVisibleContent:C}),L("idle_recovery_before_retry");try{if(R.restart(v,I))return}catch(Y){f("native.stream.idle_recovery_before_retry_error",{requestId:h,bridgeKey:a,bridgeKeyPrefix:q(a),convKey:i,modelId:r,message:Y instanceof Error?Y.message:String(Y)});}}let D=v;if(R&&v<=Z&&E){let Y=v+1;D=Y,f("native.stream.idle_retry",{requestId:h,bridgeKey:a,convKey:i,modelId:r,attempt:v,nextAttempt:Y,maxRetries:Z,hasCheckpoint:!!S.current,emittedUserVisibleContent:C}),L("idle_retry");try{if(R.restart(Y,I))return}catch(w){f("native.stream.idle_retry_error",{requestId:h,bridgeKey:a,convKey:i,modelId:r,message:w instanceof Error?w.message:String(w)});}}c.error(Lc(M,D,Z,C),"error",m);}}),N=()=>{G||c.closed||(G=true,Ft(i,S.current,n,d,l),f("native.stream.abort",{requestId:h,bridgeKey:a,convKey:i,hasCheckpoint:!!S.current}),X.clear(),Ee(e,t,a),c.error("Aborted","aborted",m));};u?.signal?.addEventListener("abort",N,{once:true}),X.start();let z=(v,Z)=>{if(c.closed||V)return;if(Z){C=true,c.thinking(v);return}let{content:I,reasoning:E}=b.process(v);E&&(C=true,c.thinking(E)),I&&(C=true,Vn(l,I),c.text(I));},te=()=>{if(V)return;let v=b.flush();v.reasoning&&(C=true,c.thinking(v.reasoning)),v.content&&(C=true,Vn(l,v.content),c.text(v.content));},F=lr(v=>{try{let Z=fromBinary(oo,v);Vr(Z,n,s,E=>e.write(E),m,z,E=>{X.pause(),m.pendingExecs.push(E),g=!0,te(),l.steps.push({kind:"toolCall",toolCallId:E.toolCallId,toolName:E.toolName,arguments:vt(E.decodedArgs)}),c.closed||(c.toolCall(E),x.push(E),V=!0);let D=H.get(i);D&&x.length>0&&(_e(D,S.current,n,d,x,i),f(S.current?"native.stream.tool_call_checkpoint_saved":"native.stream.tool_call_snapshot_saved",{requestId:h,bridgeKey:a,convKey:i,checkpointSource:S.current?"upstream":"absent",pendingToolCallIds:x.map(Y=>Y.toolCallId)})),bn(a,{bridge:e,heartbeatTimer:t,blobStore:n,mcpTools:s,pendingExecs:m.pendingExecs,currentTurn:l,checkpointRef:S,state:m,historyFingerprint:U()}),f("native.stream.tool_call_pause",{requestId:h,bridgeKey:a,exec:E,pendingExecs:m.pendingExecs,emittedToolCallIds:x.map(Y=>Y.toolCallId),currentTurn:l});},E=>{S.current=E,f("native.stream.checkpoint_buffered",{requestId:h,convKey:i,checkpointBytes:E});})&&X.reset();}catch(Z){let I=Z instanceof Error?Z.message:String(Z);f("native.stream.process_error",{requestId:h,message:I}),c.closed||c.error(I,"error",m);}},v=>{let Z=cr(v);if(Z){y=Z;let I=Ia(Z.message);f("native.stream.cursor_error",{requestId:h,modelId:r,message:Z.message,enhanced:I,isAuthError:$n(Z.message),deferredToToolPause:V}),V||c.error(I,"error",m);}});e.onData(v=>{F(v),V&&(V=false,c.closed||c.done("toolUse",m));}),e.onClose(v=>{if(f("native.stream.bridge_close",{requestId:h,bridgeKey:a,convKey:i,code:v,cancelled:G,mcpExecReceived:g,currentTurn:l,latestCheckpoint:S.current}),se("bridge_close",{requestId:h,bridgeKey:q(a),convKey:i,code:v,cancelled:G,mcpExecReceived:g,emittedUserVisibleContent:C,hasCheckpoint:!!S.current}),X.clear(),clearInterval(t),u?.signal?.removeEventListener("abort",N),G)return;let Z=H.get(i);if(y){if(g){let I=je({stored:Z,latestCheckpoint:S.current,blobStore:n,completedTurns:d,pendingExecs:x,convKey:i});f(I.committed?"bridge.died_mid_pause_checkpoint_saved":"bridge.died_mid_pause_no_checkpoint",{requestId:h,bridgeKey:a,convKey:i,cause:"stream_error",pendingToolCallIds:x.map(E=>E.toolCallId)});}We(a);return}if(v!==0){let I=jn({exitCode:v,stderr:typeof e.lastStderr=="function"?e.lastStderr():""});if(I.retryable&&yt({emittedUserVisibleContent:C,hasCheckpoint:!!S.current})&&R){let D=R.currentAttempt,Y=R.maxRetries;if(D<=Y){f("native.stream.transport_retry",{requestId:h,bridgeKey:a,convKey:i,modelId:r,attempt:D,maxRetries:Y,failureKind:I.kind,hasCheckpoint:!!S.current,emittedUserVisibleContent:C}),L(`transport_retry:${I.kind}`),Ft(i,S.current,n,d,l),Ee(e,t,a),u?.signal?.removeEventListener("abort",N);try{if(R.restart(D+1,{emittedUserVisibleContent:C,latestCheckpoint:S.current,blobStore:n,completedTurns:d,currentTurn:l}))return}catch{}}}if(g){let D=je({stored:Z,latestCheckpoint:S.current,blobStore:n,completedTurns:d,pendingExecs:x,convKey:i});f(D.committed?"bridge.died_mid_pause_checkpoint_saved":"bridge.died_mid_pause_no_checkpoint",{requestId:h,bridgeKey:a,convKey:i,code:v,failureKind:I.kind,pendingToolCallIds:x.map(Y=>Y.toolCallId)});}c.error(Hn(I),"error",m),We(a);return}if(!g)te(),Z&&(S.current?(Wt(Z,S.current,n,d,l,i),f("native.stream.checkpoint_committed",{requestId:h,convKey:i,stored:Z})):Pe(Z,n)),c.done("stop",m);else {let I=je({stored:Z,latestCheckpoint:S.current,blobStore:n,completedTurns:d,pendingExecs:x,convKey:i});f(I.committed?"bridge.died_mid_pause_checkpoint_saved":"bridge.died_mid_pause_no_checkpoint",{requestId:h,bridgeKey:a,convKey:i,pendingToolCallIds:x.map(E=>E.toolCallId)}),We(a);}});}function Kc(e,t,n,s,o,r){let{accessToken:a,systemPrompt:i,model:d,modelId:l,bridgeKey:c,convKey:u,sessionId:h,completedTurns:R,maxMode:M,cursorModelParameters:S,getAccessToken:m}=n,{bridge:b,heartbeatTimer:g,blobStore:G,mcpTools:y,pendingExecs:C,currentTurn:x,checkpointRef:V,state:T,historyFingerprint:U}=e,X=Mt(process.env.PI_CURSOR_RESUME_IDLE_TIMEOUT_MS);f("native.tool_resume.start",{requestId:r,bridgeKey:c,convKey:u,toolResults:t,pendingExecs:C,currentTurn:x});for(let F of t){let v=x.steps.find(Z=>Z.kind==="toolCall"&&Z.toolCallId===F.toolCallId);v&&(v.result={content:F.content,images:F.images,isError:F.isError===true});}let N=sa(x),z=C.filter(F=>!N.has(F.toolCallId));if(z.length>0){bn(c,{bridge:b,heartbeatTimer:g,blobStore:G,mcpTools:y,pendingExecs:C,currentTurn:x,checkpointRef:V,state:T,historyFingerprint:U}),f("native.tool_resume.partial_wait",{requestId:r,bridgeKey:c,unresolvedExecs:z,currentTurn:x});let F=H.get(u);F&&_e(F,V.current,G,R,[...C],u);for(let v of z)s.toolCall(v);s.done("toolUse",T);return}for(let F of C){let v=N.get(F.toolCallId);if(!v)continue;let Z=create(ht,{result:{case:"success",value:create(Rt,{content:hn(v),isError:v.isError===true})}}),I=create(At,{id:F.execMsgId,execId:F.execId,message:{case:"mcpResult",value:Z}}),E=create(J,{message:{case:"execClientMessage",value:I}});b.write(O(toBinary(J,E))),f("native.tool_resume.sent_result",{requestId:r,exec:F,result:v});}let te={currentAttempt:1,maxRetries:Et(process.env.PI_CURSOR_STREAM_IDLE_MAX_RETRIES),recoverBeforeRetry:true,restart(F,v){te.currentAttempt=F;let Z=H.get(u),I=Za({stored:Z,toolResults:t,completedTurns:R,inFlightTurn:vn(x),rebuildReason:"synthesized_after_idle",sessionId:h,requestId:r??"native-tool-idle-retry",convKey:u});if(I.kind==="rebuild_full_history"){L("rebuild_full_history"),va("native.rebuild_full_history",{requestId:r,bridgeKey:c,convKey:u,modelId:l,decision:I});let w=[...I.completedTurns,I.inFlightTurn],ie=Ut(I.toolResults),ge={userText:I.wrappedText,steps:[],...ie.length?{userImages:ie}:{}},ne=pe({modelId:l,systemPrompt:i,userText:I.wrappedText,userImages:ie,turns:w,conversationId:I.conversationId,checkpoint:null,existingBlobStore:I.blobStore,maxMode:M,cursorModelParameters:S,mcpTools:y});return ne.mcpTools=y,Z&&(Z.lastAccessMs=Date.now()),Oe({accessToken:a,requestBytes:ne.requestBytes,blobStore:ne.blobStore,mcpTools:ne.mcpTools,model:d,modelId:l,bridgeKey:c,convKey:u,completedTurns:w,currentTurn:ge,writer:s,options:o,requestId:r,maxIdleRetries:te.maxRetries,streamIdleTimeoutMs:X,getAccessToken:m,systemPrompt:i,conversationId:I.conversationId,maxMode:M,cursorModelParameters:S}),true}if(I.kind!=="recover")return f("native.tool_resume.idle_retry_recovery_skipped",{requestId:r,bridgeKey:c,bridgeKeyPrefix:q(c),convKey:u,skipReason:I.reason,hadStoredCheckpoint:I.hadStoredCheckpoint,...I.expected!==void 0?{expected:I.expected}:{},...I.received!==void 0?{received:I.received}:{}}),s.error(`${ya()} ${Va({bridgeKey:c,hadStoredCheckpoint:I.hadStoredCheckpoint,skipReason:I.reason})}`,"error"),true;f("native.tool_resume.idle_retry_recover",{requestId:r,bridgeKey:c,bridgeKeyPrefix:q(c),convKey:u,recoveryPath:"stored_checkpoint",attempt:F,pendingToolCallIds:t.map(w=>w.toolCallId)});let E=Ut(t),D={userText:I.wrappedText,steps:[],...E.length?{userImages:E}:{}},Y=pe({modelId:l,systemPrompt:i,userText:I.wrappedText,userImages:E,turns:R,conversationId:I.conversationId,checkpoint:I.checkpoint,existingBlobStore:I.blobStore,maxMode:M,cursorModelParameters:S,mcpTools:y});return Y.mcpTools=y,Oe({accessToken:a,requestBytes:Y.requestBytes,blobStore:Y.blobStore,mcpTools:Y.mcpTools,model:d,modelId:l,bridgeKey:c,convKey:u,completedTurns:R,currentTurn:D,writer:s,options:o,requestId:r,maxIdleRetries:te.maxRetries,streamIdleTimeoutMs:X,getAccessToken:m,systemPrompt:i,conversationId:I.conversationId,maxMode:M,cursorModelParameters:S}),true}};Fa(b,g,G,y,d,l,c,u,R,x,s,o,r,te,X,V);}function Dc(e,t,n){return Ma(e,t,n)}function Lc(e,t,n,s=false){let o=`Cursor stream idle timeout after ${e}ms without upstream progress`,r=t===1?"attempt":"attempts",a=n===1?"retry":"retries",i=n>0?` over ${t} ${r} (${n} ${a})`:"";return `${o}${i}.${s?" Partial assistant output was already streamed; automatic retry requires a checkpoint and was unavailable or exhausted.":""} Tune PI_CURSOR_STREAM_IDLE_TIMEOUT_MS / PI_CURSOR_RESUME_IDLE_TIMEOUT_MS if long reasoning turns are expected.`}function Oe(e){let t=e.accessToken,n=e.requestBytes,s=e.blobStore,o=e.completedTurns,r=e.currentTurn,a={currentAttempt:1,maxRetries:e.maxIdleRetries??Et(process.env.PI_CURSOR_STREAM_IDLE_MAX_RETRIES),recoverBeforeRetry:e.recoverBeforeRetry??true,restart(i,d){if(a.currentAttempt=i,f(i===1?"native.stream.attempt_start":"native.stream.idle_retry_start",{requestId:e.requestId,bridgeKey:e.bridgeKey,convKey:e.convKey,modelId:e.modelId,attempt:i,maxRetries:a.maxRetries,hasCheckpoint:!!d.latestCheckpoint,emittedUserVisibleContent:d.emittedUserVisibleContent}),i>1&&d.latestCheckpoint&&typeof e.systemPrompt=="string"&&e.conversationId)try{let c=On,u=pe({modelId:e.modelId,systemPrompt:e.systemPrompt,userText:c,turns:d.completedTurns,conversationId:e.conversationId,checkpoint:d.latestCheckpoint,existingBlobStore:d.blobStore,maxMode:e.maxMode??!1,cursorModelParameters:e.cursorModelParameters??[],mcpTools:e.mcpTools});n=u.requestBytes,s=u.blobStore,o=d.completedTurns,r={userText:c,steps:[]};let h=H.get(e.convKey);h&&Wt(h,d.latestCheckpoint,d.blobStore,d.completedTurns,d.currentTurn,e.convKey),L("checkpoint_continuation"),f("native.stream.checkpoint_continuation",{requestId:e.requestId,bridgeKey:e.bridgeKey,convKey:e.convKey,attempt:i});}catch(c){if(f("native.stream.checkpoint_continuation_failed",{requestId:e.requestId,message:c instanceof Error?c.message:String(c)}),d.emittedUserVisibleContent)return false}else if(i>1&&d.emittedUserVisibleContent)return false;let l=c=>{t=c;let{bridge:u,heartbeatTimer:h}=Qr(c,n,{bridgeKey:e.bridgeKey});Fa(u,h,s,e.mcpTools,e.model,e.modelId,e.bridgeKey,e.convKey,o,r,e.writer,e.options,e.requestId,a,e.streamIdleTimeoutMs);};return i===1||!e.getAccessToken?(l(t),true):(e.getAccessToken({forceRefresh:true}).then(c=>{e.writer.closed||(L("idle_retry_token_refreshed"),l(c));}).catch(c=>{f("native.stream.idle_retry_token_refresh_failed",{requestId:e.requestId,message:c instanceof Error?c.message:String(c)}),!e.writer.closed&&l(t);}),true)}};a.restart(1,{emittedUserVisibleContent:false,latestCheckpoint:null,blobStore:e.blobStore,completedTurns:e.completedTurns,currentTurn:e.currentTurn});}var Be;function ss(){let e=process.env.PI_CURSOR_PROVIDER_DEBUG?.trim().toLowerCase();return !!e&&e!=="0"&&e!=="false"&&e!=="off"}function os(){if(Be)return Be;let e=process.env.PI_CURSOR_PROVIDER_EXTENSION_DEBUG_FILE?.trim();if(e)return Be=e,Be;let t=new Date().toISOString().replace(/[:.]/g,"-");return Be=join(tmpdir(),`pi-cursor-provider-extension-debug-${t}-${process.pid}.log`),Be}function $e(e,t=240){return e.length>t?`${e.slice(0,t)}\u2026<truncated ${e.length-t} chars>`:e}function Na(e){let t={base64Length:e.length};try{let n=Buffer.from(e.replace(/\s/g,""),"base64");n.length>0&&(t.byteLength=n.length,t.sha256=createHash("sha256").update(n).digest("hex").slice(0,16));}catch{}return t}function qc(e,t,n){return {type:e,mimeType:t,...typeof n=="string"?Na(n):{data:`<redacted base64 ${String(n??"").length} chars>`}}}function $c(e){let t=e.trim().match(/^data:([^;,]+)(?:;[^,]*)?;base64,(.*)$/is);return t?{mimeType:t[1]?.toLowerCase(),...Na(t[2])}:{url:e.startsWith("data:image/")?`<redacted data image ${e.length} chars>`:$e(e)}}function ed(e){return typeof e=="string"?$e(e):Array.isArray(e)?e.map(t=>{if(!t||typeof t!="object")return t;let n=t;switch(n.type){case "text":return {type:"text",text:$e(String(n.text??""))};case "thinking":return {type:"thinking",thinking:$e(String(n.thinking??""))};case "toolCall":return {type:"toolCall",id:n.id,name:n.name,arguments:n.arguments};case "image":return qc("image",n.mimeType,n.data);case "image_url":{let s=n.image_url?.url;return {type:"image_url",image_url:$c(typeof s=="string"?s:"")}}default:return n}}):e}function Ge(e){if(!e||typeof e!="object")return e;let t=e;return {role:t.role,stopReason:t.stopReason,toolCallId:t.toolCallId,toolName:t.toolName,isError:t.isError,errorMessage:t.errorMessage,content:ed(t.content)}}function es(e,t=6){try{let n=e.sessionManager?.getBranch?.();return Array.isArray(n)?{sessionId:e.sessionManager?.getSessionId?.(),leafId:e.sessionManager?.getLeafId?.(),size:n.length,tail:n.slice(-t).map(s=>{if(!s||typeof s!="object")return s;let o=s;return {type:o.type,id:o.id,parentId:o.parentId,customType:o.customType,message:Ge(o.message)}})}:void 0}catch(n){return {error:n instanceof Error?n.message:String(n)}}}function td(e){let t=new Set,n=Array.isArray(e.messages)?e.messages:[];for(let s of n){if(!s||typeof s!="object")continue;let o=s;o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&t.add(o.tool_call_id);}return t}function sp(e,t){let n=td(t);if(n.size===0)return [];let s=e.sessionManager?.getBranch?.();if(!Array.isArray(s))return [];let o=new Map;for(let r of s){if(!r||typeof r!="object")continue;let a=r.message;if(!a||typeof a!="object")continue;let i=a,d=typeof i.toolCallId=="string"?i.toolCallId:"";if(i.role!=="toolResult"||!d||!n.has(d))continue;let c=(Array.isArray(i.content)?i.content:[]).flatMap(h=>{if(!h||typeof h!="object")return [];let R=h;return R.type!=="image"||typeof R.data!="string"||typeof R.mimeType!="string"?[]:[{data:R.data,mimeType:R.mimeType}]});if(c.length===0)continue;let u=o.get(d);u?u.images.push(...c):o.set(d,{toolCallId:d,images:c});}return [...o.values()]}function P(e,t){if(!ss())return;let n=JSON.stringify({ts:new Date().toISOString(),pid:process.pid,scope:"extension",event:e,...t});appendFileSync(os(),`${n}
30
+ `));let a=e.filter(m=>m.role!=="system"),i=a.reduce((m,b,g)=>b.role==="user"?g:m,-1),d=m=>({enforceCursorCliLimits:true,dropInvalid:m!==i}),l=null,c=()=>{l&&(s.push(ta(l)),l=null);};for(let[m,b]of a.entries()){if(l&&tc(b)){l.steps.some(G=>G.kind==="toolCall"&&G.result?.images?.length)||nc(l,yn(b.content,{enforceCursorCliLimits:true,dropInvalid:true}));continue}if(b.role==="user"){c();let g=yn(b.content,d(m));l={userText:Ae(b.content),steps:[],...g.length>0?{userImages:g}:{},toolCallById:new Map,sawToolResult:false,sawAssistantAfterToolResult:false};continue}if(l){if(b.role==="assistant"){let g=Ae(b.content);g&&(l.sawToolResult&&(l.sawAssistantAfterToolResult=true),l.steps.push({kind:"assistantText",text:g}));for(let G of b.tool_calls??[]){let y={kind:"toolCall",toolCallId:G.id,toolName:G.function.name,arguments:vt(G.function.arguments)};l.steps.push(y),l.toolCallById.set(y.toolCallId,y);}continue}if(b.role==="tool"){let g=b.tool_call_id??"",G=yn(b.content,d(m)),y=ct(G,o.get(g)),C=sc(Ae(b.content),y),x=b.is_error===true,V=g?l.toolCallById.get(g):void 0;if(V)V.result={content:C,images:y,isError:x};else {let T={kind:"toolCall",toolCallId:g,toolName:"",arguments:{},result:{content:C,images:y,isError:x}};l.steps.push(T),g&&l.toolCallById.set(g,T);}l.sawToolResult=true;}}}let u="",h=[],R=[],M;if(l){let m=l.steps.filter(oc),b=m.some(y=>y.result),G=l.steps.at(-1)?.kind==="toolCall";l.steps.length===0||G?(u=l.userText,h=l.userImages??[],m.length>0&&(M=vn(l)),b&&(R=m.filter(na).map(y=>({toolCallId:y.toolCallId,content:y.result.content,...y.result.images?.length?{images:y.result.images}:{},...y.result.isError?{isError:true}:{}})))):s.push(ta(l));}let S={systemPrompt:n,userText:u,userImages:h,turns:s,toolResults:R,inFlightTurn:M};return f("parse_messages.end",S),S}var aa=1,cc="run-journal",ia=1440*60*1e3;function la(){let e=ke();if(!e)return;let t=join(e,cc);try{return mkdirSync(t,{recursive:!0}),t}catch{return}}function Bn(e){let t=la();if(!t)return;let n=e.replace(/[^a-zA-Z0-9._-]/g,"_").slice(0,64);return join(t,`${n}.json`)}function dc(e,t=64){let n=[],s=[...e.entries()],o=s.length>t?s.slice(s.length-t):s;for(let[r,a]of o)n.push({id:r,data:Buffer.from(a).toString("base64")});return n}function uc(e){let t=new Map;if(!e)return t;for(let n of e)try{t.set(n.id,new Uint8Array(Buffer.from(n.data,"base64")));}catch{}return t}function gc(e,t,n=Date.now()){return {version:aa,convKey:e,savedAt:n,conversationId:t.conversationId,sessionScoped:t.sessionScoped,...t.sessionId?{sessionId:t.sessionId}:{},checkpoint:t.checkpoint?Buffer.from(t.checkpoint).toString("base64"):null,...t.checkpointSource?{checkpointSource:t.checkpointSource}:{},...t.checkpointTurnCount!==void 0?{checkpointTurnCount:t.checkpointTurnCount}:{},...t.checkpointHistoryFingerprint?{checkpointHistoryFingerprint:t.checkpointHistoryFingerprint}:{},...t.midPausePendingToolCalls?{midPausePendingToolCalls:t.midPausePendingToolCalls}:{},...t.midPauseTurnCount!==void 0?{midPauseTurnCount:t.midPauseTurnCount}:{},...t.midPauseHistoryFingerprint?{midPauseHistoryFingerprint:t.midPauseHistoryFingerprint}:{},...t.midPauseRecordedAtMs!==void 0?{midPauseRecordedAtMs:t.midPauseRecordedAtMs}:{},blobs:dc(t.blobStore),lastAccessMs:t.lastAccessMs||n}}function mc(e){if(e.version!==aa||!e.conversationId||!e.convKey)return;let t=null;if(e.checkpoint)try{t=new Uint8Array(Buffer.from(e.checkpoint,"base64"));}catch{t=null;}return {conversationId:e.conversationId,checkpoint:t,...e.checkpointSource?{checkpointSource:e.checkpointSource}:{},...e.checkpointTurnCount!==void 0?{checkpointTurnCount:e.checkpointTurnCount}:{},...e.checkpointHistoryFingerprint?{checkpointHistoryFingerprint:e.checkpointHistoryFingerprint}:{},...e.midPausePendingToolCalls?{midPausePendingToolCalls:e.midPausePendingToolCalls}:{},...e.midPauseTurnCount!==void 0?{midPauseTurnCount:e.midPauseTurnCount}:{},...e.midPauseHistoryFingerprint?{midPauseHistoryFingerprint:e.midPauseHistoryFingerprint}:{},...e.midPauseRecordedAtMs!==void 0?{midPauseRecordedAtMs:e.midPauseRecordedAtMs}:{},sessionScoped:!!e.sessionScoped,...e.sessionId?{sessionId:e.sessionId}:{},blobStore:uc(e.blobs),lastAccessMs:e.lastAccessMs||e.savedAt||Date.now()}}function ca(e,t){let n=Bn(e);if(!n)return false;try{let s=gc(e,t),o=`${n}.${process.pid}.${Date.now()}.tmp`;return writeFileSync(o,JSON.stringify(s),"utf8"),renameSync(o,n),f("journal.write",{convKey:e,hasCheckpoint:!!t.checkpoint,midPause:!!t.midPausePendingToolCalls?.length,blobCount:t.blobStore.size}),!0}catch(s){return f("journal.write_failed",{convKey:e,message:s instanceof Error?s.message:String(s)}),false}}function da(e,t){let n=Bn(e);if(n)try{let s=readFileSync(n,"utf8"),o=JSON.parse(s),r=t?.now??Date.now(),a=t?.maxAgeMs??ia,i=r-(o.savedAt||o.lastAccessMs||0);if(!Number.isFinite(i)||i<0||i>a){f("journal.stale",{convKey:e,age:i});return}let d=mc(o);return d?(f("journal.read",{convKey:e,hasCheckpoint:!!d.checkpoint,midPause:!!d.midPausePendingToolCalls?.length}),d):void 0}catch{return}}function Tn(e){let t=Bn(e);if(t)try{unlinkSync(t);}catch{}}function ua(e=Date.now(),t=ia){let n=la();if(!n)return 0;let s=0;try{for(let o of readdirSync(n)){if(!o.endsWith(".json"))continue;let r=join(n,o);try{let a=readFileSync(r,"utf8"),i=JSON.parse(a),d=e-(i.savedAt||i.lastAccessMs||0);(!Number.isFinite(d)||d>t)&&(unlinkSync(r),s+=1);}catch{try{unlinkSync(r),s+=1;}catch{}}}}catch{return s}return s>0&&f("journal.evict",{removed:s}),s}var H=new Map,Zt=new Map;function Yn(e,t){ca(e,t);}function kn(e){let t=H.get(e);if(t)return t;let n=da(e);if(n)return H.set(e,n),n}function Nn(e=Date.now()){for(let[t,n]of H)!n.sessionScoped&&e-n.lastAccessMs>18e5&&(f("conversation.evict",{key:t,stored:n,now:e}),H.delete(t),Tn(t));ua(e);}function Me(e){return Gn(e)}function Xn(e){De(e);}function hc(e,t=false){e.checkpoint=null,delete e.checkpointSource,delete e.checkpointTurnCount,delete e.checkpointHistoryFingerprint,Xn(e),t&&e.blobStore.clear();}function Sc(e){try{return fromBinary(Ce,e),!0}catch{return false}}function Un(e,t,n,s){if(!e.checkpoint)return;let o=t.length,r=Me(t),a=e.checkpointTurnCount,i=e.checkpointHistoryFingerprint,d=e.midPauseTurnCount===o&&!!e.midPausePendingToolCalls?.length&&!!e.midPauseHistoryFingerprint&&e.midPauseHistoryFingerprint===r,l=a===o+1,c=d&&l,u=Sc(e.checkpoint)?a===void 0||!i?"missing_checkpoint_metadata":!c&&a!==o?"completed_turn_count_mismatch":!c&&i!==r?"completed_history_fingerprint_mismatch":void 0:"checkpoint_undecodable";u&&(f("chat.discard_checkpoint",{requestId:n,convKey:s,reason:u,storedCheckpointTurnCount:a,currentTurnCount:o,hasMidPauseForThisTurn:d,storedCheckpointHistoryFingerprint:i,currentHistoryFingerprint:r}),hc(e,true));}function ma(e,t=134217728){let n=0;for(let o of e.values())n+=o.byteLength;if(n<=t)return {removed:0,totalBytes:n};let s=0;for(let o of e.keys()){if(n<=t)break;let r=e.get(o);r&&(n-=r.byteLength,e.delete(o),s+=1);}return {removed:s,totalBytes:n}}function Pe(e,t){for(let[s,o]of t)e.blobStore.delete(s),e.blobStore.set(s,o);let n=ma(e.blobStore);n.removed>0&&f("conversation.blob_store_trimmed",{removed:n.removed,totalBytes:n.totalBytes,maxBytes:134217728}),e.lastAccessMs=Date.now();}function Wt(e,t,n,s,o,r){let a=[...s,o];Pe(e,n),e.checkpoint=t,e.checkpointSource="upstream",e.checkpointTurnCount=a.length,e.checkpointHistoryFingerprint=Me(a),Xn(e),e.lastAccessMs=Date.now(),r&&Yn(r,e);}function Ft(e,t,n,s,o){let r=H.get(e);r&&(t?Wt(r,t,n,s,o,e):(Pe(r,n),r.lastAccessMs=Date.now(),Yn(e,r)),f("native.stream.abort_state_saved",{convKey:e,hasCheckpoint:!!t,completedTurnCount:s.length,currentTurn:o}));}function _e(e,t,n,s,o,r){Pe(e,n);let a=Me(s);t?(e.checkpoint=t,e.checkpointSource="upstream",e.checkpointTurnCount=s.length,e.checkpointHistoryFingerprint=a):(e.checkpoint=null,e.checkpointSource="absent",delete e.checkpointTurnCount,delete e.checkpointHistoryFingerprint),e.midPausePendingToolCalls=o.map(i=>({toolCallId:i.toolCallId,toolName:i.toolName})),e.midPauseTurnCount=s.length,e.midPauseHistoryFingerprint=a,e.midPauseRecordedAtMs=Date.now(),e.lastAccessMs=Date.now(),r&&Yn(r,e);}function je(e){return e.stored?(_e(e.stored,e.latestCheckpoint,e.blobStore,e.completedTurns,e.pendingExecs,e.convKey),{committed:true}):{committed:false}}function pa(e){let t=Bt(e);return t?`session:${t}`:`anonymous:${Tt(e.messages)}`}async function Aa(e,t){let n=Zt.get(e)??Promise.resolve(),s,o=new Promise(a=>{s=a;}),r=n.catch(()=>{}).then(()=>o);Zt.set(e,r),await n.catch(()=>{});try{return await t()}finally{s(),Zt.get(e)===r&&Zt.delete(e);}}function Bt(e){let t=e.pi_session_id??e.user;if(typeof t!="string")return;let n=t.trim();return n||void 0}function Jn(e){return createHash("sha256").update(`bridge:${e}`).digest("hex").slice(0,16)}function wn(e){return createHash("sha256").update(`conv:${e}`).digest("hex").slice(0,16)}function Qn(e,t){if(t)return Jn(t);let n=e.find(o=>o.role==="user"),s=n?Ae(n.content):"";return createHash("sha256").update(`bridge:${s.slice(0,200)}`).digest("hex").slice(0,16)}function Tt(e,t){if(t)return wn(t);let n=e.find(o=>o.role==="user"),s=n?Ae(n.content):"";return createHash("sha256").update(`conv:${s.slice(0,200)}`).digest("hex").slice(0,16)}function Kn(e){if(!e)return;let t=Jn(e),n=wn(e),s=ee.get(t);f("session.cleanup",{sessionId:e,bridgeKey:t,convKey:n,hasActiveBridge:!!s,hadConversation:H.has(n)}),s&&Ee(s.bridge,s.heartbeatTimer,t),H.delete(n),Tn(n);}function Dn(e){let t=createHash("sha256").update(`cursor-conv-id:${e}`).digest("hex").slice(0,32);return [t.slice(0,8),t.slice(8,12),`4${t.slice(13,16)}`,`${(8|parseInt(t[16],16)&3).toString(16)}${t.slice(17,20)}`,t.slice(20,32)].join("-")}var ha="model-catalog.json",Ln=1,Cc=720*60*60*1e3,Fe;function Yt(){if(Fe!==void 0)return Fe??void 0;Fe=null;let e=Ie(ha);if(e)try{let t=JSON.parse(readFileSync(e,"utf8"));return t?.version!==Ln||typeof t.savedAt!="number"||!Array.isArray(t.rawModels)||!Array.isArray(t.parameterizedModels)||Date.now()-t.savedAt>Cc||t.rawModels.length===0&&t.parameterizedModels.length===0?void 0:(Fe={version:Ln,tokenHash:typeof t.tokenHash=="string"?t.tokenHash:"",savedAt:t.savedAt,rawModels:t.rawModels,parameterizedModels:t.parameterizedModels},Fe)}catch{return}}function zn(e){if(e.rawModels.length===0&&e.parameterizedModels.length===0)return;let t={version:Ln,tokenHash:e.tokenHash,savedAt:Date.now(),rawModels:e.rawModels,parameterizedModels:e.parameterizedModels};Fe=t;let n=Ie(ha);if(n)try{writeFileSync(n,JSON.stringify(t),{mode:384});}catch{}}async function Pn(e){if(at())try{let s=await Vs({accessToken:e.accessToken,rpcPath:e.rpcPath,requestBody:e.requestBody,url:e.url,timeoutMs:e.timeoutMs,signal:e.signal}),o=s.status>=200&&s.status<300;return {body:s.body,exitCode:o?0:1,timedOut:!1}}catch{if(e.signal?.aborted)return {body:new Uint8Array(0),exitCode:1,timedOut:true}}let t=Ur()({accessToken:e.accessToken,rpcPath:e.rpcPath,url:e.url,unary:true}),n=[];return new Promise(s=>{let o=false,r=e.timeoutMs??5e3,a=r>0?setTimeout(()=>{o=true;try{t.proc.kill();}catch{}},r):void 0;t.onData(i=>{n.push(Buffer.from(i));}),t.onClose(i=>{a&&clearTimeout(a),s({body:Buffer.concat(n),exitCode:i,timedOut:o});}),t.write(e.requestBody),t.end();})}var kt=null,Nt=null,Ra=300*1e3;function _n(e){return createHash("sha256").update(e).digest("hex").slice(0,16)}async function fa(e,t){let n=_n(e);if(kt?.tokenHash===n&&Date.now()<kt.expiresAt)return kt.models;try{let s=create(on,{}),o=toBinary(on,s),r=await Pn({accessToken:e,rpcPath:"/agent.v1.AgentService/GetUsableModels",requestBody:o,url:ue(),signal:t?.signal});if(!r.timedOut&&r.exitCode===0&&r.body.length>0){let a=null;try{a=fromBinary(rn,r.body);}catch{let i=Ca(r.body);if(i)try{a=fromBinary(rn,i);}catch{a=null;}}if(a?.models?.length){let i=Mc(a.models);if(i.length>0)return kt={tokenHash:n,models:i,expiresAt:Date.now()+Ra},i}}}catch(s){console.error("[cursor-provider] Model discovery failed:",s instanceof Error?s.message:s);}return console.warn("[cursor-provider] Model discovery returned no models"),[]}function Ca(e){if(e.length<5)return null;let t=0;for(;t+5<=e.length;){let n=e[t],o=new DataView(e.buffer,e.byteOffset+t,e.byteLength-t).getUint32(1,false),r=t+5+o;if(r>e.length||(n&1)!==0)return null;if((n&2)===0)return e.subarray(t+5,r);t=r;}return null}async function ba(e,t){let n=_n(e);if(Nt?.tokenHash===n&&Date.now()<Nt.expiresAt)return Nt.models;try{let s=await Pn({accessToken:e,rpcPath:"/aiserver.v1.AiService/AvailableModels",requestBody:pr(),signal:t?.signal});if(s.timedOut||s.exitCode!==0||s.body.length===0)return [];let o=Ca(s.body)??s.body,r=Ar(o);return Nt={tokenHash:n,models:r,expiresAt:Date.now()+Ra},r}catch(s){return console.error("[cursor-provider] Parameterized model discovery failed:",s instanceof Error?s.message:s),[]}}async function He(e,t){let[n,s]=await Promise.all([fa(e,t),ba(e,t)]);return (n.length>0||s.length>0)&&zn({tokenHash:_n(e),rawModels:n,parameterizedModels:s}),{rawModels:n,parameterizedModels:s}}function xa(e,t){let n=`${e} ${t}`.toLowerCase();return /\b1\s*m\b|(?:^|-)1m(?:-|$)/.test(n)?1e6:/\b272\s*k\b|(?:^|-)272k(?:-|$)/.test(n)?272e3:2e5}function Mc(e){let t=new Map;for(let n of e){let s=n,o=s?.modelId?.trim?.();if(!o)continue;let r=s.displayName||s.displayNameShort||s.displayModelId||o;t.set(o,{id:o,name:r,reasoning:!!s.thinkingDetails,contextWindow:xa(o,r),maxTokens:64e3});}return [...t.values()].sort((n,s)=>n.id.localeCompare(s.id))}var Gc=/\b(401|403|unauthenticated|unauthorized|forbidden|invalid[_ ]token|token (?:expired|revoked)|auth(?:entication|orization) (?:failed|error))\b/i,Ic=/\b(429|resource_exhausted|rate[_ ]?limit|too many requests)\b/i,yc=/\bGOAWAY\b/i,Vc=/\b(ECONNRESET|ENOTFOUND|EAI_AGAIN|EPIPE|socket hang up|connection reset)\b/i,vc=/\b(ETIMEDOUT|timed? ?out|timeout)\b/i,Zc=/\b(protocol|protobuf|wire drift|invalid argument|failed_precondition)\b/i;function jn(e){let t=(e.stderr||"").trim(),s=[(e.endErrorMessage||"").trim(),t].filter(Boolean).join(" | ");return e.exitCode===2||yc.test(s)?{kind:"goaway",retryable:true,refreshAuth:false,message:s?`Cursor upstream closed the connection (GOAWAY): ${s}`:"Cursor upstream closed the connection (GOAWAY).",exitCode:e.exitCode,stderr:t||void 0}:Gc.test(s)?{kind:"authentication",retryable:true,refreshAuth:true,message:s||"Cursor authentication failed.",exitCode:e.exitCode,stderr:t||void 0}:Ic.test(s)?{kind:"rate_limit",retryable:true,refreshAuth:false,message:s||"Cursor rate limited the request.",exitCode:e.exitCode,stderr:t||void 0}:vc.test(s)?{kind:"socket_timeout",retryable:true,refreshAuth:false,message:s||"Cursor transport timed out.",exitCode:e.exitCode,stderr:t||void 0}:Vc.test(s)?{kind:"connection_reset",retryable:true,refreshAuth:false,message:s||"Cursor connection was reset.",exitCode:e.exitCode,stderr:t||void 0}:Zc.test(s)?{kind:"protocol_drift",retryable:false,refreshAuth:false,message:s||"Cursor protocol mismatch.",exitCode:e.exitCode,stderr:t||void 0}:e.exitCode!==0?{kind:"bridge_crash",retryable:true,refreshAuth:false,message:s?`Bridge connection lost (exit ${e.exitCode}): ${s}`:`Bridge connection lost (exit ${e.exitCode}).`,exitCode:e.exitCode,stderr:t||void 0}:{kind:"unknown",retryable:false,refreshAuth:false,message:s||"Bridge closed cleanly.",exitCode:e.exitCode,stderr:t||void 0}}function Hn(e){let t=[];return e.retryable&&t.push("A checkpoint/history recovery may continue the turn."),e.refreshAuth&&t.push("Token may need refresh \u2014 run /login cursor or check /cursor.doctor tokenSource."),e.kind==="protocol_drift"&&t.push("Pin PI_CURSOR_CLIENT_VERSION or regenerate proto if wire drift persists."),t.length?`${e.message} ${t.join(" ")}`:e.message}var On="[pi-cursor] The previous upstream stream was interrupted. Continue exactly where you left off. Do not repeat content already produced.";function qn(e,t){if(!t)return e;let n="",s=e;return s.endsWith("-fast")?(n="-fast",s=s.slice(0,-5)):s.endsWith("-thinking")&&(n="-thinking",s=s.slice(0,-9)),`${s}-${t}${n}`}function Ea(e){return !!e&&typeof e=="object"&&typeof e.modelId=="string"}function Ma(e,t,n){if(typeof e=="string"){let a=typeof n=="string"?n.trim():"";return a||qn(e,t)}let o=(n instanceof Map?n:void 0)?.get(e.id),r;return Ea(o)?r=o:o&&(r=o[t??""]??o.none??o.medium??o.high??Object.values(o).find(Ea)),{modelId:r?.modelId??qn(e.id,t),maxMode:!!(r?.requestedMaxMode??r?.requiresMaxMode),parameters:r?.parameters,requestedMaxMode:r?.requestedMaxMode,requiresMaxMode:r?.requiresMaxMode}}var Wc=/\b(unauthenticated|unauthorized|permission[_ ]?denied|auth(?:entication)?[_ ]?failed|invalid[_ ]?token|expired[_ ]?token|401)\b/i,Fc=/\b(failed to parse|decode|invalid wire|protocol|connect error|unknown field|premature eof)\b/i;function $n(e){return Wc.test(e)}function Bc(e){return Fc.test(e)}function Tc(e){let t=Se();return `${e} [protocol-hint: Cursor wire may have drifted. clientVersion=${t}. Try bumping PI_CURSOR_CLIENT_VERSION or re-run /cursor.doctor.]`}function Ga(e){let t=mt();if(!t)return e;let n=gt()?"unhandled wire messages \u2014 the turn may have been left waiting on one":"unknown wire fields \u2014 schema is likely behind Cursor";return `${e} [wire-drift: ${n}. Observed: ${t}. Regenerate the schema (see proto/README.md) or bump PI_CURSOR_CLIENT_VERSION; /cursor.doctor shows the full list.]`}function Ia(e){return $n(e)?`${e} [auth-hint: token may be expired. Idle stream retries force-refresh credentials; if this persists run /login cursor or check /cursor.doctor tokenSource.]`:Bc(e)?Ga(Tc(e)):Ga(e)}function Uc(e,t){let n=Fr(t),s=false,o=false,r,a=()=>{s||(s=true,e.push({type:"start",partial:n}));},i=()=>{if(!r||r.ended)return;let l=n.content[r.contentIndex];r.kind==="text"&&l?.type==="text"?e.push({type:"text_end",contentIndex:r.contentIndex,content:l.text,partial:n}):r.kind==="thinking"&&l?.type==="thinking"&&e.push({type:"thinking_end",contentIndex:r.contentIndex,content:l.thinking,partial:n}),r.ended=true,r=void 0;},d=l=>{if(a(),r?.kind===l&&!r.ended)return r.contentIndex;i();let c=n.content.length;return l==="text"?(n.content.push({type:"text",text:""}),e.push({type:"text_start",contentIndex:c,partial:n})):(n.content.push({type:"thinking",thinking:""}),e.push({type:"thinking_start",contentIndex:c,partial:n})),r={kind:l,contentIndex:c,ended:false},c};return {output:n,get closed(){return o},start:a,text(l){if(o||!l)return;let c=d("text"),u=n.content[c];u?.type==="text"&&(u.text+=l,e.push({type:"text_delta",contentIndex:c,delta:l,partial:n}));},thinking(l){if(o||!l)return;let c=d("thinking"),u=n.content[c];u?.type==="thinking"&&(u.thinking+=l,e.push({type:"thinking_delta",contentIndex:c,delta:l,partial:n}));},toolCall(l){if(o)return;a(),i();let c=n.content.length,u=vt(l.decodedArgs),h={type:"toolCall",id:l.toolCallId,name:l.toolName,arguments:{}};n.content.push(h),e.push({type:"toolcall_start",contentIndex:c,partial:n}),h.arguments=u,e.push({type:"toolcall_delta",contentIndex:c,delta:l.decodedArgs,partial:n}),e.push({type:"toolcall_end",contentIndex:c,toolCall:{type:"toolCall",id:l.toolCallId,name:l.toolName,arguments:u},partial:n});},done(l,c){o||(a(),i(),Cn(n,t,c),n.stopReason=l,e.push({type:"done",reason:l,message:n}),o=true,e.end(n));},error(l,c,u){o||(a(),i(),Cn(n,t,u),n.stopReason=c,n.errorMessage=l,e.push({type:"error",reason:c,error:n}),o=true,e.end(n));}}}function ya(){return Hr()}function q(e){return En(e)}function Va(e){return Or(e)}function Ut(e){return e.flatMap(t=>(t.images??[]).map(Ys))}function Jc(e){return e.some(t=>t.content.includes("[Recovered tool output after upstream bridge loss")||t.content.includes("[End recovered tool output"))}function wc(e){return (e.userImages?.length??0)>0}function va(e,t){let n={requestId:t.requestId,bridgeKeyPrefix:q(t.bridgeKey),convKey:t.convKey,modelId:t.modelId,rebuildReason:t.decision.rebuildReason,completedTurnCount:t.decision.completedTurns.length,inFlightTurnHasImages:wc(t.decision.inFlightTurn),toolResultCount:t.decision.toolResults.length,pendingToolCallIds:t.decision.toolResults.map(o=>o.toolCallId),sentinelInjectionDetected:Jc(t.decision.toolResults)};f(e,n);let s={metric:"cursor_provider.rebuild_full_history",reason:t.decision.rebuildReason,model:t.modelId,count:1,requestId:t.requestId,bridgeKeyPrefix:q(t.bridgeKey),convKey:t.convKey};f("metric.cursor_provider.rebuild_full_history",s),Qs("metric.cursor_provider.rebuild_full_history",s);}function Za(e){return ea({...e,discardStaleCheckpoint:Un})}function Wa(e){return (t,n,s)=>{let o=createAssistantMessageEventStream(),r=Uc(o,t);return r.start(),(async()=>{let a=Yr(t,n,s,e);if(s?.onPayload){let i=await s.onPayload(a,t);i&&typeof i=="object"&&(a=i);}await Aa(pa(a),async()=>{if(r.closed)return;let i=await e.getAccessToken();await Qc(a,i,t,s,r,Ks(),e.getAccessToken);});})().catch(a=>{r.error(a instanceof Error?a.message:String(a),"error");}),o}}async function Qc(e,t,n,s,o,r,a){let i;try{i=Zn(e.messages,e.cursor_tool_result_images);}catch(Z){o.error(Z instanceof Error?Z.message:String(Z),"error");return}let d=kr(e);if(d){f("native.unsupported_parameters",{requestId:r,message:d}),o.error(d,"error");return}let l=Nr(e.tools??[],e.tool_choice);if("error"in l){f("native.unsupported_tool_choice",{requestId:r,tool_choice:e.tool_choice}),o.error(l.error,"error");return}let{systemPrompt:c,userText:u,userImages:h,turns:R,toolResults:M,inFlightTurn:S}=i,m=l.tools.length>0&&M.length===0&&h.length===0&&pn(u),b=m?[]:l.tools;m&&(L("tools_omitted_trivial_turn"),se("tools_omitted",{requestId:r,reason:"trivial_conversational_turn",originalToolCount:l.tools.length}));let g=Dc(e.model,e.reasoning_effort,e.cursor_model_id),G=typeof e.cursor_model_max_mode=="boolean"?e.cursor_model_max_mode:e.cursor_requires_max_mode===true,y=Bt(e),C=Qn(e.messages,y),x=Tt(e.messages,y),V=ee.get(C);if(f("native.request",{requestId:r,sessionId:y,bridgeKey:C,convKey:x,model:e.model,resolvedModelId:g,cursorModelId:e.cursor_model_id,cursorModelParameters:e.cursor_model_parameters,cursorRequiresMaxMode:e.cursor_requires_max_mode,cursorModelMaxMode:e.cursor_model_max_mode,maxMode:G,messageCount:e.messages.length,turnCount:R.length,userText:u,toolResults:M,inFlightTurn:S,hasActiveBridge:!!V}),!u&&h.length===0&&M.length===0){o.error("No user message found","error");return}if(M.length>0){let Z=Mt(process.env.PI_CURSOR_RESUME_IDLE_TIMEOUT_MS);if(V){We(C);let Y=Me(R),w=!!y||V.historyFingerprint===Y;if(w||(f("bridge.active_history_mismatch",{requestId:r,bridgeKey:C,bridgeKeyPrefix:q(C),convKey:x,storedFingerprint:V.historyFingerprint,currentFingerprint:Y}),L("active_bridge_history_mismatch")),V.bridge.alive&&w){Kc(V,M,{accessToken:t,systemPrompt:c,model:n,modelId:g,bridgeKey:C,convKey:x,sessionId:y,completedTurns:R,maxMode:G,cursorModelParameters:e.cursor_model_parameters??[],getAccessToken:a},o,s,r);return}clearInterval(V.heartbeatTimer),V.bridge.end();}let I=kn(x),E=Za({stored:I,toolResults:M,completedTurns:R,inFlightTurn:S,sessionId:y,requestId:r,convKey:x});if(E.kind==="recover"){L("recovered_via_checkpoint"),f("bridge.recovered_via_checkpoint",{requestId:r,bridgeKey:C,bridgeKeyPrefix:q(C),convKey:x,recoveryPath:"stored_checkpoint",pendingToolCallIds:M.map(ne=>ne.toolCallId)});let Y=xt(b),w=Ut(M),ie={userText:E.wrappedText,steps:[],...w.length?{userImages:w}:{}},ge=pe({modelId:g,systemPrompt:c,userText:E.wrappedText,userImages:w,turns:R,conversationId:E.conversationId,checkpoint:E.checkpoint,existingBlobStore:E.blobStore,maxMode:G,cursorModelParameters:e.cursor_model_parameters,mcpTools:Y});ge.mcpTools=Y,Oe({accessToken:t,requestBytes:ge.requestBytes,blobStore:ge.blobStore,mcpTools:ge.mcpTools,model:n,modelId:g,bridgeKey:C,convKey:x,completedTurns:R,currentTurn:ie,writer:o,options:s,requestId:r,streamIdleTimeoutMs:Z,getAccessToken:a,systemPrompt:c,conversationId:E.conversationId,maxMode:G,cursorModelParameters:e.cursor_model_parameters??[]});return}if(E.kind==="rebuild_full_history"){L("rebuild_full_history"),va("native.rebuild_full_history",{requestId:r,bridgeKey:C,convKey:x,modelId:g,decision:E});let Y=xt(b),w=[...E.completedTurns,E.inFlightTurn],ie=Ut(E.toolResults),ge={userText:E.wrappedText,steps:[],...ie.length?{userImages:ie}:{}},ne=pe({modelId:g,systemPrompt:c,userText:E.wrappedText,userImages:ie,turns:w,conversationId:E.conversationId,checkpoint:null,existingBlobStore:E.blobStore,maxMode:G,cursorModelParameters:e.cursor_model_parameters,mcpTools:Y});ne.mcpTools=Y,I&&(I.lastAccessMs=Date.now()),Oe({accessToken:t,requestBytes:ne.requestBytes,blobStore:ne.blobStore,mcpTools:ne.mcpTools,model:n,modelId:g,bridgeKey:C,convKey:x,completedTurns:w,currentTurn:ge,writer:o,options:s,requestId:r,streamIdleTimeoutMs:Z,getAccessToken:a,systemPrompt:c,conversationId:E.conversationId,maxMode:G,cursorModelParameters:e.cursor_model_parameters??[]});return}bs(E.reason),L(`recovery_skipped:${E.reason}`),f("bridge.recovery_skipped",{requestId:r,bridgeKey:C,bridgeKeyPrefix:q(C),convKey:x,skipReason:E.reason,hadStoredCheckpoint:E.hadStoredCheckpoint,...E.expected!==void 0?{expected:E.expected}:{},...E.received!==void 0?{received:E.received}:{}});let D=`${ya()} ${Va({bridgeKey:C,hadStoredCheckpoint:E.hadStoredCheckpoint,skipReason:E.reason})}`;f("native.lost_tool_continuation",{requestId:r,bridgeKey:C,bridgeKeyPrefix:q(C),convKey:x,skipReason:E.reason,toolResults:M,message:D}),o.error(D,"error");return}V&&ee.has(C)&&(clearInterval(V.heartbeatTimer),V.bridge.end(),We(C));let T=kn(x);T||(T={conversationId:Dn(x),checkpoint:null,sessionScoped:!!y,...y?{sessionId:y}:{},blobStore:new Map,lastAccessMs:Date.now()},H.set(x,T)),T.lastAccessMs=Date.now(),Nn(),Un(T,R,r,x);let U=xt(b),X=u,N=u||h.length>0?h:[],z=pe(g,c,X,R,T.conversationId,T.checkpoint,T.blobStore,G,e.cursor_model_parameters,U,N);z.mcpTools=U;let te={userText:X,steps:[],...N.length>0?{userImages:N}:{}},F=An({systemPrompt:c,userText:X,tools:b,mcpTools:U,requestBytes:z.requestBytes,blobStore:z.blobStore,turnCount:R.length}),v=`approxTokens=${F.approxInputTokens} systemChars=${F.systemChars} userChars=${F.userChars} tools=${F.toolCount} toolJsonChars=${F.toolJsonChars} mcpSchemaBytes=${F.mcpSchemaBytes} requestBytes=${F.requestBytes} blobBytes=${F.blobBytes} wireBytes=${F.wireBytes} turns=${F.turnCount}`;Ms(v),se("request_size",{requestId:r,bridgeKey:q(C),convKey:x,modelId:g,...F}),f("native.dispatch_stream",{requestId:r,bridgeKey:C,convKey:x,conversationId:T.conversationId,hasCheckpoint:!!T.checkpoint,requestSize:F,payload:z}),Oe({accessToken:t,requestBytes:z.requestBytes,blobStore:z.blobStore,mcpTools:z.mcpTools,model:n,modelId:g,bridgeKey:C,convKey:x,completedTurns:R,currentTurn:te,writer:o,options:s,requestId:r,getAccessToken:a,recoverBeforeRetry:true,systemPrompt:c,conversationId:T.conversationId,maxMode:G,cursorModelParameters:e.cursor_model_parameters??[]});}function Fa(e,t,n,s,o,r,a,i,d,l,c,u,h,R,M=Sn(process.env.PI_CURSOR_STREAM_IDLE_TIMEOUT_MS),S={current:null}){f("native.stream.start",{requestId:h,bridgeKey:a,convKey:i,modelId:r,attempt:R?.currentAttempt??1,maxRetries:R?.maxRetries??0}),se("stream_start",{requestId:h,bridgeKey:q(a),convKey:i,modelId:r,attempt:R?.currentAttempt??1});let m={toolCallIndex:0,pendingExecs:[],outputTokens:0,totalTokens:0},b=vr(),g=false,G=false,y=null,C=false,x=[],V=false,T,U=()=>T??=Me(d),X=Ir({timeoutMs:M,onTimeout:()=>{if(G||c.closed)return;G=true,X.clear();let v=R?.currentAttempt??1,Z=R?.maxRetries??0,I={emittedUserVisibleContent:C,latestCheckpoint:S.current,blobStore:n,completedTurns:d,currentTurn:l};f("native.stream.idle_timeout",{requestId:h,bridgeKey:a,convKey:i,modelId:r,timeoutMs:M,attempt:v,maxRetries:Z,emittedUserVisibleContent:C,hasCheckpoint:!!S.current}),Gs({timeoutMs:M,attempt:v,event:"idle_timeout"}),Ft(i,S.current,n,d,l),Ee(e,t,a),u?.signal?.removeEventListener("abort",N);let E=yt({emittedUserVisibleContent:C,hasCheckpoint:!!S.current});if(R?.recoverBeforeRetry&&E){f("native.stream.idle_recovery_before_retry",{requestId:h,bridgeKey:a,bridgeKeyPrefix:q(a),convKey:i,modelId:r,attempt:v,maxRetries:Z,hasCheckpoint:!!S.current,emittedUserVisibleContent:C}),L("idle_recovery_before_retry");try{if(R.restart(v,I))return}catch(Y){f("native.stream.idle_recovery_before_retry_error",{requestId:h,bridgeKey:a,bridgeKeyPrefix:q(a),convKey:i,modelId:r,message:Y instanceof Error?Y.message:String(Y)});}}let D=v;if(R&&v<=Z&&E){let Y=v+1;D=Y,f("native.stream.idle_retry",{requestId:h,bridgeKey:a,convKey:i,modelId:r,attempt:v,nextAttempt:Y,maxRetries:Z,hasCheckpoint:!!S.current,emittedUserVisibleContent:C}),L("idle_retry");try{if(R.restart(Y,I))return}catch(w){f("native.stream.idle_retry_error",{requestId:h,bridgeKey:a,convKey:i,modelId:r,message:w instanceof Error?w.message:String(w)});}}c.error(Lc(M,D,Z,C),"error",m);}}),N=()=>{G||c.closed||(G=true,Ft(i,S.current,n,d,l),f("native.stream.abort",{requestId:h,bridgeKey:a,convKey:i,hasCheckpoint:!!S.current}),X.clear(),Ee(e,t,a),c.error("Aborted","aborted",m));};u?.signal?.addEventListener("abort",N,{once:true}),X.start();let z=(v,Z)=>{if(c.closed||V)return;if(Z){C=true,c.thinking(v);return}let{content:I,reasoning:E}=b.process(v);E&&(C=true,c.thinking(E)),I&&(C=true,Vn(l,I),c.text(I));},te=()=>{if(V)return;let v=b.flush();v.reasoning&&(C=true,c.thinking(v.reasoning)),v.content&&(C=true,Vn(l,v.content),c.text(v.content));},F=lr(v=>{try{let Z=fromBinary(oo,v);Vr(Z,n,s,E=>e.write(E),m,z,E=>{X.pause(),m.pendingExecs.push(E),g=!0,te(),l.steps.push({kind:"toolCall",toolCallId:E.toolCallId,toolName:E.toolName,arguments:vt(E.decodedArgs)}),c.closed||(c.toolCall(E),x.push(E),V=!0);let D=H.get(i);D&&x.length>0&&(_e(D,S.current,n,d,x,i),f(S.current?"native.stream.tool_call_checkpoint_saved":"native.stream.tool_call_snapshot_saved",{requestId:h,bridgeKey:a,convKey:i,checkpointSource:S.current?"upstream":"absent",pendingToolCallIds:x.map(Y=>Y.toolCallId)})),bn(a,{bridge:e,heartbeatTimer:t,blobStore:n,mcpTools:s,pendingExecs:m.pendingExecs,currentTurn:l,checkpointRef:S,state:m,historyFingerprint:U()}),f("native.stream.tool_call_pause",{requestId:h,bridgeKey:a,exec:E,pendingExecs:m.pendingExecs,emittedToolCallIds:x.map(Y=>Y.toolCallId),currentTurn:l});},E=>{S.current=E,f("native.stream.checkpoint_buffered",{requestId:h,convKey:i,checkpointBytes:E});})&&X.reset();}catch(Z){let I=Z instanceof Error?Z.message:String(Z);f("native.stream.process_error",{requestId:h,message:I}),c.closed||c.error(I,"error",m);}},v=>{let Z=cr(v);if(Z){y=Z;let I=Ia(Z.message);f("native.stream.cursor_error",{requestId:h,modelId:r,message:Z.message,enhanced:I,isAuthError:$n(Z.message),deferredToToolPause:V}),V||c.error(I,"error",m);}});e.onData(v=>{F(v),V&&(V=false,c.closed||c.done("toolUse",m));}),e.onClose(v=>{if(f("native.stream.bridge_close",{requestId:h,bridgeKey:a,convKey:i,code:v,cancelled:G,mcpExecReceived:g,currentTurn:l,latestCheckpoint:S.current}),se("bridge_close",{requestId:h,bridgeKey:q(a),convKey:i,code:v,cancelled:G,mcpExecReceived:g,emittedUserVisibleContent:C,hasCheckpoint:!!S.current}),X.clear(),clearInterval(t),u?.signal?.removeEventListener("abort",N),G)return;let Z=H.get(i);if(y){if(g){let I=je({stored:Z,latestCheckpoint:S.current,blobStore:n,completedTurns:d,pendingExecs:x,convKey:i});f(I.committed?"bridge.died_mid_pause_checkpoint_saved":"bridge.died_mid_pause_no_checkpoint",{requestId:h,bridgeKey:a,convKey:i,cause:"stream_error",pendingToolCallIds:x.map(E=>E.toolCallId)});}We(a);return}if(v!==0){let I=jn({exitCode:v,stderr:typeof e.lastStderr=="function"?e.lastStderr():""});if(I.retryable&&yt({emittedUserVisibleContent:C,hasCheckpoint:!!S.current})&&R){let D=R.currentAttempt,Y=R.maxRetries;if(D<=Y){f("native.stream.transport_retry",{requestId:h,bridgeKey:a,convKey:i,modelId:r,attempt:D,maxRetries:Y,failureKind:I.kind,hasCheckpoint:!!S.current,emittedUserVisibleContent:C}),L(`transport_retry:${I.kind}`),Ft(i,S.current,n,d,l),Ee(e,t,a),u?.signal?.removeEventListener("abort",N);try{if(R.restart(D+1,{emittedUserVisibleContent:C,latestCheckpoint:S.current,blobStore:n,completedTurns:d,currentTurn:l}))return}catch{}}}if(g){let D=je({stored:Z,latestCheckpoint:S.current,blobStore:n,completedTurns:d,pendingExecs:x,convKey:i});f(D.committed?"bridge.died_mid_pause_checkpoint_saved":"bridge.died_mid_pause_no_checkpoint",{requestId:h,bridgeKey:a,convKey:i,code:v,failureKind:I.kind,pendingToolCallIds:x.map(Y=>Y.toolCallId)});}c.error(Hn(I),"error",m),We(a);return}if(!g)te(),Z&&(S.current?(Wt(Z,S.current,n,d,l,i),f("native.stream.checkpoint_committed",{requestId:h,convKey:i,stored:Z})):Pe(Z,n)),c.done("stop",m);else {let I=je({stored:Z,latestCheckpoint:S.current,blobStore:n,completedTurns:d,pendingExecs:x,convKey:i});f(I.committed?"bridge.died_mid_pause_checkpoint_saved":"bridge.died_mid_pause_no_checkpoint",{requestId:h,bridgeKey:a,convKey:i,pendingToolCallIds:x.map(E=>E.toolCallId)}),We(a);}});}function Kc(e,t,n,s,o,r){let{accessToken:a,systemPrompt:i,model:d,modelId:l,bridgeKey:c,convKey:u,sessionId:h,completedTurns:R,maxMode:M,cursorModelParameters:S,getAccessToken:m}=n,{bridge:b,heartbeatTimer:g,blobStore:G,mcpTools:y,pendingExecs:C,currentTurn:x,checkpointRef:V,state:T,historyFingerprint:U}=e,X=Mt(process.env.PI_CURSOR_RESUME_IDLE_TIMEOUT_MS);f("native.tool_resume.start",{requestId:r,bridgeKey:c,convKey:u,toolResults:t,pendingExecs:C,currentTurn:x});for(let F of t){let v=x.steps.find(Z=>Z.kind==="toolCall"&&Z.toolCallId===F.toolCallId);v&&(v.result={content:F.content,images:F.images,isError:F.isError===true});}let N=sa(x),z=C.filter(F=>!N.has(F.toolCallId));if(z.length>0){bn(c,{bridge:b,heartbeatTimer:g,blobStore:G,mcpTools:y,pendingExecs:C,currentTurn:x,checkpointRef:V,state:T,historyFingerprint:U}),f("native.tool_resume.partial_wait",{requestId:r,bridgeKey:c,unresolvedExecs:z,currentTurn:x});let F=H.get(u);F&&_e(F,V.current,G,R,[...C],u);for(let v of z)s.toolCall(v);s.done("toolUse",T);return}for(let F of C){let v=N.get(F.toolCallId);if(!v)continue;let Z=create(ht,{result:{case:"success",value:create(Rt,{content:hn(v),isError:v.isError===true})}}),I=create(At,{id:F.execMsgId,execId:F.execId,message:{case:"mcpResult",value:Z}}),E=create(J,{message:{case:"execClientMessage",value:I}});b.write(O(toBinary(J,E))),f("native.tool_resume.sent_result",{requestId:r,exec:F,result:v});}let te={currentAttempt:1,maxRetries:Et(process.env.PI_CURSOR_STREAM_IDLE_MAX_RETRIES),recoverBeforeRetry:true,restart(F,v){te.currentAttempt=F;let Z=H.get(u),I=Za({stored:Z,toolResults:t,completedTurns:R,inFlightTurn:vn(x),rebuildReason:"synthesized_after_idle",sessionId:h,requestId:r??"native-tool-idle-retry",convKey:u});if(I.kind==="rebuild_full_history"){L("rebuild_full_history"),va("native.rebuild_full_history",{requestId:r,bridgeKey:c,convKey:u,modelId:l,decision:I});let w=[...I.completedTurns,I.inFlightTurn],ie=Ut(I.toolResults),ge={userText:I.wrappedText,steps:[],...ie.length?{userImages:ie}:{}},ne=pe({modelId:l,systemPrompt:i,userText:I.wrappedText,userImages:ie,turns:w,conversationId:I.conversationId,checkpoint:null,existingBlobStore:I.blobStore,maxMode:M,cursorModelParameters:S,mcpTools:y});return ne.mcpTools=y,Z&&(Z.lastAccessMs=Date.now()),Oe({accessToken:a,requestBytes:ne.requestBytes,blobStore:ne.blobStore,mcpTools:ne.mcpTools,model:d,modelId:l,bridgeKey:c,convKey:u,completedTurns:w,currentTurn:ge,writer:s,options:o,requestId:r,maxIdleRetries:te.maxRetries,streamIdleTimeoutMs:X,getAccessToken:m,systemPrompt:i,conversationId:I.conversationId,maxMode:M,cursorModelParameters:S}),true}if(I.kind!=="recover")return f("native.tool_resume.idle_retry_recovery_skipped",{requestId:r,bridgeKey:c,bridgeKeyPrefix:q(c),convKey:u,skipReason:I.reason,hadStoredCheckpoint:I.hadStoredCheckpoint,...I.expected!==void 0?{expected:I.expected}:{},...I.received!==void 0?{received:I.received}:{}}),s.error(`${ya()} ${Va({bridgeKey:c,hadStoredCheckpoint:I.hadStoredCheckpoint,skipReason:I.reason})}`,"error"),true;f("native.tool_resume.idle_retry_recover",{requestId:r,bridgeKey:c,bridgeKeyPrefix:q(c),convKey:u,recoveryPath:"stored_checkpoint",attempt:F,pendingToolCallIds:t.map(w=>w.toolCallId)});let E=Ut(t),D={userText:I.wrappedText,steps:[],...E.length?{userImages:E}:{}},Y=pe({modelId:l,systemPrompt:i,userText:I.wrappedText,userImages:E,turns:R,conversationId:I.conversationId,checkpoint:I.checkpoint,existingBlobStore:I.blobStore,maxMode:M,cursorModelParameters:S,mcpTools:y});return Y.mcpTools=y,Oe({accessToken:a,requestBytes:Y.requestBytes,blobStore:Y.blobStore,mcpTools:Y.mcpTools,model:d,modelId:l,bridgeKey:c,convKey:u,completedTurns:R,currentTurn:D,writer:s,options:o,requestId:r,maxIdleRetries:te.maxRetries,streamIdleTimeoutMs:X,getAccessToken:m,systemPrompt:i,conversationId:I.conversationId,maxMode:M,cursorModelParameters:S}),true}};Fa(b,g,G,y,d,l,c,u,R,x,s,o,r,te,X,V);}function Dc(e,t,n){return Ma(e,t,n)}function Lc(e,t,n,s=false){let o=`Cursor stream idle timeout after ${e}ms without upstream progress`,r=t===1?"attempt":"attempts",a=n===1?"retry":"retries",i=n>0?` over ${t} ${r} (${n} ${a})`:"";return `${o}${i}.${s?" Partial assistant output was already streamed; automatic retry requires a checkpoint and was unavailable or exhausted.":""} Tune PI_CURSOR_STREAM_IDLE_TIMEOUT_MS / PI_CURSOR_RESUME_IDLE_TIMEOUT_MS if long reasoning turns are expected.`}function Oe(e){let t=e.accessToken,n=e.requestBytes,s=e.blobStore,o=e.completedTurns,r=e.currentTurn,a={currentAttempt:1,maxRetries:e.maxIdleRetries??Et(process.env.PI_CURSOR_STREAM_IDLE_MAX_RETRIES),recoverBeforeRetry:e.recoverBeforeRetry??true,restart(i,d){if(a.currentAttempt=i,f(i===1?"native.stream.attempt_start":"native.stream.idle_retry_start",{requestId:e.requestId,bridgeKey:e.bridgeKey,convKey:e.convKey,modelId:e.modelId,attempt:i,maxRetries:a.maxRetries,hasCheckpoint:!!d.latestCheckpoint,emittedUserVisibleContent:d.emittedUserVisibleContent}),i>1&&d.latestCheckpoint&&typeof e.systemPrompt=="string"&&e.conversationId)try{let c=On,u=pe({modelId:e.modelId,systemPrompt:e.systemPrompt,userText:c,turns:d.completedTurns,conversationId:e.conversationId,checkpoint:d.latestCheckpoint,existingBlobStore:d.blobStore,maxMode:e.maxMode??!1,cursorModelParameters:e.cursorModelParameters??[],mcpTools:e.mcpTools});n=u.requestBytes,s=u.blobStore,o=d.completedTurns,r={userText:c,steps:[]};let h=H.get(e.convKey);h&&Wt(h,d.latestCheckpoint,d.blobStore,d.completedTurns,d.currentTurn,e.convKey),L("checkpoint_continuation"),f("native.stream.checkpoint_continuation",{requestId:e.requestId,bridgeKey:e.bridgeKey,convKey:e.convKey,attempt:i});}catch(c){if(f("native.stream.checkpoint_continuation_failed",{requestId:e.requestId,message:c instanceof Error?c.message:String(c)}),d.emittedUserVisibleContent)return false}else if(i>1&&d.emittedUserVisibleContent)return false;let l=c=>{t=c;let{bridge:u,heartbeatTimer:h}=Qr(c,n,{bridgeKey:e.bridgeKey});Fa(u,h,s,e.mcpTools,e.model,e.modelId,e.bridgeKey,e.convKey,o,r,e.writer,e.options,e.requestId,a,e.streamIdleTimeoutMs);};return i===1||!e.getAccessToken?(l(t),true):(e.getAccessToken({forceRefresh:true}).then(c=>{e.writer.closed||(L("idle_retry_token_refreshed"),l(c));}).catch(c=>{f("native.stream.idle_retry_token_refresh_failed",{requestId:e.requestId,message:c instanceof Error?c.message:String(c)}),!e.writer.closed&&l(t);}),true)}};a.restart(1,{emittedUserVisibleContent:false,latestCheckpoint:null,blobStore:e.blobStore,completedTurns:e.completedTurns,currentTurn:e.currentTurn});}var Be;function ss(){let e=process.env.PI_CURSOR_PROVIDER_DEBUG?.trim().toLowerCase();return !!e&&e!=="0"&&e!=="false"&&e!=="off"}function os(){if(Be)return Be;let e=process.env.PI_CURSOR_PROVIDER_EXTENSION_DEBUG_FILE?.trim();if(e)return Be=e,Be;let t=new Date().toISOString().replace(/[:.]/g,"-");return Be=join(tmpdir(),`pi-cursor-provider-extension-debug-${t}-${process.pid}.log`),Be}function $e(e,t=240){return e.length>t?`${e.slice(0,t)}\u2026<truncated ${e.length-t} chars>`:e}function Na(e){let t={base64Length:e.length};try{let n=Buffer.from(e.replace(/\s/g,""),"base64");n.length>0&&(t.byteLength=n.length,t.sha256=createHash("sha256").update(n).digest("hex").slice(0,16));}catch{}return t}function qc(e,t,n){return {type:e,mimeType:t,...typeof n=="string"?Na(n):{data:`<redacted base64 ${String(n??"").length} chars>`}}}function $c(e){let t=e.trim().match(/^data:([^;,]+)(?:;[^,]*)?;base64,(.*)$/is);return t?{mimeType:t[1]?.toLowerCase(),...Na(t[2])}:{url:e.startsWith("data:image/")?`<redacted data image ${e.length} chars>`:$e(e)}}function ed(e){return typeof e=="string"?$e(e):Array.isArray(e)?e.map(t=>{if(!t||typeof t!="object")return t;let n=t;switch(n.type){case "text":return {type:"text",text:$e(String(n.text??""))};case "thinking":return {type:"thinking",thinking:$e(String(n.thinking??""))};case "toolCall":return {type:"toolCall",id:n.id,name:n.name,arguments:n.arguments};case "image":return qc("image",n.mimeType,n.data);case "image_url":{let s=n.image_url?.url;return {type:"image_url",image_url:$c(typeof s=="string"?s:"")}}default:return n}}):e}function Ge(e){if(!e||typeof e!="object")return e;let t=e;return {role:t.role,stopReason:t.stopReason,toolCallId:t.toolCallId,toolName:t.toolName,isError:t.isError,errorMessage:t.errorMessage,content:ed(t.content)}}function es(e,t=6){try{let n=e.sessionManager?.getBranch?.();return Array.isArray(n)?{sessionId:e.sessionManager?.getSessionId?.(),leafId:e.sessionManager?.getLeafId?.(),size:n.length,tail:n.slice(-t).map(s=>{if(!s||typeof s!="object")return s;let o=s;return {type:o.type,id:o.id,parentId:o.parentId,customType:o.customType,message:Ge(o.message)}})}:void 0}catch(n){return {error:n instanceof Error?n.message:String(n)}}}function td(e){let t=new Set,n=Array.isArray(e.messages)?e.messages:[];for(let s of n){if(!s||typeof s!="object")continue;let o=s;o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&t.add(o.tool_call_id);}return t}function sp(e,t){let n=td(t);if(n.size===0)return [];let s=e.sessionManager?.getBranch?.();if(!Array.isArray(s))return [];let o=new Map;for(let r of s){if(!r||typeof r!="object")continue;let a=r.message;if(!a||typeof a!="object")continue;let i=a,d=typeof i.toolCallId=="string"?i.toolCallId:"";if(i.role!=="toolResult"||!d||!n.has(d))continue;let c=(Array.isArray(i.content)?i.content:[]).flatMap(h=>{if(!h||typeof h!="object")return [];let R=h;return R.type!=="image"||typeof R.data!="string"||typeof R.mimeType!="string"?[]:[{data:R.data,mimeType:R.mimeType}]});if(c.length===0)continue;let u=o.get(d);u?u.images.push(...c):o.set(d,{toolCallId:d,images:c});}return [...o.values()]}function P(e,t){if(!ss())return;let n=JSON.stringify({ts:new Date().toISOString(),pid:process.pid,scope:"extension",event:e,...t});appendFileSync(os(),`${n}
31
31
  `,"utf8");}var Q={"claude-4-sonnet":{input:3,output:15,cacheRead:.3,cacheWrite:3.75},"claude-4.5-haiku":{input:1,output:5,cacheRead:.1,cacheWrite:1.25},"claude-4.5-opus":{input:5,output:25,cacheRead:.5,cacheWrite:6.25},"claude-4.5-sonnet":{input:3,output:15,cacheRead:.3,cacheWrite:3.75},"claude-4.6-opus":{input:5,output:25,cacheRead:.5,cacheWrite:6.25},"claude-4.6-sonnet":{input:3,output:15,cacheRead:.3,cacheWrite:3.75},"composer-1":{input:1.25,output:10,cacheRead:.125,cacheWrite:0},"composer-1.5":{input:3.5,output:17.5,cacheRead:.35,cacheWrite:0},"composer-2":{input:.5,output:2.5,cacheRead:.2,cacheWrite:0},"gemini-2.5-flash":{input:.3,output:2.5,cacheRead:.03,cacheWrite:0},"gemini-3-flash":{input:.5,output:3,cacheRead:.05,cacheWrite:0},"gemini-3-pro":{input:2,output:12,cacheRead:.2,cacheWrite:0},"gemini-3.1-pro":{input:2,output:12,cacheRead:.2,cacheWrite:0},"gpt-5":{input:1.25,output:10,cacheRead:.125,cacheWrite:0},"gpt-5-mini":{input:.25,output:2,cacheRead:.025,cacheWrite:0},"gpt-5.2":{input:1.75,output:14,cacheRead:.175,cacheWrite:0},"gpt-5.2-codex":{input:1.75,output:14,cacheRead:.175,cacheWrite:0},"gpt-5.3-codex":{input:1.75,output:14,cacheRead:.175,cacheWrite:0},"gpt-5.4":{input:2.5,output:15,cacheRead:.25,cacheWrite:0},"gpt-5.4-mini":{input:.75,output:4.5,cacheRead:.075,cacheWrite:0},"gpt-5.5":{input:2.5,output:15,cacheRead:.25,cacheWrite:0},"grok-4.20":{input:2,output:6,cacheRead:.2,cacheWrite:0},"kimi-k2.5":{input:.6,output:3,cacheRead:.1,cacheWrite:0}},nd=[{match:e=>/claude.*opus.*fast/i.test(e),cost:{input:30,output:150,cacheRead:3,cacheWrite:37.5}},{match:e=>/claude.*opus/i.test(e),cost:Q["claude-4.6-opus"]},{match:e=>/claude.*haiku/i.test(e),cost:Q["claude-4.5-haiku"]},{match:e=>/claude.*sonnet/i.test(e),cost:Q["claude-4.6-sonnet"]},{match:e=>/composer/i.test(e),cost:Q["composer-1"]},{match:e=>/gpt-5\.5/i.test(e),cost:Q["gpt-5.5"]},{match:e=>/gpt-5\.4.*mini/i.test(e),cost:Q["gpt-5.4-mini"]},{match:e=>/gpt-5\.4/i.test(e),cost:Q["gpt-5.4"]},{match:e=>/gpt-5\.3/i.test(e),cost:Q["gpt-5.3-codex"]},{match:e=>/gpt-5\.2/i.test(e),cost:Q["gpt-5.2"]},{match:e=>/gpt-5.*mini/i.test(e),cost:Q["gpt-5-mini"]},{match:e=>/gpt-5/i.test(e),cost:Q["gpt-5"]},{match:e=>/gemini.*3\.1/i.test(e),cost:Q["gemini-3.1-pro"]},{match:e=>/gemini.*flash/i.test(e),cost:Q["gemini-2.5-flash"]},{match:e=>/gemini/i.test(e),cost:Q["gemini-3-pro"]},{match:e=>/grok/i.test(e),cost:Q["grok-4.20"]},{match:e=>/kimi/i.test(e),cost:Q["kimi-k2.5"]}],sd={input:3,output:15,cacheRead:.3,cacheWrite:0};function od(e){let t=e.toLowerCase(),n=Q[t];if(n)return n;let s=t.replace(/-(high|medium|low|preview|thinking|spark-preview|fast)$/g,""),o=Q[s];return o||(nd.find(r=>r.match(t))?.cost??sd)}var rd=[{suffix:"extra-high",effort:"xhigh"},{suffix:"minimal",effort:"minimal"},{suffix:"xhigh",effort:"xhigh"},{suffix:"medium",effort:"medium"},{suffix:"high",effort:"high"},{suffix:"low",effort:"low"},{suffix:"max",effort:"max"},{suffix:"none",effort:"none"}];function Ba(e){for(let{suffix:t,effort:n}of rd){let s=`-${t}`;if(e.endsWith(s))return {remaining:e.slice(0,-s.length),effort:n}}return {remaining:e,effort:""}}function Xa(e){let t=e,n=false,s=false;t.endsWith("-fast")&&(n=true,t=t.slice(0,-5));let o;if(t.endsWith("-thinking")){s=true,t=t.slice(0,-9);let r=Ba(t);t=r.remaining,o=r.effort;}else {let r=Ba(t);t=r.remaining,o=r.effort,t.endsWith("-thinking")&&(s=true,t=t.slice(0,-9));}return {base:t,effort:o,fast:n,thinking:s}}function ad(e){let t=new Map;for(let n of e)n.supportsEffort&&n.effortMap&&Object.values(n.effortMap).includes("none")&&t.set(n.id,"none");return t}function id(e){if(!(!e.requestedModelId&&!e.parameters?.length&&!e.requiresMaxMode&&typeof e.requestedMaxMode!="boolean"))return {modelId:e.requestedModelId??e.id,...e.parameters?.length?{parameters:e.parameters}:{},...e.requiresMaxMode?{requiresMaxMode:true}:{},...typeof e.requestedMaxMode=="boolean"?{requestedMaxMode:e.requestedMaxMode}:{}}}function ld(e){let t=e.rawRoutingByEffort;if(!t)return;let n=e.effortMap?.medium;for(let s of [n,"medium","","low","high","none","xhigh","max"])if(typeof s=="string"&&t[s])return s;return Object.keys(t)[0]}function cd(e){let t=new Map;for(let n of e){if(n.supportsEffort&&n.rawRoutingByEffort){let o={...n.rawRoutingByEffort};if(n.effortMap)for(let[a,i]of Object.entries(n.effortMap))typeof i=="string"&&!o[a]&&o[i]&&(o[a]=o[i]);let r=ld(n);r!==void 0&&!o[""]&&(o[""]=n.rawRoutingByEffort[r]),t.set(n.id,o);continue}let s=id(n);s&&t.set(n.id,{"":s});}return t}function op(e,t){if(typeof e.model!="string")return;let n=t.get(e.model),s=typeof e.reasoning_effort=="string"?e.reasoning_effort:"",o=n?.[s];o&&(e.cursor_model_id=o.modelId,o.parameters?.length&&(e.cursor_model_parameters=o.parameters),o.requiresMaxMode&&(e.cursor_requires_max_mode=true),typeof o.requestedMaxMode=="boolean"&&(e.cursor_model_max_mode=o.requestedMaxMode));}function rp(e,t,n){if(t!=="off"||e.reasoning_effort!==void 0||typeof e.model!="string")return;let s=n.get(e.model);s&&(e.reasoning_effort=s);}function dd(e){let{base:t,effort:n,thinking:s}=Xa(e);return n||s||t==="default"||t==="auto"?true:/^(claude|composer|gemini|gpt|grok|kimi)(-|$)/i.test(t)}function ud(e){let t=n=>e.has(n)?n:null;return {off:t("none"),minimal:t("minimal"),low:t("low"),medium:e.has("medium")?"medium":t(""),high:t("high"),xhigh:t("xhigh"),max:t("max")}}function gd(e){let t=new Map;for(let s of e){let o=Xa(s.id),r=`${o.base}|${o.fast}|${o.thinking}`,a=t.get(r);a||(a={base:o.base,fast:o.fast,thinking:o.thinking,efforts:new Map},t.set(r,a)),a.efforts.set(o.effort,s);}let n=[];for(let s of t.values()){let o=new Set(s.efforts.keys()),r=s.efforts.size===1&&!s.efforts.has("");if(o.size>=2||r){let i=s.efforts.get("medium")??s.efforts.get("")??[...s.efforts.values()][0],d=s.base;s.thinking&&(d+="-thinking"),s.fast&&(d+="-fast");let l=ud(o),c=Object.fromEntries([...s.efforts.entries()].map(([h,R])=>[h,R.id])),u=Object.fromEntries([...s.efforts.entries()].map(([h,R])=>[h,{modelId:R.requestedModelId??R.id,...R.parameters?.length?{parameters:R.parameters}:{},...R.requiresMaxMode?{requiresMaxMode:true}:{},...typeof R.requestedMaxMode=="boolean"?{requestedMaxMode:R.requestedMaxMode}:{}}]));n.push({...i,id:d,supportsEffort:true,effortMap:l,rawModelByEffort:c,rawRoutingByEffort:u});}else for(let i of s.efforts.values())n.push({...i,supportsEffort:false});}return n.sort((s,o)=>s.id.localeCompare(o.id))}var wt="cursor-native",md="@rahularya01/pi-cursor";function Jt(e){let t=e.supportsImages===false?["text"]:["text","image"];return {id:e.id,name:e.name,api:wt,reasoning:e.supportsEffort,...e.supportsEffort&&e.effortMap&&{thinkingLevelMap:e.effortMap},input:t,cost:od(e.id),contextWindow:e.contextWindow,maxTokens:e.maxTokens}}var pd=[{idPart:"",label:"272K",context:"272k",contextWindow:272e3,requestedMaxMode:false,fastOptions:[false,true]},{idPart:"-max",label:"272K Max",context:"272k",contextWindow:272e3,requestedMaxMode:true,fastOptions:[false,true]},{idPart:"-1m",label:"1M",context:"1m",contextWindow:1e6,requestedMaxMode:true,fastOptions:[false]}],Ua=[{suffix:"none",label:"None",value:"none"},{suffix:"low",label:"Low",value:"low"},{suffix:"medium",label:"",value:"medium"},{suffix:"high",label:"High",value:"high"},{suffix:"extra-high",label:"Extra High",value:"extra-high"}];function Ad(){let e=[];for(let t of pd)for(let n of t.fastOptions)for(let s of Ua){let o=`gpt-5.5${t.idPart}-${s.suffix}${n?"-fast":""}`,r=["GPT-5.5",t.label,s.label,n?"Fast":""].filter(Boolean);e.push({id:o,name:r.join(" "),reasoning:true,contextWindow:t.contextWindow,maxTokens:64e3,requestedModelId:"gpt-5.5",requiresMaxMode:t.context==="1m",requestedMaxMode:t.requestedMaxMode,parameters:[{id:"context",value:t.context},{id:"reasoning",value:s.value},{id:"fast",value:String(n)}]});}return e}function Te(e,t){return e.find(n=>n.id===t)?.value}function hd(e,t=2e5){if(e==="272k")return 272e3;if(e==="1m")return 1e6;let n=e?.match(/^(\d+)k$/i)?.[1];if(n)return Number(n)*1e3;let s=e?.match(/^(\d+)m$/i)?.[1];return s?Number(s)*1e6:t}function Sd(e){return Ua.find(t=>t.value===e)?.label||{xhigh:"Extra High",max:"Max",none:"None"}[e]||e.replace(/-/g," ").replace(/\b\w/g,t=>t.toUpperCase())}function Rd(e){if(e.parameters.some(t=>t.id==="reasoning"))return "reasoning";if(e.parameters.some(t=>t.id==="effort"))return "effort"}function Ja(e){return e?e==="200k"||e==="272k"||e==="300k":true}function fd(e){return e&&!Ja(e)?`-${e.toLowerCase()}`:""}function Cd(e){if(!(!e||Ja(e)))return e.toUpperCase()}function wa(e,t,n,s){return !n||t==="1m"?"":!s||/(^|-)max($|-)/i.test(e)?"-max-mode":"-max"}function bd(e,t,n,s){let o=wa(e,t,n,s);if(o)return o==="-max-mode"?"Max Mode":"Max"}function xd(e,t,n,s){let o=Te(t.parameters,"context");return `${e}${fd(o)}${wa(e,o,n,s)}`}function Ed(e,t,n,s){let o=Te(t.parameters,"context");return [e.clientDisplayName||e.name,Cd(o),bd(e.name,o,n,s)].filter(Boolean)}function Md(e,t){let n=Ta(t);return e.variants.some(s=>Ta(s.parameters)===n)}function Ta(e){return e.map(t=>`${t.id}=${t.value}`).sort().join(";")}function Ya(e){let t=e.variants[0];if(!t)return [];if(e.requestedMaxMode&&!t.isMaxMode&&!e.model.supportsMaxMode)return [];let n=Te(t.parameters,"context"),s=Te(t.parameters,"fast")==="true",o=Te(t.parameters,"thinking")==="true",r=!!e.effortParameterId,a=xd(e.model.name,t,e.requestedMaxMode,r),i=Ed(e.model,t,e.requestedMaxMode,r),d=hd(n,e.requestedMaxMode?e.model.contextTokenLimitForMaxMode??e.model.contextTokenLimit??2e5:e.model.contextTokenLimit??2e5);return e.variants.flatMap(l=>{let c=l.parameters.map(M=>({id:M.id,value:M.value}));if(!Md(e.model,c))return [];let u=e.effortParameterId?Te(l.parameters,e.effortParameterId):void 0,h=e.effortParameterId?`${a}-${u}${o?"-thinking":""}${s?"-fast":""}`:`${a}${o?"-thinking":""}${s?"-fast":""}`,R=[...i,u?Sd(u):void 0,o?"Thinking":void 0,s?"Fast":void 0].filter(Boolean).join(" ");return [{id:h,name:R,reasoning:!!e.effortParameterId||o,contextWindow:d,maxTokens:64e3,requestedModelId:e.model.name,requiresMaxMode:l.isMaxMode,requestedMaxMode:e.requestedMaxMode,supportsImages:e.model.supportsImages,parameters:c}]})}function Gd(e,t){let n=e.parameters.filter(s=>s.id!==t).map(s=>`${s.id}=${s.value}`).sort().join(";");return `${e.isMaxMode?"max":"nonmax"}|${n}`}function Id(e,t){return e.supportsMaxMode===true&&!t.isMaxMode}function yd(e){let t=[];for(let n of e){let s=new Map;for(let o of n.variants){if(o.parameters.length===0)continue;let r=Rd(o),a=Gd(o,r),i=s.get(a)??{effortParameterId:r,variants:[]};i.variants.push(o),s.set(a,i);}for(let o of s.values()){let r=o.variants[0];r&&(t.push(...Ya({model:n,variants:o.variants,requestedMaxMode:r.isMaxMode,effortParameterId:o.effortParameterId})),Id(n,r)&&t.push(...Ya({model:n,variants:o.variants,requestedMaxMode:true,effortParameterId:o.effortParameterId})));}}return t}function ka(e){return e.id!=="default"?e:{...e,id:"auto",name:e.name&&e.name!=="default"?e.name:"Auto",requestedModelId:e.requestedModelId??"default"}}function Qa(e,t=[]){let n=new Map,s=new Map(t.filter(r=>typeof r.supportsImages=="boolean").map(r=>[r.name,r.supportsImages]));for(let r of e.map(ka)){let a=r.requestedModelId??r.id,i=s.get(a);n.set(r.id,{...r,...r.supportsImages===void 0&&i!==void 0?{supportsImages:i}:{}});}let o=yd(t).map(ka);for(let r of o)n.set(r.id,r);if(o.length===0&&e.some(r=>/^gpt-5\.5(?:-|$)/.test(r.id)))for(let r of Ad())n.set(r.id,r);return [...n.values()]}var qe=Qa(rs).map(e=>({...e,reasoning:dd(e.id)})),Ka="cursor";async function Vd(){let e=readStoredCredential(Ka);if(!(!e||e.type!=="oauth")){if(Date.now()<e.expires&&e.access)return {accessToken:e.access,source:"pi_oauth"};if(e.refresh)try{return {accessToken:(await Ye(e.refresh)).access,source:"pi_oauth_refresh"}}catch{return}}}async function ts(e){let t=await hs(e);return t||Vd()}function ns(e,t=6e4){try{return Date.now()>=he(e)-t}catch{return true}}function vd(e){let t=(n,s)=>{P("session.cleanup_hook",{sessionId:s.sessionManager.getSessionId(),leafId:s.sessionManager.getLeafId?.()}),Kn(s.sessionManager.getSessionId());};e.on("session_before_switch",t),e.on("session_before_fork",t),e.on("session_before_tree",t),e.on("session_shutdown",t);}function Zd(e){ss()&&(e.on("message_start",async(t,n)=>{n.model?.provider==="cursor"&&P("message.start",{sessionId:n.sessionManager.getSessionId(),leafId:n.sessionManager.getLeafId?.(),model:n.model?.id,message:Ge(t.message)});}),e.on("message_update",async(t,n)=>{if(n.model?.provider!=="cursor")return;let s=t;P("message.update",{sessionId:n.sessionManager.getSessionId(),leafId:n.sessionManager.getLeafId?.(),model:n.model?.id,assistantMessageEvent:s.assistantMessageEvent?{type:s.assistantMessageEvent.type,delta:$e(String(s.assistantMessageEvent.delta??s.assistantMessageEvent.content??""))}:void 0,message:Ge(s.message)});}),e.on("message_end",async(t,n)=>{n.model?.provider==="cursor"&&P("message.end",{sessionId:n.sessionManager.getSessionId(),leafId:n.sessionManager.getLeafId?.(),model:n.model?.id,message:Ge(t.message),branch:es(n)});}),e.on("context",async(t,n)=>{if(n.model?.provider!=="cursor")return;let s=t;P("context",{sessionId:n.sessionManager.getSessionId(),leafId:n.sessionManager.getLeafId?.(),model:n.model?.id,messageCount:Array.isArray(s.messages)?s.messages.length:void 0,messages:Array.isArray(s.messages)?s.messages.slice(-8).map(o=>Ge(o)):void 0,branch:es(n)});}),e.on("turn_end",async(t,n)=>{if(n.model?.provider!=="cursor")return;let s=t;P("turn.end",{sessionId:n.sessionManager.getSessionId(),leafId:n.sessionManager.getLeafId?.(),model:n.model?.id,turnIndex:s.turnIndex,message:Ge(s.message),toolResults:Array.isArray(s.toolResults)?s.toolResults.map(o=>Ge(o)):void 0,branch:es(n)});}),P("extension.debug_hooks_registered",{logFile:os()}));}async function ap(e){let t="",n="none",s=new Map,o=new Map,r=[];xs(et()),Cs(Se());let a=300*1e3,i=false,d=()=>{i||!t||n==="env"||ns(t,a)&&(i=true,ts({forceRefresh:true}).then(m=>{m&&(t=m.accessToken,n=m.source,Ve(m.source),P("token.proactive_refresh",{source:m.source}));}).catch(m=>{P("token.proactive_refresh_failed",{message:m instanceof Error?m.message:String(m)});}).finally(()=>{i=false;}));},l=async m=>{if(d(),m?.forceRefresh||!t||n!=="env"&&ns(t)){let g=await ts({forceRefresh:m?.forceRefresh||ns(t||"x")});g?(t=g.accessToken,n=g.source,Ve(g.source)):m?.forceRefresh&&Ve(n||"none");}if(!t){let g=tt()?"":" System credential reuse is disabled (PI_CURSOR_SYSTEM_CREDENTIALS=0).";throw new Error(`Not logged in to Cursor. Run /login cursor or log in via Cursor CLI.${g}`)}return Ve(n),t},c=!!process.env.PI_CURSOR_RAW_MODELS;vd(e),Zd(e),P("extension.start",{mode:"native-streamSimple",debugLogFile:ss()?os():void 0});let u=h();S(e,u.rawModels,u.parameterizedModels),e.registerCommand("cursor.models",{description:"List Cursor runtime models registered by this provider",handler:async(m,b)=>{let g=/\ball\b/i.test(m||""),G=g?r:r.filter(V=>!/tab_|chat_/i.test(V.id)),y=[`Cursor models (${G.length}${g?" all":""})`,`endpoint=${ue()}`,""],C=Math.max(8,...G.map(V=>V.id.length));for(let V of G){let T=V,U=Object.entries(T.effortMap??{}).filter(([,N])=>typeof N=="string").map(([N])=>N).join("/"),X=[T.supportsEffort?"thinking":"",U?`levels=${U}`:"",V.supportsImages?"images":""].filter(Boolean).join(",");y.push(`${V.id.padEnd(C)} ctx ${String(V.contextWindow??"?").padStart(7)} ${V.name||""}${X?` [${X}]`:""}`);}G.length||y.push("No models registered. Run /login cursor first.");let x=y.join(`
32
32
  `);b.hasUI&&b.ui.notify(x,"info"),console.log(x);}}),e.registerCommand("cursor.usage",{description:"Show Cursor plan quota and on-demand spend",handler:async(m,b)=>{try{let g=Ws(await Zs(l));b.hasUI&&b.ui.notify(g,"info"),console.log(g);}catch(g){let G=`Cursor usage unavailable: ${ce(g instanceof Error?g.message:String(g))}`;b.hasUI&&b.ui.notify(G,"error"),console.error(G);}}}),e.registerCommand("cursor.doctor",{description:"Show sanitized Cursor provider diagnostics",handler:async(m,b)=>{let g=Rs(),G=tn(),y=Yt(),C=[`provider=${Ka}`,`agentUrl=${ue()}`,`clientVersion=${g.clientVersion||Se()}`,`tokenSource=${g.tokenSource||n||"none"}`,`systemCredentials=${g.systemCredentials||et()}`,`lastResolvedRuntimeModel=${g.resolvedRuntimeModel||"none"}`,`availableModels=${g.availableModels||r.length||"none"}`,`catalogCache=${y?`${y.rawModels.length}+${y.parameterizedModels.length} models, age ${Math.round((Date.now()-y.savedAt)/1e3)}s`:"none(using bundled fallback)"}`,`catalogCacheDir=${ke()||"unavailable"}`,`matchedModel=${g.matchedModelDebug||"none"}`,`lastEndpoint=${g.endpoint||"none"}`,`lastStatus=${g.status??"none"}`,`lastRpc=${g.lastRpc||"none"}`,`lastRecoverySkipReason=${g.lastRecoverySkipReason||"none"}`,`lastStreamEvent=${g.lastStreamEvent||"none"}`,`lastRequestSize=${g.lastRequestSize||"none"}`,`lastDriftSignal=${g.lastDriftSignal||"none"}`,`wireDrift=${mt()||"none"}`,`wireDriftStranding=${gt()?"yes":"no"}`,`lastIdleTimeoutAt=${g.lastIdleTimeoutAt||"none"}`,`lastIdleTimeoutMs=${g.lastIdleTimeoutMs??"none"}`,`lastIdleAttempt=${g.lastIdleAttempt??"none"}`,`streamIdleTimeoutMs=${process.env.PI_CURSOR_STREAM_IDLE_TIMEOUT_MS||"0(disabled)"}`,`resumeIdleTimeoutMs=${process.env.PI_CURSOR_RESUME_IDLE_TIMEOUT_MS||"0(disabled)"}`,`streamIdleMaxRetries=${process.env.PI_CURSOR_STREAM_IDLE_MAX_RETRIES||"0(disabled)"}`,`h2IdleTimeoutMs=${process.env.PI_CURSOR_H2_IDLE_TIMEOUT_MS||"0(disabled)"}`,`lifecycleLog=${process.env.PI_CURSOR_LIFECYCLE_LOG||"$TMPDIR/pi-cursor-lifecycle.jsonl"}`,`lastError=${g.error?ce(g.error):"none"}`,"transport=native-streamSimple",`unaryTransport=${at()?"in-process-h2":"bridge-subprocess"}`,"runtimeCli=not-used","proxyPath=removed","commands=/cursor.models /cursor.usage /cursor.doctor","hint=On stalls check lifecycle log + lastStreamEvent; InteractionQuery hangs fixed in 1.2.2; re-login or PI_CURSOR_CLIENT_VERSION on wire errors"];if(G.length>0){C.push("--- wire drift detail ---");for(let V of G)C.push(` ${V.kind}: ${V.detail} (x${V.count}, first ${V.firstSeenIso})`);C.push(" Cursor's agent schema may have moved. See proto/README.md to regenerate,"),C.push(" or pin PI_CURSOR_CLIENT_VERSION to a build that matches.");}let x=C.join(`
33
33
  `);b.hasUI&&b.ui.notify(`Cursor doctor
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rahularya01/pi-cursor",
3
- "version": "1.4.7",
3
+ "version": "1.4.8",
4
4
  "description": "Native Cursor provider for Pi Coding Agent (OAuth + Connect/protobuf streamSimple)",
5
5
  "author": "Rahul Arya",
6
6
  "license": "MIT",