sliccy 2.42.0 → 2.43.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.
- package/dist/node-server/_shared/index.d.ts +4 -0
- package/dist/node-server/_shared/index.d.ts.map +1 -0
- package/dist/node-server/_shared/index.js +5 -0
- package/dist/node-server/_shared/index.js.map +1 -0
- package/dist/node-server/_shared/oauth-extra-domains-storage.d.ts +29 -0
- package/dist/node-server/_shared/oauth-extra-domains-storage.d.ts.map +1 -0
- package/dist/node-server/_shared/oauth-extra-domains-storage.js +85 -0
- package/dist/node-server/_shared/oauth-extra-domains-storage.js.map +1 -0
- package/dist/node-server/_shared/secret-masking.d.ts +43 -0
- package/dist/node-server/_shared/secret-masking.d.ts.map +1 -0
- package/dist/node-server/_shared/secret-masking.js +125 -0
- package/dist/node-server/_shared/secret-masking.js.map +1 -0
- package/dist/node-server/_shared/secrets-pipeline.d.ts +103 -0
- package/dist/node-server/_shared/secrets-pipeline.d.ts.map +1 -0
- package/dist/node-server/_shared/secrets-pipeline.js +249 -0
- package/dist/node-server/_shared/secrets-pipeline.js.map +1 -0
- package/dist/node-server/index.js +78 -7
- package/dist/node-server/secrets/index.d.ts +3 -3
- package/dist/node-server/secrets/index.js +1 -1
- package/dist/node-server/secrets/oauth-secret-store.d.ts +12 -0
- package/dist/node-server/secrets/oauth-secret-store.js +18 -0
- package/dist/node-server/secrets/proxy-manager.d.ts +13 -49
- package/dist/node-server/secrets/proxy-manager.js +62 -114
- package/dist/node-server/secrets/session-id-file.d.ts +5 -0
- package/dist/node-server/secrets/session-id-file.js +33 -0
- package/dist/node-server/secrets/types.d.ts +5 -0
- package/dist/ui/assets/adobe-C2UaIA41.js +2 -0
- package/dist/ui/assets/adobe-DCEW-jwu.js +1 -0
- package/dist/ui/assets/{agent-bridge-DPiRY9Cp.js → agent-bridge-DpnoOA1m.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-DPXL2yWd.js → agent-message-to-chat-BhoxpmpE.js} +1 -1
- package/dist/ui/assets/{anthropic-DNaAx4PR.js → anthropic-BBCljDKG.js} +1 -1
- package/dist/ui/assets/{anthropic-z3OB3Fnl.js → anthropic-DuP0qmVz.js} +1 -1
- package/dist/ui/assets/{azure-openai-T9qO12vJ.js → azure-openai-DJep1H6m.js} +1 -1
- package/dist/ui/assets/{azure-openai-BittXGOl.js → azure-openai-es2UEaVa.js} +1 -1
- package/dist/ui/assets/{azure-openai-responses-DBxhuZoo.js → azure-openai-responses-BasmI9oz.js} +1 -1
- package/dist/ui/assets/{azure-openai-responses-DviTxw7q.js → azure-openai-responses-DBAbXSTD.js} +1 -1
- package/dist/ui/assets/{bedrock-camp-CHTXSY1O.js → bedrock-camp-CSp2DPSu.js} +3 -3
- package/dist/ui/assets/{bedrock-camp-MgGI9Yh2.js → bedrock-camp-KyNM28gW.js} +2 -2
- package/dist/ui/assets/{cdp-BV0AqGz6.js → cdp-CP2mm6ER.js} +2 -2
- package/dist/ui/assets/cost-command-DnyD68nK.js +1 -0
- package/dist/ui/assets/{es-CMpEjX7X.js → es-BUhsge_v.js} +1 -1
- package/dist/ui/assets/{fs-CJrk6h4U.js → fs-1U1rT6mb.js} +2 -2
- package/dist/ui/assets/{fs-IOuBZ0fU.js → fs-KzDX6lDt.js} +3 -3
- package/dist/ui/assets/github-BoI7NK5Y.js +2 -0
- package/dist/ui/assets/github-DZWbceUJ.js +1 -0
- package/dist/ui/assets/{google-B_wiPl8S.js → google-CcdeRF42.js} +1 -1
- package/dist/ui/assets/{google-BSQPUbsD.js → google-w3iuVje2.js} +1 -1
- package/dist/ui/assets/{index-DOah61oi.js → index-Dbfn2pUX.js} +17 -17
- package/dist/ui/assets/{kernel-worker-Ct6nuQEv.js → kernel-worker-BuJdZy5v.js} +920 -887
- package/dist/ui/assets/{local-llm-BKrBXM1b.js → local-llm-D72tLY3Y.js} +1 -1
- package/dist/ui/assets/{local-llm-DG_WcsYf.js → local-llm-XVLqdOOf.js} +1 -1
- package/dist/ui/assets/{mistral-cWWq2371.js → mistral-DRSbEgc2.js} +1 -1
- package/dist/ui/assets/{mistral-oA9eus1c.js → mistral-b5JBKUqy.js} +1 -1
- package/dist/ui/assets/{mount-BE4HlHj3.js → mount-6-HP-fzb.js} +1 -1
- package/dist/ui/assets/{mount-d5zFj5UF.js → mount-zcpBZ465.js} +2 -2
- package/dist/ui/assets/{nuke-command-Do01VR7B.js → nuke-command-DTu62dL0.js} +1 -1
- package/dist/ui/assets/oauth-bootstrap-CsJTQqoE.js +1 -0
- package/dist/ui/assets/oauth-service-C0rdcoXi.js +1 -0
- package/dist/ui/assets/oauth-service-DTHr_ILl.js +1 -0
- package/dist/ui/assets/{offscreen-client-D96UbGR3.js → offscreen-client-BQS5SL9t.js} +1 -1
- package/dist/ui/assets/{onboarding-orchestrator-D1l-w9_h.js → onboarding-orchestrator-Dld2OQzb.js} +1 -1
- package/dist/ui/assets/{openai-codex-responses-ChYFmtB8.js → openai-codex-responses-BIq_NjtP.js} +1 -1
- package/dist/ui/assets/{openai-codex-responses-DYtt5_H9.js → openai-codex-responses-Bw3r2Hnu.js} +1 -1
- package/dist/ui/assets/{openai-completions-CkeC09FW.js → openai-completions-68Ek_N21.js} +1 -1
- package/dist/ui/assets/{openai-completions-pJVLdfB5.js → openai-completions-BXM-gDWt.js} +1 -1
- package/dist/ui/assets/{openai-responses-CfoWjQjX.js → openai-responses-BoV1AGA6.js} +1 -1
- package/dist/ui/assets/{openai-responses-BtUhfSCM.js → openai-responses-EH-UgPTz.js} +1 -1
- package/dist/ui/assets/{openai-responses-shared-BT4PBv9i.js → openai-responses-shared-BnEuqygR.js} +1 -1
- package/dist/ui/assets/{openai-responses-shared-BL73-u8o.js → openai-responses-shared-sCOhnzkS.js} +1 -1
- package/dist/ui/assets/page-storage-sync-DEhI1xEB.js +1 -0
- package/dist/ui/assets/{panel-rpc-BLyR6B42.js → panel-rpc-g85bMVnq.js} +1 -1
- package/dist/ui/assets/panel-rpc-handlers-Cd0NeWGr.js +1 -0
- package/dist/ui/assets/provider-settings-BJW3Z-UR.js +2 -0
- package/dist/ui/assets/provider-settings-BwyVvIHC.js +90 -0
- package/dist/ui/assets/{providers-DDa7zuci.js → providers-Bx2_S0Gs.js} +1 -1
- package/dist/ui/assets/secret-env-DES2XPkD.js +1 -0
- package/dist/ui/assets/{spawn-CIR7ZcER.js → spawn-Bs7QOa4F.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-CHed1OmR.js → upgrade-detection-DaIEsDu3.js} +1 -1
- package/dist/ui/index.html +6 -6
- package/dist/ui/packages/webapp/index.html +6 -6
- package/package.json +4 -3
- package/dist/node-server/secrets/domain-match.d.ts +0 -20
- package/dist/node-server/secrets/domain-match.js +0 -37
- package/dist/node-server/secrets/masking.d.ts +0 -21
- package/dist/node-server/secrets/masking.js +0 -82
- package/dist/ui/assets/adobe-CqL9wyDB.js +0 -1
- package/dist/ui/assets/adobe-Dz3AQqOU.js +0 -1
- package/dist/ui/assets/cost-command-CmqxOe10.js +0 -1
- package/dist/ui/assets/github-B1wRLpqB.js +0 -1
- package/dist/ui/assets/github-BtI_MJWq.js +0 -2
- package/dist/ui/assets/oauth-service-BOg00ewY.js +0 -1
- package/dist/ui/assets/oauth-service-CfTUWB9P.js +0 -1
- package/dist/ui/assets/page-storage-sync-BPAEqPof.js +0 -1
- package/dist/ui/assets/panel-rpc-handlers-ZHQOP2j9.js +0 -1
- package/dist/ui/assets/provider-settings-CvNDi0PS.js +0 -90
- package/dist/ui/assets/provider-settings-DUgrWSPY.js +0 -2
- package/dist/ui/assets/secret-masking-BMzkw8ZK.js +0 -1
- /package/dist/ui/assets/{azure-ai-foundry-CaxHzIfg.js → azure-ai-foundry-BHhe6xrk.js} +0 -0
- /package/dist/ui/assets/{azure-ai-foundry-B1O-wE_V.js → azure-ai-foundry-Bcv3AvZm.js} +0 -0
- /package/dist/ui/assets/{bsh-watchdog-BPXsh13l.js → bsh-watchdog-BBjbd-XL.js} +0 -0
- /package/dist/ui/assets/{chat-fixture-CM-jsDDl.js → chat-fixture-5h_JuUYl.js} +0 -0
- /package/dist/ui/assets/{git-config-BoQzX7Xi.js → git-config-BMEHAjvp.js} +0 -0
- /package/dist/ui/assets/{magick-wasm-BnlzD3um.js → magick-wasm-E5pMp5Fh.js} +0 -0
- /package/dist/ui/assets/{remote-terminal-view-wMCUFwpP.js → remote-terminal-view-B3w1XsI8.js} +0 -0
- /package/dist/ui/assets/{rum-DYAJNvRR.js → rum-_zaGz-D7.js} +0 -0
- /package/dist/ui/assets/{slicc-editor-ZPVWM2cU.js → slicc-editor-DAgxp34c.js} +0 -0
- /package/dist/ui/assets/{sprinkle-bridge-channel-Dd_0GEWx.js → sprinkle-bridge-channel-DJuNr3kv.js} +0 -0
- /package/dist/ui/assets/{sprinkle-bridge-channel-DhKQ_srk.js → sprinkle-bridge-channel-wZyMV5ic.js} +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import{r as e}from"./chunk-jRWAZmH_.js";import{t}from"./logger-BHrAkMIS.js";import{a as n,c as r,i,r as a,s as o,t as s}from"./bedrock-camp-KyNM28gW.js";import{d as c,l,u}from"./transform-messages-BdxHijhT.js";import{a as d,n as f,t as p}from"./providers-Bx2_S0Gs.js";import{m,p as h}from"./kernel-worker-BuJdZy5v.js";const ee=`slicc.trayWorkerBaseUrl`,te=`https://www.sliccy.ai`;let ne={state:`inactive`,joinUrl:null,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null};function re(){return{...ne}}const ie=new Set;function ae(e){return ie.add(e),()=>{ie.delete(e)}}async function oe(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 g(s,o,n,i,r,a),o}async function se(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 g(o,a,t,r,n,i),a}async function g(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 ce(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 le(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 ce(e,t,n,i,a){let o=e.messages;t.transformContext&&(o=await t.transformContext(o,n));let s=await t.convertToLlm(o),c={systemPrompt:e.systemPrompt,messages:s,tools:e.tools},l=a||r,u=(t.getApiKey?await t.getApiKey(t.model.provider):void 0)||t.apiKey,d=await l(t.model,c,{...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 i({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 i({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 i({type:`message_start`,message:{...t}}),await i({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 i({type:`message_start`,message:{...m}})),await i({type:`message_end`,message:m}),m}async function le(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?ue(e,t,a,n,r,i):de(e,t,a,n,r,i)}async function ue(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 v(e,t,c,r,i),l;l=n.kind===`immediate`?{toolCall:c,result:n.result,isError:n.isError}:await b(e,t,n,await y(n,i,a),r,i),await S(l,a);let u=C(l);await w(u,a),o.push(l),s.push(u)}return{messages:s,terminate:_(o)}}async function de(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 v(e,t,s,r,i);if(n.kind===`immediate`){let e={toolCall:s,result:n.result,isError:n.isError};await S(e,a),o.push(e);continue}o.push(async()=>{let o=await b(e,t,n,await y(n,i,a),r,i);return await S(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=C(e);await w(t,a),c.push(t)}return{messages:c,terminate:_(s)}}function _(e){return e.length>0&&e.every(e=>e.result.terminate===!0)}function fe(e,t){if(!e.prepareArguments)return t;let n=e.prepareArguments(t.arguments);return n===t.arguments?t:{...t,arguments:n}}async function v(e,t,r,i,a){let o=e.tools?.find(e=>e.name===r.name);if(!o)return{kind:`immediate`,result:x(`Tool ${r.name} not found`),isError:!0};try{let s=n(o,fe(o,r));if(i.beforeToolCall){let n=await i.beforeToolCall({assistantMessage:t,toolCall:r,args:s,context:e},a);if(n?.block)return{kind:`immediate`,result:x(n.reason||`Tool execution was blocked`),isError:!0}}return{kind:`prepared`,toolCall:r,tool:o,args:s}}catch(e){return{kind:`immediate`,result:x(e instanceof Error?e.message:String(e)),isError:!0}}}async function y(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:x(e instanceof Error?e.message:String(e)),isError:!0}}}async function b(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=x(e instanceof Error?e.message:String(e)),s=!0}return{toolCall:n.toolCall,result:o,isError:s}}function x(e){return{content:[{type:`text`,text:e}],details:{}}}async function S(e,t){await t({type:`tool_execution_end`,toolCallId:e.toolCall.id,toolName:e.toolCall.name,result:e.result,isError:e.isError})}function C(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 w(e,t){await t({type:`message_start`,message:e}),await t({type:`message_end`,message:e})}function pe(e){return e.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`toolResult`)}const me={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},he={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 ge(e){let t=e?.tools?.slice()??[],n=e?.messages?.slice()??[];return{systemPrompt:e?.systemPrompt??``,model:e?.model??he,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 T=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=[]}},_e=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=ge(e.initialState),this.convertToLlm=e.convertToLlm??pe,this.transformContext=e.transformContext,this.streamFn=e.streamFn??r,this.getApiKey=e.getApiKey,this.onPayload=e.onPayload,this.onResponse=e.onResponse,this.beforeToolCall=e.beforeToolCall,this.afterToolCall=e.afterToolCall,this.steeringQueue=new T(e.steeringMode??`one-at-a-time`),this.followUpQueue=new T(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 oe(e,this.createContextSnapshot(),this.createLoopConfig(t),e=>this.processEvents(e),n,this.streamFn)})}async runContinuation(){await this.runWithLifecycle(async e=>{await se(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:me,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 E=`sessions`;function ve(){return new Promise((e,t)=>{let n=indexedDB.open(`agent-sessions`,1);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(E)||e.createObjectStore(E,{keyPath:`id`})},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}var ye=class{dbPromise=null;getDB(){return this.dbPromise||=ve(),this.dbPromise}async save(e){let t=await this.getDB();return new Promise((n,r)=>{let i=t.transaction(E,`readwrite`).objectStore(E).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(E,`readonly`).objectStore(E).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(E,`readwrite`).objectStore(E).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(E,`readonly`).objectStore(E).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(E,`readwrite`).objectStore(E).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 D=t(`image-processor`),O=3932160,be=new Set([`image/jpeg`,`image/png`,`image/gif`,`image/webp`]);function xe(e){return be.has(e)}function Se(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 Ce(e){if(!xe(e.mimeType))return D.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=Se(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;D.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-2iwpLX2j.js`).then(e=>e.n);r=e.getMagick,i=e.MIME_TO_MAGICK_FORMAT}catch(e){return D.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 D.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),D.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>O&&s!==`JPEG`?(D.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>O&&(D.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 D.warn(`ImageMagick produced no output`),{type:`text`,text:`[Image removed: could not be processed (empty output from resize)]`};if(o.data.length>O)return D.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 D.info(`Image processed successfully`,{originalBase64:t,newBase64:c.length,mimeType:o.mime}),{type:`image`,data:c,mimeType:o.mime}}catch(n){return D.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 we=t(`tool-adapter`),Te=/<img:(data:(image\/[^;]+);base64,([^>]+))>/g;function k(e){let t=[],n=0;for(let r of e.matchAll(Te)){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 Ee(e){let t=k(e),n=[];for(let e of t)e.type===`image`?n.push(await Ce(e)):n.push(e);return n}function De(e,t){return{name:e.name,label:e.name,description:e.description,parameters:e.inputSchema,async execute(n,r,i,a){let o;a&&(o=m({onUpdate:a,toolName:e.name,toolCallId:n}));let s=t?t.processManager.spawn({kind:`tool`,argv:[e.name,...ke(r)],owner:t.owner,ppid:t.getParentPid?.()}):null,c=null;s&&t&&i&&(i.aborted?t.processManager.signal(s.pid,`SIGINT`):i.addEventListener(`abort`,()=>t.processManager.signal(s.pid,`SIGINT`),{once:!0})),s&&t&&(c=t.processManager.onSignal((e,n)=>{e.pid!==s.pid||n!==`SIGKILL`||t.processManager.exit(s.pid,null)}));let l=s?s.abort.signal:i;try{let n=await e.execute(r??{},l),i;try{i=await Ee(n.content)}catch(t){we.warn(`Image processing failed, falling back to raw content`,{tool:e.name,error:t instanceof Error?t.message:String(t)}),i=k(n.content)}return s&&t&&t.processManager.exit(s.pid,+!!n.isError),{content:i,details:{isError:n.isError}}}catch(e){throw s&&t&&t.processManager.exit(s.pid,s.abort.signal.aborted?null:1),e}finally{o&&h(o),c?.()}}}}function Oe(e,t){return e.map(e=>De(e,t))}function ke(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[]}function Ae(e){let t=`Ran \`${e.command}\`\n`;return e.output?t+=`\`\`\`\n${e.output}\n\`\`\``:t+=`(no output)`,e.cancelled?t+=`
|
|
2
|
+
|
|
3
|
+
(command cancelled)`:e.exitCode!==null&&e.exitCode!==void 0&&e.exitCode!==0&&(t+=`\n\nCommand exited with code ${e.exitCode}`),e.truncated&&e.fullOutputPath&&(t+=`\n\n[Output truncated. Full output: ${e.fullOutputPath}]`),t}function je(e){return e.map(e=>{switch(e.role){case`bashExecution`:return e.excludeFromContext?void 0:{role:`user`,content:[{type:`text`,text:Ae(e)}],timestamp:e.timestamp};case`custom`:return{role:`user`,content:typeof e.content==`string`?[{type:`text`,text:e.content}]:e.content,timestamp:e.timestamp};case`branchSummary`:return{role:`user`,content:[{type:`text`,text:`The following is a summary of a branch that this conversation came back from:
|
|
4
|
+
|
|
5
|
+
<summary>
|
|
6
|
+
`+e.summary+`</summary>`}],timestamp:e.timestamp};case`compactionSummary`:return{role:`user`,content:[{type:`text`,text:`The conversation history before this point was compacted into the following summary:
|
|
7
|
+
|
|
8
|
+
<summary>
|
|
9
|
+
`+e.summary+`
|
|
10
|
+
</summary>`}],timestamp:e.timestamp};case`user`:case`assistant`:case`toolResult`:return e;default:return}}).filter(e=>e!==void 0)}function Me(e,t){if(e.length<=t)return e;let n=e.length-t;return`${e.slice(0,t)}\n\n[... ${n} more characters truncated]`}function Ne(e){let t=[];for(let n of e)if(n.role===`user`){let e=typeof n.content==`string`?n.content:n.content.filter(e=>e.type===`text`).map(e=>e.text).join(``);e&&t.push(`[User]: ${e}`)}else if(n.role===`assistant`){let e=[],r=[],i=[];for(let t of n.content)if(t.type===`text`)e.push(t.text);else if(t.type===`thinking`)r.push(t.thinking);else if(t.type===`toolCall`){let e=t.arguments,n=Object.entries(e).map(([e,t])=>`${e}=${JSON.stringify(t)}`).join(`, `);i.push(`${t.name}(${n})`)}r.length>0&&t.push(`[Assistant thinking]: ${r.join(`
|
|
11
|
+
`)}`),e.length>0&&t.push(`[Assistant]: ${e.join(`
|
|
12
|
+
`)}`),i.length>0&&t.push(`[Assistant tool calls]: ${i.join(`; `)}`)}else if(n.role===`toolResult`){let e=n.content.filter(e=>e.type===`text`).map(e=>e.text).join(``);e&&t.push(`[Tool result]: ${Me(e,2e3)}`)}return t.join(`
|
|
13
|
+
|
|
14
|
+
`)}const A={enabled:!0,reserveTokens:16384,keepRecentTokens:2e4};function Pe(e,t,n){return n.enabled?e>t-n.reserveTokens:!1}function j(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}async function Fe(e,t,n,r,i,a,s,c,l){let u=Math.floor(.8*n),d=c?`The messages above are NEW conversation messages to incorporate into the existing summary provided in <previous-summary> tags.
|
|
15
|
+
|
|
16
|
+
Update the existing structured summary with new information. RULES:
|
|
17
|
+
- PRESERVE all existing information from the previous summary
|
|
18
|
+
- ADD new progress, decisions, and context from the new messages
|
|
19
|
+
- UPDATE the Progress section: move items from "In Progress" to "Done" when completed
|
|
20
|
+
- UPDATE "Next Steps" based on what was accomplished
|
|
21
|
+
- PRESERVE exact file paths, function names, and error messages
|
|
22
|
+
- If something is no longer relevant, you may remove it
|
|
23
|
+
|
|
24
|
+
Use this EXACT format:
|
|
25
|
+
|
|
26
|
+
## Goal
|
|
27
|
+
[Preserve existing goals, add new ones if the task expanded]
|
|
28
|
+
|
|
29
|
+
## Constraints & Preferences
|
|
30
|
+
- [Preserve existing, add new ones discovered]
|
|
31
|
+
|
|
32
|
+
## Progress
|
|
33
|
+
### Done
|
|
34
|
+
- [x] [Include previously done items AND newly completed items]
|
|
35
|
+
|
|
36
|
+
### In Progress
|
|
37
|
+
- [ ] [Current work - update based on progress]
|
|
38
|
+
|
|
39
|
+
### Blocked
|
|
40
|
+
- [Current blockers - remove if resolved]
|
|
41
|
+
|
|
42
|
+
## Key Decisions
|
|
43
|
+
- **[Decision]**: [Brief rationale] (preserve all previous, add new)
|
|
44
|
+
|
|
45
|
+
## Next Steps
|
|
46
|
+
1. [Update based on current state]
|
|
47
|
+
|
|
48
|
+
## Critical Context
|
|
49
|
+
- [Preserve important context, add new if needed]
|
|
50
|
+
|
|
51
|
+
Keep each section concise. Preserve exact file paths, function names, and error messages.`:`The messages above are a conversation to summarize. Create a structured context checkpoint summary that another LLM will use to continue the work.
|
|
52
|
+
|
|
53
|
+
Use this EXACT format:
|
|
54
|
+
|
|
55
|
+
## Goal
|
|
56
|
+
[What is the user trying to accomplish? Can be multiple items if the session covers different tasks.]
|
|
57
|
+
|
|
58
|
+
## Constraints & Preferences
|
|
59
|
+
- [Any constraints, preferences, or requirements mentioned by user]
|
|
60
|
+
- [Or "(none)" if none were mentioned]
|
|
61
|
+
|
|
62
|
+
## Progress
|
|
63
|
+
### Done
|
|
64
|
+
- [x] [Completed tasks/changes]
|
|
65
|
+
|
|
66
|
+
### In Progress
|
|
67
|
+
- [ ] [Current work]
|
|
68
|
+
|
|
69
|
+
### Blocked
|
|
70
|
+
- [Issues preventing progress, if any]
|
|
71
|
+
|
|
72
|
+
## Key Decisions
|
|
73
|
+
- **[Decision]**: [Brief rationale]
|
|
74
|
+
|
|
75
|
+
## Next Steps
|
|
76
|
+
1. [Ordered list of what should happen next]
|
|
77
|
+
|
|
78
|
+
## Critical Context
|
|
79
|
+
- [Any data, examples, or references needed to continue]
|
|
80
|
+
- [Or "(none)" if not applicable]
|
|
81
|
+
|
|
82
|
+
Keep each section concise. Preserve exact file paths, function names, and error messages.`;s&&(d=`${d}\n\nAdditional focus: ${s}`);let f=`<conversation>\n${Ne(je(e))}\n</conversation>\n\n`;c&&(f+=`<previous-summary>\n${c}\n</previous-summary>\n\n`),f+=d;let p=[{role:`user`,content:[{type:`text`,text:f}],timestamp:Date.now()}],m=t.reasoning&&l&&l!==`off`?{maxTokens:u,signal:a,apiKey:r,headers:i,reasoning:l}:{maxTokens:u,signal:a,apiKey:r,headers:i},h=await o(t,{systemPrompt:`You are a context summarization assistant. Your task is to read a conversation between a user and an AI coding assistant, then produce a structured summary following the exact format specified.
|
|
83
|
+
|
|
84
|
+
Do NOT continue the conversation. Do NOT respond to any questions in the conversation. ONLY output the structured summary.`,messages:p},m);if(h.stopReason===`error`)throw Error(`Summarization failed: ${h.errorMessage||`Unknown error`}`);return h.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
|
|
85
|
+
`)}const M=t(`context-compaction`);function Ie(e,t){return e.role===t}function Le(e){let t=e.contextWindow??2e5,n=e.reserveTokens??A.reserveTokens,r=e.keepRecentTokens??A.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+=j(e);if(!Pe(s,t,i))return a;M.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=j(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 M.warn(`Cannot find valid cut point for compaction`),a;let u=a.slice(0,l),d=a.slice(l);M.info(`Compaction cut point`,{summarizing:u.length,keeping:d.length});let f=e.getApiKey();if(f)try{let t=await Fe(u,e.model,n,f,e.headers,o),r={role:`user`,content:[{type:`text`,text:`<context-summary>\n${t}\n</context-summary>`}],timestamp:Date.now()};return M.info(`LLM summarization successful`,{originalMessages:a.length,compactedMessages:1+d.length,summaryLength:t.length}),[r,...d]}catch(e){M.warn(`LLM summarization failed, falling back to naive drop`,{error:e instanceof Error?e.message:String(e)})}else M.warn(`No API key available for LLM summarization, falling back to naive drop`);let p={role:`user`,content:[{type:`text`,text:`[Earlier conversation messages were compacted to save context space]`}],timestamp:Date.now()};return M.info(`Naive compaction applied`,{originalMessages:a.length,compactedMessages:1+d.length}),[p,...d]}}function Re(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 ze(e){let t=e.mimeType||`application/octet-stream`;return`${e.name} (${t}, ${Re(e.size)})`}function Be(e){let t=ze(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(`
|
|
86
|
+
`):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 Ve(e,t){if(!t?.length)return e;let n=t.map(Be),r=e.trim();return r?`${r}\n\n${n.join(`
|
|
87
|
+
|
|
88
|
+
`)}`:n.join(`
|
|
89
|
+
|
|
90
|
+
`)}function He(e){return e?.length?e.filter(e=>e.kind===`image`&&e.data).map(e=>({type:`image`,data:e.data,mimeType:e.mimeType})):[]}function Ue(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 We(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 Ge(e,t){return e.some(e=>We(e,t))}const Ke=`slicc_oauth_extra_domains`;function N(e){try{let t=e.getItem(Ke);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 qe(e,t){try{e.setItem(Ke,JSON.stringify(t))}catch(e){throw Error(`Failed to persist OAuth extras (localStorage quota exceeded?): ${e instanceof Error?e.message:String(e)}`)}}var Je=e({addAccount:()=>nt,getAccounts:()=>K,getAllAvailableModels:()=>G,getAllExtraOAuthDomains:()=>tt,getApiKey:()=>ct,getApiKeyForProvider:()=>X,getApiVersionForProvider:()=>at,getAvailableProviders:()=>Ze,getBaseUrlForProvider:()=>Z,getDeploymentForProvider:()=>it,getExtraOAuthDomains:()=>q,getOAuthAccountInfo:()=>H,getProviderConfig:()=>z,getProviderModels:()=>V,getRawApiKeyForProvider:()=>rt,getSelectedModelId:()=>ot,getSelectedProvider:()=>Q,isModelHiddenFromPicker:()=>W,resolveCurrentModel:()=>$,resolveModelById:()=>lt,saveOAuthAccount:()=>Y,setExtraOAuthDomains:()=>et});const P=l,F=u,I=`slicc_accounts`,L=`selected-model`,Ye=[`slicc_provider`,`slicc_api_key`,`slicc_base_url`,`anthropic_api_key`,`api_provider`,`azure_resource`,`bedrock_region`];let R=!1;function Xe(){if(!R){R=!0;for(let e of Ye)try{localStorage.removeItem(e)}catch{}}}function Ze(){let e=c().filter(d),t=f();return[...new Set([...e,...t])]}function z(e){return p(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=s(Z(`bedrock-camp`)),t=F(`amazon-bedrock`).filter(t=>i(t,e)),n=new Set(t.map(e=>e.id)),r=a().filter(t=>i(t,e)&&!n.has(t.id));return[...t,...r].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 c())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`),Qe=[/haiku/i];function W(e){return Qe.some(t=>t.test(e))}function $e(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=$e(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(){Xe();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 N(localStorage)[e]??[]}function et(e,t){let n=N(localStorage),r=t.map(e=>e.trim()).filter(e=>e.length>0);r.length===0?delete n[e]:n[e]=r,qe(localStorage,n)}function tt(){return N(localStorage)}function J(e){localStorage.setItem(I,JSON.stringify(e))}function nt(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),J(a)}async function Y(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}),J(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,J(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,J(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 rt(e){let t=K().find(t=>t.providerId===e);return t&&(t.accessToken||t.apiKey)||null}function X(e){let t=K().find(t=>t.providerId===e);return t?t.accessToken||t.apiKey||(z(e).optionalApiKey?`local`:null):null}function Z(e){return K().find(t=>t.providerId===e)?.baseUrl??null}function it(e){return K().find(t=>t.providerId===e)?.deployment??null}function at(e){return K().find(t=>t.providerId===e)?.apiVersion??null}function ot(){let e=localStorage.getItem(L)||``,t=e.indexOf(`:`);return t>=0?e.slice(t+1):e}function st(){return localStorage.getItem(L)||``}function Q(){let e=st(),t=e.indexOf(`:`);if(t>0)return e.slice(0,t);let n=K();return n.length>0?n[0].providerId:`anthropic`}function ct(){return X(Q())}function lt(e){if(!e)return $();let t=Q(),n=Z(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=Q(),t=ot(),n=Z(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{te as C,ae as S,Le as _,Z as a,_e as b,Q as c,lt as d,Y as f,He as g,Ve as h,at as i,Je as l,Ue as m,G as n,it as o,Ge as p,ct as r,H as s,K as t,$ as u,Oe as v,ee as w,re as x,ye 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-
|
|
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-BHhe6xrk.js`),"./built-in/azure-openai.ts":()=>import(`./azure-openai-es2UEaVa.js`),"./built-in/bedrock-camp.ts":()=>import(`./bedrock-camp-KyNM28gW.js`).then(e=>e.n),"./built-in/local-llm.ts":()=>import(`./local-llm-D72tLY3Y.js`).then(e=>e.n)}),o=Object.assign({"/packages/webapp/providers/adobe.ts":()=>import(`./adobe-DCEW-jwu.js`),"/packages/webapp/providers/github.ts":()=>import(`./github-DZWbceUJ.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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./logger-B-No_qN_.js";var t=e(`secret-env`);function n(e){return/^[A-Za-z_][A-Za-z0-9_]*$/.test(e)}async function r(){if(typeof chrome<`u`&&chrome?.runtime?.id)return new Promise(e=>{chrome.runtime.sendMessage({type:`secrets.list-masked-entries`},r=>{let i=r,a={};for(let e of i?.entries??[])e.name&&e.maskedValue&&n(e.name)&&(a[e.name]=e.maskedValue);Object.keys(a).length>0&&t.info(`Loaded masked secrets into shell env from SW`,{count:Object.keys(a).length}),e(a)})});try{let e=await fetch(`/api/secrets/masked`);if(!e.ok)return t.warn(`Failed to fetch masked secrets`,{status:e.status}),{};let r=await e.json();if(!Array.isArray(r)||r.length===0)return{};let i={};for(let e of r)e.name&&e.maskedValue&&n(e.name)&&(i[e.name]=e.maskedValue);return Object.keys(i).length>0&&t.info(`Loaded masked secrets into shell env`,{count:Object.keys(i).length}),i}catch(e){return t.debug(`Could not fetch masked secrets (server may be unavailable)`,{error:e instanceof Error?e.message:String(e)}),{}}}export{r as fetchSecretEnvVars};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{OffscreenClient as e}from"./offscreen-client-
|
|
1
|
+
import{OffscreenClient as e}from"./offscreen-client-BQS5SL9t.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-BuJdZy5v.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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{p as e,x as t}from"./db-Cdoacmjm.js";const n=`slicc:last-seen-version`;function r(){return{version:`2.
|
|
1
|
+
import{p as e,x as t}from"./db-Cdoacmjm.js";const n=`slicc:last-seen-version`;function r(){return{version:`2.43.0`,releasedAt:`2026-05-11T21:02:33Z`}}async function i(){let t=await e(n);return t&&t.length>0?t:null}async function a(e){await t(n,e)}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};
|
package/dist/ui/index.html
CHANGED
|
@@ -5,20 +5,20 @@
|
|
|
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-Dbfn2pUX.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/simple-options-B0cR4giT.js">
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-CSp2DPSu.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/logger-B-No_qN_.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/path-utils-CNNVZ3-O.js">
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/fs-
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/fs-KzDX6lDt.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/tray-follower-status-DmK3Afse.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/mime-types-DL940yDZ.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/mount-picker-popup-BLHoVG3y.js">
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/mount-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/index-
|
|
21
|
-
<link rel="modulepreload" crossorigin href="/assets/provider-settings-
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/mount-zcpBZ465.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/index-Dbfn2pUX.js">
|
|
21
|
+
<link rel="modulepreload" crossorigin href="/assets/provider-settings-BJW3Z-UR.js">
|
|
22
22
|
<link rel="stylesheet" crossorigin href="/assets/index-RVLUy-Qx.css">
|
|
23
23
|
</head>
|
|
24
24
|
<body>
|
|
@@ -5,20 +5,20 @@
|
|
|
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-Dbfn2pUX.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/simple-options-B0cR4giT.js">
|
|
12
|
-
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-
|
|
12
|
+
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-CSp2DPSu.js">
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/logger-B-No_qN_.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/path-utils-CNNVZ3-O.js">
|
|
15
|
-
<link rel="modulepreload" crossorigin href="/assets/fs-
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/fs-KzDX6lDt.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/tray-follower-status-DmK3Afse.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/mime-types-DL940yDZ.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/mount-picker-popup-BLHoVG3y.js">
|
|
19
|
-
<link rel="modulepreload" crossorigin href="/assets/mount-
|
|
20
|
-
<link rel="modulepreload" crossorigin href="/assets/index-
|
|
21
|
-
<link rel="modulepreload" crossorigin href="/assets/provider-settings-
|
|
19
|
+
<link rel="modulepreload" crossorigin href="/assets/mount-zcpBZ465.js">
|
|
20
|
+
<link rel="modulepreload" crossorigin href="/assets/index-Dbfn2pUX.js">
|
|
21
|
+
<link rel="modulepreload" crossorigin href="/assets/provider-settings-BJW3Z-UR.js">
|
|
22
22
|
<link rel="stylesheet" crossorigin href="/assets/index-RVLUy-Qx.css">
|
|
23
23
|
</head>
|
|
24
24
|
<body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sliccy",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.43.0",
|
|
4
4
|
"description": "Browser-based coding agent with thin CLI server",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"node": ">=22.13.0"
|
|
25
25
|
},
|
|
26
26
|
"workspaces": [
|
|
27
|
+
"packages/shared-ts",
|
|
27
28
|
"packages/webapp",
|
|
28
29
|
"packages/node-server",
|
|
29
30
|
"packages/chrome-extension",
|
|
@@ -34,7 +35,7 @@
|
|
|
34
35
|
"scripts": {
|
|
35
36
|
"dev": "tsx packages/node-server/src/index.ts --dev",
|
|
36
37
|
"dev:electron": "tsx packages/node-server/src/index.ts --dev --electron",
|
|
37
|
-
"build": "npm run build -w @slicc/webapp && npm run build -w @slicc/node-server && npm run build -w @slicc/chrome-extension && npm run build -w @slicc/cloudflare-worker && npm run build -w @slicc/swift-server && npm run build -w @slicc/swift-launcher",
|
|
38
|
+
"build": "npm run build -w @slicc/shared-ts && npm run build -w @slicc/webapp && npm run build -w @slicc/node-server && npm run build -w @slicc/chrome-extension && npm run build -w @slicc/cloudflare-worker && npm run build -w @slicc/swift-server && npm run build -w @slicc/swift-launcher",
|
|
38
39
|
"start": "node dist/node-server/index.js",
|
|
39
40
|
"start:electron": "node dist/node-server/index.js --electron",
|
|
40
41
|
"preflight": "node packages/dev-tools/tools/preflight-deps.mjs",
|
|
@@ -84,7 +85,7 @@
|
|
|
84
85
|
"semantic-release": "25.0.3",
|
|
85
86
|
"tsx": "4.21.0",
|
|
86
87
|
"typescript": "^6.0.0",
|
|
87
|
-
"typescript-eslint": "8.59.
|
|
88
|
+
"typescript-eslint": "8.59.2",
|
|
88
89
|
"vite": "8.0.10",
|
|
89
90
|
"vitest": "4.1.5"
|
|
90
91
|
},
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Domain glob matching for secret domain allowlists.
|
|
3
|
-
*
|
|
4
|
-
* Supports patterns like:
|
|
5
|
-
* - `api.github.com` — exact match
|
|
6
|
-
* - `*.github.com` — matches any subdomain of github.com
|
|
7
|
-
* - `*` — matches any domain
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Check if a hostname matches a domain glob pattern.
|
|
11
|
-
*
|
|
12
|
-
* @param hostname - The hostname to check (e.g., "api.github.com")
|
|
13
|
-
* @param pattern - The glob pattern (e.g., "*.github.com")
|
|
14
|
-
* @returns true if the hostname matches the pattern
|
|
15
|
-
*/
|
|
16
|
-
export declare function matchDomain(hostname: string, pattern: string): boolean;
|
|
17
|
-
/**
|
|
18
|
-
* Check if a hostname matches any pattern in a list of domain globs.
|
|
19
|
-
*/
|
|
20
|
-
export declare function matchesDomains(hostname: string, patterns: string[]): boolean;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Domain glob matching for secret domain allowlists.
|
|
3
|
-
*
|
|
4
|
-
* Supports patterns like:
|
|
5
|
-
* - `api.github.com` — exact match
|
|
6
|
-
* - `*.github.com` — matches any subdomain of github.com
|
|
7
|
-
* - `*` — matches any domain
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Check if a hostname matches a domain glob pattern.
|
|
11
|
-
*
|
|
12
|
-
* @param hostname - The hostname to check (e.g., "api.github.com")
|
|
13
|
-
* @param pattern - The glob pattern (e.g., "*.github.com")
|
|
14
|
-
* @returns true if the hostname matches the pattern
|
|
15
|
-
*/
|
|
16
|
-
export function matchDomain(hostname, pattern) {
|
|
17
|
-
const h = hostname.toLowerCase();
|
|
18
|
-
const p = pattern.toLowerCase();
|
|
19
|
-
// Wildcard matches everything
|
|
20
|
-
if (p === '*')
|
|
21
|
-
return true;
|
|
22
|
-
// Exact match
|
|
23
|
-
if (h === p)
|
|
24
|
-
return true;
|
|
25
|
-
// Glob match: *.example.com matches sub.example.com but not example.com
|
|
26
|
-
if (p.startsWith('*.')) {
|
|
27
|
-
const suffix = p.slice(1); // ".example.com"
|
|
28
|
-
return h.endsWith(suffix) && h.length > suffix.length;
|
|
29
|
-
}
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Check if a hostname matches any pattern in a list of domain globs.
|
|
34
|
-
*/
|
|
35
|
-
export function matchesDomains(hostname, patterns) {
|
|
36
|
-
return patterns.some((pattern) => matchDomain(hostname, pattern));
|
|
37
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Secret masking engine for the node-server fetch proxy.
|
|
3
|
-
*
|
|
4
|
-
* This is a Node-specific copy of the core masking logic from
|
|
5
|
-
* packages/webapp/src/core/secret-masking.ts. Both must stay in sync.
|
|
6
|
-
*
|
|
7
|
-
* Uses Node's crypto.subtle (available since Node 15).
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Produce a deterministic, format-preserving masked value.
|
|
11
|
-
*/
|
|
12
|
-
export declare function mask(sessionId: string, secretName: string, realValue: string): Promise<string>;
|
|
13
|
-
export interface SecretPair {
|
|
14
|
-
realValue: string;
|
|
15
|
-
maskedValue: string;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Build a reusable scrubber function that replaces every occurrence
|
|
19
|
-
* of any `realValue` with its `maskedValue`.
|
|
20
|
-
*/
|
|
21
|
-
export declare function buildScrubber(secrets: SecretPair[]): (text: string) => string;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Secret masking engine for the node-server fetch proxy.
|
|
3
|
-
*
|
|
4
|
-
* This is a Node-specific copy of the core masking logic from
|
|
5
|
-
* packages/webapp/src/core/secret-masking.ts. Both must stay in sync.
|
|
6
|
-
*
|
|
7
|
-
* Uses Node's crypto.subtle (available since Node 15).
|
|
8
|
-
*/
|
|
9
|
-
import { subtle } from 'node:crypto';
|
|
10
|
-
// ---------- Known token prefixes ----------
|
|
11
|
-
const KNOWN_PREFIXES = [
|
|
12
|
-
'ghp_',
|
|
13
|
-
'gho_',
|
|
14
|
-
'ghu_',
|
|
15
|
-
'ghs_',
|
|
16
|
-
'ghr_',
|
|
17
|
-
'github_pat_',
|
|
18
|
-
'sk-',
|
|
19
|
-
'pk-',
|
|
20
|
-
'xoxb-',
|
|
21
|
-
'xoxp-',
|
|
22
|
-
'xoxa-',
|
|
23
|
-
'xoxs-',
|
|
24
|
-
'AKIA',
|
|
25
|
-
'ABIA',
|
|
26
|
-
'ACCA',
|
|
27
|
-
'ASIA',
|
|
28
|
-
'sk-ant-',
|
|
29
|
-
'Bearer ',
|
|
30
|
-
];
|
|
31
|
-
const SORTED_PREFIXES = [...KNOWN_PREFIXES].sort((a, b) => b.length - a.length);
|
|
32
|
-
function detectPrefix(value) {
|
|
33
|
-
for (const p of SORTED_PREFIXES) {
|
|
34
|
-
if (value.startsWith(p))
|
|
35
|
-
return p;
|
|
36
|
-
}
|
|
37
|
-
return '';
|
|
38
|
-
}
|
|
39
|
-
// ---------- HMAC-SHA256 ----------
|
|
40
|
-
async function hmacSha256(key, message) {
|
|
41
|
-
const enc = new TextEncoder();
|
|
42
|
-
const cryptoKey = await subtle.importKey('raw', enc.encode(key), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
43
|
-
const sig = await subtle.sign('HMAC', cryptoKey, enc.encode(message));
|
|
44
|
-
return new Uint8Array(sig);
|
|
45
|
-
}
|
|
46
|
-
function toHex(bytes) {
|
|
47
|
-
return Array.from(bytes)
|
|
48
|
-
.map((b) => b.toString(16).padStart(2, '0'))
|
|
49
|
-
.join('');
|
|
50
|
-
}
|
|
51
|
-
// ---------- Public API ----------
|
|
52
|
-
/**
|
|
53
|
-
* Produce a deterministic, format-preserving masked value.
|
|
54
|
-
*/
|
|
55
|
-
export async function mask(sessionId, secretName, realValue) {
|
|
56
|
-
const prefix = detectPrefix(realValue);
|
|
57
|
-
const remainder = realValue.slice(prefix.length);
|
|
58
|
-
const hmac = await hmacSha256(sessionId + secretName, realValue);
|
|
59
|
-
let hex = toHex(hmac);
|
|
60
|
-
while (hex.length < remainder.length)
|
|
61
|
-
hex += hex;
|
|
62
|
-
const maskedRemainder = hex.slice(0, remainder.length);
|
|
63
|
-
return prefix + maskedRemainder;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Build a reusable scrubber function that replaces every occurrence
|
|
67
|
-
* of any `realValue` with its `maskedValue`.
|
|
68
|
-
*/
|
|
69
|
-
export function buildScrubber(secrets) {
|
|
70
|
-
if (secrets.length === 0)
|
|
71
|
-
return (t) => t;
|
|
72
|
-
const sorted = [...secrets].sort((a, b) => b.realValue.length - a.realValue.length);
|
|
73
|
-
return (text) => {
|
|
74
|
-
let result = text;
|
|
75
|
-
for (const { realValue, maskedValue } of sorted) {
|
|
76
|
-
if (result.includes(realValue)) {
|
|
77
|
-
result = result.split(realValue).join(maskedValue);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return result;
|
|
81
|
-
};
|
|
82
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,d as t,t as n}from"./provider-settings-CvNDi0PS.js";import{d as r,f as i,l as a,p as o,u as s}from"./bedrock-camp-MgGI9Yh2.js";import{d as c,o as l,u}from"./transform-messages-BdxHijhT.js";const d=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 f(){let t=e(`adobe`);if(t)return t.replace(/\/$/,``);if(d.proxyEndpoint)return d.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const p=new Map,m=new Map;async function h(e){let t=p.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[A]:`2.42.0`}});if(t.ok){let n=await t.json();return p.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 p.set(e,n),n}function g(e){let t=e.clientId||d.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 _(e){return e.scopes||d.scopes}function v(e){return e.imsEnvironment||d.imsEnvironment||`prod`}const y={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function b(e){return y[e??d.imsEnvironment??`prod`]??y.prod}const x=typeof chrome<`u`&&!!chrome?.runtime?.id;function S(){return n().find(e=>e.providerId===`adobe`)}async function C(e,t){try{let n=await fetch(`${b(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 w(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 T={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!d.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=m.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 I.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 p.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=await h(f()),i=g(r),a=_(r),o=v(r),s=x?d.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:d.redirectUri??`${window.location.origin}/auth/callback`,c=x?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});c&&u.set(`state`,c);let p=await e(`${b(o)}/ims/authorize/v2?${u}`);if(!p)return;if(l&&p)try{if(new URL(p).searchParams.get(`nonce`)!==l){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 m=w(p);if(!m){console.error(`[adobe] Could not extract token from redirect URL`);return}let y=await C(m.accessToken,o);t({providerId:`adobe`,accessToken:m.accessToken,tokenExpiresAt:Date.now()+m.expiresIn*1e3,userName:y.name,userAvatar:y.avatar}),await L().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),n()},onOAuthLogout:async()=>{let e=S();if(e?.accessToken)try{let t=p.values().next().value??{},n=t.clientId||d.clientId,r=v(t);if(n){let t=await fetch(`${b(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))}t({providerId:`adobe`,accessToken:``})}};let E=null;async function D(){let e=S();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 k();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=S();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function O(){let e=S();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function k(){return E||(E=(async()=>{try{let e=await h(f()),n=g(e),r=_(e),i=v(e),a=x?d.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:d.redirectUri??`${window.location.origin}/auth/callback`,o=x?void 0:btoa(JSON.stringify({port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),s=o?JSON.parse(atob(o)).nonce:null,c=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:a,prompt:`none`});o&&c.set(`state`,o);let l=`${b(i)}/ims/authorize/v2?${c}`,{createOAuthLauncher:u}=await import(`./oauth-service-BOg00ewY.js`),p=await u()(l);if(!p)return null;if(s&&p)try{if(new URL(p).searchParams.get(`nonce`)!==s)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 m=w(p);if(!m)return null;let y=S();return t({providerId:`adobe`,accessToken:m.accessToken,tokenExpiresAt:Date.now()+m.expiresIn*1e3,userName:y?.userName,userAvatar:y?.userAvatar}),console.log(`[adobe] Token renewed silently`),await L().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),m.accessToken}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}finally{E=null}})(),E)}const A=`X-Slicc-Version`;function j(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[A]=`2.42.0`,{...e,headers:t}}function M(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 N=(e,t,n={})=>{let r=l();return(async()=>{try{let i=await D();if(String(e.api).includes(`openai`)){let a=s({...e,baseUrl:`${f()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,j({...n,apiKey:i}));for await(let e of a)r.push(e)}else{let o=a({...e,baseUrl:f(),api:`anthropic-messages`},t,j({...n,apiKey:i}));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(M(e,t)),r.end()}})(),r},P=(e,t,n)=>{let a=l();return(async()=>{try{let o=await D();if(String(e.api).includes(`openai`)){let r=i({...e,baseUrl:`${f()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,j({...n,apiKey:o}));for await(let e of r)a.push(e)}else{let i=r({...e,baseUrl:f(),api:`anthropic-messages`},t,j({...n,apiKey:o}));for await(let e of i)a.push(e)}a.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),a.push(M(e,t)),a.end()}})(),a};async function F(){try{let e=await D(),t=f(),n=await fetch(`${t}/v1/models`,{headers:{Authorization:`Bearer ${e}`,[A]:`2.42.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),m.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 I=new Map;async function L(){let e=f(),t=I.get(e);if(t)return t;let n=await F();return I.set(e,n),n}function R(){o({api:`adobe-anthropic`,stream:N,streamSimple:P}),o({api:`adobe-openai`,stream:N,streamSimple:P})}export{T as config,L as getAdobeModels,D as getValidAccessToken,O as isTokenExpired,R as register};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e,r as t,s as n}from"./provider-settings-DUgrWSPY.js";import{t as r}from"./preload-helper-ca-nBW7U.js";import{c as i,l as a,o,s,u as c}from"./bedrock-camp-CHTXSY1O.js";import{d as l,o as u,u as d}from"./simple-options-B0cR4giT.js";var f=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 p(){let e=n(`adobe`);if(e)return e.replace(/\/$/,``);if(f.proxyEndpoint)return f.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}var m=new Map,h=new Map;async function g(e){let t=m.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[j]:`2.42.0`}});if(t.ok){let n=await t.json();return m.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 m.set(e,n),n}function _(e){let t=e.clientId||f.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 v(e){return e.scopes||f.scopes}function y(e){return e.imsEnvironment||f.imsEnvironment||`prod`}var b={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function x(e){return b[e??f.imsEnvironment??`prod`]??b.prod}var S=typeof chrome<`u`&&!!chrome?.runtime?.id;function C(){return t().find(e=>e.providerId===`adobe`)}async function w(e,t){try{let n=await fetch(`${x(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 T(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 E={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!f.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=h.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 L.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 m.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(t,n)=>{let r=await g(p()),i=_(r),a=v(r),o=y(r),s=S?f.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:f.redirectUri??`${window.location.origin}/auth/callback`,c=S?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});c&&u.set(`state`,c);let d=await t(`${x(o)}/ims/authorize/v2?${u}`);if(!d)return;if(l&&d)try{if(new URL(d).searchParams.get(`nonce`)!==l){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 m=T(d);if(!m){console.error(`[adobe] Could not extract token from redirect URL`);return}let h=await w(m.accessToken,o);e({providerId:`adobe`,accessToken:m.accessToken,tokenExpiresAt:Date.now()+m.expiresIn*1e3,userName:h.name,userAvatar:h.avatar}),await R().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),n()},onOAuthLogout:async()=>{let t=C();if(t?.accessToken)try{let e=m.values().next().value??{},n=e.clientId||f.clientId,r=y(e);if(n){let e=await fetch(`${x(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:t.accessToken,token_type_hint:`access_token`,client_id:n})});e.ok||console.warn(`[adobe] Token revocation returned ${e.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}e({providerId:`adobe`,accessToken:``})}},D=null;async function O(){let e=C();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 A();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=C();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function k(){let e=C();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function A(){return D||(D=(async()=>{try{let t=await g(p()),n=_(t),i=v(t),a=y(t),o=S?f.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:f.redirectUri??`${window.location.origin}/auth/callback`,s=S?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:n,scope:i,response_type:`token`,redirect_uri:o,prompt:`none`});s&&l.set(`state`,s);let u=`${x(a)}/ims/authorize/v2?${l}`,{createOAuthLauncher:d}=await r(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service-CfTUWB9P.js`);return{createOAuthLauncher:e}},[]),m=await d()(u);if(!m)return null;if(c&&m)try{if(new URL(m).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=T(m);if(!h)return null;let b=C();return e({providerId:`adobe`,accessToken:h.accessToken,tokenExpiresAt:Date.now()+h.expiresIn*1e3,userName:b?.userName,userAvatar:b?.userAvatar}),console.log(`[adobe] Token renewed silently`),await R().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{D=null}})(),D)}var j=`X-Slicc-Version`;function M(e){let t={},n=j.toLowerCase();if(e.headers)for(let[r,i]of Object.entries(e.headers))r.toLowerCase()!==n&&(t[r]=i);return t[j]=`2.42.0`,{...e,headers:t}}function N(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 P=(e,t,n={})=>{let r=u();return(async()=>{try{let i=await O();if(String(e.api).includes(`openai`)){let a=s({...e,baseUrl:`${p()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,M({...n,apiKey:i}));for await(let e of a)r.push(e)}else{let a=o({...e,baseUrl:p(),api:`anthropic-messages`},t,M({...n,apiKey:i}));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(N(e,t)),r.end()}})(),r},F=(e,t,n)=>{let r=u();return(async()=>{try{let o=await O();if(String(e.api).includes(`openai`)){let i=a({...e,baseUrl:`${p()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,M({...n,apiKey:o}));for await(let e of i)r.push(e)}else{let a=i({...e,baseUrl:p(),api:`anthropic-messages`},t,M({...n,apiKey:o}));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(N(e,t)),r.end()}})(),r};async function I(){try{let e=await O(),t=p(),n=await fetch(`${t}/v1/models`,{headers:{Authorization:`Bearer ${e}`,[j]:`2.42.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),h.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 L=new Map;async function R(){let e=p(),t=L.get(e);if(t)return t;let n=await I();return L.set(e,n),n}function z(){c({api:`adobe-anthropic`,stream:P,streamSimple:F}),c({api:`adobe-openai`,stream:P,streamSimple:F})}export{E as config,R as getAdobeModels,O as getValidAccessToken,k as isTokenExpired,z as register};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./index-DOah61oi.js";function e(e){}export{e as registerSessionCostsProvider};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{S as e,d as t,t as n,x as r}from"./provider-settings-CvNDi0PS.js";import{f as i,p as a,u as o}from"./bedrock-camp-MgGI9Yh2.js";import{o as s}from"./transform-messages-BdxHijhT.js";import{i as c}from"./kernel-worker-Ct6nuQEv.js";var l={clientId:``,scopes:`repo,read:user,user:email`};function u(){try{let t=localStorage.getItem(e);if(t)return t.replace(/\/$/,``)}catch{}return r}async function d(e){let t=`${u()}/oauth/token`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:e.provider,code:e.code,redirect_uri:e.redirectUri})}),r;try{r=await n.json()}catch{throw Error(`Token exchange failed (HTTP ${n.status}): non-JSON response`)}if(!n.ok&&n.status!==200){let e=r.error_description??r.error??`Token exchange failed (HTTP ${n.status})`;throw Error(e)}if(r.error){let e=r.error_description??r.error;throw Error(e)}return r}async function f(e){let t=`${u()}/oauth/revoke`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:e.provider,access_token:e.accessToken})});if(!(n.status===204||n.ok)){if(n.status===400)try{if((await n.json()).error===`unsupported`)return}catch{}throw Error(`Token revocation failed (HTTP ${n.status})`)}}const p=Object.assign({"/packages/webapp/providers/github-config.json":l})[`/packages/webapp/providers/github-config.json`]??{clientId:``,scopes:`repo,read:user,user:email`};let m=null,h=null;async function g(){if(m)return m;if(_){try{let e=await fetch(`${u()}/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return m=t.oauth.github,m}}catch{}return p.clientId}try{let e=await fetch(`/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return m=t.oauth.github,m;if(t.trayWorkerBaseUrl){h=t.trayWorkerBaseUrl;let e=await fetch(`${t.trayWorkerBaseUrl}/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return m=t.oauth.github,m}}}}catch{}return p.clientId}const _=typeof chrome<`u`&&!!chrome?.runtime?.id;function v(){return n().find(e=>e.providerId===`github`)}function y(e){try{return new URL(e).searchParams.get(`code`)}catch{return null}}async function b(e){try{let t=await fetch(`https://api.github.com/user`,{headers:{Authorization:`Bearer ${e}`,Accept:`application/vnd.github+json`}});if(t.ok){let e=await t.json();return{name:e.name||e.login,avatar:e.avatar_url,login:e.login,id:e.id}}}catch(e){console.warn(`[github] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function x(e,t){return`${e}+${t}@users.noreply.github.com`}async function S(e){try{let{VirtualFS:t}=await import(`./fs-CJrk6h4U.js`).then(e=>e.t);await(await t.create({dbName:c})).writeFile(`/workspace/.git/github-token`,e),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`github-token-changed`))}catch(e){console.warn(`[github] Failed to write git token:`,e instanceof Error?e.message:String(e))}}async function C(){try{let{VirtualFS:e}=await import(`./fs-CJrk6h4U.js`).then(e=>e.t);await(await e.create({dbName:c})).rm(`/workspace/.git/github-token`),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`github-token-changed`))}catch{}}async function w(e){if(!(!e.login||e.id===void 0))try{let{VirtualFS:t}=await import(`./fs-CJrk6h4U.js`).then(e=>e.t),{readGlobalGitConfigValue:n,writeGlobalGitConfigValue:r}=await import(`./git-config-CdPD25HI.js`).then(e=>e.n),i=await t.create({dbName:c}),a=e.name||e.login,o=x(e.id,e.login);!await n(i,`user.name`)&&a&&await r(i,`user.name`,a),await n(i,`user.email`)||await r(i,`user.email`,o)}catch(e){console.warn(`[github] Failed to seed git identity:`,e instanceof Error?e.message:String(e))}}async function T(){let e=v();if(!e?.accessToken)throw Error(`Not logged in to GitHub — please log in first`);return e.accessToken}const E=`https://models.github.ai/inference`,D=[{id:`openai/gpt-4.1`,name:`GPT-4.1`,api:`openai`,context_window:1047576,max_tokens:32768,reasoning:!1,input:[`text`,`image`]},{id:`openai/gpt-4.1-mini`,name:`GPT-4.1 mini`,api:`openai`,context_window:1047576,max_tokens:32768,reasoning:!1,input:[`text`,`image`]}];function O(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`github-openai`,provider:`github`,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 k=(e,t,n={})=>{let r=s();return(async()=>{try{let i=await T(),a=o({...e,baseUrl:E,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1,supportsUsageInStreaming:!1,maxTokensField:`max_tokens`}},t,{...n,apiKey:i});for await(let e of a)r.push(e);r.end()}catch(t){console.error(`[github] Stream error:`,t instanceof Error?t.message:String(t)),r.push(O(e,t)),r.end()}})(),r},A=(e,t,n)=>{let r=s();return(async()=>{try{let a=await T(),o=i({...e,baseUrl:E,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1,supportsUsageInStreaming:!1,maxTokensField:`max_tokens`}},t,{...n,apiKey:a});for await(let e of o)r.push(e);r.end()}catch(t){console.error(`[github] Stream error:`,t instanceof Error?t.message:String(t)),r.push(O(e,t)),r.end()}})(),r},j={id:`github`,name:`GitHub`,description:`GitHub Models + git authentication — login with your GitHub account`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:`gpt-4.1`,getModelIds:()=>D,onOAuthLogin:async(e,n,r)=>{let i=await g();if(!i)throw Error(`GitHub OAuth not configured — no client ID available`);let a=r?.scopes??p.scopes,o=_?`${u()}/auth/callback`:`${h??window.location.origin}/auth/callback`,s=crypto.randomUUID(),c=_?chrome.runtime.id:``,l=_?{source:`extension`,extensionId:c,path:`/github`,nonce:s}:{port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:s},f=btoa(JSON.stringify(l)),m=s,v=new URLSearchParams({client_id:i,scope:a,redirect_uri:o});f&&v.set(`state`,f);let x=await e(`https://github.com/login/oauth/authorize?${v}`);if(!x)return;if(m)try{if(new URL(x).searchParams.get(`nonce`)!==m){console.error(`[github] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[github] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let C=y(x);if(!C){console.error(`[github] Could not extract authorization code from redirect URL`);return}let T=await d({provider:`github`,code:C,redirectUri:o}),E=await b(T.access_token);t({providerId:`github`,accessToken:T.access_token,userName:E.name,userAvatar:E.avatar}),await S(T.access_token),await w(E),n()},onOAuthLogout:async()=>{let e=v();e?.accessToken&&await f({provider:`github`,accessToken:e.accessToken}).catch(e=>console.warn(`[github] Token revocation failed:`,e instanceof Error?e.message:String(e))),await C(),t({providerId:`github`,accessToken:``})}};function M(){a({api:`github-openai`,stream:k,streamSimple:A})}export{x as buildNoreplyEmail,j as config,y as extractCodeFromUrl,T as getValidAccessToken,M as register,w as syncGitIdentityFromGitHub};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/fs-IOuBZ0fU.js","assets/chunk-jRWAZmH_.js","assets/index-DOah61oi.js","assets/preload-helper-ca-nBW7U.js","assets/provider-settings-DUgrWSPY.js","assets/bedrock-camp-CHTXSY1O.js","assets/simple-options-B0cR4giT.js","assets/tray-follower-status-DmK3Afse.js","assets/logger-B-No_qN_.js","assets/mime-types-DL940yDZ.js","assets/mount-picker-popup-BLHoVG3y.js","assets/mount-d5zFj5UF.js","assets/path-utils-CNNVZ3-O.js","assets/index-RVLUy-Qx.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{_ as e,r as t}from"./provider-settings-DUgrWSPY.js";import{t as n}from"./preload-helper-ca-nBW7U.js";import{l as r,s as i,u as a}from"./bedrock-camp-CHTXSY1O.js";import{o}from"./simple-options-B0cR4giT.js";import{a as s,r as c}from"./tray-follower-status-DmK3Afse.js";var l={clientId:``,scopes:`repo,read:user,user:email`};function u(){try{let e=localStorage.getItem(s);if(e)return e.replace(/\/$/,``)}catch{}return c}async function d(e){let t=`${u()}/oauth/token`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:e.provider,code:e.code,redirect_uri:e.redirectUri})}),r;try{r=await n.json()}catch{throw Error(`Token exchange failed (HTTP ${n.status}): non-JSON response`)}if(!n.ok&&n.status!==200){let e=r.error_description??r.error??`Token exchange failed (HTTP ${n.status})`;throw Error(e)}if(r.error){let e=r.error_description??r.error;throw Error(e)}return r}async function f(e){let t=`${u()}/oauth/revoke`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:e.provider,access_token:e.accessToken})});if(!(n.status===204||n.ok)){if(n.status===400)try{if((await n.json()).error===`unsupported`)return}catch{}throw Error(`Token revocation failed (HTTP ${n.status})`)}}var p=`slicc-fs-global`,m=Object.assign({"/packages/webapp/providers/github-config.json":l})[`/packages/webapp/providers/github-config.json`]??{clientId:``,scopes:`repo,read:user,user:email`},h=null,g=null;async function _(){if(h)return h;if(v){try{let e=await fetch(`${u()}/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return h=t.oauth.github,h}}catch{}return m.clientId}try{let e=await fetch(`/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return h=t.oauth.github,h;if(t.trayWorkerBaseUrl){g=t.trayWorkerBaseUrl;let e=await fetch(`${t.trayWorkerBaseUrl}/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return h=t.oauth.github,h}}}}catch{}return m.clientId}var v=typeof chrome<`u`&&!!chrome?.runtime?.id;function y(){return t().find(e=>e.providerId===`github`)}function b(e){try{return new URL(e).searchParams.get(`code`)}catch{return null}}async function x(e){try{let t=await fetch(`https://api.github.com/user`,{headers:{Authorization:`Bearer ${e}`,Accept:`application/vnd.github+json`}});if(t.ok){let e=await t.json();return{name:e.name||e.login,avatar:e.avatar_url,login:e.login,id:e.id}}}catch(e){console.warn(`[github] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function S(e,t){return`${e}+${t}@users.noreply.github.com`}async function C(e){try{let{VirtualFS:t}=await n(async()=>{let{VirtualFS:e}=await import(`./fs-IOuBZ0fU.js`).then(e=>e.t);return{VirtualFS:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]));await(await t.create({dbName:p})).writeFile(`/workspace/.git/github-token`,e),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`github-token-changed`))}catch(e){console.warn(`[github] Failed to write git token:`,e instanceof Error?e.message:String(e))}}async function w(){try{let{VirtualFS:e}=await n(async()=>{let{VirtualFS:e}=await import(`./fs-IOuBZ0fU.js`).then(e=>e.t);return{VirtualFS:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]));await(await e.create({dbName:p})).rm(`/workspace/.git/github-token`),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`github-token-changed`))}catch{}}async function T(e){if(!(!e.login||e.id===void 0))try{let{VirtualFS:t}=await n(async()=>{let{VirtualFS:e}=await import(`./fs-IOuBZ0fU.js`).then(e=>e.t);return{VirtualFS:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13])),{readGlobalGitConfigValue:r,writeGlobalGitConfigValue:i}=await n(async()=>{let{readGlobalGitConfigValue:e,writeGlobalGitConfigValue:t}=await import(`./git-config-BoQzX7Xi.js`);return{readGlobalGitConfigValue:e,writeGlobalGitConfigValue:t}},[]),a=await t.create({dbName:p}),o=e.name||e.login,s=S(e.id,e.login);!await r(a,`user.name`)&&o&&await i(a,`user.name`,o),await r(a,`user.email`)||await i(a,`user.email`,s)}catch(e){console.warn(`[github] Failed to seed git identity:`,e instanceof Error?e.message:String(e))}}async function E(){let e=y();if(!e?.accessToken)throw Error(`Not logged in to GitHub — please log in first`);return e.accessToken}var D=`https://models.github.ai/inference`,O=[{id:`openai/gpt-4.1`,name:`GPT-4.1`,api:`openai`,context_window:1047576,max_tokens:32768,reasoning:!1,input:[`text`,`image`]},{id:`openai/gpt-4.1-mini`,name:`GPT-4.1 mini`,api:`openai`,context_window:1047576,max_tokens:32768,reasoning:!1,input:[`text`,`image`]}];function k(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`github-openai`,provider:`github`,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 A=(e,t,n={})=>{let r=o();return(async()=>{try{let a=await E(),o=i({...e,baseUrl:D,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1,supportsUsageInStreaming:!1,maxTokensField:`max_tokens`}},t,{...n,apiKey:a});for await(let e of o)r.push(e);r.end()}catch(t){console.error(`[github] Stream error:`,t instanceof Error?t.message:String(t)),r.push(k(e,t)),r.end()}})(),r},j=(e,t,n)=>{let i=o();return(async()=>{try{let a=await E(),o=r({...e,baseUrl:D,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1,supportsUsageInStreaming:!1,maxTokensField:`max_tokens`}},t,{...n,apiKey:a});for await(let e of o)i.push(e);i.end()}catch(t){console.error(`[github] Stream error:`,t instanceof Error?t.message:String(t)),i.push(k(e,t)),i.end()}})(),i},M={id:`github`,name:`GitHub`,description:`GitHub Models + git authentication — login with your GitHub account`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:`gpt-4.1`,getModelIds:()=>O,onOAuthLogin:async(t,n,r)=>{let i=await _();if(!i)throw Error(`GitHub OAuth not configured — no client ID available`);let a=r?.scopes??m.scopes,o=v?`${u()}/auth/callback`:`${g??window.location.origin}/auth/callback`,s=crypto.randomUUID(),c=v?chrome.runtime.id:``,l=v?{source:`extension`,extensionId:c,path:`/github`,nonce:s}:{port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:s},f=btoa(JSON.stringify(l)),p=s,h=new URLSearchParams({client_id:i,scope:a,redirect_uri:o});f&&h.set(`state`,f);let y=await t(`https://github.com/login/oauth/authorize?${h}`);if(!y)return;if(p)try{if(new URL(y).searchParams.get(`nonce`)!==p){console.error(`[github] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[github] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let S=b(y);if(!S){console.error(`[github] Could not extract authorization code from redirect URL`);return}let w=await d({provider:`github`,code:S,redirectUri:o}),E=await x(w.access_token);e({providerId:`github`,accessToken:w.access_token,userName:E.name,userAvatar:E.avatar}),await C(w.access_token),await T(E),n()},onOAuthLogout:async()=>{let t=y();t?.accessToken&&await f({provider:`github`,accessToken:t.accessToken}).catch(e=>console.warn(`[github] Token revocation failed:`,e instanceof Error?e.message:String(e))),await w(),e({providerId:`github`,accessToken:``})}};function N(){a({api:`github-openai`,stream:A,streamSimple:j})}export{S as buildNoreplyEmail,M as config,b as extractCodeFromUrl,E as getValidAccessToken,N as register,T as syncGitIdentityFromGitHub};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=typeof chrome<`u`&&!!chrome?.runtime?.id;function t(){return e?r:n}async function n(e){return new Promise(t=>{let n=window.open(e,`_blank`,`width=500,height=700,popup=yes`),r=!1,i=null,a=()=>{r||(r=!0,window.removeEventListener(`message`,o),clearTimeout(s),i&&clearInterval(i))},o=e=>{if(e.data?.type===`oauth-callback`){if(a(),e.data.error){console.error(`[oauth-service] CLI OAuth error:`,e.data.error),t(null);return}t(e.data.redirectUrl??null)}};window.addEventListener(`message`,o),(location.pathname.startsWith(`/electron`)||new URLSearchParams(location.search).get(`runtime`)===`electron-overlay`)&&(i=setInterval(async()=>{if(!r)try{let e=await fetch(`/api/oauth-result`);if(e.status===204)return;let n=await e.json();if(r)return;if(a(),n.error){console.error(`[oauth-service] Server relay OAuth error:`,n.error),t(null);return}t(n.redirectUrl??null)}catch(e){console.warn(`[oauth-service] Poll failed:`,e instanceof Error?e.message:String(e))}},1e3));let s=setTimeout(()=>{a();try{n?.close()}catch{}t(null)},12e4)})}async function r(e){return new Promise(t=>{let n=!1,r=()=>{n||(n=!0,chrome.runtime.onMessage.removeListener(i),clearTimeout(a))},i=e=>{if(e?.source===`service-worker`&&e?.payload?.type===`oauth-result`){if(r(),e.payload.error){console.error(`[oauth-service] Extension OAuth error:`,e.payload.error),t(null);return}t(e.payload.redirectUrl??null)}};chrome.runtime.onMessage.addListener(i),chrome.runtime.sendMessage({source:`panel`,payload:{type:`oauth-request`,providerId:`oauth`,authorizeUrl:e}}).catch(e=>{console.error(`[oauth-service] Failed to send OAuth request to service worker:`,e)});let a=setTimeout(()=>{r(),t(null)},12e4)})}export{t as createOAuthLauncher};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=typeof chrome<`u`&&!!chrome?.runtime?.id;function t(){return e?r:n}async function n(e){return new Promise(t=>{let n=window.open(e,`_blank`,`width=500,height=700,popup=yes`),r=!1,i=null,a=()=>{r||(r=!0,window.removeEventListener(`message`,o),clearTimeout(s),i&&clearInterval(i))},o=e=>{if(e.data?.type===`oauth-callback`){if(a(),e.data.error){console.error(`[oauth-service] CLI OAuth error:`,e.data.error),t(null);return}t(e.data.redirectUrl??null)}};window.addEventListener(`message`,o),(location.pathname.startsWith(`/electron`)||new URLSearchParams(location.search).get(`runtime`)===`electron-overlay`)&&(i=setInterval(async()=>{if(!r)try{let e=await fetch(`/api/oauth-result`);if(e.status===204)return;let n=await e.json();if(r)return;if(a(),n.error){console.error(`[oauth-service] Server relay OAuth error:`,n.error),t(null);return}t(n.redirectUrl??null)}catch(e){console.warn(`[oauth-service] Poll failed:`,e instanceof Error?e.message:String(e))}},1e3));let s=setTimeout(()=>{a();try{n?.close()}catch{}t(null)},12e4)})}async function r(e){return new Promise(t=>{let n=!1,r=()=>{n||(n=!0,chrome.runtime.onMessage.removeListener(i),clearTimeout(a))},i=e=>{if(e?.source===`service-worker`&&e?.payload?.type===`oauth-result`){if(r(),e.payload.error){console.error(`[oauth-service] Extension OAuth error:`,e.payload.error),t(null);return}t(e.payload.redirectUrl??null)}};chrome.runtime.onMessage.addListener(i),chrome.runtime.sendMessage({source:`panel`,payload:{type:`oauth-request`,providerId:`oauth`,authorizeUrl:e}}).catch(e=>{console.error(`[oauth-service] Failed to send OAuth request to service worker:`,e)});let a=setTimeout(()=>{r(),t(null)},12e4)})}export{t as createOAuthLauncher};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(e){return!e.includes(`\0`)}function t(t){if(typeof window>`u`||window.localStorage===void 0)return()=>void 0;let n=window.localStorage,r=n.setItem.bind(n),i=n.removeItem.bind(n),a=n.clear.bind(n),o=(e,t)=>{Object.defineProperty(n,e,{value:t,writable:!0,configurable:!0,enumerable:!1})};o(`setItem`,(n,i)=>{if(r(n,i),!e(n)){console.warn(`[page-storage-sync] dropping localStorage write with NUL in key`,n);return}t.send({type:`local-storage-set`,key:n,value:i})}),o(`removeItem`,n=>{if(i(n),!e(n)){console.warn(`[page-storage-sync] dropping localStorage remove with NUL in key`,n);return}t.send({type:`local-storage-remove`,key:n})}),o(`clear`,()=>{a(),t.send({type:`local-storage-clear`})});let s=r=>{if(r.storageArea===n){if(r.key===null){t.send({type:`local-storage-clear`});return}if(e(r.key)){if(r.newValue===null){t.send({type:`local-storage-remove`,key:r.key});return}t.send({type:`local-storage-set`,key:r.key,value:r.newValue})}}};return window.addEventListener(`storage`,s),()=>{o(`setItem`,r),o(`removeItem`,i),o(`clear`,a),window.removeEventListener(`storage`,s)}}export{t as installPageStorageSync};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
function e(){return{"page-info":()=>({origin:window.location.origin,href:window.location.href,title:document.title||``}),screencapture:async({mimeType:e,quality:t})=>{let i=await n(e,t),a=await i.arrayBuffer(),o=await r(i);return{bytes:a,width:o.width,height:o.height,mimeType:e}},"speak-text":async({text:e,lang:t,voice:n,rate:r,pitch:i,volume:a})=>{if(typeof speechSynthesis>`u`)throw Error(`speechSynthesis is unavailable in this page`);return await new Promise((o,s)=>{let c=new SpeechSynthesisUtterance(e);if(t!==void 0&&(c.lang=t),r!==void 0&&(c.rate=r),i!==void 0&&(c.pitch=i),a!==void 0&&(c.volume=a),n){let e=speechSynthesis.getVoices().find(e=>e.name===n);e&&(c.voice=e)}c.onend=()=>o(),c.onerror=e=>s(Error(`speak: ${e.error||`utterance failed`}`)),speechSynthesis.speak(c)}),{done:!0}},"list-voices":async()=>{if(typeof speechSynthesis>`u`)throw Error(`speechSynthesis is unavailable in this page`);let e=speechSynthesis.getVoices();return e.length>0?{voices:e.map(t)}:{voices:(await new Promise(e=>{let t=()=>{speechSynthesis.removeEventListener(`voiceschanged`,t),e(speechSynthesis.getVoices())};speechSynthesis.addEventListener(`voiceschanged`,t),setTimeout(()=>{speechSynthesis.removeEventListener(`voiceschanged`,t),e(speechSynthesis.getVoices())},1e3)})).map(t)}},"play-audio":async({bytes:e,volume:t})=>{if(typeof AudioContext>`u`)throw Error(`Web Audio API is unavailable in this page`);let n=new AudioContext;try{let r=await n.decodeAudioData(e.slice(0)),i=n.createBufferSource();if(i.buffer=r,t!==void 0){let e=n.createGain();e.gain.value=Math.max(0,Math.min(1,t)),i.connect(e),e.connect(n.destination)}else i.connect(n.destination);await new Promise(e=>{i.onended=()=>e(),i.start()})}finally{try{await n.close()}catch{}}return{done:!0}},"play-chime":async({tone:e})=>{let t={success:[880,1320],error:[440,220],notify:[660,660]},[n,r]=t[e??`notify`]??t.notify;if(typeof AudioContext>`u`)throw Error(`Web Audio API is unavailable in this page`);let i=new AudioContext;try{let e=i.currentTime;for(let[t,a]of[n,r].entries()){let n=i.createOscillator();n.type=`sine`,n.frequency.value=a;let r=i.createGain();r.gain.setValueAtTime(1e-4,e+t*.18),r.gain.exponentialRampToValueAtTime(.2,e+t*.18+.02),r.gain.exponentialRampToValueAtTime(1e-4,e+t*.18+.18),n.connect(r),r.connect(i.destination),n.start(e+t*.18),n.stop(e+t*.18+.2)}await new Promise(e=>setTimeout(e,450))}finally{try{await i.close()}catch{}}return{done:!0}},"clipboard-read-text":async()=>{if(!navigator.clipboard?.readText)throw Error(`clipboard API unavailable`);return{text:await navigator.clipboard.readText()}},"clipboard-write-text":async({text:e})=>{if(!navigator.clipboard?.writeText)throw Error(`clipboard API unavailable`);return await a(),await navigator.clipboard.writeText(e),{done:!0}},"clipboard-write-image":async({bytes:e,mimeType:t})=>{if(!navigator.clipboard?.write||typeof ClipboardItem>`u`)throw Error(`clipboard image API unavailable`);let n,r=new Blob([e],{type:t});return n=t===`image/png`?r:await i(r),await a(),await navigator.clipboard.write([new ClipboardItem({"image/png":n})]),{done:!0}},"window-open":async({url:e,target:t,features:n})=>({opened:window.open(e,t??`_blank`,n??`noopener,noreferrer`)!==null})}}function t(e){return{name:e.name,lang:e.lang,default:e.default}}async function n(e,t){if(!navigator.mediaDevices?.getDisplayMedia)throw Error(`screen capture is not supported in this browser`);let n=await navigator.mediaDevices.getDisplayMedia({video:!0,audio:!1});try{let r=document.createElement(`video`);r.srcObject=n,r.muted=!0,r.playsInline=!0,await new Promise((e,t)=>{r.onloadedmetadata=()=>r.play().then(()=>e()).catch(t),r.onerror=()=>t(Error(`Failed to load video stream`))}),await new Promise(e=>requestAnimationFrame(()=>e()));let i=r.videoWidth,a=r.videoHeight,o=document.createElement(`canvas`);o.width=i,o.height=a;let s=o.getContext(`2d`);if(!s)throw Error(`Failed to get canvas context`);return s.drawImage(r,0,0,i,a),await new Promise((n,r)=>{o.toBlob(e=>e?n(e):r(Error(`Failed to create image blob`)),e,t)})}finally{n.getTracks().forEach(e=>e.stop())}}async function r(e){let t=URL.createObjectURL(e);try{let e=new Image;return await new Promise((n,r)=>{e.onload=()=>n(),e.onerror=()=>r(Error(`Failed to decode capture`)),e.src=t}),{width:e.naturalWidth,height:e.naturalHeight}}finally{URL.revokeObjectURL(t)}}async function i(e){let t=URL.createObjectURL(e);try{let e=new Image;await new Promise((n,r)=>{e.onload=()=>n(),e.onerror=()=>r(Error(`Failed to load image for clipboard conversion`)),e.src=t});let n=document.createElement(`canvas`);n.width=e.naturalWidth,n.height=e.naturalHeight;let r=n.getContext(`2d`);if(!r)throw Error(`Failed to get canvas context`);return r.drawImage(e,0,0),await new Promise((e,t)=>{n.toBlob(n=>n?e(n):t(Error(`PNG re-encode failed`)),`image/png`)})}finally{URL.revokeObjectURL(t)}}async function a(e=5*6e4){typeof document>`u`||typeof document.hasFocus==`function`&&(document.hasFocus()||await new Promise((t,n)=>{let r=()=>{window.removeEventListener(`focus`,i),document.removeEventListener(`visibilitychange`,a),clearTimeout(o)},i=()=>{document.hasFocus()&&(r(),t())},a=()=>{document.visibilityState===`visible`&&document.hasFocus()&&(r(),t())},o=setTimeout(()=>{r(),n(Error(`timed out waiting for window focus`))},e);window.addEventListener(`focus`,i),document.addEventListener(`visibilitychange`,a)}))}export{e as createStandalonePanelRpcHandlers};
|