sliccy 3.46.0 → 3.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui/assets/{adobe-CSxcey5r.js → adobe-Dz6pnHut.js} +2 -2
- package/dist/ui/assets/{adobe-Da115bHB.js → adobe-xJMtcnUv.js} +1 -1
- package/dist/ui/assets/{agent-bridge-ZRdlTYxI.js → agent-bridge-Cft_6wJL.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-B5VQCgc6.js → agent-message-to-chat-B1FEKSGj.js} +1 -1
- package/dist/ui/assets/{apps-LCRJf-Bj.js → apps-CpvMB6O1.js} +1 -1
- package/dist/ui/assets/{azure-openai-e68lAEyj.js → azure-openai-BSDCPcfa.js} +1 -1
- package/dist/ui/assets/{azure-openai-DrpoflZr.js → azure-openai-Ddf9vv_p.js} +1 -1
- package/dist/ui/assets/{bsh-watchdog-B1zIY2sM.js → bsh-watchdog-CCZcB6iH.js} +1 -1
- package/dist/ui/assets/{cdp-Cy4upOhT.js → cdp-CUdm_GVy.js} +3 -3
- package/dist/ui/assets/{connect-surface-BahfcMFA.js → connect-surface-3JvRiLM0.js} +1 -1
- package/dist/ui/assets/cost-command-B9I7GIRc.js +1 -0
- package/dist/ui/assets/{dist-DLO6_i_i.js → dist-DKWfvwAP.js} +1 -1
- package/dist/ui/assets/{dist-DUVVOtT3.js → dist-DfQ2DfTD.js} +1 -1
- package/dist/ui/assets/{es-CBKhaKNo.js → es-gpNQhx_e.js} +1 -1
- package/dist/ui/assets/{follower-sprinkle-bridge-CknbkmDw.js → follower-sprinkle-bridge-DKn-aW0i.js} +1 -1
- package/dist/ui/assets/{fs-jtOU7if2.js → fs-DYg3-yFs.js} +1 -1
- package/dist/ui/assets/{github-BSaD-jMI.js → github-Bs7yyV4d.js} +2 -2
- package/dist/ui/assets/{github-B4cLbBmQ.js → github-BxfBGWIb.js} +1 -1
- package/dist/ui/assets/{github-copilot-DodI4DS1.js → github-copilot-CXTZCsyt.js} +1 -1
- package/dist/ui/assets/{github-copilot-BsW7hhJu.js → github-copilot-JIBA0c0D.js} +1 -1
- package/dist/ui/assets/{kernel-worker-BTrLFznM.js → kernel-worker-DvsxS2yz.js} +43 -43
- package/dist/ui/assets/{lick-ws-bridge-E1g3lRps.js → lick-ws-bridge-BItGqRq0.js} +1 -1
- package/dist/ui/assets/{local-llm-CwKk0-sh.js → local-llm-CN_8buIz.js} +1 -1
- package/dist/ui/assets/{magick-wasm-Muqi5nQe.js → magick-wasm-LY4PUDvk.js} +1 -1
- package/dist/ui/assets/{main-BAt3GJms.js → main-C0-rEkD7.js} +8 -8
- package/dist/ui/assets/{main-cherry-TgxLxBGI.js → main-cherry-BZEyPGfs.js} +1 -1
- package/dist/ui/assets/{migration-run-BDogYJcC.js → migration-run-DrTJQtOr.js} +1 -1
- package/dist/ui/assets/{mount-CSayJ5xj.js → mount-DI86AxDQ.js} +1 -1
- package/dist/ui/assets/{nuke-command-B1G-iwiX.js → nuke-command-BXHgH61f.js} +1 -1
- package/dist/ui/assets/{oauth-bootstrap-CJO5Uc9n.js → oauth-bootstrap-C5ur05M6.js} +2 -2
- package/dist/ui/assets/{oauth-service-DB4fWEIw.js → oauth-service-BsRu4CRS.js} +1 -1
- package/dist/ui/assets/{onboarding-orchestrator-xRYzOs-B.js → onboarding-orchestrator-CEOjK44p.js} +1 -1
- package/dist/ui/assets/{openai-codex-CgxGUy87.js → openai-codex-BvlgrOtP.js} +1 -1
- package/dist/ui/assets/{openai-codex-B5qZu8bN.js → openai-codex-CUtdw0EN.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-DbDQuWjm.js → panel-rpc-handlers-tyUA9u-v.js} +1 -1
- package/dist/ui/assets/{provider-j_DAU9YR.js → provider-C1tJuqMc.js} +1 -1
- package/dist/ui/assets/{provider-BbqMcfYp.js → provider-Ds7RcvIy.js} +2 -2
- package/dist/ui/assets/{provider-settings-BfWBLG45.js → provider-settings-vzbUm8j-.js} +2 -2
- package/dist/ui/assets/provider-store-access-BCvwDiKM.js +1 -0
- package/dist/ui/assets/provider-store-access-D_zu_yQY.js +1 -0
- package/dist/ui/assets/{providers-B-eUneAQ.js → providers-B5Nrt3pq.js} +1 -1
- package/dist/ui/assets/{proxied-fetch-DLNoZln5.js → proxied-fetch-DPdnbXwd.js} +1 -1
- package/dist/ui/assets/{remote-terminal-view-8J05xBYs.js → remote-terminal-view-CAik_Tw4.js} +1 -1
- package/dist/ui/assets/{store-s3uG1ved.js → store-B-z6X-rX.js} +1 -1
- package/dist/ui/assets/{sudo-6xMv5Je5.js → sudo-B9CjuArW.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-DnWFIWXy.js → tray-leave-runtime-Opd4PUHi.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-366FmFL3.js → upgrade-detection-DX4RntSG.js} +1 -1
- package/dist/ui/assets/{xai-grok-hGf99Tc7.js → xai-grok-CbjF5b2s.js} +1 -1
- package/dist/ui/assets/{xai-grok-BG6yWHMj.js → xai-grok-J9J1vQDK.js} +1 -1
- package/dist/ui/index.html +1 -1
- package/dist/ui/packages/webapp/index.html +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/cost-command-B1SUEdVQ.js +0 -1
- package/dist/ui/assets/provider-store-access-DREH5Rn0.js +0 -1
- package/dist/ui/assets/provider-store-access-Dvt6Obmo.js +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{i as e,o as t,r as n,t as r}from"./chunk-CMxvf4Kt.js";import{t as i}from"./logger-LESFN7Hj.js";import{a,o,t as s}from"./tool-ui-N76-EdVc.js";import{a as c,i as l,n as u,o as d,r as f,t as p}from"./backend-local-CMfz45hs.js";import{t as m}from"./types-idfTVsM8.js";import{t as h}from"./src-CpdsjHiA.js";import{n as g,t as _}from"./mime-types-BG9Gw1bq.js";import{a as v,i as y,n as b,r as x}from"./mount-
|
|
2
|
-
`)}const He=new Set([`webhook`,`cron`,`sprinkle`,`fswatch`,`session-reload`,`navigate`,`upgrade`,`cherry`,`workflow`]);function Ue(e){return e!=null&&He.has(e)}const We={webhook:`Webhook Event`,sprinkle:`Sprinkle Event`,fswatch:`File Watch Event`,"session-reload":`Session Reload`,navigate:`Navigate Event`,upgrade:`Upgrade Event`,cherry:`Cherry Event`,workflow:`Workflow Event`,cron:`Cron Event`};function Ge(e){switch(e.type){case`webhook`:return e.webhookName;case`sprinkle`:return e.sprinkleName;case`fswatch`:return e.fswatchName;case`session-reload`:return`mount-recovery`;case`navigate`:return e.navigateUrl;case`upgrade`:return`${e.upgradeFromVersion??`unknown`}→${e.upgradeToVersion??`unknown`}`;case`cherry`:return e.cherryName;case`workflow`:return e.workflowName;default:return e.cronName}}function Ke(e,t){let n=e.body;if(n?.reason===`mount-recovery`){let e=Ve(n.mounts??[]);return e===null?null:{label:t,content:e}}}function qe(e,t){let n=e.upgradeFromVersion??`unknown`,r=e.upgradeToVersion??`unknown`,i=e.body?.releasedAt??null;return{label:t,content:`[${t}: ${n}→${r}]\n\nSLICC was upgraded from \`${n}\` to \`${r}\`.${i?`\nReleased: ${i}`:``}\n\nUse the **upgrade** skill (\`/workspace/skills/upgrade/SKILL.md\`) to:\n- Show the user the changelog between these tags from GitHub\n- Offer to merge new bundled vfs-root content into their workspace (three-way merge: bundled snapshot vs user's VFS, reconciled with the GitHub tag-to-tag diff).`}}function Je(e,t){let n=e.cherryOrigin??`unknown origin`,r=e.cherryRuntimeId??`unknown`;return{label:t,content:`[${t}: ${e.cherryName??`unnamed`}] from ${n} (runtime ${r})\n\`\`\`json\n${JSON.stringify(e.body,null,2)}\n\`\`\``}}function Ye(e,t){let n=e.workflowName??`workflow`,r=e.resultPath??`(no result file)`,i=e.preview??``;return{label:t,content:`[${t}: ${n}] ${e.body?.status??`complete`} — ${i}\nFull result: ${r} (read it only if you need the whole thing).`}}function Xe(e,t){let n=Ge(e);return{label:t,content:`${e.originLabel?`_Forwarded from ${e.originLabel}._\n\n`:``}[${t}: ${n}]\n\`\`\`json\n${JSON.stringify(e.body,null,2)}\n\`\`\``}}function Ze(e){let t=We[e.type];if(e.type===`session-reload`){let n=Ke(e,t);if(n!==void 0)return n}return e.type===`upgrade`?qe(e,t):e.type===`cherry`?Je(e,t):e.type===`workflow`?Ye(e,t):Xe(e,t)}function Qe(e){return e.headers.get(`x-proxy-error`)===`1`}async function $e(e){let t=`Proxy error ${e.status}`,n;try{n=await e.text()}catch{return t}return eee(n,t)}function eee(e,t){let n;try{n=JSON.parse(e)}catch{return t}if(!n||typeof n!=`object`)return t;let r=n.error;if(typeof r==`string`&&r.length>0)return r;if(r&&typeof r==`object`){let e=r.message;if(typeof e==`string`&&e.length>0)return e;try{return JSON.stringify(r)}catch{return t}}return t}const et={SCOOPS:`scoops`,MESSAGES:`messages`,SESSIONS:`sessions`,TASKS:`tasks`,STATE:`state`,WEBHOOKS:`webhooks`,CRONTASKS:`crontasks`};let tt=null;async function nt(){if(tt){let e=Object.values(et).every(e=>tt.objectStoreNames.contains(e));if(tt.version===3&&e)return tt;tt.close(),tt=null}return new Promise((e,t)=>{let n=indexedDB.open(`slicc-groups`,3);n.onupgradeneeded=e=>{let t=e.target.result,n=e.oldVersion;if(n<1){if(!t.objectStoreNames.contains(et.MESSAGES)){let e=t.createObjectStore(et.MESSAGES,{keyPath:`id`});e.createIndex(`chatJid`,`chatJid`),e.createIndex(`timestamp`,`timestamp`),e.createIndex(`chatJid_timestamp`,[`chatJid`,`timestamp`])}t.objectStoreNames.contains(et.SESSIONS)||t.createObjectStore(et.SESSIONS,{keyPath:`groupFolder`}),t.objectStoreNames.contains(et.TASKS)||t.createObjectStore(et.TASKS,{keyPath:`id`}).createIndex(`groupFolder`,`groupFolder`),t.objectStoreNames.contains(et.STATE)||t.createObjectStore(et.STATE,{keyPath:`key`})}if(n<2){let n=e.target.transaction;if(t.objectStoreNames.contains(`groups`)){let e=n.objectStore(`groups`).getAll();e.onsuccess=()=>{let n=e.result;t.deleteObjectStore(`groups`);let r=t.createObjectStore(et.SCOOPS,{keyPath:`jid`});r.createIndex(`type`,`type`);for(let e of n){let t=e.isMain??!1,n={jid:e.jid,name:e.name,folder:e.folder,trigger:t?void 0:e.trigger||`@${e.folder}`,requiresTrigger:!t&&(e.requiresTrigger??!0),isCone:t,type:t?`cone`:`scoop`,assistantLabel:t?`sliccy`:e.config?.assistantName||e.folder,addedAt:e.addedAt,config:e.config?{systemPromptAppend:e.config.systemPromptAppend,timeout:e.config.timeout,assistantName:e.config.assistantName}:void 0};r.put(n)}}}else t.objectStoreNames.contains(et.SCOOPS)||t.createObjectStore(et.SCOOPS,{keyPath:`jid`}).createIndex(`type`,`type`)}n<3&&(t.objectStoreNames.contains(et.WEBHOOKS)||t.createObjectStore(et.WEBHOOKS,{keyPath:`id`}),t.objectStoreNames.contains(et.CRONTASKS)||t.createObjectStore(et.CRONTASKS,{keyPath:`id`}))},n.onsuccess=()=>{tt=n.result,e(tt)},n.onerror=()=>t(n.error)})}async function rt(e,t=`readonly`){return(await nt()).transaction(e,t).objectStore(e)}async function it(e){let t=await rt(et.SCOOPS,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function at(){let e=await rt(et.SCOOPS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>{let e={};for(let t of r.result)e[t.jid]=t;t(e)},r.onerror=()=>n(r.error)})}async function ot(e){let t=await rt(et.SCOOPS,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function st(){let e=await rt(et.MESSAGES,`readwrite`);return new Promise((t,n)=>{let r=e.clear();r.onsuccess=()=>t(),r.onerror=()=>n(r.error)})}async function ct(e){let t=(await rt(et.MESSAGES,`readwrite`)).index(`chatJid_timestamp`),n=IDBKeyRange.bound([e,``],[e,``],!1,!1);return new Promise((e,r)=>{let i=t.openCursor(n);i.onsuccess=()=>{let t=i.result;if(!t){e();return}t.delete(),t.continue()},i.onerror=()=>r(i.error)})}async function lt(e){let t=await rt(et.MESSAGES,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function ut(e){let t=await rt(et.MESSAGES,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function tee(e){let t=(await rt(et.MESSAGES)).index(`chatJid_timestamp`),n=IDBKeyRange.bound([e,``],[e,``],!1,!1);return new Promise((e,r)=>{let i=t.getAll(n);i.onsuccess=()=>e(i.result),i.onerror=()=>r(i.error)})}async function nee(e,t,n){let r=(await rt(et.MESSAGES)).index(`chatJid_timestamp`),i=IDBKeyRange.bound([e,t],[e,``],!0,!1);return new Promise((e,t)=>{let a=r.getAll(i);a.onsuccess=()=>{let t=a.result;n&&(t=t.filter(e=>e.senderName!==n)),e(t)},a.onerror=()=>t(a.error)})}async function dt(e){let t=await rt(et.TASKS,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function ft(e){let t=await rt(et.TASKS);return new Promise((n,r)=>{let i=t.get(e);i.onsuccess=()=>n(i.result??null),i.onerror=()=>r(i.error)})}async function pt(){let e=await rt(et.TASKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}async function mt(e){let t=await rt(et.TASKS,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function ht(e){let t=await rt(et.STATE);return new Promise((n,r)=>{let i=t.get(e);i.onsuccess=()=>n(i.result?.value??null),i.onerror=()=>r(i.error)})}async function gt(e,t){let n=await rt(et.STATE,`readwrite`);return new Promise((r,i)=>{let a=n.put({key:e,value:t});a.onsuccess=()=>r(),a.onerror=()=>i(a.error)})}async function _t(){await nt()}async function vt(e){let t=await rt(et.WEBHOOKS,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function yt(){try{let e=await rt(et.WEBHOOKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch{return[]}}async function bt(e){let t=await rt(et.WEBHOOKS,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function xt(e){let t=await rt(et.CRONTASKS,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function ree(){try{let e=await rt(et.CRONTASKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch{return[]}}async function iee(e){let t=await rt(et.CRONTASKS,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}i(`tray-leader`);let St={state:`inactive`,session:null,error:null};function Ct(){return{...St,session:St.session?{...St.session}:null}}function wt(){let e=Ct();if(e.state!==`inactive`)return e;try{let e=globalThis.localStorage?.getItem(`slicc.leaderTrayStatus`);if(e){let t=JSON.parse(e);if(t?.state&&t.state!==`inactive`)return t}}catch{}return e}const Tt=new Set;function Et(e){return Tt.add(e),()=>{Tt.delete(e)}}const Dt=`sessions`;function Ot(){return new Promise((e,t)=>{let n=indexedDB.open(`browser-coding-agent`,1);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(Dt)||e.createObjectStore(Dt,{keyPath:`id`})},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}var kt=class{db=null;async init(){this.db=await Ot()}ensureDb(){if(!this.db)throw Error(`SessionStore not initialized. Call init() first.`);return this.db}async save(e){let t=this.ensureDb();return new Promise((n,r)=>{let i=t.transaction(Dt,`readwrite`);i.objectStore(Dt).put(e),i.oncomplete=()=>n(),i.onerror=()=>r(i.error)})}async load(e){let t=this.ensureDb();return new Promise((n,r)=>{let i=t.transaction(Dt,`readonly`).objectStore(Dt).get(e);i.onsuccess=()=>n(i.result??null),i.onerror=()=>r(i.error)})}async list(){let e=this.ensureDb();return new Promise((t,n)=>{let r=e.transaction(Dt,`readonly`).objectStore(Dt).getAll();r.onsuccess=()=>{t(r.result.sort((e,t)=>t.updatedAt-e.updatedAt).map(e=>e.id))},r.onerror=()=>n(r.error)})}async delete(e){let t=this.ensureDb();return new Promise((n,r)=>{let i=t.transaction(Dt,`readwrite`);i.objectStore(Dt).delete(e),i.oncomplete=()=>n(),i.onerror=()=>r(i.error)})}async saveMessages(e,t){let n=await this.load(e),r=n?{...n,messages:t,updatedAt:Date.now()}:{id:e,messages:t,createdAt:Date.now(),updatedAt:Date.now()};await this.save(r)}};const At=i(`offscreen-bridge`);var jt=class{orchestrator=null;browserAPI=null;messageBuffers=new Map;currentMessageId=new Map;scoopStatuses=new Map;sessionStore=null;followerSync=null;followerActive=!1;_transport;transportUnsubscribe=null;activeScoopJid=null;agentEventListeners=new Set;fanOutMessageId=new Map;constructor(e){this._transport=e??null}get transport(){return this._transport||=Fe(),this._transport}async bind(e,t){this.orchestrator=e,this.browserAPI=t??null,this.transportUnsubscribe?.(),this.transportUnsubscribe=this.setupMessageListener();let n=new kt;await n.init(),this.sessionStore=n}static createCallbacks(e){return{onResponse:(t,n,r)=>{let i=e.getOrCreateAssistantMsg(t);r?i.content+=n:(i.content=n,i.isStreaming=!1),e.emit({type:`agent-event`,scoopJid:t,eventType:`text_delta`,text:n})},onResponseDone:t=>{let n=e.currentMessageId.get(t);if(n){let r=e.getBuffer(t).find(e=>e.id===n);r&&(r.isStreaming=!1),e.currentMessageId.delete(t)}e.persistScoop(t),e.emit({type:`agent-event`,scoopJid:t,eventType:`response_done`})},onSendMessage:(t,n)=>{let r=e.getBuffer(t),i=`msg-${Mt()}`;r.push({id:i,role:`assistant`,content:n,timestamp:Date.now()}),e.persistScoop(t),e.emit({type:`agent-event`,scoopJid:t,eventType:`text_delta`,text:n}),e.emit({type:`agent-event`,scoopJid:t,eventType:`response_done`})},onStatusChange:(t,n)=>{e.scoopStatuses.set(t,n),n===`ready`&&e.currentMessageId.delete(t),e.emit({type:`scoop-status`,scoopJid:t,status:n}),e.emitScoopList()},onCompactionStateChange:(t,n)=>{e.emit({type:`compaction-state`,scoopJid:t,state:n})},onError:(t,n)=>{e.emit({type:`error`,scoopJid:t,error:n})},onToolStart:(t,n,r)=>{if(Ie.has(n))return;let i=e.getOrCreateAssistantMsg(t);i.toolCalls||=[],i.toolCalls.push({id:Mt(),name:n,input:r}),e.emit({type:`agent-event`,scoopJid:t,eventType:`tool_start`,toolName:n,toolInput:r})},onToolEnd:(t,n,r,i)=>{if(Ie.has(n))return;let a=e.currentMessageId.get(t);if(a){let o=e.getBuffer(t).find(e=>e.id===a);if(o?.toolCalls){let e=[...o.toolCalls].reverse().find(e=>e.name===n&&e.result===void 0);e&&(e.result=r,e.isError=i)}}e.persistScoop(t),e.emit({type:`agent-event`,scoopJid:t,eventType:`tool_end`,toolName:n,toolResult:r,isError:i})},onToolUI:(t,n,r,i)=>{e.emit({type:`agent-event`,scoopJid:t,eventType:`tool_ui`,toolName:n,requestId:r,html:i})},onToolUIDone:(t,n)=>{e.emit({type:`agent-event`,scoopJid:t,eventType:`tool_ui_done`,requestId:n})},onIncomingMessage:(t,n)=>{let r={id:n.id,role:`user`,content:n.channel===`delegation`?`**[Instructions from sliccy]**\n\n${n.content}`:n.content,attachments:n.attachments,timestamp:new Date(n.timestamp).getTime(),source:n.channel===`delegation`?`delegation`:void 0,channel:n.channel};e.getBuffer(t).push(r),e.persistScoop(t),e.notifyPanelIncomingMessage(t,n)}}}notifyPanelIncomingMessage(e,t){this.emit({type:`incoming-message`,scoopJid:e,message:{id:t.id,content:t.content,attachments:t.attachments,channel:t.channel,senderName:t.senderName,fromAssistant:t.fromAssistant,timestamp:t.timestamp}})}toScoopSnapshot(e){let t=e.config&&(e.config.modelId!==void 0||e.config.thinkingLevel!==void 0)?{...e.config.modelId===void 0?{}:{modelId:e.config.modelId},...e.config.thinkingLevel===void 0?{}:{thinkingLevel:e.config.thinkingLevel}}:void 0;return{jid:e.jid,name:e.name,folder:e.folder,isCone:e.isCone,assistantLabel:e.assistantLabel,status:this.scoopStatuses.get(e.jid)??`ready`,...t?{config:t}:{}}}buildStateSnapshot(){let e=this.orchestrator?.getScoops().map(e=>this.toScoopSnapshot(e))??[],t=e.find(e=>e.isCone);return{type:`state-snapshot`,scoops:e,activeScoopJid:this.getActiveScoopJid()??t?.jid??null,trayRuntimeStatus:this.buildTrayRuntimeStatus()}}emitTrayRuntimeStatus(){let e=this.buildTrayRuntimeStatus(),t={type:`tray-runtime-status`,leader:e.leader,follower:e.follower};this.emit(t)}buildTrayRuntimeStatus(){let e=Ct(),t=T();return{leader:{state:e.state,session:e.session,error:e.error??null,reconnectAttempts:e.reconnectAttempts??0},follower:{state:t.state,joinUrl:t.joinUrl,trayId:t.trayId,error:t.error,lastError:t.lastError,reconnectAttempts:t.reconnectAttempts,attachAttempts:t.attachAttempts,lastAttachCode:t.lastAttachCode,connectingSince:t.connectingSince,lastPingTime:t.lastPingTime}}}setFollowerSync(e){this.followerSync=e}setFollowerActive(e){this.followerActive=e}setActiveScoopJid(e){this.activeScoopJid=e}getActiveScoopJid(){return this.activeScoopJid}onAgentEvent(e){return this.agentEventListeners.add(e),()=>{this.agentEventListeners.delete(e)}}fanOutAgentEvent(e){let{scoopJid:t,eventType:n}=e,r=[],i=()=>{let e=this.fanOutMessageId.get(t);return e||(e=`scoop-${t}-${Mt()}`,this.fanOutMessageId.set(t,e),r.push({type:`message_start`,messageId:e})),e};switch(n){case`text_delta`:{let t=i();r.push({type:`content_delta`,messageId:t,text:e.text??``});break}case`tool_start`:{let t=i();r.push({type:`tool_use_start`,messageId:t,toolName:e.toolName??``,toolInput:e.toolInput});break}case`tool_end`:{let n=this.fanOutMessageId.get(t);if(!n)return;r.push({type:`tool_result`,messageId:n,toolName:e.toolName??``,result:e.toolResult??``,isError:e.isError});break}case`tool_ui`:{let t=i();r.push({type:`tool_ui`,messageId:t,toolName:e.toolName??``,requestId:e.requestId??``,html:e.html??``});break}case`tool_ui_done`:{let n=this.fanOutMessageId.get(t);if(!n)return;r.push({type:`tool_ui_done`,messageId:n,requestId:e.requestId??``});break}case`response_done`:{let e=this.fanOutMessageId.get(t);if(!e)return;r.push({type:`content_done`,messageId:e}),this.fanOutMessageId.delete(t);break}case`turn_end`:this.fanOutMessageId.delete(t);break}for(let e of r)for(let n of this.agentEventListeners)try{n(t,e)}catch(e){At.error(`onAgentEvent listener threw`,{error:e instanceof Error?e.message:String(e)})}}getMessagesForJid(e){return this.getBuffer(e)}async routeSprinkleLick(e,t,n,r){if(!this.orchestrator)return;let i=this.orchestrator.getScoops(),a=n?i.find(e=>e.name===n||e.folder===n||e.folder===`${n}-scoop`):void 0;if(a||=i.find(e=>e.isCone),!a)return;let o=`sprinkle-${e}-${Date.now()}`,s=Ze({type:`sprinkle`,sprinkleName:e,timestamp:new Date().toISOString(),body:t,originLabel:r})?.content??`[Sprinkle Event: ${e}]\n\`\`\`json\n${JSON.stringify(t,null,2)}\n\`\`\``,c={id:o,chatJid:a.jid,senderId:`sprinkle`,senderName:`sprinkle:${e}`,content:s,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`sprinkle`};this.getBuffer(a.jid).push({id:o,role:`user`,content:s,timestamp:Date.now(),source:`lick`,channel:`sprinkle`}),this.persistScoop(a.jid),await this.orchestrator.handleMessage(c)}applyFollowerSnapshot(e){if(!this.orchestrator)return;let t=this.orchestrator.getScoops().find(e=>e.isCone);if(!t)return;let n=e.map(e=>({id:e.id,role:e.role,content:e.content,attachments:e.attachments,timestamp:e.timestamp,source:e.source,channel:e.channel,toolCalls:e.toolCalls?.map(e=>({id:e.id,name:e.name,input:e.input,result:e.result,isError:e.isError})),isStreaming:e.isStreaming}));if(this.messageBuffers.set(t.jid,n),this.currentMessageId.delete(t.jid),this.fanOutMessageId.delete(t.jid),this.sessionStore){let n=t.isCone?`session-cone`:`session-${t.folder}`;this.sessionStore.saveMessages(n,e).catch(e=>{At.error(`applyFollowerSnapshot persist failed`,{error:e instanceof Error?e.message:String(e)})})}this.emit({type:`scoop-messages-replaced`,scoopJid:t.jid,messages:n})}getConeJid(){return this.orchestrator?.getScoops().find(e=>e.isCone)?.jid??null}emitFollowerAgentEvent(e){let t=this.getConeJid();if(t)switch(e.type){case`content_delta`:this.emit({type:`agent-event`,scoopJid:t,eventType:`text_delta`,text:e.text});break;case`content_done`:this.emit({type:`agent-event`,scoopJid:t,eventType:`response_done`});break;case`tool_use_start`:this.emit({type:`agent-event`,scoopJid:t,eventType:`tool_start`,toolName:e.toolName,toolInput:e.toolInput});break;case`tool_result`:this.emit({type:`agent-event`,scoopJid:t,eventType:`tool_end`,toolName:e.toolName,toolResult:e.result,isError:e.isError});break;case`turn_end`:this.emit({type:`agent-event`,scoopJid:t,eventType:`turn_end`});break;case`error`:this.emit({type:`error`,scoopJid:t,error:e.error});break}}emitFollowerIncomingMessage(e,t){let n=this.getConeJid();n&&this.emit({type:`incoming-message`,scoopJid:n,message:{id:e,content:t,channel:`web`,senderName:`User`,fromAssistant:!1,timestamp:new Date().toISOString()}})}emitFollowerStatus(e){let t=this.getConeJid();if(!t)return;let n=e===`processing`?`processing`:`ready`;this.scoopStatuses.set(t,n),this.emit({type:`scoop-status`,scoopJid:t,status:n})}async buildBufferFromAgentMessages(e){let t=this.orchestrator?.getScoopContext(e.jid);if(!t)return null;let n=t.getAgentMessages();if(n.length===0)return null;let{agentMessagesToChatMessages:r}=await import(`./agent-message-to-chat-B5VQCgc6.js`);return r(n,{source:e.isCone?`cone`:e.name??e.folder}).map(e=>({id:e.id,role:e.role,content:e.content,attachments:e.attachments,timestamp:e.timestamp,source:e.source,channel:e.channel,toolCalls:e.toolCalls?.map(e=>({id:e.id,name:e.name,input:e.input,result:e.result,isError:e.isError})),isStreaming:!1}))}async seedBuffersFromAgentState(){if(this.orchestrator)for(let e of this.orchestrator.getScoops()){let t=this.messageBuffers.get(e.jid);if(t&&t.length>0)continue;let n=await this.buildBufferFromAgentMessages(e);n&&(this.messageBuffers.set(e.jid,n),this.currentMessageId.delete(e.jid),this.fanOutMessageId.delete(e.jid),await this.persistScoopAwait(e.jid))}}async handleRequestScoopMessages(e){if(!this.orchestrator)return;let t=this.orchestrator.getScoops().find(t=>t.jid===e);if(!t)return;let n=this.messageBuffers.get(e);if(n&&n.length>0){this.emit({type:`scoop-messages-replaced`,scoopJid:e,messages:n});return}let r=await this.buildBufferFromAgentMessages(t);if(r){this.messageBuffers.set(e,r),this.currentMessageId.delete(e),this.fanOutMessageId.delete(e),this.persistScoop(e),this.emit({type:`scoop-messages-replaced`,scoopJid:e,messages:r});return}if(this.sessionStore){let n=t.isCone?`session-cone`:`session-${t.folder}`;try{let t=(await this.sessionStore.load(n))?.messages??[];t.length>0&&(this.messageBuffers.set(e,t),this.currentMessageId.delete(e),this.fanOutMessageId.delete(e),this.emit({type:`scoop-messages-replaced`,scoopJid:e,messages:t}))}catch(e){At.error(`sessionStore load failed`,{sessionId:n,error:e instanceof Error?e.message:String(e)})}}}async handleRequestScoopTranscript(e,t){let n=()=>{this.emit({type:`scoop-transcript`,requestId:e,scoopJid:t,transcript:``})};if(!this.orchestrator){n();return}let r=this.orchestrator.getScoops().find(e=>e.jid===t);if(!r){n();return}let i=this.messageBuffers.get(t);if(i&&i.length>0){this.emit({type:`scoop-transcript`,requestId:e,scoopJid:t,transcript:Nt(i)});return}let a=this.orchestrator.getScoopContext(t);if(a){let{agentMessagesToChatMessages:n}=await import(`./agent-message-to-chat-B5VQCgc6.js`),i=a.getAgentMessages();if(i.length>0){let a=n(i,{source:r.isCone?`cone`:r.name??r.folder});this.emit({type:`scoop-transcript`,requestId:e,scoopJid:t,transcript:Nt(a)});return}}n()}persistScoop(e){this.persistScoopAwait(e)}async persistScoopAwait(e){if(!this.sessionStore||!this.orchestrator)return;let t=this.orchestrator.getScoops().find(t=>t.jid===e);if(!t)return;let n=t.isCone?`session-cone`:`session-${t.folder}`,r=this.messageBuffers.get(e);if(!(!r||r.length===0))try{await this.sessionStore.saveMessages(n,r)}catch(e){At.error(`persistScoop failed`,{sessionId:n,error:e instanceof Error?e.message:String(e)})}}getBuffer(e){let t=this.messageBuffers.get(e);return t||(t=[],this.messageBuffers.set(e,t)),t}getOrCreateAssistantMsg(e){let t=this.getBuffer(e),n=this.currentMessageId.get(e);if(n){let e=t.find(e=>e.id===n);if(e)return e}n=`scoop-${e}-${Mt()}`,this.currentMessageId.set(e,n);let r=(this.orchestrator?.getScoops()??[]).find(t=>t.jid===e),i=r?.isCone?`cone`:r?.name??`unknown`,a={id:n,role:`assistant`,content:``,timestamp:Date.now(),toolCalls:[],isStreaming:!0,source:i};return t.push(a),a}setupMessageListener(){return this.transport.onMessage(e=>{if(e.source===`panel`){if(e.payload?.type===`sprinkle-op-response`){import(`./sprinkle-proxy-B4nH2NxC.js`).then(({handleSprinkleOpResponse:t})=>{t(e.payload)});return}this.handlePanelMessage(e.payload).catch(t=>{console.error(`[offscreen-bridge] handlePanelMessage error:`,t);let n=e.payload.scoopJid;n&&this.emit({type:`error`,scoopJid:n,error:t instanceof Error?t.message:String(t)})})}})}async handlePanelMessage(e){if(this.orchestrator)switch(e.type){case`user-message`:{if(this.followerSync){this.getBuffer(e.scoopJid).push({id:e.messageId,role:`user`,content:e.text,attachments:e.attachments,timestamp:Date.now()}),this.persistScoop(e.scoopJid),this.followerSync.sendMessage(e.text,e.messageId,e.attachments);break}let t={id:e.messageId,chatJid:e.scoopJid,senderId:`user`,senderName:`User`,content:e.text,attachments:e.attachments,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`web`};this.getBuffer(e.scoopJid).push({id:e.messageId,role:`user`,content:e.text,attachments:e.attachments,timestamp:Date.now()}),this.persistScoop(e.scoopJid),await this.orchestrator.handleMessage(t),this.orchestrator.createScoopTab(e.scoopJid);break}case`cone-create`:{let t={jid:`cone_${Date.now()}`,name:e.name,folder:`cone`,isCone:!0,type:`cone`,requiresTrigger:!1,assistantLabel:`sliccy`,addedAt:new Date().toISOString()};await this.orchestrator.registerScoop(t),this.emit({type:`scoop-created`,scoop:this.toScoopSnapshot(t)});break}case`scoop-feed`:await this.orchestrator.delegateToScoop(e.scoopJid,e.prompt,`sliccy`);break;case`scoop-drop`:{let t=this.orchestrator.getScoops().find(t=>t.jid===e.scoopJid);if(await this.orchestrator.unregisterScoop(e.scoopJid),this.messageBuffers.delete(e.scoopJid),this.currentMessageId.delete(e.scoopJid),this.fanOutMessageId.delete(e.scoopJid),this.scoopStatuses.delete(e.scoopJid),t&&this.sessionStore){let e=t.isCone?`session-cone`:`session-${t.folder}`;this.sessionStore.delete(e).catch(t=>{console.warn(`[offscreen-bridge] Failed to delete session on scoop drop:`,e,t)})}this.emitScoopList();break}case`abort`:this.orchestrator.stopScoop(e.scoopJid),this.orchestrator.clearQueuedMessages(e.scoopJid).catch(e=>{console.warn(`[offscreen-bridge] Failed to clear queued messages on abort:`,e)});break;case`set-model`:this.orchestrator.updateModel();break;case`request-state`:this.emit(this.buildStateSnapshot());break;case`request-scoop-messages`:await this.handleRequestScoopMessages(e.scoopJid);break;case`request-scoop-transcript`:await this.handleRequestScoopTranscript(e.requestId,e.scoopJid);break;case`clear-chat`:{let t=this.orchestrator.getScoops().find(e=>e.isCone)?.jid;t&&await this.orchestrator.clearScoopMessages(t),this.sessionStore&&await this.sessionStore.delete(`session-cone`),t&&(this.messageBuffers.delete(t),this.currentMessageId.delete(t),this.fanOutMessageId.delete(t)),this.emit({type:`clear-chat-ack`,requestId:e.requestId});break}case`clear-filesystem`:try{await this.orchestrator.resetFilesystem()}catch(e){console.error(`[offscreen-bridge] clear-filesystem failed:`,e)}break;case`refresh-model`:this.orchestrator.updateModel();break;case`set-thinking-level`:{let t=e;try{await this.orchestrator.setScoopThinkingLevel(t.scoopJid,t.level)}catch(e){console.error(`[offscreen-bridge] set-thinking-level failed:`,e)}break}case`sprinkle-lick`:{let t=e;if(this.followerActive){this.followerSync?this.followerSync.sendSprinkleLick(t.sprinkleName,t.body,t.targetScoop):console.warn(`[offscreen-bridge] sprinkle-lick dropped: follower sync mid-reconnect`,{sprinkleName:t.sprinkleName});break}await this.routeSprinkleLick(t.sprinkleName,t.body,t.targetScoop,t.originLabel);break}case`lick-webhook-event`:this.orchestrator.handleWebhookEvent(e.webhookId,e.headers,e.body);break;case`set-follower-forwarding`:{let t=globalThis.__slicc_lickManager;if(!t){console.warn(`[offscreen-bridge] set-follower-forwarding ignored: worker LickManager unavailable`);break}e.enabled?t.setForwarder(e=>this.emit({type:`forward-lick`,event:e})):t.setForwarder(null);break}case`inject-forwarded-lick`:{let t=globalThis.__slicc_lickManager;if(!t){console.warn(`[offscreen-bridge] inject-forwarded-lick dropped: worker LickManager unavailable`,{type:e.event.type});break}t.emitEvent(e.event);break}case`lick-cherry-host-event`:this.orchestrator.handleCherryHostEvent(e.cherryRuntimeId,e.name,e.detail);break;case`reload-skills`:this.orchestrator.reloadAllSkills().catch(e=>{console.warn(`[offscreen-bridge] Skill reload failed:`,e)});break;case`panel-cdp-command`:{let{id:t,method:n,params:r,sessionId:i}=e;if(!this.browserAPI){console.warn(`[offscreen-bridge] Panel CDP command received but BrowserAPI is null`),this.emit({type:`panel-cdp-response`,id:t,error:`BrowserAPI not available`});break}try{let e=await this.browserAPI.getTransport().send(n,r,i);this.emit({type:`panel-cdp-response`,id:t,result:e})}catch(e){this.emit({type:`panel-cdp-response`,id:t,error:e instanceof Error?e.message:String(e)})}break}case`tool-ui-action`:{let{requestId:t,action:n,data:r}=e;try{await o.handleAction(t,{action:n,data:r})}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[offscreen-bridge] Tool UI action failed`,{requestId:t,action:n,error:r}),o.cancel(t,`Action failed: ${r}`)}break}case`local-storage-set`:try{globalThis.localStorage?.setItem(e.key,e.value)}catch(e){console.warn(`[offscreen-bridge] local-storage-set failed:`,e)}break;case`local-storage-remove`:try{globalThis.localStorage?.removeItem(e.key)}catch(e){console.warn(`[offscreen-bridge] local-storage-remove failed:`,e)}break;case`local-storage-clear`:try{globalThis.localStorage?.clear()}catch(e){console.warn(`[offscreen-bridge] local-storage-clear failed:`,e)}break}}emitScoopList(){let e=this.orchestrator?.getScoops().map(e=>this.toScoopSnapshot(e))??[];this.emit({type:`scoop-list`,scoops:e})}emit(e){this.transport.send(e),e.type===`agent-event`&&this.fanOutAgentEvent(e)}};function Mt(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Nt(e){let t=[];for(let n of e){let e=(n.content??``).trim();e.length!==0&&t.push(`${n.role}: ${e}`)}return t.join(`
|
|
1
|
+
import{i as e,o as t,r as n,t as r}from"./chunk-CMxvf4Kt.js";import{t as i}from"./logger-LESFN7Hj.js";import{a,o,t as s}from"./tool-ui-N76-EdVc.js";import{a as c,i as l,n as u,o as d,r as f,t as p}from"./backend-local-CMfz45hs.js";import{t as m}from"./types-idfTVsM8.js";import{t as h}from"./src-CpdsjHiA.js";import{n as g,t as _}from"./mime-types-BG9Gw1bq.js";import{a as v,i as y,n as b,r as x}from"./mount-DI86AxDQ.js";import{t as S}from"./mount-id-nJcx05eu.js";import{t as C}from"./remote-cache-_bhYZSLy.js";import{n as w}from"./mount-table-store-CQJEV6Ij.js";import{C as T,S as E,_ as D,b as O,c as ee,f as te,g as ne,h as k,l as A,n as re,o as ie,p as ae,r as oe,u as se,v as ce,w as le,x as ue,y as de}from"./provider-settings-vzbUm8j-.js";import{i as j,n as fe,r as pe}from"./tray-runtime-config-BRnpyDNS.js";import{n as me,r as he,t as ge}from"./panel-rpc-Bcvr75SR.js";import{a as _e}from"./providers-B5Nrt3pq.js";import{n as ve,t as ye}from"./path-utils-DU6QhF_k.js";import{_ as be,c as M,o as xe,s as Se}from"./bedrock-camp-Cg_vY0Xg.js";import{f as Ce,o as we}from"./transform-messages-C1X1O3BY.js";import{i as Te,n as N,r as Ee}from"./fs-DYg3-yFs.js";import{n as P,r as F}from"./openai-completions-CoYClIFl.js";const De=`__slicc_binary__`;function Oe(e){if(!e||typeof e!=`object`)return!1;let t=e;return t[De]===`b64`&&typeof t.data==`string`}function ke(e){let t=32768,n=``;for(let r=0;r<e.byteLength;r+=t){let i=e.subarray(r,Math.min(r+t,e.byteLength));n+=String.fromCharCode.apply(null,i)}return btoa(n)}function Ae(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function je(e){if(e instanceof Uint8Array)return{[De]:`b64`,data:ke(e)};if(Array.isArray(e))return e.map(je);if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=je(r);return t}return e}function Me(e){if(Oe(e))return Ae(e.data);if(Array.isArray(e))return e.map(Me);if(e&&typeof e==`object`){let t={};for(let[n,r]of Object.entries(e))t[n]=Me(r);return t}return e}const Ne=i(`panel-transport`);function Pe(e){return typeof e==`object`&&!!e&&`source`in e&&`payload`in e}function Fe(){return{onMessage:e=>{let t=(t,n,r)=>(Pe(t)&&e(Me(t)),!1);return chrome.runtime.onMessage.addListener(t),()=>chrome.runtime.onMessage.removeListener(t)},send:(e,t)=>{let n=je(e);chrome.runtime.sendMessage({source:`offscreen`,payload:n}).catch(e=>{let t=e instanceof Error?e.message:String(e);/receiving end does not exist/i.test(t)||Ne.error(`Offscreen → panel transport send failed`,{error:t})})}}}const Ie=new Set([`send_message`,`list_scoops`,`list_tasks`]);var Le=n({formatMountRecoveryPrompt:()=>Ve,mdInlineCode:()=>Be,recoverMounts:()=>Re,shellQuote:()=>ze});async function Re(e,t,n){let r=[],i=[];for(let a of e){let{targetPath:e,descriptor:o}=a;if(o.kind===`local`){let a=await w(o.idbHandleKey),s=typeof a?.name==`string`?a.name:``;if(!a||!(`queryPermission`in a)){i.push({kind:`local`,path:e,dirName:s});continue}let c;try{c=await a.queryPermission({mode:`readwrite`})}catch(t){n?.warn?.(`queryPermission threw on persisted handle`,{path:e,error:t instanceof Error?t.message:String(t)}),i.push({kind:`local`,path:e,dirName:s});continue}if(c!==`granted`){i.push({kind:`local`,path:e,dirName:s});continue}try{let i=p.fromHandle(a,{mountId:o.mountId});await t.mount(e,i),n?.info?.(`Restored mount from previous session`,{path:e,name:s}),r.push({kind:`local`,path:e,dirName:s})}catch(t){n?.warn?.(`Failed to re-mount persisted handle`,{path:e,error:t instanceof Error?t.message:String(t)}),i.push({kind:`local`,path:e,dirName:s})}continue}if(o.kind===`s3`){try{let i=new C({mountId:o.mountId,ttlMs:3e4}),a=new y({source:o.source,profile:o.profile,cache:i,mountId:o.mountId,signedFetch:x(o.profile)});await t.mount(e,a),n?.info?.(`Restored S3 mount from previous session`,{path:e,source:o.source}),r.push({kind:`s3`,path:e,source:o.source,profile:o.profile,reason:``})}catch(t){let r=t instanceof Error?t.message:String(t);n?.warn?.(`Failed to restore S3 mount`,{path:e,error:r}),i.push({kind:`s3`,path:e,source:o.source,profile:o.profile,reason:r})}continue}if(o.kind===`da`)try{let i=new C({mountId:o.mountId,ttlMs:3e4}),a=new v({source:o.source,profile:o.profile,cache:i,mountId:o.mountId,signedFetch:b()});await t.mount(e,a),n?.info?.(`Restored DA mount from previous session`,{path:e,source:o.source}),r.push({kind:`da`,path:e,source:o.source,profile:o.profile,reason:``})}catch(t){let r=t instanceof Error?t.message:String(t);n?.warn?.(`Failed to restore DA mount`,{path:e,error:r}),i.push({kind:`da`,path:e,source:o.source,profile:o.profile,reason:r})}}return{restored:r,needsRecovery:i}}function ze(e){return`'${e.replace(/'/g,`'\\''`)}'`}function Be(e){let t=e.replace(/\r\n|[\r\n]/g,` `),n=t.match(/`+/g),r=n?Math.max(...n.map(e=>e.length))+1:1,i="`".repeat(r);return`${i}${t.startsWith("`")||t.endsWith("`")?` ${t} `:t}${i}`}function Ve(e){if(!Array.isArray(e)||e.length===0)return null;let t=e.length===1?`mount point`:`mount points`,n=e.length===1?`it`:`them`,r=e.filter(e=>e.kind===`local`),i=e.filter(e=>e.kind===`s3`||e.kind===`da`),a=[`[Session Reload] Mount recovery required for ${e.length} ${t}.`,``];if(r.length>0){let e=r.map(({path:e,dirName:t})=>{let n=t?` (previously mounted from ${Be(t)})`:``;return`- ${Be(e)}${n}`}),i=r.map(({path:e})=>` mount ${ze(e)}`);a.push(`The page was reloaded and the following local ${t} lost filesystem permission. The browser cannot restore access without a fresh user gesture, so ${n} cannot be used until the user re-authorizes:`,``,...e,``,`Please tell the user what happened and ask whether they want to re-mount. If yes, run the corresponding command(s) so the folder picker opens and they can re-select the same directory:`,``,...i,``)}if(i.length>0){let e=i.map(({path:e,source:t,profile:n,reason:r})=>{let i=n==="default"?``:` --profile ${ze(n)}`,a=`mount --source ${ze(t)}${i} ${ze(e)}`;return`- ${Be(e)} (${Be(t)}, profile ${Be(n)}) — ${r}\n Retry: ${Be(a)}`});a.push(`The following remote ${t} could not be auto-restored:`,``,...e,``)}return a.push("If the user no longer needs a mount, run `mount unmount <path>` (with the path shell-quoted the same way) to clear the stale entry instead."),a.join(`
|
|
2
|
+
`)}const He=new Set([`webhook`,`cron`,`sprinkle`,`fswatch`,`session-reload`,`navigate`,`upgrade`,`cherry`,`workflow`]);function Ue(e){return e!=null&&He.has(e)}const We={webhook:`Webhook Event`,sprinkle:`Sprinkle Event`,fswatch:`File Watch Event`,"session-reload":`Session Reload`,navigate:`Navigate Event`,upgrade:`Upgrade Event`,cherry:`Cherry Event`,workflow:`Workflow Event`,cron:`Cron Event`};function Ge(e){switch(e.type){case`webhook`:return e.webhookName;case`sprinkle`:return e.sprinkleName;case`fswatch`:return e.fswatchName;case`session-reload`:return`mount-recovery`;case`navigate`:return e.navigateUrl;case`upgrade`:return`${e.upgradeFromVersion??`unknown`}→${e.upgradeToVersion??`unknown`}`;case`cherry`:return e.cherryName;case`workflow`:return e.workflowName;default:return e.cronName}}function Ke(e,t){let n=e.body;if(n?.reason===`mount-recovery`){let e=Ve(n.mounts??[]);return e===null?null:{label:t,content:e}}}function qe(e,t){let n=e.upgradeFromVersion??`unknown`,r=e.upgradeToVersion??`unknown`,i=e.body?.releasedAt??null;return{label:t,content:`[${t}: ${n}→${r}]\n\nSLICC was upgraded from \`${n}\` to \`${r}\`.${i?`\nReleased: ${i}`:``}\n\nUse the **upgrade** skill (\`/workspace/skills/upgrade/SKILL.md\`) to:\n- Show the user the changelog between these tags from GitHub\n- Offer to merge new bundled vfs-root content into their workspace (three-way merge: bundled snapshot vs user's VFS, reconciled with the GitHub tag-to-tag diff).`}}function Je(e,t){let n=e.cherryOrigin??`unknown origin`,r=e.cherryRuntimeId??`unknown`;return{label:t,content:`[${t}: ${e.cherryName??`unnamed`}] from ${n} (runtime ${r})\n\`\`\`json\n${JSON.stringify(e.body,null,2)}\n\`\`\``}}function Ye(e,t){let n=e.workflowName??`workflow`,r=e.resultPath??`(no result file)`,i=e.preview??``;return{label:t,content:`[${t}: ${n}] ${e.body?.status??`complete`} — ${i}\nFull result: ${r} (read it only if you need the whole thing).`}}function Xe(e,t){let n=Ge(e);return{label:t,content:`${e.originLabel?`_Forwarded from ${e.originLabel}._\n\n`:``}[${t}: ${n}]\n\`\`\`json\n${JSON.stringify(e.body,null,2)}\n\`\`\``}}function Ze(e){let t=We[e.type];if(e.type===`session-reload`){let n=Ke(e,t);if(n!==void 0)return n}return e.type===`upgrade`?qe(e,t):e.type===`cherry`?Je(e,t):e.type===`workflow`?Ye(e,t):Xe(e,t)}function Qe(e){return e.headers.get(`x-proxy-error`)===`1`}async function $e(e){let t=`Proxy error ${e.status}`,n;try{n=await e.text()}catch{return t}return eee(n,t)}function eee(e,t){let n;try{n=JSON.parse(e)}catch{return t}if(!n||typeof n!=`object`)return t;let r=n.error;if(typeof r==`string`&&r.length>0)return r;if(r&&typeof r==`object`){let e=r.message;if(typeof e==`string`&&e.length>0)return e;try{return JSON.stringify(r)}catch{return t}}return t}const et={SCOOPS:`scoops`,MESSAGES:`messages`,SESSIONS:`sessions`,TASKS:`tasks`,STATE:`state`,WEBHOOKS:`webhooks`,CRONTASKS:`crontasks`};let tt=null;async function nt(){if(tt){let e=Object.values(et).every(e=>tt.objectStoreNames.contains(e));if(tt.version===3&&e)return tt;tt.close(),tt=null}return new Promise((e,t)=>{let n=indexedDB.open(`slicc-groups`,3);n.onupgradeneeded=e=>{let t=e.target.result,n=e.oldVersion;if(n<1){if(!t.objectStoreNames.contains(et.MESSAGES)){let e=t.createObjectStore(et.MESSAGES,{keyPath:`id`});e.createIndex(`chatJid`,`chatJid`),e.createIndex(`timestamp`,`timestamp`),e.createIndex(`chatJid_timestamp`,[`chatJid`,`timestamp`])}t.objectStoreNames.contains(et.SESSIONS)||t.createObjectStore(et.SESSIONS,{keyPath:`groupFolder`}),t.objectStoreNames.contains(et.TASKS)||t.createObjectStore(et.TASKS,{keyPath:`id`}).createIndex(`groupFolder`,`groupFolder`),t.objectStoreNames.contains(et.STATE)||t.createObjectStore(et.STATE,{keyPath:`key`})}if(n<2){let n=e.target.transaction;if(t.objectStoreNames.contains(`groups`)){let e=n.objectStore(`groups`).getAll();e.onsuccess=()=>{let n=e.result;t.deleteObjectStore(`groups`);let r=t.createObjectStore(et.SCOOPS,{keyPath:`jid`});r.createIndex(`type`,`type`);for(let e of n){let t=e.isMain??!1,n={jid:e.jid,name:e.name,folder:e.folder,trigger:t?void 0:e.trigger||`@${e.folder}`,requiresTrigger:!t&&(e.requiresTrigger??!0),isCone:t,type:t?`cone`:`scoop`,assistantLabel:t?`sliccy`:e.config?.assistantName||e.folder,addedAt:e.addedAt,config:e.config?{systemPromptAppend:e.config.systemPromptAppend,timeout:e.config.timeout,assistantName:e.config.assistantName}:void 0};r.put(n)}}}else t.objectStoreNames.contains(et.SCOOPS)||t.createObjectStore(et.SCOOPS,{keyPath:`jid`}).createIndex(`type`,`type`)}n<3&&(t.objectStoreNames.contains(et.WEBHOOKS)||t.createObjectStore(et.WEBHOOKS,{keyPath:`id`}),t.objectStoreNames.contains(et.CRONTASKS)||t.createObjectStore(et.CRONTASKS,{keyPath:`id`}))},n.onsuccess=()=>{tt=n.result,e(tt)},n.onerror=()=>t(n.error)})}async function rt(e,t=`readonly`){return(await nt()).transaction(e,t).objectStore(e)}async function it(e){let t=await rt(et.SCOOPS,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function at(){let e=await rt(et.SCOOPS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>{let e={};for(let t of r.result)e[t.jid]=t;t(e)},r.onerror=()=>n(r.error)})}async function ot(e){let t=await rt(et.SCOOPS,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function st(){let e=await rt(et.MESSAGES,`readwrite`);return new Promise((t,n)=>{let r=e.clear();r.onsuccess=()=>t(),r.onerror=()=>n(r.error)})}async function ct(e){let t=(await rt(et.MESSAGES,`readwrite`)).index(`chatJid_timestamp`),n=IDBKeyRange.bound([e,``],[e,``],!1,!1);return new Promise((e,r)=>{let i=t.openCursor(n);i.onsuccess=()=>{let t=i.result;if(!t){e();return}t.delete(),t.continue()},i.onerror=()=>r(i.error)})}async function lt(e){let t=await rt(et.MESSAGES,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function ut(e){let t=await rt(et.MESSAGES,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function tee(e){let t=(await rt(et.MESSAGES)).index(`chatJid_timestamp`),n=IDBKeyRange.bound([e,``],[e,``],!1,!1);return new Promise((e,r)=>{let i=t.getAll(n);i.onsuccess=()=>e(i.result),i.onerror=()=>r(i.error)})}async function nee(e,t,n){let r=(await rt(et.MESSAGES)).index(`chatJid_timestamp`),i=IDBKeyRange.bound([e,t],[e,``],!0,!1);return new Promise((e,t)=>{let a=r.getAll(i);a.onsuccess=()=>{let t=a.result;n&&(t=t.filter(e=>e.senderName!==n)),e(t)},a.onerror=()=>t(a.error)})}async function dt(e){let t=await rt(et.TASKS,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function ft(e){let t=await rt(et.TASKS);return new Promise((n,r)=>{let i=t.get(e);i.onsuccess=()=>n(i.result??null),i.onerror=()=>r(i.error)})}async function pt(){let e=await rt(et.TASKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}async function mt(e){let t=await rt(et.TASKS,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function ht(e){let t=await rt(et.STATE);return new Promise((n,r)=>{let i=t.get(e);i.onsuccess=()=>n(i.result?.value??null),i.onerror=()=>r(i.error)})}async function gt(e,t){let n=await rt(et.STATE,`readwrite`);return new Promise((r,i)=>{let a=n.put({key:e,value:t});a.onsuccess=()=>r(),a.onerror=()=>i(a.error)})}async function _t(){await nt()}async function vt(e){let t=await rt(et.WEBHOOKS,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function yt(){try{let e=await rt(et.WEBHOOKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch{return[]}}async function bt(e){let t=await rt(et.WEBHOOKS,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function xt(e){let t=await rt(et.CRONTASKS,`readwrite`);return new Promise((n,r)=>{let i=t.put(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}async function ree(){try{let e=await rt(et.CRONTASKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch{return[]}}async function iee(e){let t=await rt(et.CRONTASKS,`readwrite`);return new Promise((n,r)=>{let i=t.delete(e);i.onsuccess=()=>n(),i.onerror=()=>r(i.error)})}i(`tray-leader`);let St={state:`inactive`,session:null,error:null};function Ct(){return{...St,session:St.session?{...St.session}:null}}function wt(){let e=Ct();if(e.state!==`inactive`)return e;try{let e=globalThis.localStorage?.getItem(`slicc.leaderTrayStatus`);if(e){let t=JSON.parse(e);if(t?.state&&t.state!==`inactive`)return t}}catch{}return e}const Tt=new Set;function Et(e){return Tt.add(e),()=>{Tt.delete(e)}}const Dt=`sessions`;function Ot(){return new Promise((e,t)=>{let n=indexedDB.open(`browser-coding-agent`,1);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(Dt)||e.createObjectStore(Dt,{keyPath:`id`})},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}var kt=class{db=null;async init(){this.db=await Ot()}ensureDb(){if(!this.db)throw Error(`SessionStore not initialized. Call init() first.`);return this.db}async save(e){let t=this.ensureDb();return new Promise((n,r)=>{let i=t.transaction(Dt,`readwrite`);i.objectStore(Dt).put(e),i.oncomplete=()=>n(),i.onerror=()=>r(i.error)})}async load(e){let t=this.ensureDb();return new Promise((n,r)=>{let i=t.transaction(Dt,`readonly`).objectStore(Dt).get(e);i.onsuccess=()=>n(i.result??null),i.onerror=()=>r(i.error)})}async list(){let e=this.ensureDb();return new Promise((t,n)=>{let r=e.transaction(Dt,`readonly`).objectStore(Dt).getAll();r.onsuccess=()=>{t(r.result.sort((e,t)=>t.updatedAt-e.updatedAt).map(e=>e.id))},r.onerror=()=>n(r.error)})}async delete(e){let t=this.ensureDb();return new Promise((n,r)=>{let i=t.transaction(Dt,`readwrite`);i.objectStore(Dt).delete(e),i.oncomplete=()=>n(),i.onerror=()=>r(i.error)})}async saveMessages(e,t){let n=await this.load(e),r=n?{...n,messages:t,updatedAt:Date.now()}:{id:e,messages:t,createdAt:Date.now(),updatedAt:Date.now()};await this.save(r)}};const At=i(`offscreen-bridge`);var jt=class{orchestrator=null;browserAPI=null;messageBuffers=new Map;currentMessageId=new Map;scoopStatuses=new Map;sessionStore=null;followerSync=null;followerActive=!1;_transport;transportUnsubscribe=null;activeScoopJid=null;agentEventListeners=new Set;fanOutMessageId=new Map;constructor(e){this._transport=e??null}get transport(){return this._transport||=Fe(),this._transport}async bind(e,t){this.orchestrator=e,this.browserAPI=t??null,this.transportUnsubscribe?.(),this.transportUnsubscribe=this.setupMessageListener();let n=new kt;await n.init(),this.sessionStore=n}static createCallbacks(e){return{onResponse:(t,n,r)=>{let i=e.getOrCreateAssistantMsg(t);r?i.content+=n:(i.content=n,i.isStreaming=!1),e.emit({type:`agent-event`,scoopJid:t,eventType:`text_delta`,text:n})},onResponseDone:t=>{let n=e.currentMessageId.get(t);if(n){let r=e.getBuffer(t).find(e=>e.id===n);r&&(r.isStreaming=!1),e.currentMessageId.delete(t)}e.persistScoop(t),e.emit({type:`agent-event`,scoopJid:t,eventType:`response_done`})},onSendMessage:(t,n)=>{let r=e.getBuffer(t),i=`msg-${Mt()}`;r.push({id:i,role:`assistant`,content:n,timestamp:Date.now()}),e.persistScoop(t),e.emit({type:`agent-event`,scoopJid:t,eventType:`text_delta`,text:n}),e.emit({type:`agent-event`,scoopJid:t,eventType:`response_done`})},onStatusChange:(t,n)=>{e.scoopStatuses.set(t,n),n===`ready`&&e.currentMessageId.delete(t),e.emit({type:`scoop-status`,scoopJid:t,status:n}),e.emitScoopList()},onCompactionStateChange:(t,n)=>{e.emit({type:`compaction-state`,scoopJid:t,state:n})},onError:(t,n)=>{e.emit({type:`error`,scoopJid:t,error:n})},onToolStart:(t,n,r)=>{if(Ie.has(n))return;let i=e.getOrCreateAssistantMsg(t);i.toolCalls||=[],i.toolCalls.push({id:Mt(),name:n,input:r}),e.emit({type:`agent-event`,scoopJid:t,eventType:`tool_start`,toolName:n,toolInput:r})},onToolEnd:(t,n,r,i)=>{if(Ie.has(n))return;let a=e.currentMessageId.get(t);if(a){let o=e.getBuffer(t).find(e=>e.id===a);if(o?.toolCalls){let e=[...o.toolCalls].reverse().find(e=>e.name===n&&e.result===void 0);e&&(e.result=r,e.isError=i)}}e.persistScoop(t),e.emit({type:`agent-event`,scoopJid:t,eventType:`tool_end`,toolName:n,toolResult:r,isError:i})},onToolUI:(t,n,r,i)=>{e.emit({type:`agent-event`,scoopJid:t,eventType:`tool_ui`,toolName:n,requestId:r,html:i})},onToolUIDone:(t,n)=>{e.emit({type:`agent-event`,scoopJid:t,eventType:`tool_ui_done`,requestId:n})},onIncomingMessage:(t,n)=>{let r={id:n.id,role:`user`,content:n.channel===`delegation`?`**[Instructions from sliccy]**\n\n${n.content}`:n.content,attachments:n.attachments,timestamp:new Date(n.timestamp).getTime(),source:n.channel===`delegation`?`delegation`:void 0,channel:n.channel};e.getBuffer(t).push(r),e.persistScoop(t),e.notifyPanelIncomingMessage(t,n)}}}notifyPanelIncomingMessage(e,t){this.emit({type:`incoming-message`,scoopJid:e,message:{id:t.id,content:t.content,attachments:t.attachments,channel:t.channel,senderName:t.senderName,fromAssistant:t.fromAssistant,timestamp:t.timestamp}})}toScoopSnapshot(e){let t=e.config&&(e.config.modelId!==void 0||e.config.thinkingLevel!==void 0)?{...e.config.modelId===void 0?{}:{modelId:e.config.modelId},...e.config.thinkingLevel===void 0?{}:{thinkingLevel:e.config.thinkingLevel}}:void 0;return{jid:e.jid,name:e.name,folder:e.folder,isCone:e.isCone,assistantLabel:e.assistantLabel,status:this.scoopStatuses.get(e.jid)??`ready`,...t?{config:t}:{}}}buildStateSnapshot(){let e=this.orchestrator?.getScoops().map(e=>this.toScoopSnapshot(e))??[],t=e.find(e=>e.isCone);return{type:`state-snapshot`,scoops:e,activeScoopJid:this.getActiveScoopJid()??t?.jid??null,trayRuntimeStatus:this.buildTrayRuntimeStatus()}}emitTrayRuntimeStatus(){let e=this.buildTrayRuntimeStatus(),t={type:`tray-runtime-status`,leader:e.leader,follower:e.follower};this.emit(t)}buildTrayRuntimeStatus(){let e=Ct(),t=T();return{leader:{state:e.state,session:e.session,error:e.error??null,reconnectAttempts:e.reconnectAttempts??0},follower:{state:t.state,joinUrl:t.joinUrl,trayId:t.trayId,error:t.error,lastError:t.lastError,reconnectAttempts:t.reconnectAttempts,attachAttempts:t.attachAttempts,lastAttachCode:t.lastAttachCode,connectingSince:t.connectingSince,lastPingTime:t.lastPingTime}}}setFollowerSync(e){this.followerSync=e}setFollowerActive(e){this.followerActive=e}setActiveScoopJid(e){this.activeScoopJid=e}getActiveScoopJid(){return this.activeScoopJid}onAgentEvent(e){return this.agentEventListeners.add(e),()=>{this.agentEventListeners.delete(e)}}fanOutAgentEvent(e){let{scoopJid:t,eventType:n}=e,r=[],i=()=>{let e=this.fanOutMessageId.get(t);return e||(e=`scoop-${t}-${Mt()}`,this.fanOutMessageId.set(t,e),r.push({type:`message_start`,messageId:e})),e};switch(n){case`text_delta`:{let t=i();r.push({type:`content_delta`,messageId:t,text:e.text??``});break}case`tool_start`:{let t=i();r.push({type:`tool_use_start`,messageId:t,toolName:e.toolName??``,toolInput:e.toolInput});break}case`tool_end`:{let n=this.fanOutMessageId.get(t);if(!n)return;r.push({type:`tool_result`,messageId:n,toolName:e.toolName??``,result:e.toolResult??``,isError:e.isError});break}case`tool_ui`:{let t=i();r.push({type:`tool_ui`,messageId:t,toolName:e.toolName??``,requestId:e.requestId??``,html:e.html??``});break}case`tool_ui_done`:{let n=this.fanOutMessageId.get(t);if(!n)return;r.push({type:`tool_ui_done`,messageId:n,requestId:e.requestId??``});break}case`response_done`:{let e=this.fanOutMessageId.get(t);if(!e)return;r.push({type:`content_done`,messageId:e}),this.fanOutMessageId.delete(t);break}case`turn_end`:this.fanOutMessageId.delete(t);break}for(let e of r)for(let n of this.agentEventListeners)try{n(t,e)}catch(e){At.error(`onAgentEvent listener threw`,{error:e instanceof Error?e.message:String(e)})}}getMessagesForJid(e){return this.getBuffer(e)}async routeSprinkleLick(e,t,n,r){if(!this.orchestrator)return;let i=this.orchestrator.getScoops(),a=n?i.find(e=>e.name===n||e.folder===n||e.folder===`${n}-scoop`):void 0;if(a||=i.find(e=>e.isCone),!a)return;let o=`sprinkle-${e}-${Date.now()}`,s=Ze({type:`sprinkle`,sprinkleName:e,timestamp:new Date().toISOString(),body:t,originLabel:r})?.content??`[Sprinkle Event: ${e}]\n\`\`\`json\n${JSON.stringify(t,null,2)}\n\`\`\``,c={id:o,chatJid:a.jid,senderId:`sprinkle`,senderName:`sprinkle:${e}`,content:s,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`sprinkle`};this.getBuffer(a.jid).push({id:o,role:`user`,content:s,timestamp:Date.now(),source:`lick`,channel:`sprinkle`}),this.persistScoop(a.jid),await this.orchestrator.handleMessage(c)}applyFollowerSnapshot(e){if(!this.orchestrator)return;let t=this.orchestrator.getScoops().find(e=>e.isCone);if(!t)return;let n=e.map(e=>({id:e.id,role:e.role,content:e.content,attachments:e.attachments,timestamp:e.timestamp,source:e.source,channel:e.channel,toolCalls:e.toolCalls?.map(e=>({id:e.id,name:e.name,input:e.input,result:e.result,isError:e.isError})),isStreaming:e.isStreaming}));if(this.messageBuffers.set(t.jid,n),this.currentMessageId.delete(t.jid),this.fanOutMessageId.delete(t.jid),this.sessionStore){let n=t.isCone?`session-cone`:`session-${t.folder}`;this.sessionStore.saveMessages(n,e).catch(e=>{At.error(`applyFollowerSnapshot persist failed`,{error:e instanceof Error?e.message:String(e)})})}this.emit({type:`scoop-messages-replaced`,scoopJid:t.jid,messages:n})}getConeJid(){return this.orchestrator?.getScoops().find(e=>e.isCone)?.jid??null}emitFollowerAgentEvent(e){let t=this.getConeJid();if(t)switch(e.type){case`content_delta`:this.emit({type:`agent-event`,scoopJid:t,eventType:`text_delta`,text:e.text});break;case`content_done`:this.emit({type:`agent-event`,scoopJid:t,eventType:`response_done`});break;case`tool_use_start`:this.emit({type:`agent-event`,scoopJid:t,eventType:`tool_start`,toolName:e.toolName,toolInput:e.toolInput});break;case`tool_result`:this.emit({type:`agent-event`,scoopJid:t,eventType:`tool_end`,toolName:e.toolName,toolResult:e.result,isError:e.isError});break;case`turn_end`:this.emit({type:`agent-event`,scoopJid:t,eventType:`turn_end`});break;case`error`:this.emit({type:`error`,scoopJid:t,error:e.error});break}}emitFollowerIncomingMessage(e,t){let n=this.getConeJid();n&&this.emit({type:`incoming-message`,scoopJid:n,message:{id:e,content:t,channel:`web`,senderName:`User`,fromAssistant:!1,timestamp:new Date().toISOString()}})}emitFollowerStatus(e){let t=this.getConeJid();if(!t)return;let n=e===`processing`?`processing`:`ready`;this.scoopStatuses.set(t,n),this.emit({type:`scoop-status`,scoopJid:t,status:n})}async buildBufferFromAgentMessages(e){let t=this.orchestrator?.getScoopContext(e.jid);if(!t)return null;let n=t.getAgentMessages();if(n.length===0)return null;let{agentMessagesToChatMessages:r}=await import(`./agent-message-to-chat-B1FEKSGj.js`);return r(n,{source:e.isCone?`cone`:e.name??e.folder}).map(e=>({id:e.id,role:e.role,content:e.content,attachments:e.attachments,timestamp:e.timestamp,source:e.source,channel:e.channel,toolCalls:e.toolCalls?.map(e=>({id:e.id,name:e.name,input:e.input,result:e.result,isError:e.isError})),isStreaming:!1}))}async seedBuffersFromAgentState(){if(this.orchestrator)for(let e of this.orchestrator.getScoops()){let t=this.messageBuffers.get(e.jid);if(t&&t.length>0)continue;let n=await this.buildBufferFromAgentMessages(e);n&&(this.messageBuffers.set(e.jid,n),this.currentMessageId.delete(e.jid),this.fanOutMessageId.delete(e.jid),await this.persistScoopAwait(e.jid))}}async handleRequestScoopMessages(e){if(!this.orchestrator)return;let t=this.orchestrator.getScoops().find(t=>t.jid===e);if(!t)return;let n=this.messageBuffers.get(e);if(n&&n.length>0){this.emit({type:`scoop-messages-replaced`,scoopJid:e,messages:n});return}let r=await this.buildBufferFromAgentMessages(t);if(r){this.messageBuffers.set(e,r),this.currentMessageId.delete(e),this.fanOutMessageId.delete(e),this.persistScoop(e),this.emit({type:`scoop-messages-replaced`,scoopJid:e,messages:r});return}if(this.sessionStore){let n=t.isCone?`session-cone`:`session-${t.folder}`;try{let t=(await this.sessionStore.load(n))?.messages??[];t.length>0&&(this.messageBuffers.set(e,t),this.currentMessageId.delete(e),this.fanOutMessageId.delete(e),this.emit({type:`scoop-messages-replaced`,scoopJid:e,messages:t}))}catch(e){At.error(`sessionStore load failed`,{sessionId:n,error:e instanceof Error?e.message:String(e)})}}}async handleRequestScoopTranscript(e,t){let n=()=>{this.emit({type:`scoop-transcript`,requestId:e,scoopJid:t,transcript:``})};if(!this.orchestrator){n();return}let r=this.orchestrator.getScoops().find(e=>e.jid===t);if(!r){n();return}let i=this.messageBuffers.get(t);if(i&&i.length>0){this.emit({type:`scoop-transcript`,requestId:e,scoopJid:t,transcript:Nt(i)});return}let a=this.orchestrator.getScoopContext(t);if(a){let{agentMessagesToChatMessages:n}=await import(`./agent-message-to-chat-B1FEKSGj.js`),i=a.getAgentMessages();if(i.length>0){let a=n(i,{source:r.isCone?`cone`:r.name??r.folder});this.emit({type:`scoop-transcript`,requestId:e,scoopJid:t,transcript:Nt(a)});return}}n()}persistScoop(e){this.persistScoopAwait(e)}async persistScoopAwait(e){if(!this.sessionStore||!this.orchestrator)return;let t=this.orchestrator.getScoops().find(t=>t.jid===e);if(!t)return;let n=t.isCone?`session-cone`:`session-${t.folder}`,r=this.messageBuffers.get(e);if(!(!r||r.length===0))try{await this.sessionStore.saveMessages(n,r)}catch(e){At.error(`persistScoop failed`,{sessionId:n,error:e instanceof Error?e.message:String(e)})}}getBuffer(e){let t=this.messageBuffers.get(e);return t||(t=[],this.messageBuffers.set(e,t)),t}getOrCreateAssistantMsg(e){let t=this.getBuffer(e),n=this.currentMessageId.get(e);if(n){let e=t.find(e=>e.id===n);if(e)return e}n=`scoop-${e}-${Mt()}`,this.currentMessageId.set(e,n);let r=(this.orchestrator?.getScoops()??[]).find(t=>t.jid===e),i=r?.isCone?`cone`:r?.name??`unknown`,a={id:n,role:`assistant`,content:``,timestamp:Date.now(),toolCalls:[],isStreaming:!0,source:i};return t.push(a),a}setupMessageListener(){return this.transport.onMessage(e=>{if(e.source===`panel`){if(e.payload?.type===`sprinkle-op-response`){import(`./sprinkle-proxy-B4nH2NxC.js`).then(({handleSprinkleOpResponse:t})=>{t(e.payload)});return}this.handlePanelMessage(e.payload).catch(t=>{console.error(`[offscreen-bridge] handlePanelMessage error:`,t);let n=e.payload.scoopJid;n&&this.emit({type:`error`,scoopJid:n,error:t instanceof Error?t.message:String(t)})})}})}async handlePanelMessage(e){if(this.orchestrator)switch(e.type){case`user-message`:{if(this.followerSync){this.getBuffer(e.scoopJid).push({id:e.messageId,role:`user`,content:e.text,attachments:e.attachments,timestamp:Date.now()}),this.persistScoop(e.scoopJid),this.followerSync.sendMessage(e.text,e.messageId,e.attachments);break}let t={id:e.messageId,chatJid:e.scoopJid,senderId:`user`,senderName:`User`,content:e.text,attachments:e.attachments,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`web`};this.getBuffer(e.scoopJid).push({id:e.messageId,role:`user`,content:e.text,attachments:e.attachments,timestamp:Date.now()}),this.persistScoop(e.scoopJid),await this.orchestrator.handleMessage(t),this.orchestrator.createScoopTab(e.scoopJid);break}case`cone-create`:{let t={jid:`cone_${Date.now()}`,name:e.name,folder:`cone`,isCone:!0,type:`cone`,requiresTrigger:!1,assistantLabel:`sliccy`,addedAt:new Date().toISOString()};await this.orchestrator.registerScoop(t),this.emit({type:`scoop-created`,scoop:this.toScoopSnapshot(t)});break}case`scoop-feed`:await this.orchestrator.delegateToScoop(e.scoopJid,e.prompt,`sliccy`);break;case`scoop-drop`:{let t=this.orchestrator.getScoops().find(t=>t.jid===e.scoopJid);if(await this.orchestrator.unregisterScoop(e.scoopJid),this.messageBuffers.delete(e.scoopJid),this.currentMessageId.delete(e.scoopJid),this.fanOutMessageId.delete(e.scoopJid),this.scoopStatuses.delete(e.scoopJid),t&&this.sessionStore){let e=t.isCone?`session-cone`:`session-${t.folder}`;this.sessionStore.delete(e).catch(t=>{console.warn(`[offscreen-bridge] Failed to delete session on scoop drop:`,e,t)})}this.emitScoopList();break}case`abort`:this.orchestrator.stopScoop(e.scoopJid),this.orchestrator.clearQueuedMessages(e.scoopJid).catch(e=>{console.warn(`[offscreen-bridge] Failed to clear queued messages on abort:`,e)});break;case`set-model`:this.orchestrator.updateModel();break;case`request-state`:this.emit(this.buildStateSnapshot());break;case`request-scoop-messages`:await this.handleRequestScoopMessages(e.scoopJid);break;case`request-scoop-transcript`:await this.handleRequestScoopTranscript(e.requestId,e.scoopJid);break;case`clear-chat`:{let t=this.orchestrator.getScoops().find(e=>e.isCone)?.jid;t&&await this.orchestrator.clearScoopMessages(t),this.sessionStore&&await this.sessionStore.delete(`session-cone`),t&&(this.messageBuffers.delete(t),this.currentMessageId.delete(t),this.fanOutMessageId.delete(t)),this.emit({type:`clear-chat-ack`,requestId:e.requestId});break}case`clear-filesystem`:try{await this.orchestrator.resetFilesystem()}catch(e){console.error(`[offscreen-bridge] clear-filesystem failed:`,e)}break;case`refresh-model`:this.orchestrator.updateModel();break;case`set-thinking-level`:{let t=e;try{await this.orchestrator.setScoopThinkingLevel(t.scoopJid,t.level)}catch(e){console.error(`[offscreen-bridge] set-thinking-level failed:`,e)}break}case`sprinkle-lick`:{let t=e;if(this.followerActive){this.followerSync?this.followerSync.sendSprinkleLick(t.sprinkleName,t.body,t.targetScoop):console.warn(`[offscreen-bridge] sprinkle-lick dropped: follower sync mid-reconnect`,{sprinkleName:t.sprinkleName});break}await this.routeSprinkleLick(t.sprinkleName,t.body,t.targetScoop,t.originLabel);break}case`lick-webhook-event`:this.orchestrator.handleWebhookEvent(e.webhookId,e.headers,e.body);break;case`set-follower-forwarding`:{let t=globalThis.__slicc_lickManager;if(!t){console.warn(`[offscreen-bridge] set-follower-forwarding ignored: worker LickManager unavailable`);break}e.enabled?t.setForwarder(e=>this.emit({type:`forward-lick`,event:e})):t.setForwarder(null);break}case`inject-forwarded-lick`:{let t=globalThis.__slicc_lickManager;if(!t){console.warn(`[offscreen-bridge] inject-forwarded-lick dropped: worker LickManager unavailable`,{type:e.event.type});break}t.emitEvent(e.event);break}case`lick-cherry-host-event`:this.orchestrator.handleCherryHostEvent(e.cherryRuntimeId,e.name,e.detail);break;case`reload-skills`:this.orchestrator.reloadAllSkills().catch(e=>{console.warn(`[offscreen-bridge] Skill reload failed:`,e)});break;case`panel-cdp-command`:{let{id:t,method:n,params:r,sessionId:i}=e;if(!this.browserAPI){console.warn(`[offscreen-bridge] Panel CDP command received but BrowserAPI is null`),this.emit({type:`panel-cdp-response`,id:t,error:`BrowserAPI not available`});break}try{let e=await this.browserAPI.getTransport().send(n,r,i);this.emit({type:`panel-cdp-response`,id:t,result:e})}catch(e){this.emit({type:`panel-cdp-response`,id:t,error:e instanceof Error?e.message:String(e)})}break}case`tool-ui-action`:{let{requestId:t,action:n,data:r}=e;try{await o.handleAction(t,{action:n,data:r})}catch(e){let r=e instanceof Error?e.message:String(e);console.error(`[offscreen-bridge] Tool UI action failed`,{requestId:t,action:n,error:r}),o.cancel(t,`Action failed: ${r}`)}break}case`local-storage-set`:try{globalThis.localStorage?.setItem(e.key,e.value)}catch(e){console.warn(`[offscreen-bridge] local-storage-set failed:`,e)}break;case`local-storage-remove`:try{globalThis.localStorage?.removeItem(e.key)}catch(e){console.warn(`[offscreen-bridge] local-storage-remove failed:`,e)}break;case`local-storage-clear`:try{globalThis.localStorage?.clear()}catch(e){console.warn(`[offscreen-bridge] local-storage-clear failed:`,e)}break}}emitScoopList(){let e=this.orchestrator?.getScoops().map(e=>this.toScoopSnapshot(e))??[];this.emit({type:`scoop-list`,scoops:e})}emit(e){this.transport.send(e),e.type===`agent-event`&&this.fanOutAgentEvent(e)}};function Mt(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function Nt(e){let t=[];for(let n of e){let e=(n.content??``).trim();e.length!==0&&t.push(`${n.role}: ${e}`)}return t.join(`
|
|
3
3
|
`)}const Pt=i(`cdp`);var Ft=class{ws=null;nextId=1;pending=new Map;listeners=new Map;_state=`disconnected`;get state(){return this._state}async connect(e){if(this._state!==`disconnected`)throw Error(`Cannot connect: state is ${this._state}`);if(!e?.url)throw Error(`CDPClient.connect() requires a WebSocket URL`);let{url:t,timeout:n=5e3}=e;return this._state=`connecting`,new Promise((e,r)=>{let i=setTimeout(()=>{this.cleanup(),r(Error(`CDP connection timed out after ${n}ms`))},n);try{this.ws=new WebSocket(t)}catch(e){clearTimeout(i),this._state=`disconnected`,r(e);return}this.ws.onopen=()=>{clearTimeout(i),this._state=`connected`,Pt.info(`Connected`,{url:t}),e()},this.ws.onerror=e=>{clearTimeout(i),this._state===`connecting`&&(Pt.error(`Connection failed`,{url:t}),this.cleanup(),r(Error(`CDP WebSocket connection failed`)))},this.ws.onmessage=e=>{this.handleMessage(e.data)},this.ws.onclose=()=>{this.handleClose()}})}disconnect(){this.ws&&(this.ws.onclose=null,this.ws.close()),this.cleanup(),Pt.info(`Disconnected`)}async send(e,t,n,r=3e4){if(this._state!==`connected`||!this.ws)throw Error(`CDP client is not connected`);let i=this.nextId++,a={id:i,method:e};return t&&(a.params=t),n&&(a.sessionId=n),Pt.debug(`Send`,{method:e,id:i,sessionId:n}),new Promise((t,n)=>{let o=setTimeout(()=>{this.pending.delete(i),n(Error(`CDP command timed out after ${r}ms: ${e}`))},r);this.pending.set(i,{resolve:e=>{clearTimeout(o),t(e)},reject:e=>{clearTimeout(o),n(e)}}),this.ws.send(JSON.stringify(a))})}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){let n=this.listeners.get(e);n&&(n.delete(t),n.size===0&&this.listeners.delete(e))}once(e,t=3e4){return new Promise((n,r)=>{let i=setTimeout(()=>{this.off(e,a),r(Error(`Timed out waiting for event: ${e}`))},t),a=t=>{clearTimeout(i),this.off(e,a),n(t)};this.on(e,a)})}handleMessage(e){let t;try{t=JSON.parse(e)}catch{return}if(`id`in t&&typeof t.id==`number`){let e=t;Pt.debug(`Response`,{id:e.id,hasError:!!e.error});let n=this.pending.get(e.id);n&&(this.pending.delete(e.id),e.error?(Pt.error(`Command error`,{id:e.id,code:e.error.code,message:e.error.message}),n.reject(Error(`CDP error: ${e.error.message} (${e.error.code})`))):n.resolve(e.result??{}));return}if(`method`in t){let e=t;Pt.debug(`Event`,{method:e.method,sessionId:e.sessionId});let n=this.listeners.get(e.method);if(n){let t=e.sessionId?{...e.params,sessionId:e.sessionId}:e.params??{};for(let e of n)try{e(t)}catch{}}}}handleClose(){Pt.error(`Connection closed unexpectedly`,{pendingCommands:this.pending.size});for(let[,e]of this.pending)e.reject(Error(`CDP connection closed`));this.cleanup()}cleanup(){this.ws=null,this._state=`disconnected`,this.pending.clear()}};const It=`(function() {
|
|
4
4
|
'use strict';
|
|
5
5
|
|
|
@@ -2688,31 +2688,31 @@ Available commands:
|
|
|
2688
2688
|
`,stderr:``,exitCode:0}}async init(e,t){let n=this.parseArg(t,`--initial-branch`,`-b`)??`main`;return await wK({fs:this.lfs,dir:e,defaultBranch:n}),{stdout:`Initialized empty Git repository in ${e}/.git/\n`,stderr:``,exitCode:0}}async clone(e,t){if(t.length===0)return{stdout:``,stderr:`fatal: You must specify a repository to clone.
|
|
2689
2689
|
`,exitCode:128};let n=t[0],r=t[1];if(!r){let e=n.match(/\/([^/]+?)(\.git)?$/);r=e?e[1]:`repo`}let i=r.startsWith(`/`)?r:`${e}/${r}`,a=this.parseArg(t,`--depth`),o=this.parseArg(t,`--branch`,`-b`),s=this.parseBooleanFlag(t,`--single-branch`,!0),c=`Cloning into '${r}'...\n`;await iK({fs:this.lfs,http:Oq,dir:i,url:n,corsProxy:this.corsProxy,depth:a?parseInt(a,10):1,ref:o,singleBranch:s,noCheckout:!1,cache:{},onAuth:this.getOnAuth(),onProgress:e=>{e.phase===`Receiving objects`&&(c+=`Receiving objects: ${e.loaded}/${e.total}\n`)}});try{let e=await kK({fs:this.lfs,dir:i});e.length>0&&(c+=`Checked out ${e.length} files.\n`)}catch{}return{stdout:c+`done.
|
|
2690
2690
|
`,stderr:``,exitCode:0}}async add(e,t){let n=t.includes(`-A`)||t.includes(`--all`),r=t.includes(`-u`)||t.includes(`--update`),i=t.includes(`-f`)||t.includes(`--force`),a=t.filter(e=>!e.startsWith(`-`));if(!n&&!r&&a.length===0)return{stdout:``,stderr:`Nothing specified, nothing added.
|
|
2691
|
-
`,exitCode:0};if(n){let
|
|
2691
|
+
`,exitCode:0};if(n)await this.addAll(e,i);else if(a.includes(`.`))await this.addDot(e,i);else if(r)await this.addUpdate(e,i);else for(let t of a)await UW({fs:this.lfs,dir:e,filepath:t,force:i});return{stdout:``,stderr:``,exitCode:0}}async addAll(e,t){let n=await aq({fs:this.lfs,dir:e});for(let[r,,i,a]of n)i!==a&&(i===0?await $K({fs:this.lfs,dir:e,filepath:r}):await UW({fs:this.lfs,dir:e,filepath:r,force:t}))}async addDot(e,t){let n=await aq({fs:this.lfs,dir:e});for(let[r,,i,a]of n)i!==a&&i!==0&&await UW({fs:this.lfs,dir:e,filepath:r,force:t})}async addUpdate(e,t){let n=await aq({fs:this.lfs,dir:e});for(let[r,i,a,o]of n)i!==0&&a!==o&&(a===0?await $K({fs:this.lfs,dir:e,filepath:r}):await UW({fs:this.lfs,dir:e,filepath:r,force:t}))}async status(e,t){let n=t.includes(`--short`)||t.includes(`-s`),r=t.includes(`--porcelain`);if(n||r)return this.statusShort(e);let i=``;try{let t=await oK({fs:this.lfs,dir:e});i+=`On branch ${t??`(no branch)`}\n\n`}catch{i+=`Not on any branch.
|
|
2692
2692
|
|
|
2693
|
-
`}let a=await aq({fs:this.lfs,dir:e}),o=[],
|
|
2694
|
-
`,
|
|
2693
|
+
`}let a=await aq({fs:this.lfs,dir:e}),{staged:o,unstaged:s,untracked:c}=this.classifyStatusMatrix(a);return i+=this.formatStatusLong(o,s,c),{stdout:i,stderr:``,exitCode:0}}classifyStatusMatrix(e){let t=[],n=[],r=[];for(let[i,a,o,s]of e)a===0&&o===2&&s===0?r.push(i):s===2||a===1&&s===0&&o===0?t.push(i):o!==s&&o!==0?n.push(i):a===1&&o===0&&s===1&&n.push(i+` (deleted)`);return{staged:t,unstaged:n,untracked:r}}formatStatusLong(e,t,n){let r=``;if(e.length>0){r+=`Changes to be committed:
|
|
2694
|
+
`,r+=` (use "git restore --staged <file>..." to unstage)
|
|
2695
2695
|
|
|
2696
|
-
`;for(let
|
|
2697
|
-
`}if(
|
|
2698
|
-
`,
|
|
2696
|
+
`;for(let t of e)r+=`\t\x1b[32m${t}\x1b[0m\n`;r+=`
|
|
2697
|
+
`}if(t.length>0){r+=`Changes not staged for commit:
|
|
2698
|
+
`,r+=` (use "git add <file>..." to update what will be committed)
|
|
2699
2699
|
|
|
2700
|
-
`;for(let e of
|
|
2701
|
-
`}if(
|
|
2702
|
-
`,
|
|
2700
|
+
`;for(let e of t)r+=`\t\x1b[31m${e}\x1b[0m\n`;r+=`
|
|
2701
|
+
`}if(n.length>0){r+=`Untracked files:
|
|
2702
|
+
`,r+=` (use "git add <file>..." to include in what will be committed)
|
|
2703
2703
|
|
|
2704
|
-
`;for(let e of
|
|
2705
|
-
`}return
|
|
2706
|
-
`),
|
|
2704
|
+
`;for(let e of n)r+=`\t\x1b[31m${e}\x1b[0m\n`;r+=`
|
|
2705
|
+
`}return e.length===0&&t.length===0&&n.length===0&&(r+=`nothing to commit, working tree clean
|
|
2706
|
+
`),r}async statusShort(e){let t=await aq({fs:this.lfs,dir:e}),n=``;for(let[e,r,i,a]of t){let t=this.shortStatusCodes(r,i,a);t&&(n+=`${t[0]}${t[1]} ${e}\n`)}return{stdout:n,stderr:``,exitCode:0}}shortStatusCodes(e,t,n){return e===0&&t===2&&n===0?[`?`,`?`]:e===0&&t===2&&n===2?[`A`,` `]:e===0&&t===2&&n===3?[`A`,`M`]:e===1&&t===2&&n===1?[` `,`M`]:e===1&&t===2&&n===2?[`M`,` `]:e===1&&t===2&&n===3?[`M`,`M`]:e===1&&t===0&&n===0?[`D`,` `]:e===1&&t===0&&n===1?[` `,`D`]:null}async commit(e,t){let n=this.expandCombinedFlags(t),r=this.parseArg(n,`-m`,`--message`);if(!r)return{stdout:``,stderr:"error: switch `m` requires a value\n",exitCode:1};let i=n.includes(`--amend`),a=n.includes(`-a`)||n.includes(`--all`),o=n.includes(`--allow-empty`);if(a&&await this.stageTrackedChanges(e),!o&&!i&&!(await aq({fs:this.lfs,dir:e})).some(([,e,,t])=>t!==e))return{stdout:``,stderr:`nothing to commit, working tree clean
|
|
2707
2707
|
`,exitCode:1};let s=(await aK({fs:this.lfs,dir:e,message:r,author:await this.resolveAuthor(e),amend:i,noUpdateBranch:void 0})).slice(0,7);return{stdout:`[${await oK({fs:this.lfs,dir:e})??`HEAD`} ${s}] ${r}\n`,stderr:``,exitCode:0}}async stageTrackedChanges(e){let t=await aq({fs:this.lfs,dir:e});for(let[n,r,i,a]of t)r!==0&&i!==a&&(i===0?await $K({fs:this.lfs,dir:e,filepath:n}):await UW({fs:this.lfs,dir:e,filepath:n}))}expandCombinedFlags(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];if(r.startsWith(`-`)&&!r.startsWith(`--`)&&r.length>2&&!r.includes(`=`)){let e=r.slice(1);for(let n of e)t.push(`-${n}`)}else t.push(r)}return t}async log(e,t){let n=this.parseArg(t,`-n`,`--max-count`),r=t.includes(`--oneline`),i=t.includes(`--stat`),a=t.includes(`--reverse`),o=t.includes(`--all`),s=this.parseArg(t,`--format`,`--pretty`),c=this.parseArg(t,`--author`),l=this.parseArg(t,`--grep`),u=t.indexOf(`--follow`),d=u===-1?void 0:t[u+1],f;f=o?await this.logAllBranches(e,n?parseInt(n,10):void 0):await LK({fs:this.lfs,dir:e,depth:n?parseInt(n,10):10,...d?{filepath:d,follow:!0}:{}}),c&&(f=f.filter(e=>e.commit.author.name.includes(c))),l&&(f=f.filter(e=>e.commit.message.includes(l))),a&&(f=f.slice().reverse());let p=``;for(let t of f){let{commit:n,oid:a}=t;s?p+=this.formatLogEntry(a,n,s)+`
|
|
2708
2708
|
`:r?p+=`\x1b[33m${a.slice(0,7)}\x1b[0m ${n.message.split(`
|
|
2709
2709
|
`)[0]}\n`:(p+=`\x1b[33mcommit ${a}\x1b[0m\n`,p+=`Author: ${n.author.name} <${n.author.email}>\n`,p+=`Date: ${new Date(n.author.timestamp*1e3).toLocaleString()}\n\n`,p+=` ${n.message.replace(/\n/g,`
|
|
2710
2710
|
`)}\n\n`),i&&(p+=await this.logStatForCommit(e,t))}return{stdout:p,stderr:``,exitCode:0}}async logAllBranches(e,t){let n=await EK({fs:this.lfs,dir:e}),r=new Set,i=[];for(let a of n)try{let n=await LK({fs:this.lfs,dir:e,ref:a,depth:t??50});for(let e of n)r.has(e.oid)||(r.add(e.oid),i.push(e))}catch{}return i.sort((e,t)=>t.commit.author.timestamp-e.commit.author.timestamp),t?i.slice(0,t):i}formatLogEntry(e,t,n){let r=new Date(t.author.timestamp*1e3);return n.replace(/%H/g,e).replace(/%h/g,e.slice(0,7)).replace(/%s/g,t.message.split(`
|
|
2711
|
-
`)[0]).replace(/%an/g,t.author.name).replace(/%ae/g,t.author.email).replace(/%ad/g,r.toLocaleString()).replace(/%ar/g,this.relativeDate(r))}relativeDate(e){let t=Date.now()-e.getTime(),n=Math.floor(t/1e3),r=Math.floor(n/60),i=Math.floor(r/60),a=Math.floor(i/24),o=Math.floor(a/7),s=Math.floor(a/30),c=Math.floor(a/365);return n<60?`${n} seconds ago`:r<60?`${r} minute${r===1?``:`s`} ago`:i<24?`${i} hour${i===1?``:`s`} ago`:a<7?`${a} day${a===1?``:`s`} ago`:o<4?`${o} week${o===1?``:`s`} ago`:s<12?`${s} month${s===1?``:`s`} ago`:`${c} year${c===1?``:`s`} ago`}async logStatForCommit(e,t){let{commit:n,oid:r}=t,i=n.parent.length>0?n.parent[0]:void 0;return i?(await this.diffCommits(e,i,r,{nameOnly:!1,stat:!0})).stdout:await this.diffInitialCommit(e,r,!0)}async branch(e,t){let n=t.includes(`-d`)||t.includes(`-D`)||t.includes(`--delete`),r=t.includes(`-a`)||t.includes(`--all`),i=t.find(e=>!e.startsWith(`-`));if(n&&i)return await cK({fs:this.lfs,dir:e,ref:i}),{stdout:`Deleted branch ${i}\n`,stderr:``,exitCode:0};if(i&&!n)return await uG({fs:this.lfs,dir:e,ref:i}),{stdout:``,stderr:``,exitCode:0};let a=await EK({fs:this.lfs,dir:e}),o=await oK({fs:this.lfs,dir:e}),s=``;for(let e of a)e===o?s+=`* \x1b[32m${e}\x1b[0m\n`:s+=` ${e}\n`;if(r)try{let t=await EK({fs:this.lfs,dir:e,remote:`origin`});for(let e of t)s+=` \x1b[31mremotes/origin/${e}\x1b[0m\n`}catch{}return{stdout:s,stderr:``,exitCode:0}}async checkout(e,t){let n=t.includes(`-b`),r=t.indexOf(`--`);if(
|
|
2712
|
-
`,exitCode:1};let
|
|
2713
|
-
`,exitCode:1}}async checkoutFiles(e,t,n){let r=n??`HEAD`,i=await nq({fs:this.lfs,dir:e,ref:r});for(let n of t){let{blob:t}=await XK({fs:this.lfs,dir:e,oid:i,filepath:n}),r=n.lastIndexOf(`/`);r!==-1&&await this.options.fs.mkdir(`${e}/${n.slice(0,r)}`,{recursive:!0}),await this.options.fs.writeFile(`${e}/${n}`,t),await UW({fs:this.lfs,dir:e,filepath:n})}return{stdout:``,stderr:``,exitCode:0}}async diff(e,t){let n=t.includes(`--staged`)||t.includes(`--cached`),r=t.includes(`--name-only`),i=t.includes(`--stat`),a=t.filter(e=>!e.startsWith(`-`));if(a.length>=2)return this.diffCommits(e,a[0],a[1],{nameOnly:r,stat:i});let o=
|
|
2711
|
+
`)[0]).replace(/%an/g,t.author.name).replace(/%ae/g,t.author.email).replace(/%ad/g,r.toLocaleString()).replace(/%ar/g,this.relativeDate(r))}relativeDate(e){let t=Date.now()-e.getTime(),n=Math.floor(t/1e3),r=Math.floor(n/60),i=Math.floor(r/60),a=Math.floor(i/24),o=Math.floor(a/7),s=Math.floor(a/30),c=Math.floor(a/365);return n<60?`${n} seconds ago`:r<60?`${r} minute${r===1?``:`s`} ago`:i<24?`${i} hour${i===1?``:`s`} ago`:a<7?`${a} day${a===1?``:`s`} ago`:o<4?`${o} week${o===1?``:`s`} ago`:s<12?`${s} month${s===1?``:`s`} ago`:`${c} year${c===1?``:`s`} ago`}async logStatForCommit(e,t){let{commit:n,oid:r}=t,i=n.parent.length>0?n.parent[0]:void 0;return i?(await this.diffCommits(e,i,r,{nameOnly:!1,stat:!0})).stdout:await this.diffInitialCommit(e,r,!0)}async branch(e,t){let n=t.includes(`-d`)||t.includes(`-D`)||t.includes(`--delete`),r=t.includes(`-a`)||t.includes(`--all`),i=t.find(e=>!e.startsWith(`-`));if(n&&i)return await cK({fs:this.lfs,dir:e,ref:i}),{stdout:`Deleted branch ${i}\n`,stderr:``,exitCode:0};if(i&&!n)return await uG({fs:this.lfs,dir:e,ref:i}),{stdout:``,stderr:``,exitCode:0};let a=await EK({fs:this.lfs,dir:e}),o=await oK({fs:this.lfs,dir:e}),s=``;for(let e of a)e===o?s+=`* \x1b[32m${e}\x1b[0m\n`:s+=` ${e}\n`;if(r)try{let t=await EK({fs:this.lfs,dir:e,remote:`origin`});for(let e of t)s+=` \x1b[31mremotes/origin/${e}\x1b[0m\n`}catch{}return{stdout:s,stderr:``,exitCode:0}}async checkout(e,t){let n=t.includes(`-b`),r=t.includes(`-f`)||t.includes(`--force`),i=t.indexOf(`--`);if(i!==-1){let n=t.slice(i+1);if(n.length===0)return{stdout:``,stderr:`error: you must specify path(s) to restore
|
|
2712
|
+
`,exitCode:1};let r=t.slice(0,i).filter(e=>!e.startsWith(`-`))[0];return this.checkoutFiles(e,n,r)}let a=t.find(e=>!e.startsWith(`-`));if(!a)return{stdout:``,stderr:`error: you must specify path(s) or a branch to checkout
|
|
2713
|
+
`,exitCode:1};if(n){let n=t.indexOf(`-b`),i=t.slice(n+1).filter(e=>!e.startsWith(`-`)),o=i.length>1?i[1]:void 0;return await uG({fs:this.lfs,dir:e,ref:a,object:o,checkout:!0,force:r}),{stdout:`Switched to a new branch '${a}'\n`,stderr:``,exitCode:0}}return await _G({fs:this.lfs,dir:e,ref:a,force:r}),{stdout:`Switched to branch '${a}'\n`,stderr:``,exitCode:0}}async checkoutFiles(e,t,n){let r=n??`HEAD`,i=await nq({fs:this.lfs,dir:e,ref:r});for(let n of t){let{blob:t}=await XK({fs:this.lfs,dir:e,oid:i,filepath:n}),r=n.lastIndexOf(`/`);r!==-1&&await this.options.fs.mkdir(`${e}/${n.slice(0,r)}`,{recursive:!0}),await this.options.fs.writeFile(`${e}/${n}`,t),await UW({fs:this.lfs,dir:e,filepath:n})}return{stdout:``,stderr:``,exitCode:0}}async diff(e,t){let n=t.includes(`--staged`)||t.includes(`--cached`),r=t.includes(`--name-only`),i=t.includes(`--stat`),a=t.filter(e=>!e.startsWith(`-`));if(a.length>=2)return this.diffCommits(e,a[0],a[1],{nameOnly:r,stat:i});let o=n?await this.diffStagedChanges(e):await this.diffWorkdirChanges(e);if(o.length===0)return{stdout:``,stderr:``,exitCode:0};if(r)return{stdout:o.map(e=>e.filepath).join(`
|
|
2714
2714
|
`)+`
|
|
2715
|
-
`,stderr:``,exitCode:0};if(i)return this.formatDiffStat(o);let s=``;for(let e of o)s+=_q({oldContent:e.oldContent,newContent:e.newContent,oldName:e.filepath,newName:e.filepath});return{stdout:s,stderr:``,exitCode:0}}async diffCommits(e,t,n,r){let i=t,a=n;try{i=await gK({fs:this.lfs,dir:e,oid:t})}catch{try{i=await nq({fs:this.lfs,dir:e,ref:t})}catch{}}try{a=await gK({fs:this.lfs,dir:e,oid:n})}catch{try{a=await nq({fs:this.lfs,dir:e,ref:n})}catch{}}let o=[];if(await cq({fs:this.lfs,dir:e,trees:[gW({ref:i}),gW({ref:a})],map:async(e,[t,n])=>{if(e===`.`)return;let r=t?await t.type():void 0,i=n?await n.type():void 0;if(r===`tree`||i===`tree`||(t?await t.oid():void 0)===(n?await n.oid():void 0))return;let a=t?await t.content():void 0,s=n?await n.content():void 0,c=a?new TextDecoder().decode(a):``,l=s?new TextDecoder().decode(s):``;o.push({filepath:e,oldContent:c,newContent:l})}}),o.length===0)return{stdout:``,stderr:``,exitCode:0};if(r.nameOnly)return{stdout:o.map(e=>e.filepath).join(`
|
|
2715
|
+
`,stderr:``,exitCode:0};if(i)return this.formatDiffStat(o);let s=``;for(let e of o)s+=_q({oldContent:e.oldContent,newContent:e.newContent,oldName:e.filepath,newName:e.filepath});return{stdout:s,stderr:``,exitCode:0}}async diffStagedChanges(e){let t=[];return await cq({fs:this.lfs,dir:e,trees:[gW({ref:`HEAD`}),gH()],map:async(n,[r,i])=>{if(n===`.`||n.startsWith(`.git`))return;let a=r?await r.type():void 0,o=i?await i.type():void 0;if(a===`tree`||o===`tree`)return;let s=r?await r.oid():void 0,c=i?await i.oid():void 0;if(s===c)return;let l=await this.readBlobText(e,s),u=await this.readBlobText(e,c);t.push({filepath:n,oldContent:l,newContent:u})}}),t}async diffWorkdirChanges(e){let t=[],n=new Map;await cq({fs:this.lfs,dir:e,trees:[gH()],map:async(e,[t])=>{if(e===`.`||e.startsWith(`.git`)||!t||await t.type()!==`blob`)return;let r=await t.oid();r&&n.set(e,r)}});for(let[r,i]of n){let n=await this.readBlobText(e,i),a=``;try{a=await this.options.fs.readTextFile(`${e}/${r}`)}catch{}n!==a&&t.push({filepath:r,oldContent:n,newContent:a})}return t}async readBlobText(e,t){if(!t)return``;try{let{blob:n}=await XK({fs:this.lfs,dir:e,oid:t});return new TextDecoder().decode(n)}catch{return``}}async diffCommits(e,t,n,r){let i=t,a=n;try{i=await gK({fs:this.lfs,dir:e,oid:t})}catch{try{i=await nq({fs:this.lfs,dir:e,ref:t})}catch{}}try{a=await gK({fs:this.lfs,dir:e,oid:n})}catch{try{a=await nq({fs:this.lfs,dir:e,ref:n})}catch{}}let o=[];if(await cq({fs:this.lfs,dir:e,trees:[gW({ref:i}),gW({ref:a})],map:async(e,[t,n])=>{if(e===`.`)return;let r=t?await t.type():void 0,i=n?await n.type():void 0;if(r===`tree`||i===`tree`||(t?await t.oid():void 0)===(n?await n.oid():void 0))return;let a=t?await t.content():void 0,s=n?await n.content():void 0,c=a?new TextDecoder().decode(a):``,l=s?new TextDecoder().decode(s):``;o.push({filepath:e,oldContent:c,newContent:l})}}),o.length===0)return{stdout:``,stderr:``,exitCode:0};if(r.nameOnly)return{stdout:o.map(e=>e.filepath).join(`
|
|
2716
2716
|
`)+`
|
|
2717
2717
|
`,stderr:``,exitCode:0};if(r.stat)return this.formatDiffStat(o);let s=``;for(let e of o)s+=_q({oldContent:e.oldContent,newContent:e.newContent,oldName:e.filepath,newName:e.filepath});return{stdout:s,stderr:``,exitCode:0}}formatDiffStat(e){let t=`\x1B[0m`,n=``,r=0,i=0,a=0,o=e.map(e=>{let t=vq(e.oldContent,e.newContent);return e.filepath.length>a&&(a=e.filepath.length),r+=t.insertions,i+=t.deletions,{filepath:e.filepath,...t}});for(let e of o){let r=e.insertions+e.deletions,i=`[32m${`+`.repeat(e.insertions)}${t}[31m${`-`.repeat(e.deletions)}${t}`;n+=` ${e.filepath.padEnd(a)} | ${String(r).padStart(4)} ${i}\n`}return n+=` ${e.length} file${e.length===1?``:`s`} changed`,r>0&&(n+=`, ${r} insertion${r===1?``:`s`}(+)`),i>0&&(n+=`, ${i} deletion${i===1?``:`s`}(-)`),n+=`
|
|
2718
2718
|
`,{stdout:n,stderr:``,exitCode:0}}async show(e,t){let n=t.includes(`--stat`),r=this.parseArg(t,`--format`,`--pretty`),i=new Set([`--format`,`--pretty`]),a;for(let e=0;e<t.length;e++){let n=t[e];if(n.startsWith(`-`)){i.has(n)&&e++;continue}a=n;break}if(a?.includes(`:`))return await this.showFileAtCommit(e,a);let o=a??`HEAD`,s;try{s=await nq({fs:this.lfs,dir:e,ref:o})}catch{try{s=await gK({fs:this.lfs,dir:e,oid:o})}catch{return{stdout:``,stderr:`fatal: bad object ${o}\n`,exitCode:128}}}let{commit:c}=await ZK({fs:this.lfs,dir:e,oid:s}),l=this.formatShowHeader(s,c,r),u=c.parent.length>0?c.parent[0]:void 0;if(u){let t=await this.diffCommits(e,u,s,{nameOnly:!1,stat:n});l+=t.stdout}else{let t=await this.diffInitialCommit(e,s,n);l+=t}return{stdout:l,stderr:``,exitCode:0}}async showFileAtCommit(e,t){let n=t.indexOf(`:`),r=t.slice(0,n)||`HEAD`,i=t.slice(n+1),a=await nq({fs:this.lfs,dir:e,ref:r}),o=await XK({fs:this.lfs,dir:e,oid:a,filepath:i});return{stdout:new TextDecoder().decode(o.blob),stderr:``,exitCode:0}}formatShowHeader(e,t,n){if(n)return n.replace(/%H/g,e).replace(/%h/g,e.slice(0,7)).replace(/%s/g,t.message.split(`
|
|
@@ -2723,23 +2723,23 @@ Available commands:
|
|
|
2723
2723
|
`,exitCode:128};try{let t=await RK({fs:this.lfs,dir:e,ours:await oK({fs:this.lfs,dir:e})??void 0,theirs:i,fastForward:!n,fastForwardOnly:r,author:await this.resolveAuthor(e),abortOnConflict:!0});return t.alreadyMerged?{stdout:`Already up to date.
|
|
2724
2724
|
`,stderr:``,exitCode:0}:t.fastForward?(await _G({fs:this.lfs,dir:e,ref:await oK({fs:this.lfs,dir:e})??`HEAD`}),{stdout:`Updating..${t.oid?t.oid.slice(0,7):``}\nFast-forward\n`,stderr:``,exitCode:0}):t.mergeCommit?(await _G({fs:this.lfs,dir:e,ref:await oK({fs:this.lfs,dir:e})??`HEAD`}),{stdout:`Merge made by the 'ort' strategy.
|
|
2725
2725
|
`,stderr:``,exitCode:0}):{stdout:`Merge complete.
|
|
2726
|
-
`,stderr:``,exitCode:0}}catch(e){if(e instanceof Error&&e.name===`MergeConflictError`){let t=e.data?.filepaths??[],n=`Auto-merging failed. Fix conflicts and then commit the result.
|
|
2726
|
+
`,stderr:``,exitCode:0}}catch(e){return this.handleMergeError(e)}}handleMergeError(e){if(e instanceof Error&&e.name===`MergeConflictError`){let t=e.data?.filepaths??[],n=`Auto-merging failed. Fix conflicts and then commit the result.
|
|
2727
2727
|
`;if(t.length>0){n+=`CONFLICT (content): Merge conflict in:
|
|
2728
2728
|
`;for(let e of t)n+=` ${e}\n`}return{stdout:``,stderr:n,exitCode:1}}if(e instanceof Error&&e.name===`MergeNotSupportedError`)return{stdout:``,stderr:`fatal: merge is not possible because you have unmerged files.
|
|
2729
2729
|
`,exitCode:128};if(e instanceof Error&&e.name===`FastForwardError`)return{stdout:``,stderr:`fatal: Not possible to fast-forward, aborting.
|
|
2730
|
-
`,exitCode:128};throw e}
|
|
2731
|
-
`,exitCode:128}}if(r!==void 0||c.length===0){let t=await MK({fs:this.lfs,dir:e}),n=t,i=r||void 0;if(i){let e=RegExp(`^`+i.replace(/\*/g,`.*`)+`$`);n=t.filter(t=>e.test(t))}return{stdout:n.map(e=>`${e}\n`).join(``),stderr:``,exitCode:0}}let l=c[0],u=c[1];if(i||a){let t=await this.resolveAuthor(e);await cG({fs:this.lfs,dir:e,ref:l,message:a??l,object:u,tagger:{...t,timestamp:Math.floor(Date.now()/1e3),timezoneOffset:0},force:o})}else await oq({fs:this.lfs,dir:e,ref:l,object:u,force:o});return{stdout:``,stderr:``,exitCode:0}}async lsFiles(e,t){let n=t.includes(`--modified`)||t.includes(`-m`),r=t.includes(`--others`)||t.includes(`-o`),i=t.includes(`--deleted`)||t.includes(`-d`),a=await aq({fs:this.lfs,dir:e}),o=[]
|
|
2732
|
-
`,exitCode:1};
|
|
2733
|
-
`,exitCode:1};
|
|
2730
|
+
`,exitCode:128};throw e}async tag(e,t){let n=t.includes(`-d`)||t.includes(`--delete`),r=this.parseArg(t,`-l`,`--list`),i=t.includes(`-a`)||t.includes(`--annotate`),a=this.parseArg(t,`-m`,`--message`),o=t.includes(`-f`)||t.includes(`--force`),s=new Set([`-l`,`--list`,`-m`,`--message`]),c=[];for(let e=0;e<t.length;e++){let n=t[e];if(n.startsWith(`-`)){s.has(n)&&e++;continue}c.push(n)}if(n){let t=c[0];return t?(await fK({fs:this.lfs,dir:e,ref:t}),{stdout:`Deleted tag '${t}'\n`,stderr:``,exitCode:0}):{stdout:``,stderr:`fatal: tag name required
|
|
2731
|
+
`,exitCode:128}}if(r!==void 0||c.length===0){let t=await MK({fs:this.lfs,dir:e}),n=t,i=r||void 0;if(i){let e=RegExp(`^`+i.replace(/\*/g,`.*`)+`$`);n=t.filter(t=>e.test(t))}return{stdout:n.map(e=>`${e}\n`).join(``),stderr:``,exitCode:0}}let l=c[0],u=c[1];if(i||a){let t=await this.resolveAuthor(e);await cG({fs:this.lfs,dir:e,ref:l,message:a??l,object:u,tagger:{...t,timestamp:Math.floor(Date.now()/1e3),timezoneOffset:0},force:o})}else await oq({fs:this.lfs,dir:e,ref:l,object:u,force:o});return{stdout:``,stderr:``,exitCode:0}}async lsFiles(e,t){let n=t.includes(`--modified`)||t.includes(`-m`),r=t.includes(`--others`)||t.includes(`-o`),i=t.includes(`--deleted`)||t.includes(`-d`),a=await aq({fs:this.lfs,dir:e}),o=[],s=r?`others`:n?`modified`:i?`deleted`:`cached`;for(let[e,t,n,r]of a)this.lsFilesMatch(s,t,n,r)&&o.push(e);return o.sort(),{stdout:o.map(e=>`${e}\n`).join(``),stderr:``,exitCode:0}}lsFilesMatch(e,t,n,r){switch(e){case`others`:return t===0&&r===0&&n===2;case`modified`:return n!==0&&n!==r&&t!==0;case`deleted`:return n===0&&(t!==0||r!==0);case`cached`:if(r!==0||t!==0){if(n===0&&r===0&&t!==0)return!1;if(r!==0||t!==0&&n!==0)return!0}return!1}}async showRef(e,t){let n=t.includes(`--heads`),r=t.includes(`--tags`),i=t.find(e=>!e.startsWith(`-`)),a=``;if(!r){let t=await EK({fs:this.lfs,dir:e});for(let n of t){let t=await nq({fs:this.lfs,dir:e,ref:n}),r=`refs/heads/${n}`;i&&!r.includes(i)||(a+=`${t} ${r}\n`)}}if(!n){let t=await MK({fs:this.lfs,dir:e});for(let n of t){let t=await nq({fs:this.lfs,dir:e,ref:n}),r=`refs/tags/${n}`;i&&!r.includes(i)||(a+=`${t} ${r}\n`)}}return{stdout:a,stderr:``,exitCode:0}}async config(e,t){let n=t.includes(`--list`)||t.includes(`-l`),r=t.includes(`--unset`),i=t.includes(`--global`),a=t.find(e=>!e.startsWith(`-`)&&e.includes(`.`));if(n)return this.configList(e,i);if(r)return this.configUnset(e,a,i);if(!a)return{stdout:``,stderr:`usage: git config [--global] [--list] [--unset] <key> [<value>]
|
|
2732
|
+
`,exitCode:1};let o=t.indexOf(a),s;for(let e=o+1;e<t.length;e++)if(!t[e].startsWith(`-`)){s=t[e];break}return s===void 0?this.configGet(e,a,i):this.configSet(e,a,s,i)}async configUnset(e,t,n){if(!t)return{stdout:``,stderr:`error: key required for --unset
|
|
2733
|
+
`,exitCode:1};if(t===`credential.token`||t===`github.token`)return await this.setGithubToken(``),{stdout:``,stderr:``,exitCode:0};if(n){let e=await this.getGlobalFs();try{let n=Cq(await e.readTextFile(bq),t);await e.writeFile(bq,n)}catch{}}else try{let n=`${e}/.git/config`,r=Cq(await this.options.fs.readTextFile(n),t);await this.options.fs.writeFile(n,r)}catch{}return{stdout:``,stderr:``,exitCode:0}}async configSet(e,t,n,r){return t===`credential.token`||t===`github.token`?(await this.setGithubToken(n),{stdout:``,stderr:``,exitCode:0}):(r?await Sq(await this.getGlobalFs(),t,n):await rq({fs:this.lfs,dir:e,path:t,value:n}),t===`user.name`&&(this.authorName=n),t===`user.email`&&(this.authorEmail=n),{stdout:``,stderr:``,exitCode:0})}async configGet(e,t,n){if(t===`credential.token`||t===`github.token`)return{stdout:this.githubToken?`${this.githubToken}\n`:``,stderr:``,exitCode:+!this.githubToken};let r;return n?r=await xq(await this.getGlobalFs(),t):(r=await CK({fs:this.lfs,dir:e,path:t}),r||=await xq(await this.getGlobalFs(),t)),{stdout:r?`${r}\n`:``,stderr:``,exitCode:+!r}}async configList(e,t){let n=``;if(!t)try{let t=`${e}/.git/config`,r=await this.options.fs.readTextFile(t);n+=this.parseGitConfigToList(r)}catch{}try{let e=await(await this.getGlobalFs()).readTextFile(bq);n+=this.parseGitConfigToList(e)}catch{}return{stdout:n,stderr:``,exitCode:0}}parseGitConfigToList(e){let t=``,n=``,r=``;for(let i of e.split(`
|
|
2734
2734
|
`)){let e=i.trim();if(!e||e.startsWith(`#`)||e.startsWith(`;`))continue;let a=e.match(/^\[(\w+)(?:\s+"([^"]*)")?\]$/);if(a){n=a[1].toLowerCase(),r=a[2]??``;continue}let o=e.match(/^(\w+)\s*=\s*(.*)$/);if(o&&n){let e=o[1],i=o[2].trim(),a=r?`${n}.${r}.${e}`:`${n}.${e}`;t+=`${a}=${i}\n`}}return t}async reset(e,t){let n=t.includes(`--soft`),r=t.includes(`--hard`),i=t.includes(`--mixed`),a=t.filter(e=>!e.startsWith(`-`)),o=n||r||i;if(!o&&a.length===0){let t=await aq({fs:this.lfs,dir:e});for(let[n,r,,i]of t)i!==r&&await tq({fs:this.lfs,dir:e,filepath:n});return{stdout:``,stderr:``,exitCode:0}}if(!o){let t=a.filter(e=>e!==`HEAD`);if(t.length===0){let t=await aq({fs:this.lfs,dir:e});for(let[n,r,,i]of t)i!==r&&await tq({fs:this.lfs,dir:e,filepath:n});return{stdout:``,stderr:``,exitCode:0}}for(let n of t)await tq({fs:this.lfs,dir:e,filepath:n});return{stdout:``,stderr:``,exitCode:0}}let s=a[0]??`HEAD`,c=await nq({fs:this.lfs,dir:e,ref:s}),l=await oK({fs:this.lfs,dir:e,fullname:!0});if(!l)return{stdout:``,stderr:`fatal: not on a branch, cannot reset
|
|
2735
2735
|
`,exitCode:128};if(await dq({fs:this.lfs,dir:e,ref:l,value:c,force:!0}),n)return{stdout:`HEAD is now at ${c.slice(0,7)}\n`,stderr:``,exitCode:0};let u=new Set(await kK({fs:this.lfs,dir:e}));for(let t of u)await $K({fs:this.lfs,dir:e,filepath:t});return await this.resetIndexToCommit(e,c),r&&await this.resetWorkdirToCommit(e,c,u),{stdout:`HEAD is now at ${c.slice(0,7)}\n`,stderr:``,exitCode:0}}async resetIndexToCommit(e,t){let{tree:n}=await QK({fs:this.lfs,dir:e,oid:t});await this.addTreeToIndex(e,t,n,``)}async addTreeToIndex(e,t,n,r){for(let i of n){let n=r?`${r}/${i.path}`:i.path;if(i.type===`blob`)await tq({fs:this.lfs,dir:e,filepath:n,ref:t});else if(i.type===`tree`){let{tree:r}=await QK({fs:this.lfs,dir:e,oid:i.oid});await this.addTreeToIndex(e,t,r,n)}}}async resetWorkdirToCommit(e,t,n){let r=new Set,{tree:i}=await QK({fs:this.lfs,dir:e,oid:t});await this.collectTreeFiles(e,i,``,r);for(let n of r){let{blob:r}=await XK({fs:this.lfs,dir:e,oid:t,filepath:n}),i=n.lastIndexOf(`/`);i!==-1&&await this.options.fs.mkdir(`${e}/${n.slice(0,i)}`,{recursive:!0}),await this.options.fs.writeFile(`${e}/${n}`,r)}for(let t of n)if(!r.has(t))try{await this.options.fs.rm(`${e}/${t}`)}catch{}}async collectTreeFiles(e,t,n,r){for(let i of t){let t=n?`${n}/${i.path}`:i.path;if(i.type===`blob`)r.add(t);else if(i.type===`tree`){let{tree:n}=await QK({fs:this.lfs,dir:e,oid:i.oid});await this.collectTreeFiles(e,n,t,r)}}}async stash(e,t){let n=t[0];if(!n||n.startsWith(`-`))return this.stashPush(e,t);switch(n){case`push`:case`save`:return this.stashPush(e,t.slice(1));case`pop`:return this.stashPop(e);case`list`:return this.stashList(e);case`drop`:return this.stashDrop(e,t.slice(1));case`show`:return this.stashShow(e);default:return{stdout:``,stderr:`error: unknown subcommand: ${n}\n`,exitCode:1}}}async stashPush(e,t){let n=await oK({fs:this.lfs,dir:e})??`HEAD`,r;try{r=await nq({fs:this.lfs,dir:e,ref:`HEAD`})}catch{return{stdout:``,stderr:`fatal: cannot stash without a HEAD commit
|
|
2736
|
-
`,exitCode:128}}let i=await kK({fs:this.lfs,dir:e,ref:`HEAD`}),a=await kK({fs:this.lfs,dir:e}),o=new Set([...i,...a]),s=await aq({fs:this.lfs,dir:e});for(let[e,t,,n]of s)t===0&&n!==0&&o.add(e);let
|
|
2736
|
+
`,exitCode:128}}let i=await kK({fs:this.lfs,dir:e,ref:`HEAD`}),a=await kK({fs:this.lfs,dir:e}),o=new Set([...i,...a]),s=await aq({fs:this.lfs,dir:e});for(let[e,t,,n]of s)t===0&&n!==0&&o.add(e);let{dirtyFiles:c,indexEntries:l}=await this.stashCollectDirty(e,r,o,i);if(c.length===0)return{stdout:``,stderr:`No local changes to save
|
|
2737
2737
|
`,exitCode:1};let u=await this.buildTreeFromEntries(e,l),d=[r];try{let t=await nq({fs:this.lfs,dir:e,ref:`refs/stash`});d.push(t)}catch{}let{commit:f}=await ZK({fs:this.lfs,dir:e,oid:r}),p=`WIP on ${n}: ${r.slice(0,7)} ${f.message.split(`
|
|
2738
|
-
`)[0]}`,m=await this.resolveAuthor(e),h=Math.floor(Date.now()/1e3),g=await uq({fs:this.lfs,dir:e,commit:{tree:u,parent:d,author:{...m,timestamp:h,timezoneOffset:0},committer:{...m,timestamp:h,timezoneOffset:0},message:p}});await dq({fs:this.lfs,dir:e,ref:`refs/stash`,value:g,force:!0});for(let
|
|
2738
|
+
`)[0]}`,m=await this.resolveAuthor(e),h=Math.floor(Date.now()/1e3),g=await uq({fs:this.lfs,dir:e,commit:{tree:u,parent:d,author:{...m,timestamp:h,timezoneOffset:0},committer:{...m,timestamp:h,timezoneOffset:0},message:p}});return await dq({fs:this.lfs,dir:e,ref:`refs/stash`,value:g,force:!0}),await this.stashRestoreWorkdir(e,r,c),{stdout:`Saved working directory and index state ${p}\n`,stderr:``,exitCode:0}}async stashCollectDirty(e,t,n,r){let i=[],a=[];for(let o of n){let n=r.includes(o),s;try{s=await this.options.fs.readTextFile(`${e}/${o}`)}catch{}if(n){let{blob:n}=await XK({fs:this.lfs,dir:e,oid:t,filepath:o}),r=new TextDecoder().decode(n);if(s===void 0)i.push({file:o,inHead:!0,existsInWorkdir:!1});else if(s!==r){i.push({file:o,inHead:!0,existsInWorkdir:!0});let t=await lq({fs:this.lfs,dir:e,blob:new TextEncoder().encode(s)});a.push({filepath:o,oid:t})}else{let t=await lq({fs:this.lfs,dir:e,blob:n});a.push({filepath:o,oid:t})}}else if(s!==void 0){i.push({file:o,inHead:!1,existsInWorkdir:!0});let t=await lq({fs:this.lfs,dir:e,blob:new TextEncoder().encode(s)});a.push({filepath:o,oid:t})}}return{dirtyFiles:i,indexEntries:a}}async stashRestoreWorkdir(e,t,n){for(let r of n)if(r.inHead){let{blob:n}=await XK({fs:this.lfs,dir:e,oid:t,filepath:r.file});await this.options.fs.writeFile(`${e}/${r.file}`,n),await tq({fs:this.lfs,dir:e,filepath:r.file,ref:t})}else{try{await this.options.fs.rm(`${e}/${r.file}`)}catch{}try{await $K({fs:this.lfs,dir:e,filepath:r.file})}catch{}}}async buildTreeFromEntries(e,t){let n=new Map;for(let{filepath:e,oid:r}of t){let t=e.split(`/`),i=n;for(let e=0;e<t.length-1;e++){let n=i.get(t[e]);n?.type!==`tree`&&(n={type:`tree`,children:new Map},i.set(t[e],n)),i=n.children}i.set(t[t.length-1],{type:`blob`,oid:r,mode:`100644`})}let r=async t=>{let n=[];for(let[e,i]of t)if(i.type===`blob`)n.push({mode:i.mode,path:e,oid:i.oid,type:`blob`});else{let t=await r(i.children);n.push({mode:`040000`,path:e,oid:t,type:`tree`})}return await fq({fs:this.lfs,dir:e,tree:n})};return r(n)}async stashPop(e){let t;try{t=await nq({fs:this.lfs,dir:e,ref:`refs/stash`})}catch{return{stdout:``,stderr:`error: No stash entries found.
|
|
2739
2739
|
`,exitCode:1}}let{commit:n}=await ZK({fs:this.lfs,dir:e,oid:t}),r=await nq({fs:this.lfs,dir:e,ref:`HEAD`});return await this.restoreStashTree(e,n.tree,r),n.parent.length>1?await dq({fs:this.lfs,dir:e,ref:`refs/stash`,value:n.parent[1],force:!0}):await this.deleteRef(e,`refs/stash`),{stdout:`Dropped refs/stash@{0} (${t.slice(0,7)})\n`,stderr:``,exitCode:0}}async restoreStashTree(e,t,n){let r=new Map,i=async(t,n)=>{let{tree:a}=await QK({fs:this.lfs,dir:e,oid:t});for(let t of a){let a=n?`${n}/${t.path}`:t.path;if(t.type===`blob`){let{blob:n}=await XK({fs:this.lfs,dir:e,oid:t.oid});r.set(a,n)}else t.type===`tree`&&await i(t.oid,a)}};await i(t,``);let a=new Set;try{let t=await kK({fs:this.lfs,dir:e,ref:`HEAD`});for(let e of t)a.add(e)}catch{}for(let[t,i]of r){let r=t.lastIndexOf(`/`);r!==-1&&await this.options.fs.mkdir(`${e}/${t.slice(0,r)}`,{recursive:!0}),await this.options.fs.writeFile(`${e}/${t}`,i);let o=new TextDecoder().decode(i),s;if(a.has(t))try{let{blob:r}=await XK({fs:this.lfs,dir:e,oid:n,filepath:t});s=new TextDecoder().decode(r)}catch{}s!==o&&await UW({fs:this.lfs,dir:e,filepath:t})}for(let t of a)if(!r.has(t)){try{await this.options.fs.rm(`${e}/${t}`)}catch{}await $K({fs:this.lfs,dir:e,filepath:t})}}async stashList(e){let t=``,n=0;try{let r=await nq({fs:this.lfs,dir:e,ref:`refs/stash`});for(;r;){let{commit:i}=await ZK({fs:this.lfs,dir:e,oid:r});if(t+=`stash@{${n}}: ${i.message}\n`,n++,i.parent.length>1)r=i.parent[1];else break}}catch{}return{stdout:t,stderr:``,exitCode:0}}async stashDrop(e,t){let n=0,r=t.find(e=>e.startsWith(`stash@{`));if(r){let e=r.match(/stash@\{(\d+)\}/);e&&(n=parseInt(e[1],10))}let i;try{i=await nq({fs:this.lfs,dir:e,ref:`refs/stash`})}catch{return{stdout:``,stderr:`error: No stash entries found.
|
|
2740
2740
|
`,exitCode:1}}if(n===0){let{commit:t}=await ZK({fs:this.lfs,dir:e,oid:i});return t.parent.length>1?await dq({fs:this.lfs,dir:e,ref:`refs/stash`,value:t.parent[1],force:!0}):await this.deleteRef(e,`refs/stash`),{stdout:`Dropped refs/stash@{0} (${i.slice(0,7)})\n`,stderr:``,exitCode:0}}let a=[],o=i;for(let t=0;t<n;t++){let{commit:t}=await ZK({fs:this.lfs,dir:e,oid:o});if(a.push({oid:o,commit:t}),t.parent.length<=1)return{stdout:``,stderr:`error: stash@{${n}} not found\n`,exitCode:1};o=t.parent[1]}let s=o,{commit:c}=await ZK({fs:this.lfs,dir:e,oid:s}),l=c.parent.length>1?c.parent[1]:void 0;for(let t=a.length-1;t>=0;t--){let n=a[t],r=[n.commit.parent[0]];l&&r.push(l),l=await uq({fs:this.lfs,dir:e,commit:{...n.commit,parent:r}})}return l?await dq({fs:this.lfs,dir:e,ref:`refs/stash`,value:l,force:!0}):await this.deleteRef(e,`refs/stash`),{stdout:`Dropped refs/stash@{${n}} (${s.slice(0,7)})\n`,stderr:``,exitCode:0}}async stashShow(e){let t;try{t=await nq({fs:this.lfs,dir:e,ref:`refs/stash`})}catch{return{stdout:``,stderr:`error: No stash entries found.
|
|
2741
2741
|
`,exitCode:1}}let{commit:n}=await ZK({fs:this.lfs,dir:e,oid:t}),r=n.parent[0];return this.diffCommits(e,r,t,{nameOnly:!1,stat:!0})}async deleteRef(e,t){try{await this.lfs.unlink(`${e}/.git/${t}`)}catch{}}async rm(e,t){let n=t.includes(`--cached`),r=t.includes(`-r`)||t.includes(`-R`)||t.includes(`--recursive`),i=t.filter(e=>!e.startsWith(`-`));if(i.length===0)return{stdout:``,stderr:`fatal: No pathspec given. Which files should I remove?
|
|
2742
|
-
`,exitCode:128};for(let t of i){let i=t.startsWith(`/`)?t:`${e}/${t}`,a=!1;try{a=(await this.options.fs.stat(i)).type===`directory`}catch{}if(a){if(!r)return{stdout:``,stderr:`fatal: not removing '${t}' recursively without -r\n`,exitCode:128};let i=(await kK({fs:this.lfs,dir:e})).filter(e=>e===t||e.startsWith(t+`/`));for(let t of i)if(await $K({fs:this.lfs,dir:e,filepath:t}),!n)try{await this.options.fs.rm(`${e}/${t}`)}catch{}}else if(await $K({fs:this.lfs,dir:e,filepath:t}),!n)try{await this.options.fs.rm(i)}catch{}
|
|
2742
|
+
`,exitCode:128};for(let t of i){let i=await this.rmOne(e,t,n,r);if(i)return i}return{stdout:``,stderr:``,exitCode:0}}async rmOne(e,t,n,r){let i=t.startsWith(`/`)?t:`${e}/${t}`,a=!1;try{a=(await this.options.fs.stat(i)).type===`directory`}catch{}if(a){if(!r)return{stdout:``,stderr:`fatal: not removing '${t}' recursively without -r\n`,exitCode:128};let i=(await kK({fs:this.lfs,dir:e})).filter(e=>e===t||e.startsWith(t+`/`));for(let t of i)if(await $K({fs:this.lfs,dir:e,filepath:t}),!n)try{await this.options.fs.rm(`${e}/${t}`)}catch{}}else if(await $K({fs:this.lfs,dir:e,filepath:t}),!n)try{await this.options.fs.rm(i)}catch{}return null}async mv(e,t){let n=t.filter(e=>!e.startsWith(`-`));if(n.length<2)return{stdout:``,stderr:`fatal: usage: git mv <source> <destination>
|
|
2743
2743
|
`,exitCode:128};let r=n[0],i=n[1],a=r.startsWith(`/`)?r:`${e}/${r}`,o=i.startsWith(`/`)?i:`${e}/${i}`,s;try{s=await this.options.fs.readFile(a,{encoding:`binary`})}catch{return{stdout:``,stderr:`fatal: bad source, source=${r}, destination=${i}\n`,exitCode:128}}let c=o.lastIndexOf(`/`);return c!==-1&&await this.options.fs.mkdir(o.slice(0,c),{recursive:!0}),await this.options.fs.writeFile(o,s),await this.options.fs.rm(a),await UW({fs:this.lfs,dir:e,filepath:i}),await $K({fs:this.lfs,dir:e,filepath:r}),{stdout:``,stderr:``,exitCode:0}}async revParse(e,t){if(t.includes(`--show-toplevel`))try{return{stdout:`${await SK({fs:this.lfs,filepath:e})}\n`,stderr:``,exitCode:0}}catch{return{stdout:``,stderr:`fatal: not a git repository
|
|
2744
2744
|
`,exitCode:128}}if(t.includes(`--is-inside-work-tree`))try{return await SK({fs:this.lfs,filepath:e}),{stdout:`true
|
|
2745
2745
|
`,stderr:``,exitCode:0}}catch{return{stdout:`false
|
|
@@ -4617,7 +4617,7 @@ Common base URLs:
|
|
|
4617
4617
|
llama.cpp http://localhost:8080/v1
|
|
4618
4618
|
vLLM http://localhost:8000/v1
|
|
4619
4619
|
Jan http://localhost:1337/v1
|
|
4620
|
-
`}function Tne(){return KM(M5,async e=>{if(e.includes(`--help`)||e.includes(`-h`))return{stdout:wne(),stderr:``,exitCode:0};let{getApiKeyForProvider:t,getRawApiKeyForProvider:n,getBaseUrlForProvider:r,addAccount:i}=await import(`./provider-settings-
|
|
4620
|
+
`}function Tne(){return KM(M5,async e=>{if(e.includes(`--help`)||e.includes(`-h`))return{stdout:wne(),stderr:``,exitCode:0};let{getApiKeyForProvider:t,getRawApiKeyForProvider:n,getBaseUrlForProvider:r,addAccount:i}=await import(`./provider-settings-vzbUm8j-.js`).then(e=>e.d),{verifyConnection:a}=await Promise.resolve().then(()=>d5),o=e[0]??`status`;if(o!==`status`&&o!==`discover`)return{stdout:``,stderr:`Unknown subcommand: ${o}. See \`local-llm --help\`.\n`,exitCode:2};let s=r(M5);if(!s)return{stdout:``,stderr:`Local LLM is not configured. Open Settings → Providers → Local LLM and set a base URL.
|
|
4621
4621
|
`,exitCode:1};let c=await a(s,t(M5)??void 0);if(!c.ok){let e=[`✗ Could not reach ${s}`,` runtime: ${c.runtime.kind}${c.runtime.version?` (${c.runtime.version})`:``}`,` error: ${c.error?.message??`unknown`}`];return c.error?.hint&&e.push(` hint: ${c.error.hint}`),{stdout:``,stderr:e.join(`
|
|
4622
4622
|
`)+`
|
|
4623
4623
|
`,exitCode:1}}return o===`discover`?(i(M5,n(M5)??``,s,c.models.join(`, `)),{stdout:[`✓ ${s} (${c.runtime.kind}${c.runtime.version?` ${c.runtime.version}`:``})`,` Saved ${c.models.length} model${c.models.length===1?``:`s`} to Settings:`,...c.models.map(e=>` • ${e}`)].join(`
|
|
@@ -4664,20 +4664,20 @@ authorization-code flow, stores the access token, and retries.
|
|
|
4664
4664
|
On success, the server is persisted to /workspace/.mcp/servers.json and
|
|
4665
4665
|
an alias shim is written to /workspace/.mcp/aliases/<name>.jsh so the
|
|
4666
4666
|
short name resolves on the PATH.
|
|
4667
|
-
`);let n=e.filter(e=>!e.startsWith(`--`));if(n.length<2)return H5(`mcp add: expected <url> <name>`);let[r,i]=n;if(!/^https?:\/\//i.test(r))return H5(`mcp add: invalid URL "${r}" (must start with http:// or https://)`);if(!/^[A-Za-z][A-Za-z0-9_-]*$/.test(i))return H5(`mcp add: invalid name "${i}" (letters, digits, _ and - only; must start with a letter)`);let{getServer:a,setServer:o}=await import(`./store-
|
|
4667
|
+
`);let n=e.filter(e=>!e.startsWith(`--`));if(n.length<2)return H5(`mcp add: expected <url> <name>`);let[r,i]=n;if(!/^https?:\/\//i.test(r))return H5(`mcp add: invalid URL "${r}" (must start with http:// or https://)`);if(!/^[A-Za-z][A-Za-z0-9_-]*$/.test(i))return H5(`mcp add: invalid name "${i}" (letters, digits, _ and - only; must start with a letter)`);let{getServer:a,setServer:o}=await import(`./store-B-z6X-rX.js`).then(e=>e.r);if(await a(i,t.fs))return H5(`mcp add: a server named "${i}" already exists`);let{McpClient:s,McpAuthRequiredError:c}=await Promise.resolve().then(()=>N5),l=new s({url:r,fetchImpl:t.fetchImpl}),u;try{await l.initialize()}catch(e){if(!(e instanceof c))throw e;u=await Ine(r,i,e.resourceMetadataUrl,t),l=new s({url:r,fetchImpl:t.fetchImpl,getAuthHeader:()=>K5(i)}),await l.initialize()}let d=await l.toolsList(),f=await l.appsList(),p=new Date().toISOString();await o(i,{url:r,tools:d,apps:f,addedAt:p,lastRefreshedAt:p,...u?{auth:u}:{}},t.fs),await ere(i,t);let m=await Y5(i,f,t);if(u){let{registerMcpProvider:e}=await import(`./provider-C1tJuqMc.js`);e({name:i,serverUrl:r,auth:u})}return V5([`Added MCP server "${i}" → ${r}`,` tools: ${d.length}, apps: ${f.length} (${m} sprinkle${m===1?``:`s`})`,` alias: ${B5}/${i}.jsh`,u?` auth: oauth (provider mcp:${i})`:` auth: none`].join(`
|
|
4668
4668
|
`)+`
|
|
4669
|
-
`)}async function Ine(e,t,n,r){let{discoverAuth:i,dynamicRegister:a,runAuthFlow:o}=await import(`./oauth-Czw-MuuR.js`),{saveOAuthAccount:s}=await import(`./provider-settings-
|
|
4670
|
-
`);let{ensureAllMcpProvidersRegistered:n}=await import(`./provider-
|
|
4669
|
+
`)}async function Ine(e,t,n,r){let{discoverAuth:i,dynamicRegister:a,runAuthFlow:o}=await import(`./oauth-Czw-MuuR.js`),{saveOAuthAccount:s}=await import(`./provider-settings-vzbUm8j-.js`).then(e=>e.d),c=await Qne(r.oauthFetchImpl),l=r.oauthLauncher??await q5(),u=await i(e,n,c);z5.debug(`MCP OAuth discovery succeeded`,{name:t,serverUrl:e,discoveryPath:u.discoveryPath,issuer:u.issuer});let d=await Zne(),f=await a(u,d,c),p=u.supportedScopes&&u.supportedScopes.length>0?u.supportedScopes.join(` `):void 0,m=await o({asMetadata:u,clientId:f.clientId,scope:p,redirectUri:d,launcher:l,fetchImpl:c}),h=`mcp:${t}`;return await s({providerId:h,accessToken:m.accessToken,refreshToken:m.refreshToken,tokenExpiresAt:m.expiresAt}),{providerId:h,authorizationServer:u.issuer,clientId:f.clientId,scope:m.scope??p,registrationClientUri:f.registrationClientUri}}async function Lne(e,t){if(e.includes(`--help`)||e.includes(`-h`))return V5(`usage: mcp list
|
|
4670
|
+
`);let{ensureAllMcpProvidersRegistered:n}=await import(`./provider-C1tJuqMc.js`);await n();let{listServers:r}=await import(`./store-B-z6X-rX.js`).then(e=>e.r),i=await r(t.fs),a=Object.keys(i).sort();if(a.length===0)return V5("No MCP servers configured. Use `mcp add <url> <name>`.\n");let o=[[`NAME`,`URL`,`AUTH`,`TOOLS`,`APPS`,`ADDED`]];for(let e of a){let t=i[e];o.push([e,t.url,t.auth?`yes`:`no`,String(t.tools?.length??0),String(t.apps?.length??0),t.addedAt?t.addedAt.slice(0,10):`-`])}return V5(U5(o))}function U5(e){let t=e[0].map((t,n)=>e.reduce((e,t)=>Math.max(e,(t[n]??``).length),0));return e.map(e=>e.map((e,n)=>e.padEnd(t[n])).join(` `).trimEnd()).join(`
|
|
4671
4671
|
`)+`
|
|
4672
4672
|
`}async function Rne(e,t){if(e[0]===`--help`||e[0]===`-h`)return V5(`usage: mcp search <query>
|
|
4673
4673
|
|
|
4674
4674
|
Case-insensitive substring search across the cached tools of every
|
|
4675
4675
|
registered MCP server. Matches tool name OR description and prints a
|
|
4676
4676
|
table of (server, tool, description, match-field) rows.
|
|
4677
|
-
`);if(e.length===0)return H5(`mcp search: expected <query>`);let n=e[0],r=n.toLowerCase(),{ensureAllMcpProvidersRegistered:i}=await import(`./provider-
|
|
4678
|
-
`);let n=e[0],{ensureMcpProviderRegistered:r,removeMcpProvider:i}=await import(`./provider-
|
|
4677
|
+
`);if(e.length===0)return H5(`mcp search: expected <query>`);let n=e[0],r=n.toLowerCase(),{ensureAllMcpProvidersRegistered:i}=await import(`./provider-C1tJuqMc.js`);await i();let{listServers:a}=await import(`./store-B-z6X-rX.js`).then(e=>e.r),o=await a(t.fs),s=Object.keys(o).sort();if(s.length===0)return V5("No MCP servers configured. Use `mcp add <url> <name>`.\n");let c=[];for(let e of s){let t=o[e].tools??[];for(let n of t){let t=n.description??``,i=n.name.toLowerCase().includes(r),a=t.toLowerCase().includes(r);if(!i&&!a)continue;let o=i&&a?`name+description`:i?`name`:`description`;c.push({server:e,tool:n.name,description:t,match:o})}}if(c.length===0)return V5(`No tools matched "${n}".\n`);c.sort((e,t)=>e.server===t.server?e.tool.localeCompare(t.tool):e.server.localeCompare(t.server));let l=[[`SERVER`,`TOOL`,`DESCRIPTION`,`MATCH`]];for(let e of c)l.push([e.server,e.tool,zne(e.description),e.match]);return V5(U5(l))}function zne(e){if(!e)return``;let t=e.replace(/\s+/g,` `).trim();return t.length<=60?t:t.slice(0,59)+`…`}async function Bne(e,t){if(e.length===0||e[0]===`--help`||e[0]===`-h`)return e.length===0?H5(`mcp delete: expected <name>`):V5(`usage: mcp delete <name>
|
|
4678
|
+
`);let n=e[0],{ensureMcpProviderRegistered:r,removeMcpProvider:i}=await import(`./provider-C1tJuqMc.js`);await r(n);let{deleteServer:a}=await import(`./store-B-z6X-rX.js`).then(e=>e.r),o=await a(n,t.fs);await tre(n,t),await nre(n,t);let s=`mcp:${n}`,c=!1;try{let{removeAccount:e,getAccounts:t}=await import(`./provider-settings-vzbUm8j-.js`).then(e=>e.d);t().some(e=>e.providerId===s)&&(await e(s),c=!0)}catch(e){z5.warn(`mcp delete: OAuth removal failed`,{providerId:s,error:e instanceof Error?e.message:String(e)})}let l=i(n);return!o&&!c&&!l?H5(`mcp delete: no server, alias, or account found for "${n}"`):V5([`Removed MCP server "${n}"`,` servers.json: ${o?`removed`:`not present`}`,` alias: cleaned`,` sprinkles: cleaned`,` oauth: ${c?`removed`:`not present`}`,` provider: ${l?`unregistered`:`not registered`}`].join(`
|
|
4679
4679
|
`)+`
|
|
4680
|
-
`)}async function Vne(e,t){if(e.length===0||e[0]===`--help`||e[0]===`-h`)return e.length===0?H5(`mcp invoke: expected <name>`):V5(Une());let n=e[0],r=e.slice(1),{ensureMcpProviderRegistered:i}=await import(`./provider-
|
|
4680
|
+
`)}async function Vne(e,t){if(e.length===0||e[0]===`--help`||e[0]===`-h`)return e.length===0?H5(`mcp invoke: expected <name>`):V5(Une());let n=e[0],r=e.slice(1),{ensureMcpProviderRegistered:i}=await import(`./provider-C1tJuqMc.js`);await i(n);let{getServer:a}=await import(`./store-B-z6X-rX.js`).then(e=>e.r),o=await a(n,t.fs);if(!o)return H5(`mcp invoke: unknown server "${n}" (run \`mcp add <url> ${n}\` first)`);let s=o.tools??[];if(r.length===0||r[0]===`--help`||r[0]===`-h`)return V5(Wne(n,o,s));let c=r[0],l=s.find(e=>e.name===c);if(!l)return H5(`mcp invoke: unknown tool "${c}" on "${n}" (run \`${n}\` to list tools)`);let{timeoutMs:u,remaining:d,warnings:f}=Hne(r.slice(1));if(d.includes(`--help`)||d.includes(`-h`))return V5(Gne(n,l));let p=Kne(d,l.inputSchema);if(!p.ok)return H5(`mcp invoke: ${p.error}`);let{McpClient:m}=await Promise.resolve().then(()=>N5),h=new m({url:o.url,fetchImpl:t.fetchImpl,headers:o.headers,getAuthHeader:o.auth?()=>K5(n):void 0,...u===void 0?{}:{timeoutMs:u}});await h.initialize();let g=Jne(await h.toolsCall(c,p.value));return f.length>0&&(g.stderr=f.map(e=>`${e}\n`).join(``)+g.stderr),g}function Hne(e){let t=[],n=[],r,i=0;for(;i<e.length;){let a=e[i];if(a.startsWith(`--timeout=`)){let e=W5(a.slice(10));e.ok?r=e.value:n.push(e.error),i+=1;continue}if(a===`--timeout`){let t=e[i+1];if(t===void 0||t.startsWith(`--`)){n.push(`mcp invoke: --timeout requires a value (got ${t===void 0?`nothing`:`"${t}"`}); using default.`),i+=1;continue}let a=W5(t);a.ok?r=a.value:n.push(a.error),i+=2;continue}t.push(a),i+=1}return{timeoutMs:r,remaining:t,warnings:n}}function W5(e){if(!/^-?\d+$/.test(e))return{ok:!1,error:`mcp invoke: invalid --timeout value "${e}" (expected positive integer seconds); using default.`};let t=Number(e);return!Number.isFinite(t)||t<1?{ok:!1,error:`mcp invoke: invalid --timeout value "${e}" (must be >= 1 second); using default.`}:{ok:!0,value:t*1e3}}function Une(){return`usage: mcp invoke <name> [tool] [--timeout <seconds>] [--flag value …]
|
|
4681
4681
|
|
|
4682
4682
|
mcp invoke <name> List tools on <name>.
|
|
4683
4683
|
mcp invoke <name> <tool> --help Show flags for <tool>.
|
|
@@ -4707,7 +4707,7 @@ Arguments are coerced according to the tool's JSON Schema:
|
|
|
4707
4707
|
|
|
4708
4708
|
Re-fetches the tool catalog and \`apps/list\` for <name>. Does NOT refresh
|
|
4709
4709
|
OAuth tokens — for OAuth token refresh use \`mcp auth <name>\`.
|
|
4710
|
-
`);let n=e[0],{ensureMcpProviderRegistered:r}=await import(`./provider-
|
|
4710
|
+
`);let n=e[0],{ensureMcpProviderRegistered:r}=await import(`./provider-C1tJuqMc.js`);await r(n);let{getServer:i,setServer:a}=await import(`./store-B-z6X-rX.js`).then(e=>e.r),o=await i(n,t.fs);if(!o)return H5(`mcp refresh: unknown server "${n}"`);let{McpClient:s,McpAuthRequiredError:c}=await Promise.resolve().then(()=>N5),l=new s({url:o.url,fetchImpl:t.fetchImpl,headers:o.headers,getAuthHeader:o.auth?()=>K5(n):void 0});try{await l.initialize()}catch(e){if(e instanceof c)return H5(`mcp refresh: server "${n}" returned 401 — token may have expired. Run \`mcp auth ${n}\` to re-authenticate.`);throw e}let u=await l.toolsList(),d=await l.appsList();await a(n,{...o,sessionId:void 0,tools:u,apps:d,lastRefreshedAt:new Date().toISOString()},t.fs);let f=await Y5(n,d,t);return V5(`Refreshed "${n}" — tools: ${u.length}, apps: ${d.length} (${f} sprinkle${f===1?``:`s`})\n`)}async function Xne(e,t){if(e.includes(`--help`)||e.includes(`-h`))return V5(`usage: mcp auth <name> [--silent | --interactive]
|
|
4711
4711
|
|
|
4712
4712
|
Re-authenticate an existing MCP server. By default, attempts a silent
|
|
4713
4713
|
token renewal using the persisted refresh_token; if that returns no
|
|
@@ -4719,7 +4719,7 @@ Options:
|
|
|
4719
4719
|
-i, --interactive Skip silent renewal and open the OAuth popup
|
|
4720
4720
|
directly. Use after revoking a refresh token or
|
|
4721
4721
|
when the AS no longer accepts the cached one.
|
|
4722
|
-
`);let n=e.filter(e=>!e.startsWith(`-`));if(n.length===0)return H5(`mcp auth: expected <name>`);let r=n[0],i=e.includes(`--silent`)||e.includes(`-s`),a=e.includes(`--interactive`)||e.includes(`-i`);if(i&&a)return H5(`mcp auth: --silent and --interactive are mutually exclusive`);let{ensureMcpProviderRegistered:o}=await import(`./provider-
|
|
4722
|
+
`);let n=e.filter(e=>!e.startsWith(`-`));if(n.length===0)return H5(`mcp auth: expected <name>`);let r=n[0],i=e.includes(`--silent`)||e.includes(`-s`),a=e.includes(`--interactive`)||e.includes(`-i`);if(i&&a)return H5(`mcp auth: --silent and --interactive are mutually exclusive`);let{ensureMcpProviderRegistered:o}=await import(`./provider-C1tJuqMc.js`),s=await o(r),{getServer:c}=await import(`./store-B-z6X-rX.js`).then(e=>e.r),l=await c(r,t.fs);if(!l)return H5(`mcp auth: unknown server "${r}" (run \`mcp list\` to see configured servers)`);if(!l.auth)return H5(`mcp auth: server "${r}" does not use OAuth`);if(!s)return H5(`mcp auth: failed to register provider for "${r}"`);let u=`mcp:${r}`,{getRegisteredProviderConfig:d}=await import(`./providers-B5Nrt3pq.js`).then(e=>e.r),f=d(u);if(!f)return H5(`mcp auth: provider "${u}" is not registered`);if(a)return await G5(r,f,t);if(!f.onSilentRenew)return i?H5(`mcp auth: provider "${u}" does not support silent renewal; retry without --silent`):await G5(r,f,t);let p=null;try{p=await f.onSilentRenew()}catch(e){let t=e instanceof Error?e.message:String(e);if(i)return H5(`mcp auth: silent renewal for "${r}" failed (${t}); retry without --silent to run the interactive flow`);z5.debug(`mcp auth: silent renewal threw, falling back to interactive`,{name:r,error:t})}return p?V5(`Re-authenticated "${r}" via silent renewal (provider ${u})\n`):i?H5(`mcp auth: silent renewal for "${r}" returned no token; retry without --silent to run the interactive flow`):await G5(r,f,t)}async function G5(e,t,n){if(!t.onOAuthLogin)return H5(`mcp auth: provider "${t.id}" does not support interactive OAuth login`);let r=n.oauthLauncher??await q5(),i=!1;return await t.onOAuthLogin(r,()=>{i=!0}),i?V5(`Re-authenticated "${e}" via interactive login (provider ${t.id})\n`):H5(`mcp auth: interactive login for "${e}" did not complete`)}async function K5(e){let t=`mcp:${e}`,{getOAuthAccountInfo:n}=await import(`./provider-settings-vzbUm8j-.js`).then(e=>e.d),r=n(t);if(!r)return null;if(r.expired){try{let{getRegisteredProviderConfig:e}=await import(`./providers-B5Nrt3pq.js`).then(e=>e.r),n=await e(t)?.onSilentRenew?.();if(n)return`Bearer ${n}`}catch(e){z5.debug(`silent renewal threw`,{providerId:t,error:e instanceof Error?e.message:String(e)})}return null}return`Bearer ${r.token}`}async function q5(){let{createOAuthLauncher:e}=await import(`./oauth-service-CSJo71ct.js`);return e()}async function Zne(){let e=typeof chrome<`u`?chrome:void 0;if(e?.runtime?.id)return e.identity?.getRedirectURL?.(`mcp-callback`)??`https://${e.runtime.id}.chromiumapp.org/mcp-callback`;let{getOAuthPageOrigin:t}=await import(`./oauth-service-CSJo71ct.js`),{origin:n}=await t();return`${n}/auth/callback`}async function Qne(e){if(e)return e;let{createProxiedFetch:t}=await Promise.resolve().then(()=>Uz),n=t();return async(e,t)=>{let r=await n(e,{method:t?.method,headers:t?.headers,body:t?.body}),i=new TextDecoder().decode(r.body);return{ok:r.status>=200&&r.status<300,status:r.status,statusText:r.statusText,text:async()=>i,json:async()=>JSON.parse(i),headers:{get:e=>r.headers[e.toLowerCase()]??null}}}}async function J5(e){if(e)return e;let{VirtualFS:t}=await import(`./fs-DYg3-yFs.js`).then(e=>e.t),{GLOBAL_FS_DB_NAME:n}=await Promise.resolve().then(()=>pq);return await t.create({dbName:n})}function $ne(e){return`// MCP alias for "${e}" — forwards args to \`mcp invoke ${e}\`.
|
|
4723
4723
|
// Auto-generated by \`mcp add ${e}\`; do not edit by hand.
|
|
4724
4724
|
const argv = Array.isArray(process.argv) ? process.argv.slice(2) : [];
|
|
4725
4725
|
const escape = (s) => {
|
|
@@ -4733,7 +4733,7 @@ const r = await exec(cmd);
|
|
|
4733
4733
|
if (r.stdout) process.stdout.write(r.stdout);
|
|
4734
4734
|
if (r.stderr) process.stderr.write(r.stderr);
|
|
4735
4735
|
process.exit(r.exitCode || 0);
|
|
4736
|
-
`}async function ere(e,t){let n=await J5(t.fs);await n.mkdir(B5,{recursive:!0}),await n.writeFile(`${B5}/${e}.jsh`,$ne(e)),t.scriptCatalog?.invalidateJsh()}async function tre(e,t){let n=await J5(t.fs),r=`${B5}/${e}.jsh`;try{await n.exists(r)&&await n.rm(r)}catch(e){z5.debug(`alias removal failed`,{path:r,error:e instanceof Error?e.message:String(e)})}t.scriptCatalog?.invalidateJsh()}async function nre(e,t){let{removeAppSprinkles:n}=await import(`./apps-
|
|
4736
|
+
`}async function ere(e,t){let n=await J5(t.fs);await n.mkdir(B5,{recursive:!0}),await n.writeFile(`${B5}/${e}.jsh`,$ne(e)),t.scriptCatalog?.invalidateJsh()}async function tre(e,t){let n=await J5(t.fs),r=`${B5}/${e}.jsh`;try{await n.exists(r)&&await n.rm(r)}catch(e){z5.debug(`alias removal failed`,{path:r,error:e instanceof Error?e.message:String(e)})}t.scriptCatalog?.invalidateJsh()}async function nre(e,t){let{removeAppSprinkles:n}=await import(`./apps-CpvMB6O1.js`);await n(e,t.fs)}async function Y5(e,t,n){try{let{materializeAppSprinkles:r}=await import(`./apps-CpvMB6O1.js`);return(await r(e,t,n.fs)).length}catch(t){return z5.warn(`mcp: failed to materialize app sprinkles`,{name:e,error:t instanceof Error?t.message:String(t)}),0}}const X5=`/.cache/artificial-analysis.json`;async function rre(e,t=!1){if(e&&!t)try{let t=await e.readFile(X5),n=JSON.parse(t);if(Date.now()-n.fetchedAt<864e5)return n.models}catch{}let n=null;try{n=localStorage.getItem(`aa_api_key`)}catch{}let r={Accept:`application/json`};n&&(r[`x-api-key`]=n);let i=Zz(),a;try{a=await i(`https://artificialanalysis.ai/api/v2/data/llms/models`,{method:`GET`,headers:r})}catch{return[]}if(a.status===401||a.status<200||a.status>=300)return[];let o;try{let e=new TextDecoder().decode(a.body);o=JSON.parse(e)}catch{return[]}let s=(Array.isArray(o)?o:o?.data??o?.models??[]).map(e=>({slug:e.slug??``,name:e.name??``,creator_slug:e.model_creator?.slug??``,intelligence_index:e.evaluations?.artificial_analysis_intelligence_index??null,coding_index:e.evaluations?.artificial_analysis_coding_index??null,speed_tps:e.median_output_tokens_per_second??null}));if(e&&s.length>0){let t={fetchedAt:Date.now(),models:s};try{await e.mkdir(`/.cache`,{recursive:!0}),await e.writeFile(X5,JSON.stringify(t))}catch{}}return s}function Z5(e){return e.toLowerCase().replace(/\./g,`-`).replace(/-\d{8}$/,``).replace(/-\d{4}$/,``)}function ire(e,t){let n=e.toLowerCase(),r=t.find(e=>e.slug===n);if(r)return r;let i=Z5(e),a=t.find(e=>Z5(e.slug)===i);if(a)return a;let o=t.filter(e=>n.includes(e.slug)||e.slug.includes(n));if(o.length>0)return o.sort((e,t)=>t.slug.length-e.slug.length),o[0]}function are(){return`models - list available LLM models
|
|
4737
4737
|
|
|
4738
4738
|
Usage: models [options]
|
|
4739
4739
|
|
|
@@ -4747,7 +4747,7 @@ Options:
|
|
|
4747
4747
|
-h, --help Show this help message
|
|
4748
4748
|
`}function ore(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`.replace(`.0M`,`M`):e>=1e3?`${(e/1e3).toFixed(0)}K`:`${e}`}function Q5(e){return`$${e.toFixed(2)}`}const sre=/\b(embedding|embed|tts|whisper|dall-e|image-gen|audio|vision-preview)\b/i;function cre(e){let t=`${e.id} ${e.name??``}`;return!sre.test(t)}function lre(e){let t=e.toLowerCase();t=t.replace(/-\d{8}$/,``),t=t.replace(/-\d{4}$/,``),t=t.replace(/-(preview|latest)$/,``);let n=t.match(/^(claude-(?:opus|sonnet|haiku))/);if(n)return n[1];let r=t.match(/^(gpt-\d+)(?:\.\d+)?(-[a-z][-a-z]*)?$/);if(r)return r[1]+(r[2]??``);let i=t.match(/^gemini-[\d.]+-(.+)$/);if(i)return`gemini-${i[1]}`;let a=t.match(/^gemini-(\d+)-(.+)$/);if(a)return`gemini-${a[2]}`;let o=t.match(/^grok-[\d.]+-([\w-]+)$/);if(o)return`grok-${o[1]}`;if(t.match(/^(grok)-[\d.]+$/))return`grok`;let s=t.match(/^(o\d+(?:-[a-z]+)?)(?:-\d.*)?$/);return s?s[1]:t.replace(/-[\d.]+$/,``)}function ure(e){let t=new Map;for(let n of e){let e=lre(n.id);(!t.has(e)||n.selected)&&t.set(e,n)}return[...t.values()]}function dre(e,t,n,r,i){let a=i?ire(e.id,i):void 0,o={id:e.id,name:e.name,provider:t,cost:e.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:e.contextWindow??0,maxTokens:e.maxTokens??0,reasoning:!!e.reasoning,input:e.input??[`text`],selected:e.id===n&&t===r};return a?.intelligence_index!=null&&(o.intelligence=a.intelligence_index),a?.coding_index!=null&&(o.codingScore=a.coding_index),a?.speed_tps!=null&&(o.speed=a.speed_tps),o}function fre(e,t,n,r){let i=[];i.push(`Models for "${e}" (${t}):\n`);for(let e of n){let t=e.selected?` ► `:` `,n=e.id.padEnd(30),r=`${Q5(e.cost.input)} / ${Q5(e.cost.output)}`,a=`${ore(e.contextWindow)} ctx`,o=e.intelligence==null?``:`IQ:${e.intelligence}`,s=e.speed==null?``:`${Math.round(e.speed)} t/s`,c=e.reasoning?`reasoning`:``,l=o||s?`${o.padEnd(6)} ${s.padEnd(8)}`:``;i.push(`${t}${n} ${r.padEnd(16)} ${a.padEnd(10)} ${l} ${c}`)}return i.push(`\n ${n.length} model${n.length===1?``:`s`} available.`),r&&i.push(` Intelligence data: artificialanalysis.ai`),i.join(`
|
|
4749
4749
|
`)+`
|
|
4750
|
-
`}function pre(e){return KM(`models`,async t=>{let{getAccounts:n,getAvailableProviders:r,getProviderConfig:i,getProviderModels:a,getSelectedProvider:o,getSelectedModelId:s,resolveCurrentModel:c}=await import(`./provider-settings-
|
|
4750
|
+
`}function pre(e){return KM(`models`,async t=>{let{getAccounts:n,getAvailableProviders:r,getProviderConfig:i,getProviderModels:a,getSelectedProvider:o,getSelectedModelId:s,resolveCurrentModel:c}=await import(`./provider-settings-vzbUm8j-.js`).then(e=>e.d);if(t.includes(`--help`)||t.includes(`-h`))return{stdout:are(),stderr:``,exitCode:0};let l=t.includes(`--json`),u=t.includes(`--all`),d=t.includes(`--all-versions`),f=t.includes(`--refresh`),p=t.includes(`--no-benchmarks`),m=t.indexOf(`--provider`),h=m>=0?t[m+1]:void 0,g=o(),_=s(),v=n();if(v.length===0)return{stdout:``,stderr:`No provider accounts configured. Run the provider settings to add one.
|
|
4751
4751
|
`,exitCode:1};let y=c(),b=y.id,x=y.provider,S;p||(S=await rre(e,f),S.length===0&&(S=void 0));let C;if(h){let e=r();if(!e.includes(h))return{stdout:``,stderr:`Unknown provider: ${h}. Available: ${e.join(`, `)}\n`,exitCode:1};C=[h]}else C=u?[...new Set(v.map(e=>e.providerId))]:[g];let w=[],T=[];for(let e of C){let t=a(e).filter(cre);if(t.length===0){if(!u)return{stdout:``,stderr:`No models available for provider ${e}.\n`,exitCode:1};continue}let n=t.map(t=>dre(t,e,b,x,S)).sort((e,t)=>t.cost.input-e.cost.input);if(d||(n=ure(n)),w.push(...n),!l){let t=i(e);T.push(fre(t.name,e,n,!!S))}}if(l)return{stdout:JSON.stringify(w,null,2)+`
|
|
4752
4752
|
`,stderr:``,exitCode:0};!d&&!l&&T.push(`Showing latest versions only. Use --all-versions to see all.
|
|
4753
4753
|
`);let E=`${x}:${b}`,D=`${g}:${_}`;return T.push(E===D?`Currently using: ${E}\n`:`Currently using: ${E} (selected ${D} — resolved to a different model)\n`),{stdout:T.join(`
|
|
@@ -4788,7 +4788,7 @@ Examples:
|
|
|
4788
4788
|
oauth-domain add adobe '*.da.live'
|
|
4789
4789
|
oauth-domain list adobe
|
|
4790
4790
|
oauth-domain remove adobe admin.da.live
|
|
4791
|
-
`}function bre(){return KM(`oauth-domain`,async e=>{if(e.length===0||e.includes(`--help`)||e.includes(`-h`))return{stdout:$5(),stderr:``,exitCode:0};let{getExtraOAuthDomains:t,setExtraOAuthDomainsAsync:n,getAllExtraOAuthDomains:r}=await import(`./provider-settings-
|
|
4791
|
+
`}function bre(){return KM(`oauth-domain`,async e=>{if(e.length===0||e.includes(`--help`)||e.includes(`-h`))return{stdout:$5(),stderr:``,exitCode:0};let{getExtraOAuthDomains:t,setExtraOAuthDomainsAsync:n,getAllExtraOAuthDomains:r}=await import(`./provider-settings-vzbUm8j-.js`).then(e=>e.d),[i,a,o]=e;try{switch(i){case`list`:{if(a){let e=t(a);return e.length===0?{stdout:`(no extra domains configured for ${a})\n`,stderr:``,exitCode:0}:{stdout:e.join(`
|
|
4792
4792
|
`)+`
|
|
4793
4793
|
`,stderr:``,exitCode:0}}let e=r(),n=Object.entries(e).filter(([,e])=>e.length>0);return n.length===0?{stdout:`(no extra OAuth domains configured)
|
|
4794
4794
|
`,stderr:``,exitCode:0}:{stdout:n.map(([e,t])=>`${e}: ${t.join(`, `)}`).join(`
|
|
@@ -4846,11 +4846,11 @@ Examples:
|
|
|
4846
4846
|
--authorize-url 'https://auth.x.ai/oauth2/auth?...' \\
|
|
4847
4847
|
--redirect-pattern 'http://127.0.0.1:56121/*'
|
|
4848
4848
|
curl -H "Authorization: Bearer $(oauth-token github)" https://api.github.com/user
|
|
4849
|
-
`}function Sre(){return KM(`oauth-token`,async(e,t)=>{let{getOAuthAccountInfo:n,getSelectedProvider:r,getAccounts:i}=await import(`./provider-settings-
|
|
4849
|
+
`}function Sre(){return KM(`oauth-token`,async(e,t)=>{let{getOAuthAccountInfo:n,getSelectedProvider:r,getAccounts:i}=await import(`./provider-settings-vzbUm8j-.js`).then(e=>e.d),{getRegisteredProviderConfig:a,getRegisteredProviderIds:o}=await import(`./providers-B5Nrt3pq.js`).then(e=>e.r);if(e.includes(`--help`)||e.includes(`-h`))return{stdout:xre(),stderr:``,exitCode:0};if(e.includes(`--list`))return Tre(i,o,a,n);if(e.includes(`--renew`))return Cre(e);if(e.includes(`--from-file`)||e.includes(`--intercept`))return wre(e,t);let s,c=e.indexOf(`--scope`);if(c>=0){if(s=e[c+1]?.trim(),!s||s.startsWith(`-`))return{stdout:``,stderr:`oauth-token: --scope requires a value
|
|
4850
4850
|
`,exitCode:1};e.splice(c,2)}let l,u=e.indexOf(`--provider`);if(u>=0){if(l=e[u+1],!l)return{stdout:``,stderr:`oauth-token: --provider requires a value
|
|
4851
4851
|
`,exitCode:1}}else if(e.length>0)l=e[0];else{let e=r(),t=a(e);if(t?.isOAuth&&(t.onOAuthLogin||t.onOAuthLoginIntercepted))l=e;else if(l=o().find(e=>{let t=a(e);return t?.isOAuth&&(t.onOAuthLogin||t.onOAuthLoginIntercepted)}),!l)return{stdout:``,stderr:`oauth-token: no OAuth providers configured
|
|
4852
4852
|
`,exitCode:1}}let d=a(l);if(!d)return{stdout:``,stderr:`oauth-token: unknown provider "${l}"\n`,exitCode:1};if(!d.isOAuth||!d.onOAuthLogin&&!d.onOAuthLoginIntercepted)return{stdout:``,stderr:`oauth-token: provider "${l}" is not an OAuth provider\n`,exitCode:1};if(!s){let e=n(l);if(e&&!e.expired){let t=e.maskedValue;return t?{stdout:`${t}\n`,stderr:``,exitCode:0}:{stdout:``,stderr:`oauth-token: no masked value for ${l} (try logging in again)\n`,exitCode:1}}}try{if(d.onOAuthLoginIntercepted){let{createInterceptingOAuthLauncherForCurrentRuntime:e}=await import(`./oauth-service-CSJo71ct.js`),t=await e();if(!t)return{stdout:``,stderr:`oauth-token: provider "${l}" needs the controlled-browser interceptor, but no CDP transport is available in this runtime.\n`,exitCode:1};await d.onOAuthLoginIntercepted(t,()=>{},s?{scopes:s}:void 0)}else if(d.onOAuthLogin){let{createOAuthLauncher:e}=await import(`./oauth-service-CSJo71ct.js`),t=e();await d.onOAuthLogin(t,()=>{},s?{scopes:s}:void 0)}else return{stdout:``,stderr:`oauth-token: provider "${l}" has no OAuth login hook\n`,exitCode:1};let e=n(l);if(e?.token){let t=e.maskedValue;return t?{stdout:`${t}\n`,stderr:``,exitCode:0}:{stdout:``,stderr:`oauth-token: no masked value for ${l} (try logging in again)\n`,exitCode:1}}return console.error(`[oauth-token] Provider ${l}: login completed but no token was saved`),{stdout:``,stderr:`oauth-token: login completed but no token was saved
|
|
4853
|
-
`,exitCode:1}}catch(e){let t=e instanceof Error?e.message:String(e);return console.error(`[oauth-token] Provider ${l}: login failed:`,t),{stdout:``,stderr:`oauth-token: login failed: ${t}\n`,exitCode:1}}})}async function Cre(e){let{getSelectedProvider:t,getOAuthAccountInfo:n}=await import(`./provider-settings-
|
|
4853
|
+
`,exitCode:1}}catch(e){let t=e instanceof Error?e.message:String(e);return console.error(`[oauth-token] Provider ${l}: login failed:`,t),{stdout:``,stderr:`oauth-token: login failed: ${t}\n`,exitCode:1}}})}async function Cre(e){let{getSelectedProvider:t,getOAuthAccountInfo:n}=await import(`./provider-settings-vzbUm8j-.js`).then(e=>e.d),{getRegisteredProviderConfig:r,getRegisteredProviderIds:i}=await import(`./providers-B5Nrt3pq.js`).then(e=>e.r),a=e.filter(e=>!e.startsWith(`-`))[0];if(!a){let e=t();a=r(e)?.onSilentRenew?e:i().find(e=>r(e)?.onSilentRenew)}if(!a)return n7(`oauth-token --renew: no provider supports silent renewal`);let o=r(a);if(!o)return n7(`oauth-token --renew: unknown provider "${a}"`);if(!o.onSilentRenew)return n7(`oauth-token --renew: provider "${a}" has no onSilentRenew hook`);let s=n(a),c=s?.token,l=[`oauth-token --renew ${a}`];l.push(` before: ${e7(s)}`);let u=null,d=null;try{u=await o.onSilentRenew()}catch(e){d=e instanceof Error?e.message:String(e)}if(d)l.push(` silent renewal: ERROR — ${d}`);else if(u){let e=n(a),t=!!(c&&e?.token&&c!==e.token);l.push(` silent renewal: SUCCESS${t?` — token refreshed`:` (token unchanged)`}`),l.push(` after: ${e7(e)}`)}else l.push(` silent renewal: FAILED (onSilentRenew returned null)`),l.push(` → no window should have appeared. Open DevTools console and`),l.push(` look for "[oauth-service] Extension OAuth error" / "[adobe]" to see`),l.push(` the IMS/Chrome reason (e.g. login_required).`);return{stdout:l.join(`
|
|
4854
4854
|
`)+`
|
|
4855
4855
|
`,stderr:``,exitCode:+!u}}function e7(e){if(!e)return`no token`;if(e.expired)return`expired`;if(e.expiresAt){let t=e.expiresAt-Date.now();if(t>0){let e=Math.floor(t/36e5),n=Math.floor(t%36e5/6e4);return e>0?`valid, expires in ${e}h ${n}m`:`valid, expires in ${n}m`}}return`valid`}async function wre(e,t){let{parseInterceptOAuthConfig:n}=await import(`./intercepted-oauth-tLpKagkf.js`).then(e=>e.n),{createInterceptingOAuthLauncherForCurrentRuntime:r}=await import(`./oauth-service-CSJo71ct.js`),i,a=e.indexOf(`--from-file`);if(a>=0){let n=e[a+1];if(!n)return n7(`oauth-token: --from-file requires a path`);try{let e=t.fs.resolvePath(t.cwd,n),r=await t.fs.readFile(e);i=JSON.parse(typeof r==`string`?r:new TextDecoder().decode(r))}catch(e){return n7(`oauth-token: failed to read ${n}: ${e instanceof Error?e.message:String(e)}`)}}else{let t=t7(e,`--authorize-url`),n=t7(e,`--redirect-pattern`);if(!t)return n7(`oauth-token: --authorize-url is required`);if(!n)return n7(`oauth-token: --redirect-pattern is required`);let r=[];for(let t=0;t<e.length;t++){if(e[t]!==`--rewrite`)continue;let n=e[t+1];if(!n)return n7(`oauth-token: --rewrite requires a value`);let i=n.split(`=`);if(i.length<3)return n7(`oauth-token: --rewrite "${n}" must be "<match>=<key>=<value>"`);let[a,o,...s]=i;r.push({match:a,appendParams:{[o]:s.join(`=`)}})}i={authorizeUrl:t,redirectUriPattern:n,onCapture:e.includes(`--leave-tab`)?`leave`:`close`,...r.length>0?{rewrite:r}:{}}}let o=n(i);if(!o.ok)return n7(`oauth-token: invalid intercept config: ${o.error}`);let s=await r();if(!s)return n7(`oauth-token: no CDP transport available in this runtime; --intercept needs the controlled browser.`);let c=await s(o.config);return c?{stdout:`${c}\n`,stderr:``,exitCode:0}:n7(`oauth-token: intercept timed out or was cancelled`)}function t7(e,t){let n=e.indexOf(t);if(n<0)return;let r=e[n+1];if(!(!r||r.startsWith(`--`)))return r}function n7(e){return{stdout:``,stderr:`${e}\n`,exitCode:1}}function Tre(e,t,n,r){let i=t().filter(e=>n(e)?.isOAuth);if(i.length===0)return{stdout:`No OAuth providers configured.
|
|
4856
4856
|
`,stderr:``,exitCode:0};let a=[];for(let e of i){let t=r(e);if(!t)a.push(`${e} (no token)`);else if(t.expired){let n=t.userName?` as ${t.userName}`:``;a.push(`${e} (expired${n})`)}else{let n=[];if(t.userName?n.push(`logged in as ${t.userName}`):n.push(`logged in`),t.expiresAt){let e=t.expiresAt-Date.now();if(e>0){let t=Math.floor(e/36e5),r=Math.floor(e%36e5/6e4);t>0?n.push(`expires in ${t}h`):n.push(`expires in ${r}m`)}}a.push(`${e} (${n.join(`, `)})`)}}return{stdout:a.join(`
|
|
@@ -4881,7 +4881,7 @@ Examples:
|
|
|
4881
4881
|
`,exitCode:1};let r;try{r=await t.fs.stat(n)}catch{return{stdout:``,stderr:`open: no such file: ${e}\n`,exitCode:1}}if(!r.isFile)return{stdout:``,stderr:`open: not a file: ${e}\n`,exitCode:1};let i;try{i=await t.fs.readFileBuffer(n)}catch{return{stdout:``,stderr:`open: failed to read: ${e}\n`,exitCode:1}}let a=new Uint8Array(i.byteLength);a.set(i);let o=new Blob([a.buffer],{type:Xq(n)}),s=URL.createObjectURL(o),l=document.createElement(`a`);l.href=s,l.download=Uq(n)||`download`,l.style.display=`none`,document.body.appendChild(l),l.click(),document.body.removeChild(l),setTimeout(()=>URL.revokeObjectURL(s),0),f.push(`downloaded ${n}`)}else{if(!u)return{stdout:``,stderr:`open: browser APIs are unavailable in this environment
|
|
4882
4882
|
`,exitCode:1};let e=Zq(n);try{await d(e)}catch(e){return{stdout:``,stderr:`${e instanceof Error?e.message:String(e)}\n`,exitCode:1}}f.push(`opened ${n} → ${e}`)}}return{stdout:f.join(`
|
|
4883
4883
|
`)+`
|
|
4884
|
-
`,stderr:``,exitCode:0}})}let o7=null,s7=null;async function c7(){return o7||=import(`./es-
|
|
4884
|
+
`,stderr:``,exitCode:0}})}let o7=null,s7=null;async function c7(){return o7||=import(`./es-gpNQhx_e.js`),o7}async function Ire(){return s7||=import(`./dist-CrC-F8vu.js`),s7}function Lre(e){return e.endsWith(`right`)?{range:e.slice(0,-5),rotation:90}:e.endsWith(`left`)?{range:e.slice(0,-4),rotation:270}:e.endsWith(`down`)?{range:e.slice(0,-4),rotation:180}:{range:e}}function l7(e){let{range:t,rotation:n}=Lre(e);if(/^\d+$/.test(t)){let e=parseInt(t,10);return{start:e,end:e,rotation:n}}let r=t.match(/^(\d+)-(\d+|end)$/);if(r)return{start:parseInt(r[1],10),end:r[2]===`end`?`end`:parseInt(r[2],10),rotation:n};throw Error(`Invalid page range: ${e}`)}function u7(e,t){let n=e.start,r=e.end;if(n<1||n>t)throw Error(`Page ${n} out of range (1-${t})`);let i=r===`end`?t:r;if(i<1||i>t)throw Error(`Page ${i} out of range (1-${t})`);if(i<n)throw Error(`Invalid range: ${n}-${i}`);let a=[];for(let e=n;e<=i;e++)a.push(e);return a}function Rre(){return{stdout:`usage: pdftk <input.pdf> <operation> [args...]
|
|
4885
4885
|
|
|
4886
4886
|
Operations:
|
|
4887
4887
|
dump_data Print metadata (page count, title, author, etc.)
|
|
@@ -9888,5 +9888,5 @@ ${t}
|
|
|
9888
9888
|
`)+`
|
|
9889
9889
|
`;case`cmdline`:return`kernel-host\0`;case`cwd`:return`/
|
|
9890
9890
|
`;case`stat`:return`1 (kernel-host) R 0 - 0 -
|
|
9891
|
-
`}}function Cse(e){switch(e.type){case`webhook`:return e.webhookName;case`sprinkle`:return e.sprinkleName;case`fswatch`:return e.fswatchName;case`navigate`:return e.navigateUrl;case`upgrade`:return`${e.upgradeFromVersion??`unknown`}→${e.upgradeToVersion??`unknown`}`;case`session-reload`:return`mount-recovery`;case`workflow`:return e.workflowName??e.workflowRunId??`workflow`;default:return e.cronName}}function wse(e){switch(e.type){case`webhook`:return e.webhookId;case`sprinkle`:return e.sprinkleName;case`fswatch`:return e.fswatchId;case`navigate`:return e.navigateUrl;case`upgrade`:return`upgrade-${e.upgradeToVersion??`unknown`}`;case`session-reload`:return`session-reload-${e.timestamp}`;case`workflow`:return`workflow-${e.workflowRunId??`unknown`}`;default:return e.cronId}}function Tse(e,{orchestrator:t,log:n}){let r=Ze(e);if(r===null){n.debug?.(`dropping lick event with no renderable content`,{type:e.type});return}let i=Cse(e),a=wse(e),o=e.type,s=t.getScoops(),c;if(c=e.targetScoop?s.find(t=>t.name===e.targetScoop||t.folder===e.targetScoop||t.folder===`${e.targetScoop}-scoop`):s.find(e=>e.isCone),!c){n.warn(`Lick target scoop not found`,e.targetScoop);return}let l={id:`${o}-${a}-${Date.now()}`,chatJid:c.jid,senderId:o,senderName:`${o}:${i}`,content:r.content,timestamp:e.timestamp,fromAssistant:!1,channel:o};t.handleMessage(l)}async function Ese(e,t,n,r){let i=new zq,a=new hse(e,{...r,getBrowserAPI:()=>t});a.setProcessManager(i),globalThis.__slicc_pm=i,globalThis.__slicc_browser=t,await n.bind(a,t);let o=Et(()=>n.emitTrayRuntimeStatus()),s=le(()=>n.emitTrayRuntimeStatus());return await a.init(),await n.seedBuffersFromAgentState(),{processManager:i,orchestrator:a,unsubLeader:o,unsubFollower:s,sharedFs:a.getSharedFS()}}async function q9(e,t,n){let{registerSessionCostsProvider:r}=await Promise.resolve().then(()=>YL);r(()=>e.getSessionCosts());let{getLickManager:i}=await Promise.resolve().then(()=>fz),a=i();await a.init(),e.setLickManager(a);let o=t.lickEventHandler??Tse,s={orchestrator:e,lickManager:a,log:n};return a.setEventHandler(e=>o(e,s)),a}async function Dse(e){e.getScoops().some(e=>e.isCone)||await e.registerScoop({jid:`cone_${Date.now()}`,name:`Cone`,folder:`cone`,isCone:!0,type:`cone`,requiresTrigger:!1,assistantLabel:`sliccy`,addedAt:new Date().toISOString()})}async function Ose(e,t,n){try{t.onMigrationStart?.()}catch(e){n.warn(`onMigrationStart callback threw (non-fatal)`,e)}try{let{runLegacyMigrationFromVfs:r}=await import(`./migration-run-
|
|
9892
|
-
`,r=``;try{let t=await i.readFile(e);r=typeof t==`string`?t:new TextDecoder().decode(t)}catch{}await i.writeFile(e,r+n)},log:e=>{a.info?.(`browser.websocket frame`,{payload:e})}}})}}async function jse(e,t){try{let{startLickWsBridge:t}=await import(`./lick-ws-bridge-E1g3lRps.js`);return t(e,{locationHref:self.location.href}).stop}catch(e){return(t.error?.bind(t)??t.warn.bind(t)??((e,t)=>console.error(`[lick-ws-bridge]`,e,t)))(`Failed to start lick-ws bridge — webhook / crontask / handoff lick delivery is non-functional in this session`,{error:e instanceof Error?e.message:String(e)}),null}}function Mse(e,t,n){try{let n=new mn(e.getTransport(),e=>{let n={url:e.url,verb:e.verb,target:e.target};e.instruction!=null&&(n.instruction=e.instruction),e.branch!=null&&(n.branch=e.branch),e.path!=null&&(n.path=e.path),e.title!=null&&(n.title=e.title),t.emitEvent({type:`navigate`,navigateUrl:e.url,targetScoop:void 0,timestamp:new Date().toISOString(),body:n})});return n.start(),()=>n.stop()}catch(e){return n.warn(`Failed to start NavigationWatcher`,e),null}}function Nse(e,t,n){(async()=>{try{let{getAllMountEntries:r}=await import(`./mount-table-store-CQJEV6Ij.js`).then(e=>e.r),{recoverMounts:i}=await Promise.resolve().then(()=>Le),a=await r();if(a.length===0)return;let{needsRecovery:o}=await i(a,e,n);if(o.length===0)return;t.emitEvent({type:`session-reload`,targetScoop:void 0,timestamp:new Date().toISOString(),body:{reason:`mount-recovery`,mounts:o}})}catch(e){n.warn(`mount recovery failed`,e)}})()}function Pse(e,t){(async()=>{try{let{detectUpgrade:t,recordVersionSeen:n}=await import(`./upgrade-detection-366FmFL3.js`),r=await t();if(!r.isUpgrade||r.lastSeen===null)return;e.emitEvent({type:`upgrade`,targetScoop:void 0,timestamp:new Date().toISOString(),upgradeFromVersion:r.lastSeen,upgradeToVersion:r.bundled.version,body:{from:r.lastSeen,to:r.bundled.version,releasedAt:r.bundled.releasedAt}}),await n(r.bundled.version)}catch(e){t.warn(`Upgrade detection failed`,e)}})()}async function Fse(e,t,n){try{let{BshWatchdog:n}=await import(`./bsh-watchdog-B1zIY2sM.js`),{ScriptCatalog:r}=await Promise.resolve().then(()=>GQ),i=new r({jshFs:e,bshFs:e,watcher:e.getWatcher()}),a=new n({browserAPI:t,scriptCatalog:i,fs:e});return a.start(),{bshWatchdogStop:()=>a.stop(),scriptCatalogDispose:()=>i.dispose()}}catch(e){return n.warn(`Failed to start BSH watchdog`,e),{bshWatchdogStop:null,scriptCatalogDispose:null}}}async function Ise(e){let{container:t,browser:n,bridge:r,callbacks:i,skipConeBootstrap:a=!1,isExtension:o=!1}=e,s=e.logger??console,{processManager:c,orchestrator:l,unsubLeader:u,unsubFollower:d,sharedFs:f}=await Ese(t,n,r,i);if(f?Dn(l,f,l.getSessionStore()):s.warn(`AgentBridge not published — orchestrator.getSharedFS() returned null`),f)try{await f.mountInternal(`/proc`,new gse(c))}catch(e){s.warn(`Failed to mount /proc`,e)}f&&f.backend===`opfs`&&await Ose(f,e,s);let p=await q9(l,e,s);f&&kse({orchestrator:l,processManager:c,lickManager:p,sharedFs:f}),globalThis.__slicc_lickManager=p;let{wsBridge:m,wsRegistry:h}=await Ase({browser:n,lickManager:p,orchestrator:l,sharedFs:f,log:s});globalThis.__slicc_wsSubscribers=h;let g=null;o||(g=await jse(p,s));let _=null;o||(_=Mse(n,p,s)),f&&Nse(f,p,s),a||await Dse(l),f&&Pse(p,s);let v=null,y=null;f&&({bshWatchdogStop:v,scriptCatalogDispose:y}=await Fse(f,n,s));let b=!1;return{orchestrator:l,browser:n,bridge:r,lickManager:p,sharedFs:f??null,processManager:c,async dispose(){b||(b=!0,await Lse({unsubLeader:u,unsubFollower:d,bshWatchdogStop:v,scriptCatalogDispose:y,lickWsBridgeStop:g,navigationWatcherStop:_,sharedFs:f,wsRegistry:h,wsBridge:m,processManager:c,lickManager:p,browser:n,log:s}))}}}async function Lse(e){let{sharedFs:t,wsRegistry:n,wsBridge:r,processManager:i,lickManager:a,browser:o,log:s}=e;if(e.unsubLeader?.(),e.unsubFollower?.(),e.bshWatchdogStop?.(),e.scriptCatalogDispose?.(),e.lickWsBridgeStop?.(),e.navigationWatcherStop)try{await e.navigationWatcherStop()}catch(e){s.warn(`NavigationWatcher.stop() failed`,e)}if(t)try{await t.unmountInternal(`/proc`)}catch{}try{n.dispose()}catch(e){s.warn(`WsSubscriberRegistry.dispose() failed`,e)}try{r.dispose()}catch(e){s.warn(`CdpWsPageBridge.dispose() failed`,e)}Rse({processManager:i,lickManager:a,browser:o,wsRegistry:n})}function Rse(e){let t=globalThis;t.__slicc_pm===e.processManager&&delete t.__slicc_pm,t.__slicc_lickManager===e.lickManager&&delete t.__slicc_lickManager,e.browser&&t.__slicc_browser===e.browser&&delete t.__slicc_browser,e.wsRegistry&&t.__slicc_wsSubscribers===e.wsRegistry&&delete t.__slicc_wsSubscribers,delete t[c9]}const J9=`x-bypass-llm-proxy`;function zse(e,t){return t?(n,r)=>{if(!Bse(n,t))return e(n,r);let i=new Headers(r?.headers);return i.has(J9)||i.set(J9,`1`),e(n,{...r,headers:i})}:e}function Bse(e,t){let n;n=typeof e==`string`?e:e instanceof URL?e.href:e.url;try{return new URL(n,t).origin===t}catch{return!0}}function Vse(e,t={}){let n=t.onError??(e=>console.error(`[kernel-worker] boot failed`,e)),r=t.onDuplicate??(()=>console.warn(`[kernel-worker] received duplicate kernel-worker-init; ignoring`)),i=!1;return{handle(t){if(i){r();return}i=!0,e(t).catch(e=>{i=!1,n(e)})},isInitialized(){return i}}}var Hse=class{transport;createShell;log;pm;defaultOwner;sessions=new Map;unsubscribe=null;constructor(e){this.transport=e.transport,this.createShell=e.createShell,this.log=e.logger??console,this.pm=e.processManager??null,this.defaultOwner=e.defaultOwner??{kind:`system`}}start(){return this.unsubscribe||=this.transport.onMessage(e=>{if(!Use(e)||e.source!==`panel`)return;let t=e.payload;Gse(t)&&this.handleControl(t).catch(e=>{this.log.warn(`[terminal-session-host] handler error`,e)})}),()=>this.dispose()}dispose(){this.unsubscribe?.(),this.unsubscribe=null;for(let[,e]of this.sessions)e.currentProcess&&this.pm?(this.pm.signal(e.currentProcess.pid,`SIGTERM`),this.pm.exit(e.currentProcess.pid,null)):e.currentExec?.abort(),e.shell.dispose?.();this.sessions.clear()}async handleControl(e){switch(e.type){case`terminal-open`:return this.handleOpen(e);case`terminal-close`:return this.handleClose(e);case`terminal-exec`:return this.handleExec(e);case`terminal-signal`:return this.handleSignal(e);case`terminal-stdin`:case`terminal-resize`:return}}async handleOpen(e){if(this.sessions.has(e.sid)){this.emitStatus(e.sid,`error`,`session already open`);return}try{let t=this.createShell(e.sid,{cwd:e.cwd,env:e.env});this.sessions.set(e.sid,{shell:t,currentExec:null,currentProcess:null}),this.emitStatus(e.sid,`opened`)}catch(t){this.emitStatus(e.sid,`error`,t instanceof Error?t.message:String(t))}}async handleClose(e){let t=this.sessions.get(e.sid);t&&(t.currentProcess&&this.pm?(this.pm.signal(t.currentProcess.pid,`SIGTERM`),this.pm.exit(t.currentProcess.pid,null)):t.currentExec?.abort(),t.shell.dispose?.(),this.sessions.delete(e.sid),this.emitStatus(e.sid,`closed`))}async handleExec(e){let t=this.sessions.get(e.sid);if(!t){this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:127}),this.log.warn(`[terminal-session-host] exec on unknown session`,e.sid);return}if(t.currentExec){this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:130});return}let n=new AbortController;t.currentExec=n;let r=this.pm?this.pm.spawn({kind:`shell`,argv:[e.command],cwd:t.shell.getCwd?.()??void 0,owner:this.defaultOwner,adoptAbort:n}):null;t.currentProcess=r;try{let i=await t.shell.executeCommand(e.command,n.signal),a=n.signal.aborted?130:i.exitCode;n.signal.aborted||(r&&await r.gate.wait(),i.stdout&&this.emit({type:`terminal-output`,sid:e.sid,execId:e.execId,stream:`stdout`,data:i.stdout}),i.stderr&&this.emit({type:`terminal-output`,sid:e.sid,execId:e.execId,stream:`stderr`,data:i.stderr})),this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:a}),r&&this.pm&&this.pm.exit(r.pid,n.signal.aborted?null:i.exitCode)}catch(t){if(n.signal.aborted){let t=Wse(r?.terminatedBy??`SIGINT`);this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:t}),r&&this.pm&&this.pm.exit(r.pid,null)}else{let n=t instanceof Error?t.message:String(t);this.emit({type:`terminal-output`,sid:e.sid,execId:e.execId,stream:`stderr`,data:`Error: ${n}\n`}),this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:1}),r&&this.pm&&this.pm.exit(r.pid,1)}}finally{t.currentExec===n&&(t.currentExec=null,t.currentProcess=null)}}async handleSignal(e){let t=this.sessions.get(e.sid);if(!t){this.log.warn(`[terminal-session-host] signal on unknown session`,e.sid);return}(e.signal===`SIGINT`||e.signal===`SIGTERM`||e.signal===`SIGKILL`)&&(t.currentProcess&&this.pm?this.pm.signal(t.currentProcess.pid,e.signal):t.currentExec?.abort())}emit(e){this.transport.send(e)}emitStatus(e,t,n){let r=n?{type:`terminal-status`,sid:e,state:t,error:n}:{type:`terminal-status`,sid:e,state:t};this.emit(r)}};function Use(e){return typeof e==`object`&&!!e&&`source`in e&&`payload`in e}function Wse(e){switch(e){case`SIGINT`:return 130;case`SIGTERM`:return 143;case`SIGKILL`:return 137;case`SIGSTOP`:case`SIGCONT`:return 130}}function Gse(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`terminal-open`||t===`terminal-close`||t===`terminal-exec`||t===`terminal-signal`||t===`terminal-stdin`||t===`terminal-resize`}var Kse=class extends g9{sid;transport;constructor(e,t,n){super(n),this.sid=e,this.transport=t}async renderMediaPreview(e){for(let t of e){let e=``,n=t.bytes,r=8192;for(let t=0;t<n.length;t+=r)e+=String.fromCharCode(...n.subarray(t,t+r));let i={type:`terminal-media-preview`,sid:this.sid,path:t.path,mediaType:t.mimeType,data:btoa(e)};this.transport.send(i)}}};function qse(e){let{transport:t,fs:n,browser:r,processManager:i,sudoManager:a}=e,o=e.logger??console,s=a?.getShellConfig({transparentGating:!1}),c=new Hse({transport:t,processManager:i,createShell:(e,a)=>new Kse(e,t,{fs:n,cwd:a.cwd,env:a.env,browserAPI:r,processManager:i,processOwner:{kind:`system`},sudo:s}),logger:o});return{host:c,stop:c.start()}}function Jse(e){let t=new Yse(e);return t.start(),{stop:()=>t.dispose()}}var Yse=class{transport;client;writableClient;log;unsubscribe=null;constructor(e){this.transport=e.transport,this.client=e.client,this.writableClient=e.writableClient??null,this.log=e.logger??console}start(){this.unsubscribe||=this.transport.onMessage(e=>{if(!Xse(e)||e.source!==`panel`)return;let t=e.payload;if(Zse(t)){this.handleRequest(t).catch(e=>{this.log.warn(`[vfs-rpc-host] handler unexpectedly threw`,e)});return}if(Qse(t)){this.handleWriteRequest(t).catch(e=>{this.log.warn(`[vfs-rpc-host] write handler unexpectedly threw`,e)});return}})}dispose(){this.unsubscribe?.(),this.unsubscribe=null}async handleRequest(e){switch(e.type){case`vfs-read-dir`:return this.handleReadDir(e);case`vfs-read-file`:return this.handleReadFile(e);case`vfs-stat`:return this.handleStat(e)}}async handleReadDir(e){try{let t=await this.client.readDir(e.path),n={type:`vfs-read-dir-result`,requestId:e.requestId,ok:!0,entries:t};this.transport.send(n)}catch(t){this.emitError(`vfs-read-dir-result`,e.requestId,t,e.path)}}async handleReadFile(e){let t=e.encoding??`utf-8`;try{let n=await this.client.readFile(e.path,{encoding:t});if(t===`binary`){if(!(n instanceof Uint8Array)){this.emitError(`vfs-read-file-result`,e.requestId,new m(`EIO`,`readFile(binary) did not return Uint8Array`),e.path);return}let t={type:`vfs-read-file-result`,requestId:e.requestId,ok:!0,encoding:`binary`,data:n},r=n.buffer,i=typeof ArrayBuffer<`u`&&r instanceof ArrayBuffer?[r]:void 0;this.transport.send(t,i)}else{if(typeof n!=`string`){this.emitError(`vfs-read-file-result`,e.requestId,new m(`EIO`,`readFile(utf-8) did not return string`),e.path);return}let t={type:`vfs-read-file-result`,requestId:e.requestId,ok:!0,encoding:`utf-8`,data:n};this.transport.send(t)}}catch(t){this.emitError(`vfs-read-file-result`,e.requestId,t,e.path)}}async handleStat(e){try{let t=await this.client.stat(e.path),n={type:`vfs-stat-result`,requestId:e.requestId,ok:!0,stats:t};this.transport.send(n)}catch(t){this.emitError(`vfs-stat-result`,e.requestId,t,e.path)}}async handleWriteRequest(e){if(!this.writableClient){this.emitWriteError($se(e.type),e.requestId,new m(`EACCES`,`vfs-rpc-host has no writable backend wired`),ece(e));return}switch(e.type){case`vfs-write-file`:return this.handleWriteFile(e,this.writableClient);case`vfs-mkdir`:return this.handleMkdir(e,this.writableClient);case`vfs-rm`:return this.handleRm(e,this.writableClient);case`vfs-flush`:return this.handleFlush(e,this.writableClient)}}async handleWriteFile(e,t){try{if(e.encoding===`binary`){if(!(e.data instanceof Uint8Array)){this.emitWriteError(`vfs-write-file-result`,e.requestId,new m(`EIO`,`vfs-write-file(binary) data is not Uint8Array`),e.path);return}}else if(typeof e.data!=`string`){this.emitWriteError(`vfs-write-file-result`,e.requestId,new m(`EIO`,`vfs-write-file(utf-8) data is not string`),e.path);return}let n=e.recursive===void 0?void 0:{recursive:e.recursive};await t.writeFile(e.path,e.data,n);let r={type:`vfs-write-file-result`,requestId:e.requestId,ok:!0};this.transport.send(r)}catch(t){this.emitWriteError(`vfs-write-file-result`,e.requestId,t,e.path)}}async handleMkdir(e,t){try{let n=e.recursive===void 0?void 0:{recursive:e.recursive};await t.mkdir(e.path,n);let r={type:`vfs-mkdir-result`,requestId:e.requestId,ok:!0};this.transport.send(r)}catch(t){this.emitWriteError(`vfs-mkdir-result`,e.requestId,t,e.path)}}async handleRm(e,t){try{let n=e.recursive===void 0?void 0:{recursive:e.recursive};await t.rm(e.path,n);let r={type:`vfs-rm-result`,requestId:e.requestId,ok:!0};this.transport.send(r)}catch(t){this.emitWriteError(`vfs-rm-result`,e.requestId,t,e.path)}}async handleFlush(e,t){try{await t.flush();let n={type:`vfs-flush-result`,requestId:e.requestId,ok:!0};this.transport.send(n)}catch(t){this.emitWriteError(`vfs-flush-result`,e.requestId,t,``)}}emitError(e,t,n,r){let i=Y9(n,r);switch(e){case`vfs-read-dir-result`:{let e={type:`vfs-read-dir-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-read-file-result`:{let e={type:`vfs-read-file-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-stat-result`:{let e={type:`vfs-stat-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}}}emitWriteError(e,t,n,r){let i=Y9(n,r);switch(r===``&&i.path===``&&delete i.path,e){case`vfs-write-file-result`:{let e={type:`vfs-write-file-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-mkdir-result`:{let e={type:`vfs-mkdir-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-rm-result`:{let e={type:`vfs-rm-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-flush-result`:{let e={type:`vfs-flush-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}}}};function Xse(e){return typeof e==`object`&&!!e&&`source`in e&&`payload`in e}function Zse(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`vfs-read-dir`||t===`vfs-read-file`||t===`vfs-stat`}function Qse(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`vfs-write-file`||t===`vfs-mkdir`||t===`vfs-rm`||t===`vfs-flush`}function $se(e){switch(e){case`vfs-write-file`:return`vfs-write-file-result`;case`vfs-mkdir`:return`vfs-mkdir-result`;case`vfs-rm`:return`vfs-rm-result`;case`vfs-flush`:return`vfs-flush-result`}}function ece(e){return e.type===`vfs-flush`?``:e.path}function Y9(e,t){return e instanceof m?{code:e.code,message:e.message,path:e.path??t}:{code:`EIO`,message:e instanceof Error?e.message:String(e),path:t}}function tce(){let e=globalThis.fetch;if(!e)return;let t=self?.location?self.location.origin:void 0;globalThis.fetch=zse(e.bind(globalThis),t)}function nce(e){let t=new Map(Object.entries(e));Object.defineProperty(globalThis,"localStorage",{value:{get length(){return t.size},key(e){return Array.from(t.keys())[e]??null},getItem(e){return t.has(e)?t.get(e):null},setItem(e,n){t.set(e,n)},removeItem(e){t.delete(e)},clear(){t.clear()}},configurable:!0,writable:!0})}let X9=null,Z9=null,Q9=null,$9=null;const rce=Vse(e=>ice(e));self.addEventListener(`message`,e=>{e.data?.type===`kernel-worker-init`&&rce.handle(e.data)});async function ice(e){tce(),nce(e.localStorageSeed??{}),await _e();let t=qt(e.kernelPort),n=new jt(t),r=jt.createCallbacks(n),i=new Jt(e.cdpPort);await i.connect();let a=new Bt(i);X9=await Ise({container:{},browser:a,bridge:n,callbacks:r,logger:console,onMigrationStart:()=>{e.kernelPort.postMessage({type:`kernel-migration-started`})},onMigrationProgress:t=>{e.kernelPort.postMessage({type:`kernel-migration-progress`,copied:t.copied,total:t.total})},onMigrationFinish:()=>{e.kernelPort.postMessage({type:`kernel-migration-finished`})}});let{createSprinkleManagerProxyOverChannel:o}=await import(`./sprinkle-bridge-channel-BceIr6aT.js`);globalThis.__slicc_sprinkleManager=o({instanceId:e.instanceId});let{createPanelRpcClient:s}=await import(`./panel-rpc-Bcvr75SR.js`).then(e=>e.i);$9=s({instanceId:e.instanceId}),globalThis.__slicc_panelRpc=$9,a.setTrayTargetProvider(Wt(me));let c=X9.processManager,l=X9.sharedFs;l?(Z9=qse({transport:t,fs:l,browser:a,processManager:c,sudoManager:X9.orchestrator.getSudoManager(),logger:console}).stop,Q9=Jse({transport:t,client:l,writableClient:l,logger:console}).stop):console.warn(`[kernel-worker] shared FS unavailable; terminal sessions will fail to open`),e.kernelPort.postMessage({type:`kernel-worker-ready`})}self.addEventListener(`message`,e=>{e.data?.type===`kernel-worker-shutdown`&&(Z9?.(),Z9=null,Q9?.(),Q9=null,$9?.dispose(),$9=null,X9?.dispose())});export{Ct as _,r4 as a,Ie as b,qJ as c,CV as d,cB as f,wt as g,jR as h,d5 as i,yq as l,Uz as m,Z7 as n,i4 as o,rB as p,X7 as r,V2 as s,Oae as t,mq as u,ht as v,gt as y};
|
|
9891
|
+
`}}function Cse(e){switch(e.type){case`webhook`:return e.webhookName;case`sprinkle`:return e.sprinkleName;case`fswatch`:return e.fswatchName;case`navigate`:return e.navigateUrl;case`upgrade`:return`${e.upgradeFromVersion??`unknown`}→${e.upgradeToVersion??`unknown`}`;case`session-reload`:return`mount-recovery`;case`workflow`:return e.workflowName??e.workflowRunId??`workflow`;default:return e.cronName}}function wse(e){switch(e.type){case`webhook`:return e.webhookId;case`sprinkle`:return e.sprinkleName;case`fswatch`:return e.fswatchId;case`navigate`:return e.navigateUrl;case`upgrade`:return`upgrade-${e.upgradeToVersion??`unknown`}`;case`session-reload`:return`session-reload-${e.timestamp}`;case`workflow`:return`workflow-${e.workflowRunId??`unknown`}`;default:return e.cronId}}function Tse(e,{orchestrator:t,log:n}){let r=Ze(e);if(r===null){n.debug?.(`dropping lick event with no renderable content`,{type:e.type});return}let i=Cse(e),a=wse(e),o=e.type,s=t.getScoops(),c;if(c=e.targetScoop?s.find(t=>t.name===e.targetScoop||t.folder===e.targetScoop||t.folder===`${e.targetScoop}-scoop`):s.find(e=>e.isCone),!c){n.warn(`Lick target scoop not found`,e.targetScoop);return}let l={id:`${o}-${a}-${Date.now()}`,chatJid:c.jid,senderId:o,senderName:`${o}:${i}`,content:r.content,timestamp:e.timestamp,fromAssistant:!1,channel:o};t.handleMessage(l)}async function Ese(e,t,n,r){let i=new zq,a=new hse(e,{...r,getBrowserAPI:()=>t});a.setProcessManager(i),globalThis.__slicc_pm=i,globalThis.__slicc_browser=t,await n.bind(a,t);let o=Et(()=>n.emitTrayRuntimeStatus()),s=le(()=>n.emitTrayRuntimeStatus());return await a.init(),await n.seedBuffersFromAgentState(),{processManager:i,orchestrator:a,unsubLeader:o,unsubFollower:s,sharedFs:a.getSharedFS()}}async function q9(e,t,n){let{registerSessionCostsProvider:r}=await Promise.resolve().then(()=>YL);r(()=>e.getSessionCosts());let{getLickManager:i}=await Promise.resolve().then(()=>fz),a=i();await a.init(),e.setLickManager(a);let o=t.lickEventHandler??Tse,s={orchestrator:e,lickManager:a,log:n};return a.setEventHandler(e=>o(e,s)),a}async function Dse(e){e.getScoops().some(e=>e.isCone)||await e.registerScoop({jid:`cone_${Date.now()}`,name:`Cone`,folder:`cone`,isCone:!0,type:`cone`,requiresTrigger:!1,assistantLabel:`sliccy`,addedAt:new Date().toISOString()})}async function Ose(e,t,n){try{t.onMigrationStart?.()}catch(e){n.warn(`onMigrationStart callback threw (non-fatal)`,e)}try{let{runLegacyMigrationFromVfs:r}=await import(`./migration-run-DrTJQtOr.js`),i=await r(e,{logger:n,onProgress:e=>{try{t.onMigrationProgress?.(e)}catch(e){n.warn(`onMigrationProgress callback threw (non-fatal)`,e)}}});if(i.kind===`sentinel-present`||i.kind===`copied`){let{probeLegacyIdbExistsDefault:e}=await Promise.resolve().then(()=>u4);await e()&&n.info("[migration] legacy slicc-fs IDB still present after migration — safe to clear with `slicc-fs-cleanup`")}}catch(e){n.warn(`legacy migration run failed (non-fatal)`,e)}finally{try{t.onMigrationFinish?.()}catch(e){n.warn(`onMigrationFinish callback threw (non-fatal)`,e)}}}function kse(e){let{orchestrator:t,processManager:n,lickManager:r,sharedFs:i}=e;Hae({sharedFs:i,getConeJid:()=>t.getScoops().find(e=>e.isCone)?.jid,fireLick:e=>r.emitEvent(e),processManager:n,runRealm:(e,t,n)=>EQ(e,t,n,void 0,{filename:t[1]}),makeRunId:()=>u9().slice(10,22),splitResult:(e,t)=>d9(e,t)})}async function Ase(e){let{browser:t,lickManager:n,orchestrator:r,sharedFs:i,log:a}=e,{CdpWsPageBridge:o}=await import(`./cdp-ws-page-bridge-D_PY6ku1.js`),{WsSubscriberRegistry:s}=await import(`./ws-subscribers-Dzuxa2F7.js`),c=new o({browser:t});return{wsBridge:c,wsRegistry:new s({bridge:c,webhooks:{has:e=>n.getWebhook(e)!==void 0},dispatcher:{webhook:(e,t)=>{n.handleWebhookEvent(e,{},t)},scoop:(e,t)=>{if(!r.getScoops().find(t=>t.jid===e)){a.warn?.(`browser.websocket: scoop sink not found`,{jid:e});return}let n={id:`ws-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,chatJid:e,senderId:`browser.websocket`,senderName:`browser.websocket`,content:typeof t==`string`?t:JSON.stringify(t,null,2),timestamp:new Date().toISOString(),fromAssistant:!1,channel:`browser.websocket`};r.handleMessage(n)},vfs:async(e,t)=>{if(!i)return;let n=(typeof t==`string`?t:JSON.stringify(t))+`
|
|
9892
|
+
`,r=``;try{let t=await i.readFile(e);r=typeof t==`string`?t:new TextDecoder().decode(t)}catch{}await i.writeFile(e,r+n)},log:e=>{a.info?.(`browser.websocket frame`,{payload:e})}}})}}async function jse(e,t){try{let{startLickWsBridge:t}=await import(`./lick-ws-bridge-BItGqRq0.js`);return t(e,{locationHref:self.location.href}).stop}catch(e){return(t.error?.bind(t)??t.warn.bind(t)??((e,t)=>console.error(`[lick-ws-bridge]`,e,t)))(`Failed to start lick-ws bridge — webhook / crontask / handoff lick delivery is non-functional in this session`,{error:e instanceof Error?e.message:String(e)}),null}}function Mse(e,t,n){try{let n=new mn(e.getTransport(),e=>{let n={url:e.url,verb:e.verb,target:e.target};e.instruction!=null&&(n.instruction=e.instruction),e.branch!=null&&(n.branch=e.branch),e.path!=null&&(n.path=e.path),e.title!=null&&(n.title=e.title),t.emitEvent({type:`navigate`,navigateUrl:e.url,targetScoop:void 0,timestamp:new Date().toISOString(),body:n})});return n.start(),()=>n.stop()}catch(e){return n.warn(`Failed to start NavigationWatcher`,e),null}}function Nse(e,t,n){(async()=>{try{let{getAllMountEntries:r}=await import(`./mount-table-store-CQJEV6Ij.js`).then(e=>e.r),{recoverMounts:i}=await Promise.resolve().then(()=>Le),a=await r();if(a.length===0)return;let{needsRecovery:o}=await i(a,e,n);if(o.length===0)return;t.emitEvent({type:`session-reload`,targetScoop:void 0,timestamp:new Date().toISOString(),body:{reason:`mount-recovery`,mounts:o}})}catch(e){n.warn(`mount recovery failed`,e)}})()}function Pse(e,t){(async()=>{try{let{detectUpgrade:t,recordVersionSeen:n}=await import(`./upgrade-detection-DX4RntSG.js`),r=await t();if(!r.isUpgrade||r.lastSeen===null)return;e.emitEvent({type:`upgrade`,targetScoop:void 0,timestamp:new Date().toISOString(),upgradeFromVersion:r.lastSeen,upgradeToVersion:r.bundled.version,body:{from:r.lastSeen,to:r.bundled.version,releasedAt:r.bundled.releasedAt}}),await n(r.bundled.version)}catch(e){t.warn(`Upgrade detection failed`,e)}})()}async function Fse(e,t,n){try{let{BshWatchdog:n}=await import(`./bsh-watchdog-CCZcB6iH.js`),{ScriptCatalog:r}=await Promise.resolve().then(()=>GQ),i=new r({jshFs:e,bshFs:e,watcher:e.getWatcher()}),a=new n({browserAPI:t,scriptCatalog:i,fs:e});return a.start(),{bshWatchdogStop:()=>a.stop(),scriptCatalogDispose:()=>i.dispose()}}catch(e){return n.warn(`Failed to start BSH watchdog`,e),{bshWatchdogStop:null,scriptCatalogDispose:null}}}async function Ise(e){let{container:t,browser:n,bridge:r,callbacks:i,skipConeBootstrap:a=!1,isExtension:o=!1}=e,s=e.logger??console,{processManager:c,orchestrator:l,unsubLeader:u,unsubFollower:d,sharedFs:f}=await Ese(t,n,r,i);if(f?Dn(l,f,l.getSessionStore()):s.warn(`AgentBridge not published — orchestrator.getSharedFS() returned null`),f)try{await f.mountInternal(`/proc`,new gse(c))}catch(e){s.warn(`Failed to mount /proc`,e)}f&&f.backend===`opfs`&&await Ose(f,e,s);let p=await q9(l,e,s);f&&kse({orchestrator:l,processManager:c,lickManager:p,sharedFs:f}),globalThis.__slicc_lickManager=p;let{wsBridge:m,wsRegistry:h}=await Ase({browser:n,lickManager:p,orchestrator:l,sharedFs:f,log:s});globalThis.__slicc_wsSubscribers=h;let g=null;o||(g=await jse(p,s));let _=null;o||(_=Mse(n,p,s)),f&&Nse(f,p,s),a||await Dse(l),f&&Pse(p,s);let v=null,y=null;f&&({bshWatchdogStop:v,scriptCatalogDispose:y}=await Fse(f,n,s));let b=!1;return{orchestrator:l,browser:n,bridge:r,lickManager:p,sharedFs:f??null,processManager:c,async dispose(){b||(b=!0,await Lse({unsubLeader:u,unsubFollower:d,bshWatchdogStop:v,scriptCatalogDispose:y,lickWsBridgeStop:g,navigationWatcherStop:_,sharedFs:f,wsRegistry:h,wsBridge:m,processManager:c,lickManager:p,browser:n,log:s}))}}}async function Lse(e){let{sharedFs:t,wsRegistry:n,wsBridge:r,processManager:i,lickManager:a,browser:o,log:s}=e;if(e.unsubLeader?.(),e.unsubFollower?.(),e.bshWatchdogStop?.(),e.scriptCatalogDispose?.(),e.lickWsBridgeStop?.(),e.navigationWatcherStop)try{await e.navigationWatcherStop()}catch(e){s.warn(`NavigationWatcher.stop() failed`,e)}if(t)try{await t.unmountInternal(`/proc`)}catch{}try{n.dispose()}catch(e){s.warn(`WsSubscriberRegistry.dispose() failed`,e)}try{r.dispose()}catch(e){s.warn(`CdpWsPageBridge.dispose() failed`,e)}Rse({processManager:i,lickManager:a,browser:o,wsRegistry:n})}function Rse(e){let t=globalThis;t.__slicc_pm===e.processManager&&delete t.__slicc_pm,t.__slicc_lickManager===e.lickManager&&delete t.__slicc_lickManager,e.browser&&t.__slicc_browser===e.browser&&delete t.__slicc_browser,e.wsRegistry&&t.__slicc_wsSubscribers===e.wsRegistry&&delete t.__slicc_wsSubscribers,delete t[c9]}const J9=`x-bypass-llm-proxy`;function zse(e,t){return t?(n,r)=>{if(!Bse(n,t))return e(n,r);let i=new Headers(r?.headers);return i.has(J9)||i.set(J9,`1`),e(n,{...r,headers:i})}:e}function Bse(e,t){let n;n=typeof e==`string`?e:e instanceof URL?e.href:e.url;try{return new URL(n,t).origin===t}catch{return!0}}function Vse(e,t={}){let n=t.onError??(e=>console.error(`[kernel-worker] boot failed`,e)),r=t.onDuplicate??(()=>console.warn(`[kernel-worker] received duplicate kernel-worker-init; ignoring`)),i=!1;return{handle(t){if(i){r();return}i=!0,e(t).catch(e=>{i=!1,n(e)})},isInitialized(){return i}}}var Hse=class{transport;createShell;log;pm;defaultOwner;sessions=new Map;unsubscribe=null;constructor(e){this.transport=e.transport,this.createShell=e.createShell,this.log=e.logger??console,this.pm=e.processManager??null,this.defaultOwner=e.defaultOwner??{kind:`system`}}start(){return this.unsubscribe||=this.transport.onMessage(e=>{if(!Use(e)||e.source!==`panel`)return;let t=e.payload;Gse(t)&&this.handleControl(t).catch(e=>{this.log.warn(`[terminal-session-host] handler error`,e)})}),()=>this.dispose()}dispose(){this.unsubscribe?.(),this.unsubscribe=null;for(let[,e]of this.sessions)e.currentProcess&&this.pm?(this.pm.signal(e.currentProcess.pid,`SIGTERM`),this.pm.exit(e.currentProcess.pid,null)):e.currentExec?.abort(),e.shell.dispose?.();this.sessions.clear()}async handleControl(e){switch(e.type){case`terminal-open`:return this.handleOpen(e);case`terminal-close`:return this.handleClose(e);case`terminal-exec`:return this.handleExec(e);case`terminal-signal`:return this.handleSignal(e);case`terminal-stdin`:case`terminal-resize`:return}}async handleOpen(e){if(this.sessions.has(e.sid)){this.emitStatus(e.sid,`error`,`session already open`);return}try{let t=this.createShell(e.sid,{cwd:e.cwd,env:e.env});this.sessions.set(e.sid,{shell:t,currentExec:null,currentProcess:null}),this.emitStatus(e.sid,`opened`)}catch(t){this.emitStatus(e.sid,`error`,t instanceof Error?t.message:String(t))}}async handleClose(e){let t=this.sessions.get(e.sid);t&&(t.currentProcess&&this.pm?(this.pm.signal(t.currentProcess.pid,`SIGTERM`),this.pm.exit(t.currentProcess.pid,null)):t.currentExec?.abort(),t.shell.dispose?.(),this.sessions.delete(e.sid),this.emitStatus(e.sid,`closed`))}async handleExec(e){let t=this.sessions.get(e.sid);if(!t){this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:127}),this.log.warn(`[terminal-session-host] exec on unknown session`,e.sid);return}if(t.currentExec){this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:130});return}let n=new AbortController;t.currentExec=n;let r=this.pm?this.pm.spawn({kind:`shell`,argv:[e.command],cwd:t.shell.getCwd?.()??void 0,owner:this.defaultOwner,adoptAbort:n}):null;t.currentProcess=r;try{let i=await t.shell.executeCommand(e.command,n.signal),a=n.signal.aborted?130:i.exitCode;n.signal.aborted||(r&&await r.gate.wait(),i.stdout&&this.emit({type:`terminal-output`,sid:e.sid,execId:e.execId,stream:`stdout`,data:i.stdout}),i.stderr&&this.emit({type:`terminal-output`,sid:e.sid,execId:e.execId,stream:`stderr`,data:i.stderr})),this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:a}),r&&this.pm&&this.pm.exit(r.pid,n.signal.aborted?null:i.exitCode)}catch(t){if(n.signal.aborted){let t=Wse(r?.terminatedBy??`SIGINT`);this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:t}),r&&this.pm&&this.pm.exit(r.pid,null)}else{let n=t instanceof Error?t.message:String(t);this.emit({type:`terminal-output`,sid:e.sid,execId:e.execId,stream:`stderr`,data:`Error: ${n}\n`}),this.emit({type:`terminal-exit`,sid:e.sid,execId:e.execId,exitCode:1}),r&&this.pm&&this.pm.exit(r.pid,1)}}finally{t.currentExec===n&&(t.currentExec=null,t.currentProcess=null)}}async handleSignal(e){let t=this.sessions.get(e.sid);if(!t){this.log.warn(`[terminal-session-host] signal on unknown session`,e.sid);return}(e.signal===`SIGINT`||e.signal===`SIGTERM`||e.signal===`SIGKILL`)&&(t.currentProcess&&this.pm?this.pm.signal(t.currentProcess.pid,e.signal):t.currentExec?.abort())}emit(e){this.transport.send(e)}emitStatus(e,t,n){let r=n?{type:`terminal-status`,sid:e,state:t,error:n}:{type:`terminal-status`,sid:e,state:t};this.emit(r)}};function Use(e){return typeof e==`object`&&!!e&&`source`in e&&`payload`in e}function Wse(e){switch(e){case`SIGINT`:return 130;case`SIGTERM`:return 143;case`SIGKILL`:return 137;case`SIGSTOP`:case`SIGCONT`:return 130}}function Gse(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`terminal-open`||t===`terminal-close`||t===`terminal-exec`||t===`terminal-signal`||t===`terminal-stdin`||t===`terminal-resize`}var Kse=class extends g9{sid;transport;constructor(e,t,n){super(n),this.sid=e,this.transport=t}async renderMediaPreview(e){for(let t of e){let e=``,n=t.bytes,r=8192;for(let t=0;t<n.length;t+=r)e+=String.fromCharCode(...n.subarray(t,t+r));let i={type:`terminal-media-preview`,sid:this.sid,path:t.path,mediaType:t.mimeType,data:btoa(e)};this.transport.send(i)}}};function qse(e){let{transport:t,fs:n,browser:r,processManager:i,sudoManager:a}=e,o=e.logger??console,s=a?.getShellConfig({transparentGating:!1}),c=new Hse({transport:t,processManager:i,createShell:(e,a)=>new Kse(e,t,{fs:n,cwd:a.cwd,env:a.env,browserAPI:r,processManager:i,processOwner:{kind:`system`},sudo:s}),logger:o});return{host:c,stop:c.start()}}function Jse(e){let t=new Yse(e);return t.start(),{stop:()=>t.dispose()}}var Yse=class{transport;client;writableClient;log;unsubscribe=null;constructor(e){this.transport=e.transport,this.client=e.client,this.writableClient=e.writableClient??null,this.log=e.logger??console}start(){this.unsubscribe||=this.transport.onMessage(e=>{if(!Xse(e)||e.source!==`panel`)return;let t=e.payload;if(Zse(t)){this.handleRequest(t).catch(e=>{this.log.warn(`[vfs-rpc-host] handler unexpectedly threw`,e)});return}if(Qse(t)){this.handleWriteRequest(t).catch(e=>{this.log.warn(`[vfs-rpc-host] write handler unexpectedly threw`,e)});return}})}dispose(){this.unsubscribe?.(),this.unsubscribe=null}async handleRequest(e){switch(e.type){case`vfs-read-dir`:return this.handleReadDir(e);case`vfs-read-file`:return this.handleReadFile(e);case`vfs-stat`:return this.handleStat(e)}}async handleReadDir(e){try{let t=await this.client.readDir(e.path),n={type:`vfs-read-dir-result`,requestId:e.requestId,ok:!0,entries:t};this.transport.send(n)}catch(t){this.emitError(`vfs-read-dir-result`,e.requestId,t,e.path)}}async handleReadFile(e){let t=e.encoding??`utf-8`;try{let n=await this.client.readFile(e.path,{encoding:t});if(t===`binary`){if(!(n instanceof Uint8Array)){this.emitError(`vfs-read-file-result`,e.requestId,new m(`EIO`,`readFile(binary) did not return Uint8Array`),e.path);return}let t={type:`vfs-read-file-result`,requestId:e.requestId,ok:!0,encoding:`binary`,data:n},r=n.buffer,i=typeof ArrayBuffer<`u`&&r instanceof ArrayBuffer?[r]:void 0;this.transport.send(t,i)}else{if(typeof n!=`string`){this.emitError(`vfs-read-file-result`,e.requestId,new m(`EIO`,`readFile(utf-8) did not return string`),e.path);return}let t={type:`vfs-read-file-result`,requestId:e.requestId,ok:!0,encoding:`utf-8`,data:n};this.transport.send(t)}}catch(t){this.emitError(`vfs-read-file-result`,e.requestId,t,e.path)}}async handleStat(e){try{let t=await this.client.stat(e.path),n={type:`vfs-stat-result`,requestId:e.requestId,ok:!0,stats:t};this.transport.send(n)}catch(t){this.emitError(`vfs-stat-result`,e.requestId,t,e.path)}}async handleWriteRequest(e){if(!this.writableClient){this.emitWriteError($se(e.type),e.requestId,new m(`EACCES`,`vfs-rpc-host has no writable backend wired`),ece(e));return}switch(e.type){case`vfs-write-file`:return this.handleWriteFile(e,this.writableClient);case`vfs-mkdir`:return this.handleMkdir(e,this.writableClient);case`vfs-rm`:return this.handleRm(e,this.writableClient);case`vfs-flush`:return this.handleFlush(e,this.writableClient)}}async handleWriteFile(e,t){try{if(e.encoding===`binary`){if(!(e.data instanceof Uint8Array)){this.emitWriteError(`vfs-write-file-result`,e.requestId,new m(`EIO`,`vfs-write-file(binary) data is not Uint8Array`),e.path);return}}else if(typeof e.data!=`string`){this.emitWriteError(`vfs-write-file-result`,e.requestId,new m(`EIO`,`vfs-write-file(utf-8) data is not string`),e.path);return}let n=e.recursive===void 0?void 0:{recursive:e.recursive};await t.writeFile(e.path,e.data,n);let r={type:`vfs-write-file-result`,requestId:e.requestId,ok:!0};this.transport.send(r)}catch(t){this.emitWriteError(`vfs-write-file-result`,e.requestId,t,e.path)}}async handleMkdir(e,t){try{let n=e.recursive===void 0?void 0:{recursive:e.recursive};await t.mkdir(e.path,n);let r={type:`vfs-mkdir-result`,requestId:e.requestId,ok:!0};this.transport.send(r)}catch(t){this.emitWriteError(`vfs-mkdir-result`,e.requestId,t,e.path)}}async handleRm(e,t){try{let n=e.recursive===void 0?void 0:{recursive:e.recursive};await t.rm(e.path,n);let r={type:`vfs-rm-result`,requestId:e.requestId,ok:!0};this.transport.send(r)}catch(t){this.emitWriteError(`vfs-rm-result`,e.requestId,t,e.path)}}async handleFlush(e,t){try{await t.flush();let n={type:`vfs-flush-result`,requestId:e.requestId,ok:!0};this.transport.send(n)}catch(t){this.emitWriteError(`vfs-flush-result`,e.requestId,t,``)}}emitError(e,t,n,r){let i=Y9(n,r);switch(e){case`vfs-read-dir-result`:{let e={type:`vfs-read-dir-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-read-file-result`:{let e={type:`vfs-read-file-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-stat-result`:{let e={type:`vfs-stat-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}}}emitWriteError(e,t,n,r){let i=Y9(n,r);switch(r===``&&i.path===``&&delete i.path,e){case`vfs-write-file-result`:{let e={type:`vfs-write-file-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-mkdir-result`:{let e={type:`vfs-mkdir-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-rm-result`:{let e={type:`vfs-rm-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}case`vfs-flush-result`:{let e={type:`vfs-flush-result`,requestId:t,ok:!1,error:i};this.transport.send(e);return}}}};function Xse(e){return typeof e==`object`&&!!e&&`source`in e&&`payload`in e}function Zse(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`vfs-read-dir`||t===`vfs-read-file`||t===`vfs-stat`}function Qse(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`vfs-write-file`||t===`vfs-mkdir`||t===`vfs-rm`||t===`vfs-flush`}function $se(e){switch(e){case`vfs-write-file`:return`vfs-write-file-result`;case`vfs-mkdir`:return`vfs-mkdir-result`;case`vfs-rm`:return`vfs-rm-result`;case`vfs-flush`:return`vfs-flush-result`}}function ece(e){return e.type===`vfs-flush`?``:e.path}function Y9(e,t){return e instanceof m?{code:e.code,message:e.message,path:e.path??t}:{code:`EIO`,message:e instanceof Error?e.message:String(e),path:t}}function tce(){let e=globalThis.fetch;if(!e)return;let t=self?.location?self.location.origin:void 0;globalThis.fetch=zse(e.bind(globalThis),t)}function nce(e){let t=new Map(Object.entries(e));Object.defineProperty(globalThis,"localStorage",{value:{get length(){return t.size},key(e){return Array.from(t.keys())[e]??null},getItem(e){return t.has(e)?t.get(e):null},setItem(e,n){t.set(e,n)},removeItem(e){t.delete(e)},clear(){t.clear()}},configurable:!0,writable:!0})}let X9=null,Z9=null,Q9=null,$9=null;const rce=Vse(e=>ice(e));self.addEventListener(`message`,e=>{e.data?.type===`kernel-worker-init`&&rce.handle(e.data)});async function ice(e){tce(),nce(e.localStorageSeed??{}),await _e();let t=qt(e.kernelPort),n=new jt(t),r=jt.createCallbacks(n),i=new Jt(e.cdpPort);await i.connect();let a=new Bt(i);X9=await Ise({container:{},browser:a,bridge:n,callbacks:r,logger:console,onMigrationStart:()=>{e.kernelPort.postMessage({type:`kernel-migration-started`})},onMigrationProgress:t=>{e.kernelPort.postMessage({type:`kernel-migration-progress`,copied:t.copied,total:t.total})},onMigrationFinish:()=>{e.kernelPort.postMessage({type:`kernel-migration-finished`})}});let{createSprinkleManagerProxyOverChannel:o}=await import(`./sprinkle-bridge-channel-BceIr6aT.js`);globalThis.__slicc_sprinkleManager=o({instanceId:e.instanceId});let{createPanelRpcClient:s}=await import(`./panel-rpc-Bcvr75SR.js`).then(e=>e.i);$9=s({instanceId:e.instanceId}),globalThis.__slicc_panelRpc=$9,a.setTrayTargetProvider(Wt(me));let c=X9.processManager,l=X9.sharedFs;l?(Z9=qse({transport:t,fs:l,browser:a,processManager:c,sudoManager:X9.orchestrator.getSudoManager(),logger:console}).stop,Q9=Jse({transport:t,client:l,writableClient:l,logger:console}).stop):console.warn(`[kernel-worker] shared FS unavailable; terminal sessions will fail to open`),e.kernelPort.postMessage({type:`kernel-worker-ready`})}self.addEventListener(`message`,e=>{e.data?.type===`kernel-worker-shutdown`&&(Z9?.(),Z9=null,Q9?.(),Q9=null,$9?.dispose(),$9=null,X9?.dispose())});export{Ct as _,r4 as a,Ie as b,qJ as c,CV as d,cB as f,wt as g,jR as h,d5 as i,yq as l,Uz as m,Z7 as n,i4 as o,rB as p,X7 as r,V2 as s,Oae as t,mq as u,ht as v,gt as y};
|