sliccy 2.56.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui/assets/adobe-D7FAx1Pl.js +2 -0
- package/dist/ui/assets/adobe-DDmxwGXD.js +1 -0
- package/dist/ui/assets/{agent-bridge-DxRah7QA.js → agent-bridge-BK6W3qJh.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-BpcmXkzt.js → agent-message-to-chat-BVeCeF6Q.js} +1 -1
- package/dist/ui/assets/{azure-openai-PWmjqnnu.js → azure-openai-7pTcClzw.js} +1 -1
- package/dist/ui/assets/{azure-openai-C3jQCjj8.js → azure-openai-bWhlMin-.js} +1 -1
- package/dist/ui/assets/{bedrock-camp-DChwr7KC.js → bedrock-camp-Bds6qFqf.js} +1 -1
- package/dist/ui/assets/bedrock-camp-uPFt7YMZ.js +5 -0
- package/dist/ui/assets/{cdp-DWT2l8bP.js → cdp-BuJISenS.js} +1 -1
- package/dist/ui/assets/cost-command-Bt8tDgf-.js +1 -0
- package/dist/ui/assets/{es-DNsspHsb.js → es-DuN0Jsb9.js} +1 -1
- package/dist/ui/assets/{fs-DSB_5PK0.js → fs-DDc-eOO2.js} +1 -1
- package/dist/ui/assets/{fs-C9P3Nfvq.js → fs-DJesPCjN.js} +2 -2
- package/dist/ui/assets/{github-BthdVOch.js → github-Be-voIch.js} +1 -1
- package/dist/ui/assets/github-G9n4Zw-j.js +2 -0
- package/dist/ui/assets/{index-CTzhOMSf.js → index-C4J34n8d.js} +5 -5
- package/dist/ui/assets/{kernel-worker-DQl_BcO3.js → kernel-worker-DkfabjjT.js} +344 -329
- package/dist/ui/assets/{local-llm-CjP7smbg.js → local-llm-BdgJqTmS.js} +1 -1
- package/dist/ui/assets/{local-llm-4QCHSjR3.js → local-llm-Bz5hi9oX.js} +1 -1
- package/dist/ui/assets/{mount-D1VXEtPM.js → mount-CPqnWW5n.js} +2 -2
- package/dist/ui/assets/{mount-D7zeWCcE.js → mount-D2PnDqUD.js} +1 -1
- package/dist/ui/assets/{nuke-command-6iDUjrgH.js → nuke-command-h2Qa6iv1.js} +1 -1
- package/dist/ui/assets/{oauth-bootstrap-CCaF1mhA.js → oauth-bootstrap-R3f3d8xI.js} +1 -1
- package/dist/ui/assets/{offscreen-client-BZIuqCtj.js → offscreen-client-CX6UYAF6.js} +1 -1
- package/dist/ui/assets/{onboarding-orchestrator-wblO8A6r.js → onboarding-orchestrator-Cr3CYPo4.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-C7GqtNpD.js → panel-rpc-handlers-Dgo2AAUu.js} +1 -1
- package/dist/ui/assets/provider-settings-C7vl_UXi.js +28 -0
- package/dist/ui/assets/provider-settings-CRaSBF8A.js +63 -0
- package/dist/ui/assets/{providers-DSe5NWr6.js → providers-wxzKgKGa.js} +1 -1
- package/dist/ui/assets/{spawn-Cg0_PKqL.js → spawn-htSrwEAJ.js} +1 -1
- package/dist/ui/assets/upgrade-detection-DonNu3ys.js +1 -0
- package/dist/ui/assets/{xai-grok-cGh8uXu4.js → xai-grok-CdzXrygZ.js} +1 -1
- package/dist/ui/assets/{xai-grok-CiMn_9LI.js → xai-grok-DA45ToJz.js} +1 -1
- package/dist/ui/index.html +5 -5
- package/dist/ui/packages/webapp/index.html +5 -5
- package/package.json +1 -1
- package/dist/ui/assets/adobe-NRB0tB6W.js +0 -1
- package/dist/ui/assets/adobe-QXZCy565.js +0 -2
- package/dist/ui/assets/bedrock-camp-prTmQ4PG.js +0 -5
- package/dist/ui/assets/cost-command-G_pajegS.js +0 -1
- package/dist/ui/assets/github-CR01A3Pd.js +0 -2
- package/dist/ui/assets/provider-settings-C_bHAv6F.js +0 -63
- package/dist/ui/assets/provider-settings-CyRPUAEx.js +0 -28
- package/dist/ui/assets/upgrade-detection-DSxLFlVR.js +0 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import{r as e}from"./chunk-jRWAZmH_.js";import{t}from"./logger-BHrAkMIS.js";import{n,r}from"./tool-ui-D9h6SJkp.js";import{n as i,t as a}from"./panel-rpc-uLhnFoXD.js";import{i as o,o as s,r as c,s as l,t as u}from"./bedrock-camp-uPFt7YMZ.js";import{d,l as f,u as p}from"./simple-options-CVJdKrCb.js";import{a as m,n as ee,t as te}from"./providers-wxzKgKGa.js";const ne=`slicc.trayWorkerBaseUrl`,re=`https://www.sliccy.ai`;let ie={state:`inactive`,joinUrl:null,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null};function ae(){return{...ie}}const oe=new Set;function se(e){return oe.add(e),()=>{oe.delete(e)}}async function ce(e,t,n,r,i,a){let o=[...e],s={...t,messages:[...t.messages,...e]};await r({type:`agent_start`}),await r({type:`turn_start`});for(let t of e)await r({type:`message_start`,message:t}),await r({type:`message_end`,message:t});return await h(s,o,n,i,r,a),o}async function le(e,t,n,r,i){if(e.messages.length===0)throw Error(`Cannot continue: no messages in context`);if(e.messages[e.messages.length-1].role===`assistant`)throw Error(`Cannot continue from message role: assistant`);let a=[],o={...e};return await n({type:`agent_start`}),await n({type:`turn_start`}),await h(o,a,t,r,n,i),a}async function h(e,t,n,r,i,a){let o=!0,s=await n.getSteeringMessages?.()||[];for(;;){let c=!0;for(;c||s.length>0;){if(o?o=!1:await i({type:`turn_start`}),s.length>0){for(let n of s)await i({type:`message_start`,message:n}),await i({type:`message_end`,message:n}),e.messages.push(n),t.push(n);s=[]}let l=await ue(e,n,r,i,a);if(t.push(l),l.stopReason===`error`||l.stopReason===`aborted`){await i({type:`turn_end`,message:l,toolResults:[]}),await i({type:`agent_end`,messages:t});return}let u=l.content.filter(e=>e.type===`toolCall`),d=[];if(c=!1,u.length>0){let a=await de(e,l,n,r,i);d.push(...a.messages),c=!a.terminate;for(let n of d)e.messages.push(n),t.push(n)}if(await i({type:`turn_end`,message:l,toolResults:d}),await n.shouldStopAfterTurn?.({message:l,toolResults:d,context:e,newMessages:t})){await i({type:`agent_end`,messages:t});return}s=await n.getSteeringMessages?.()||[]}let l=await n.getFollowUpMessages?.()||[];if(l.length>0){s=l;continue}break}await i({type:`agent_end`,messages:t})}async function ue(e,t,n,r,i){let a=e.messages;t.transformContext&&(a=await t.transformContext(a,n));let o=await t.convertToLlm(a),s={systemPrompt:e.systemPrompt,messages:o,tools:e.tools},c=i||l,u=(t.getApiKey?await t.getApiKey(t.model.provider):void 0)||t.apiKey,d=await c(t.model,s,{...t,apiKey:u,signal:n}),f=null,p=!1;for await(let t of d)switch(t.type){case`start`:f=t.partial,e.messages.push(f),p=!0,await r({type:`message_start`,message:{...f}});break;case`text_start`:case`text_delta`:case`text_end`:case`thinking_start`:case`thinking_delta`:case`thinking_end`:case`toolcall_start`:case`toolcall_delta`:case`toolcall_end`:f&&(f=t.partial,e.messages[e.messages.length-1]=f,await r({type:`message_update`,assistantMessageEvent:t,message:{...f}}));break;case`done`:case`error`:{let t=await d.result();return p?e.messages[e.messages.length-1]=t:e.messages.push(t),p||await r({type:`message_start`,message:{...t}}),await r({type:`message_end`,message:t}),t}}let m=await d.result();return p?e.messages[e.messages.length-1]=m:(e.messages.push(m),await r({type:`message_start`,message:{...m}})),await r({type:`message_end`,message:m}),m}async function de(e,t,n,r,i){let a=t.content.filter(e=>e.type===`toolCall`),o=a.some(t=>e.tools?.find(e=>e.name===t.name)?.executionMode===`sequential`);return n.toolExecution===`sequential`||o?fe(e,t,a,n,r,i):pe(e,t,a,n,r,i)}async function fe(e,t,n,r,i,a){let o=[],s=[];for(let c of n){await a({type:`tool_execution_start`,toolCallId:c.id,toolName:c.name,args:c.arguments});let n=await _(e,t,c,r,i),l;l=n.kind===`immediate`?{toolCall:c,result:n.result,isError:n.isError}:await he(e,t,n,await v(n,i,a),r,i),await b(l,a);let u=x(l);await S(u,a),o.push(l),s.push(u)}return{messages:s,terminate:g(o)}}async function pe(e,t,n,r,i,a){let o=[];for(let s of n){await a({type:`tool_execution_start`,toolCallId:s.id,toolName:s.name,args:s.arguments});let n=await _(e,t,s,r,i);if(n.kind===`immediate`){let e={toolCall:s,result:n.result,isError:n.isError};await b(e,a),o.push(e);continue}o.push(async()=>{let o=await he(e,t,n,await v(n,i,a),r,i);return await b(o,a),o})}let s=await Promise.all(o.map(e=>typeof e==`function`?e():Promise.resolve(e))),c=[];for(let e of s){let t=x(e);await S(t,a),c.push(t)}return{messages:c,terminate:g(s)}}function g(e){return e.length>0&&e.every(e=>e.result.terminate===!0)}function me(e,t){if(!e.prepareArguments)return t;let n=e.prepareArguments(t.arguments);return n===t.arguments?t:{...t,arguments:n}}async function _(e,t,n,r,i){let a=e.tools?.find(e=>e.name===n.name);if(!a)return{kind:`immediate`,result:y(`Tool ${n.name} not found`),isError:!0};try{let s=o(a,me(a,n));if(r.beforeToolCall){let a=await r.beforeToolCall({assistantMessage:t,toolCall:n,args:s,context:e},i);if(a?.block)return{kind:`immediate`,result:y(a.reason||`Tool execution was blocked`),isError:!0}}return{kind:`prepared`,toolCall:n,tool:a,args:s}}catch(e){return{kind:`immediate`,result:y(e instanceof Error?e.message:String(e)),isError:!0}}}async function v(e,t,n){let r=[];try{let i=await e.tool.execute(e.toolCall.id,e.args,t,t=>{r.push(Promise.resolve(n({type:`tool_execution_update`,toolCallId:e.toolCall.id,toolName:e.toolCall.name,args:e.toolCall.arguments,partialResult:t})))});return await Promise.all(r),{result:i,isError:!1}}catch(e){return await Promise.all(r),{result:y(e instanceof Error?e.message:String(e)),isError:!0}}}async function he(e,t,n,r,i,a){let o=r.result,s=r.isError;if(i.afterToolCall)try{let r=await i.afterToolCall({assistantMessage:t,toolCall:n.toolCall,args:n.args,result:o,isError:s,context:e},a);r&&(o={content:r.content??o.content,details:r.details??o.details,terminate:r.terminate??o.terminate},s=r.isError??s)}catch(e){o=y(e instanceof Error?e.message:String(e)),s=!0}return{toolCall:n.toolCall,result:o,isError:s}}function y(e){return{content:[{type:`text`,text:e}],details:{}}}async function b(e,t){await t({type:`tool_execution_end`,toolCallId:e.toolCall.id,toolName:e.toolCall.name,result:e.result,isError:e.isError})}function x(e){return{role:`toolResult`,toolCallId:e.toolCall.id,toolName:e.toolCall.name,content:e.result.content,details:e.result.details,isError:e.isError,timestamp:Date.now()}}async function S(e,t){await t({type:`message_start`,message:e}),await t({type:`message_end`,message:e})}function ge(e){return e.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`toolResult`)}const _e={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},ve={id:`unknown`,name:`unknown`,api:`unknown`,provider:`unknown`,baseUrl:``,reasoning:!1,input:[],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:0,maxTokens:0};function ye(e){let t=e?.tools?.slice()??[],n=e?.messages?.slice()??[];return{systemPrompt:e?.systemPrompt??``,model:e?.model??ve,thinkingLevel:e?.thinkingLevel??`off`,get tools(){return t},set tools(e){t=e.slice()},get messages(){return n},set messages(e){n=e.slice()},isStreaming:!1,streamingMessage:void 0,pendingToolCalls:new Set,errorMessage:void 0}}var C=class{mode;messages=[];constructor(e){this.mode=e}enqueue(e){this.messages.push(e)}hasItems(){return this.messages.length>0}drain(){if(this.mode===`all`){let e=this.messages.slice();return this.messages=[],e}let e=this.messages[0];return e?(this.messages=this.messages.slice(1),[e]):[]}clear(){this.messages=[]}},be=class{_state;listeners=new Set;steeringQueue;followUpQueue;convertToLlm;transformContext;streamFn;getApiKey;onPayload;onResponse;beforeToolCall;afterToolCall;activeRun;sessionId;thinkingBudgets;transport;maxRetryDelayMs;toolExecution;constructor(e={}){this._state=ye(e.initialState),this.convertToLlm=e.convertToLlm??ge,this.transformContext=e.transformContext,this.streamFn=e.streamFn??l,this.getApiKey=e.getApiKey,this.onPayload=e.onPayload,this.onResponse=e.onResponse,this.beforeToolCall=e.beforeToolCall,this.afterToolCall=e.afterToolCall,this.steeringQueue=new C(e.steeringMode??`one-at-a-time`),this.followUpQueue=new C(e.followUpMode??`one-at-a-time`),this.sessionId=e.sessionId,this.thinkingBudgets=e.thinkingBudgets,this.transport=e.transport??`auto`,this.maxRetryDelayMs=e.maxRetryDelayMs,this.toolExecution=e.toolExecution??`parallel`}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}get state(){return this._state}set steeringMode(e){this.steeringQueue.mode=e}get steeringMode(){return this.steeringQueue.mode}set followUpMode(e){this.followUpQueue.mode=e}get followUpMode(){return this.followUpQueue.mode}steer(e){this.steeringQueue.enqueue(e)}followUp(e){this.followUpQueue.enqueue(e)}clearSteeringQueue(){this.steeringQueue.clear()}clearFollowUpQueue(){this.followUpQueue.clear()}clearAllQueues(){this.clearSteeringQueue(),this.clearFollowUpQueue()}hasQueuedMessages(){return this.steeringQueue.hasItems()||this.followUpQueue.hasItems()}get signal(){return this.activeRun?.abortController.signal}abort(){this.activeRun?.abortController.abort()}waitForIdle(){return this.activeRun?.promise??Promise.resolve()}reset(){this._state.messages=[],this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this._state.errorMessage=void 0,this.clearFollowUpQueue(),this.clearSteeringQueue()}async prompt(e,t){if(this.activeRun)throw Error(`Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.`);let n=this.normalizePromptInput(e,t);await this.runPromptMessages(n)}async continue(){if(this.activeRun)throw Error(`Agent is already processing. Wait for completion before continuing.`);let e=this._state.messages[this._state.messages.length-1];if(!e)throw Error(`No messages to continue from`);if(e.role===`assistant`){let e=this.steeringQueue.drain();if(e.length>0){await this.runPromptMessages(e,{skipInitialSteeringPoll:!0});return}let t=this.followUpQueue.drain();if(t.length>0){await this.runPromptMessages(t);return}throw Error(`Cannot continue from message role: assistant`)}await this.runContinuation()}normalizePromptInput(e,t){if(Array.isArray(e))return e;if(typeof e!=`string`)return[e];let n=[{type:`text`,text:e}];return t&&t.length>0&&n.push(...t),[{role:`user`,content:n,timestamp:Date.now()}]}async runPromptMessages(e,t={}){await this.runWithLifecycle(async n=>{await ce(e,this.createContextSnapshot(),this.createLoopConfig(t),e=>this.processEvents(e),n,this.streamFn)})}async runContinuation(){await this.runWithLifecycle(async e=>{await le(this.createContextSnapshot(),this.createLoopConfig(),e=>this.processEvents(e),e,this.streamFn)})}createContextSnapshot(){return{systemPrompt:this._state.systemPrompt,messages:this._state.messages.slice(),tools:this._state.tools.slice()}}createLoopConfig(e={}){let t=e.skipInitialSteeringPoll===!0;return{model:this._state.model,reasoning:this._state.thinkingLevel===`off`?void 0:this._state.thinkingLevel,sessionId:this.sessionId,onPayload:this.onPayload,onResponse:this.onResponse,transport:this.transport,thinkingBudgets:this.thinkingBudgets,maxRetryDelayMs:this.maxRetryDelayMs,toolExecution:this.toolExecution,beforeToolCall:this.beforeToolCall,afterToolCall:this.afterToolCall,convertToLlm:this.convertToLlm,transformContext:this.transformContext,getApiKey:this.getApiKey,getSteeringMessages:async()=>t?(t=!1,[]):this.steeringQueue.drain(),getFollowUpMessages:async()=>this.followUpQueue.drain()}}async runWithLifecycle(e){if(this.activeRun)throw Error(`Agent is already processing.`);let t=new AbortController,n=()=>{},r=new Promise(e=>{n=e});this.activeRun={promise:r,resolve:n,abortController:t},this._state.isStreaming=!0,this._state.streamingMessage=void 0,this._state.errorMessage=void 0;try{await e(t.signal)}catch(e){await this.handleRunFailure(e,t.signal.aborted)}finally{this.finishRun()}}async handleRunFailure(e,t){let n={role:`assistant`,content:[{type:`text`,text:``}],api:this._state.model.api,provider:this._state.model.provider,model:this._state.model.id,usage:_e,stopReason:t?`aborted`:`error`,errorMessage:e instanceof Error?e.message:String(e),timestamp:Date.now()};this._state.messages.push(n),this._state.errorMessage=n.errorMessage,await this.processEvents({type:`agent_end`,messages:[n]})}finishRun(){this._state.isStreaming=!1,this._state.streamingMessage=void 0,this._state.pendingToolCalls=new Set,this.activeRun?.resolve(),this.activeRun=void 0}async processEvents(e){switch(e.type){case`message_start`:this._state.streamingMessage=e.message;break;case`message_update`:this._state.streamingMessage=e.message;break;case`message_end`:this._state.streamingMessage=void 0,this._state.messages.push(e.message);break;case`tool_execution_start`:{let t=new Set(this._state.pendingToolCalls);t.add(e.toolCallId),this._state.pendingToolCalls=t;break}case`tool_execution_end`:{let t=new Set(this._state.pendingToolCalls);t.delete(e.toolCallId),this._state.pendingToolCalls=t;break}case`turn_end`:e.message.role===`assistant`&&e.message.errorMessage&&(this._state.errorMessage=e.message.errorMessage);break;case`agent_end`:this._state.streamingMessage=void 0;break}let t=this.activeRun?.abortController.signal;if(!t)throw Error(`Agent listener invoked outside active run`);for(let n of this.listeners)await n(e,t)}};const w=`sessions`;function xe(){return new Promise((e,t)=>{let n=indexedDB.open(`agent-sessions`,1);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(w)||e.createObjectStore(w,{keyPath:`id`})},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}var Se=class{dbPromise=null;getDB(){return this.dbPromise||=xe(),this.dbPromise}async save(e){let t=await this.getDB();return new Promise((n,r)=>{let i=t.transaction(w,`readwrite`).objectStore(w).put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async load(e){let t=await this.getDB();return new Promise((n,r)=>{let i=t.transaction(w,`readonly`).objectStore(w).get(e);i.onsuccess=()=>n(i.result??null),i.onerror=()=>r(i.error)})}async delete(e){let t=await this.getDB();return new Promise((n,r)=>{let i=t.transaction(w,`readwrite`).objectStore(w).delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async list(){let e=await this.getDB();return new Promise((t,n)=>{let r=e.transaction(w,`readonly`).objectStore(w).getAll();r.onsuccess=()=>{t((r.result??[]).map(e=>({id:e.id,updatedAt:e.updatedAt})))},r.onerror=()=>n(r.error)})}async clearAll(){let e=await this.getDB();return new Promise((t,n)=>{let r=e.transaction(w,`readwrite`).objectStore(w).clear();r.onsuccess=()=>t(),r.onerror=()=>n(r.error)})}static newId(){return`session-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}static createSession(e,t){let n=Date.now();return{id:e,messages:[],config:t,createdAt:n,updatedAt:n}}static updateMessages(e,t){return{...e,messages:t,updatedAt:Date.now()}}};const T=t(`image-processor`),E=3932160,Ce=new Set([`image/jpeg`,`image/png`,`image/gif`,`image/webp`]);function we(e){return Ce.has(e)}function Te(e,t){try{if(t===`image/png`){if(e.length<32)return null;let t=atob(e.slice(0,32)),n=t.charCodeAt(16)<<24|t.charCodeAt(17)<<16|t.charCodeAt(18)<<8|t.charCodeAt(19),r=t.charCodeAt(20)<<24|t.charCodeAt(21)<<16|t.charCodeAt(22)<<8|t.charCodeAt(23);return n>0&&r>0?{width:n,height:r}:null}if(t===`image/gif`){if(e.length<16)return null;let t=atob(e.slice(0,16)),n=t.charCodeAt(6)|t.charCodeAt(7)<<8,r=t.charCodeAt(8)|t.charCodeAt(9)<<8;return n>0&&r>0?{width:n,height:r}:null}if(t===`image/jpeg`){let t=Math.min(21846*4,e.length),n=atob(e.slice(0,t));for(let e=0;e<n.length-8;e++)if(n.charCodeAt(e)===255){let t=n.charCodeAt(e+1);if(t===192||t===194){let t=n.charCodeAt(e+5)<<8|n.charCodeAt(e+6),r=n.charCodeAt(e+7)<<8|n.charCodeAt(e+8);return r>0&&t>0?{width:r,height:t}:null}}}}catch{}return null}async function Ee(e){if(!we(e.mimeType))return T.warn(`Unsupported image format`,{mimeType:e.mimeType}),{type:`text`,text:`[Image removed: unsupported format "${e.mimeType}". Supported: JPEG, PNG, GIF, WebP]`};let t=e.data.length,n=Te(e.data,e.mimeType);if(!(t>5242880||n!==null&&(n.width>8e3||n.height>8e3)||n!==null&&Math.max(n.width,n.height)>1568))return e;T.info(`Image needs processing`,{base64Size:t,dimensions:n?`${n.width}x${n.height}`:`unknown`,reason:t>5242880?`size`:`dimensions`});let r,i;try{let e=await import(`./magick-wasm-BMFWa7e1.js`).then(e=>e.n);r=e.getMagick,i=e.MIME_TO_MAGICK_FORMAT}catch(e){return T.error(`ImageMagick WASM module unavailable`,{error:e instanceof Error?e.message:String(e)}),{type:`text`,text:`[Image removed: resize service unavailable (ImageMagick WASM could not be loaded)]`}}let a;try{a=await r()}catch(e){return T.error(`ImageMagick WASM initialization failed`,{error:e instanceof Error?e.message:String(e)}),{type:`text`,text:`[Image removed: resize service unavailable (WASM init failed)]`}}try{let n=atob(e.data),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);let o={data:null,mime:e.mimeType};if(await a.ImageMagick.read(r,async t=>{let n=t.width,r=t.height,a=Math.max(n,r);if(a>1568){let e=1568/a,i=Math.round(n*e),o=Math.round(r*e);t.resize(i,o),T.info(`Resized image`,{from:`${n}x${r}`,to:`${i}x${o}`})}let s=i[e.mimeType]||`JPEG`;t.write(s,e=>{o.data=new Uint8Array(e)}),o.data&&o.data.length>E&&s!==`JPEG`?(T.info(`Still over 5MB, compressing to JPEG q80`),t.quality=80,t.write(`JPEG`,e=>{o.data=new Uint8Array(e)}),o.mime=`image/jpeg`):o.data&&o.data.length>E&&(T.info(`Still over 5MB as JPEG, reducing quality to 60`),t.quality=60,t.write(`JPEG`,e=>{o.data=new Uint8Array(e)}))}),!o.data)return T.warn(`ImageMagick produced no output`),{type:`text`,text:`[Image removed: could not be processed (empty output from resize)]`};if(o.data.length>E)return T.warn(`Image still over 5MB after resize+compress`,{size:o.data.length}),{type:`text`,text:`[Image removed: still ${Math.round(o.data.length/1024/1024*10)/10}MB after resize and compression, exceeds 5MB API limit]`};let s=``;for(let e=0;e<o.data.length;e++)s+=String.fromCharCode(o.data[e]);let c=btoa(s);return T.info(`Image processed successfully`,{originalBase64:t,newBase64:c.length,mimeType:o.mime}),{type:`image`,data:c,mimeType:o.mime}}catch(n){return T.error(`Image data processing failed (corrupt or unreadable)`,{mimeType:e.mimeType,estimatedBytes:t,error:n instanceof Error?n.message:String(n)}),{type:`text`,text:`[Image removed: image data could not be processed (${n instanceof Error?n.message:`corrupt or unreadable`})]`}}}const De=t(`tool-adapter`),Oe=/<img:(data:(image\/[^;]+);base64,([^>]+))>/g;function D(e){let t=[],n=0;for(let r of e.matchAll(Oe)){let i=e.slice(n,r.index);i.trim()&&t.push({type:`text`,text:i.trimEnd()}),t.push({type:`image`,mimeType:r[2],data:r[3]}),n=r.index+r[0].length}let r=e.slice(n);return(r.trim()||t.length===0)&&t.push({type:`text`,text:r||e}),t}async function ke(e){let t=D(e),n=[];for(let e of t)e.type===`image`?n.push(await Ee(e)):n.push(e);return n}function Ae(e,t){return{name:e.name,label:e.name,description:e.description,parameters:e.inputSchema,async execute(i,a,o,s){let c;s&&(c=r({onUpdate:s,toolName:e.name,toolCallId:i}));let l=t?t.processManager.spawn({kind:`tool`,argv:[e.name,...Me(a)],owner:t.owner,ppid:t.getParentPid?.()}):null,u=null;l&&t&&o&&(o.aborted?t.processManager.signal(l.pid,`SIGINT`):o.addEventListener(`abort`,()=>t.processManager.signal(l.pid,`SIGINT`),{once:!0})),l&&t&&(u=t.processManager.onSignal((e,n)=>{e.pid!==l.pid||n!==`SIGKILL`||t.processManager.exit(l.pid,null)}));let d=l?l.abort.signal:o;try{let n=await e.execute(a??{},d),r;try{r=await ke(n.content)}catch(t){De.warn(`Image processing failed, falling back to raw content`,{tool:e.name,error:t instanceof Error?t.message:String(t)}),r=D(n.content)}return l&&t&&t.processManager.exit(l.pid,+!!n.isError),{content:r,details:{isError:n.isError}}}catch(e){throw l&&t&&t.processManager.exit(l.pid,l.abort.signal.aborted?null:1),e}finally{c&&n(c),u?.()}}}}function je(e,t){return e.map(e=>Ae(e,t))}function Me(e){if(typeof e!=`object`||!e)return[];let t=e;for(let e of[`command`,`file_path`,`path`,`pattern`,`url`,`key`,`name`,`query`,`message`]){let n=t[e];if(typeof n==`string`&&n.length>0)return[n]}for(let e of Object.values(t))if(typeof e==`string`&&e.length>0)return[e];return[]}const Ne={enabled:!0,reserveTokens:16384,keepRecentTokens:2e4};function Pe(e,t,n){return n.enabled?e>t-n.reserveTokens:!1}function Fe(e){let t=0;switch(e.role){case`user`:{let n=e.content;if(typeof n==`string`)t=n.length;else if(Array.isArray(n))for(let e of n)e.type===`text`&&e.text&&(t+=e.text.length);return Math.ceil(t/4)}case`assistant`:{let n=e;for(let e of n.content)e.type===`text`?t+=e.text.length:e.type===`thinking`?t+=e.thinking.length:e.type===`toolCall`&&(t+=e.name.length+JSON.stringify(e.arguments).length);return Math.ceil(t/4)}case`custom`:case`toolResult`:if(typeof e.content==`string`)t=e.content.length;else for(let n of e.content)n.type===`text`&&n.text&&(t+=n.text.length),n.type===`image`&&(t+=4800);return Math.ceil(t/4);case`bashExecution`:return t=e.command.length+e.output.length,Math.ceil(t/4);case`branchSummary`:case`compactionSummary`:return t=e.summary.length,Math.ceil(t/4)}return 0}const O=t(`context-compaction`);function Ie(e,t){return e.role===t}function Le(e){let t=0;for(;t<e.length&&Ie(e[t],`toolResult`);){let n=e[t];O.warn(`Dropping orphaned toolResult (no preceding assistant message)`,{toolCallId:n.toolCallId}),t++}return t>0?e.slice(t):e}function Re(e){let t=[];for(let n of e){let e=n;switch(e.role){case`user`:t.push(`<user>\n${k(e.content)}\n</user>`);break;case`assistant`:t.push(`<assistant>\n${k(e.content)}\n</assistant>`);break;case`toolResult`:{let n=e.toolName??`tool`;t.push(`<tool-result name="${n}">\n${k(e.content)}\n</tool-result>`);break}case`bashExecution`:t.push(`<bash>\n$ ${e.command??``}\n${e.output??``}\n</bash>`);break;case`branchSummary`:case`compactionSummary`:t.push(`<prior-summary>\n${e.summary??``}\n</prior-summary>`);break;default:t.push(`<${e.role}>\n${k(e.content)}\n</${e.role}>`)}}return t.join(`
|
|
2
|
+
|
|
3
|
+
`)}function k(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){let e=n;e.type===`text`&&e.text?t.push(e.text):e.type===`thinking`&&e.thinking?t.push(`[thinking] ${e.thinking}`):e.type===`toolCall`?t.push(`[tool-call ${e.name??`?`}] ${JSON.stringify(e.arguments??{})}`):e.type===`image`&&t.push(`[image]`)}return t.join(`
|
|
4
|
+
`)}function ze(e){return`You are a context compaction assistant. You are shown the prefix of a conversation between a user and an AI coding assistant, and asked to produce either a structured summary, durable memory bullets, or a short title — depending on the user's instruction.
|
|
5
|
+
|
|
6
|
+
Do NOT continue the conversation. Do NOT answer questions inside the conversation. Output ONLY what the user asks for in the format specified.
|
|
7
|
+
|
|
8
|
+
<conversation>
|
|
9
|
+
${e}
|
|
10
|
+
</conversation>`}async function A(e,t,n,r,i,a,o){let c=await s(e,{systemPrompt:n,messages:[{role:`user`,content:[{type:`text`,text:r}],timestamp:Date.now()}]},{maxTokens:i,apiKey:t,headers:a,signal:o});if(c.stopReason===`error`)throw Error(`Compaction call failed: ${c.errorMessage||`Unknown error`}`);return c.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
11
|
+
`).trim()}function Be(e){let t=e.contextWindow??2e5,n=e.reserveTokens??Ne.reserveTokens,r=e.keepRecentTokens??Ne.keepRecentTokens,i={enabled:!0,reserveTokens:n,keepRecentTokens:r};return async(a,o)=>{if(a.length===0)return a;let s=0;for(let e of a)s+=Fe(e);if(!Pe(s,t,i))return a;O.info(`Context compaction triggered`,{totalTokens:s,contextWindow:t,threshold:t-n,messageCount:a.length});let c=0,l=a.length;for(let e=a.length-1;e>=0;e--){let t=Fe(a[e]);if(c+t>r&&l<a.length)break;c+=t,l=e}for(;l>0&&Ie(a[l],`toolResult`);)l--;if(l<=0||l>=a.length)return O.warn(`Cannot find valid cut point for compaction`),a;let u=a.slice(0,l),d=Le(a.slice(l));O.info(`Compaction cut point`,{summarizing:u.length,keeping:d.length});let f=t=>{try{e.onCompactionStateChange?.(t)}catch(e){O.warn(`onCompactionStateChange listener threw`,{error:e instanceof Error?e.message:String(e)})}},p=e.getApiKey();if(p)try{let t=ze(Re(u)),r=Math.floor(.8*n);f(`summarizing`);let i=await A(e.model,p,t,`Produce a structured context checkpoint summary of the conversation above that another LLM can use to continue the work.
|
|
12
|
+
|
|
13
|
+
Use this EXACT format:
|
|
14
|
+
|
|
15
|
+
## Goal
|
|
16
|
+
[What is the user trying to accomplish? Can be multiple items if the session covers different tasks.]
|
|
17
|
+
|
|
18
|
+
## Constraints & Preferences
|
|
19
|
+
- [Any constraints, preferences, or requirements mentioned by user]
|
|
20
|
+
- [Or "(none)" if none were mentioned]
|
|
21
|
+
|
|
22
|
+
## Progress
|
|
23
|
+
### Done
|
|
24
|
+
- [x] [Completed tasks/changes]
|
|
25
|
+
|
|
26
|
+
### In Progress
|
|
27
|
+
- [ ] [Current work]
|
|
28
|
+
|
|
29
|
+
### Blocked
|
|
30
|
+
- [Issues preventing progress, if any]
|
|
31
|
+
|
|
32
|
+
## Key Decisions
|
|
33
|
+
- **[Decision]**: [Brief rationale]
|
|
34
|
+
|
|
35
|
+
## Next Steps
|
|
36
|
+
1. [Ordered list of what should happen next]
|
|
37
|
+
|
|
38
|
+
## Critical Context
|
|
39
|
+
- [Any data, examples, or references needed to continue]
|
|
40
|
+
- [Or "(none)" if not applicable]
|
|
41
|
+
|
|
42
|
+
Keep each section concise. Preserve exact file paths, function names, and error messages. Output ONLY the summary, with no preamble or follow-up.`,r,e.headers,o),s={role:`user`,content:[{type:`text`,text:`<context-summary>\n${i}\n</context-summary>`}],timestamp:Date.now()};if(O.info(`LLM summarization successful`,{originalMessages:a.length,compactedMessages:1+d.length,summaryLength:i.length}),e.onMemoryUpdates)try{f(`extracting-memory`);let n=await A(e.model,p,t,`From the conversation above, extract durable memories worth persisting to a global memory file shared across future sessions.
|
|
43
|
+
|
|
44
|
+
Focus on:
|
|
45
|
+
- User preferences, working style, opinions stated explicitly.
|
|
46
|
+
- Stable project facts (architecture decisions, conventions, constraints).
|
|
47
|
+
- Validated approaches the user accepted ("yes, exactly", "perfect"), not just corrections.
|
|
48
|
+
- External resources/links the user named.
|
|
49
|
+
|
|
50
|
+
DO NOT include:
|
|
51
|
+
- Ephemeral state (current task, in-progress work).
|
|
52
|
+
- Information already obvious from the codebase (file paths, function names, framework conventions).
|
|
53
|
+
- Generic restatements of what the conversation was about.
|
|
54
|
+
|
|
55
|
+
If nothing in the conversation is worth persisting, return exactly the single line:
|
|
56
|
+
NONE
|
|
57
|
+
|
|
58
|
+
Otherwise, output ONLY a markdown bullet list (one bullet per memory), no headers, no preamble, no follow-up. Each bullet is one line. Be specific. Prefer one fact per bullet over multi-clause sentences.`,2048,e.headers,o);if(n&&n.trim()&&n.trim()!==`NONE`)try{await e.onMemoryUpdates(n.trim()),O.info(`Memory extraction applied`,{bulletsLength:n.length})}catch(e){O.warn(`onMemoryUpdates callback threw`,{error:e instanceof Error?e.message:String(e)})}else O.info(`Memory extraction returned no durable memories`)}catch(e){O.warn(`Memory extraction call failed (compaction still applied)`,{error:e instanceof Error?e.message:String(e)})}return f(`idle`),[s,...d]}catch(e){O.warn(`LLM summarization failed, falling back to naive drop`,{error:e instanceof Error?e.message:String(e)})}else O.warn(`No API key available for LLM summarization, falling back to naive drop`);f(`idle`);let m={role:`user`,content:[{type:`text`,text:`[Earlier conversation messages were compacted to save context space]`}],timestamp:Date.now()};return O.info(`Naive compaction applied`,{originalMessages:a.length,compactedMessages:1+d.length}),[m,...d]}}function Ve(e){if(!Number.isFinite(e)||e<=0)return`0 B`;let t=[`B`,`KB`,`MB`,`GB`],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${n>=10||r===0?Math.round(n):Math.round(n*10)/10} ${t[r]}`}function He(e){let t=e.mimeType||`application/octet-stream`;return`${e.name} (${t}, ${Ve(e.size)})`}function Ue(e){let t=He(e);return e.kind===`image`&&e.data?`[Attached image: ${t}]`:e.kind===`text`&&e.text!==void 0?[`----- BEGIN ATTACHMENT ${t} -----`,e.text,`----- END ATTACHMENT ${e.name} -----`].join(`
|
|
59
|
+
`):e.path?`[Attached ${e.kind===`image`?`image`:e.kind===`text`?`text file`:`file`} saved to ${e.path} — ${t}. Read it from the virtual filesystem when you need its contents.]`:e.error?`[Attachment not included: ${t}. ${e.error}]`:`[Attachment not included: ${t}. Unsupported binary attachment.]`}function We(e,t){if(!t?.length)return e;let n=t.map(Ue),r=e.trim();return r?`${r}\n\n${n.join(`
|
|
60
|
+
|
|
61
|
+
`)}`:n.join(`
|
|
62
|
+
|
|
63
|
+
`)}function Ge(e){return e?.length?e.filter(e=>e.kind===`image`&&e.data).map(e=>({type:`image`,data:e.data,mimeType:e.mimeType})):[]}function Ke(e){}[`ghp_`,`gho_`,`ghu_`,`ghs_`,`ghr_`,`github_pat_`,`sk-`,`pk-`,`xoxb-`,`xoxp-`,`xoxa-`,`xoxs-`,`AKIA`,`ABIA`,`ACCA`,`ASIA`,`sk-ant-`,`Bearer `].sort((e,t)=>t.length-e.length);function qe(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(n===`*`)return!0;if(!n.startsWith(`*.`))return n===r;let i=n.slice(1);return r.length>i.length&&r.endsWith(i)}function Je(e,t){return e.some(e=>qe(e,t))}const j=`slicc_oauth_extra_domains`;function M(e){try{let t=e.getItem(j);if(!t)return{};let n=JSON.parse(t);if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){if(typeof e!=`string`||!Array.isArray(t))continue;let n=t.filter(e=>typeof e==`string`&&e.length>0);n.length>0&&(r[e]=n)}return r}catch{return{}}}function N(e,t){try{e.setItem(j,JSON.stringify(t))}catch(e){throw Error(`Failed to persist OAuth extras (localStorage quota exceeded?): ${e instanceof Error?e.message:String(e)}`)}}var Ye=e({addAccount:()=>rt,getAccounts:()=>K,getAllAvailableModels:()=>G,getAllExtraOAuthDomains:()=>nt,getApiKey:()=>Q,getApiKeyForProvider:()=>ot,getApiVersionForProvider:()=>ct,getAvailableProviders:()=>Qe,getBaseUrlForProvider:()=>X,getDeploymentForProvider:()=>st,getExtraOAuthDomains:()=>q,getOAuthAccountInfo:()=>H,getProviderConfig:()=>z,getProviderModels:()=>V,getRawApiKeyForProvider:()=>at,getSelectedModelId:()=>lt,getSelectedProvider:()=>Z,isModelHiddenFromPicker:()=>W,resolveCurrentModel:()=>$,resolveModelById:()=>dt,saveOAuthAccount:()=>it,setExtraOAuthDomains:()=>J,setExtraOAuthDomainsAsync:()=>tt});const P=f,F=p,I=`slicc_accounts`,L=`selected-model`,Xe=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`];let R=!1;function Ze(){if(!R){R=!0;for(let e of Xe)try{localStorage.removeItem(e)}catch{}}}function Qe(){let e=d().filter(m),t=ee();return[...new Set([...e,...t])]}function z(e){return te(e)||{id:e,name:e.split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `),description:`${e} provider`,requiresApiKey:!0,requiresBaseUrl:!1}}function B(e,t){t.context_window!==void 0&&(e.contextWindow=t.context_window),t.max_tokens!==void 0&&(e.maxTokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),t.compat!==void 0&&(e.compat={...e.compat??{},...t.compat})}function V(e){try{if(e===`bedrock-camp`){let e=u(X(`bedrock-camp`));return F(`amazon-bedrock`).filter(t=>c(t,e)).map(e=>({...e,api:`bedrock-camp-converse`,provider:`bedrock-camp`}))}let t=z(e);if(t.getModelIds){let n;try{n=t.getModelIds()}catch(t){return U.error(`Provider getModelIds callback failed`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}let r=new Map;for(let e of d())try{for(let t of F(e))r.set(t.id,t)}catch{}return n.map(n=>{let i=`${e}-${n.api===`openai`?`openai`:`anthropic`}`,a=r.get(n.id),o=a?{...a,api:i,provider:e}:{id:n.id,name:n.name??n.id,provider:e,api:i,baseUrl:``,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},inputCost:0,outputCost:0,cacheReadCost:0,cacheWriteCost:0,reasoning:!0},s=t.modelOverrides?.[n.id];return s&&B(o,s),B(o,n),o})}if(t.isOAuth){let n=F(`anthropic`),r=`${e}-anthropic`;return n.map(n=>{let i={...n,api:r,provider:e},a=t.modelOverrides?.[n.id];return a&&B(i,a),i})}return F(e===`azure-ai-foundry`?`anthropic`:e)}catch(t){return U.error(`Failed to load models`,{providerId:e,error:t instanceof Error?t.message:String(t)}),[]}}function H(e){let t=K().find(t=>t.providerId===e);if(!t?.accessToken)return null;let n=!!t.tokenExpiresAt&&Date.now()>t.tokenExpiresAt-6e4;return{token:t.accessToken,maskedValue:t.maskedValue,expiresAt:t.tokenExpiresAt,userName:t.userName,userAvatar:t.userAvatar,expired:n}}Object.assign({})[`/packages/webapp/providers.json`];const U=t(`provider-settings`),$e=[/haiku/i];function W(e){return $e.some(t=>t.test(e))}function et(e){return e.filter(e=>!W(e.id))}function G(){let e=K();if(e.length===0)return[];let t=new Map;for(let n of e){if(t.has(n.providerId))continue;let e=et(V(n.providerId));if(e.length===0)continue;let r=z(n.providerId),i={providerId:n.providerId,providerName:r.name,models:e};t.set(n.providerId,i)}return[...t.values()]}function K(){Ze();let e=localStorage.getItem(I);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.providerId==`string`&&typeof e.apiKey==`string`):[]}catch{return[]}}function q(e){return M(localStorage)[e]??[]}function J(e,t){let n=M(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,N(localStorage,n)}async function tt(e,t){if(i()){J(e,t);return}let n=a();if(!n)throw Error(`setExtraOAuthDomainsAsync: no DOM and no panel-rpc client — cannot persist to page localStorage`);let{storeAfter:r}=await n.call(`oauth-extras-set`,{providerId:e,domains:t});try{N(localStorage,r)}catch(t){U.warn(`worker-shim mirror failed after successful page write — reload to refresh`,{providerId:e,error:t instanceof Error?t.message:String(t)})}}function nt(){return M(localStorage)}function Y(e){localStorage.setItem(I,JSON.stringify(e))}function rt(e,t,n,r,i){let a=K().filter(t=>t.providerId!==e),o={providerId:e,apiKey:t};n&&(o.baseUrl=n),r&&(o.deployment=r),i&&(o.apiVersion=i),a.push(o),Y(a)}async function it(e){let t=K().find(t=>t.providerId===e.providerId),n=K().filter(t=>t.providerId!==e.providerId);n.push({providerId:e.providerId,apiKey:``,accessToken:e.accessToken,refreshToken:e.refreshToken,tokenExpiresAt:e.tokenExpiresAt,userName:e.userName,userAvatar:e.userAvatar,baseUrl:e.baseUrl??t?.baseUrl}),Y(n);let r=z(e.providerId)?.oauthTokenDomains??[],i=q(e.providerId),a=new Set,o=[];for(let e of[...r,...i]){let t=e.toLowerCase();a.has(t)||(a.add(t),o.push(e))}if(o.length===0)return;let s=typeof chrome<`u`&&!!chrome?.runtime?.id;try{if(s){await chrome.storage.local.set({[`oauth.${e.providerId}.token`]:e.accessToken,[`oauth.${e.providerId}.token_DOMAINS`]:o.join(`,`)});let t=await new Promise(t=>{chrome.runtime.sendMessage({type:`secrets.mask-oauth-token`,providerId:e.providerId},n=>{chrome.runtime.lastError&&U.error(`SW mask-oauth-token transport failed`,{providerId:e.providerId,error:chrome.runtime.lastError.message}),t(n??{})})});if(t.error&&U.warn(`SW mask-oauth-token returned error`,{providerId:e.providerId,error:t.error}),t.maskedValue){let n=K(),r=n.find(t=>t.providerId===e.providerId);r&&(r.maskedValue=t.maskedValue,Y(n))}}else{let t=await fetch(`/api/secrets/oauth-update`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({providerId:e.providerId,accessToken:e.accessToken,domains:o})});if(t.ok){let n=await t.json(),r=K(),i=r.find(t=>t.providerId===e.providerId);i&&typeof n.maskedValue==`string`&&(i.maskedValue=n.maskedValue,Y(r))}else U.warn(`OAuth replica POST non-ok`,{providerId:e.providerId,status:t.status})}}catch(t){U.error(`OAuth replica sync failed`,{providerId:e.providerId,isExtension:s,error:t instanceof Error?t.message:String(t)})}}function at(e){let t=K().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function ot(e){let t=K().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(z(e).optionalApiKey?`local`:null):null}function X(e){return K().find(t=>t.providerId===e)?.baseUrl??null}function st(e){return K().find(t=>t.providerId===e)?.deployment??null}function ct(e){return K().find(t=>t.providerId===e)?.apiVersion??null}function lt(){let e=localStorage.getItem(L)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function ut(){return localStorage.getItem(L)||``}function Z(){let e=ut(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=K();return n.length>0?n[0].providerId:`anthropic`}function Q(){return ot(Z())}function dt(e){if(!e)return $();let t=Z(),n=X(t);try{let r=z(t),i=P(r.isOAuth||t===`azure-ai-foundry`?`anthropic`:t===`bedrock-camp`?`amazon-bedrock`:t,e);if(!i?.id)throw Error(`Model ${e} not found`);let a=i;return r.isOAuth?a=V(t).find(t=>t.id===e)||{...a,api:`${t}-anthropic`,provider:t}:t===`bedrock-camp`&&(a={...a,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(a={...a,baseUrl:n}),a}catch{return $()}}function $(){let e=Z(),t=lt(),n=X(e),r=V(e),i=z(e),a=i.defaultModelId?r.find(e=>e.id.toLowerCase().includes(i.defaultModelId.toLowerCase()))?.id:void 0,o=t||a||r[0]?.id||`claude-sonnet-4-6`;try{let t=z(e),i=t.isOAuth||e===`azure-ai-foundry`?`anthropic`:e===`bedrock-camp`?`amazon-bedrock`:e,a=P(i,o);if(!a?.id)throw Error(`Model ${o} not found in ${i} registry`);let s=a;return t.isOAuth?s=r.find(e=>e.id===o)||{...s,api:`${e}-anthropic`,provider:e}:e===`bedrock-camp`&&(s={...s,api:`bedrock-camp-converse`,provider:`bedrock-camp`}),n&&(s={...s,baseUrl:n}),s}catch{let e=r.find(e=>e.id===o);return e?n?{...e,baseUrl:n}:e:P(`anthropic`,`claude-sonnet-4-0`)}}export{se as C,ae as S,ne as T,Be as _,X as a,Se as b,Z as c,dt as d,it as f,Ge as g,We as h,ct as i,Ye as l,Ke as m,G as n,st as o,Je as p,Q as r,H as s,K as t,$ as u,Le as v,re as w,be as x,je as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e}from"./chunk-jRWAZmH_.js";var t={include:[`*`],exclude:[]},n=e({getRegisteredProviderConfig:()=>u,getRegisteredProviderIds:()=>d,registerProviders:()=>l,shouldIncludeProvider:()=>i});const r=Object.assign({"/packages/dev-tools/providers.build.json":t})[`/packages/dev-tools/providers.build.json`]??{include:[`*`],exclude:[]};function i(e){let{include:t,exclude:n}=r;return n.includes(`*`)||n.includes(e)?!1:!!(t.includes(`*`)||t.includes(e))}const a=Object.assign({"./built-in/azure-ai-foundry.ts":()=>import(`./azure-ai-foundry-DtrzZiwo.js`),"./built-in/azure-openai.ts":()=>import(`./azure-openai-
|
|
1
|
+
import{r as e}from"./chunk-jRWAZmH_.js";var t={include:[`*`],exclude:[]},n=e({getRegisteredProviderConfig:()=>u,getRegisteredProviderIds:()=>d,registerProviders:()=>l,shouldIncludeProvider:()=>i});const r=Object.assign({"/packages/dev-tools/providers.build.json":t})[`/packages/dev-tools/providers.build.json`]??{include:[`*`],exclude:[]};function i(e){let{include:t,exclude:n}=r;return n.includes(`*`)||n.includes(e)?!1:!!(t.includes(`*`)||t.includes(e))}const a=Object.assign({"./built-in/azure-ai-foundry.ts":()=>import(`./azure-ai-foundry-DtrzZiwo.js`),"./built-in/azure-openai.ts":()=>import(`./azure-openai-7pTcClzw.js`),"./built-in/bedrock-camp.ts":()=>import(`./bedrock-camp-uPFt7YMZ.js`).then(e=>e.n),"./built-in/local-llm.ts":()=>import(`./local-llm-BdgJqTmS.js`).then(e=>e.n)}),o=Object.assign({"/packages/webapp/providers/adobe.ts":()=>import(`./adobe-DDmxwGXD.js`),"/packages/webapp/providers/github.ts":()=>import(`./github-Be-voIch.js`),"/packages/webapp/providers/xai-grok-errors.ts":()=>import(`./xai-grok-errors-B7OqxH_0.js`),"/packages/webapp/providers/xai-grok-models.ts":()=>import(`./xai-grok-models-0CbvNCeN.js`),"/packages/webapp/providers/xai-grok-sanitize.ts":()=>import(`./xai-grok-sanitize-DTcvIA0E.js`),"/packages/webapp/providers/xai-grok.ts":()=>import(`./xai-grok-DA45ToJz.js`)}),s=new Map;let c=null;function l(){return c||(c=(async()=>{for(let[e,t]of Object.entries(a)){let e=await t();e.config&&i(e.config.id)&&(s.set(e.config.id,e.config),e.register?.())}for(let[e,t]of Object.entries(o)){let e=await t();e.config&&(s.set(e.config.id,e.config),e.register?.())}})(),c)}function u(e){return s.get(e)}function d(){return[...s.keys()]}export{i as a,l as i,d as n,n as r,u as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{OffscreenClient as e}from"./offscreen-client-
|
|
1
|
+
import{OffscreenClient as e}from"./offscreen-client-CX6UYAF6.js";function t(e){let t=!1,n=()=>{t||(t=!0,typeof e.start==`function`&&e.start())};return{onMessage:t=>{let r=e=>{t(e.data)};return e.addEventListener(`message`,r),n(),()=>{e.removeEventListener(`message`,r)}},send:t=>{e.postMessage(t)}}}function n(e){let n=t(e);return{onMessage:e=>n.onMessage(e),send:e=>{n.send({source:`panel`,payload:e})}}}function r(e,n){let r=t(e),i=new Map,a=r.onMessage(async e=>{let t=e;if(t?.type){if(t.type===`cdp-cmd`){let t=e;try{let e=await n.send(t.method,t.params,t.sessionId);r.send({type:`cdp-response`,id:t.id,result:e})}catch(e){r.send({type:`cdp-response`,id:t.id,error:e instanceof Error?e.message:String(e)})}return}if(t.type===`cdp-subscribe`){let t=e;if(i.has(t.event))return;let a=e=>{r.send({type:`cdp-event`,method:t.event,params:e})};i.set(t.event,a),n.on(t.event,a);return}if(t.type===`cdp-unsubscribe`){let t=e,r=i.get(t.event);if(!r)return;i.delete(t.event),n.off(t.event,r);return}}});return()=>{a();for(let[e,t]of i)n.off(e,t);i.clear()}}function i(){let e={};if(typeof localStorage>`u`)return e;for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);if(n===null)continue;let r=localStorage.getItem(n);r!==null&&(e[n]=r)}return e}function a(t){let{worker:i,realCdpTransport:a,callbacks:o}=t,s=t.readyTimeoutMs??3e4,c=t.localStorageSeed??{},l=new MessageChannel,u=new MessageChannel,d=new e(o,n(l.port1)),f=r(u.port1,a),p=null,m=new Promise((e,t)=>{let n=null,r=null;p=()=>{r!==null&&(l.port1.removeEventListener(`message`,r),r=null),n!==null&&(clearTimeout(n),n=null)},r=t=>{t.data?.type===`kernel-worker-ready`&&(p?.(),e())},l.port1.addEventListener(`message`,r),n=setTimeout(()=>{p?.(),t(Error(`Kernel worker did not signal ready within ${s}ms`))},s)}),h={type:`kernel-worker-init`,kernelPort:l.port2,cdpPort:u.port2,localStorageSeed:c,instanceId:t.instanceId};i.postMessage(h,[l.port2,u.port2]);let g=!1;return{client:d,ready:m,dispose(){if(!g){g=!0,p?.(),f();try{i.postMessage({type:`kernel-worker-shutdown`})}catch{}i.terminate(),l.port1.close(),u.port1.close()}}}}function o(e){return a({worker:e.workerUrl?new Worker(e.workerUrl,{type:`module`}):new Worker(new URL(`/assets/kernel-worker-DkfabjjT.js`,``+import.meta.url),{type:`module`}),realCdpTransport:e.realCdpTransport,callbacks:e.callbacks,readyTimeoutMs:e.readyTimeoutMs,localStorageSeed:e.localStorageSeed??i(),instanceId:e.instanceId})}export{o as spawnKernelWorker};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{S as e,m as t}from"./db-DPvmo9md.js";const n=`slicc:last-seen-version`;function r(){return{version:`3.0.1`,releasedAt:`2026-05-20T18:46:33Z`}}async function i(){let e=await t(n);return e&&e.length>0?e:null}async function a(t){await e(n,t)}async function o(){let e=r(),t=await i();return t===null?(await a(e.version),{bundled:e,lastSeen:null,isUpgrade:!1}):t===e.version?{bundled:e,lastSeen:t,isUpgrade:!1}:{bundled:e,lastSeen:t,isUpgrade:!0}}async function s(e){await a(e)}export{o as detectUpgrade,s as recordVersionSeen};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as e,y as t}from"./provider-settings-
|
|
1
|
+
import{r as e,y as t}from"./provider-settings-C7vl_UXi.js";import{d as n,s as r,u as i}from"./bedrock-camp-Bds6qFqf.js";import{o as a}from"./simple-options-D8vGmEnp.js";import{XaiErrorCode as o,XaiOAuthError as s}from"./xai-grok-errors-DGVLpB4k.js";import{resolveModels as c,toModelMetadata as l}from"./xai-grok-models-DGbQVjGO.js";import{sanitizePayload as u}from"./xai-grok-sanitize-DsBfxZb8.js";var d=`xai-grok`,f=`https://auth.x.ai`,p=`${f}/oauth2/authorize`,m=`${f}/oauth2/token`,h=`b1a00492-073a-47ea-816f-4c329264a828`,g=`openid profile email offline_access grok-cli:access api:access`,_=`http://127.0.0.1:56121/callback`,v=`http://127.0.0.1:56121/*`,y=`https://api.x.ai/v1`,b=`openai-responses`,x=`${d}-openai`;function S(){return typeof process>`u`?null:{}?.PI_XAI_OAUTH_MODELS??null}var C=c(S());function w(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function T(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),t}function E(){return w(T(32))}async function D(e){let t=new TextEncoder().encode(e);return w(new Uint8Array(await crypto.subtle.digest(`SHA-256`,t)))}function O(){return w(T(16))}async function k(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:_,client_id:h,code_verifier:t}),r=await fetch(m,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new s(`xAI token exchange failed: ${r.status} ${await r.text()}`,o.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new s(`xAI token exchange did not return access_token.`,o.TOKEN_EXCHANGE_INVALID);return i}async function A(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:h}),n=await fetch(m,{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 j(){return e().find(e=>e.providerId===d)}async function M(){let e=j();if(!e?.accessToken)throw new s("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",o.AUTH_MISSING,!0);let n=e.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return e.accessToken;if(e.refreshToken){let n=await A(e.refreshToken);if(n?.access_token)return await t({providerId:d,accessToken:n.access_token,refreshToken:n.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3}),n.access_token}return e.accessToken}function N(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:x,provider:d,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 P(e,t){return n=>!n||typeof n!=`object`?n:u(n,e,t)}function F(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}var I=(e,t,n={})=>{let i=a();return(async()=>{try{let a=await M(),o=n.sessionId,s=r({...e,baseUrl:y,api:b},t,{...n,apiKey:a,headers:F(n.headers,o),onPayload:P(e.id,o)});for await(let e of s)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(N(e,t)),i.end()}})(),i},L=(e,t,n)=>{let r=a();return(async()=>{try{let a=await M(),o=n?.sessionId,s=i({...e,baseUrl:y,api:b},t,{...n,apiKey:a,headers:F(n?.headers,o),onPayload:P(e.id,o)});for await(let e of s)r.push(e);r.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),r.push(N(e,t)),r.end()}})(),r},R={id:d,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok Heavy.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:`grok-4.20-multi-agent-0309`,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>C.map(e=>{let t=l(e);return e.thinkingLevelMap?{...t,thinkingLevelMap:e.thinkingLevelMap}:t}),onOAuthLoginIntercepted:async(e,n,r)=>{let i=E(),a=await D(i),c=O(),l=O(),u=new URL(p);u.searchParams.set(`response_type`,`code`),u.searchParams.set(`client_id`,h),u.searchParams.set(`redirect_uri`,_),u.searchParams.set(`scope`,r?.scopes??g),u.searchParams.set(`code_challenge`,a),u.searchParams.set(`code_challenge_method`,`S256`),u.searchParams.set(`state`,c),u.searchParams.set(`nonce`,l),u.searchParams.set(`plan`,`generic`),u.searchParams.set(`referrer`,`slicc`);let f=await e({authorizeUrl:u.toString(),redirectUriPattern:v,onCapture:`close`});if(!f)throw new s(`xAI OAuth login was cancelled or timed out`,o.CALLBACK_TIMEOUT);let m=new URL(f),b=m.searchParams.get(`code`),x=m.searchParams.get(`state`);if(!b)throw new s(`xAI OAuth redirect did not include a code`,o.CODE_MISSING);if(x!==c)throw new s(`xAI OAuth state mismatch — possible CSRF, aborting`,o.STATE_MISMATCH);let S=await k(b,i);await t({providerId:d,accessToken:S.access_token,refreshToken:S.refresh_token,tokenExpiresAt:Date.now()+(S.expires_in??21600)*1e3,baseUrl:y}),n()},onOAuthLogout:async()=>{await t({providerId:d,accessToken:``})},onSilentRenew:async()=>{let e=j();if(!e?.refreshToken)return null;let n=await A(e.refreshToken);return n?.access_token?(await t({providerId:d,accessToken:n.access_token,refreshToken:n.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3}),n.access_token):null}};function z(){n({api:x,stream:I,streamSimple:L})}export{o as XaiErrorCode,s as XaiOAuthError,R as config,z as register};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as e,t}from"./provider-settings-
|
|
1
|
+
import{f as e,t}from"./provider-settings-CRaSBF8A.js";import{m as n,p as r,u as i}from"./bedrock-camp-uPFt7YMZ.js";import{o as a}from"./simple-options-CVJdKrCb.js";import{XaiErrorCode as o,XaiOAuthError as s}from"./xai-grok-errors-B7OqxH_0.js";import{resolveModels as c,toModelMetadata as l}from"./xai-grok-models-0CbvNCeN.js";import{sanitizePayload as u}from"./xai-grok-sanitize-DTcvIA0E.js";const d=`xai-grok`,f=`https://auth.x.ai`,p=`${f}/oauth2/authorize`,m=`${f}/oauth2/token`,h=`b1a00492-073a-47ea-816f-4c329264a828`,g=`http://127.0.0.1:56121/callback`,_=`https://api.x.ai/v1`,v=`openai-responses`,y=`${d}-openai`;function b(){return typeof process>`u`?null:{}?.PI_XAI_OAUTH_MODELS??null}const x=c(b());function S(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function C(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),t}function w(){return S(C(32))}async function T(e){let t=new TextEncoder().encode(e);return S(new Uint8Array(await crypto.subtle.digest(`SHA-256`,t)))}function E(){return S(C(16))}async function D(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:g,client_id:h,code_verifier:t}),r=await fetch(m,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new s(`xAI token exchange failed: ${r.status} ${await r.text()}`,o.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new s(`xAI token exchange did not return access_token.`,o.TOKEN_EXCHANGE_INVALID);return i}async function O(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:h}),n=await fetch(m,{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 k(){return t().find(e=>e.providerId===d)}async function A(){let t=k();if(!t?.accessToken)throw new s("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",o.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await O(t.refreshToken);if(n?.access_token)return await e({providerId:d,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3}),n.access_token}return t.accessToken}function j(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:y,provider:d,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 M(e,t){return n=>!n||typeof n!=`object`?n:u(n,e,t)}function N(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}const P=(e,t,n={})=>{let r=a();return(async()=>{try{let a=await A(),o=n.sessionId,s=i({...e,baseUrl:_,api:v},t,{...n,apiKey:a,headers:N(n.headers,o),onPayload:M(e.id,o)});for await(let e of s)r.push(e);r.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),r.push(j(e,t)),r.end()}})(),r},F=(e,t,n)=>{let i=a();return(async()=>{try{let a=await A(),o=n?.sessionId,s=r({...e,baseUrl:_,api:v},t,{...n,apiKey:a,headers:N(n?.headers,o),onPayload:M(e.id,o)});for await(let e of s)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(j(e,t)),i.end()}})(),i},I={id:d,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok Heavy.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:`grok-4.20-multi-agent-0309`,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>x.map(e=>{let t=l(e);return e.thinkingLevelMap?{...t,thinkingLevelMap:e.thinkingLevelMap}:t}),onOAuthLoginIntercepted:async(t,n,r)=>{let i=w(),a=await T(i),c=E(),l=E(),u=new URL(p);u.searchParams.set(`response_type`,`code`),u.searchParams.set(`client_id`,h),u.searchParams.set(`redirect_uri`,g),u.searchParams.set(`scope`,r?.scopes??`openid profile email offline_access grok-cli:access api:access`),u.searchParams.set(`code_challenge`,a),u.searchParams.set(`code_challenge_method`,`S256`),u.searchParams.set(`state`,c),u.searchParams.set(`nonce`,l),u.searchParams.set(`plan`,`generic`),u.searchParams.set(`referrer`,`slicc`);let f=await t({authorizeUrl:u.toString(),redirectUriPattern:`http://127.0.0.1:56121/*`,onCapture:`close`});if(!f)throw new s(`xAI OAuth login was cancelled or timed out`,o.CALLBACK_TIMEOUT);let m=new URL(f),v=m.searchParams.get(`code`),y=m.searchParams.get(`state`);if(!v)throw new s(`xAI OAuth redirect did not include a code`,o.CODE_MISSING);if(y!==c)throw new s(`xAI OAuth state mismatch — possible CSRF, aborting`,o.STATE_MISMATCH);let b=await D(v,i);await e({providerId:d,accessToken:b.access_token,refreshToken:b.refresh_token,tokenExpiresAt:Date.now()+(b.expires_in??21600)*1e3,baseUrl:_}),n()},onOAuthLogout:async()=>{await e({providerId:d,accessToken:``})},onSilentRenew:async()=>{let t=k();if(!t?.refreshToken)return null;let n=await O(t.refreshToken);return n?.access_token?(await e({providerId:d,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3}),n.access_token):null}};function L(){n({api:y,stream:P,streamSimple:F})}export{o as XaiErrorCode,s as XaiOAuthError,I as config,L as register};
|
package/dist/ui/index.html
CHANGED
|
@@ -5,24 +5,24 @@
|
|
|
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/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-C4J34n8d.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-jRWAZmH_.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-ca-nBW7U.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/env-api-keys-BoL4zxcb.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/simple-options-D8vGmEnp.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/json-parse-Cu2r6BfV.js">
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-Bds6qFqf.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/tray-follower-status-hrOEFANe.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/logger-B-No_qN_.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/tool-ui-DaAXBPJY.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/telemetry-D728iVf5.js">
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/provider-settings-
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/provider-settings-C7vl_UXi.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/mount-picker-popup-ys6_YNH0.js">
|
|
21
21
|
<link rel="modulepreload" crossorigin href="/assets/backend-local-CfhYopTE.js">
|
|
22
22
|
<link rel="modulepreload" crossorigin href="/assets/path-utils-C99GOg2c.js">
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/fs-
|
|
23
|
+
<link rel="modulepreload" crossorigin href="/assets/fs-DJesPCjN.js">
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/mime-types-DL940yDZ.js">
|
|
25
|
-
<link rel="modulepreload" crossorigin href="/assets/mount-
|
|
25
|
+
<link rel="modulepreload" crossorigin href="/assets/mount-CPqnWW5n.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/shared-AafAvJaI.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/sprinkle-renderer-sJJO5bqF.js">
|
|
28
28
|
<link rel="stylesheet" crossorigin href="/assets/index-eWuuouO-.css">
|
|
@@ -5,24 +5,24 @@
|
|
|
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/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-C4J34n8d.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-jRWAZmH_.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-ca-nBW7U.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/env-api-keys-BoL4zxcb.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/simple-options-D8vGmEnp.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/json-parse-Cu2r6BfV.js">
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-Bds6qFqf.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/tray-follower-status-hrOEFANe.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/logger-B-No_qN_.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/tool-ui-DaAXBPJY.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/telemetry-D728iVf5.js">
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/provider-settings-
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/provider-settings-C7vl_UXi.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/mount-picker-popup-ys6_YNH0.js">
|
|
21
21
|
<link rel="modulepreload" crossorigin href="/assets/backend-local-CfhYopTE.js">
|
|
22
22
|
<link rel="modulepreload" crossorigin href="/assets/path-utils-C99GOg2c.js">
|
|
23
|
-
<link rel="modulepreload" crossorigin href="/assets/fs-
|
|
23
|
+
<link rel="modulepreload" crossorigin href="/assets/fs-DJesPCjN.js">
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/mime-types-DL940yDZ.js">
|
|
25
|
-
<link rel="modulepreload" crossorigin href="/assets/mount-
|
|
25
|
+
<link rel="modulepreload" crossorigin href="/assets/mount-CPqnWW5n.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/shared-AafAvJaI.js">
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/sprinkle-renderer-sJJO5bqF.js">
|
|
28
28
|
<link rel="stylesheet" crossorigin href="/assets/index-eWuuouO-.css">
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,f as t,t as n}from"./provider-settings-C_bHAv6F.js";import{f as r,h as i,l as a,p as o,u as s}from"./bedrock-camp-prTmQ4PG.js";import{d as c,o as l,u}from"./simple-options-CVJdKrCb.js";import{t as d}from"./kernel-worker-DQl_BcO3.js";import{getOAuthPageOrigin as f}from"./oauth-service-BXo87SGy.js";const p=Object.assign({"/packages/webapp/providers/adobe-config.json":{proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`}})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function m(){let t=e(`adobe`);if(t)return t.replace(/\/$/,``);if(p.proxyEndpoint)return p.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const h=new Map,g=new Map;async function _(e){let t=h.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[M]:`2.56.0`}});if(t.ok){let n=await t.json();return h.set(e,n),n}console.warn(`[adobe] Proxy /v1/config returned ${t.status}, falling back to build-time config`)}catch(e){console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e))}let n={};return h.set(e,n),n}function v(e){let t=e.clientId||p.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function y(e){return e.scopes||p.scopes}function b(e){return e.imsEnvironment||p.imsEnvironment||`prod`}const x={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function S(e){return x[e??p.imsEnvironment??`prod`]??x.prod}const C=typeof chrome<`u`&&!!chrome?.runtime?.id;function w(){return n().find(e=>e.providerId===`adobe`)}async function T(e,t){try{let n=await fetch(`${S(t)}/ims/userinfo/v2`,{headers:{Authorization:`Bearer ${e}`}});if(n.ok){let e=await n.json();return{name:e.displayName||e.name||e.email,avatar:e.picture||e.avatar_url}}console.warn(`[adobe] User profile fetch returned ${n.status}, account will have no display name`)}catch(e){console.warn(`[adobe] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function E(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10)}:null}const D={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!p.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`],getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=g.get(e.id);return n?.api&&(t.api=n.api),n?.context_window!==void 0&&(t.context_window=n.context_window),n?.max_tokens!==void 0&&(t.max_tokens=n.max_tokens),n?.reasoning!==void 0&&(t.reasoning=n.reasoning),n?.input&&(t.input=n.input),/haiku/i.test(e.id)&&(t.compat={supportsEagerToolInputStreaming:!1}),t};for(let t of V.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id}));try{localStorage.setItem(`slicc-adobe-models`,JSON.stringify(n))}catch{}return n}for(let t of h.values())if(t.models?.length)return t.models.map(e);try{let e=localStorage.getItem(`slicc-adobe-models`);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,n)=>{let r=m(),i=await _(r),a=v(i),o=y(i),s=b(i),c=C?null:await f(),l=C?p.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:p.redirectUri??`${c.origin}/auth/callback`,u=C?void 0:btoa(JSON.stringify({port:parseInt(new URL(c.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),d=u?JSON.parse(atob(u)).nonce:null,h=new URLSearchParams({client_id:a,scope:o,response_type:`token`,redirect_uri:l});u&&h.set(`state`,u);let g=await e(`${S(s)}/ims/authorize/v2?${h}`);if(!g)return;if(d&&g)try{if(new URL(g).searchParams.get(`nonce`)!==d){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let x=E(g);if(!x){console.error(`[adobe] Could not extract token from redirect URL`);return}let w=await T(x.accessToken,s);await t({providerId:`adobe`,accessToken:x.accessToken,tokenExpiresAt:Date.now()+x.expiresIn*1e3,userName:w.name,userAvatar:w.avatar,baseUrl:p.proxyEndpoint?void 0:r}),await H().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),n()},onOAuthLogout:async()=>{let e=w();if(e?.accessToken)try{let t=h.values().next().value??{},n=t.clientId||p.clientId,r=b(t);if(n){let t=await fetch(`${S(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await t({providerId:`adobe`,accessToken:``})},onSilentRenew:async()=>w()?.accessToken?j():null};let O=null;async function k(){let e=w();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);try{let e=await j();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=w();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function A(){let e=w();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function j(){return typeof window>`u`?null:O||(O=(async()=>{try{let e=m(),n=await _(e),r=v(n),i=y(n),a=b(n),o=C?p.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:p.redirectUri??`${window.location.origin}/auth/callback`,s=C?void 0:btoa(JSON.stringify({port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),c=s?JSON.parse(atob(s)).nonce:null,l=new URLSearchParams({client_id:r,scope:i,response_type:`token`,redirect_uri:o,prompt:`none`});s&&l.set(`state`,s);let u=`${S(a)}/ims/authorize/v2?${l}`,{createOAuthLauncher:d}=await import(`./oauth-service-BXo87SGy.js`),f=await d()(u);if(!f)return null;if(c&&f)try{if(new URL(f).searchParams.get(`nonce`)!==c)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),null}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let h=E(f);if(!h)return null;let g=w();return await t({providerId:`adobe`,accessToken:h.accessToken,tokenExpiresAt:Date.now()+h.expiresIn*1e3,userName:g?.userName,userAvatar:g?.userAvatar,baseUrl:p.proxyEndpoint?void 0:e}),console.log(`[adobe] Token renewed silently`),await H().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),h.accessToken}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}finally{O=null}})(),O)}const M=`X-Slicc-Version`;function N(e){let t={};if(e.headers)for(let[n,r]of Object.entries(e.headers))n.toLowerCase()!==`x-slicc-version`&&(t[n]=r);return t[M]=`2.56.0`,{...e,headers:t}}const P=new Set;function F(e,t){if(e.headers){for(let t of Object.keys(e.headers))if(t.toLowerCase()===`x-session-id`)return e}return P.has(t)||(P.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":d(`adobe-provider-fallback`)}}}function I(){P.clear()}function L(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,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()}}}const R=(e,t,n={})=>{let r=l();return(async()=>{try{let i=await k();if(String(e.api).includes(`openai`)){let a=s({...e,baseUrl:`${m()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,N(F({...n,apiKey:i},`streamAdobe[openai]`)));for await(let e of a)r.push(e)}else{let o=a({...e,baseUrl:m(),api:`anthropic-messages`},t,N(F({...n,apiKey:i},`streamAdobe[anthropic]`)));for await(let e of o)r.push(e)}r.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),r.push(L(e,t)),r.end()}})(),r},z=(e,t,n)=>{let i=l();return(async()=>{try{let a=await k();if(String(e.api).includes(`openai`)){let r=o({...e,baseUrl:`${m()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,N(F({...n,apiKey:a},`streamSimpleAdobe[openai]`)));for await(let e of r)i.push(e)}else{let o=r({...e,baseUrl:m(),api:`anthropic-messages`},t,N(F({...n,apiKey:a},`streamSimpleAdobe[anthropic]`)));for await(let e of o)i.push(e)}i.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),i.push(L(e,t)),i.end()}})(),i};async function B(){try{let e=await k(),t=m(),n=await fetch(`${t}/v1/models`,{headers:{Authorization:`Bearer ${e}`,[M]:`2.56.0`}});if(n.ok){let e=await n.json();if(e.data?.length){for(let t of e.data){let e={id:t.id,name:t.name};t.api!==void 0&&(e.api=t.api),t.context_window!==void 0&&(e.context_window=t.context_window),t.max_tokens!==void 0&&(e.max_tokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),g.set(t.id,e)}let n=new Map;for(let e of c())try{for(let t of u(e))n.set(t.id,t)}catch{}return e.data.map(e=>{let r=n.get(e.id),i=`adobe-${e.api===`openai`?`openai`:`anthropic`}`;return r?{...r,provider:`adobe`,api:i}:{id:e.id,name:e.name??e.id,provider:`adobe`,api:i,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},inputCost:0,outputCost:0,cacheReadCost:0,cacheWriteCost:0,reasoning:!0}})}}else console.warn(`[adobe] Proxy /v1/models returned ${n.status}, falling back to Anthropic models`)}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return u(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}const V=new Map;async function H(){let e=m(),t=V.get(e);if(t)return t;let n=await B();return V.set(e,n),n}function U(){i({api:`adobe-anthropic`,stream:R,streamSimple:z}),i({api:`adobe-openai`,stream:R,streamSimple:z})}export{I as __resetAdobeSessionIdWarningCacheForTests,D as config,H as getAdobeModels,k as getValidAccessToken,A as isTokenExpired,U as register};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/oauth-service--O2P_cH3.js","assets/preload-helper-ca-nBW7U.js","assets/panel-rpc-DMFq2vU_.js","assets/chunk-jRWAZmH_.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{c as e,r as t,y as n}from"./provider-settings-CyRPUAEx.js";import{t as r}from"./preload-helper-ca-nBW7U.js";import{f as i,l as a,o,s,u as c}from"./bedrock-camp-DChwr7KC.js";import{d as l,o as u,u as d}from"./simple-options-D8vGmEnp.js";import{i as f}from"./index-CTzhOMSf.js";import{getOAuthPageOrigin as p}from"./oauth-service--O2P_cH3.js";var m=Object.assign({"/packages/webapp/providers/adobe-config.json":{proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`}})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function h(){let t=e(`adobe`);if(t)return t.replace(/\/$/,``);if(m.proxyEndpoint)return m.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}var g=new Map,_=new Map;async function v(e){let t=g.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[N]:`2.56.0`}});if(t.ok){let n=await t.json();return g.set(e,n),n}console.warn(`[adobe] Proxy /v1/config returned ${t.status}, falling back to build-time config`)}catch(e){console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e))}let n={};return g.set(e,n),n}function y(e){let t=e.clientId||m.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function b(e){return e.scopes||m.scopes}function x(e){return e.imsEnvironment||m.imsEnvironment||`prod`}var S={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function C(e){return S[e??m.imsEnvironment??`prod`]??S.prod}var w=typeof chrome<`u`&&!!chrome?.runtime?.id;function T(){return t().find(e=>e.providerId===`adobe`)}async function E(e,t){try{let n=await fetch(`${C(t)}/ims/userinfo/v2`,{headers:{Authorization:`Bearer ${e}`}});if(n.ok){let e=await n.json();return{name:e.displayName||e.name||e.email,avatar:e.picture||e.avatar_url}}console.warn(`[adobe] User profile fetch returned ${n.status}, account will have no display name`)}catch(e){console.warn(`[adobe] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function D(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10)}:null}var O={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!m.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`],getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=_.get(e.id);return n?.api&&(t.api=n.api),n?.context_window!==void 0&&(t.context_window=n.context_window),n?.max_tokens!==void 0&&(t.max_tokens=n.max_tokens),n?.reasoning!==void 0&&(t.reasoning=n.reasoning),n?.input&&(t.input=n.input),/haiku/i.test(e.id)&&(t.compat={supportsEagerToolInputStreaming:!1}),t};for(let t of U.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id}));try{localStorage.setItem(`slicc-adobe-models`,JSON.stringify(n))}catch{}return n}for(let t of g.values())if(t.models?.length)return t.models.map(e);try{let e=localStorage.getItem(`slicc-adobe-models`);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,t)=>{let r=h(),i=await v(r),a=y(i),o=b(i),s=x(i),c=w?null:await p(),l=w?m.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:m.redirectUri??`${c.origin}/auth/callback`,u=w?void 0:btoa(JSON.stringify({port:parseInt(new URL(c.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),d=u?JSON.parse(atob(u)).nonce:null,f=new URLSearchParams({client_id:a,scope:o,response_type:`token`,redirect_uri:l});u&&f.set(`state`,u);let g=await e(`${C(s)}/ims/authorize/v2?${f}`);if(!g)return;if(d&&g)try{if(new URL(g).searchParams.get(`nonce`)!==d){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let _=D(g);if(!_){console.error(`[adobe] Could not extract token from redirect URL`);return}let S=await E(_.accessToken,s);await n({providerId:`adobe`,accessToken:_.accessToken,tokenExpiresAt:Date.now()+_.expiresIn*1e3,userName:S.name,userAvatar:S.avatar,baseUrl:m.proxyEndpoint?void 0:r}),await W().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=T();if(e?.accessToken)try{let t=g.values().next().value??{},n=t.clientId||m.clientId,r=x(t);if(n){let t=await fetch(`${C(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await n({providerId:`adobe`,accessToken:``})},onSilentRenew:async()=>T()?.accessToken?M():null},k=null;async function A(){let e=T();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);try{let e=await M();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=T();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function j(){let e=T();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function M(){return typeof window>`u`?null:k||(k=(async()=>{try{let e=h(),t=await v(e),i=y(t),a=b(t),o=x(t),s=w?m.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:m.redirectUri??`${window.location.origin}/auth/callback`,c=w?void 0:btoa(JSON.stringify({port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),l=c?JSON.parse(atob(c)).nonce:null,u=new URLSearchParams({client_id:i,scope:a,response_type:`token`,redirect_uri:s,prompt:`none`});c&&u.set(`state`,c);let d=`${C(o)}/ims/authorize/v2?${u}`,{createOAuthLauncher:f}=await r(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service--O2P_cH3.js`);return{createOAuthLauncher:e}},__vite__mapDeps([0,1,2,3])),p=await f()(d);if(!p)return null;if(l&&p)try{if(new URL(p).searchParams.get(`nonce`)!==l)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),null}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=D(p);if(!g)return null;let _=T();return await n({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_?.userName,userAvatar:_?.userAvatar,baseUrl:m.proxyEndpoint?void 0:e}),console.log(`[adobe] Token renewed silently`),await W().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),g.accessToken}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}finally{k=null}})(),k)}var N=`X-Slicc-Version`;function P(e){let t={},n=N.toLowerCase();if(e.headers)for(let[r,i]of Object.entries(e.headers))r.toLowerCase()!==n&&(t[r]=i);return t[N]=`2.56.0`,{...e,headers:t}}var F=`adobe-provider-fallback`,I=new Set;function L(e,t){if(e.headers){for(let t of Object.keys(e.headers))if(t.toLowerCase()===`x-session-id`)return e}return I.has(t)||(I.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":f(F)}}}function R(){I.clear()}function z(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,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()}}}var B=(e,t,n={})=>{let r=u();return(async()=>{try{let i=await A();if(String(e.api).includes(`openai`)){let a=s({...e,baseUrl:`${h()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,P(L({...n,apiKey:i},`streamAdobe[openai]`)));for await(let e of a)r.push(e)}else{let a=o({...e,baseUrl:h(),api:`anthropic-messages`},t,P(L({...n,apiKey:i},`streamAdobe[anthropic]`)));for await(let e of a)r.push(e)}r.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),r.push(z(e,t)),r.end()}})(),r},V=(e,t,n)=>{let r=u();return(async()=>{try{let i=await A();if(String(e.api).includes(`openai`)){let a=c({...e,baseUrl:`${h()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,P(L({...n,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let e of a)r.push(e)}else{let o=a({...e,baseUrl:h(),api:`anthropic-messages`},t,P(L({...n,apiKey:i},`streamSimpleAdobe[anthropic]`)));for await(let e of o)r.push(e)}r.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),r.push(z(e,t)),r.end()}})(),r};async function H(){try{let e=await A(),t=h(),n=await fetch(`${t}/v1/models`,{headers:{Authorization:`Bearer ${e}`,[N]:`2.56.0`}});if(n.ok){let e=await n.json();if(e.data?.length){for(let t of e.data){let e={id:t.id,name:t.name};t.api!==void 0&&(e.api=t.api),t.context_window!==void 0&&(e.context_window=t.context_window),t.max_tokens!==void 0&&(e.max_tokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),_.set(t.id,e)}let n=new Map;for(let e of l())try{for(let t of d(e))n.set(t.id,t)}catch{}return e.data.map(e=>{let r=n.get(e.id),i=`adobe-${e.api===`openai`?`openai`:`anthropic`}`;return r?{...r,provider:`adobe`,api:i}:{id:e.id,name:e.name??e.id,provider:`adobe`,api:i,baseUrl:t,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},inputCost:0,outputCost:0,cacheReadCost:0,cacheWriteCost:0,reasoning:!0}})}}else console.warn(`[adobe] Proxy /v1/models returned ${n.status}, falling back to Anthropic models`)}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return d(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}var U=new Map;async function W(){let e=h(),t=U.get(e);if(t)return t;let n=await H();return U.set(e,n),n}function G(){i({api:`adobe-anthropic`,stream:B,streamSimple:V}),i({api:`adobe-openai`,stream:B,streamSimple:V})}export{R as __resetAdobeSessionIdWarningCacheForTests,O as config,W as getAdobeModels,A as getValidAccessToken,j as isTokenExpired,G as register};
|