sliccy 6.79.0 → 6.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +1 -1
  2. package/dist/ui/.vite/manifest.json +144 -137
  3. package/dist/ui/assets/{account-store-B92t9dbf.js → account-store-BUtPVQY5.js} +1 -1
  4. package/dist/ui/assets/{account-store-gfOTEDJm.js → account-store-C0kU6Cjo.js} +1 -1
  5. package/dist/ui/assets/{adobe-DJfO3x00.js → adobe-BUVkdIpa.js} +1 -1
  6. package/dist/ui/assets/{adobe-BfW87L1b.js → adobe-DVdpMVeK.js} +1 -1
  7. package/dist/ui/assets/{apply-layout-D01Trc9l.js → apply-layout-DtLuxxBp.js} +1 -1
  8. package/dist/ui/assets/{apps-BwAyOelR.js → apps-CfNqlU4o.js} +1 -1
  9. package/dist/ui/assets/{azure-openai-D9JsQfDX.js → azure-openai-DqxPK0JB.js} +1 -1
  10. package/dist/ui/assets/{azure-openai-DY1XliXg.js → azure-openai-n3M5MZ4W.js} +1 -1
  11. package/dist/ui/assets/{cerebras-L7at1trb.js → cerebras-BMEds7a4.js} +1 -1
  12. package/dist/ui/assets/{cerebras-UDp8S0HF.js → cerebras-DBQMPFoh.js} +1 -1
  13. package/dist/ui/assets/{connect-surface-Cjf5vpE9.js → connect-surface-D6PQLHTz.js} +1 -1
  14. package/dist/ui/assets/frozen-archive-format-CLzdz05B.js +1 -0
  15. package/dist/ui/assets/{fs-QvKcM1y9.js → fs-Bw3HKY3g.js} +1 -1
  16. package/dist/ui/assets/{fs-DRf2UNRP.js → fs-CZs_YYPN.js} +2 -2
  17. package/dist/ui/assets/{github-oLuiXr5U.js → github-BbGx9L_8.js} +2 -2
  18. package/dist/ui/assets/{github-copilot-DQUs_Cu6.js → github-copilot-BxiFVjc5.js} +1 -1
  19. package/dist/ui/assets/{github-copilot-CAyblv29.js → github-copilot-CB8d8hqD.js} +1 -1
  20. package/dist/ui/assets/{github-uJ20WoIV.js → github-i83vR8wL.js} +1 -1
  21. package/dist/ui/assets/{github-install-CdvlpkjZ.js → github-install-Bdee3a10.js} +1 -1
  22. package/dist/ui/assets/{github-zip-DluIBUmq.js → github-zip-CUaM2Q7X.js} +1 -1
  23. package/dist/ui/assets/{js-realm-worker-BOYBWbOZ.js → js-realm-worker-DGp2tbrw.js} +1 -1
  24. package/dist/ui/assets/{kernel-worker-DohhM8Ng.js → kernel-worker-9DJyGuXe.js} +496 -496
  25. package/dist/ui/assets/{local-llm-9n1b6XFh.js → local-llm-Bb8rO1tN.js} +1 -1
  26. package/dist/ui/assets/{local-llm-CL0LbvPc.js → local-llm-BkmshPwG.js} +1 -1
  27. package/dist/ui/assets/{main-CMu5nfXH.js → main-dBihqbK1.js} +3 -3
  28. package/dist/ui/assets/{mount-CA4MJmwU.js → mount-BOhwbxne.js} +2 -2
  29. package/dist/ui/assets/{mount-DKToD2O6.js → mount-CQ3qwyoz.js} +1 -1
  30. package/dist/ui/assets/{mount-recovery-IeWjtnGl.js → mount-recovery-CLIfirLp.js} +1 -1
  31. package/dist/ui/assets/new-session-CVn6HbFq.js +2 -0
  32. package/dist/ui/assets/{oauth-bootstrap-Gs5HX3e1.js → oauth-bootstrap-CsRqBSPn.js} +2 -2
  33. package/dist/ui/assets/{onboarding-orchestrator-CfHysx6n.js → onboarding-orchestrator-Cobbbzux.js} +1 -1
  34. package/dist/ui/assets/{openai-codex-Bp9KZF_w.js → openai-codex-618mu1De.js} +1 -1
  35. package/dist/ui/assets/{openai-codex-ChUFecwE.js → openai-codex-BBnZKnTW.js} +1 -1
  36. package/dist/ui/assets/{openrouter-CRTavJY6.js → openrouter-KQCn3Ega.js} +1 -1
  37. package/dist/ui/assets/{openrouter-oauth-Bv2gMtnx.js → openrouter-oauth-D2UpVcl0.js} +1 -1
  38. package/dist/ui/assets/{openrouter-oauth-Bwpl-0As.js → openrouter-oauth-DC5NfMbB.js} +1 -1
  39. package/dist/ui/assets/{openrouter-w4AEwhMT.js → openrouter-pwyjG1Mq.js} +1 -1
  40. package/dist/ui/assets/{panel-rpc-handlers-CWU69FNj.js → panel-rpc-handlers-tyl4dmOP.js} +2 -2
  41. package/dist/ui/assets/{panelize-shell-BiuM5F3-.js → panelize-shell-5AeDZqWh.js} +1 -1
  42. package/dist/ui/assets/{provider-CflcvITG.js → provider-SJxMm2_x.js} +1 -1
  43. package/dist/ui/assets/{provider-Vy5D4ebA.js → provider-lnu8zm-b.js} +2 -2
  44. package/dist/ui/assets/{provider-settings-DVze_FfU.js → provider-settings-BPo_b0d9.js} +1 -1
  45. package/dist/ui/assets/{provider-settings-_JNmYpT_.js → provider-settings-DpzH2623.js} +1 -1
  46. package/dist/ui/assets/{provider-store-access-YJgLY0Aq.js → provider-store-access-DGWjVgC-.js} +2 -2
  47. package/dist/ui/assets/provider-store-access-QYYQhzXu.js +1 -0
  48. package/dist/ui/assets/{providers-Bsz4jBpd.js → providers-BSTYCsa2.js} +2 -2
  49. package/dist/ui/assets/{providers-CDa657V5.js → providers-OdEzOzTx.js} +1 -1
  50. package/dist/ui/assets/{quick-llm-CDgogXnj.js → quick-llm-WxcUsAdT.js} +1 -1
  51. package/dist/ui/assets/record-BkEi3dzS.js +1 -0
  52. package/dist/ui/assets/{recovery-screen-CfQxo-mg.js → recovery-screen-COk_lwlZ.js} +1 -1
  53. package/dist/ui/assets/{redirect-uri-DHI820pd.js → redirect-uri-Dd_1Jwq1.js} +1 -1
  54. package/dist/ui/assets/session-freezer-DHpLDp-N.js +160 -0
  55. package/dist/ui/assets/{setup-feature-flags-remote-Dy23J2lH.js → setup-feature-flags-remote-Dv3VXwYZ.js} +1 -1
  56. package/dist/ui/assets/{setup-standalone-prelude-DevMxj0q.js → setup-standalone-prelude-_NBUAppy.js} +1 -1
  57. package/dist/ui/assets/{setup-sudo-CSyUfKTX.js → setup-sudo-BVpKN0oE.js} +2 -2
  58. package/dist/ui/assets/{skills-CN522iKp.js → skills-CC8fQR1K.js} +1 -1
  59. package/dist/ui/assets/slicc-version-DWGH2gE1.js +1 -0
  60. package/dist/ui/assets/{src-DDn9o2XK.js → src-O0pG9r4E.js} +36 -33
  61. package/dist/ui/assets/{store-Cehy36To.js → store-BWnEUKkV.js} +1 -1
  62. package/dist/ui/assets/{store-BcwDrsU-.js → store-CRS0hkxu.js} +1 -1
  63. package/dist/ui/assets/{sudo-CJVsuTSZ.js → sudo-35We9sUh.js} +1 -1
  64. package/dist/ui/assets/{upgrade-detection-CwBF5Q1G.js → upgrade-detection-BChtkWQT.js} +1 -1
  65. package/dist/ui/assets/{wc-attach-BsqldTbU.js → wc-attach-n6dBk1mM.js} +2 -2
  66. package/dist/ui/assets/{wc-extension-W00zRwUc.js → wc-extension-gnr0vG6w.js} +2 -2
  67. package/dist/ui/assets/wc-follower-Ddgr3Fi1.js +17 -0
  68. package/dist/ui/assets/wc-live-DK1K46m3.js +8 -0
  69. package/dist/ui/assets/{wc-nav-C8hLrIbu.js → wc-nav-DBFUJkpI.js} +2 -2
  70. package/dist/ui/assets/wc-onboarding-BtayG-Fw.js +2 -0
  71. package/dist/ui/assets/{wc-placeholder-BiadsnDI.js → wc-placeholder-CieZgxAc.js} +2 -2
  72. package/dist/ui/assets/{wc-settings-Dj1Dl_Ly.js → wc-settings-cU6jqB_5.js} +2 -2
  73. package/dist/ui/assets/{wc-shell-BQCj2id-.js → wc-shell-BInvdQ8s.js} +3 -3
  74. package/dist/ui/assets/{wc-sprinkles-DK5pOUOJ.js → wc-sprinkles-2TJvDEh2.js} +2 -2
  75. package/dist/ui/assets/{wc-tray-B0stpW0N.js → wc-tray-DkOidodI.js} +2 -2
  76. package/dist/ui/assets/{wc-tray-scoops-By8pWxvk.js → wc-tray-scoops-Ff7B37ac.js} +1 -1
  77. package/dist/ui/assets/welcome-detection-Cj3q8TTP.js +1 -0
  78. package/dist/ui/assets/{xai-grok-df20BMeq.js → xai-grok-B7-cMd0s.js} +1 -1
  79. package/dist/ui/assets/{xai-grok-DXIjMbHs.js → xai-grok-Byyz839r.js} +1 -1
  80. package/dist/ui/index.html +6 -6
  81. package/dist/ui/packages/webapp/index.html +6 -6
  82. package/package.json +1 -1
  83. package/dist/ui/assets/frozen-archive-format--7sONywg.js +0 -1
  84. package/dist/ui/assets/new-session-CzhB-zHt.js +0 -2
  85. package/dist/ui/assets/provider-store-access-DVFbKtR3.js +0 -1
  86. package/dist/ui/assets/session-freezer-CCytzcyn.js +0 -159
  87. package/dist/ui/assets/slicc-version-JE_x90rv.js +0 -1
  88. package/dist/ui/assets/wc-follower-4Bh13i6U.js +0 -17
  89. package/dist/ui/assets/wc-live-DG1YJfY_.js +0 -41
  90. package/dist/ui/assets/wc-onboarding-ZWDIx9yo.js +0 -2
  91. package/dist/ui/assets/welcome-detection-sLx_L_gP.js +0 -1
@@ -2,4 +2,4 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/theme-engine-By
2
2
  import{t as e}from"./preload-helper-Czpn1I53.js";import{t}from"./logger-DDBAeTLF.js";import{n}from"./attachments-CByeG2Ru.js";import{n as r,t as i}from"./base64-DpPqYZJF.js";import{i as a,r as o}from"./src-CAWTvdAa.js";import{t as s}from"./slicc-app-url-BsBryEhn.js";import{d as c,f as l,p as u}from"./tray-sync-protocol-BZ5yhJH9.js";import{a as d,i as f,n as p,r as m,t as h}from"./tray-follower-status-BAjnN7Ar.js";import{t as g}from"./remote-cdp-transport-CgOXLjZ8.js";import{i as ee,n as te}from"./tray-leader-DcRtwWl-.js";import{r as ne,t as re}from"./tray-sync-protocol-DV_QG_Ey.js";import{n as _}from"./shared-CddfUR6k.js";import{t as v}from"./sprinkle-renderer-D64E-W2o.js";import{t as ie}from"./wc-scoop-color-CByZNEJo.js";import{t as ae}from"./export-spool-Eul4J1RP.js";var oe=`slicc.followerTrayStatus`,y=t(`data-channel-keepalive`);function b(e,t){if(!Number.isInteger(t)||t<1)throw RangeError(`DataChannelKeepalive ${e} must be a positive integer; got ${String(t)}`)}var x=class{sendPing;onDead;isTransportOpen;onStalled;onRecovered;intervalMs;maxMissed;hardMaxMissed;timer=null;missedPongs=0;awaitingPong=!1;stopped=!1;stalled=!1;constructor(e){if(this.sendPing=e.sendPing,this.onDead=e.onDead,this.isTransportOpen=e.isTransportOpen??(()=>!1),this.onStalled=e.onStalled,this.onRecovered=e.onRecovered,this.intervalMs=e.intervalMs??1e4,this.maxMissed=e.maxMissed??3,this.hardMaxMissed=e.hardMaxMissed??30,b(`intervalMs`,this.intervalMs),b(`maxMissed`,this.maxMissed),b(`hardMaxMissed`,this.hardMaxMissed),this.hardMaxMissed<this.maxMissed)throw RangeError(`DataChannelKeepalive hardMaxMissed (${this.hardMaxMissed}) must be >= maxMissed (${this.maxMissed})`)}start(){this.timer||this.stopped||(this.timer=setInterval(()=>this.tick(),this.intervalMs))}stop(){this.stopped=!0,this.stalled=!1,this.timer&&=(clearInterval(this.timer),null)}receivePong(){this.stopped||(this.awaitingPong=!1,this.missedPongs=0,this.clearStall())}receivePing(){this.stopped||(this.missedPongs=0,this.awaitingPong=!1,this.clearStall())}get missed(){return this.missedPongs}get isStalled(){return this.stalled}clearStall(){this.stalled&&(this.stalled=!1,y.info(`Peer answered again after a stall`),this.onRecovered?.())}tick(){this.stopped||this.awaitingPong&&(this.missedPongs++,y.debug(`Missed pong`,{missedPongs:this.missedPongs,maxMissed:this.maxMissed}),this.missedPongs>=this.maxMissed&&this.declareUnreachable())||(this.awaitingPong=!0,this.sendPing())}declareUnreachable(){return this.missedPongs<this.hardMaxMissed&&this.isTransportOpen()?(this.stalled||(this.stalled=!0,y.warn(`Peer stopped answering but its transport is still open — treating as stalled`,{missedPongs:this.missedPongs,hardMaxMissed:this.hardMaxMissed}),this.onStalled?.()),!1):(y.warn(`Channel declared dead`,{missedPongs:this.missedPongs}),this.stop(),this.onDead(),!0)}},S=65536;async function C(e,t){try{switch(t.op){case`readFile`:return await se(e,t.path,t.encoding);case`writeFile`:return[await w(e,t.path,t.content,t.encoding)];case`stat`:return[await T(e,t.path)];case`readDir`:return[await ce(e,t.path)];case`mkdir`:return[await le(e,t.path,t.recursive)];case`rm`:return[await ue(e,t.path,t.recursive)];case`exists`:return[await de(e,t.path)];case`walk`:return[await fe(e,t.path)];default:return[{ok:!1,error:`Unknown fs operation: ${t.op}`}]}}catch(e){return[pe(e)]}}async function se(e,t,n){if((n??`utf-8`)===`utf-8`)return E(await e.readFile(t,{encoding:`utf-8`}),`utf-8`);let i=await e.readFile(t,{encoding:`binary`});return E(r(i),`base64`)}async function w(e,t,n,r){if(r===`base64`){let r=i(n);await e.writeFile(t,r)}else await e.writeFile(t,n);return{ok:!0,data:{type:`void`}}}async function T(e,t){return{ok:!0,data:{type:`stat`,stat:await e.stat(t)}}}async function ce(e,t){return{ok:!0,data:{type:`dirEntries`,entries:await e.readDir(t)}}}async function le(e,t,n){return await e.mkdir(t,{recursive:n}),{ok:!0,data:{type:`void`}}}async function ue(e,t,n){return await e.rm(t,{recursive:n}),{ok:!0,data:{type:`void`}}}async function de(e,t){return{ok:!0,data:{type:`exists`,exists:await e.exists(t)}}}async function fe(e,t){let n=[];for await(let r of e.walk(t))n.push(r);return{ok:!0,data:{type:`paths`,paths:n}}}function E(e,t){if(e.length<=S)return[{ok:!0,data:{type:`file`,content:e,encoding:t}}];let n=Math.ceil(e.length/S),r=[];for(let i=0;i<n;i++){let a=i*S,o=e.slice(a,a+S);r.push({ok:!0,data:{type:`file`,content:o,encoding:t},chunkIndex:i,totalChunks:n})}return r}function pe(e){return e instanceof Error&&`code`in e?{ok:!1,error:e.message,code:e.code}:{ok:!1,error:e instanceof Error?e.message:String(e)}}var D=t(`tray-follower-sync`),me=15e3,he=6e4;function ge(e,t){return e===void 0||e===t}var _e=class{options;sync;eventListeners=new Set;unsubscribe;keepalive;latestSnapshot=null;sentMessageIds=new Set;targetEntries=[];remoteTransports=new Map;cdpChunkBuffers=new Map;snapshotChunkBuffer=null;remoteCDPSessions=new Set;cdpEventCleanups=[];oauthPopupAborts=new Map;tabOpenResolvers=new Map;fsResolvers=new Map;leaderProtocolVersion;legacyLeaderLogged=!1;latestSprinkles=[];sprinkleContentCache=new Map;pendingSprinkleFetches=new Map;inflightSprinkleByName=new Map;sprinkleContentWaiters=new Map;cacheEpoch=0;fetchEpoch=new Map;activeExportRequests=new Map;openSudoPrompts=new Map;constructor(e,t={}){this.options=t;let n=t.sprinkleFetchTimeoutMs;if(n!==void 0&&(!Number.isFinite(n)||n<0))throw RangeError(`sprinkleFetchTimeoutMs must be a non-negative finite number (0 disables the timer); got ${n}`);this.sync=re(e),this.unsubscribe=this.sync.onMessage(e=>{this.handleLeaderMessage(e)});let r=this.options.onSudoApprovalRequest?{exec:!1,...this.options.helloCapabilities??{},sudoApproval:!0}:this.options.helloCapabilities;this.sync.send({type:`hello`,protocolVersion:7,...this.options.selfRuntimeId?{runtime:this.options.selfRuntimeId}:{},...r?{capabilities:r}:{}}),this.keepalive=new x({sendPing:()=>this.sync.send({type:`ping`}),isTransportOpen:()=>this.sync.isOpen,onStalled:()=>{D.warn(`Leader stopped answering pings; channel still open, waiting for it to catch up`),m(!0),this.options.onLeaderStalled?.(!0)},onRecovered:()=>{D.info(`Leader is answering pings again`),m(!1),this.options.onLeaderStalled?.(!1)},onDead:()=>{D.warn(`Leader keepalive dead, cleaning up`),this.handleDisconnect(`Keepalive timeout — leader not responding`),this.options.onDead?.()}}),this.keepalive.start(),e.addEventListener(`close`,()=>{D.warn(`Data channel closed`),this.handleDisconnect(`Data channel closed`)}),e.addEventListener(`error`,()=>{D.warn(`Data channel error`),this.handleDisconnect(`Data channel error`)})}sendMessage(e,t,r,i){let a=t??`follower-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;this.sentMessageIds.add(a);let o=r?.length?n(r):r;this.sync.send({type:`user_message`,text:e,messageId:a,attachments:o,...i?.steer?{steer:!0}:{}}),D.info(`Sent user message to leader`,{messageId:a})}onEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}stop(){this.sync.send({type:`abort`}),D.info(`Sent abort to leader`)}requestSnapshot(e){this.sync.send({type:`request_snapshot`,...e?{scoopJid:e}:{}})}requestNewSession(e){this.sync.send({type:`new_session`,action:e}),D.info(`Sent new_session to leader`,{action:e})}selectScoop(e){this.sync.send({type:`scoops.select`,scoopJid:e})}requestModels(){this.sync.send({type:`models.request`})}selectModel(e){this.sync.send({type:`model.select`,modelId:e})}setThinkingLevel(e,t,n){this.sync.send({type:`thinking.set`,scoopJid:e,thinkingLevel:t,effortOverride:n})}getLatestSnapshot(){return this.latestSnapshot}close(){this.disconnected||(this.disconnected=!0,this.keepalive.stop(),this.unsubscribe(),this.sync.close(),this.eventListeners.clear(),this.cleanupCDPEventForwarding(),this.rejectPendingRequests(`Follower sync closed`),D.info(`Follower sync closed`))}rejectPendingRequests(e){this.rejectPendingSprinkleFetches(e);for(let e of this.oauthPopupAborts.values())e.abort();this.oauthPopupAborts.clear();for(let e of this.openSudoPrompts.values())e.abort();this.openSudoPrompts.clear();let t=Error(e);for(let{reject:e}of this.tabOpenResolvers.values())e(t);this.tabOpenResolvers.clear();for(let{reject:e}of this.fsResolvers.values())e(t);this.fsResolvers.clear(),this.cdpChunkBuffers.clear();for(let e of this.remoteTransports.values())e.disconnect();this.remoteTransports.clear();for(let[,e]of this.activeExportRequests)e.signal.removeEventListener(`abort`,e.onAbort),e.spool.cancel(),e.reject(new o(`transfer-aborted`));this.activeExportRequests.clear()}advertiseTargets(e,t){this.sync.send({type:`targets.advertise`,targets:e,runtimeId:t})}getTargets(){return this.targetEntries}sendCherryHostEvent(e,t){this.sync.send({type:`cherry.host_event`,targetId:this.options.selfRuntimeId??``,name:e,detail:t})}getSprinkles(){return this.latestSprinkles}refreshSprinkles(){this.sync.send({type:`sprinkles.refresh`})}fetchSprinkleContent(e){let t=this.sprinkleContentCache.get(e);if(t!==void 0)return Promise.resolve(t);let n=this.options.sprinkleFetchTimeoutMs??me;return new Promise((t,r)=>{let i=Symbol(`sprinkle-waiter`),a,o=e=>{a!==void 0&&clearTimeout(a),t(e)},s=e=>{a!==void 0&&clearTimeout(a),r(e)},c=this.sprinkleContentWaiters.get(e)??[];if(c.push({id:i,resolve:o,reject:s}),this.sprinkleContentWaiters.set(e,c),n>0&&(a=setTimeout(()=>{let t=this.sprinkleContentWaiters.get(e);if(t){let r=t.findIndex(e=>e.id===i);r>=0&&t.splice(r,1),t.length===0&&(this.sprinkleContentWaiters.delete(e),this.cancelSprinkleFetch(e,`Sprinkle fetch for "${e}" timed out after ${n}ms`))}r(Error(`Sprinkle fetch for "${e}" timed out after ${n}ms`))},n)),this.inflightSprinkleByName.has(e))return;let l=`sprinkle-fetch-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;this.inflightSprinkleByName.set(e,l),this.pendingSprinkleFetches.set(l,{sprinkleName:e,chunks:new Map,totalChunks:1}),this.fetchEpoch.set(l,this.cacheEpoch),this.sync.send({type:`sprinkle.fetch`,requestId:l,sprinkleName:e})})}sendSprinkleLick(e,t,n){this.sync.send({type:`sprinkle.lick`,sprinkleName:e,body:t,targetScoop:n})||D.warn(`sendSprinkleLick dropped: tray channel closed`,{sprinkleName:e})}reportSprinkleInstances(e){this.sync.send({type:`sprinkle.instances`,sprinkles:e})||D.debug(`reportSprinkleInstances dropped: tray channel closed`)}forwardLick(e){let t=this.sync.send({type:`lick`,event:e});return t||D.warn(`forwardLick dropped: tray channel closed`,{type:e.type}),t}clearSprinkleCache(e){e===void 0?this.sprinkleContentCache.clear():this.sprinkleContentCache.delete(e)}cancelSprinkleFetch(e,t=`fetch cancelled`){let n=this.sprinkleContentWaiters.get(e)??[];this.sprinkleContentWaiters.delete(e);let r=this.inflightSprinkleByName.get(e);if(r!==void 0&&(this.inflightSprinkleByName.delete(e),this.pendingSprinkleFetches.delete(r),this.fetchEpoch.delete(r)),n.length===0)return;let i=Error(t);for(let e of n)e.reject(i)}disconnected=!1;handleDisconnect(e){if(this.disconnected)return;this.disconnected=!0,D.error(`Follower sync disconnected`,{reason:e});let t=h();f({...t,state:`error`,error:e,stalled:!1}),this.keepalive.stop(),this.cleanupCDPEventForwarding(),this.unsubscribe(),this.sync.close(),this.rejectPendingRequests(`Follower sync disconnected: ${e}`),this.options.onDisconnect?.(e)}handleKeepaliveMessage(e){if(e===`ping`){this.keepalive.receivePing(),this.sync.send({type:`pong`});return}this.keepalive.receivePong(),p(Date.now())}handleLeaderHello(e){this.leaderProtocolVersion=e,e>7?D.warn(`Leader speaks a newer tray sync protocol — update this build`,{leaderVersion:e,ourVersion:7}):D.info(`Leader hello`,{protocolVersion:e}),e>=5&&this.requestModels()}noteLegacyLeader(e){e!==`hello`&&this.leaderProtocolVersion===void 0&&(this.legacyLeaderLogged||(this.legacyLeaderLogged=!0,D.info(`Leader sent no hello — legacy peer (pre-versioning build)`)))}handleThemeMessage(e){return e.type===`theme.apply`&&(this.applyLeaderTheme(e.themeJson),!0)}handleLeaderMessage(e){if(this.noteLegacyLeader(e.type),!this.handleThemeMessage(e))switch(e.type){case`snapshot`:D.info(`Snapshot received from leader`,{messageCount:e.messages.length,scoopJid:e.scoopJid}),this.snapshotChunkBuffer=null,this.latestSnapshot={messages:e.messages,scoopJid:e.scoopJid},this.options.onSnapshot?.(e.messages,e.scoopJid);break;case`snapshot_chunk`:{let t=ne(this.snapshotChunkBuffer,e);this.snapshotChunkBuffer=t.buffer,t.result&&(D.info(`Chunked snapshot reassembled from leader`,{messageCount:t.result.messages.length,scoopJid:t.result.scoopJid}),this.latestSnapshot=t.result,this.options.onSnapshot?.(t.result.messages,t.result.scoopJid));break}case`agent_event`:this.emitEvent(e.event);break;case`user_message_echo`:this.handleUserMessageEcho(e);break;case`status`:this.options.onStatus?.(e.scoopStatus,e.scoopJid);break;case`error`:D.warn(`Error from leader`,{error:e.error}),this.emitEvent({type:`error`,error:e.error});break;case`targets.registry`:D.info(`Target registry received from leader`,{targetCount:e.targets.length}),this.targetEntries=e.targets,this.options.onTargetsUpdated?.(this.targetEntries);break;case`cdp.request`:{let{requestId:t,localTargetId:n,method:r,params:i,sessionId:a}=e;this.executeLocalCDP(t,n,r,i,a);break}case`cdp.response`:this.routeCDPResponse(e);break;case`cdp.event`:this.routeCDPEvent(e);break;case`tab.open`:case`preview.open`:this.executeLocalTabOpen(e.requestId,e.url);break;case`tab.opened`:{let t=this.tabOpenResolvers.get(e.requestId);t&&(this.tabOpenResolvers.delete(e.requestId),t.resolve(e.targetId));break}case`tab.open.error`:{let t=this.tabOpenResolvers.get(e.requestId);t&&(this.tabOpenResolvers.delete(e.requestId),t.reject(Error(e.error)));break}case`fs.request`:this.executeLocalFs(e.requestId,e.request);break;case`fs.response`:this.routeFsResponse(e.requestId,e.response);break;case`scoops.list`:this.handleScoopsList(e.scoops,e.activeScoopJid);break;case`models.list`:this.options.onModelsList?.(e.models);break;case`model.state`:this.options.onModelState?.(e.state);break;case`sprinkles.list`:this.handleSprinklesList(e.sprinkles);break;case`sprinkle.content`:this.handleSprinkleContent(e);break;case`sprinkle.update`:this.options.onSprinkleUpdate?.(e.sprinkleName,e.data);break;case`sprinkle.reloaded`:this.handleSprinkleReloaded(e.sprinkleName);break;case`cherry.slicc_event`:this.options.onCherrySliccEvent?.(e.name,e.detail);break;case`transcript.export.pending`:case`transcript.export.denied`:case`transcript.export.start`:case`transcript.export.chunk`:case`transcript.export.complete`:case`transcript.export.error`:this.handleExportLeaderMessage(e);break;case`sudo.approve.request`:case`sudo.approve.cancel`:this.handleSudoLeaderMessage(e);break;case`oauth.popup.request`:this.handleOAuthPopupRequest(e.requestId,e.url);break;case`ping`:case`pong`:this.handleKeepaliveMessage(e.type);break;case`hello`:this.handleLeaderHello(e.protocolVersion);break;case`exec.request`:case`exec.chunk`:case`exec.response`:case`exec.signal`:this.handleExecMessage(e);break;default:{let t=u(e);D.warn(`Unknown leader message type — skewed leader?`,{type:t.type});break}}}handleExecMessage(e){e.type===`exec.request`&&this.sync.send({type:`exec.response`,requestId:e.requestId,exitCode:127,error:`exec is not supported on this follower`})}handleSprinklesList(e){D.info(`Sprinkles list received from leader`,{sprinkleCount:e.length}),this.sprinkleContentCache.clear(),this.cacheEpoch++,this.latestSprinkles=e,this.options.onSprinklesList?.(e)}handleUserMessageEcho(e){if(this.sentMessageIds.has(e.messageId)){this.sentMessageIds.delete(e.messageId),D.debug(`Skipping own message echo`,{messageId:e.messageId});return}D.info(`User message echo received`,{messageId:e.messageId,scoopJid:e.scoopJid}),this.options.onUserMessage?.(e.text,e.messageId,e.scoopJid,e.attachments)}handleScoopsList(e,t){D.info(`Scoops list received from leader`,{scoopCount:e.length}),this.options.onScoopsList?.(e,t)}handleSprinkleReloaded(e){this.sprinkleContentCache.delete(e),this.options.onSprinkleReloaded?.(e)}handleSprinkleContent(e){let{requestId:t,sprinkleName:n,content:r,chunkIndex:i,totalChunks:a,error:o}=e;if(o){D.warn(`sprinkle.content error from leader`,{sprinkleName:n,error:o}),this.pendingSprinkleFetches.delete(t),this.inflightSprinkleByName.delete(n),this.fetchEpoch.delete(t);let e=this.sprinkleContentWaiters.get(n)??[];this.sprinkleContentWaiters.delete(n);for(let t of e)t.reject(Error(o));return}if(!this.pendingSprinkleFetches.has(t)){D.debug(`Dropping sprinkle.content for unknown requestId`,{sprinkleName:n,requestId:t});return}let s=null;if(i!==void 0&&a!==void 0){if(i<0||i>=a){D.warn(`Dropping sprinkle.content with out-of-range chunkIndex`,{sprinkleName:n,chunkIndex:i,totalChunks:a});return}let e=this.pendingSprinkleFetches.get(t);if(e.totalChunks=a,e.chunks.has(i)?D.warn(`Dropping duplicate sprinkle.content chunk`,{sprinkleName:n,chunkIndex:i}):e.chunks.set(i,r),e.chunks.size>=a){let r=[];for(let t=0;t<a;t++){let i=e.chunks.get(t);if(i===void 0){D.warn(`Chunked sprinkle.content missing chunk after assembly`,{sprinkleName:n,missingIndex:t});return}r.push(i)}s=r.join(``),this.pendingSprinkleFetches.delete(t)}}else s=r,this.pendingSprinkleFetches.delete(t);if(s===null)return;let c=this.fetchEpoch.get(t);this.fetchEpoch.delete(t),c===this.cacheEpoch&&this.sprinkleContentCache.set(n,s),this.inflightSprinkleByName.delete(n);let l=this.sprinkleContentWaiters.get(n)??[];this.sprinkleContentWaiters.delete(n);for(let e of l)e.resolve(s)}rejectPendingSprinkleFetches(e){let t=Error(e);for(let[,e]of this.sprinkleContentWaiters)for(let n of e)n.reject(t);this.sprinkleContentWaiters.clear(),this.pendingSprinkleFetches.clear(),this.inflightSprinkleByName.clear(),this.fetchEpoch.clear()}applyLeaderTheme(e){this.options.onThemeApply?.(e)}emitEvent(e){for(let t of this.eventListeners)try{t(e)}catch(t){D.error(`Listener error`,{eventType:e.type,error:t instanceof Error?t.message:String(t)})}}createRemoteTransport(e,t){let n=new g({sendCDPRequest:(n,r,i,a)=>{this.sync.send({type:`cdp.request`,requestId:n,targetRuntimeId:e,localTargetId:t,method:r,params:i,sessionId:a})}});return this.remoteTransports.set(`${e}:${t}`,n),n}removeRemoteTransport(e,t){let n=`${e}:${t}`,r=this.remoteTransports.get(n);r&&(r.disconnect(),this.remoteTransports.delete(n))}openRemoteTab(e,t){let n=`tab-open-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((r,i)=>{this.tabOpenResolvers.set(n,{resolve:r,reject:i}),this.sync.send({type:`tab.open`,requestId:n,targetRuntimeId:e,url:t})})}requestTabTeleport(e){let t=`tab-teleport-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((n,r)=>{let i=setTimeout(()=>{this.tabOpenResolvers.delete(t)&&r(Error(`tab teleport timed out`))},he),a=e=>t=>{clearTimeout(i),e(t)};this.tabOpenResolvers.set(t,{resolve:a(n),reject:a(r)}),this.sync.send({type:`tab.teleport.request`,requestId:t,targetId:e})===!1&&(clearTimeout(i),this.tabOpenResolvers.delete(t),r(Error(`not connected to a leader`)))})}getLeaderProtocolVersion(){return this.leaderProtocolVersion}async handleOAuthPopupRequest(e,t){let n=this.options.onOAuthPopupRequest;if(!n){D.warn(`Leader delegated an OAuth popup, but this float cannot show one`,{requestId:e}),this.sync.send({type:`oauth.popup.response`,requestId:e,error:`this follower cannot show an interactive login`});return}let r=new AbortController;this.oauthPopupAborts.set(e,r);try{let i=await n(t,r.signal);this.sync.send({type:`oauth.popup.response`,requestId:e,...i?{redirectUrl:i}:{}})}catch(t){D.warn(`Delegated OAuth popup failed`,{requestId:e,error:String(t)}),this.sync.send({type:`oauth.popup.response`,requestId:e,error:t instanceof Error?t.message:String(t)})}finally{this.oauthPopupAborts.delete(e)}}async executeLocalTabOpen(e,t){let n=this.options.browserTransport;if(!n){this.sync.send({type:`tab.open.error`,requestId:e,error:`Follower has no browser transport`});return}try{let r=(await n.send(`Target.createTarget`,{url:t,background:!0})).targetId;if(typeof r!=`string`||r.length===0){this.sync.send({type:`tab.open.error`,requestId:e,error:`Target.createTarget did not return a usable targetId`});return}this.sync.send({type:`tab.opened`,requestId:e,targetId:r}),this.options.onTargetsChanged?.()}catch(t){this.sync.send({type:`tab.open.error`,requestId:e,error:t instanceof Error?t.message:String(t)})}}async executeLocalCDP(e,t,n,r,i){let a=this.options.browserTransport;if(!a){this.sync.send({type:`cdp.response`,requestId:e,error:`Follower has no browser transport`});return}try{let t=await a.send(n,r,i);if(n===`Target.attachToTarget`&&t.sessionId){let e=t.sessionId;this.remoteCDPSessions.add(e),this.setupCDPEventForwarding(a,e),D.debug(`Tracking remote CDP session`,{remoteSessionId:e})}n===`Target.detachFromTarget`&&i&&this.remoteCDPSessions.has(i)&&(this.remoteCDPSessions.delete(i),D.debug(`Removed remote CDP session on detach`,{sessionId:i})),l(this.sync,e,t)}catch(t){this.sync.send({type:`cdp.response`,requestId:e,error:t instanceof Error?t.message:String(t)})}}setupCDPEventForwarding(e,t){for(let n of[`Page.frameNavigated`,`Page.loadEventFired`,`Page.domContentEventFired`,`Network.responseReceived`,`Network.loadingFinished`,`Network.requestWillBeSent`,`Runtime.executionContextCreated`,`Runtime.executionContextDestroyed`,`Runtime.executionContextsCleared`]){let r=e=>{if(e.sessionId!==t||!this.remoteCDPSessions.has(t))return;let{sessionId:r,...i}=e;this.sync.send({type:`cdp.event`,method:n,params:i,sessionId:t})};e.on(n,r),this.cdpEventCleanups.push(()=>e.off(n,r))}}cleanupCDPEventForwarding(){for(let e of this.cdpEventCleanups)e();this.cdpEventCleanups.length=0,this.remoteCDPSessions.clear()}routeCDPResponse(e){let t=c(this.cdpChunkBuffers,e);if(t)for(let n of this.remoteTransports.values())n.handleResponse(e.requestId,t.result,t.error)}routeCDPEvent(e){let t=e.sessionId?{...e.params,sessionId:e.sessionId}:e.params;for(let n of this.remoteTransports.values())n.handleEvent(e.method,t)}async executeLocalFs(e,t){let n=this.options.vfs;if(!n){this.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Follower has no VFS`}});return}let r;try{r=await C(n,t)}catch(t){this.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:t instanceof Error?t.message:String(t)}});return}for(let t of r)this.sync.send({type:`fs.response`,requestId:e,response:t})}routeFsResponse(e,t){let n=this.fsResolvers.get(e);if(!n)return;n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),n.resolve(n.responses))}sendFsRequest(e,t){let n=`fs-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((r,i)=>{this.fsResolvers.set(n,{resolve:r,reject:i,responses:[]}),this.sync.send({type:`fs.request`,requestId:n,targetRuntimeId:e,request:t})})}handleExportLeaderMessage(e){switch(e.type){case`transcript.export.pending`:D.debug(`Transcript export pending`,{requestId:e.requestId}),this.activeExportRequests.get(e.requestId)?.onProgress?.({phase:`collecting`});break;case`transcript.export.denied`:this.handleExportDenied(e.requestId);break;case`transcript.export.start`:D.debug(`Transcript export start`,{requestId:e.requestId}),this.activeExportRequests.get(e.requestId)?.onProgress?.({phase:`packaging`});break;case`transcript.export.chunk`:this.handleExportChunkAsync(e.requestId,e.index,e.data);break;case`transcript.export.complete`:this.handleExportComplete(e.requestId,e.chunks,e.byteLength,e.sha256);break;case`transcript.export.error`:this.handleExportError(e.requestId,e.code);break;default:{let t=u(e);D.warn(`Unknown transcript export leader message — skewed leader?`,{type:t.type});break}}}requestTranscriptExport(e,t,n){if(t.aborted)return Promise.reject(new o(`transfer-aborted`));let r=`te-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,i=(this.options.makeExportSpool??ae)(r);return new Promise((a,s)=>{let c=()=>{let e=this.activeExportRequests.get(r);e&&(this.sync.send({type:`transcript.export.cancel`,requestId:r}),this.activeExportRequests.delete(r),e.spool.cancel(),s(new o(`transfer-aborted`)))};if(t.aborted){i.cancel(),s(new o(`transfer-aborted`));return}t.addEventListener(`abort`,c,{once:!0}),this.activeExportRequests.set(r,{resolve:a,reject:s,spool:i,nextExpectedIndex:0,totalBytes:0,signal:t,onAbort:c,onProgress:n}),this.sync.send({type:`transcript.export.request`,requestId:r,selector:e})})}handleSudoLeaderMessage(e){if(e.type===`sudo.approve.cancel`){this.openSudoPrompts.get(e.requestId)?.abort();return}this.handleSudoApprovalRequest(e)}async handleSudoApprovalRequest(e){let{requestId:t}=e,n=e=>{this.sync.send({type:`sudo.approve.response`,requestId:t,decision:e.decision,...e.decision===`always`&&e.pattern?{pattern:e.pattern}:{},...e.attestation?{attestation:e.attestation}:{}})},r=this.options.onSudoApprovalRequest;if(!r){D.warn(`No sudo approval handler wired — denying delegated prompt`,{requestId:t}),n({decision:`deny`});return}if(this.openSudoPrompts.has(t))return;let i=new AbortController;this.openSudoPrompts.set(t,i);let a={decision:`deny`};try{a=await r({requestId:t,kind:e.kind,detail:e.detail,...e.suggestedPattern?{suggestedPattern:e.suggestedPattern}:{},...e.scoopName?{scoopName:e.scoopName}:{},expiresAt:e.expiresAt,signal:i.signal})}catch(e){D.warn(`Sudo approval dialog failed — denying`,{requestId:t,error:e instanceof Error?e.message:String(e)}),a={decision:`deny`}}finally{this.openSudoPrompts.delete(t)}if(i.signal.aborted){n({decision:`deny`});return}n(a)}registerPushToken(e){return this.sync.send({type:`push.register`,...e})}handleExportDenied(e){let t=this.activeExportRequests.get(e);t&&(t.signal.removeEventListener(`abort`,t.onAbort),this.activeExportRequests.delete(e),t.spool.cancel(),t.reject(new o(`permission-denied`)))}async handleExportChunkAsync(e,t,n){let r=this.activeExportRequests.get(e);if(!r)return;if(t!==r.nextExpectedIndex){D.warn(`Transcript export chunk out of order`,{requestId:e,expected:r.nextExpectedIndex,got:t}),r.signal.removeEventListener(`abort`,r.onAbort),this.activeExportRequests.delete(e),this.sync.send({type:`transcript.export.cancel`,requestId:e}),r.spool.cancel(),r.reject(new o(`transfer-corrupt`));return}let i=atob(n),a=new Uint8Array(i.length);for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);r.totalBytes+=a.byteLength,r.nextExpectedIndex++,r.onProgress?.({phase:`transferring`,processedBytes:r.totalBytes});try{await r.spool.append(a,t)}catch(t){if(!this.activeExportRequests.has(e))return;r.signal.removeEventListener(`abort`,r.onAbort),this.activeExportRequests.delete(e),this.sync.send({type:`transcript.export.cancel`,requestId:e}),r.spool.cancel(),r.reject(new o(`transfer-corrupt`)),D.warn(`Transcript export spool append failed`,{requestId:e,error:t instanceof Error?t.message:String(t)});return}this.activeExportRequests.has(e)&&this.sync.send({type:`transcript.export.ack`,requestId:e,index:t})}async handleExportComplete(e,t,n,r){let i=this.activeExportRequests.get(e);if(!i)return;if(i.signal.removeEventListener(`abort`,i.onAbort),this.activeExportRequests.delete(e),i.nextExpectedIndex!==t){D.warn(`Transcript export chunk count mismatch`,{requestId:e,expected:t,got:i.nextExpectedIndex}),i.spool.cancel(),i.reject(new o(`transfer-corrupt`));return}let a;try{a=await i.spool.finalize(t,n,r)}catch(t){D.warn(`Transcript export spool finalize failed`,{requestId:e,error:t instanceof Error?t.message:String(t)}),i.reject(new o(`transfer-corrupt`));return}i.resolve(a)}handleExportError(e,t){let n=this.activeExportRequests.get(e);if(!n)return;n.signal.removeEventListener(`abort`,n.onAbort),this.activeExportRequests.delete(e),n.spool.cancel();let r=a.has(t)?t:`transfer-corrupt`;n.reject(new o(r))}},O=class{logger;failureMessage;recoveryMessage;throttleMs;sustainedRelogMs;recoveryDebounceTicks;now;lastErrorLogAt=-1/0;inFailingState=!1;consecutiveSuccesses=0;constructor(e,t){if(!t.failureMessage.trim())throw RangeError(`ThrottledErrorTracker: failureMessage must be non-empty`);if(!t.recoveryMessage.trim())throw RangeError(`ThrottledErrorTracker: recoveryMessage must be non-empty`);let n=t.throttleMs??6e4;if(!Number.isFinite(n)||n<0)throw RangeError(`ThrottledErrorTracker: throttleMs must be a non-negative finite number, got ${n}`);let r=t.sustainedRelogMs??3e5;if(!Number.isFinite(r)||r<0)throw RangeError(`ThrottledErrorTracker: sustainedRelogMs must be a non-negative finite number, got ${r}`);let i=t.recoveryDebounceTicks??5;if(!Number.isInteger(i)||i<1)throw RangeError(`ThrottledErrorTracker: recoveryDebounceTicks must be a positive integer, got ${i}`);this.logger=e,this.failureMessage=t.failureMessage,this.recoveryMessage=t.recoveryMessage,this.throttleMs=n,this.sustainedRelogMs=r,this.recoveryDebounceTicks=i,this.now=t.now??(()=>performance.now())}reportFailure(e){let t=this.inFailingState;this.inFailingState=!0,this.consecutiveSuccesses=0;let n=this.now(),r=n-this.lastErrorLogAt;if(r>(t?this.sustainedRelogMs:this.throttleMs)){let i=t,a=i?`${this.failureMessage} (sustained)`:this.failureMessage;try{try{this.logger.error(a,i?{error:e instanceof Error?e.message:String(e),elapsedMs:Math.round(r)}:{error:e instanceof Error?e.message:String(e)})}catch(t){try{console.error(`[throttled-error-tracker] logger.error threw`,t,{originalMessage:a,originalError:e instanceof Error?e.message:String(e)})}catch{}}}finally{this.lastErrorLogAt=n}}}reportSuccess(){if(this.inFailingState&&(this.consecutiveSuccesses++,!(this.consecutiveSuccesses<this.recoveryDebounceTicks)))try{try{this.logger.error(this.recoveryMessage,{kind:`recovery`})}catch(e){try{console.error(`[throttled-error-tracker] logger.error (recovery) threw`,e,{originalMessage:this.recoveryMessage})}catch{}}}finally{this.inFailingState=!1,this.consecutiveSuccesses=0,this.lastErrorLogAt=-1/0}}},k=t(`tray-follower`);function A(e){let t=new URL(e);return t.searchParams.set(`json`,`true`),t.toString()}async function j(e){let t=A(e.joinUrl),n=await ve(await(e.fetchImpl??fetch)(t,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({controllerId:e.controllerId,runtime:e.runtime})}));return k.info(`Follower tray attach response`,{trayId:n.trayId,action:n.result.action,code:n.result.code,participantCount:n.participantCount}),M(n)}function M(e){let t={trayId:e.trayId,controllerId:e.controllerId,participantCount:e.participantCount,leader:e.leader,action:e.result.action,code:e.result.code,iceServers:e.iceServers};return e.result.action===`wait`?{...t,retryAfterMs:e.result.retryAfterMs}:e.result.action===`signal`?{...t,bootstrap:e.result.bootstrap}:e.result.action===`fail`?{...t,error:e.result.error,...e.result.code===`TRAY_SUPERSEDED`?{supersededByJoinUrl:e.result.joinUrl}:{}}:t}async function N(e){return L(await R(e,{action:`poll`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,cursor:e.cursor}))}async function P(e){return L(await R(e,{action:`answer`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,answer:e.answer}))}async function F(e){return L(await R(e,{action:`ice-candidate`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,candidate:e.candidate}))}async function I(e){return L(await R(e,{action:`retry`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,runtime:e.runtime}))}function L(e){return{trayId:e.trayId,controllerId:e.controllerId,participantCount:e.participantCount,leader:e.leader,bootstrap:e.bootstrap,events:e.events}}async function ve(e){let t=null,n=null;try{t=await e.text(),n=JSON.parse(t)}catch{}if(!ye(n)){let n=t?t.slice(0,200):`(empty)`;throw k.warn(`Tray follower attach returned an invalid response`,{status:e.status,body:n}),Error(`Tray follower attach returned an invalid response (${e.status}): ${n}`)}return n}async function R(e,t){let n=A(e.joinUrl),r=await(e.fetchImpl??fetch)(n,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),i=await r.json().catch(()=>null);if(!be(i))throw Error(`Tray follower bootstrap returned an invalid response (${r.status})`);return i}function ye(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.trayId!=`string`||typeof t.controllerId!=`string`||t.role!==`follower`||typeof t.participantCount!=`number`)return!1;let n=t.result;if(!n||typeof n!=`object`)return!1;let r=n;return r.action===`wait`?(r.code===`LEADER_NOT_ELECTED`||r.code===`LEADER_NOT_CONNECTED`)&&typeof r.retryAfterMs==`number`:r.action===`signal`?r.code===`LEADER_CONNECTED`&&z(r.bootstrap):r.action===`fail`?r.code===`TRAY_SUPERSEDED`?typeof r.error==`string`&&typeof r.joinUrl==`string`:(r.code===`INVALID_JOIN_CAPABILITY`||r.code===`TRAY_EXPIRED`)&&typeof r.error==`string`:!1}function be(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.trayId==`string`&&typeof t.controllerId==`string`&&t.role===`follower`&&typeof t.participantCount==`number`&&z(t.bootstrap)&&Array.isArray(t.events)}function z(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.controllerId==`string`&&typeof t.bootstrapId==`string`&&typeof t.attempt==`number`&&typeof t.state==`string`&&typeof t.expiresAt==`string`&&typeof t.cursor==`number`&&typeof t.maxRetries==`number`&&typeof t.retriesRemaining==`number`}var B=t(`tray-webrtc`),xe=`tray-control`,Se=250,Ce=5,we=1e3,Te=class{options;peerConnectionFactory;dataChannelLabel;peers=new Map;iceServers;constructor(e){this.options=e,this.iceServers=e.iceServers,this.peerConnectionFactory=e.peerConnectionFactory??(()=>H(this.iceServers)),this.dataChannelLabel=e.dataChannelLabel??xe}setIceServers(e){this.iceServers=e}async handleControlMessage(e){e.type===`follower.join_requested`?(e.iceServers&&!this.iceServers&&(this.iceServers=e.iceServers),await this.handleJoinRequested(e)):e.type===`bootstrap.answer`?await this.peers.get(e.bootstrapId)?.peer.setRemoteDescription(e.answer):e.type===`bootstrap.ice_candidate`&&await this.peers.get(e.bootstrapId)?.peer.addIceCandidate(e.candidate)}getPeers(){return Array.from(this.peers.values()).map(({state:e})=>({...e}))}getChannel(e){return this.peers.get(e)?.channel??null}stop(){for(let e of this.peers.values())e.peer.close();this.peers.clear(),this.options.onPeersChanged?.()}async handleJoinRequested(e){this.closeControllerPeers(e.controllerId);let t=this.peerConnectionFactory(),n={controllerId:e.controllerId,bootstrapId:e.bootstrapId,attempt:e.attempt,state:`connecting`,connectedAt:null,runtime:e.runtime},r=V(t.createDataChannel(this.dataChannelLabel),t);this.peers.set(e.bootstrapId,{state:n,peer:t,channel:r}),this.options.onPeersChanged?.(),t.addEventListener(`icecandidate`,({candidate:t})=>{let n=W(t);n&&this.options.sendControlMessage({type:`bootstrap.ice_candidate`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,candidate:n})}),t.addEventListener(`connectionstatechange`,()=>{let n=this.peers.get(e.bootstrapId);n&&(n.state.state===`connected`?(t.connectionState===`disconnected`||t.connectionState===`failed`)&&(B.warn(`Leader peer connection state changed post-connect`,{bootstrapId:e.bootstrapId,state:t.connectionState}),this.options.onPeerDisconnected?.(e.bootstrapId,`Peer connection ${t.connectionState}`)):t.connectionState===`failed`&&this.failPeer(e,`Leader peer connection failed before the data channel opened`))}),r.addEventListener(`open`,()=>{let t=this.peers.get(e.bootstrapId);!t||t.state.state===`connected`||(t.state.state=`connected`,t.state.connectedAt=new Date().toISOString(),this.options.onPeerConnected?.({...t.state},t.channel),this.options.onPeersChanged?.())}),r.addEventListener(`close`,()=>{let t=this.peers.get(e.bootstrapId);t&&(t.state.state===`connected`?(B.warn(`Leader data channel closed post-connect`,{bootstrapId:e.bootstrapId}),this.options.onPeerDisconnected?.(e.bootstrapId,`Data channel closed`),this.options.onPeerTransportClosed?.(e.bootstrapId,`Data channel closed`)):this.failPeer(e,`Leader data channel closed before opening`))}),r.addEventListener(`error`,()=>{let t=this.peers.get(e.bootstrapId);t&&(t.state.state===`connected`?(B.warn(`Leader data channel error post-connect`,{bootstrapId:e.bootstrapId}),this.options.onPeerDisconnected?.(e.bootstrapId,`Data channel error`)):this.failPeer(e,`Leader data channel failed before opening`))});try{let n=await t.createOffer();await t.setLocalDescription(n),this.options.sendControlMessage({type:`bootstrap.offer`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,offer:U(t.localDescription??n,`offer`)})}catch(t){this.failPeer(e,t instanceof Error?t.message:String(t))}}closeControllerPeers(e){for(let[t,n]of this.peers.entries())n.state.controllerId===e&&(n.state.state===`connected`&&(this.options.onPeerDisconnected?.(t,`Controller superseded`),this.options.onPeerTransportClosed?.(t,`Controller superseded`)),n.peer.close(),this.peers.delete(t))}failPeer(e,t){let n=this.peers.get(e.bootstrapId);if(n){n.peer.close(),this.peers.delete(e.bootstrapId),this.options.onPeersChanged?.();try{this.options.sendControlMessage({type:`bootstrap.failed`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,code:`WEBRTC_BOOTSTRAP_FAILED`,message:t,retryable:!0,retryAfterMs:1e3})}catch(e){B.warn(`Failed to report tray bootstrap failure`,{error:e instanceof Error?e.message:String(e)})}}}},Ee=class{options;fetchImpl;peerConnectionFactory;controllerIdFactory;sleep;pollIntervalMs;iceServers;activePeer=null;stopped=!1;constructor(e){this.options=e,this.fetchImpl=e.fetchImpl??fetch,this.iceServers=e.iceServers,this.peerConnectionFactory=e.peerConnectionFactory??(()=>H(this.iceServers)),this.controllerIdFactory=e.controllerIdFactory??(()=>crypto.randomUUID()),this.sleep=e.sleep??(e=>new Promise(t=>setTimeout(t,e))),this.pollIntervalMs=e.pollIntervalMs??Se}async start(){this.stopped=!1;let e=this.controllerIdFactory(),t=Date.now();f({state:`connecting`,joinUrl:this.options.joinUrl,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:t,lastError:null}),B.info(`Follower tray join starting`,{joinUrl:this.options.joinUrl});let n=0,r=0;for(;;){G(this.stopped),n++;let t;try{t=await j({joinUrl:this.options.joinUrl,controllerId:e,runtime:this.options.runtime,fetchImpl:this.fetchImpl})}catch(e){let t=e instanceof Error?e.message:String(e);throw f({...h(),attachAttempts:n,lastError:t}),e}if(f({...h(),attachAttempts:n,lastAttachCode:t.code}),this.followSupersededJoinUrl(t,r)){r++,await this.sleep(we);continue}if(t.action===`wait`){let e=t.retryAfterMs??1e3;B.info(`Follower tray attach waiting`,{attempt:n,code:t.code,retryAfterMs:e}),n%10==0&&B.warn(`Follower tray attach still waiting after ${n} attempts`,{attempt:n,code:t.code,retryAfterMs:e}),await this.sleep(e);continue}if(t.action===`fail`||!t.bootstrap){let e=t.error??`Tray follower attach failed (${t.code})`;throw f({state:`error`,joinUrl:this.options.joinUrl,trayId:null,error:e,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:e}),B.warn(`Follower tray attach failed`,{error:e}),Error(e)}t.iceServers&&(this.iceServers=t.iceServers);try{let r=await this.completeBootstrap(t.trayId,e,t.bootstrap);return f({state:`connected`,joinUrl:this.options.joinUrl,trayId:r.trayId,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:null}),B.info(`Follower tray connected`,{trayId:r.trayId,controllerId:e}),r}catch(e){let r=e instanceof Error?e.message:String(e);throw f({state:`error`,joinUrl:this.options.joinUrl,trayId:t.trayId,error:r,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:r}),B.warn(`Follower tray bootstrap failed`,{error:r}),e}}}followSupersededJoinUrl(e,t){if(e.action!==`fail`||e.code!==`TRAY_SUPERSEDED`||!e.supersededByJoinUrl)return!1;if(t>=Ce)throw Error(`Follower tray attach gave up after ${t} supersede redirects (possible redirect cycle)`);let n;try{n=new URL(e.supersededByJoinUrl)}catch{throw Error(`Follower tray superseded with an invalid joinUrl: ${e.supersededByJoinUrl}`)}return B.info(`Follower tray superseded, following redirect`,{oldJoinUrl:this.options.joinUrl,newJoinUrl:n.toString()}),this.options.joinUrl=n.toString(),this.options.onJoinUrlChanged?.(n.toString()),!0}stop(){this.stopped=!0,this.activePeer?.peer.close(),this.activePeer?.channel?.close(),this.activePeer=null,f({state:`inactive`,joinUrl:null,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null})}async completeBootstrap(e,t,n){let r=n,i=0;for(this.activePeer=this.createFollowerPeer(t,r.bootstrapId);;){if(G(this.stopped),this.activePeer.open&&this.activePeer.channel)return{trayId:e,controllerId:t,bootstrapId:r.bootstrapId,channel:this.activePeer.channel};if(this.activePeer.openError)throw Error(this.activePeer.openError);let n=await N({joinUrl:this.options.joinUrl,controllerId:t,bootstrapId:r.bootstrapId,cursor:i,fetchImpl:this.fetchImpl});r=n.bootstrap,i=r.cursor;try{await this.applyBootstrapEvents(n.events,this.activePeer,t,r.bootstrapId)}catch(e){if(r.failure?.retryable&&r.retriesRemaining>0){r=(await I({joinUrl:this.options.joinUrl,controllerId:t,bootstrapId:r.bootstrapId,runtime:this.options.runtime,fetchImpl:this.fetchImpl})).bootstrap,i=0,this.activePeer.peer.close(),this.activePeer=this.createFollowerPeer(t,r.bootstrapId);continue}throw e}this.activePeer.open||await this.sleep(this.pollIntervalMs)}}async applyBootstrapEvents(e,t,n,r){for(let i of e)if(i.type===`bootstrap.offer`){await t.peer.setRemoteDescription(i.offer);let e=await t.peer.createAnswer();await t.peer.setLocalDescription(e),await P({joinUrl:this.options.joinUrl,controllerId:n,bootstrapId:r,answer:U(t.peer.localDescription??e,`answer`),fetchImpl:this.fetchImpl})}else if(i.type===`bootstrap.ice_candidate`)await t.peer.addIceCandidate(i.candidate);else if(i.type===`bootstrap.failed`)throw Error(i.failure.message)}createFollowerPeer(e,t){let n=this.peerConnectionFactory(),r={peer:n,channel:null,open:!1,openError:null};return n.addEventListener(`connectionstatechange`,()=>{r.open&&(n.connectionState===`disconnected`||n.connectionState===`failed`)&&(B.warn(`Follower peer connection state changed post-connect`,{bootstrapId:t,state:n.connectionState}),this.options.onDisconnected?.(`Peer connection ${n.connectionState}`))}),n.addEventListener(`datachannel`,({channel:e})=>{r.channel=V(e,n),e.addEventListener(`open`,()=>{r.open=!0}),e.addEventListener(`close`,()=>{r.open?(B.warn(`Follower data channel closed post-connect`,{bootstrapId:t}),this.options.onDisconnected?.(`Data channel closed`)):r.openError=`Follower data channel closed before opening`}),e.addEventListener(`error`,()=>{r.open?(B.warn(`Follower data channel error post-connect`,{bootstrapId:t}),this.options.onDisconnected?.(`Data channel error`)):r.openError=`Follower data channel failed before opening`})}),n.addEventListener(`icecandidate`,({candidate:n})=>{let r=W(n);r&&F({joinUrl:this.options.joinUrl,controllerId:e,bootstrapId:t,candidate:r,fetchImpl:this.fetchImpl}).catch(e=>{B.warn(`Failed to send follower ICE candidate`,{error:e instanceof Error?e.message:String(e)})})}),r}};function De(e,t){let n=t.baseDelayMs??1e3,r=t.backoffMultiplier??2,i=t.maxDelayMs??3e4,a=t.maxAttempts??10,o=t.sleep??e.sleep??(e=>new Promise(t=>setTimeout(t,e))),s=!1,c=!1,l=null,u={cancel(){s=!0,c=!1,l?.stop(),l=null},get reconnecting(){return c}},d=()=>{let t=new Ee({...e,sleep:o,onDisconnected:e=>{s||(B.warn(`Follower disconnected, starting reconnect loop`,{reason:e}),p(e))},onJoinUrlChanged:t=>{e.joinUrl=t,e.onJoinUrlChanged?.(t)}});return l=t,{manager:t,connectionPromise:t.start()}},p=async u=>{if(s||c)return;c=!0,l?.stop(),l=null;let p=0,m=n,g=u??`Unknown disconnect`;for(;!s&&p<a&&(p++,t.onReconnecting?.(p),f({...h(),state:`reconnecting`,error:null,reconnectAttempts:p}),B.info(`Reconnect attempt`,{attempt:p,delay:m}),await o(m),!s);){let n=null;try{let r=d();n=r.manager;let i=await r.connectionPromise;if(s){n.stop();break}c=!1,f({...h(),state:`connected`,joinUrl:e.joinUrl,trayId:i.trayId,error:null,lastPingTime:null,reconnectAttempts:0,connectingSince:null,lastError:null}),B.info(`Reconnect successful`,{attempt:p,trayId:i.trayId}),t.onConnected(i);return}catch(e){g=e instanceof Error?e.message:String(e),B.warn(`Reconnect attempt failed`,{attempt:p,error:g}),n?.stop(),l=null}m=Math.min(m*r,i)}s||(c=!1,f({...h(),state:`error`,error:`Reconnect failed after ${p} attempts: ${g}`,reconnectAttempts:p}),B.warn(`Reconnect gave up`,{attempts:p,lastError:g}),t.onGaveUp?.(g))},{connectionPromise:m}=d();return m.then(e=>{s||t.onConnected(e)}).catch(e=>{s||(B.error(`Initial follower connection failed`,{error:e instanceof Error?e.message:String(e)}),p(e instanceof Error?e.message:String(e)))}),u}function V(e,t){return e.getMaxMessageSize=()=>t.sctp?.maxMessageSize,e}function H(e){if(typeof RTCPeerConnection>`u`)throw Error(`RTCPeerConnection is not available in this runtime`);let t=e?.length?{iceServers:e}:void 0;return new RTCPeerConnection(t)}function U(e,t){if(!e||e.type!==t||typeof e.sdp!=`string`)throw Error(`Expected a local ${t} description before signaling`);return{type:e.type,sdp:e.sdp}}function W(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.candidate==`string`?{candidate:t.candidate,sdpMid:typeof t.sdpMid==`string`?t.sdpMid:null,sdpMLineIndex:typeof t.sdpMLineIndex==`number`?t.sdpMLineIndex:null,usernameFragment:typeof t.usernameFragment==`string`?t.usernameFragment:null}:null}function G(e){if(e)throw Error(`Tray follower stopped before WebRTC bootstrap completed`)}function K(e){if(!e)throw Error(`canonicalRuntimeId: bootstrapId is required`);return e.startsWith(`follower-`)?e:`follower-${e}`}var q=t(`sprinkle-follower`),Oe=class{sync;addSprinkle;removeSprinkle;zone;openPath;open=new Map;opening=new Set;latestDesiredOpen=new Set;pendingUpdates=new Map;updateListeners=new Map;disposed=!1;constructor(e){this.sync=e.sync,this.addSprinkle=e.addSprinkle,this.removeSprinkle=e.removeSprinkle,this.zone=e.zone,this.openPath=e.open}async updateAvailable(e){if(this.disposed)return;let t=new Map;for(let n of e)n.open&&t.set(n.name,n);this.latestDesiredOpen=new Set(t.keys());for(let e of[...this.open.keys()])t.has(e)||this.closeLocally(e);for(let e of[...this.pendingUpdates.keys()])t.has(e)||this.pendingUpdates.delete(e);let n=[];for(let[e,r]of t)this.open.has(e)||this.opening.has(e)||n.push(this.openLocally(e,r));await Promise.allSettled(n),this.reportInstances()}handleSprinkleUpdate(e,t){if(this.disposed)return;let n=this.open.get(e);if(n){n.renderer.pushUpdate(t),this.fanOutToListeners(e,t);return}if(this.opening.has(e)){this.pendingUpdates.set(e,t);return}q.debug(`Dropping sprinkle.update for unknown sprinkle`,{sprinkleName:e})}async handleSprinkleReloaded(e){if(this.disposed)return;let t=this.open.get(e);if(!t){this.opening.has(e)&&this.pendingUpdates.delete(e);return}this.updateListeners.delete(e);let n;try{n=await this.sync.fetchSprinkleContent(e)}catch(t){q.warn(`Failed to fetch sprinkle content for reload`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)});return}if(this.disposed||!this.open.has(e))return;try{t.renderer.dispose()}catch(t){q.warn(`Sprinkle dispose threw during reload`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}let r=this.createBridge(e),i=new v(t.container,r);try{await i.render(n,e)}catch(t){q.warn(`Sprinkle re-render failed during reload`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}if(this.disposed||!this.open.has(e)){i.dispose();return}t.renderer=i,i.activateBridgeLifecycle(),this.open.has(e)&&q.info(`Sprinkle reloaded in place`,{sprinkleName:e})}dispose(){if(!this.disposed){this.disposed=!0;for(let e of[...this.open.keys()])this.closeLocally(e);this.pendingUpdates.clear(),this.latestDesiredOpen.clear(),this.updateListeners.clear(),this.reportInstances()}}async openLocally(e,t){this.opening.add(e);let n;try{n=await this.sync.fetchSprinkleContent(e)}catch(t){this.opening.delete(e),this.pendingUpdates.delete(e),q.warn(`Failed to fetch sprinkle content from leader`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)});return}if(this.disposed||!this.latestDesiredOpen.has(e)){this.opening.delete(e),this.pendingUpdates.delete(e);return}let r=document.createElement(`div`);r.className=`sprinkle-panel`,r.style.cssText=`width: 100%; height: 100%; display: flex; flex-direction: column; overflow-y: auto;`,r.dataset.sprinkle=e;let i=this.createBridge(e),a=new v(r,i);this.addSprinkle(e,t.title,r,this.zone,{icon:t.icon});try{await a.render(n,e)}catch(t){q.warn(`Sprinkle render failed`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}if(this.disposed||!this.latestDesiredOpen.has(e)){this.updateListeners.delete(e),this.opening.delete(e),this.pendingUpdates.delete(e);try{a.dispose()}catch(t){q.warn(`Sprinkle dispose threw during post-render cleanup`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}r.remove();try{this.removeSprinkle(e)}catch(t){q.warn(`removeSprinkle callback threw during post-render cleanup`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}return}if(this.open.set(e,{renderer:a,container:r}),this.opening.delete(e),a.activateBridgeLifecycle(),this.reportInstances(),!this.open.has(e))return;let o=this.pendingUpdates.get(e);o!==void 0&&(this.pendingUpdates.delete(e),a.pushUpdate(o),this.fanOutToListeners(e,o))}fanOutToListeners(e,t){let n=this.updateListeners.get(e);if(n)for(let r of[...n])try{r(t)}catch(t){q.warn(`Sprinkle update listener threw`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}}reportInstances(){try{this.sync.reportSprinkleInstances([...this.open.keys()])}catch(e){q.debug(`Failed to report sprinkle instances`,{error:e instanceof Error?e.message:String(e)})}}closeLocally(e){this.updateListeners.delete(e),this.pendingUpdates.delete(e);let t=this.open.get(e);if(t){try{t.renderer.dispose()}catch(t){q.warn(`Sprinkle dispose threw`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}t.container.remove(),this.open.delete(e);try{this.removeSprinkle(e)}catch(t){q.warn(`removeSprinkle callback threw`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}this.reportInstances()}}createBridge(e){return{name:e,lick:t=>{let n=typeof t==`string`?t:t.action,r=typeof t==`string`?void 0:t.data;this.sync.sendSprinkleLick(e,{action:n,data:r})},on:(t,n)=>{if(t!==`update`)return;let r=this.updateListeners.get(e);r||(r=new Set,this.updateListeners.set(e,r)),r.add(n)},off:(t,n)=>{t===`update`&&this.updateListeners.get(e)?.delete(n)},readFile:()=>Promise.reject(Error(`readFile not supported in follower-rendered sprinkle`)),writeFile:()=>Promise.reject(Error(`writeFile not supported in follower-rendered sprinkle`)),readDir:()=>Promise.reject(Error(`readDir not supported in follower-rendered sprinkle`)),exists:()=>Promise.resolve(!1),stat:()=>Promise.reject(Error(`stat not supported in follower-rendered sprinkle`)),mkdir:()=>Promise.reject(Error(`mkdir not supported in follower-rendered sprinkle`)),rm:()=>Promise.reject(Error(`rm not supported in follower-rendered sprinkle`)),screenshot:()=>Promise.reject(Error(`screenshot not supported in follower-rendered sprinkle`)),setState:t=>{try{localStorage.setItem(`slicc-sprinkle-state:${e}`,JSON.stringify(t))}catch(t){q.warn(`Sprinkle setState failed`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)})}},getState:()=>{try{let t=localStorage.getItem(`slicc-sprinkle-state:${e}`);return t?JSON.parse(t):null}catch(t){return q.warn(`Sprinkle getState failed`,{sprinkleName:e,error:t instanceof Error?t.message:String(t)}),null}},open:e=>{if(this.openPath){this.openPath(e);return}let t=/^https?:|^chrome-extension:/.test(e)?e:_(e);window.open(t,`_blank`)},close:()=>this.closeLocally(e),minimize:()=>{},stopCone:()=>{this.sync.sendSprinkleLick(e,{action:`__stopCone__`})},attachImage:()=>{},captureScreen:()=>Promise.reject(Error(`captureScreen not supported in follower-rendered sprinkle`)),exec:Object.assign(()=>Promise.resolve({stdout:``,stderr:`exec not supported in follower-rendered sprinkle
3
3
  `,exitCode:127}),{spawn:()=>Promise.resolve({stdout:``,stderr:`exec.spawn not supported in follower-rendered sprinkle
4
4
  `,exitCode:127})}),agent:()=>Promise.resolve({stdout:`agent not supported in follower-rendered sprinkle
5
- `,exitCode:127}),fetch:()=>Promise.reject(Error(`fetch not supported in follower-rendered sprinkle`)),http:{client:()=>{let e=()=>Promise.reject(Error(`http not supported in follower-rendered sprinkle`));return{get:e,post:e,put:e,patch:e,delete:e}}},browser:{findTab:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),ensureTab:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),eval:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),evalAsync:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),cookie:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),localStorage:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),fetch:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`))},hid:{list:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),request:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),open:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),close:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),sendReport:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),on:()=>{},off:()=>{}},serial:{list:()=>Promise.reject(Error(`serial not supported in follower-rendered sprinkle`)),request:()=>Promise.reject(Error(`serial not supported in follower-rendered sprinkle`)),open:()=>Promise.reject(Error(`serial not supported in follower-rendered sprinkle`)),close:()=>Promise.reject(Error(`serial not supported in follower-rendered sprinkle`))},usb:{list:()=>Promise.reject(Error(`usb not supported in follower-rendered sprinkle`)),request:()=>Promise.reject(Error(`usb not supported in follower-rendered sprinkle`)),open:()=>Promise.reject(Error(`usb not supported in follower-rendered sprinkle`)),close:()=>Promise.reject(Error(`usb not supported in follower-rendered sprinkle`))},readFileBinary:()=>Promise.reject(Error(`readFileBinary not supported in follower-rendered sprinkle`)),writeFileBinary:()=>Promise.reject(Error(`writeFileBinary not supported in follower-rendered sprinkle`)),fetchToFile:()=>Promise.reject(Error(`fetchToFile not supported in follower-rendered sprinkle`)),_jsh:()=>Promise.reject(Error(`jsh globals not supported in follower-rendered sprinkle`)),_device:()=>Promise.reject(Error(`device ops not supported in follower-rendered sprinkle`))}}},J=t(`page-follower-tray`);function ke(){f({state:`inactive`,joinUrl:null,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null})}function Ae(e,t){e.browserAPI.setTrayTargetProvider(t),e.setChatAgent(t),e.onForwardingToggle?.(!0),e.onConnectionChange?.(!0),t.requestSnapshot(e.getSelectedScoopJid?.()??void 0)}function je(e,t=!1){if(e!==`slicc-cherry`)return{browser:!0,...t?{oauthPopup:!0}:{}}}function Me(e,t){let n=typeof location<`u`&&location.origin?[location.origin]:void 0,r=e.filter(e=>!s(e.url,{selfOrigins:n}));return t===`slicc-cherry`?r.map(e=>({targetId:e.targetId,title:e.title,url:e.url,kind:`cherry`,capabilities:{navigate:!0,network:!1,screenshot:!0}})):r.map(e=>({targetId:e.targetId,title:e.title,url:e.url,kind:`browser`,capabilities:{navigate:!0,network:!0,screenshot:!0}}))}function Ne(t){e(async()=>{let{importTheme:e,saveCustomTheme:t,setActiveTheme:n,clearActiveTheme:r,applyThemeOverrides:i}=await import(`./theme-engine-By4GU_Wc.js`).then(e=>e.p);return{importTheme:e,saveCustomTheme:t,setActiveTheme:n,clearActiveTheme:r,applyThemeOverrides:i}},__vite__mapDeps([0,1,2])).then(({importTheme:e,saveCustomTheme:n,setActiveTheme:r,clearActiveTheme:i,applyThemeOverrides:a})=>{if(!t)i();else{let i=e(t);n(i),r(i.id)}a()}).catch(e=>J.error(`Failed to apply leader theme`,{err:e}))}function Pe(e){let t=e._refreshIntervalMs??5e3,n=null,r=null,i=null,a=null,o=(t=!0)=>{i&&=(clearInterval(i),null),r&&=(r.dispose(),null),n&&=(e.onForwardingToggle?.(!1),t&&e.onConnectionChange?.(!1),e.browserAPI.setTrayTargetProvider(null),n.close(),null)};return a=De({joinUrl:e.joinUrl,runtime:e.runtime??`slicc-standalone`,fetchImpl:e._fetchImpl,peerConnectionFactory:e._peerConnectionFactory,sleep:e._sleep,onJoinUrlChanged:e.onJoinUrlChanged},{onConnected:a=>{o();let s=K(a.bootstrapId),c=null,l=new _e(a.channel,{browserTransport:e.browserAPI.getTransport(),browserAPI:e.browserAPI,helloCapabilities:je(e.runtime,!!e.onOAuthPopupRequest),onOAuthPopupRequest:e.onOAuthPopupRequest,onSnapshot:e.onSnapshot,onUserMessage:e.onUserMessage,onStatus:e.onStatus,onCherrySliccEvent:e.onCherrySliccEvent,onTargetsUpdated:e.onTargetsUpdated,onScoopsList:e.onScoopsList,onModelsList:e.onModelsList,onModelState:e.onModelState,onThemeApply:Ne,onSudoApprovalRequest:e.onSudoApprovalRequest,selfRuntimeId:s,onTargetsChanged:()=>void d(),onSprinklesList:t=>{e.onSprinklesList?.(t),c?.updateAvailable(t)},onSprinkleUpdate:(e,t)=>c?.handleSprinkleUpdate(e,t),onSprinkleReloaded:e=>void c?.handleSprinkleReloaded(e),onLeaderStalled:t=>e.onLeaderStalled?.(t),onDisconnect:e=>{J.warn(`Follower sync disconnected`,{reason:e}),o()}});e.addSprinkle&&e.removeSprinkle&&(c=new Oe({sync:l,addSprinkle:e.addSprinkle,removeSprinkle:e.removeSprinkle,open:e.onOpen}),r=c);let u=new O(J,{failureMessage:`Follower CDP target listing failed (best-effort, throttled)`,recoveryMessage:`Follower CDP target listing recovered (stable for debounce window)`}),d=async()=>{if(e.advertisesCdpTargets===!1)return;let t;try{t=await e.browserAPI.listPages()}catch(e){u.reportFailure(e);return}if(n===l){u.reportSuccess();try{l.advertiseTargets(Me(t,e.runtime??`slicc-standalone`),s)}catch(e){J.error(`Follower target advertisement broadcast failed (sync.advertiseTargets threw)`,{error:e instanceof Error?e.message:String(e)})}}};n=l,Ae(e,l),e.advertisesCdpTargets!==!1&&(i=setInterval(()=>void d(),t),d()),J.info(`Follower sync wired`,{trayId:a.trayId})},onReconnecting:e=>{J.info(`Follower reconnecting`,{attempt:e})},onGaveUp:t=>{J.warn(`Follower reconnect gave up`,{lastError:t}),o(!1),e.onGaveUp?.(t)},sleep:e._sleep}),{stop(){o(),a?.cancel(),a=null,ke()},get currentSync(){return n}}}function Fe(e){let t=Y(te()),n=X(h()),r=()=>{e.toggleAttribute(`online`,t||n)},i=ee(e=>{t=Y(e),r()}),a=d(e=>{n=X(e),r()});return r(),()=>{i(),a()}}function Y(e){return e.state===`leader`}function X(e){return e.state===`connected`}var Z=t(`follower-oauth`),Ie=`slicc-oauth-relay`,Le=12e4,Re=1500;function ze(e){try{let t=new URL(e).searchParams.get(`state`);if(!t)return null;let n=JSON.parse(atob(t));return typeof n.nonce==`string`&&n.nonce?n.nonce:null}catch{return null}}function Be(e,t,n,r){return new Promise(i=>{let a=[],o=!1,s=t=>{if(!o){o=!0;for(let e of a)e();try{e?.close()}catch{}i(t)}},c=(e,t)=>{if(e?.type===`oauth-callback`&&typeof e.redirectUrl==`string`){if(r&&e.nonce&&e.nonce!==r){Z.debug(`Ignoring an OAuth callback for a different flow`,{via:t});return}Z.info(`Delegated OAuth callback received`,{via:t}),s(e.redirectUrl)}};try{let e=new BroadcastChannel(Ie);e.onmessage=e=>c(e.data,`broadcast`),a.push(()=>e.close())}catch(e){Z.warn(`BroadcastChannel unavailable for OAuth delivery`,{error:String(e)})}let l=e=>{e.origin===t.window.location.origin&&c(e.data,`postMessage`)};if(t.window.addEventListener(`message`,l),a.push(()=>t.window.removeEventListener(`message`,l)),e){let t=setInterval(()=>{if(!e.closed)return;clearInterval(t);let n=setTimeout(()=>s(null),Re);a.push(()=>clearTimeout(n))},500);a.push(()=>clearInterval(t))}let u=setTimeout(()=>{Z.warn(`Delegated OAuth popup timed out`),s(null)},Le);a.push(()=>clearTimeout(u));let d=()=>s(null);n.addEventListener(`abort`,d),a.push(()=>n.removeEventListener(`abort`,d)),n.aborted&&s(null)})}async function Ve(e,t,n){if(t.aborted)return null;let r=n.getPermissionsSurface();if(!r)throw Error(`no permissions surface available to approve the login`);let i=await r.prompt({kinds:[`popup`],description:`Continue to sign in. A new window will open to the provider.`,grantLabel:`Continue`,requestOptions:{popup:{url:e}}});if(i.status!==`granted`)return null;let a=i.grants.find(e=>e.kind===`popup`);return Be(a&&a.kind===`popup`?a.window:null,n,t,ze(e))}var He=new Set([`thinking`,`tool`,`awaiting`]);function Ue(e){let t=e?.state??`idle`;return t===`working`?{state:t,activity:e?.phase===`tool`?`tool`:`thinking`}:t===`idle`&&e?.awaiting?{state:t,activity:`awaiting`}:{state:t}}function Q(e){let t=e.state??`idle`,n=He.has(e.activity??``)?e.activity:void 0;return t===`working`?{state:t,phase:n===`tool`?`tool`:`thinking`}:t===`idle`&&n===`awaiting`?{state:t,awaiting:!0}:{state:t}}function We(e,t){let n=new Map(t.map(e=>[e.key,e]));return e.map(e=>{let t=n.get(e.jid);return{jid:e.jid,name:e.name,folder:e.folder,isCone:e.isCone,parentId:e.parentJid,assistantLabel:e.assistantLabel,trigger:e.trigger,...Ue(t),fill:typeof t?.fill==`number`?t.fill:0}})}function $(e){return e.parentId===void 0?e.isCone:e.parentId===null}function Ge(e){return Ke(e).map(e=>{let t=Q(e);return{key:e.jid,type:$(e)?`cone`:`scoop`,color:ie({isCone:$(e),name:e.name}),label:$(e)?e.assistantLabel:e.name,eyes:t.state===`broken`?`dead`:t.state===`initializing`?`none`:`open`,fill:typeof e.fill==`number`?e.fill:0,...t}})}function Ke(e){if(!e.some(e=>e.parentId!==void 0))return[...e].sort((e,t)=>Number(t.isCone)-Number(e.isCone));let t=new Set,n=[],r=i=>{if(!t.has(i.jid)){t.add(i.jid),n.push(i);for(let t of e)t.parentId===i.jid&&r(t)}};for(let t of e)$(t)&&r(t);for(let r of e)t.has(r.jid)||n.push(r);return n}export{Pe as a,O as c,x as d,oe as f,Fe as i,ge as l,We as n,K as o,Ve as r,Te as s,Ge as t,C as u};
5
+ `,exitCode:127}),fetch:()=>Promise.reject(Error(`fetch not supported in follower-rendered sprinkle`)),http:{client:()=>{let e=()=>Promise.reject(Error(`http not supported in follower-rendered sprinkle`));return{get:e,post:e,put:e,patch:e,delete:e}}},browser:{findTab:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),ensureTab:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),eval:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),evalAsync:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),cookie:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),localStorage:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`)),fetch:()=>Promise.reject(Error(`browser not supported in follower-rendered sprinkle`))},hid:{list:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),request:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),open:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),close:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),sendReport:()=>Promise.reject(Error(`hid not supported in follower-rendered sprinkle`)),on:()=>{},off:()=>{}},serial:{list:()=>Promise.reject(Error(`serial not supported in follower-rendered sprinkle`)),request:()=>Promise.reject(Error(`serial not supported in follower-rendered sprinkle`)),open:()=>Promise.reject(Error(`serial not supported in follower-rendered sprinkle`)),close:()=>Promise.reject(Error(`serial not supported in follower-rendered sprinkle`))},usb:{list:()=>Promise.reject(Error(`usb not supported in follower-rendered sprinkle`)),request:()=>Promise.reject(Error(`usb not supported in follower-rendered sprinkle`)),open:()=>Promise.reject(Error(`usb not supported in follower-rendered sprinkle`)),close:()=>Promise.reject(Error(`usb not supported in follower-rendered sprinkle`))},readFileBinary:()=>Promise.reject(Error(`readFileBinary not supported in follower-rendered sprinkle`)),writeFileBinary:()=>Promise.reject(Error(`writeFileBinary not supported in follower-rendered sprinkle`)),fetchToFile:()=>Promise.reject(Error(`fetchToFile not supported in follower-rendered sprinkle`)),_jsh:()=>Promise.reject(Error(`jsh globals not supported in follower-rendered sprinkle`)),_device:()=>Promise.reject(Error(`device ops not supported in follower-rendered sprinkle`))}}},J=t(`page-follower-tray`);function ke(){f({state:`inactive`,joinUrl:null,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null})}function Ae(e,t){e.browserAPI.setTrayTargetProvider(t),e.setChatAgent(t),e.onForwardingToggle?.(!0),e.onConnectionChange?.(!0),t.requestSnapshot(e.getSelectedScoopJid?.()??void 0)}function je(e,t=!1){if(e!==`slicc-cherry`)return{browser:!0,...t?{oauthPopup:!0}:{}}}function Me(e,t){let n=typeof location<`u`&&location.origin?[location.origin]:void 0,r=e.filter(e=>!s(e.url,{selfOrigins:n}));return t===`slicc-cherry`?r.map(e=>({targetId:e.targetId,title:e.title,url:e.url,kind:`cherry`,capabilities:{navigate:!0,network:!1,screenshot:!0}})):r.map(e=>({targetId:e.targetId,title:e.title,url:e.url,kind:`browser`,capabilities:{navigate:!0,network:!0,screenshot:!0}}))}function Ne(t){e(async()=>{let{importTheme:e,saveCustomTheme:t,setActiveTheme:n,clearActiveTheme:r,applyThemeOverrides:i}=await import(`./theme-engine-By4GU_Wc.js`).then(e=>e.p);return{importTheme:e,saveCustomTheme:t,setActiveTheme:n,clearActiveTheme:r,applyThemeOverrides:i}},__vite__mapDeps([0,1,2])).then(({importTheme:e,saveCustomTheme:n,setActiveTheme:r,clearActiveTheme:i,applyThemeOverrides:a})=>{if(!t)i();else{let i=e(t);n(i),r(i.id)}a()}).catch(e=>J.error(`Failed to apply leader theme`,{err:e}))}function Pe(e){let t=e._refreshIntervalMs??5e3,n=null,r=null,i=null,a=null,o=(t=!0)=>{i&&=(clearInterval(i),null),r&&=(r.dispose(),null),n&&=(e.onForwardingToggle?.(!1),t&&e.onConnectionChange?.(!1),e.browserAPI.setTrayTargetProvider(null),n.close(),null)};return a=De({joinUrl:e.joinUrl,runtime:e.runtime??`slicc-standalone`,fetchImpl:e._fetchImpl,peerConnectionFactory:e._peerConnectionFactory,sleep:e._sleep,onJoinUrlChanged:e.onJoinUrlChanged},{onConnected:a=>{o();let s=K(a.bootstrapId),c=null,l=new _e(a.channel,{browserTransport:e.browserAPI.getTransport(),browserAPI:e.browserAPI,helloCapabilities:je(e.runtime,!!e.onOAuthPopupRequest),onOAuthPopupRequest:e.onOAuthPopupRequest,onSnapshot:e.onSnapshot,onUserMessage:e.onUserMessage,onStatus:e.onStatus,onCherrySliccEvent:e.onCherrySliccEvent,onTargetsUpdated:e.onTargetsUpdated,onScoopsList:e.onScoopsList,onModelsList:e.onModelsList,onModelState:e.onModelState,onThemeApply:Ne,onSudoApprovalRequest:e.onSudoApprovalRequest,selfRuntimeId:s,onTargetsChanged:()=>void d(),onSprinklesList:t=>{e.onSprinklesList?.(t),c?.updateAvailable(t)},onSprinkleUpdate:(e,t)=>c?.handleSprinkleUpdate(e,t),onSprinkleReloaded:e=>void c?.handleSprinkleReloaded(e),onLeaderStalled:t=>e.onLeaderStalled?.(t),onDisconnect:e=>{J.warn(`Follower sync disconnected`,{reason:e}),o()}});e.addSprinkle&&e.removeSprinkle&&(c=new Oe({sync:l,addSprinkle:e.addSprinkle,removeSprinkle:e.removeSprinkle,open:e.onOpen}),r=c);let u=new O(J,{failureMessage:`Follower CDP target listing failed (best-effort, throttled)`,recoveryMessage:`Follower CDP target listing recovered (stable for debounce window)`}),d=async()=>{if(e.advertisesCdpTargets===!1)return;let t;try{t=await e.browserAPI.listPages()}catch(e){u.reportFailure(e);return}if(n===l){u.reportSuccess();try{l.advertiseTargets(Me(t,e.runtime??`slicc-standalone`),s)}catch(e){J.error(`Follower target advertisement broadcast failed (sync.advertiseTargets threw)`,{error:e instanceof Error?e.message:String(e)})}}};n=l,Ae(e,l),e.advertisesCdpTargets!==!1&&(i=setInterval(()=>void d(),t),d()),J.info(`Follower sync wired`,{trayId:a.trayId})},onReconnecting:e=>{J.info(`Follower reconnecting`,{attempt:e})},onGaveUp:t=>{J.warn(`Follower reconnect gave up`,{lastError:t}),o(!1),e.onGaveUp?.(t)},sleep:e._sleep}),{stop(){o(),a?.cancel(),a=null,ke()},get currentSync(){return n}}}function Fe(e){let t=Y(te()),n=X(h()),r=()=>{e.toggleAttribute(`online`,t||n)},i=ee(e=>{t=Y(e),r()}),a=d(e=>{n=X(e),r()});return r(),()=>{i(),a()}}function Y(e){return e.state===`leader`}function X(e){return e.state===`connected`}var Z=t(`follower-oauth`),Ie=`slicc-oauth-relay`,Le=12e4,Re=1500;function ze(e){try{let t=new URL(e).searchParams.get(`state`);if(!t)return null;let n=JSON.parse(atob(t));return typeof n.nonce==`string`&&n.nonce?n.nonce:null}catch{return null}}function Be(e,t,n,r){return new Promise(i=>{let a=[],o=!1,s=t=>{if(!o){o=!0;for(let e of a)e();try{e?.close()}catch{}i(t)}},c=(e,t)=>{if(e?.type===`oauth-callback`&&typeof e.redirectUrl==`string`){if(r&&e.nonce&&e.nonce!==r){Z.debug(`Ignoring an OAuth callback for a different flow`,{via:t});return}Z.info(`Delegated OAuth callback received`,{via:t}),s(e.redirectUrl)}};try{let e=new BroadcastChannel(Ie);e.onmessage=e=>c(e.data,`broadcast`),a.push(()=>e.close())}catch(e){Z.warn(`BroadcastChannel unavailable for OAuth delivery`,{error:String(e)})}let l=e=>{e.origin===t.window.location.origin&&c(e.data,`postMessage`)};if(t.window.addEventListener(`message`,l),a.push(()=>t.window.removeEventListener(`message`,l)),e){let t=setInterval(()=>{if(!e.closed)return;clearInterval(t);let n=setTimeout(()=>s(null),Re);a.push(()=>clearTimeout(n))},500);a.push(()=>clearInterval(t))}let u=setTimeout(()=>{Z.warn(`Delegated OAuth popup timed out`),s(null)},Le);a.push(()=>clearTimeout(u));let d=()=>s(null);n.addEventListener(`abort`,d),a.push(()=>n.removeEventListener(`abort`,d)),n.aborted&&s(null)})}async function Ve(e,t,n){if(t.aborted)return null;let r=n.getPermissionsSurface();if(!r)throw Error(`no permissions surface available to approve the login`);let i=await r.prompt({kinds:[`popup`],description:`Continue to sign in. A new window will open to the provider.`,grantLabel:`Continue`,requestOptions:{popup:{url:e}}});if(i.status!==`granted`)return null;let a=i.grants.find(e=>e.kind===`popup`);return Be(a&&a.kind===`popup`?a.window:null,n,t,ze(e))}var He=new Set([`thinking`,`tool`,`awaiting`]);function Ue(e){let t=e?.state??`idle`;return t===`working`?{state:t,activity:e?.phase===`tool`?`tool`:`thinking`}:t===`idle`&&e?.awaiting?{state:t,activity:`awaiting`}:{state:t}}function Q(e){let t=e.state??`idle`,n=He.has(e.activity??``)?e.activity:void 0;return t===`working`?{state:t,phase:n===`tool`?`tool`:`thinking`}:t===`idle`&&n===`awaiting`?{state:t,awaiting:!0}:{state:t}}function We(e,t){let n=new Map(t.map(e=>[e.key,e]));return e.map(e=>{let t=n.get(e.jid);return{jid:e.jid,name:e.name,folder:e.folder,isCone:e.isCone,parentId:e.parentJid,assistantLabel:e.assistantLabel,trigger:e.trigger,...Ue(t),fill:typeof t?.fill==`number`?t.fill:0}})}function $(e){return e.parentId===void 0?e.isCone:e.parentId===null}function Ge(e,t){return Ke(e,t).map(e=>{let t=Q(e);return{key:e.jid,type:$(e)?`cone`:`scoop`,color:ie({isCone:$(e),name:e.name}),label:$(e)?e.assistantLabel:e.name,eyes:t.state===`broken`?`dead`:t.state===`initializing`?`none`:`open`,fill:typeof e.fill==`number`?e.fill:0,...t}})}function Ke(e,t){if(!e.some(e=>e.parentId!==void 0))return[...e].sort((e,t)=>Number(t.isCone)-Number(e.isCone));let n=new Set,r=(t,i)=>{for(let a of e)a.parentId===t.jid&&!n.has(a.jid)&&(n.add(a.jid),i.push(a),r(a,i));return i},i=e.filter($);for(let e of i)n.add(e.jid);let a=qe(e,t),o=a?r(a,[]):[],s=i.flatMap(e=>r(e,[])),c=e.filter(e=>!n.has(e.jid));return[...i,...o,...s,...c]}function qe(e,t){let n=t?e.find(e=>e.jid===t):void 0;for(let t=0;n&&t<=e.length;t++){if($(n))return n;let t=n.parentId;n=e.find(e=>e.jid===t)}}export{Pe as a,O as c,x as d,oe as f,Fe as i,ge as l,We as n,K as o,Ve as r,Te as s,Ge as t,C as u};
@@ -0,0 +1 @@
1
+ import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-DDBAeTLF.js";import{n,t as r}from"./record-BkEi3dzS.js";var i=e({detectWelcomeFirstRun:()=>_,hasOnboardingFinalLickInHistory:()=>x,hasWelcomeLickInHistory:()=>h,recordWelcomed:()=>v}),a=t(`welcome-detection`),o=`/shared/.welcomed`,s=`browser-coding-agent`,c=1,l=`sessions`,u=n({folder:r}),d=`[Sprinkle Event: welcome]`;function f(){return new Promise((e,t)=>{let n=indexedDB.open(s,c);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(l)||e.createObjectStore(l,{keyPath:`id`})},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error),n.onblocked=()=>{}})}function p(){return f().catch(()=>new Promise((e,t)=>{setTimeout(()=>{f().then(e,t)},120)}))}async function m(){let e=await p();try{return await new Promise((t,n)=>{let r=e.transaction(l,`readonly`).objectStore(l).get(u);r.onsuccess=()=>t(r.result??null),r.onerror=()=>n(r.error)})}finally{e.close()}}async function h(){try{let e=await m();return!e||!Array.isArray(e.messages)?!1:e.messages.some(e=>g(e))}catch(e){return a.warn(`Failed to scan cone chat session for welcome lick`,{error:e instanceof Error?e.message:String(e)}),!1}}function g(e){let t=e.content;return typeof t==`string`?t.includes(d):Array.isArray(t)?t.some(e=>{if(typeof e==`string`)return e.includes(d);if(e&&typeof e==`object`){let t=e.text;if(typeof t==`string`)return t.includes(d)}return!1}):!1}async function _(e){let t=!1;try{t=await e.exists(o)}catch(e){return a.warn(`Failed to read welcomed marker`,{path:o,error:e instanceof Error?e.message:String(e)}),{isFirstRun:!1}}return t||await h()?{isFirstRun:!1}:{isFirstRun:!0}}async function v(e){await e.writeFile(o,`1`)}var y=`"action":"onboarding-complete-with-provider"`;function b(e){let t=e.content;return typeof t==`string`?t.includes(y):Array.isArray(t)?t.some(e=>{if(typeof e==`string`)return e.includes(y);if(e&&typeof e==`object`){let t=e.text;if(typeof t==`string`)return t.includes(y)}return!1}):!1}async function x(){try{let e=await m();return!e||!Array.isArray(e.messages)?!1:e.messages.some(e=>b(e))}catch(e){return a.warn(`Failed to scan cone chat session for final lick`,{error:e instanceof Error?e.message:String(e)}),!1}}export{v as n,i as r,_ as t};
@@ -1 +1 @@
1
- import{H as e,d as t}from"./account-store-B92t9dbf.js";import{a as n}from"./diagnostics-DN_idNHx.js";import{d as r,p as i}from"./bedrock-camp-B0KF_4RS.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-nSD9C16V.js";import"./provider-settings-DVze_FfU.js";import{n as l,r as u,t as d}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as f,XaiOAuthError as p}from"./xai-grok-errors-ByEMMSoz.js";const m=`xai-grok`,h=`https://auth.x.ai`,g=`${h}/oauth2/authorize`,_=`${h}/oauth2/token`,v=`b1a00492-073a-47ea-816f-4c329264a828`,y=`http://127.0.0.1:56121/callback`,b=`https://api.x.ai/v1`,x=`grok-4.5`,S=`${m}-openai`;function C(){return r(`xai`)}function w(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap}}function T(e){let t=C(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${x}"`),n=t.find(e=>e.id===x),!n))throw Error(`xAI default model "${x}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:b}}async function E(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:y,client_id:v,code_verifier:t}),r=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new p(`xAI token exchange failed: ${r.status} ${await r.text()}`,f.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new p(`xAI token exchange did not return access_token.`,f.TOKEN_EXCHANGE_INVALID);return i}async function D(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:v}),n=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function O(){return t().find(e=>e.providerId===m)}async function k(){let t=O();if(!t?.accessToken)throw new p("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",f.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await D(t.refreshToken);if(n?.access_token)return await e({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token}return t.accessToken}function A(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:S,provider:m,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function j(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}const M=(e,t,r={})=>{let i=n();return(async()=>{try{let n=await k(),a=r.sessionId,c=T(e),l={...r,apiKey:n,headers:j(r.headers,a)},u=c.api===`openai-responses`?o(c,t,l):s(c,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(A(e,t)),i.end()}})(),i},N=(e,t,r)=>{let i=n();return(async()=>{try{let n=await k(),o=r?.sessionId,s=T(e),l={...r,apiKey:n,headers:j(r?.headers,o)},u=s.api===`openai-responses`?a(s,t,l):c(s,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(A(e,t)),i.end()}})(),i},P={id:m,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.5.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:x,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>C().map(w),onOAuthLoginIntercepted:async(t,n,r)=>{let i=l(),a=await d(i),o=u(),s=u(),c=new URL(g);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,v),c.searchParams.set(`redirect_uri`,y),c.searchParams.set(`scope`,r?.scopes??`openid profile email offline_access grok-cli:access api:access`),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let h=await t({authorizeUrl:c.toString(),redirectUriPattern:`http://127.0.0.1:56121/*`,onCapture:`close`});if(!h)throw new p(`xAI OAuth login was cancelled or timed out`,f.CALLBACK_TIMEOUT);let _=new URL(h),x=_.searchParams.get(`code`),S=_.searchParams.get(`state`);if(!x)throw new p(`xAI OAuth redirect did not include a code`,f.CODE_MISSING);if(S!==o)throw new p(`xAI OAuth state mismatch — possible CSRF, aborting`,f.STATE_MISMATCH);let C=await E(x,i);await e({providerId:m,accessToken:C.access_token,refreshToken:C.refresh_token,tokenExpiresAt:Date.now()+(C.expires_in??21600)*1e3,baseUrl:b,scopes:C.scope}),n()},onOAuthLogout:async()=>{await e({providerId:m,accessToken:``})},onSilentRenew:async()=>{let t=O();if(!t?.refreshToken)return null;let n=await D(t.refreshToken);return n?.access_token?(await e({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token):null}};function F(){i({api:S,stream:M,streamSimple:N})}export{f as XaiErrorCode,p as XaiOAuthError,P as config,F as register};
1
+ import{H as e,d as t}from"./account-store-BUtPVQY5.js";import{a as n}from"./diagnostics-DN_idNHx.js";import{d as r,p as i}from"./bedrock-camp-B0KF_4RS.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-nSD9C16V.js";import"./provider-settings-BPo_b0d9.js";import{n as l,r as u,t as d}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as f,XaiOAuthError as p}from"./xai-grok-errors-ByEMMSoz.js";const m=`xai-grok`,h=`https://auth.x.ai`,g=`${h}/oauth2/authorize`,_=`${h}/oauth2/token`,v=`b1a00492-073a-47ea-816f-4c329264a828`,y=`http://127.0.0.1:56121/callback`,b=`https://api.x.ai/v1`,x=`grok-4.5`,S=`${m}-openai`;function C(){return r(`xai`)}function w(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap}}function T(e){let t=C(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${x}"`),n=t.find(e=>e.id===x),!n))throw Error(`xAI default model "${x}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:b}}async function E(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:y,client_id:v,code_verifier:t}),r=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new p(`xAI token exchange failed: ${r.status} ${await r.text()}`,f.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new p(`xAI token exchange did not return access_token.`,f.TOKEN_EXCHANGE_INVALID);return i}async function D(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:v}),n=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function O(){return t().find(e=>e.providerId===m)}async function k(){let t=O();if(!t?.accessToken)throw new p("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",f.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await D(t.refreshToken);if(n?.access_token)return await e({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token}return t.accessToken}function A(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:S,provider:m,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function j(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}const M=(e,t,r={})=>{let i=n();return(async()=>{try{let n=await k(),a=r.sessionId,c=T(e),l={...r,apiKey:n,headers:j(r.headers,a)},u=c.api===`openai-responses`?o(c,t,l):s(c,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(A(e,t)),i.end()}})(),i},N=(e,t,r)=>{let i=n();return(async()=>{try{let n=await k(),o=r?.sessionId,s=T(e),l={...r,apiKey:n,headers:j(r?.headers,o)},u=s.api===`openai-responses`?a(s,t,l):c(s,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(A(e,t)),i.end()}})(),i},P={id:m,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.5.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:x,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>C().map(w),onOAuthLoginIntercepted:async(t,n,r)=>{let i=l(),a=await d(i),o=u(),s=u(),c=new URL(g);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,v),c.searchParams.set(`redirect_uri`,y),c.searchParams.set(`scope`,r?.scopes??`openid profile email offline_access grok-cli:access api:access`),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let h=await t({authorizeUrl:c.toString(),redirectUriPattern:`http://127.0.0.1:56121/*`,onCapture:`close`});if(!h)throw new p(`xAI OAuth login was cancelled or timed out`,f.CALLBACK_TIMEOUT);let _=new URL(h),x=_.searchParams.get(`code`),S=_.searchParams.get(`state`);if(!x)throw new p(`xAI OAuth redirect did not include a code`,f.CODE_MISSING);if(S!==o)throw new p(`xAI OAuth state mismatch — possible CSRF, aborting`,f.STATE_MISMATCH);let C=await E(x,i);await e({providerId:m,accessToken:C.access_token,refreshToken:C.refresh_token,tokenExpiresAt:Date.now()+(C.expires_in??21600)*1e3,baseUrl:b,scopes:C.scope}),n()},onOAuthLogout:async()=>{await e({providerId:m,accessToken:``})},onSilentRenew:async()=>{let t=O();if(!t?.refreshToken)return null;let n=await D(t.refreshToken);return n?.access_token?(await e({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token):null}};function F(){i({api:S,stream:M,streamSimple:N})}export{f as XaiErrorCode,p as XaiOAuthError,P as config,F as register};
@@ -1 +1 @@
1
- import{H as e,d as t}from"./account-store-gfOTEDJm.js";import{a as n}from"./diagnostics-DN_idNHx.js";import{d as r,p as i}from"./bedrock-camp-qpZqnqLa.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-CsTVszvY.js";import"./provider-settings-_JNmYpT_.js";import{n as l,r as u,t as d}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as f,XaiOAuthError as p}from"./xai-grok-errors-bnlIBeu-.js";var m=`xai-grok`,h=`https://auth.x.ai`,g=`${h}/oauth2/authorize`,_=`${h}/oauth2/token`,v=`b1a00492-073a-47ea-816f-4c329264a828`,y=`openid profile email offline_access grok-cli:access api:access`,b=`http://127.0.0.1:56121/callback`,x=`http://127.0.0.1:56121/*`,S=`https://api.x.ai/v1`,C=`grok-4.5`,w=`${m}-openai`;function T(){return r(`xai`)}function E(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap}}function D(e){let t=T(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${C}"`),n=t.find(e=>e.id===C),!n))throw Error(`xAI default model "${C}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:S}}async function O(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:b,client_id:v,code_verifier:t}),r=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new p(`xAI token exchange failed: ${r.status} ${await r.text()}`,f.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new p(`xAI token exchange did not return access_token.`,f.TOKEN_EXCHANGE_INVALID);return i}async function k(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:v}),n=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function A(){return t().find(e=>e.providerId===m)}async function j(){let t=A();if(!t?.accessToken)throw new p("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",f.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await k(t.refreshToken);if(n?.access_token)return await e({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token}return t.accessToken}function M(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:w,provider:m,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function N(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}var P=(e,t,r={})=>{let i=n();return(async()=>{try{let n=await j(),a=r.sessionId,c=D(e),l={...r,apiKey:n,headers:N(r.headers,a)},u=c.api===`openai-responses`?o(c,t,l):s(c,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(M(e,t)),i.end()}})(),i},F=(e,t,r)=>{let i=n();return(async()=>{try{let n=await j(),o=r?.sessionId,s=D(e),l={...r,apiKey:n,headers:N(r?.headers,o)},u=s.api===`openai-responses`?a(s,t,l):c(s,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(M(e,t)),i.end()}})(),i},I={id:m,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.5.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:C,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>T().map(E),onOAuthLoginIntercepted:async(t,n,r)=>{let i=l(),a=await d(i),o=u(),s=u(),c=new URL(g);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,v),c.searchParams.set(`redirect_uri`,b),c.searchParams.set(`scope`,r?.scopes??y),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let h=await t({authorizeUrl:c.toString(),redirectUriPattern:x,onCapture:`close`});if(!h)throw new p(`xAI OAuth login was cancelled or timed out`,f.CALLBACK_TIMEOUT);let _=new URL(h),C=_.searchParams.get(`code`),w=_.searchParams.get(`state`);if(!C)throw new p(`xAI OAuth redirect did not include a code`,f.CODE_MISSING);if(w!==o)throw new p(`xAI OAuth state mismatch — possible CSRF, aborting`,f.STATE_MISMATCH);let T=await O(C,i);await e({providerId:m,accessToken:T.access_token,refreshToken:T.refresh_token,tokenExpiresAt:Date.now()+(T.expires_in??21600)*1e3,baseUrl:S,scopes:T.scope}),n()},onOAuthLogout:async()=>{await e({providerId:m,accessToken:``})},onSilentRenew:async()=>{let t=A();if(!t?.refreshToken)return null;let n=await k(t.refreshToken);return n?.access_token?(await e({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token):null}};function L(){i({api:w,stream:P,streamSimple:F})}export{f as XaiErrorCode,p as XaiOAuthError,I as config,L as register};
1
+ import{H as e,d as t}from"./account-store-C0kU6Cjo.js";import{a as n}from"./diagnostics-DN_idNHx.js";import{d as r,p as i}from"./bedrock-camp-qpZqnqLa.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-CsTVszvY.js";import"./provider-settings-DpzH2623.js";import{n as l,r as u,t as d}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as f,XaiOAuthError as p}from"./xai-grok-errors-bnlIBeu-.js";var m=`xai-grok`,h=`https://auth.x.ai`,g=`${h}/oauth2/authorize`,_=`${h}/oauth2/token`,v=`b1a00492-073a-47ea-816f-4c329264a828`,y=`openid profile email offline_access grok-cli:access api:access`,b=`http://127.0.0.1:56121/callback`,x=`http://127.0.0.1:56121/*`,S=`https://api.x.ai/v1`,C=`grok-4.5`,w=`${m}-openai`;function T(){return r(`xai`)}function E(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap}}function D(e){let t=T(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${C}"`),n=t.find(e=>e.id===C),!n))throw Error(`xAI default model "${C}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:S}}async function O(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:b,client_id:v,code_verifier:t}),r=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new p(`xAI token exchange failed: ${r.status} ${await r.text()}`,f.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new p(`xAI token exchange did not return access_token.`,f.TOKEN_EXCHANGE_INVALID);return i}async function k(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:v}),n=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function A(){return t().find(e=>e.providerId===m)}async function j(){let t=A();if(!t?.accessToken)throw new p("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",f.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await k(t.refreshToken);if(n?.access_token)return await e({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token}return t.accessToken}function M(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:w,provider:m,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function N(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}var P=(e,t,r={})=>{let i=n();return(async()=>{try{let n=await j(),a=r.sessionId,c=D(e),l={...r,apiKey:n,headers:N(r.headers,a)},u=c.api===`openai-responses`?o(c,t,l):s(c,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(M(e,t)),i.end()}})(),i},F=(e,t,r)=>{let i=n();return(async()=>{try{let n=await j(),o=r?.sessionId,s=D(e),l={...r,apiKey:n,headers:N(r?.headers,o)},u=s.api===`openai-responses`?a(s,t,l):c(s,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(M(e,t)),i.end()}})(),i},I={id:m,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.5.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:C,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>T().map(E),onOAuthLoginIntercepted:async(t,n,r)=>{let i=l(),a=await d(i),o=u(),s=u(),c=new URL(g);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,v),c.searchParams.set(`redirect_uri`,b),c.searchParams.set(`scope`,r?.scopes??y),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let h=await t({authorizeUrl:c.toString(),redirectUriPattern:x,onCapture:`close`});if(!h)throw new p(`xAI OAuth login was cancelled or timed out`,f.CALLBACK_TIMEOUT);let _=new URL(h),C=_.searchParams.get(`code`),w=_.searchParams.get(`state`);if(!C)throw new p(`xAI OAuth redirect did not include a code`,f.CODE_MISSING);if(w!==o)throw new p(`xAI OAuth state mismatch — possible CSRF, aborting`,f.STATE_MISMATCH);let T=await O(C,i);await e({providerId:m,accessToken:T.access_token,refreshToken:T.refresh_token,tokenExpiresAt:Date.now()+(T.expires_in??21600)*1e3,baseUrl:S,scopes:T.scope}),n()},onOAuthLogout:async()=>{await e({providerId:m,accessToken:``})},onSilentRenew:async()=>{let t=A();if(!t?.refreshToken)return null;let n=await k(t.refreshToken);return n?.access_token?(await e({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??t.scopes}),n.access_token):null}};function L(){i({api:w,stream:P,streamSimple:F})}export{f as XaiErrorCode,p as XaiOAuthError,I as config,L as register};
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>slicc</title>
7
7
  <link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
8
- <script type="module" crossorigin src="/assets/main-CMu5nfXH.js"></script>
8
+ <script type="module" crossorigin src="/assets/main-dBihqbK1.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Dd_uD5pT.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-Czpn1I53.js">
@@ -29,21 +29,21 @@
29
29
  <link rel="modulepreload" crossorigin href="/assets/secrets-bridge-client-cWDAnFqs.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/image-markers-BXtVm4og.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/tool-ui-DfXu6quJ.js">
32
- <link rel="modulepreload" crossorigin href="/assets/providers-Bsz4jBpd.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/providers-BSTYCsa2.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/panel-rpc-B3MSVImO.js">
34
- <link rel="modulepreload" crossorigin href="/assets/account-store-gfOTEDJm.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/account-store-C0kU6Cjo.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/bridge-launch-params-zrpWWxT3.js">
36
36
  <link rel="modulepreload" crossorigin href="/assets/runtime-env-CgsZ7LTp.js">
37
37
  <link rel="modulepreload" crossorigin href="/assets/telemetry-BVzuNdvW.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/feature-flags-ByMXaIc4.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/messages-BD4p8GuF.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/tray-runtime-config-CRGwg9SK.js">
41
- <link rel="modulepreload" crossorigin href="/assets/setup-sudo-CSyUfKTX.js">
42
- <link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-DevMxj0q.js">
41
+ <link rel="modulepreload" crossorigin href="/assets/setup-sudo-BVpKN0oE.js">
42
+ <link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-_NBUAppy.js">
43
43
  <link rel="modulepreload" crossorigin href="/assets/tray-follower-status-BAjnN7Ar.js">
44
44
  <link rel="modulepreload" crossorigin href="/assets/clipboard-eqmn97SP.js">
45
45
  <link rel="modulepreload" crossorigin href="/assets/tray-join-url-BIvzbiFR.js">
46
- <link rel="modulepreload" crossorigin href="/assets/provider-settings-_JNmYpT_.js">
46
+ <link rel="modulepreload" crossorigin href="/assets/provider-settings-DpzH2623.js">
47
47
  </head>
48
48
  <body>
49
49
  <div id="app"></div>
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>slicc</title>
7
7
  <link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
8
- <script type="module" crossorigin src="/assets/main-CMu5nfXH.js"></script>
8
+ <script type="module" crossorigin src="/assets/main-dBihqbK1.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-P2Xu9kJm.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-Dd_uD5pT.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-Czpn1I53.js">
@@ -29,21 +29,21 @@
29
29
  <link rel="modulepreload" crossorigin href="/assets/secrets-bridge-client-cWDAnFqs.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/image-markers-BXtVm4og.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/tool-ui-DfXu6quJ.js">
32
- <link rel="modulepreload" crossorigin href="/assets/providers-Bsz4jBpd.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/providers-BSTYCsa2.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/panel-rpc-B3MSVImO.js">
34
- <link rel="modulepreload" crossorigin href="/assets/account-store-gfOTEDJm.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/account-store-C0kU6Cjo.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/bridge-launch-params-zrpWWxT3.js">
36
36
  <link rel="modulepreload" crossorigin href="/assets/runtime-env-CgsZ7LTp.js">
37
37
  <link rel="modulepreload" crossorigin href="/assets/telemetry-BVzuNdvW.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/feature-flags-ByMXaIc4.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/messages-BD4p8GuF.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/tray-runtime-config-CRGwg9SK.js">
41
- <link rel="modulepreload" crossorigin href="/assets/setup-sudo-CSyUfKTX.js">
42
- <link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-DevMxj0q.js">
41
+ <link rel="modulepreload" crossorigin href="/assets/setup-sudo-BVpKN0oE.js">
42
+ <link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-_NBUAppy.js">
43
43
  <link rel="modulepreload" crossorigin href="/assets/tray-follower-status-BAjnN7Ar.js">
44
44
  <link rel="modulepreload" crossorigin href="/assets/clipboard-eqmn97SP.js">
45
45
  <link rel="modulepreload" crossorigin href="/assets/tray-join-url-BIvzbiFR.js">
46
- <link rel="modulepreload" crossorigin href="/assets/provider-settings-_JNmYpT_.js">
46
+ <link rel="modulepreload" crossorigin href="/assets/provider-settings-DpzH2623.js">
47
47
  </head>
48
48
  <body>
49
49
  <div id="app"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliccy",
3
- "version": "6.79.0",
3
+ "version": "6.80.0",
4
4
  "description": "Browser-based coding agent with thin CLI server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";var t=e({SESSIONS_DIR:()=>SESSIONS_DIR,SESSIONS_INDEX_PATH:()=>n,parseFrozenArchive:()=>i,readSessionsIndex:()=>r});const n=`/sessions/index.json`;async function r(e){try{let t=await e.readFile(n,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(r);return Array.isArray(i)?i:[]}catch{return[]}}function i(e){let t=e,n=`Untitled`,r={},i=t.match(/^---\n([\s\S]*?)\n---\n+/);if(i){t=t.slice(i[0].length);let e=a(i[1],`cost`),o=a(i[1],`models`);e&&(r.cost=e),o&&(r.models=o);let s=i[1].match(/^title:\s*(.+?)\s*$/m);if(s){let e=s[1].trim();if(e.startsWith(`"`))try{let t=JSON.parse(e);typeof t==`string`&&(n=t)}catch{n=e.replace(/^"|"$/g,``)}else n=e}}let s=t.match(/<!-- slicc:session-data\n([\s\S]*?)\n-->\n*/);if(s){try{let e=s[1].replace(/-- >/g,`-->`),t=JSON.parse(e);if(Array.isArray(t))return{title:n,messages:t,...r}}catch{}t=t.replace(/<!-- slicc:session-data\n[\s\S]*?\n-->\n*/,``)}return t=t.replace(/^#\s+[^\n]*\n+/,``),{title:n,messages:o(t),...r}}function a(e,t){let n=RegExp(`^${t}:\\s*(.+?)\\s*$`,`m`).exec(e)?.[1];if(n)try{return JSON.parse(n)}catch{return}}function o(e){let t=[],n=/^## (User|Assistant)\s*\n/gm,r=[],i;for(;(i=n.exec(e))!==null;)r.push({role:i[1]===`User`?`user`:`assistant`,start:i.index,bodyStart:i.index+i[0].length});for(let n=0;n<r.length;n++){let i=n+1<r.length?r[n+1].start:e.length,a=e.slice(r[n].bodyStart,i).trim();t.push({id:`frozen-${n}`,role:r[n].role,content:a,timestamp:0})}return t}export{i as n,r,t};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/quick-llm-CDgogXnj.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/account-store-gfOTEDJm.js","assets/preload-helper-Czpn1I53.js","assets/bedrock-camp-qpZqnqLa.js","assets/diagnostics-DN_idNHx.js","assets/transform-messages-N_eMsP2M.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-gbjkpjE_.js","assets/libesm-BI4UHVqp.js","assets/logger-DDBAeTLF.js","assets/src-CAWTvdAa.js","assets/proxied-fetch-B4g-4VbQ.js","assets/base64-DpPqYZJF.js","assets/runtime-env-Dlaokqg1.js","assets/fetch-body-D2PwksUW.js","assets/float-topology-BgioAcOd.js","assets/runtime-env-E-i2SW1s.js","assets/secret-topology-xLmXoozo.js","assets/secrets-bridge-client-cWDAnFqs.js","assets/port-bridge-client-BbVs1yhx.js","assets/image-markers-BXtVm4og.js","assets/tool-ui-DfXu6quJ.js","assets/providers-Bsz4jBpd.js","assets/panel-rpc-B3MSVImO.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-ZLR7gmJ4.js"])))=>i.map(i=>d[i]);
2
- import{L as e,m as t}from"./account-store-gfOTEDJm.js";import{t as n}from"./preload-helper-Czpn1I53.js";import{t as r}from"./logger-DDBAeTLF.js";import{r as i}from"./feature-flags-ByMXaIc4.js";import"./provider-settings-_JNmYpT_.js";import{t as a}from"./llm-session-id-bZQs6gBN.js";import{t as o}from"./chat-session-store-pWb1-jNp.js";import{a as s,i as c,n as l,r as u,t as d}from"./session-freezer-CCytzcyn.js";var f=r(`new-session`),p=`ui-new-session`,m=2e4,h=250;async function g(n){try{let r=await n.openVfs(),i=t()??void 0;if(!i)return;let o;try{o=e()}catch{return}let c=o.provider===`adobe`?{"X-Session-Id":a(p)}:void 0;await s({vfs:r,model:o,apiKey:i,headers:c}),n.onComplete?.()}catch(e){f.warn(`Pending session catch-up failed (boot continues)`,{error:e instanceof Error?e.message:String(e)})}}function _(e){(e.schedule??v)(()=>{g(e)})}function v(e){if(typeof globalThis.requestIdleCallback==`function`){globalThis.requestIdleCallback(e,{timeout:5e3});return}setTimeout(e,0)}function y(e){if(i(`agentic-memory`)){if(!e.agenticMemorySpawn){f.info(`Agentic memory enabled but agent bridge unavailable — using legacy enrichment`);return}return e.agenticMemorySpawn}}async function b(e,t,n,r,i,a){let o=await u({sessionStore:t,vfs:e.vfs,mode:`quick`,agenticMemorySpawn:a});if(!o)return null;if(e.captureCompleteSnapshot)try{await e.captureCompleteSnapshot(o)}catch(t){let n=t?.code??`unknown`;f.warn(`captureCompleteSnapshot failed`,{code:n}),o.completeSnapshotUnavailable=!0;try{await c(e.vfs,o.filename)}catch{}}return x(e,t,n,r,i,a,o),o}async function x(e,t,r,i,a,o,s){let c=s;try{let t=await l(e.vfs,s,{model:r,apiKey:i,headers:a,skipMemory:!0,pickIcon:e=>n(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-CDgogXnj.js`).then(e=>e.n);return{pickLucideIcon:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27])).then(({pickLucideIcon:t})=>t(e))});t&&(c={...t,archive:s.archive},e.onBackgroundEnriched?.(t))}catch(e){f.warn(`Agentic title enrichment threw (draft stays pending)`,{filename:s.filename,error:e instanceof Error?e.message:String(e)})}let u=await d({sessionStore:t,vfs:e.vfs,mode:`full`,model:r,apiKey:i,headers:a,agenticMemorySpawn:o},c).catch(e=>(f.warn(`Agentic memory curator threw (entry stays pending)`,{filename:c.filename,error:e instanceof Error?e.message:String(e)}),null));f.info(`Agentic memory curator finished`,{filename:c.filename,memoryPending:!u||u.memoryPending===!0}),e.onBackgroundEnriched?.(u)}async function S(e,t,n,r){for(let i of n){let n=`${t}/${i.name}`;r.has(n)||i.type===`directory`&&(await S(e,n,await e.readDir(n),r),[...r].some(e=>e.startsWith(`${n}/`)))||await e.rm(n)}}async function C(e){let t=new Set((await e.listMountPoints()).map(({path:e})=>e).filter(e=>e===`/tmp`||e.startsWith(`/tmp/`)));if(t.has(`/tmp`))return;let n;try{n=await e.readDir(`/tmp`)}catch(t){if(t?.code!==`ENOENT`)throw t;await e.mkdir(`/tmp`,{recursive:!0});return}await S(e,`/tmp`,n,t),await e.mkdir(`/tmp`,{recursive:!0})}async function w(r){let i=r.enrichmentRaceMs??m,s=t()??void 0,d;try{d=e()}catch(e){f.info(`No active model — freezing without LLM enrichment`,{error:e instanceof Error?e.message:String(e)})}let h=d?.provider===`adobe`?{"X-Session-Id":a(p)}:void 0,g=new o;try{await g.init()}catch(e){return f.warn(`SessionStore init failed — cannot freeze`,{error:e instanceof Error?e.message:String(e)}),null}let _=s&&d?y(r):void 0;if(_)return await b(r,g,d,s,h,_);let v=await u({sessionStore:g,vfs:r.vfs,mode:`quick`});if(!v)return null;if(r.captureCompleteSnapshot)try{await r.captureCompleteSnapshot(v)}catch(e){let t=e?.code??`unknown`;f.warn(`captureCompleteSnapshot failed`,{code:t}),v.completeSnapshotUnavailable=!0;try{await c(r.vfs,v.filename)}catch{}}if(!s||!d)return f.info(`Frozen without enrichment (no LLM credentials) — left pending`,{filename:v.filename}),v;let x=d,S=l(r.vfs,v,{model:x,apiKey:s,headers:h,pickIcon:e=>n(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-CDgogXnj.js`).then(e=>e.n);return{pickLucideIcon:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27])).then(({pickLucideIcon:t})=>t(e))}).catch(e=>(f.warn(`Single-click enrichment threw (entry stays pending)`,{filename:v.filename,error:e instanceof Error?e.message:String(e)}),null)),C=await T(S,i,r.onProgress);return C.kind===`llm`?C.updated?{...C.updated,archive:v.archive}:v:(S.then(e=>{f.info(`Background enrichment resolved after race window`,{filename:v.filename,enriched:e?.filename??null}),r.onBackgroundEnriched?.(e)}),v)}async function T(e,t,n){let r=Date.now(),i,a;n?.(0),n&&(i=setInterval(()=>{n(Math.min(1,(Date.now()-r)/t))},h));let o=new Promise(e=>{a=setTimeout(()=>e({kind:`timer`}),t)}),s=e.then(e=>({kind:`llm`,updated:e}));try{return await Promise.race([s,o])}finally{i&&clearInterval(i),a&&clearTimeout(a),n?.(null)}}async function E(e){let t=new o;try{await t.init()}catch(e){return f.warn(`SessionStore init failed — cannot quick-freeze`,{error:e instanceof Error?e.message:String(e)}),null}let n=await u({sessionStore:t,vfs:e.vfs,mode:`quick`});if(n&&e.captureCompleteSnapshot)try{await e.captureCompleteSnapshot(n)}catch(t){let r=t?.code??`unknown`;f.warn(`captureCompleteSnapshot failed (quick-freeze)`,{code:r}),n.completeSnapshotUnavailable=!0;try{await c(e.vfs,n.filename)}catch{}}return n}export{C as resetNewSessionTmp,w as runNewSessionFreeze,E as runNewSessionFreezeQuick,_ as schedulePendingSessionCatchup};
@@ -1 +0,0 @@
1
- import{t as e}from"./store-Cehy36To.js";export{e as readMcpAuthEntries};
@@ -1,159 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/quick-llm-CDgogXnj.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/account-store-gfOTEDJm.js","assets/preload-helper-Czpn1I53.js","assets/bedrock-camp-qpZqnqLa.js","assets/diagnostics-DN_idNHx.js","assets/transform-messages-N_eMsP2M.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-gbjkpjE_.js","assets/libesm-BI4UHVqp.js","assets/logger-DDBAeTLF.js","assets/src-CAWTvdAa.js","assets/proxied-fetch-B4g-4VbQ.js","assets/base64-DpPqYZJF.js","assets/runtime-env-Dlaokqg1.js","assets/fetch-body-D2PwksUW.js","assets/float-topology-BgioAcOd.js","assets/runtime-env-E-i2SW1s.js","assets/secret-topology-xLmXoozo.js","assets/secrets-bridge-client-cWDAnFqs.js","assets/port-bridge-client-BbVs1yhx.js","assets/image-markers-BXtVm4og.js","assets/tool-ui-DfXu6quJ.js","assets/providers-Bsz4jBpd.js","assets/panel-rpc-B3MSVImO.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-ZLR7gmJ4.js"])))=>i.map(i=>d[i]);
2
- import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{Q as t,X as n,Z as r}from"./account-store-gfOTEDJm.js";import{t as i}from"./preload-helper-Czpn1I53.js";import{l as a}from"./bedrock-camp-qpZqnqLa.js";import{t as o}from"./logger-DDBAeTLF.js";import{t as s}from"./attachments-CByeG2Ru.js";import{t as c}from"./types-idfTVsM8.js";import{t as l}from"./icons-ZLR7gmJ4.js";import{a as u}from"./dictation-priming-CNllGgNq.js";import"./agent-message-to-chat-_cvF5A5g.js";var d=`---
3
- writablePaths:
4
- - /workspace/CLAUDE.md
5
- visiblePaths:
6
- - /sessions/
7
- - /shared/
8
- - /workspace/
9
- allowedCommands:
10
- - awk
11
- - cat
12
- - cp
13
- - cut
14
- - echo
15
- - file
16
- - find
17
- - grep
18
- - head
19
- - jq # structured reads of JSON stores such as /shared/loose-ends.json
20
- - ls
21
- - mkdir
22
- - mv
23
- - od # read-only byte inspection of corrupted stores
24
- - printf
25
- - rg # recursive, .gitignore-aware search; what the curator actually uses over find|xargs grep
26
- - sed
27
- - sort
28
- - tail
29
- - tr
30
- - uniq
31
- - upskill
32
- - wc
33
- timeoutSeconds: 1200
34
- thinkingLevel: medium
35
- ---
36
-
37
- # Memory curator
38
-
39
- Curate the durable memory for session {{SESSION_COUNT}}. Today's date is {{TODAY}}.
40
-
41
- **Work fast: a full pass should finish in well under 10 minutes.** The run is hard-stopped at 20 minutes, and a kill mid-write can corrupt the memory file or leave it over budget — so mine the three signals, rewrite the file, compact it in the same pass, and stop, rather than exploring the archive exhaustively.
42
-
43
- Read the entire current memory at {{MEMORY_PATH}} if it exists. Then mine the archived session at {{SESSION_ARCHIVE_PATH}} using the reading recipes below. Rewrite the entire {{MEMORY_PATH}} file with the durable information worth carrying into future sessions. Every part of the file is editable and counts toward the budget.
44
-
45
- ## What to look for
46
-
47
- Three things carry across sessions, and each has its own place in the archive:
48
-
49
- | Look for | Where it lives |
50
- | --------------- | ---------------------------------------------------------------------- |
51
- | **Preferences** | the user's own messages — how they want things done, and what to avoid |
52
- | **Projects** | tool-call arguments — the paths, repos and files actually worked on |
53
- | **Pitfalls** | failed tool calls — what broke, and the error that proves it |
54
-
55
- Pitfalls are the highest-value and most-often-lost category: a failure that cost half an hour is worth one line next time. Keep the error text that identifies it, not the stack trace.
56
-
57
- ## Reading the session archive
58
-
59
- **Never \`cat\` the archive and never \`head\` it.** Archives reach several megabytes, and the machine-readable \`<!-- slicc:session-data ... -->\` block is a _single line_ holding the whole session as JSON — roughly half the file. Reading it costs a fortune and tells you nothing the prose below it does not. Whole \`### Tool\` result bodies are the other half and are equally not worth reading.
60
-
61
- Check the size first, then pull the three signals separately. Together they run about 1% of the archive, so these work on a 2.5 MB file as happily as on a small one.
62
-
63
- \`\`\`bash
64
- wc -c {{SESSION_ARCHIVE_PATH}}
65
-
66
- # Preferences — what the user asked for, in their words.
67
- sed '/^<!-- slicc:session-data$/,/^-->$/d' {{SESSION_ARCHIVE_PATH}} \\
68
- | awk '/^## User/{p=1;next} /^## (Assistant|Summary)/{p=0} /^### Tool/{p=0} p'
69
-
70
- # Projects — the paths touched most, which name the work.
71
- sed '/^<!-- slicc:session-data$/,/^-->$/d' {{SESSION_ARCHIVE_PATH}} \\
72
- | grep -o '/[A-Za-z0-9_][A-Za-z0-9_./-]\\{3,\\}' \\
73
- | sort | uniq -c | sort -rn | head -40
74
-
75
- # Pitfalls — failed calls with the input that caused them.
76
- sed '/^<!-- slicc:session-data$/,/^-->$/d' {{SESSION_ARCHIVE_PATH}} \\
77
- | grep -B6 '^Result:.*\\(rror\\|not found\\|failed\\|denied\\|ENOENT\\|fatal\\)' \\
78
- | cut -c1-200
79
- \`\`\`
80
-
81
- Only if something is still missing, reach into one specific block with \`grep -n\` plus a bounded \`sed -n 'START,ENDp'\`. Never widen these to the whole file.
82
-
83
- ## Suggesting a skill
84
-
85
- A recurring pitfall is often a missing skill. Once you know what broke and what the work was, spend **one** lookup on it — no more, and skip it entirely when the session had no failures:
86
-
87
- \`\`\`bash
88
- upskill search <a few words from the pitfall>
89
- upskill list # what is already installed — never suggest a duplicate
90
- \`\`\`
91
-
92
- \`upskill ai-ecoverse/skills\` and \`upskill adobe/skills\` list a repo's skills without installing anything. **Never install.** You have no write access to the skills tree, so an install attempt will fail or interrupt the user for approval; recommending is your job, deciding is theirs. Put any suggestion in your closing message, with the pitfall it addresses — that message is delivered to the main agent.
93
-
94
- ## Working within the budget
95
-
96
- Measure, decide, then write once. Do not converge on the budget by trial and error — each attempt re-reads your whole context and is billed accordingly.
97
-
98
- 1. \`wc -c {{MEMORY_PATH}}\` to get the current size, and subtract {{BUDGET_CHARS}} to get the exact surplus.
99
- 2. Decide up front which sections absorb that surplus, oldest-dated first, and roughly what each one costs. Budget the whole cut before editing anything.
100
- 3. Write the complete file once, already inside the budget. Never write a version you know to be over budget «to fix in the next step»: the pass can be killed at any moment, and the file you leave behind is the one the next session inherits.
101
- 4. \`wc -c {{MEMORY_PATH}}\` to confirm. If you are still over, cut a whole section rather than shaving a few characters at a time.
102
-
103
- Per-section costs come out of \`awk\`, not an interpreter: \`awk '/^## /{h=$0} {c[h]+=length($0)+1} END{for(k in c) printf "%7d %s\\n", c[k], k}' {{MEMORY_PATH}} | sort -rn\` tells you which sections pay for the surplus.
104
-
105
- To draft before committing, draft in \`/scoops/agent-memory-curator/\`. That is your own scratch folder: writable without a grant and without an approval prompt, private to this pass, and deleted when the pass ends. Reuse one filename such as \`/scoops/agent-memory-curator/draft.md\` rather than numbering drafts — you have no \`rm\`, so every extra draft survives until the folder goes.
106
-
107
- If the pass is running long, drop the oldest-dated section wholesale and write. An under-budget file missing one stale section is a good outcome; an over-budget file is a broken one.
108
-
109
- Rules:
110
-
111
- - Keep durable preferences, stable project facts, validated approaches, named resources, and the pitfalls worth not repeating.
112
- - Organize retained information into concise per-topic sections rather than one flat list. Let the topic lead the heading; preferences, projects and pitfalls are what to look for, not a required table of contents.
113
- - Never write next to the memory file. It is versioned, so backups and scratch copies beside it are noise; drafts belong in \`/scoops/agent-memory-curator/\`. Do not draft in \`/tmp/\` either: it is shared with every other scoop, which can read and overwrite what you leave there.
114
- - Shell tools only. Interpreters such as \`python3\` and \`node -e\` are not on your allow-list, so reaching for one costs an approval round-trip and may fail even when approved — \`awk\`, \`sed\`, \`wc\` and \`sort\` cover every measurement this pass needs.
115
- - End every \`##\` and \`###\` section heading with its last-verified date in \`YYYY-MM-DD\` form, for example \`## Deployment pipeline (2026-08-06)\`. Dates are UTC, matching the session archive timestamps, so a late-evening freeze west of UTC stamps the next day.
116
- - Stamp sections you write or confirm with today's date, {{TODAY}}.
117
- - Prioritize re-verifying the oldest-dated sections. Treat undated headings as maximally stale and date them on this pass.
118
- - Drop ephemera and duplicates. Delete or merge sections that are stale, superseded, or unverifiable.
119
- - Preserve concrete identifiers such as file paths, URLs, IDs, and names verbatim.
120
- - Keep the entire file at or below the hard budget of {{BUDGET_CHARS}} characters, with no exempt region. When over budget, compact or remove the oldest-dated sections first.
121
- - Write the result to {{MEMORY_PATH}}; do not merely return it in your response.
122
-
123
- <!-- How to customize
124
- Add curator instructions here, for example: also update the knowledge base at /path following its WIKI.md. Extend visiblePaths or writablePaths above to grant access to extra stores, and adjust timeoutSeconds when needed.
125
-
126
- writablePaths defaults to the memory file alone rather than /workspace/, because the curator can run upskill and a directory-wide grant would also let it install skills into /workspace/skills. Widen it only as far as a task genuinely needs; a single file is a valid entry, not just a directory.
127
-
128
- Scratch space needs no entry here. The curator spawns under the fixed name memory-curator, so the bridge grants it /scoops/agent-memory-curator/ — private to the run, writable without a prompt, and removed when the pass ends — and that is where the prompt sends drafts. /tmp/ is writable too, but it is shared with every other scoop and visible to the cone, so a full rewrite of durable memory does not belong there.
129
-
130
- thinkingLevel accepts off, minimal, low, medium, high, or xhigh. Curation is cheaper with reasoning than without: an unreasoned pass converges on the budget by trial and error, and because every turn re-reads the whole context, turn count is what the pass costs. Lower it to off only if you also shrink the prompt to a single mechanical instruction.
131
-
132
- MEMORY.md is user-edited only: the curator intentionally has read-only access to /shared/ and cannot rewrite its own instructions. A bare / is rejected in writablePaths.
133
-
134
- Frontmatter supports a strict YAML subset. Arrays may use the block form above (with optional # comment tails) or inline form such as [cat, grep]. \`allowedCommands\` is additive: listed commands extend the built-in base set without replacing it. Inline entries containing commas must be quoted, for example ["/knowledge/lars,rebecca/"].
135
- -->
136
- `,f=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`];function ee(e){return typeof e==`string`&&f.includes(e)}o(`agent-bridge`);var te=`agent: name already in use`,p=o(`cone-memory-budget`),ne=4e3,re=2e3,ie=1.25,m=`/workspace/CLAUDE.md`,ae=`/sessions/index.json`,oe=4096,se=/^## Auto-extracted/m,ce=`Consolidate the auto-extracted memory bullets below into a single tighter set of durable memories.
137
-
138
- Rules:
139
- - Output ONLY a single \`## Auto-extracted (consolidated)\` heading followed by markdown bullets.
140
- - One fact per bullet. Drop duplicates and superseded facts. Keep the most recent / specific phrasing.
141
- - Preserve concrete identifiers (file paths, URLs, IDs, names) verbatim.
142
- - Be terse. Aim well under the original size.
143
- - Do NOT add preamble, commentary, or any heading other than the single consolidated one.`;function h(e){return Math.round(ne+re*Math.log2((Number.isFinite(e)&&e>=0?e:0)+2))}function le(e){let t=se.exec(e);if(!t)return{header:e,autoExtracted:``};let n=t.index;return{header:e.slice(0,n),autoExtracted:e.slice(n)}}async function g(e){try{let t=await e.readFile(ae,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),r=JSON.parse(n);return Array.isArray(r)?r.length:0}catch{return 0}}async function ue(e){let{header:t,autoExtracted:n}=le(e.currentContent);if(!n.trim())return e.currentContent;let r=`You are a memory consolidation assistant. You are given a markdown file's "auto-extracted" section — a list of memory bullets accumulated across sessions of an AI coding assistant. Your job is to rewrite that section as a tighter, deduplicated set of durable memories that fits well within ${e.budget} characters.
144
-
145
- <auto-extracted>
146
- ${n}
147
- </auto-extracted>`,i={role:`user`,content:[{type:`text`,text:ce}],timestamp:Date.now()},o=await a(e.model,{systemPrompt:r,messages:[i]},{apiKey:e.apiKey,maxTokens:oe,headers:e.headers,signal:e.signal});if(o.stopReason===`error`)throw Error(`Restructure call failed: ${o.errorMessage||`Unknown error`}`);let s=o.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
148
- `).trim();if(!s)throw Error(`Restructure call returned empty content`);return`${t}${t.length===0||t.endsWith(`
149
- `)?``:`
150
- `}${s}\n`}async function de(e){if(!e.model||!e.apiKey)return{restructured:!1,reason:`no-llm`};let t=``;try{let n=await e.vfs.readFile(m,{encoding:`utf-8`});t=typeof n==`string`?n:new TextDecoder().decode(n)}catch{return{restructured:!1,reason:`missing-file`}}let n=await g(e.vfs),r=h(n),i=r*ie;if(t.length<=i)return{restructured:!1,reason:`under-threshold`};p.info(`Cone memory over threshold — restructuring`,{size:t.length,budget:r,threshold:i,sessionCount:n});try{let n=await ue({currentContent:t,budget:r,model:e.model,apiKey:e.apiKey,headers:e.headers,signal:e.signal});return await e.vfs.writeFile(m,n),p.info(`Cone memory restructured`,{before:t.length,after:n.length}),{restructured:!0}}catch(e){return p.warn(`Cone memory restructure failed — leaving appended content in place`,{error:e instanceof Error?e.message:String(e)}),{restructured:!1,reason:`error`}}}var _=o(`agentic-memory`),fe=`/shared/MEMORY.md`,pe=1200,me=[m],he=[`/sessions/`,`/shared/`,`/workspace/`],ge=`/workspace`,_e=`awk.cat.cp.cut.date.diff.du.echo.file.find.grep.head.jq.ls.mkdir.mount.mv.nl.od.printf.readlink.sed.sort.stat.tail.touch.tr.uniq.upskill.wc.xxd`.split(`.`),ve=new Set([`writablePaths`,`visiblePaths`,`allowedCommands`]),ye=new Set([`model`,`timeoutSeconds`,`thinkingLevel`]),be=`medium`,v=3e4;async function xe(e){try{if(e.signal?.aborted)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};let t=await Se(e.vfs),n=Ae(t,je(t.promptTemplate,{MEMORY_PATH:m,SESSION_ARCHIVE_PATH:e.sessionArchivePath,SESSION_COUNT:String(e.sessionCount),BUDGET_CHARS:String(h(e.sessionCount)),TODAY:e.today??new Date().toISOString().slice(0,10)}),e.sessionArchivePath);e.signal&&(n.signal=e.signal);let r=await Me(Promise.resolve().then(()=>e.spawn(n)),t.timeoutSeconds*1e3+v,e.signal);if(r.type===`timeout`)return _.warn(`Agentic memory wait timed out past the in-run bound + grace`,{timeoutSeconds:t.timeoutSeconds,graceMs:v}),{ok:!1,reason:`timeout`,legacyFallbackSafe:!1};if(r.type===`aborted`)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};if(r.type===`error`)return{ok:!1,reason:w(r.error),legacyFallbackSafe:!0};if(r.result.exitCode!==0){let e=(r.result.finalText??``).startsWith(te);return{ok:!1,reason:r.result.finalText||`exit-${r.result.exitCode}`,legacyFallbackSafe:!e}}return{ok:!0,report:r.result.finalText}}catch(e){return _.warn(`Agentic memory pass failed`,{error:w(e)}),{ok:!1,reason:w(e),legacyFallbackSafe:!1}}}async function Se(e){try{let t=await e.readFile(fe,{encoding:`utf-8`});return y(typeof t==`string`?t:new TextDecoder().decode(t))}catch(e){return _.warn(`Could not load valid MEMORY.md; using built-in default`,{error:w(e)}),y(d)}}function y(e){let t=e.replace(/^\uFEFF/,``).replace(/\r\n?/g,`
151
- `).match(/^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/);if(!t?.[2].trim())throw Error(`MEMORY.md requires frontmatter and a prompt`);let n=we(t[1]),r=x(n,`writablePaths`,me);if(r.length===0)throw Error(`writablePaths must not be empty`);S(r,`writablePaths`);let i=x(n,`visiblePaths`,he);S(i,`visiblePaths`);let a=ke(n.timeoutSeconds),o=Oe(n.model,`model`);return{writablePaths:r,visiblePaths:i,allowedCommands:[...new Set([..._e,...x(n,`allowedCommands`,[])])],...o?{model:o}:{},thinkingLevel:Ce(n.thinkingLevel),timeoutSeconds:a,promptTemplate:t[2].trim()}}function Ce(e){if(e===void 0)return be;if(typeof e!=`string`||!ee(e))throw Error(`thinkingLevel must be one of ${f.join(`, `)}`);return e}function we(e){let t={},n=e.split(`
152
- `);for(let e=0;e<n.length;e+=1){let r=n[e];if(!r.trim()||r.trimStart().startsWith(`#`))continue;let i=r.match(/^([A-Za-z][A-Za-z0-9]*):\s*(.*)$/);if(!i)throw Error(`Invalid frontmatter line: ${r}`);let[,a,o]=i;if(ve.has(a)){let r=Te(n,e,o);t[a]=r.value,e=r.lastIndex}else if(ye.has(a)&&o.trim())t[a]=b(o);else throw Error(`Unsupported or empty frontmatter field: ${a}`)}return t}function Te(e,t,n){if(n.trim()){let e=n.trim();if(!e.startsWith(`[`)||!e.endsWith(`]`))throw Error(`Expected an array`);let r=e.slice(1,-1).trim();return{value:r?Ee(r):[],lastIndex:t}}let r=[],i=t;for(let n=t+1;n<e.length;n+=1){let t=e[n].match(/^\s+-\s+(.+)$/);if(!t)break;r.push(b(De(t[1]))),i=n}return{value:r,lastIndex:i}}function Ee(e){let t=[],n=0,r;for(let i=0;i<e.length;i+=1){let a=e[i];a===`"`||a===`'`?r=r===a?void 0:r??a:a===`,`&&!r&&(t.push(b(e.slice(n,i))),n=i+1)}if(r)throw Error(`Unclosed quoted value`);return t.push(b(e.slice(n))),t}function De(e){let t;for(let n=0;n<e.length;n+=1){let r=e[n];if(r===`"`||r===`'`)t=t===r?void 0:t??r;else if(r===`#`&&!t&&(n===0||/\s/.test(e[n-1])))return e.slice(0,n).trimEnd()}return e}function b(e){let t=e.trim();if(!t)throw Error(`Empty frontmatter value`);let n=t[0];if((n===`"`||n===`'`)&&t.at(-1)===n)return t.slice(1,-1);if(n===`"`||n===`'`)throw Error(`Unclosed quoted value`);return t}function x(e,t,n){let r=e[t];if(r===void 0)return[...n];if(!Array.isArray(r)||r.some(e=>!e))throw Error(`${t} is invalid`);return[...r]}function Oe(e,t){if(e!==void 0){if(typeof e!=`string`||!e)throw Error(`${t} is invalid`);return e}}function ke(e){if(e===void 0)return 600;if(typeof e!=`string`)throw Error(`timeoutSeconds is invalid`);let t=Number(e);if(!Number.isFinite(t)||t<=0)throw Error(`timeoutSeconds must be positive`);return Math.min(t,pe)}function S(e,t){if(e.some(e=>!e.startsWith(`/`)||e.includes(`\0`)||t===`writablePaths`&&e===`/`))throw Error(`${t} must contain absolute VFS paths`)}function C(e){return`/sessions/.curated/${e.slice(e.lastIndexOf(`/`)+1)}`}function Ae(e,t,n){let r=e.model===`parent`||e.model===`cone`;return{cwd:ge,writablePaths:e.writablePaths,visiblePaths:e.visiblePaths,allowedCommands:e.allowedCommands,prompt:t,thinkingLevel:e.thinkingLevel,persistSession:!0,name:`memory-curator`,notifyOnComplete:!0,successReceiptPath:C(n),maxWallClockMs:e.timeoutSeconds*1e3,...!r&&e.model?{modelId:e.model}:{}}}function je(e,t){let n=e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{{${e}}}`,r);return n}function Me(e,t,n){return new Promise(r=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(s),n?.removeEventListener(`abort`,o),r(e))},o=()=>a({type:`aborted`}),s=setTimeout(()=>a({type:`timeout`}),t);n?.addEventListener(`abort`,o,{once:!0}),e.then(e=>a({type:`result`,result:e}),e=>a({type:`error`,error:e}))})}function w(e){return e instanceof Error?e.message:String(e)}var T=`/sessions`,E=`/sessions/index.json`;async function D(e){try{let t=await e.readFile(E,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),r=JSON.parse(n);return Array.isArray(r)?r:[]}catch{return[]}}function O(e){return`${T}/${e.filename}`}function k(e){let t=e,n=`Untitled`,r={},i=t.match(/^---\n([\s\S]*?)\n---\n+/);if(i){t=t.slice(i[0].length);let e=A(i[1],`cost`),a=A(i[1],`models`);e&&(r.cost=e),a&&(r.models=a);let o=i[1].match(/^title:\s*(.+?)\s*$/m);if(o){let e=o[1].trim();if(e.startsWith(`"`))try{let t=JSON.parse(e);typeof t==`string`&&(n=t)}catch{n=e.replace(/^"|"$/g,``)}else n=e}}let a=t.match(/<!-- slicc:session-data\n([\s\S]*?)\n-->\n*/);if(a){try{let e=a[1].replace(/-- >/g,`-->`),t=JSON.parse(e);if(Array.isArray(t))return{title:n,messages:t,...r}}catch{}t=t.replace(/<!-- slicc:session-data\n[\s\S]*?\n-->\n*/,``)}return t=t.replace(/^#\s+[^\n]*\n+/,``),{title:n,messages:Ne(t),...r}}function A(e,t){let n=RegExp(`^${t}:\\s*(.+?)\\s*$`,`m`).exec(e)?.[1];if(n)try{return JSON.parse(n)}catch{return}}function Ne(e){let t=[],n=/^## (User|Assistant)\s*\n/gm,r=[],i;for(;(i=n.exec(e))!==null;)r.push({role:i[1]===`User`?`user`:`assistant`,start:i.index,bodyStart:i.index+i[0].length});for(let n=0;n<r.length;n++){let i=n+1<r.length?r[n+1].start:e.length,a=e.slice(r[n].bodyStart,i).trim();t.push({id:`frozen-${n}`,role:r[n].role,content:a,timestamp:0})}return t}function j(e){let t=``;for(let n of e){let e=n.role===`user`?`User`:`Assistant`,r=n.role===`user`?u(n.content):n.content;if(t+=`## ${e}\n${r}\n\n`,n.attachments?.length&&(t+=`Attachments:\n${n.attachments.map(e=>`- ${s(e)}`).join(`
153
- `)}\n\n`),n.toolCalls)for(let e of n.toolCalls)t+=`### Tool: ${e.name}\nInput: ${JSON.stringify(e.input,null,2)}\nResult: ${e.result??``}\n\n`}return t}var Pe=e({PENDING_SESSION_ATTEMPT_LIMIT:()=>3,SESSIONS_INDEX_PATH:()=>E,curateFrozenSessionMemories:()=>I,enrichPendingSession:()=>Y,freezeConeSession:()=>F,listPendingEnrichments:()=>K,markSnapshotUnavailable:()=>$,processPendingSessions:()=>q,readSessionsIndex:()=>D}),M=o(`session-freezer`),Fe=4,N=2048,P=40,Ie=`${T}/attachments`;async function F(e){let t=await qe(e.sessionStore);if(!t||t.messages.length<Fe)return M.info(`Skipping freeze: session below threshold or missing`,{messageCount:t?.messages.length??0}),null;let n=V(t.messages),r=e.mode??`full`,i=r===`full`&&!!(e.apiKey&&e.model);e.agenticMemorySpawn||await R(e,n,i);let a=await Re(e,n,i)||Qe(t.messages);return await ze(e,t,a,r,i?await Le(e,a):void 0,!!e.agenticMemorySpawn)}async function I(e,t){let n=V(t.archive.messages),r;try{r=await xe({spawn:e.agenticMemorySpawn,vfs:e.vfs,sessionArchivePath:O(t),sessionCount:await g(e.vfs)})}catch(e){r={ok:!1,reason:e instanceof Error?e.message:String(e),legacyFallbackSafe:!1}}if(r.ok){let n=await ut(e.vfs,t.filename);return await X(e.vfs,t.filename),n?(delete t.memoryPending,M.info(`Agentic memory pass completed`,{filename:t.filename}),n):(M.info(`Agentic memory pass completed; index entry already gone`,{filename:t.filename}),null)}return r.legacyFallbackSafe?(M.warn(`Agentic memory pass failed after finishing — falling back to legacy extraction`,{filename:t.filename,reason:r.reason}),await R(e,n,!0),null):(M.warn(`Agentic memory pass unfinished — entry stays pending for boot catch-up`,{filename:t.filename,reason:r.reason,attemptLimit:3}),null)}async function Le(e,t){try{return L(await(e.pickIcon??(await i(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-CDgogXnj.js`).then(e=>e.n);return{pickLucideIcon:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]))).pickLucideIcon)({subject:`"${t}" — an archived chat session`})??void 0)}catch(e){M.warn(`Icon pick failed (freeze still proceeds)`,{error:e instanceof Error?e.message:String(e)});return}}function L(e){if(e)return l(e)?e:void 0}async function R(e,r,i){if(!i){M.info(`LLM unavailable — skipping memory extraction; freezing anyway`);return}let a=``;try{a=await t({messages:r,instruction:n,model:e.model,apiKey:e.apiKey,maxTokens:N,headers:e.headers})}catch(e){M.warn(`Memory extraction call failed (freeze still proceeds)`,{error:e instanceof Error?e.message:String(e)});return}if(!a.trim()||a.trim()===`NONE`){M.info(`Memory extraction returned no durable memories`);return}try{await G(e.vfs,a.trim(),`new-session`,{model:e.model,apiKey:e.apiKey,headers:e.headers}),M.info(`Memory extracted and appended on new-session`)}catch(e){M.warn(`Memory append failed`,{error:e instanceof Error?e.message:String(e)})}}async function Re(e,n,i){if(!i)return``;try{return H(await t({messages:n,instruction:r,model:e.model,apiKey:e.apiKey,maxTokens:P,headers:e.headers}))}catch(e){return M.warn(`Title generation call failed (using heuristic)`,{error:e instanceof Error?e.message:String(e)}),``}}async function ze(e,t,n,r,i,a=!1){let o=new Date().toISOString(),s=crypto.randomUUID(),c=r===`quick`?`pending-${$e()}.md`:`${o.replace(/[:.]/g,`-`)}-${U(n)}.md`,l=Be(t.messages),u={filename:c,sessionId:s,title:n,frozenAt:o,messageCount:t.messages.length,...l??{},...i?{icon:i}:{},...r===`quick`?{pendingEnrichment:!0}:{},...a?{memoryPending:!0}:{}};try{await W(e.vfs,T);let r=await He(e.vfs,t.messages,c.replace(/\.md$/,``)),i={id:t.id,title:n,frozenAt:o,createdAt:t.createdAt,updatedAt:t.updatedAt,messageCount:t.messages.length,messages:r,...l??{}},a=Ze(i);return await e.vfs.writeFile(`${T}/${c}`,a),await tt(e.vfs,u),await e.vfs.flush(),M.info(`Cone session frozen`,{filename:c,title:n,messageCount:t.messages.length}),{...u,archive:i}}catch(e){return M.warn(`Failed to write frozen session to VFS`,{error:e instanceof Error?e.message:String(e)}),null}}function Be(e){let t={total:0,input:0,output:0,cacheRead:0,cacheWrite:0},n=new Map,r=!1;for(let i of e){if(i.role!==`assistant`)continue;let{model:e,usage:a}=i;if(!e||!a||!Ve(a))return null;let o=a.cost;r=!0,t.total+=o.total,t.input+=o.input,t.output+=o.output,t.cacheRead+=o.cacheRead,t.cacheWrite+=o.cacheWrite;let s=n.get(e)??{model:e,cost:0,turns:0,tokens:0};s.cost+=o.total,s.turns+=1,s.tokens+=a.input+a.output+a.cacheRead+a.cacheWrite,n.set(e,s)}return r?{cost:t,models:[...n.values()].sort((e,t)=>t.cost-e.cost)}:null}function z(e){return typeof e==`number`&&Number.isFinite(e)}function Ve(e){let{cost:t}=e;return[e.input,e.output,e.cacheRead,e.cacheWrite].every(z)&&[t.input,t.output,t.cacheRead,t.cacheWrite,t.total].every(z)}async function He(e,t,n){let r={vfs:e,archiveDir:`${Ie}/${n}`,copiedPaths:new Map,fileIndex:0},i=[];for(let e of t){if(!e.attachments?.some(B)){i.push(e);continue}let t=[];for(let n of e.attachments)t.push(await Ue(r,n));i.push({...e,attachments:t})}return i}async function Ue(e,t){if(!B(t))return t;let n=e.copiedPaths.get(t.path);if(n)return{...t,path:n};let r=await We(e.vfs,t.path);if(!r)return Ke(t);let i=t.name.replace(/[^A-Za-z0-9._-]+/g,`_`)||`attachment`,a=`${e.archiveDir}/${e.fileIndex++}-${i}`;return await W(e.vfs,e.archiveDir),await e.vfs.writeFile(a,r),e.copiedPaths.set(t.path,a),{...t,path:a}}async function We(e,t){try{if(!await Ge(e,t))return null;let n=await e.readFile(t,{encoding:`binary`});if(!(n instanceof Uint8Array))throw Error(`Expected binary attachment content at ${t}`);return n}catch{return null}}function B(e){return typeof e.path==`string`&&e.path.startsWith(`/tmp/`)&&e.data===void 0&&e.text===void 0}async function Ge(e,t){let n=t.split(`/`).slice(1);if(n.length<2||n[0]!==`tmp`||n.some(e=>!e||e===`.`||e===`..`))return!1;let r=`/`;for(let t=0;t<n.length;t+=1){let i=(await e.readDir(r)).find(e=>e.name===n[t]);if(!i)return!1;if(t===n.length-1)return i.type===`file`;if(i.type!==`directory`)return!1;r=r===`/`?`/${n[t]}`:`${r}/${n[t]}`}return!1}function Ke(e){let{path:t,...n}=e;return{...n,error:e.error??`Archived attachment file is missing or unsafe to preserve.`}}async function qe(e){try{return await e.load(`session-cone`)}catch(e){return M.warn(`Failed to load session-cone`,{error:e instanceof Error?e.message:String(e)}),null}}function V(e){return e.map(e=>({role:e.role,content:[{type:`text`,text:e.content}],timestamp:e.timestamp}))}var Je=`<!-- slicc:session-data
154
- `,Ye=`
155
- -->`;function Xe(e){return e.map(e=>{let t={id:e.id,role:e.role,content:e.content,timestamp:e.timestamp};return e.attachments?.length&&(t.attachments=e.attachments),e.toolCalls?.length&&(t.toolCalls=e.toolCalls.map(e=>({id:e.id,name:e.name,input:e.input,...e.result===void 0?{}:{result:e.result},...e.isError?{isError:e.isError}:{}}))),e.source&&(t.source=e.source),e.channel&&(t.channel=e.channel),t})}function Ze(e){let t=(e.cost?`cost: ${JSON.stringify(e.cost)}\n`:``)+(e.models?`models: ${JSON.stringify(e.models)}\n`:``),n=`---\nid: ${e.id}\ntitle: ${JSON.stringify(e.title)}\nfrozenAt: ${e.frozenAt}\ncreatedAt: ${e.createdAt}\nupdatedAt: ${e.updatedAt}\nmessageCount: ${e.messageCount}\n`+t+`---
156
-
157
- `,r=`${Je}${JSON.stringify(Xe(e.messages)).replace(/-->/g,`-- >`)}${Ye}\n\n`,i=`# ${e.title}\n\n`;return n+r+i+j(e.messages)}function H(e){let t=e.trim();return t=t.replace(/^["'`]+|["'`]+$/g,``).trim(),t=t.replace(/\s+/g,` `),t.length>80&&(t=t.slice(0,80).trimEnd()),t}function Qe(e){let t=e.find(e=>e.role===`user`);if(!t?.content)return`untitled-session`;let n=t.content.trim().replace(/\s+/g,` `);return n.length>60?`${n.slice(0,60)}…`:n||`untitled-session`}function U(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).slice(0,48)||`session`}function $e(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`}function et(e){return e.startsWith(`pending-`)}async function W(e,t){try{await e.mkdir(t,{recursive:!0})}catch{}}async function G(e,t,n,r){let i=`/workspace/CLAUDE.md`,a=``;try{let t=await e.readFile(i,{encoding:`utf-8`});a=typeof t==`string`?t:new TextDecoder().decode(t)}catch(t){if(!(t instanceof c)||t.code!==`ENOENT`)throw t;await W(e,`/workspace`)}let o=`## Auto-extracted (${new Date().toISOString().slice(0,10)}, ${n})`,s=`${a.length===0||a.endsWith(`
158
- `)?``:`
159
- `}\n${o}\n\n${t}\n`;await e.writeFile(i,a+s);try{await de({vfs:e,model:r?.model,apiKey:r?.apiKey,headers:r?.headers,signal:r?.signal})}catch(e){M.warn(`Cone memory budget step threw (append already committed)`,{error:e instanceof Error?e.message:String(e)})}}async function tt(e,t){let n=[];try{let t=await e.readFile(E,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(r);Array.isArray(i)&&(n=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e}let r=[t,...n.filter(e=>e.filename!==t.filename)];await e.writeFile(E,JSON.stringify(r,null,2))}async function K(e){return(await D(e)).filter(e=>(e.pendingEnrichment===!0||e.memoryPending===!0)&&J(e)<3)}async function q(e){let t={attempted:0,completed:0};if(!e.model||!e.apiKey)return t;try{let n=await K(e.vfs);for(let r of n)try{let n=await dt(e.vfs,r.filename);if(!n)continue;t.attempted+=1,await Y(e.vfs,n,{model:e.model,apiKey:e.apiKey,headers:e.headers})&&(t.completed+=1)}catch(e){M.warn(`Pending session catch-up attempt failed`,{filename:r.filename,error:e instanceof Error?e.message:String(e)})}}catch(e){M.warn(`Pending session catch-up failed`,{error:e instanceof Error?e.message:String(e)})}return t}function J(e){let t=e.pendingAttemptCount;return typeof t==`number`&&Number.isInteger(t)&&t>0?t:0}async function Y(e,t,n){if(!t.pendingEnrichment&&!t.memoryPending)return null;let r=await it(e,t);if(r===null)return null;let i=Z(t,r);if(i===null)return null;let a=t.memoryPending===!0&&n.skipMemory!==!0&&await nt(e,t),o=a?{...n,skipMemory:!0}:n,s=await at(t,i,o);if(s===null)return null;let c=await rt(o,s.newTitle);await ot(e,t,s.bullets,o);let l=await ct(e,t,r,s.newTitle,c,n.skipMemory===!0);return l&&a&&await X(e,t.filename),l}async function nt(e,t){try{return await e.stat(C(`/sessions/${t.filename}`)),!0}catch{return!1}}async function X(e,t){try{await e.rm(C(`/sessions/${t}`))}catch{}}async function rt(e,t){if(e.pickIcon)try{return await L(await e.pickIcon({subject:`"${t}" — an archived chat session`})??void 0)}catch(e){M.warn(`Enrichment icon pick failed (continuing without icon)`,{error:e instanceof Error?e.message:String(e)});return}}async function it(e,t){try{let n=await e.readFile(O(t),{encoding:`utf-8`});return typeof n==`string`?n:new TextDecoder().decode(n)}catch(e){return e?.code===`ENOENT`?M.info(`Pending archive missing — treating as already enriched`,{filename:t.filename}):M.warn(`Failed to read pending archive (entry stays pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}}function Z(e,t){let n;try{n=k(t).messages}catch(t){return M.warn(`Failed to parse pending archive — leaving entry intact`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}return n.length===0?(M.info(`Pending archive has no messages — skipping enrichment`,{filename:e.filename}),null):V(n)}async function at(e,i,a){let o=``;if(!a.skipMemory)try{o=await t({messages:i,instruction:n,model:a.model,apiKey:a.apiKey,maxTokens:N,headers:a.headers})}catch(t){return M.warn(`Enrichment memory call failed (entry stays pending)`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}let s=``;try{s=H(await t({messages:i,instruction:r,model:a.model,apiKey:a.apiKey,maxTokens:P,headers:a.headers}))}catch(t){return M.warn(`Enrichment title call failed (entry stays pending)`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}return s?{bullets:o,newTitle:s}:(M.info(`Enrichment title call returned empty — entry stays pending`,{filename:e.filename}),null)}async function ot(e,t,n,r){let i=n.trim();if(!(!i||i===`NONE`))try{await G(e,i,`pending-enrichment`,{model:r.model,apiKey:r.apiKey,headers:r.headers})}catch(e){M.warn(`Enrichment memory append failed (continuing with title rewrite)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)})}}function st(e,t,n,r,i){let a=r??e.icon;return{filename:t,title:n,frozenAt:e.frozenAt,messageCount:e.messageCount,...e.cost?{cost:e.cost}:{},...e.models?{models:e.models}:{},...e.sessionId?{sessionId:e.sessionId}:{},...a?{icon:a}:{},...e.completeSnapshotUnavailable?{completeSnapshotUnavailable:!0}:{},...i&&e.memoryPending?{memoryPending:!0}:{}}}async function ct(e,t,n,r,i,a=!1){let o=O(t),s=et(t.filename),c=s?r:t.title,l=s?`${t.frozenAt.replace(/[:.]/g,`-`)}-${U(r)}.md`:t.filename,u=`${T}/${l}`;if(s)try{await W(e,T),await e.writeFile(u,lt(n,c))}catch(e){return M.warn(`Enrichment write failed (entry stays pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}let d=st(t,l,c,i,a);try{await ft(e,t.filename,d)}catch(e){return M.warn(`Enrichment index update failed (entry may stay pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}if(u!==o)try{await e.rm(o)}catch(e){M.info(`Stale pending archive cleanup failed (harmless)`,{oldPath:o,error:e instanceof Error?e.message:String(e)})}try{await e.flush()}catch{}return M.info(`Pending session enriched`,{oldFilename:t.filename,newFilename:l,title:c}),d}function lt(e,t){let n=e.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!n)return e;let r=n[1].replace(/^title:\s*.+$/m,`title: ${JSON.stringify(t)}`),i=n[2];return i=i.replace(/^#\s+[^\n]*$/m,`# ${t}`),`---\n${r}\n---\n${i}`}var Q=Promise.resolve();async function ut(e,t){let n=null,r=async()=>{let r=await D(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let{memoryPending:a,pendingEnrichment:o,pendingAttemptCount:s,...c}=r[i],l=r.slice();l[i]=c,await e.writeFile(E,JSON.stringify(l,null,2)),await e.flush(),n=c},i=Q.then(r,r);Q=i.then(()=>void 0,()=>void 0);try{await i}catch(e){M.warn(`Failed to clear agentic memory pending marker`,{filename:t,error:e instanceof Error?e.message:String(e)})}return n}async function dt(e,t){let n=null,r=async()=>{let r=await D(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let a=r[i];if(!a.pendingEnrichment&&!a.memoryPending)return;let o=J(a);if(o>=3)return;n={...a,pendingAttemptCount:o+1};let s=r.slice();s[i]=n,await e.writeFile(E,JSON.stringify(s,null,2)),await e.flush()},i=Q.then(r,r);return Q=i.then(()=>void 0,()=>void 0),await i,n}async function ft(e,t,n){let r=async()=>{let r=[];try{let t=await e.readFile(E,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(n);Array.isArray(i)&&(r=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e}let i=r.findIndex(e=>e.filename===t),a;i===-1?a=[n,...r.filter(e=>e.filename!==n.filename)]:(a=r.slice(),a[i]=n,a=a.filter((e,t)=>t===i||e.filename!==n.filename)),await e.writeFile(E,JSON.stringify(a,null,2))},i=Q.then(r,r);return Q=i.then(()=>void 0,()=>void 0),i}async function $(e,t){let n=async()=>{let n=[];try{let t=await e.readFile(E,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(r);Array.isArray(i)&&(n=i)}catch(e){if(!(e instanceof c)||e.code!==`ENOENT`)throw e;return}if(!n.find(e=>e.filename===t))return;let r=n.map(e=>e.filename===t?{...e,completeSnapshotUnavailable:!0}:e);await e.writeFile(E,JSON.stringify(r,null,2))},r=Q.then(n,n);return Q=r.then(()=>void 0,()=>void 0),r}export{q as a,E as c,D as d,$ as i,O as l,Y as n,Pe as o,F as r,j as s,I as t,k as u};
@@ -1 +0,0 @@
1
- function e(){return{version:`6.79.0`,releasedAt:`2026-08-22T13:45:53Z`,buildId:`6.79.0-mt4flfh8`}}let t=null;function n(e){t=e}function r(){return t}export{e as n,n as r,r as t};