sliccy 6.178.2 → 6.179.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui/.vite/manifest.json +191 -182
- package/dist/ui/assets/SKILL-B26KJxxL.js +1 -0
- package/dist/ui/assets/__vite-browser-external-CVereMU8.js +1 -0
- package/dist/ui/assets/account-store-Bbb4tBjB.js +2 -0
- package/dist/ui/assets/account-store-DORXRt2J.js +1 -0
- package/dist/ui/assets/{adobe-BHZ-TF7E.js → adobe-CcJb_1io.js} +1 -1
- package/dist/ui/assets/{adobe-Cqd5wrqM.js → adobe-Dxc6H5uX.js} +1 -1
- package/dist/ui/assets/{agent-panels-DXCdmUkc.js → agent-panels-DukhfWpj.js} +1 -1
- package/dist/ui/assets/{almost-bash-shell-headless-B29ulBpN.js → almost-bash-shell-headless-2tBN0e_f.js} +231 -231
- package/dist/ui/assets/{apply-layout-BiYaZGTe.js → apply-layout-CnYIzvao.js} +1 -1
- package/dist/ui/assets/{apps-BYK0eeEc.js → apps-6FOwbeg0.js} +1 -1
- package/dist/ui/assets/{azure-openai-DwxTKwka.js → azure-openai-Bcul1Ufv.js} +1 -1
- package/dist/ui/assets/{azure-openai-BgA0OxNa.js → azure-openai-NsEky3Bh.js} +1 -1
- package/dist/ui/assets/{backend-hostfs-CeXHlroV.js → backend-hostfs-BJv18aU0.js} +1 -1
- package/dist/ui/assets/bedrock-camp-BQ02i7Bk.js +1 -0
- package/dist/ui/assets/bedrock-camp-CMYc0nQP.js +1 -0
- package/dist/ui/assets/bedrock-camp-extra-models-B0WH9IRx.js +1 -0
- package/dist/ui/assets/bedrock-camp-extra-models-WTCIjj5a.js +1 -0
- package/dist/ui/assets/{bunny-probe-Dk-taSwq.js → bunny-probe-DwyMiB71.js} +1 -1
- package/dist/ui/assets/{bunny-run-CmnXF3U5.js → bunny-run-COGwXgvg.js} +1 -1
- package/dist/ui/assets/{cdp-wm8vfA8s.js → cdp-Ck5NGIgv.js} +4 -4
- package/dist/ui/assets/{cerebras-wuHzITPY.js → cerebras-B2ofXAjg.js} +1 -1
- package/dist/ui/assets/{cerebras-BPlfZv3L.js → cerebras-DzROLFaR.js} +1 -1
- package/dist/ui/assets/{composer-speech-DI9SI2lY.js → composer-speech-ArgvCsJw.js} +1 -1
- package/dist/ui/assets/{connect-surface-zTa8OfFh.js → connect-surface-DVI8l1Gj.js} +1 -1
- package/dist/ui/assets/{directed-approval-DmDgVpiX.js → directed-approval-D5B0YPqE.js} +1 -1
- package/dist/ui/assets/{ensure-speech-assets-42E6KJDv.js → ensure-speech-assets-Bt69TLMK.js} +1 -1
- package/dist/ui/assets/{fast-path-DiV4YcEb.js → fast-path-CG_eXz0M.js} +1 -1
- package/dist/ui/assets/{frozen-archive-writer-C97kBlYw.js → frozen-archive-writer-DRM5RlgX.js} +1 -1
- package/dist/ui/assets/{fs-DmgjBIs9.js → fs-Bdm5h1uM.js} +1 -1
- package/dist/ui/assets/{fs-BKmepe3Q.js → fs-Ce8P6WrG.js} +2 -2
- package/dist/ui/assets/{gelatiere-store-D1l9WE1j.js → gelatiere-store-BZg-43KO.js} +1 -1
- package/dist/ui/assets/{gelatiere-unit-jlm5b-JJ.js → gelatiere-unit-BX9sZFKS.js} +1 -1
- package/dist/ui/assets/{github-C8jjATg2.js → github-8zos8s_U.js} +2 -2
- package/dist/ui/assets/{github-BB3M-XW1.js → github-CCjvDIfP.js} +1 -1
- package/dist/ui/assets/{github-auth-CkC7qTEg.js → github-auth-A-2czSUQ.js} +1 -1
- package/dist/ui/assets/{github-copilot-DuwasHAz.js → github-copilot-BptMXI0N.js} +1 -1
- package/dist/ui/assets/{github-copilot-D7QRCTDD.js → github-copilot-CKr_YmDA.js} +1 -1
- package/dist/ui/assets/{github-install-DT3Wys59.js → github-install-fthN4iEm.js} +1 -1
- package/dist/ui/assets/{github-zip-CX3GXBmW.js → github-zip-DwYtMYDx.js} +1 -1
- package/dist/ui/assets/{hear-pJ--prvx.js → hear-4csSE4tf.js} +1 -1
- package/dist/ui/assets/{help-gOzjZhgS.js → help-CW93-CFs.js} +1 -1
- package/dist/ui/assets/{installer-DeqzzcvC.js → installer-DMXLmwMy.js} +1 -1
- package/dist/ui/assets/{js-realm-worker-QT2JnICz.js → js-realm-worker-C2CFKG9d.js} +9 -9
- package/dist/ui/assets/{jsh-executor-BBZWMBxV.js → jsh-executor-sKhz-2wo.js} +3 -3
- package/dist/ui/assets/{kernel-worker-B23YxkDH.js → kernel-worker-DPGsdtHG.js} +11 -11
- package/dist/ui/assets/{lick-ws-bridge-CpcUjLS6.js → lick-ws-bridge-QLNp37XL.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-DsoQWD5s.js → lick-ws-bridge-sNe1yusQ.js} +1 -1
- package/dist/ui/assets/{live-session-curation-BWfx-Nu1.js → live-session-curation-BeMkfXGh.js} +1 -1
- package/dist/ui/assets/{live-session-snapshot-BSNfthJ2.js → live-session-snapshot-Bm0Bb5YU.js} +1 -1
- package/dist/ui/assets/{local-llm-vzP-uq7M.js → local-llm-BP0eQCgl.js} +1 -1
- package/dist/ui/assets/{local-llm-DGFPI_4T.js → local-llm-DY70xAff.js} +1 -1
- package/dist/ui/assets/main-B0cbvPwD.js +22 -0
- package/dist/ui/assets/{main-cherry-Bbjw_90k.js → main-cherry-Cs8W2ySf.js} +1 -1
- package/dist/ui/assets/{memory-curation-seam-BufuSUCj.js → memory-curation-seam-BHFcRLuu.js} +1 -1
- package/dist/ui/assets/{memory-health-DdSqq7yP.js → memory-health-JgHshbO8.js} +1 -1
- package/dist/ui/assets/memory-v2-flag-DZrdHcA-.js +1 -0
- package/dist/ui/assets/{memory-write-execute-BygymnF0.js → memory-write-execute-Bw7kTO2u.js} +1 -1
- package/dist/ui/assets/{mount-DlogHA7u.js → mount-B70Cfm-W.js} +3 -3
- package/dist/ui/assets/{mount-_sTSuvKx.js → mount-CT7VaoKY.js} +1 -1
- package/dist/ui/assets/new-session-Crr2-msq.js +2 -0
- package/dist/ui/assets/oauth-bootstrap-CZzvOYOg.js +2 -0
- package/dist/ui/assets/{onboarding-orchestrator-CbnB67nZ.js → onboarding-orchestrator-CXxroXfS.js} +1 -1
- package/dist/ui/assets/{openai-codex-SI0nWQNS.js → openai-codex-Bv9btlww.js} +1 -1
- package/dist/ui/assets/{openai-codex-BtwVt-12.js → openai-codex-DCsbLgXd.js} +1 -1
- package/dist/ui/assets/{openrouter-BFlMjaCH.js → openrouter-CnnttWgn.js} +1 -1
- package/dist/ui/assets/{openrouter-BruOnSfT.js → openrouter-Crgs_QCq.js} +1 -1
- package/dist/ui/assets/{openrouter-free-B2pceWVg.js → openrouter-free-CgIoPuxn.js} +1 -1
- package/dist/ui/assets/{openrouter-free-DPQDCfqQ.js → openrouter-free-DRkmaxB3.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-BLskezr8.js → openrouter-oauth-CxTickkD.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-C4kwBIwS.js → openrouter-oauth-pI7Aub_Z.js} +1 -1
- package/dist/ui/assets/{opfs-mount-8s9WP18b.js → opfs-mount-mco_YXZ2.js} +1 -1
- package/dist/ui/assets/panel-rpc-handlers-DlWD1u2Q.js +2 -0
- package/dist/ui/assets/{panelize-shell-Dg_58ImI.js → panelize-shell-C6AGU1O_.js} +1 -1
- package/dist/ui/assets/{pi-edit-execution-C9GYKunH.js → pi-edit-execution-yVaqL9lZ.js} +1 -1
- package/dist/ui/assets/{provider-DEcfbBkM.js → provider-BLg5uchT.js} +1 -1
- package/dist/ui/assets/{provider-B_fhkXn7.js → provider-DGvW9aTF.js} +2 -2
- package/dist/ui/assets/{provider-settings-BLtjMrT0.js → provider-settings-CeFsisH4.js} +1 -1
- package/dist/ui/assets/provider-store-access-BaHh7m4I.js +1 -0
- package/dist/ui/assets/provider-store-access-CnoMGfWY.js +1 -0
- package/dist/ui/assets/providers-2pihfuXe.js +2 -0
- package/dist/ui/assets/providers-BNhTu4Az.js +1 -0
- package/dist/ui/assets/py-live-vfs-DaPSes0l.js +168 -0
- package/dist/ui/assets/py-live-vfs-Dx9cFlfE.js +168 -0
- package/dist/ui/assets/{py-realm-worker-A1ICPvEl.js → py-realm-worker-CYwLJW9I.js} +3 -3
- package/dist/ui/assets/{pyodide-DGH4V3SQ.js → pyodide-DKNrUBio.js} +2 -2
- package/dist/ui/assets/{quick-llm-B8uh7EVu.js → quick-llm-DcsNLbYv.js} +1 -1
- package/dist/ui/assets/realm-inprocess-BgV7BI1t.js +30 -0
- package/dist/ui/assets/{recovery-screen-M8szzZB2.js → recovery-screen-xvnzvjnh.js} +1 -1
- package/dist/ui/assets/{remote-terminal-view-6ygd42Fb.js → remote-terminal-view-C_QEoDZe.js} +1 -1
- package/dist/ui/assets/require-guards-Du29-pl4.js +252 -0
- package/dist/ui/assets/{restore-Qq5h6a38.js → restore-90cAJcB-.js} +1 -1
- package/dist/ui/assets/{run-C0wVagJ5.js → run-BjdOwTMK.js} +2 -2
- package/dist/ui/assets/{run-DK8nktud.js → run-BoSrXXY1.js} +2 -2
- package/dist/ui/assets/{run-CPDsfLJJ.js → run-Bx5g1SW-.js} +2 -2
- package/dist/ui/assets/{run-C3rYy-Lu.js → run-C-9fbuPf.js} +1 -1
- package/dist/ui/assets/{run-dNFrBZDI.js → run-CTYkZrli.js} +1 -1
- package/dist/ui/assets/{run-DUzzkV29.js → run-DMneLV98.js} +3 -3
- package/dist/ui/assets/{run--H9dud5r.js → run-Di77_0CW.js} +2 -2
- package/dist/ui/assets/{run-Bk0pGJJa.js → run-R7EnlHqn.js} +1 -1
- package/dist/ui/assets/{run-_QNErIec.js → run-u5sZdtZc.js} +2 -2
- package/dist/ui/assets/{session-command-memory-CAl1-crq.js → session-command-memory-BIW04ime.js} +2 -2
- package/dist/ui/assets/{session-jsonl-B-4fihPX.js → session-jsonl-BT6N86_D.js} +1 -1
- package/dist/ui/assets/{session-jsonl-lB9-7rZS.js → session-jsonl-DRpBHMbZ.js} +1 -1
- package/dist/ui/assets/{session-search-index-Bn4FhmPW.js → session-search-index-CRSNfFPt.js} +1 -1
- package/dist/ui/assets/{setup-feature-flags-remote-opNg3JWs.js → setup-feature-flags-remote-DLPlEBtl.js} +1 -1
- package/dist/ui/assets/{signed-fetch-YC2zrriw.js → signed-fetch-Cv-pIQgJ.js} +1 -1
- package/dist/ui/assets/{silent-renew-backoff-Bak0vwwf.js → silent-renew-backoff-BL0l9czs.js} +1 -1
- package/dist/ui/assets/slicc-version-wzJMaTOt.js +1 -0
- package/dist/ui/assets/{snapshot-features-BqGUjBWl.js → snapshot-features-DN8885R6.js} +1 -1
- package/dist/ui/assets/{snapshot-6br_5p-f.js → snapshot-h1IyuVIH.js} +1 -1
- package/dist/ui/assets/{soundscape-DRViCPly.js → soundscape-qJ4gJF6y.js} +1 -1
- package/dist/ui/assets/{speak-DRv_vLqY.js → speak-CUSuBAiN.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-DeJrE3Hq.js → sprinkle-manager-CK0KfQ0E.js} +1 -1
- package/dist/ui/assets/{sprinkle-renderer-DYUy10CO.js → sprinkle-renderer-C0-nYSNx.js} +1 -1
- package/dist/ui/assets/{src-CmTUvI8R.js → src-BfoZU01X.js} +74 -74
- package/dist/ui/assets/{ssh-D1zj1EXl.js → ssh-D9CT02gL.js} +1 -1
- package/dist/ui/assets/{state-BpyjzTIG.js → state-DCSstoTF.js} +1 -1
- package/dist/ui/assets/{store-DQkIRnav.js → store-COcJ0rh9.js} +1 -1
- package/dist/ui/assets/{store-DwUewAuZ.js → store-DrLyzt3v.js} +1 -1
- package/dist/ui/assets/{sudo-DIegVBwT.js → sudo-BLsv33L7.js} +1 -1
- package/dist/ui/assets/{supervisor-gHbk5m7z.js → supervisor-DC1z_etC.js} +1 -1
- package/dist/ui/assets/{sync-dialog-CH4PBcVu.js → sync-dialog-B9Na5xYc.js} +1 -1
- package/dist/ui/assets/sync-exec-xhr-bridge-BjD_IfJF.js +1 -0
- package/dist/ui/assets/sync-sab-wire-CkrsRVrw.js +1 -0
- package/dist/ui/assets/tab-8LaHojfd.js +1 -0
- package/dist/ui/assets/{transformers-env-9M9En1_O.js → transformers-env-DbQSH9Ln.js} +1 -1
- package/dist/ui/assets/{tray-leader-Bd293BI8.js → tray-leader-DyfRH9_x.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-wLd1uBMu.js → tray-leave-runtime-BRVkq1j8.js} +1 -1
- package/dist/ui/assets/{tray-sidecar-C35X7Jht.js → tray-sidecar-BdSKCDRU.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-Tp8fDJAG.js → upgrade-detection-DOttGbYy.js} +1 -1
- package/dist/ui/assets/{upskill-lick-skip-Cr0VVPGj.js → upskill-lick-skip-4EAgxZBZ.js} +1 -1
- package/dist/ui/assets/{voice-reply-wJfABSIn.js → voice-reply-BMbj-krb.js} +1 -1
- package/dist/ui/assets/wc-attach-BYh78RZQ.js +13 -0
- package/dist/ui/assets/{wc-browser-BJemxWhg.js → wc-browser-D_SlpGFj.js} +1 -1
- package/dist/ui/assets/{wc-computers-Cr14YnOg.js → wc-computers-DguwFFgg.js} +1 -1
- package/dist/ui/assets/{wc-detached-DQ_ZTSZ-.js → wc-detached-BwCNIFnT.js} +1 -1
- package/dist/ui/assets/{wc-extension-C8pgLDqO.js → wc-extension-B3EwzUfS.js} +2 -2
- package/dist/ui/assets/wc-follower-CmPddVGO.js +17 -0
- package/dist/ui/assets/{wc-follower-oauth-BU-XAftl.js → wc-follower-oauth-D9PaxsNc.js} +1 -1
- package/dist/ui/assets/{wc-gelatiere-BiyouLW3.js → wc-gelatiere-BIfd8LAx.js} +1 -1
- package/dist/ui/assets/{wc-live-CaopRwn0.js → wc-live-Dq-_FAPU.js} +6 -6
- package/dist/ui/assets/wc-nav-hfv762PR.js +2 -0
- package/dist/ui/assets/{wc-onboarding-FjrDOv_u.js → wc-onboarding-BAO8Xa0p.js} +2 -2
- package/dist/ui/assets/{wc-permissions-C63-jLbY.js → wc-permissions-BWZQsa4a.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-Bdbmjijc.js → wc-placeholder-BJLM84yS.js} +3 -3
- package/dist/ui/assets/{wc-secret-request-C9iCWgBV.js → wc-secret-request-DMdnDVOi.js} +1 -1
- package/dist/ui/assets/{wc-settings-1ZJgN4Wk.js → wc-settings-Cwj7tYnH.js} +3 -3
- package/dist/ui/assets/{wc-shell-CrMn8BW0.js → wc-shell-Cn2tEDM7.js} +4 -4
- package/dist/ui/assets/{wc-shortcut-config-JXEU24sg.js → wc-shortcut-config-C5cwDbE-.js} +1 -1
- package/dist/ui/assets/{wc-sprinkles-CBaPR_V8.js → wc-sprinkles-Bme5XF35.js} +2 -2
- package/dist/ui/assets/{wc-transcript-export-eyG-SwVe.js → wc-transcript-export-D5m4sap2.js} +2 -2
- package/dist/ui/assets/{wc-tray-dSLNIDh9.js → wc-tray-kqJoJtNf.js} +4 -4
- package/dist/ui/assets/welcome-detection-CQJa6RP3.js +1 -0
- package/dist/ui/assets/whisper-session-DhEBOCZj.js +2 -0
- package/dist/ui/assets/{xai-grok-C2oyJ5tt.js → xai-grok-DVO4KVhh.js} +1 -1
- package/dist/ui/assets/{xai-grok-G4GFCgrM.js → xai-grok-UADpK8FU.js} +1 -1
- package/dist/ui/index.html +4 -3
- package/dist/ui/llm-proxy-sw.js +1 -1
- package/dist/ui/packages/webapp/index.html +4 -3
- package/package.json +1 -1
- package/dist/ui/assets/SKILL-CJrjPuRt.js +0 -1
- package/dist/ui/assets/__vite-browser-external-C7Grxh8D.js +0 -1
- package/dist/ui/assets/account-store-LwLxI7v1.js +0 -1
- package/dist/ui/assets/account-store-SI8RQbm0.js +0 -2
- package/dist/ui/assets/bedrock-camp-D-jmLdEX.js +0 -1
- package/dist/ui/assets/bedrock-camp-DmVFQWfL.js +0 -1
- package/dist/ui/assets/main-DFTTAllP.js +0 -22
- package/dist/ui/assets/memory-v2-flag-uChv9nwr.js +0 -1
- package/dist/ui/assets/new-session-C914zfKa.js +0 -2
- package/dist/ui/assets/oauth-bootstrap-B7cPXMSk.js +0 -2
- package/dist/ui/assets/panel-rpc-handlers-BuMdGle_.js +0 -2
- package/dist/ui/assets/provider-store-access-C0w1Xcs2.js +0 -1
- package/dist/ui/assets/provider-store-access-YjQKD2es.js +0 -1
- package/dist/ui/assets/providers-B0rCH1pp.js +0 -1
- package/dist/ui/assets/providers-B9p2VR5L.js +0 -2
- package/dist/ui/assets/realm-inprocess-qhbZWW6z.js +0 -30
- package/dist/ui/assets/slicc-version-D1Js64gw.js +0 -1
- package/dist/ui/assets/sync-sab-wire-CN1_ni9J.js +0 -252
- package/dist/ui/assets/tab-0xwFvGm5.js +0 -1
- package/dist/ui/assets/wc-attach-CtVWDKPk.js +0 -13
- package/dist/ui/assets/wc-follower-nosCeVKN.js +0 -17
- package/dist/ui/assets/wc-nav-Wn2qDNiX.js +0 -2
- package/dist/ui/assets/welcome-detection-DuFRP38Z.js +0 -1
- package/dist/ui/assets/whisper-session-DrDhzSqp.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import"./tray-leader-
|
|
1
|
+
import{t as e}from"./logger-DDBAeTLF.js";import"./tray-leader-DyfRH9_x.js";import"./logger-BoSvu4mW.js";e(`lick-ws-bridge`);function t(e){let t=typeof e.verb==`string`?e.verb:null,n=typeof e.target==`string`?e.target:null,r=typeof e.url==`string`&&e.url.length>0?e.url:null;if(t!==`handoff`&&t!==`upskill`||!n||!r)return null;let i={url:r,verb:t,target:n};return typeof e.instruction==`string`&&(i.instruction=e.instruction),typeof e.branch==`string`&&(i.branch=e.branch),typeof e.path==`string`&&(i.path=e.path),typeof e.title==`string`&&(i.title=e.title),{type:`navigate`,navigateUrl:r,targetScoop:void 0,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString(),body:i}}function n(e){let t=typeof e.discoveryOrigin==`string`?e.discoveryOrigin:null,n=e.discoveryKind===`ai-catalog`||e.discoveryKind===`llms-txt`?e.discoveryKind:null,r=typeof e.discoveryUrl==`string`&&e.discoveryUrl.length>0?e.discoveryUrl:null;if(!t||!n||!r)return null;let i=typeof e.url==`string`?e.url:void 0;return{type:`discovery`,discoveryOrigin:t,discoveryKind:n,discoveryUrl:r,discoverySource:`live-navigation`,targetScoop:void 0,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString(),body:{origin:t,kind:n,url:r,...i?{pageUrl:i}:{}}}}export{n as mapDiscoveryPayloadToLickEvent,t as mapNavigatePayloadToLickEvent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./logger-LESFN7Hj.js";import{n as t,t as n}from"./tray-leader-status-CpkFr6n7.js";import{n as r,r as i,t as a}from"./lick-urls-CgPiVwD-.js";import"./kernel-worker-
|
|
1
|
+
import{t as e}from"./logger-LESFN7Hj.js";import{n as t,t as n}from"./tray-leader-status-CpkFr6n7.js";import{n as r,r as i,t as a}from"./lick-urls-CgPiVwD-.js";import"./kernel-worker-DPGsdtHG.js";const o=e(`lick-ws-bridge`);function s(e){if(e.stopped)return;let t;try{t=e.wsFactory(e.wsUrl)}catch(t){o.error(`Failed to construct lick WebSocket`,{url:e.wsUrl,error:t instanceof Error?t.message:String(t)}),c(e,`construct-threw`);return}e.socket=t,t.onopen=()=>{e.consecutiveFailures>0?o.info(`Lick WebSocket recovered`,{attempts:e.consecutiveFailures}):o.info(`Lick WebSocket connected`),e.consecutiveFailures=0,e.unrecoverableSignalled=!1},t.onmessage=n=>{u(e,t,n.data).catch(e=>{let t=typeof n.data==`string`?n.data.slice(0,200):`[non-string payload]`;o.error(`Failed to process lick message`,{error:e instanceof Error?e.message:String(e),preview:t})})},t.onclose=n=>{if(e.socket===t&&(e.socket=null),e.stopped)return;let r=n.reason?` reason=${JSON.stringify(n.reason)}`:``;c(e,`disconnected code=${n.code}${r}`)},t.onerror=t=>{let n=t.target;o.error(`Lick WebSocket error`,{url:e.wsUrl,readyState:n?.readyState,eventType:t.type})}}function c(e,t){if(e.reconnectHandle!=null){o.debug(`Lick WS failure during pending reconnect — keeping existing timer`,{cause:t});return}e.consecutiveFailures++;let n=Math.min(e.baseDelay*2**(e.consecutiveFailures-1),6e4),r={url:e.wsUrl,attempt:e.consecutiveFailures,cause:t,retryInMs:n};if(e.consecutiveFailures>=3?o.error(`Lick WebSocket still down`,r):o.warn(`Lick WebSocket down`,r),e.consecutiveFailures===20&&!e.unrecoverableSignalled){e.unrecoverableSignalled=!0;try{e.lickManager.emitEvent({type:`session-reload`,targetScoop:void 0,timestamp:new Date().toISOString(),body:{reason:`lick-ws-bridge-down`,url:e.wsUrl,attempts:e.consecutiveFailures}})}catch(e){o.error(`Failed to emit lick-ws-bridge-down signal`,{error:e instanceof Error?e.message:String(e)})}}l(e,n)}function l(e,t){e.stopped||e.reconnectHandle!=null||(e.reconnectHandle=e.setTimer(()=>{e.reconnectHandle=null,s(e)},t))}async function u(e,t,n){let r=JSON.parse(typeof n==`string`?n:String(n));if(r.requestId){let n=r.requestId,i=await g(e,r,n);if(e.stopped||e.socket!==t||t.readyState!==1){o.warn(`Lick reply dropped — socket changed/closed mid-request`,{type:r.type,requestId:n});return}try{t.send(JSON.stringify(i))}catch(e){o.error(`ws.send() failed delivering lick reply`,{type:r.type,requestId:n,error:e instanceof Error?e.message:String(e)})}return}if(r.type===`webhook_event`){d(e.lickManager,r);return}if(r.type===`navigate_event`){p(e.lickManager,r);return}r.type===`hostfs_invalidate`&&h(e,r)}function d(e,t){let n=typeof t.webhookId==`string`?t.webhookId:null;if(!n)return o.error(`Malformed webhook_event from lick-ws`,{receivedKeys:Object.keys(t)}),`malformed`;let r=t.headers&&typeof t.headers==`object`?t.headers:{};try{return e.handleWebhookEvent(n,r,t.body)}catch(e){return o.error(`Webhook event dispatch failed`,{webhookId:n,error:e instanceof Error?e.message:String(e)}),`failed`}}function f(e){let t=typeof e.verb==`string`?e.verb:null,n=typeof e.target==`string`?e.target:null,r=typeof e.url==`string`&&e.url.length>0?e.url:null;if(t!==`handoff`&&t!==`upskill`||!n||!r)return null;let i={url:r,verb:t,target:n};return typeof e.instruction==`string`&&(i.instruction=e.instruction),typeof e.branch==`string`&&(i.branch=e.branch),typeof e.path==`string`&&(i.path=e.path),typeof e.title==`string`&&(i.title=e.title),{type:`navigate`,navigateUrl:r,targetScoop:void 0,timestamp:typeof e.timestamp==`string`?e.timestamp:new Date().toISOString(),body:i}}function p(e,t){let n=f(t);if(!n){o.debug(`navigate_event dropped — invalid payload`,{hasVerb:typeof t.verb==`string`,hasTarget:typeof t.target==`string`,hasUrl:typeof t.url==`string`&&t.url.length>0});return}e.emitEvent(n)}function m(e){if(typeof e.mount!=`string`||e.mount.length===0)return null;let t=e.paths,n=[];if(Array.isArray(t))for(let e of t)typeof e==`string`&&n.push(e);return{type:`hostfs_invalidate`,mount:e.mount,paths:n,timestamp:typeof e.timestamp==`string`?e.timestamp:void 0}}function h(e,t){let n=m(t);if(!n){o.debug(`hostfs_invalidate dropped — invalid payload`,{hasMount:typeof t.mount==`string`&&t.mount.length>0,pathsIsArray:Array.isArray(t.paths)});return}try{e.options.onHostfsInvalidate?.(n)}catch(e){o.warn(`hostfs_invalidate handler threw`,{mount:n.mount,error:e instanceof Error?e.message:String(e)})}}async function g(e,t,r){let{lickManager:i}=e;try{switch(t.type){case`list_webhooks`:return{type:`response`,requestId:r,data:i.listWebhooks().map(t=>({...t,url:_(e,t.id)}))};case`create_webhook`:{let n=await i.createWebhook(t.name||`default`,t.scoop,t.filter);return{type:`response`,requestId:r,data:{...n,url:_(e,n.id)}}}case`webhook_event`:return{type:`response`,requestId:r,data:{disposition:d(i,t)}};case`delete_webhook`:return await i.deleteWebhook(t.id)?{type:`response`,requestId:r,data:{ok:!0}}:{type:`response`,requestId:r,data:{error:`Webhook not found`}};case`list_crontasks`:return{type:`response`,requestId:r,data:i.listCronTasks()};case`create_crontask`:if(!t.name)throw Error(`name is required`);if(!t.cron)throw Error(`cron is required`);return{type:`response`,requestId:r,data:await i.createCronTask(t.name,t.cron,t.scoop,t.filter)};case`delete_crontask`:return await i.deleteCronTask(t.id)?{type:`response`,requestId:r,data:{ok:!0}}:{type:`response`,requestId:r,data:{error:`Cron task not found`}};case`tray_status`:{let e=n();return{type:`response`,requestId:r,data:{state:e.state,joinUrl:e.session?.joinUrl??null,workerBaseUrl:e.session?.workerBaseUrl??null,trayId:e.session?.trayId??null}}}default:return{type:`response`,requestId:r,error:`Unknown request type: ${t.type}`}}}catch(e){return{type:`response`,requestId:r,error:e instanceof Error?e.message:String(e)}}}function _(e,n){let a=t().session;return a?.webhookUrl?r(a.webhookUrl,n):e.webhookOriginOverride?`${e.webhookOriginOverride}/webhooks/${n}`:i(e.options.locationHref,n)}function v(e){if(e.stopped)return;e.stopped=!0,e.reconnectHandle!=null&&(e.clearTimer(e.reconnectHandle),e.reconnectHandle=null);let t=e.socket;if(e.socket=null,t)try{t.close()}catch(e){t.readyState!==3&&t.readyState!==2&&o.warn(`Lick socket close() threw before terminal state`,{readyState:t.readyState,error:e instanceof Error?e.message:String(e)})}}function y(e,t){try{new URL(t.locationHref)}catch(e){throw Error(`startLickWsBridge: invalid locationHref ${JSON.stringify(t.locationHref)}: ${e instanceof Error?e.message:String(e)}`)}let n=typeof t.lickWsUrl==`string`&&t.lickWsUrl.length>0?t.lickWsUrl:a(t.locationHref),r=null;if(typeof t.lickWsUrl==`string`&&t.lickWsUrl.length>0)try{let e=new URL(t.lickWsUrl);r=`${e.protocol===`wss:`?`https:`:`http:`}//${e.host}`}catch{r=null}let i={lickManager:e,options:t,wsUrl:n,webhookOriginOverride:r,baseDelay:t.reconnectDelayMs??3e3,wsFactory:t.webSocketFactory??(e=>new WebSocket(e)),setTimer:t.setTimeoutFn??setTimeout.bind(globalThis),clearTimer:t.clearTimeoutFn??clearTimeout.bind(globalThis),stopped:!1,socket:null,reconnectHandle:null,consecutiveFailures:0,unrecoverableSignalled:!1};return s(i),{stop(){v(i)}}}export{y as startLickWsBridge};
|
package/dist/ui/assets/{live-session-curation-BWfx-Nu1.js → live-session-curation-BeMkfXGh.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import{t as n}from"./record-ChU1ND2B.js";import{n as r,o as i,r as a,u as o}from"./descriptor-S4Jug1iP.js";import{n as s,t as c}from"./thinking-level-5x0UAu9N.js";import{t as l}from"./types-D8gIX-W-.js";import{a as u,r as d}from"./memory-budget-Bcf7Eolo.js";import{a as f,b as p,g as ee,r as m}from"./kernel-worker-B23YxkDH.js";import{t as h}from"./MEMORY-Dl8Y_nOo.js";import{a as te,i as ne,n as g,o as _,r as v,t as re}from"./instruction-frontmatter-B48EsYtA.js";import{c as y,d as b,n as ie,r as ae,s as x}from"./frozen-archive-writer-C97kBlYw.js";function S(e){let t=0;for(let n of e)n.timestamp>t&&(t=n.timestamp);return t}function C(e,t){return t>0?e.filter(e=>e.timestamp>t):[...e]}const w=t(`agentic-memory`),oe=e=>[e.memoryPath],se=e=>[`/sessions/`,`/shared/`,...i(e)],ce=`awk.cat.cp.cut.date.diff.du.echo.file.find.grep.head.jq.ls.mkdir.mount.mv.nl.od.printf.readlink.rg.sed.sort.stat.tail.touch.tr.uniq.uname.upskill.wc.xxd`.split(`.`),le={arrayKeys:new Set([`writablePaths`,`visiblePaths`,`allowedCommands`]),scalarKeys:new Set([`model`,`timeoutSeconds`,`dreamTimeoutSeconds`,`thinkingLevel`])},T=3e4;function E(e){return e===`cone`?`memory-curator`:`memory-curator-${e}`}const D={kind:`curate`,nameFor:E,rivalsFor:e=>[k(e)]},O=`{{TASK}}`;function ue(e,t,n){return e.kind===`dream`?`**Consolidation pass** (the nightly dreaming): there is NO new session to mine — skip "Mining the session archive" entirely. Your whole job is to make the existing memory better: consolidated, current, and inside its budget. If the file is missing or empty, reply with one line saying so and stop; never invent memories. The run is hard-stopped after ${n} minutes; a run stopped at that bound lands whatever the memory file holds at that moment (every memory_write leaves a whole, budget-checked file), so consolidate section by section, writing as you go, and finish cleanly when you can.`:`**Curation pass**: mine the archived session at ${t} for what is worth carrying into future sessions, fold it into the memory, and consolidate the whole file in the same pass. Work fast: a pass should finish in well under 10 minutes and is hard-stopped after ${n} minutes — mine the three signals, write, and stop, rather than exploring the archive exhaustively.`}async function de(e){try{await e.stat(d);return}catch{}try{await e.mkdir(`/etc`,{recursive:!0}),await e.writeFile(d,h),w.info(`Seeded default ${d}`)}catch(e){w.warn(`Failed to seed ${d}`,{error:L(e)})}}function k(e){return e===`cone`?`memory-dreamer`:`memory-dreamer-${e}`}function fe(e,t){let r=e.nameFor(t);return me.test(r)?r:e.nameFor(n)}function pe(e,t){let r=me.test(e.nameFor(t))?t:n;return e.rivalsFor?.(r)??[]}const me=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function he(e,t){return`/scoops/agent-${fe(e,t)}`}function ge(e){return he(D,e)}const _e=ge(n);function ve(e){return o({parentJid:null,folder:e?.folder??`cone`})}function A(e,t){if(t.root===r.root)return e;if(e===r.memoryPath)return t.memoryPath;if(e===`/workspace/skills`||e.startsWith(`/workspace/skills/`))return e;let n=`${r.root}/`;return e===r.root?t.root:e.startsWith(n)?`${t.root}/${e.slice(n.length)}`:e}function ye(e,t){let n=`${a}/`,r=e=>e.some(e=>n.startsWith(e.endsWith(`/`)?e:`${e}/`)),i=e.map(e=>A(e,t));return r(e)&&!r(i)&&i.push(n),i}async function j(e){try{if(e.signal?.aborted)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};let t=e.instructions??D,n=ve(e.cone),r=he(t,e.cone?.folder??`cone`),i=await be(e.vfs,n),a=t.kind===`dream`?i.dreamTimeoutSeconds:i.timeoutSeconds,o=I(e.sessionArchivePath);try{await Ce(e.vfs,n.memoryPath,e.sessionArchivePath)}catch(e){return{ok:!1,reason:`snapshot: ${L(e)}`,legacyFallbackSafe:!0}}let s=t.kind===`dream`?`(no session archive this pass)`:e.sessionArchivePath,c=Math.max(1,Math.round(a/60)),l=ue(t,s,c),d=Te(i,a,Ee(De(i.promptTemplate.includes(O)?i.promptTemplate:`${i.promptTemplate.trimEnd()}\n\n${O}`,{MEMORY_PATH:o,SESSION_ARCHIVE_PATH:s,SESSION_COUNT:String(e.sessionCount),BUDGET_CHARS:String(u(e.sessionCount)),SCRATCH_DIR:r,TODAY:e.today??new Date().toISOString().slice(0,10),TIMEOUT_MINUTES:String(c),TASK:l}),r),e.sessionArchivePath,n,e.cone,t);e.signal&&(d.signal=e.signal);let f=await Oe(Promise.resolve().then(()=>e.spawn(d)),a*1e3+T,e.signal);if(f.type===`timeout`)return w.warn(`Agentic memory wait timed out past the in-run bound + grace`,{timeoutSeconds:a,graceMs:T}),{ok:!1,reason:`timeout`,legacyFallbackSafe:!1};if(f.type===`aborted`)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};if(f.type===`error`)return{ok:!1,reason:L(f.error),legacyFallbackSafe:!0};if(f.result.exitCode!==0){let e=(f.result.finalText??``).startsWith(ee);return{ok:!1,reason:f.result.finalText||`exit-${f.result.exitCode}`,legacyFallbackSafe:!e}}return{ok:!0,report:f.result.finalText}}catch(e){return w.warn(`Agentic memory pass failed`,{error:L(e)}),{ok:!1,reason:L(e),legacyFallbackSafe:!1}}}async function be(e,t=r){try{let n=await e.readFile(d,{encoding:`utf-8`});return M(typeof n==`string`?n:new TextDecoder().decode(n),t)}catch(e){return w.warn(`Could not load valid ${d}; using built-in default`,{error:L(e)}),M(h,t)}}function M(e,t=r){let n=te(e,`MEMORY.md`),i=re(n.frontmatter,le),a=g(i,`writablePaths`,oe(t));if(a.length===0)throw Error(`writablePaths must not be empty`);_(a,`writablePaths`);let o=g(i,`visiblePaths`,se(t));_(o,`visiblePaths`);let s=v(i.timeoutSeconds,600,1200),c=v(i.dreamTimeoutSeconds,3600,7200,`dreamTimeoutSeconds`),l=ne(i.model,`model`);return{writablePaths:a.map(e=>A(e,t)),visiblePaths:ye(o,t),allowedCommands:[...new Set([...ce,...g(i,`allowedCommands`,[])])],...l?{model:l}:{},thinkingLevel:xe(i.thinkingLevel),timeoutSeconds:s,dreamTimeoutSeconds:c,promptTemplate:n.body}}function xe(e){if(e===void 0)return`medium`;if(typeof e!=`string`||!s(e))throw Error(`thinkingLevel must be one of ${c.join(`, `)}`);return e}function N(e){return`/sessions/.curated/${e.slice(e.lastIndexOf(`/`)+1)}`}function P(e){return`/sessions/.curation/${e.slice(e.lastIndexOf(`/`)+1)}`}function F(e){return`${P(e)}/base.md`}function I(e){return`${P(e)}/draft.md`}function Se(e){return`${P(e)}/status.json`}async function Ce(e,t,n){let r=``;try{let n=await e.readFile(t,{encoding:`utf-8`});r=typeof n==`string`?n:new TextDecoder().decode(n)}catch{}await e.mkdir(P(n),{recursive:!0}),await e.writeFile(F(n),r),await e.writeFile(I(n),r)}function we(e,t,n){let r=e.map(e=>e===t?n:e);return r.includes(n)?r:[...r,n]}function Te(e,t,n,r,i,a,o){let s=e.model===`parent`||e.model===`cone`,c=F(r),l=I(r);return{cwd:i.root,writablePaths:we(e.writablePaths,i.memoryPath,l),visiblePaths:[...e.visiblePaths,`${P(r)}/`],allowedCommands:e.allowedCommands,prompt:n,thinkingLevel:e.thinkingLevel,persistSession:!0,name:fe(o,a?.folder??`cone`),exclusiveWith:pe(o,a?.folder??`cone`),...a?.jid?{parentJid:a.jid}:{},notifyOnComplete:!0,successReceiptPath:N(r),mergeOnSuccess:{targetPath:i.memoryPath,basePath:c,draftPath:l},outcomeReceiptPath:Se(r),maxWallClockMs:t*1e3,...!s&&e.model?{modelId:e.model}:{}}}function Ee(e,t){if(t===_e)return e;let n=`\0SCRATCH\0`;return e.replaceAll(t,n).replaceAll(_e,t).replaceAll(n,t)}function De(e,t){let n=e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{{${e}}}`,r);return n}function Oe(e,t,n){return new Promise(r=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(s),n?.removeEventListener(`abort`,o),r(e))},o=()=>a({type:`aborted`}),s=setTimeout(()=>a({type:`timeout`}),t);n?.addEventListener(`abort`,o,{once:!0}),e.then(e=>a({type:`result`,result:e}),e=>a({type:`error`,error:e}))})}function L(e){return e instanceof Error?e.message:String(e)}var ke=e({DEFAULT_DELTA_LIMITS:()=>V,LIVE_DELTA_MAX_CHARS:()=>z,LIVE_DELTA_MAX_MESSAGES:()=>200,advanceCuratedThrough:()=>J,curateLiveSessionDelta:()=>q,liveDeltaArchivePath:()=>G,liveDeltaCurationEnabled:()=>W,scheduleLiveDeltaCuration:()=>Ae,takeDeltaSlice:()=>K});const R=t(`live-session-curation`),z=8e4,B=`/sessions/.live-deltas`,V={maxMessages:200,maxChars:z},H=new Map,U=new Map;function W(){return p(`memory-v2`)&&p(`agentic-memory`)}function G(e,t,n){return`${B}/${e}-${t}-${n}.md`}function K(e,t=V){if(e.length===0)return[];let n=[],r=0;for(let i of e){let e=Ve(i);if(n.length>=t.maxMessages||n.length>0&&r+e>t.maxChars)break;n.push(i),r+=e}n.length===0&&n.push(e[0]);let i=n[n.length-1].timestamp,a=n.length;for(;a<e.length&&e[a].timestamp===i;)n.push(e[a]),a+=1;return n}function Ae(e){if(!W())return Promise.resolve({status:`skipped`,reason:`flag-off`});let t=e.cone.folder||`cone`,n={...e.cone,folder:t},r=Be();if(!r)return R.info(`Live delta curation skipped: agent bridge not published`,{cone:t}),Promise.resolve({status:`skipped`,reason:`no-bridge`});let i={...e,cone:n},a=H.get(t);return a?(U.set(t,i),a):Y(i,r)}function q(e){let t=e.cone.folder||`cone`,n={...e.cone,folder:t},r={...e,cone:n};if(e.hold===`held`)return Me(r);let i=H.get(t);return i?i.then(()=>q(r)):X(t,Me(r))}async function J(e,t,n){n>0&&await y(async()=>{let r=await x(Z(e)),i=r.findIndex(e=>e.filename===t);if(i===-1||n<=(r[i].curatedThrough??0))return;let{memoryFailed:a,...o}=r[i],s=r.slice();s[i]={...o,curatedThrough:n},await b(Z(e),s),await Ie(e,`${m}/${t}`,n),await e.flush?.()})}function Y(e,t){return X(e.cone.folder||`cone`,q({vfs:e.vfs,cone:e.cone,spawn:e=>t.spawn(e),enabled:!0,hold:`held`,...e.limits?{limits:e.limits}:{}}))}function X(e,t){return H.set(e,t),t.then(()=>je(e,t),()=>je(e,t)),t}function je(e,t){if(H.get(e)!==t)return;H.delete(e);let n=U.get(e);if(U.delete(e),!n||!W())return;let r=Be();r&&Y(n,r).catch(t=>{R.warn(`Follow-up live delta curation failed to start`,{cone:e,error:Q(t)})})}async function Me(e){if(!(e.enabled??W()))return{status:`skipped`,reason:`flag-off`};let t=e.cone.folder||`cone`,n=e.limits??V,r;try{r=await x(Z(e.vfs))}catch(e){return R.warn(`Live delta curation skipped: sessions index unreadable`,{cone:t,error:Q(e)}),{status:`skipped`,reason:`index-unreadable`}}let i=ie(r,t);if(!i?.sessionId)return{status:`skipped`,reason:`no-archive`};let a=await Le(e.vfs,`${m}/${i.filename}`);if(!a)return{status:`skipped`,reason:`no-archive`};let o=await Ne(e.vfs,i.sessionId,i.filename,a,i.curatedThrough??0,n),s=C(a,o);if(s.length===0)return{status:`skipped`,reason:`caught-up`};let c=K(s,n),l=S(c);if(l<=o)return{status:`skipped`,reason:`caught-up`};let u=G(i.sessionId,o,l);await Pe(e.vfs,{sessionId:i.sessionId,filename:i.filename,title:i.title,frozenAt:i.frozenAt,cone:i.cone,coneLabel:i.coneLabel},c,u);let d=await j({spawn:e.spawn,vfs:e.vfs,sessionArchivePath:u,sessionCount:r.length,...t!==`cone`||e.cone.jid?{cone:e.cone}:{},...e.signal?{signal:e.signal}:{}});return d.ok?(await J(e.vfs,i.filename,l),R.info(`Live delta curated`,{cone:t,filename:i.filename,through:l}),{status:`curated`,curatedThrough:l,filename:i.filename}):(d.reason.startsWith(`agent: name already in use`)||await Fe(e.vfs,i.filename,d.reason),R.warn(`Live delta curation failed`,{cone:t,filename:i.filename,reason:d.reason}),{status:`failed`,reason:d.reason,filename:i.filename})}async function Ne(e,t,n,r,i,a){let o=i;for(let n=0;n<50;n+=1){let n=C(r,o);if(n.length===0)break;let i=S(K(n,a??V));if(i<=o||!await Re(e,G(t,o,i)))break;o=i}return o>i&&await J(e,n,o),o}async function Pe(e,t,n,r){let i={id:t.sessionId,title:t.title,frozenAt:t.frozenAt,createdAt:n[0]?.timestamp??0,updatedAt:S(n),messageCount:n.length,messages:[...n],...t.cone?{cone:t.cone}:{},...t.coneLabel?{coneLabel:t.coneLabel}:{}};await e.mkdir(B,{recursive:!0}),await e.writeFile(r,ae(i))}async function Fe(e,t,n){try{await y(async()=>{let r=await x(Z(e)),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let a=r.slice();a[i]={...r[i],memoryFailed:n.slice(0,300)},await b(Z(e),a),await e.flush?.()})}catch(e){R.warn(`Failed to record live curation failure`,{filename:t,error:Q(e)})}}async function Ie(e,t,n){let r;try{r=await ze(e,t)}catch(e){if($(e))return;throw e}let i=r.match(/^---\n([\s\S]*?)\n---\n/);if(!i)return;let a=`curatedThrough: ${n}`,o=/^curatedThrough:\s*\d+\s*$/m.test(i[1])?i[1].replace(/^curatedThrough:\s*\d+\s*$/m,a):`${i[1]}\n${a}`;o!==i[1]&&await e.writeFile(t,`---\n${o}\n---\n${r.slice(i[0].length)}`)}async function Le(e,t){try{return f(await ze(e,t)).messages}catch(e){if($(e))return null;throw e}}async function Re(e,t){try{return await e.readFile(N(t),{encoding:`utf-8`}),!0}catch(e){if($(e))return!1;throw e}}async function ze(e,t){let n=await e.readFile(t,{encoding:`utf-8`});return typeof n==`string`?n:new TextDecoder().decode(n)}function Be(){return globalThis.__slicc_agent}function Ve(e){let t=e.toolCalls?JSON.stringify(e.toolCalls).length:0;return e.content.length+t}function Z(e){return e}function Q(e){return e instanceof Error?e.message:String(e)}function $(e){return e instanceof l?e.code===`ENOENT`:typeof e!=`object`||!e||!(`code`in e)?!1:e.code===`ENOENT`}export{k as a,E as i,W as n,j as o,ke as r,de as s,q as t};
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import{t as n}from"./record-ChU1ND2B.js";import{n as r,o as i,r as a,u as o}from"./descriptor-S4Jug1iP.js";import{n as s,t as c}from"./thinking-level-5x0UAu9N.js";import{t as l}from"./types-D8gIX-W-.js";import{a as u,r as d}from"./memory-budget-Bcf7Eolo.js";import{a as f,b as p,g as ee,r as m}from"./kernel-worker-DPGsdtHG.js";import{t as h}from"./MEMORY-Dl8Y_nOo.js";import{a as te,i as ne,n as g,o as _,r as v,t as re}from"./instruction-frontmatter-B48EsYtA.js";import{c as y,d as b,n as ie,r as ae,s as x}from"./frozen-archive-writer-DRM5RlgX.js";function S(e){let t=0;for(let n of e)n.timestamp>t&&(t=n.timestamp);return t}function C(e,t){return t>0?e.filter(e=>e.timestamp>t):[...e]}const w=t(`agentic-memory`),oe=e=>[e.memoryPath],se=e=>[`/sessions/`,`/shared/`,...i(e)],ce=`awk.cat.cp.cut.date.diff.du.echo.file.find.grep.head.jq.ls.mkdir.mount.mv.nl.od.printf.readlink.rg.sed.sort.stat.tail.touch.tr.uniq.uname.upskill.wc.xxd`.split(`.`),le={arrayKeys:new Set([`writablePaths`,`visiblePaths`,`allowedCommands`]),scalarKeys:new Set([`model`,`timeoutSeconds`,`dreamTimeoutSeconds`,`thinkingLevel`])},T=3e4;function E(e){return e===`cone`?`memory-curator`:`memory-curator-${e}`}const D={kind:`curate`,nameFor:E,rivalsFor:e=>[k(e)]},O=`{{TASK}}`;function ue(e,t,n){return e.kind===`dream`?`**Consolidation pass** (the nightly dreaming): there is NO new session to mine — skip "Mining the session archive" entirely. Your whole job is to make the existing memory better: consolidated, current, and inside its budget. If the file is missing or empty, reply with one line saying so and stop; never invent memories. The run is hard-stopped after ${n} minutes; a run stopped at that bound lands whatever the memory file holds at that moment (every memory_write leaves a whole, budget-checked file), so consolidate section by section, writing as you go, and finish cleanly when you can.`:`**Curation pass**: mine the archived session at ${t} for what is worth carrying into future sessions, fold it into the memory, and consolidate the whole file in the same pass. Work fast: a pass should finish in well under 10 minutes and is hard-stopped after ${n} minutes — mine the three signals, write, and stop, rather than exploring the archive exhaustively.`}async function de(e){try{await e.stat(d);return}catch{}try{await e.mkdir(`/etc`,{recursive:!0}),await e.writeFile(d,h),w.info(`Seeded default ${d}`)}catch(e){w.warn(`Failed to seed ${d}`,{error:L(e)})}}function k(e){return e===`cone`?`memory-dreamer`:`memory-dreamer-${e}`}function fe(e,t){let r=e.nameFor(t);return me.test(r)?r:e.nameFor(n)}function pe(e,t){let r=me.test(e.nameFor(t))?t:n;return e.rivalsFor?.(r)??[]}const me=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function he(e,t){return`/scoops/agent-${fe(e,t)}`}function ge(e){return he(D,e)}const _e=ge(n);function ve(e){return o({parentJid:null,folder:e?.folder??`cone`})}function A(e,t){if(t.root===r.root)return e;if(e===r.memoryPath)return t.memoryPath;if(e===`/workspace/skills`||e.startsWith(`/workspace/skills/`))return e;let n=`${r.root}/`;return e===r.root?t.root:e.startsWith(n)?`${t.root}/${e.slice(n.length)}`:e}function ye(e,t){let n=`${a}/`,r=e=>e.some(e=>n.startsWith(e.endsWith(`/`)?e:`${e}/`)),i=e.map(e=>A(e,t));return r(e)&&!r(i)&&i.push(n),i}async function j(e){try{if(e.signal?.aborted)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};let t=e.instructions??D,n=ve(e.cone),r=he(t,e.cone?.folder??`cone`),i=await be(e.vfs,n),a=t.kind===`dream`?i.dreamTimeoutSeconds:i.timeoutSeconds,o=I(e.sessionArchivePath);try{await Ce(e.vfs,n.memoryPath,e.sessionArchivePath)}catch(e){return{ok:!1,reason:`snapshot: ${L(e)}`,legacyFallbackSafe:!0}}let s=t.kind===`dream`?`(no session archive this pass)`:e.sessionArchivePath,c=Math.max(1,Math.round(a/60)),l=ue(t,s,c),d=Te(i,a,Ee(De(i.promptTemplate.includes(O)?i.promptTemplate:`${i.promptTemplate.trimEnd()}\n\n${O}`,{MEMORY_PATH:o,SESSION_ARCHIVE_PATH:s,SESSION_COUNT:String(e.sessionCount),BUDGET_CHARS:String(u(e.sessionCount)),SCRATCH_DIR:r,TODAY:e.today??new Date().toISOString().slice(0,10),TIMEOUT_MINUTES:String(c),TASK:l}),r),e.sessionArchivePath,n,e.cone,t);e.signal&&(d.signal=e.signal);let f=await Oe(Promise.resolve().then(()=>e.spawn(d)),a*1e3+T,e.signal);if(f.type===`timeout`)return w.warn(`Agentic memory wait timed out past the in-run bound + grace`,{timeoutSeconds:a,graceMs:T}),{ok:!1,reason:`timeout`,legacyFallbackSafe:!1};if(f.type===`aborted`)return{ok:!1,reason:`aborted`,legacyFallbackSafe:!1};if(f.type===`error`)return{ok:!1,reason:L(f.error),legacyFallbackSafe:!0};if(f.result.exitCode!==0){let e=(f.result.finalText??``).startsWith(ee);return{ok:!1,reason:f.result.finalText||`exit-${f.result.exitCode}`,legacyFallbackSafe:!e}}return{ok:!0,report:f.result.finalText}}catch(e){return w.warn(`Agentic memory pass failed`,{error:L(e)}),{ok:!1,reason:L(e),legacyFallbackSafe:!1}}}async function be(e,t=r){try{let n=await e.readFile(d,{encoding:`utf-8`});return M(typeof n==`string`?n:new TextDecoder().decode(n),t)}catch(e){return w.warn(`Could not load valid ${d}; using built-in default`,{error:L(e)}),M(h,t)}}function M(e,t=r){let n=te(e,`MEMORY.md`),i=re(n.frontmatter,le),a=g(i,`writablePaths`,oe(t));if(a.length===0)throw Error(`writablePaths must not be empty`);_(a,`writablePaths`);let o=g(i,`visiblePaths`,se(t));_(o,`visiblePaths`);let s=v(i.timeoutSeconds,600,1200),c=v(i.dreamTimeoutSeconds,3600,7200,`dreamTimeoutSeconds`),l=ne(i.model,`model`);return{writablePaths:a.map(e=>A(e,t)),visiblePaths:ye(o,t),allowedCommands:[...new Set([...ce,...g(i,`allowedCommands`,[])])],...l?{model:l}:{},thinkingLevel:xe(i.thinkingLevel),timeoutSeconds:s,dreamTimeoutSeconds:c,promptTemplate:n.body}}function xe(e){if(e===void 0)return`medium`;if(typeof e!=`string`||!s(e))throw Error(`thinkingLevel must be one of ${c.join(`, `)}`);return e}function N(e){return`/sessions/.curated/${e.slice(e.lastIndexOf(`/`)+1)}`}function P(e){return`/sessions/.curation/${e.slice(e.lastIndexOf(`/`)+1)}`}function F(e){return`${P(e)}/base.md`}function I(e){return`${P(e)}/draft.md`}function Se(e){return`${P(e)}/status.json`}async function Ce(e,t,n){let r=``;try{let n=await e.readFile(t,{encoding:`utf-8`});r=typeof n==`string`?n:new TextDecoder().decode(n)}catch{}await e.mkdir(P(n),{recursive:!0}),await e.writeFile(F(n),r),await e.writeFile(I(n),r)}function we(e,t,n){let r=e.map(e=>e===t?n:e);return r.includes(n)?r:[...r,n]}function Te(e,t,n,r,i,a,o){let s=e.model===`parent`||e.model===`cone`,c=F(r),l=I(r);return{cwd:i.root,writablePaths:we(e.writablePaths,i.memoryPath,l),visiblePaths:[...e.visiblePaths,`${P(r)}/`],allowedCommands:e.allowedCommands,prompt:n,thinkingLevel:e.thinkingLevel,persistSession:!0,name:fe(o,a?.folder??`cone`),exclusiveWith:pe(o,a?.folder??`cone`),...a?.jid?{parentJid:a.jid}:{},notifyOnComplete:!0,successReceiptPath:N(r),mergeOnSuccess:{targetPath:i.memoryPath,basePath:c,draftPath:l},outcomeReceiptPath:Se(r),maxWallClockMs:t*1e3,...!s&&e.model?{modelId:e.model}:{}}}function Ee(e,t){if(t===_e)return e;let n=`\0SCRATCH\0`;return e.replaceAll(t,n).replaceAll(_e,t).replaceAll(n,t)}function De(e,t){let n=e;for(let[e,r]of Object.entries(t))n=n.replaceAll(`{{${e}}}`,r);return n}function Oe(e,t,n){return new Promise(r=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(s),n?.removeEventListener(`abort`,o),r(e))},o=()=>a({type:`aborted`}),s=setTimeout(()=>a({type:`timeout`}),t);n?.addEventListener(`abort`,o,{once:!0}),e.then(e=>a({type:`result`,result:e}),e=>a({type:`error`,error:e}))})}function L(e){return e instanceof Error?e.message:String(e)}var ke=e({DEFAULT_DELTA_LIMITS:()=>V,LIVE_DELTA_MAX_CHARS:()=>z,LIVE_DELTA_MAX_MESSAGES:()=>200,advanceCuratedThrough:()=>J,curateLiveSessionDelta:()=>q,liveDeltaArchivePath:()=>G,liveDeltaCurationEnabled:()=>W,scheduleLiveDeltaCuration:()=>Ae,takeDeltaSlice:()=>K});const R=t(`live-session-curation`),z=8e4,B=`/sessions/.live-deltas`,V={maxMessages:200,maxChars:z},H=new Map,U=new Map;function W(){return p(`memory-v2`)&&p(`agentic-memory`)}function G(e,t,n){return`${B}/${e}-${t}-${n}.md`}function K(e,t=V){if(e.length===0)return[];let n=[],r=0;for(let i of e){let e=Ve(i);if(n.length>=t.maxMessages||n.length>0&&r+e>t.maxChars)break;n.push(i),r+=e}n.length===0&&n.push(e[0]);let i=n[n.length-1].timestamp,a=n.length;for(;a<e.length&&e[a].timestamp===i;)n.push(e[a]),a+=1;return n}function Ae(e){if(!W())return Promise.resolve({status:`skipped`,reason:`flag-off`});let t=e.cone.folder||`cone`,n={...e.cone,folder:t},r=Be();if(!r)return R.info(`Live delta curation skipped: agent bridge not published`,{cone:t}),Promise.resolve({status:`skipped`,reason:`no-bridge`});let i={...e,cone:n},a=H.get(t);return a?(U.set(t,i),a):Y(i,r)}function q(e){let t=e.cone.folder||`cone`,n={...e.cone,folder:t},r={...e,cone:n};if(e.hold===`held`)return Me(r);let i=H.get(t);return i?i.then(()=>q(r)):X(t,Me(r))}async function J(e,t,n){n>0&&await y(async()=>{let r=await x(Z(e)),i=r.findIndex(e=>e.filename===t);if(i===-1||n<=(r[i].curatedThrough??0))return;let{memoryFailed:a,...o}=r[i],s=r.slice();s[i]={...o,curatedThrough:n},await b(Z(e),s),await Ie(e,`${m}/${t}`,n),await e.flush?.()})}function Y(e,t){return X(e.cone.folder||`cone`,q({vfs:e.vfs,cone:e.cone,spawn:e=>t.spawn(e),enabled:!0,hold:`held`,...e.limits?{limits:e.limits}:{}}))}function X(e,t){return H.set(e,t),t.then(()=>je(e,t),()=>je(e,t)),t}function je(e,t){if(H.get(e)!==t)return;H.delete(e);let n=U.get(e);if(U.delete(e),!n||!W())return;let r=Be();r&&Y(n,r).catch(t=>{R.warn(`Follow-up live delta curation failed to start`,{cone:e,error:Q(t)})})}async function Me(e){if(!(e.enabled??W()))return{status:`skipped`,reason:`flag-off`};let t=e.cone.folder||`cone`,n=e.limits??V,r;try{r=await x(Z(e.vfs))}catch(e){return R.warn(`Live delta curation skipped: sessions index unreadable`,{cone:t,error:Q(e)}),{status:`skipped`,reason:`index-unreadable`}}let i=ie(r,t);if(!i?.sessionId)return{status:`skipped`,reason:`no-archive`};let a=await Le(e.vfs,`${m}/${i.filename}`);if(!a)return{status:`skipped`,reason:`no-archive`};let o=await Ne(e.vfs,i.sessionId,i.filename,a,i.curatedThrough??0,n),s=C(a,o);if(s.length===0)return{status:`skipped`,reason:`caught-up`};let c=K(s,n),l=S(c);if(l<=o)return{status:`skipped`,reason:`caught-up`};let u=G(i.sessionId,o,l);await Pe(e.vfs,{sessionId:i.sessionId,filename:i.filename,title:i.title,frozenAt:i.frozenAt,cone:i.cone,coneLabel:i.coneLabel},c,u);let d=await j({spawn:e.spawn,vfs:e.vfs,sessionArchivePath:u,sessionCount:r.length,...t!==`cone`||e.cone.jid?{cone:e.cone}:{},...e.signal?{signal:e.signal}:{}});return d.ok?(await J(e.vfs,i.filename,l),R.info(`Live delta curated`,{cone:t,filename:i.filename,through:l}),{status:`curated`,curatedThrough:l,filename:i.filename}):(d.reason.startsWith(`agent: name already in use`)||await Fe(e.vfs,i.filename,d.reason),R.warn(`Live delta curation failed`,{cone:t,filename:i.filename,reason:d.reason}),{status:`failed`,reason:d.reason,filename:i.filename})}async function Ne(e,t,n,r,i,a){let o=i;for(let n=0;n<50;n+=1){let n=C(r,o);if(n.length===0)break;let i=S(K(n,a??V));if(i<=o||!await Re(e,G(t,o,i)))break;o=i}return o>i&&await J(e,n,o),o}async function Pe(e,t,n,r){let i={id:t.sessionId,title:t.title,frozenAt:t.frozenAt,createdAt:n[0]?.timestamp??0,updatedAt:S(n),messageCount:n.length,messages:[...n],...t.cone?{cone:t.cone}:{},...t.coneLabel?{coneLabel:t.coneLabel}:{}};await e.mkdir(B,{recursive:!0}),await e.writeFile(r,ae(i))}async function Fe(e,t,n){try{await y(async()=>{let r=await x(Z(e)),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let a=r.slice();a[i]={...r[i],memoryFailed:n.slice(0,300)},await b(Z(e),a),await e.flush?.()})}catch(e){R.warn(`Failed to record live curation failure`,{filename:t,error:Q(e)})}}async function Ie(e,t,n){let r;try{r=await ze(e,t)}catch(e){if($(e))return;throw e}let i=r.match(/^---\n([\s\S]*?)\n---\n/);if(!i)return;let a=`curatedThrough: ${n}`,o=/^curatedThrough:\s*\d+\s*$/m.test(i[1])?i[1].replace(/^curatedThrough:\s*\d+\s*$/m,a):`${i[1]}\n${a}`;o!==i[1]&&await e.writeFile(t,`---\n${o}\n---\n${r.slice(i[0].length)}`)}async function Le(e,t){try{return f(await ze(e,t)).messages}catch(e){if($(e))return null;throw e}}async function Re(e,t){try{return await e.readFile(N(t),{encoding:`utf-8`}),!0}catch(e){if($(e))return!1;throw e}}async function ze(e,t){let n=await e.readFile(t,{encoding:`utf-8`});return typeof n==`string`?n:new TextDecoder().decode(n)}function Be(){return globalThis.__slicc_agent}function Ve(e){let t=e.toolCalls?JSON.stringify(e.toolCalls).length:0;return e.content.length+t}function Z(e){return e}function Q(e){return e instanceof Error?e.message:String(e)}function $(e){return e instanceof l?e.code===`ENOENT`:typeof e!=`object`||!e||!(`code`in e)?!1:e.code===`ENOENT`}export{k as a,E as i,W as n,j as o,ke as r,de as s,q as t};
|
package/dist/ui/assets/{live-session-snapshot-BSNfthJ2.js → live-session-snapshot-Bm0Bb5YU.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./logger-LESFN7Hj.js";import"./record-ChU1ND2B.js";import{t}from"./types-D8gIX-W-.js";import{_ as n,a as r,r as i}from"./kernel-worker-
|
|
1
|
+
import{t as e}from"./logger-LESFN7Hj.js";import"./record-ChU1ND2B.js";import{t}from"./types-D8gIX-W-.js";import{_ as n,a as r,r as i}from"./kernel-worker-DPGsdtHG.js";import{a,c as o,d as s,i as c,l,n as u,o as d,r as f,s as p,t as m,u as h}from"./frozen-archive-writer-DRM5RlgX.js";const g=e(`live-session-snapshot`);function _(e,t){return`/scoops/${e}/sessions/${t}`}function v(e){let t=e.cone.folder||`cone`,r=e.sessionsDir??`/sessions`,i=n(e.messages,{source:e.cone.label??t,uncapped:!0});return o(async()=>e.stillValid&&!e.stillValid()?(g.info(`Live session snapshot skipped: session gone before the write`,{cone:t,sessionsDir:r,trigger:e.trigger}),null):y(e,t,r,i),l(r))}async function y(e,t,n,r){let i=e.now??Date.now,o=await p(e.vfs,n),s=u(o,t),l=s?await w(e.vfs,n,s):null,_=l===null?0:s?.liveThrough??C(l),v=S(r,l??[],_),y=[...l??[],...v],b=Math.max(_,C(r)),x=s?.filename??d(t),T=s?.frozenAt??new Date(i()).toISOString(),E=c(y),D=s?.title&&!a(s.title)?s.title:E,O=(s?.compactions??0)+1,k={cone:t,...t!==`cone`&&e.cone.label?{coneLabel:e.cone.label}:{}},A={id:s?.sessionId??crypto.randomUUID(),title:D,frozenAt:T,createdAt:y[0]?.timestamp||i(),updatedAt:i(),messageCount:y.length,messages:y,...k,live:!0,liveThrough:b,compactions:O,...s?.curatedThrough?{curatedThrough:s.curatedThrough}:{}},j={filename:x,sessionId:A.id,title:D,frozenAt:T,messageCount:y.length,...k,...s?.icon?{icon:s.icon}:{},live:!0,liveThrough:b,compactions:O,...s?.curatedThrough?{curatedThrough:s.curatedThrough}:{},...s?.memoryFailed?{memoryFailed:s.memoryFailed}:{}};await m(e.vfs,n);let M=`${n}/${x}`;return await e.vfs.writeFile(M,f(A)),await h(e.vfs,j,n),await e.vfs.flush(),g.info(`Live session snapshot written`,{cone:t,sessionsDir:n,filename:x,trigger:e.trigger,appended:v.length,total:y.length,compactions:O}),{transcriptPath:M,entry:j,appended:v.length}}function b(e,t){let n=t||`cone`;return o(async()=>{let t=await p(e),r=u(t,n);if(!r)return!1;let{live:a,liveThrough:o,...c}=r,l={...c,pendingEnrichment:!0};return await s(e,t.map(e=>e===r?l:e)),await T(e,`${i}/${r.filename}`),await e.flush(),g.info(`Live session snapshot finalized`,{cone:n,filename:r.filename}),!0})}function x(e,n){let r=n||`cone`;return o(async()=>{let n=await p(e),a=n.filter(e=>e.live===!0&&(e.cone??`cone`)===r);if(a.length===0)return 0;await s(e,n.filter(e=>!a.includes(e)));for(let n of a){try{await e.rm(`${i}/${n.filename}`)}catch(e){if(!(e instanceof t)||e.code!==`ENOENT`)throw e}let{removeSessionJsonl:r}=await import(`./session-jsonl-BT6N86_D.js`);await r(e,n.filename)}let{invalidateSessionSearchIndex:o}=await import(`./session-search-index-CRSNfFPt.js`);return await o(e),await e.flush(),g.info(`Live session snapshot discarded`,{cone:r,removed:a.length}),a.length})}function S(e,t,n){if(t.length===0)return e;let r=t.filter(e=>e.timestamp===n);return e.filter(e=>e.timestamp>n?!0:e.timestamp<n?!1:!r.some(t=>t.role===e.role&&t.content===e.content))}function C(e){let t=0;for(let n of e)n.timestamp>t&&(t=n.timestamp);return t}async function w(e,n,i){try{let t=await e.readFile(`${n}/${i.filename}`,{encoding:`utf-8`}),a=typeof t==`string`?t:new TextDecoder().decode(t);return r(a).messages}catch(e){if(!(e instanceof t)||e.code!==`ENOENT`)throw e;return g.warn(`Live snapshot archive missing; rewriting from the agent history`,{sessionsDir:n,filename:i.filename}),null}}async function T(e,n){try{let t=await e.readFile(n,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=r.match(/^---\n([\s\S]*?)\n---\n/);if(!i)return;let a=i[1].replace(/^(live: true|liveThrough: \d+)\n?/gm,``);if(a===i[1])return;await e.writeFile(n,`---\n${a}\n---\n${r.slice(i[0].length)}`)}catch(e){if(e instanceof t&&e.code===`ENOENT`)return;throw e}}export{x as discardLiveSnapshot,b as finalizeLiveSnapshot,_ as scoopSessionsDir,v as snapshotLiveSession};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import{c as n}from"./account-store-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import{c as n}from"./account-store-DORXRt2J.js";import{a as r}from"./diagnostics-DN_idNHx.js";import{a as i}from"./compat-uEPf6-XW.js";import{r as a,s as o}from"./legacy-api-aliases-jKEvBgOL.js";var s=e({config:()=>d,detectRuntime:()=>T,discoverModels:()=>w,originOf:()=>S,register:()=>y,verifyConnection:()=>O});const c=t(`local-llm`),l=`local-llm`,u=`${l}-unconfigured`,d={id:l,name:`Local LLM (OpenAI-compatible)`,description:[`Connect to any OpenAI-compatible local model server.`,``,`Common base URLs:`,` • Ollama http://localhost:11434/v1`,` • LM Studio http://localhost:1234/v1`,` • llama.cpp http://localhost:8080/v1`,` • vLLM http://localhost:8000/v1`,` • mlx_lm http://localhost:8080/v1`,` • Jan http://localhost:1337/v1`,``,`Ollama needs OLLAMA_ORIGINS=* (or chrome-extension://*) so the`,`browser can reach it. macOS: launchctl setenv OLLAMA_ORIGINS "*".`].join(`
|
|
2
2
|
`),requiresApiKey:!1,optionalApiKey:!0,apiKeyPlaceholder:`Leave empty for local servers, or paste a key for hosted endpoints`,apiKeyEnvVar:`LOCAL_LLM_API_KEY`,requiresBaseUrl:!0,baseUrlPlaceholder:`http://localhost:11434/v1`,baseUrlDescription:`Ollama: 11434 • LM Studio: 1234 • llama.cpp/mlx: 8080 • vLLM: 8000 • Jan: 1337. Trailing /v1 required.`,requiresDeployment:!0,deploymentPlaceholder:`llama3.1:8b, qwen2.5-coder:14b`,deploymentDescription:`Comma-separated model IDs from your server. List them with: curl <baseUrl>/models | jq -r .data[].id`,getModelIds:()=>{let e=f(n(l));return e.length===0?[{id:u,name:`Local LLM (set base URL + model IDs in Settings)`,api:`openai`}]:e.map(e=>({id:e,name:e,api:`openai`,input:[`text`],context_window:32e3,max_tokens:4096}))}};function f(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):[]}const p=`${l}-openai`;function m(e){return{...e,api:`openai-completions`}}function h(e){let t=e??{};return!t.apiKey||t.apiKey.length===0?{...t,apiKey:`local`}:t}const g=(e,t,n={})=>e.id===u?v(e,`Local LLM is not configured. Set base URL and model IDs in Settings.`):e.baseUrl?a(m(e),t,h(n)):v(e,`Local LLM base URL is required (e.g. http://localhost:11434/v1).`),_=(e,t,n)=>e.id===u?v(e,`Local LLM is not configured. Set base URL and model IDs in Settings.`):e.baseUrl?o(m(e),t,h(n)):v(e,`Local LLM base URL is required (e.g. http://localhost:11434/v1).`);function v(e,t){let n=r(),i={role:`assistant`,content:[],api:e.api,provider:e.provider,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t,timestamp:Date.now()};return queueMicrotask(()=>{n.push({type:`error`,reason:`error`,error:i}),n.end()}),n}function y(){i({api:p,stream:g,streamSimple:_})}function b(e){return typeof e==`object`&&!!e&&`object`in e&&e.object===`list`}function x(e){return typeof e==`object`&&!!e&&`build_info`in e}function S(e){try{let t=new URL(e);return`${t.protocol}//${t.host}`}catch{return e.replace(/\/v1\/?$/,``).replace(/\/+$/,``)}}function C(e){let t=e.replace(/\/+$/,``);try{let e=new URL(t);if(e.pathname===``||e.pathname===`/`)return`${t}/v1`}catch{}return t}async function w(e,t,n){let r=`${C(e)}/models`,i={Accept:`application/json`};t&&t.length>0&&(i.Authorization=`Bearer ${t}`);let a=await fetch(r,{method:`GET`,headers:i,signal:n});if(!a.ok)throw Error(`GET ${r} -> ${a.status} ${a.statusText}`);let o=await a.json();return Array.isArray(o.data)?o.data.map(e=>e.id??``).filter(e=>e.length>0):[]}async function T(e,t){let n=S(e),r=await D(`${n}/api/version`,t);if(r&&typeof r.version==`string`)return{kind:`ollama`,version:r.version};if(b(await D(`${n}/api/v0/models`,t)))return{kind:`lmstudio`};let i=await D(`${n}/props`,t);if(x(i))return{kind:`llamacpp`,version:i.build_info?.version};let a=E(e);return a===`11434`?{kind:`ollama`}:a===`1234`?{kind:`lmstudio`}:a===`8000`?{kind:`vllm`}:a===`1337`?{kind:`jan`}:{kind:`unknown`}}function E(e){try{return new URL(e).port||null}catch{return null}}async function D(e,t){try{let n=await fetch(e,{method:`GET`,signal:t});return n.ok?await n.json():null}catch{return null}}async function O(e,t,n){let r={kind:`unknown`};try{r=await T(e,n)}catch{}try{let i=await w(e,t,n);return{ok:!0,runtime:r,models:i}}catch(t){let n=t instanceof Error?t.message:String(t),i=k(n,r.kind);return c.warn(`verifyConnection failed`,{baseUrl:e,runtime:r.kind,message:n}),{ok:!1,runtime:r,models:[],error:i}}}function k(e,t){let n=e.toLowerCase();return n.includes(`failed to fetch`)||n.includes(`networkerror`)?t===`ollama`?{kind:`cors`,message:e,hint:'Ollama rejects requests from non-localhost origins by default. Set OLLAMA_ORIGINS=* (or chrome-extension://*) and restart Ollama. macOS: `launchctl setenv OLLAMA_ORIGINS "*"` then quit and relaunch the Ollama app.'}:{kind:`connection`,message:e,hint:`Server unreachable. Check the URL and that the server is running.`}:n.includes(` 401`)||n.includes(` 403`)?{kind:`auth`,message:e,hint:`Server returned an auth error. If your endpoint requires a key, set it in Settings.`}:/-> \d{3} /.test(e)?{kind:`http`,message:e}:{kind:`unknown`,message:e}}export{s as n,d as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./diagnostics-DN_idNHx.js";import{a as t}from"./compat-qQM4gjF_.js";import{r as n,s as r}from"./legacy-api-aliases-DtQJ5I7w.js";import{t as i}from"./logger-DDBAeTLF.js";import{S as a}from"./account-store-
|
|
1
|
+
import{a as e}from"./diagnostics-DN_idNHx.js";import{a as t}from"./compat-qQM4gjF_.js";import{r as n,s as r}from"./legacy-api-aliases-DtQJ5I7w.js";import{t as i}from"./logger-DDBAeTLF.js";import{S as a}from"./account-store-Bbb4tBjB.js";var o=i(`local-llm`),s=`local-llm`,c=`local`,l=`${s}-unconfigured`,u={id:s,name:`Local LLM (OpenAI-compatible)`,description:[`Connect to any OpenAI-compatible local model server.`,``,`Common base URLs:`,` • Ollama http://localhost:11434/v1`,` • LM Studio http://localhost:1234/v1`,` • llama.cpp http://localhost:8080/v1`,` • vLLM http://localhost:8000/v1`,` • mlx_lm http://localhost:8080/v1`,` • Jan http://localhost:1337/v1`,``,`Ollama needs OLLAMA_ORIGINS=* (or chrome-extension://*) so the`,`browser can reach it. macOS: launchctl setenv OLLAMA_ORIGINS "*".`].join(`
|
|
2
2
|
`),requiresApiKey:!1,optionalApiKey:!0,apiKeyPlaceholder:`Leave empty for local servers, or paste a key for hosted endpoints`,apiKeyEnvVar:`LOCAL_LLM_API_KEY`,requiresBaseUrl:!0,baseUrlPlaceholder:`http://localhost:11434/v1`,baseUrlDescription:`Ollama: 11434 • LM Studio: 1234 • llama.cpp/mlx: 8080 • vLLM: 8000 • Jan: 1337. Trailing /v1 required.`,requiresDeployment:!0,deploymentPlaceholder:`llama3.1:8b, qwen2.5-coder:14b`,deploymentDescription:`Comma-separated model IDs from your server. List them with: curl <baseUrl>/models | jq -r .data[].id`,getModelIds:()=>{let e=d(a(s));return e.length===0?[{id:l,name:`Local LLM (set base URL + model IDs in Settings)`,api:`openai`}]:e.map(e=>({id:e,name:e,api:`openai`,input:[`text`],context_window:32e3,max_tokens:4096}))}};function d(e){return e?e.split(`,`).map(e=>e.trim()).filter(Boolean):[]}var f=`openai-completions`,p=`${s}-openai`;function m(e){return{...e,api:f}}function h(e){let t=e??{};return!t.apiKey||t.apiKey.length===0?{...t,apiKey:c}:t}var g=(e,t,r={})=>e.id===l?v(e,`Local LLM is not configured. Set base URL and model IDs in Settings.`):e.baseUrl?n(m(e),t,h(r)):v(e,`Local LLM base URL is required (e.g. http://localhost:11434/v1).`),_=(e,t,n)=>e.id===l?v(e,`Local LLM is not configured. Set base URL and model IDs in Settings.`):e.baseUrl?r(m(e),t,h(n)):v(e,`Local LLM base URL is required (e.g. http://localhost:11434/v1).`);function v(t,n){let r=e(),i={role:`assistant`,content:[],api:t.api,provider:t.provider,model:t.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:n,timestamp:Date.now()};return queueMicrotask(()=>{r.push({type:`error`,reason:`error`,error:i}),r.end()}),r}function y(){t({api:p,stream:g,streamSimple:_})}function b(e){return typeof e==`object`&&!!e&&`object`in e&&e.object===`list`}function x(e){return typeof e==`object`&&!!e&&`build_info`in e}function S(e){try{let t=new URL(e);return`${t.protocol}//${t.host}`}catch{return e.replace(/\/v1\/?$/,``).replace(/\/+$/,``)}}function C(e){let t=e.replace(/\/+$/,``);try{let e=new URL(t);if(e.pathname===``||e.pathname===`/`)return`${t}/v1`}catch{}return t}async function w(e,t,n){let r=`${C(e)}/models`,i={Accept:`application/json`};t&&t.length>0&&(i.Authorization=`Bearer ${t}`);let a=await fetch(r,{method:`GET`,headers:i,signal:n});if(!a.ok)throw Error(`GET ${r} -> ${a.status} ${a.statusText}`);let o=await a.json();return Array.isArray(o.data)?o.data.map(e=>e.id??``).filter(e=>e.length>0):[]}async function T(e,t){let n=S(e),r=await D(`${n}/api/version`,t);if(r&&typeof r.version==`string`)return{kind:`ollama`,version:r.version};if(b(await D(`${n}/api/v0/models`,t)))return{kind:`lmstudio`};let i=await D(`${n}/props`,t);if(x(i))return{kind:`llamacpp`,version:i.build_info?.version};let a=E(e);return a===`11434`?{kind:`ollama`}:a===`1234`?{kind:`lmstudio`}:a===`8000`?{kind:`vllm`}:a===`1337`?{kind:`jan`}:{kind:`unknown`}}function E(e){try{return new URL(e).port||null}catch{return null}}async function D(e,t){try{let n=await fetch(e,{method:`GET`,signal:t});return n.ok?await n.json():null}catch{return null}}async function O(e,t,n){let r={kind:`unknown`};try{r=await T(e,n)}catch{}try{let i=await w(e,t,n);return{ok:!0,runtime:r,models:i}}catch(t){let n=t instanceof Error?t.message:String(t),i=k(n,r.kind);return o.warn(`verifyConnection failed`,{baseUrl:e,runtime:r.kind,message:n}),{ok:!1,runtime:r,models:[],error:i}}}function k(e,t){let n=e.toLowerCase();return n.includes(`failed to fetch`)||n.includes(`networkerror`)?t===`ollama`?{kind:`cors`,message:e,hint:'Ollama rejects requests from non-localhost origins by default. Set OLLAMA_ORIGINS=* (or chrome-extension://*) and restart Ollama. macOS: `launchctl setenv OLLAMA_ORIGINS "*"` then quit and relaunch the Ollama app.'}:{kind:`connection`,message:e,hint:`Server unreachable. Check the URL and that the server is running.`}:n.includes(` 401`)||n.includes(` 403`)?{kind:`auth`,message:e,hint:`Server returned an auth error. If your endpoint requires a key, set it in Settings.`}:/-> \d{3} /.test(e)?{kind:`http`,message:e}:{kind:`unknown`,message:e}}export{u as config,T as detectRuntime,w as discoverModels,S as originOf,y as register,O as verifyConnection};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sudo-BLsv33L7.js","assets/preload-helper-Czpn1I53.js","assets/logger-DDBAeTLF.js","assets/quick-llm-DcsNLbYv.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/compat-qQM4gjF_.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-B-zmcypy.js","assets/account-store-Bbb4tBjB.js","assets/core-zz8rWM4c.js","assets/libesm-BypnjKEL.js","assets/proxied-fetch-W1rZTqEQ.js","assets/base64-ELzoYfwP.js","assets/fetch-body-1l9I58Vk.js","assets/api-endpoint-DuEQRZ4g.js","assets/runtime-env-Dlaokqg1.js","assets/secret-topology-fyLSbV8r.js","assets/float-topology-U8FF9pgZ.js","assets/secrets-bridge-client-9RRVsrGm.js","assets/port-bridge-client-BYQawsDH.js","assets/image-markers-q8JQTtid.js","assets/tool-ui-eSQ1g2I1.js","assets/providers-2pihfuXe.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-BeCSBUrZ.js","assets/bedrock-camp-extra-models-WTCIjj5a.js","assets/claude-model-version-DZmbk9E2.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-jrIi5FYk.js","assets/approval-decision-CS9Wwm5B.js","assets/capability-BpyI5pqv.js","assets/page-approval-service-CDc9BXzz.js","assets/extension-bridge-transport-B-i9vQpb.js","assets/pending-request-table-k-D7ZZsL.js","assets/lick-ws-bridge-QLNp37XL.js","assets/tray-leader-DyfRH9_x.js","assets/logger-BoSvu4mW.js","assets/cdp-Ck5NGIgv.js","assets/navigation-watcher-CPcnZL9l.js","assets/bridge-protocol-C52CnDIj.js","assets/wc-follower-oauth-D9PaxsNc.js","assets/wc-shell-Cn2tEDM7.js","assets/mime-types-D0xZwlMO.js","assets/telemetry-CKoAhRMv.js","assets/types-D8gIX-W-.js","assets/same-file-identity-DuEcSmPX.js","assets/wc-shell-WkeczD9x.css","assets/sprinkle-renderer-C0-nYSNx.js","assets/hid-device-registry-B2R-0rNt.js","assets/serial-port-registry-CCqklAEr.js","assets/hid-operations-C97SZtrY.js","assets/usb-device-registry--JwKRTYp.js","assets/usb-operations-v1mGAdRY.js","assets/shared-mBEktoxE.js","assets/theme-CwPIBqJE.js","assets/theme-engine-ZV7CeqWw.js","assets/slicc-app-url-BKHBBuTR.js","assets/transcript-export-DP-r8eDz.js","assets/tray-follower-status-BAjnN7Ar.js","assets/record-CCQFJXn_.js","assets/export-spool-CuNzzI8a.js","assets/src-BWaKqLvQ.js","assets/main-cherry-Cs8W2ySf.js","assets/synthetic-cdp-transport-OUVdC4zy.js","assets/oauth-service-C2D9b8uV.js","assets/permissions-surface-registry-CilCRwhh.js","assets/wc-follower-CmPddVGO.js","assets/wc-live-Dq-_FAPU.js","assets/slugify-BYJ6QVAt.js","assets/session-jsonl-DRpBHMbZ.js","assets/provider-budget-LCzMPlKv.js","assets/browser-DGwroBSO.js","assets/descriptor-DzbI9z_9.js","assets/types-CFfBWsH5.js","assets/wc-unit-context-CS4hSDi7.js","assets/wc-sprinkles-Bme5XF35.js","assets/wc-attach-BYh78RZQ.js","assets/wc-permissions-BWZQsa4a.js","assets/oauth-bootstrap-CZzvOYOg.js","assets/legacy-styles-B3nS5QUo.js","assets/connect-surface-DVI8l1Gj.js","assets/wc-extension-B3EwzUfS.js","assets/wc-detached-BwCNIFnT.js","assets/recovery-screen-xvnzvjnh.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import"./modulepreload-polyfill-P2Xu9kJm.js";import"./core-zz8rWM4c.js";import{t}from"./preload-helper-Czpn1I53.js";import{t as n}from"./logger-DDBAeTLF.js";import{a as r,i,n as a,o,r as s,t as c}from"./bridge-protocol-C52CnDIj.js";import"./proxied-fetch-W1rZTqEQ.js";import{A as l,B as u,C as d,D as f,E as p,F as m,G as h,H as g,I as _,J as v,K as y,L as b,M as x,N as S,O as C,P as ee,R as te,S as ne,T as w,U as re,V as ie,W as ae,X as oe,Y as se,Z as ce,_ as le,a as ue,b as de,c as fe,d as pe,f as T,g as me,h as he,i as ge,j as _e,k as ve,l as ye,m as be,n as xe,o as Se,p as Ce,q as we,s as Te,t as Ee,u as De,v as Oe,w as ke,x as Ae,y as je,z as Me}from"./account-store-Bbb4tBjB.js";import{n as Ne,t as Pe}from"./runtime-env-Dlaokqg1.js";import{c as Fe,d as Ie,l as Le,n as Re,o as ze,s as Be,t as Ve,u as He}from"./api-endpoint-DuEQRZ4g.js";import{o as Ue,t as We}from"./telemetry-CKoAhRMv.js";import{a as Ge}from"./providers-2pihfuXe.js";import{t as Ke}from"./tray-follower-status-BAjnN7Ar.js";import{n as qe}from"./clipboard-eqmn97SP.js";var Je=`role`;function Ye(e){return typeof e==`object`&&!!e&&`source`in e&&`payload`in e&&typeof e.source==`string`}function Xe(e){if(!e)return!1;let t=e.startsWith(`[`)&&e.endsWith(`]`)?e.slice(1,-1):e;return!!(t===`localhost`||t===`::1`||/^127(\.\d{1,3}){3}$/.test(t))}var E=`tray`,Ze=`trayWorkerUrl`,Qe=`lead`;function D(e){if(!e)return null;try{let t=new URL(e.trim());t.search=``,t.hash=``,t.pathname!==`/`&&(t.pathname=t.pathname.replace(/\/+$/,``)||`/`);let n=t.toString();return n.endsWith(`/`)?n.slice(0,-1):n}catch{return null}}function $e(e){if(!e)return null;try{let t=new URL(e.trim());t.search=``,t.hash=``;let n=t.toString(),r=t.pathname.split(`/`).filter(Boolean);if(r.length<2||r.at(-2)!==`join`)return null;let[i,a,...o]=decodeURIComponent(r.at(-1)).split(`.`);if(!i||!a||o.length>0)return null;r.splice(-2,2),t.pathname=r.length>0?`/${r.join(`/`)}`:`/`;let s=D(t.toString());return s?{workerBaseUrl:s,trayId:i,joinUrl:n}:null}catch{return null}}function et(e,t){let n=new URL(e);return n.searchParams.delete(Ze),n.searchParams.delete(Qe),n.searchParams.set(E,t),n.toString()}function tt(e){try{let t=new URL(e);return`${t.protocol===`wss:`?`https:`:`http:`}//${t.host}`}catch{return null}}function nt(e){try{let t=new URL(e);return`${t.protocol}//${t.host}/licks-ws`}catch{return null}}function rt(e){let t;try{t=new URLSearchParams(e)}catch{return null}let n=t.get(i),r=t.get(s);if(!n||!r||!/^wss?:\/\//.test(n))return null;let a;try{a=new URL(n).hostname}catch{return null}if(!Xe(a))return null;let o=t.get(Je),l=o===`leader`||o===`follower`?o:null;return{url:n,subprotocol:`${c}${r}`,token:r,apiBaseUrl:tt(n),lickWsUrl:nt(n),role:l}}var it=`slicc:bridge-config`,at=`slicc:extension-delegate-config`;function ot(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`slicc:ext-fetch`&&typeof t.extensionId==`string`&&!!t.request&&typeof t.request==`object`}var st=n(`boot/ext-fetch-delegate`);function ct(){let e=globalThis.chrome?.runtime;return e&&typeof e.connect==`function`?e:null}function lt(e,t,n){let r=ct();if(!r){try{t.postMessage({type:`response-error`,error:`extension-delegate: chrome.runtime.connect unavailable`})}catch{}t.close();return}let i=e.extensionId||n,a;try{a=r.connect(i,{name:`fetch-proxy.fetch`})}catch(e){try{t.postMessage({type:`response-error`,error:`extension-delegate: connect failed — ${e instanceof Error?e.message:String(e)}`})}catch{}t.close();return}let o=!1,s=()=>{o=!0;try{a.disconnect()}catch{}try{t.close()}catch{}};a.onMessage.addListener(e=>{if(o)return;let n=e;try{t.postMessage(n)}catch{}(n.type===`response-end`||n.type===`response-error`)&&s()}),a.onDisconnect.addListener(()=>{if(!o){try{t.postMessage({type:`response-error`,error:`extension-delegate: fetch-proxy port disconnected`})}catch{}s()}}),a.postMessage({type:`request`,...e.request})}function ut(e){typeof navigator>`u`||!navigator.serviceWorker||navigator.serviceWorker.addEventListener(`message`,t=>{if(!ot(t.data))return;let n=t.ports?.[0];if(!n){st.warn(`delegated fetch envelope arrived without a response port`);return}lt(t.data,n,e)})}var dt=`slicc_feature_flags`,O=Object.freeze([Object.freeze({id:`experimental-settings`,label:`Experimental settings`,description:`Show controls for experimental features.`,defaultValue:`on`,floatDefaults:Object.freeze({cherry:`off`}),userToggleable:!1,since:`2026-07-31`}),Object.freeze({id:`panel-layouts`,label:`Panel layouts`,description:`Arrange the UI as movable, resizable panels instead of the fixed workbench.`,defaultValue:`off`,userToggleable:!0,since:`2026-08-03`}),Object.freeze({id:`agentic-memory`,label:`Agentic memory`,description:`Curate session memory with a background agent instead of a one-shot extraction call.`,defaultValue:`off`,userToggleable:!0,since:`2026-08-05`}),Object.freeze({id:`multiple-cones`,label:`Multiple cones`,description:`Add, switch between and remove cones from the freezer rail. Extra cones share the workspace.`,defaultValue:`on`,floatDefaults:Object.freeze({cherry:`off`}),userToggleable:!1,since:`2026-08-21`}),Object.freeze({id:`compact-on-idle`,label:`Compact on idle`,description:`When a cone has been idle for a while with a large context, summarize its history in the background. The full transcript is kept in /sessions.`,defaultValue:`on`,userToggleable:!1,since:`2026-09-02`}),Object.freeze({id:`memory-v2`,label:`Memory v2`,description:`Searchable session history, scoop pre-compaction snapshots, and the gelatiere — a resident advisor that reviews your sessions and suggests skills and use cases.`,defaultValue:`off`,userToggleable:!0,since:`2026-09-10`})]),ft=new Map(O.map(e=>[e.id,e])),pt=new Set([`1`,`on`,`true`]),k=`standalone`,mt={},A={};function ht(){return O}function gt(e,t={},n=j()){let r={};for(let i of O){let a=n[i.id];if(typeof a==`string`&&M(i,e)){r[i.id]=a;continue}let o=A[i.id];if(typeof o==`string`&&M(i,e)){r[i.id]=o;continue}let s=t[i.id];r[i.id]=typeof s==`string`?s:Et(i,e)}return r}function j(){try{let e=Dt()?.getItem(dt);return e?N(JSON.parse(e)):{}}catch{return{}}}function _t(e){try{Dt()?.setItem(dt,JSON.stringify(N(e)))}catch{}}function vt(e){let t=ft.get(e);return t!==void 0&&M(t,k)}function yt(e,t){let n=ft.get(e);if(!n||!M(n,k))return;let r=j();typeof t==`string`?r[e]=t:delete r[e],_t(r)}function bt(e,t={}){k=e,mt=N(t),A={}}function xt(e,t){k=e,mt=N(t)}function St(e){let t={};for(let[n,r]of Object.entries(e)){let e=ft.get(n);!e||typeof r!=`string`||!M(e,k)||(t[e.id]=r)}return A={...A,...t},t}function Ct(e){return gt(k,mt)[e]}function wt(e){return typeof e==`string`&&pt.has(e.trim().toLowerCase())}function Tt(e){return wt(Ct(e))}function Et(e,t){return e.floatDefaults?.[t]??e.defaultValue}function M(e,t){return e.userToggleable&&(e.overridableFloats===void 0||e.overridableFloats.includes(t))}function N(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t=e,n={};for(let e of O){let r=t[e.id];typeof r==`string`&&(n[e.id]=r)}return n}function Dt(){try{let e=globalThis.localStorage;return typeof e?.getItem!=`function`||typeof e.setItem!=`function`?void 0:e}catch{return}}var Ot=`slicc_feature_flags_remote`;function kt(e){return`${Ot}:${e}`}function At(e,t){bt(e,Nt(Mt(t),e)??{})}function jt(e,t,n){try{e?.setItem(kt(t),JSON.stringify(n))}catch{}}function Mt(e){if(e!==void 0)return e;try{let e=globalThis.localStorage;return typeof e?.getItem!=`function`||typeof e.setItem!=`function`?void 0:e}catch{return}}function Nt(e,t){try{let n=e?.getItem(kt(t));return n?Pt(JSON.parse(n)):null}catch{return null}}function Pt(e){return!Ft(e)||Object.values(e).some(e=>typeof e!=`string`)?null:e}function Ft(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function It(e){return Ye(e)}var P=`slicc.trayWorkerBaseUrl`,F=`slicc.trayJoinUrl`;function I(e){if(!e)return null;try{let t=new URL(e.trim());t.search=``,t.hash=``;let n=t.pathname.split(`/`).filter(Boolean),r=null;if(n.length>=2&&n.at(-2)===`tray`)r=decodeURIComponent(n.at(-1)),n.splice(-2,2),t.pathname=n.length>0?`/${n.join(`/`)}`:`/`;else if(n.length>=2&&n.at(-2)===`join`)return $e(t.toString());let i=D(t.toString());return i?{workerBaseUrl:i,trayId:r,joinUrl:null}:null}catch{return null}}function L(e){let t=I(e);return t?.joinUrl?t:null}var Lt=r,Rt=o;function zt(e,t){let n=D(e);if(!n)throw Error(`Invalid tray worker base URL: ${e}`);let r=t.replace(/^\/+/,``);return new URL(r,`${n}/`).toString()}function Bt(e,t){let n=L(t);return n?(e.setItem(F,n.joinUrl),e.setItem(P,n.workerBaseUrl),n):null}function Vt(e){return!!L(e?.getItem(`slicc.trayJoinUrl`)??null)}function Ht(e,t){let n=!1;try{let t=new URL(e),r=t.searchParams.get(E);if(r!==null){n=!0;let e=I(r);if(e?.joinUrl)return e.joinUrl}t.searchParams.get(`slicc`)===`leader`&&(n=!0)}catch{}let r=I(e);return r?.joinUrl?r.joinUrl:(r?.trayId&&(n=!0),n?null:L(t?.getItem(`slicc.trayJoinUrl`)??null)?.joinUrl??null)}function Ut(e){try{let t=new URL(e);t.searchParams.delete(E);let n=t.pathname.split(`/`).filter(Boolean);return n.length>=2&&n.at(-2)===`join`&&(n.splice(-2,2),t.pathname=n.length>0?`/${n.join(`/`)}`:`/`),t.toString()}catch{return e}}function Wt(e,t){let n=D(e);if(!n)throw Error(`Invalid tray worker base URL: ${e}`);let r=t?.trim();return r?new URL(`tray/${encodeURIComponent(r)}`,`${n}/`).toString():n}function Gt(e,t,n){return et(e,Wt(t,n))}async function Kt(e){let t=Yt(e.locationHref);if(t)return e.storage&&(t.joinUrl&&e.storage.setItem(F,t.joinUrl),e.storage.setItem(P,t.workerBaseUrl)),t;let n=L(e.storage?.getItem(`slicc.trayJoinUrl`)??null);if(n)return e.storage&&e.storage.setItem(P,n.workerBaseUrl),n;let r=e.runtimeConfigFetcher?await Xt(e.runtimeConfigFetcher):null;if(r?.joinConfig)return e.storage&&(e.storage.setItem(F,r.joinConfig.joinUrl),e.storage.setItem(P,r.joinConfig.workerBaseUrl)),r.joinConfig;let i=r?.workerBaseUrl??null,a=D(e.storage?.getItem(`slicc.trayWorkerBaseUrl`)??null),o=D(e.envBaseUrl??null),s=D(e.defaultWorkerBaseUrl??null),c=i??a??o??s;return c?(e.storage&&e.storage.setItem(P,c),{workerBaseUrl:c,trayId:null,joinUrl:null}):null}async function qt(e){return(await Kt(e))?.workerBaseUrl??null}async function Jt(e=fetch){try{let t=await e(Be(`/api/runtime-config`),{cache:`no-store`,headers:Ve()});return await Ie(t),t.ok?await t.json():null}catch(e){if(ze(e))throw e;return null}}function Yt(e){try{let t=new URL(e),n=I(t.searchParams.get(E));if(n)return n;let r=I(t.searchParams.get(Qe));if(r)return r;let i=D(t.searchParams.get(Ze));return i?{workerBaseUrl:i,trayId:null,joinUrl:null}:$e(e)||null}catch{return null}}async function Xt(e){let t=await e();if(!t)return null;let n=L(t.trayJoinUrl??null);return{workerBaseUrl:D(t.trayWorkerBaseUrl??null),joinConfig:n}}function Zt(e,t,n){if(t){try{if(new URL(e).searchParams.has(`detached`))return`extension-detached`}catch{}return`extension`}try{let t=new URL(e);return t.searchParams.get(`connect`)===`1`?`connect`:t.searchParams.get(`runtime`)===`hosted-leader`?`hosted-leader`:t.searchParams.get(`cherry`)===`1`?`cherry`:Ht(e,n===void 0?typeof window<`u`?window.localStorage:null:n)?`follower`:$t(t)?`electron-overlay`:`standalone`}catch{return`standalone`}}function Qt(e,t){return e===`electron-overlay`||e===`hosted-leader`||e===`standalone`&&t}function $t(e){return e.pathname===`/electron`||e.pathname===`/electron/`||e.searchParams.get(`runtime`)===`electron-overlay`}function en(e,n){At(e,n.storage),t(async()=>{let{refreshFeatureFlagsForPage:e,scheduleFeatureFlagsRefresh:t}=await import(`./setup-feature-flags-remote-DLPlEBtl.js`);return{refreshFeatureFlagsForPage:e,scheduleFeatureFlagsRefresh:t}},[]).then(({refreshFeatureFlagsForPage:t,scheduleFeatureFlagsRefresh:r})=>(r(e,n),t(e,n))).catch(()=>{})}function tn(e){let t=Zt(e.locationHref,e.isExtension,e.storage);return en(t,e),t}function nn(){if(Ne())return;let e=new Blob([`
|
|
3
|
+
let lastPong = Date.now();
|
|
4
|
+
let frozen = false;
|
|
5
|
+
setInterval(() => {
|
|
6
|
+
postMessage({ type: 'ping' });
|
|
7
|
+
const elapsed = Date.now() - lastPong;
|
|
8
|
+
if (elapsed > 5000 && !frozen) {
|
|
9
|
+
frozen = true;
|
|
10
|
+
postMessage({ type: 'freeze-detected', elapsed });
|
|
11
|
+
}
|
|
12
|
+
}, 2000);
|
|
13
|
+
self.onmessage = (e) => {
|
|
14
|
+
if (e.data.type === 'pong') {
|
|
15
|
+
lastPong = Date.now();
|
|
16
|
+
if (frozen) {
|
|
17
|
+
frozen = false;
|
|
18
|
+
postMessage({ type: 'freeze-recovered' });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
`],{type:`application/javascript`}),t=URL.createObjectURL(e),n=new Worker(t);URL.revokeObjectURL(t),n.onmessage=e=>{if(e.data.type===`ping`)n.postMessage({type:`pong`});else if(e.data.type===`freeze-detected`)console.error(`[freeze-watchdog] Main thread blocked for ${e.data.elapsed}ms — capturing trace on recovery`);else if(e.data.type===`freeze-recovered`){console.error(`[freeze-watchdog] Main thread recovered. Stack trace at recovery point:`),console.trace(`[freeze-watchdog] recovery stack`);let e=performance.getEntriesByType(`longtask`);e.length>0&&console.error(`[freeze-watchdog] Long tasks:`,e.map(e=>({duration:e.duration,startTime:e.startTime,name:e.name})))}},window.addEventListener(`beforeunload`,()=>{n.terminate()},{once:!0})}var rn=`slicc-nuke-control`,an=[`slicc:welcome-flow-fired`,`slicc.trayJoinUrl`,`slicc.trayWorkerBaseUrl`];function on(e=()=>location.reload()){if(typeof BroadcastChannel!=`function`)return()=>{};let t=new BroadcastChannel(rn),n=t=>{let n=t.data;if(n?.type===`nuke-reload`){if(Array.isArray(n.keysToRemove)){for(let e of n.keysToRemove)if(typeof e==`string`)try{localStorage.removeItem(e)}catch{}}e()}};return t.addEventListener(`message`,n),()=>{t.removeEventListener(`message`,n),t.close()}}var sn=null;function cn(){return sn||(sn=on(),sn)}n(`stale-asset`);var ln=`slicc-stale-asset-reload`;function un(e,t){if(typeof BroadcastChannel!=`function`)return()=>{};let n=new BroadcastChannel(ln),r=n=>{let r=n.data;r?.type===`stale-asset-reload`&&r.instanceId===e&&t(r.replayTurn===!0)};return n.addEventListener(`message`,r),()=>{n.removeEventListener(`message`,r),n.close()}}var dn=`slicc:stale-asset-reloaded-at`,fn=6e4,R=`slicc:stale-asset-replay`;function pn(e=window.sessionStorage){try{e.setItem(R,`1`)}catch{}}function mn(e=window.sessionStorage){try{return e.getItem(R)===`1`&&(e.removeItem(R),!0)}catch{return!1}}function hn(){return{reload:()=>window.location.reload(),storage:window.sessionStorage,now:()=>Date.now(),windowMs:fn,storageKey:dn}}function gn(e,t,n){return e===null||t-e>=n}function z(e=hn()){let t;try{t=e.storage.getItem(e.storageKey)}catch{return!1}let n=t===null?null:Number(t),r=n!==null&&Number.isFinite(n)?n:null,i=e.now();if(!gn(r,i,e.windowMs))return!1;try{e.storage.setItem(e.storageKey,String(i))}catch{return!1}return e.reload(),!0}var B=null,V=null;function _n(e){B||(V={...hn(),...e},B=e=>{z(V)&&e.preventDefault()},window.addEventListener(`vite:preloadError`,B))}var H=null;function vn(e){return H||(H=un(e,e=>{e&&pn(),z(V??void 0)}),H)}var yn=3e4,bn=.2,xn=`CDP bridge rejected the session token (bridge-token-required). Open SLICC again from Sliccstart to pick up a fresh token.`,Sn=class extends Error{constructor(e=xn){super(e),this.name=`CdpBridgeRejectedError`}},Cn=class extends Error{constructor(){super(`CDP reconnect is backing off`),this.name=`CdpReconnectBackoffError`}};function wn(e,t=Math.random){let n=Math.min(yn,250*2**Math.min(Math.max(0,e),16)),r=Math.round(n*bn*t());return Math.min(yn,n+r)}function Tn(e){try{let t=new URL(e);return t.protocol!==`ws:`&&t.protocol!==`wss:`?null:`${t.protocol===`wss:`?`https:`:`http:`}//${t.host}`}catch{return null}}function En(e){let t=(e===void 0?[]:Array.isArray(e)?e:[e]).find(e=>e.startsWith(c));if(!t)return null;let n=t.slice(c.length);return n.length>0?n:null}async function Dn(e,t=globalThis.fetch){let n=En(e.protocols),r=Tn(e.url);if(!n||!r||typeof t!=`function`)return`transient`;try{let e=await t(`${r}/api/status`,{method:`GET`,headers:{[a]:n},cache:`no-store`,signal:AbortSignal.timeout(1e3)}),i=await e.text();return e.status===403&&i.includes(`bridge-token-required`)?`terminal`:`transient`}catch{return`transient`}}var U=`slicc-cdp-superseded-banner`,On=`slicc-cdp-bridge-rejected-banner`,kn=[`position:fixed`,`left:0`,`right:0`,`z-index:2147483647`,`padding:10px 16px`,`background:#b3261e`,`color:#fff`,`font:13px/1.4 system-ui,sans-serif`,`text-align:center`,`box-shadow:0 1px 4px rgba(0,0,0,0.3)`].join(`;`);function An(e){if(e.getElementById(U))return;let t=e.createElement(`div`);t.id=U,t.setAttribute(`role`,`alert`),t.textContent=`Another SLICC tab or window has taken control of this browser instance. Only one tab can drive the browser per instance — close the other tabs, then reload this page to resume.`,t.style.cssText=`top:0;${kn}`,e.body.appendChild(t)}function jn(e){if(e.getElementById(On))return;let t=e.createElement(`div`);t.id=On,t.setAttribute(`role`,`alert`),t.textContent=`The bridge token for this tab was rejected by the local SLICC server. Open SLICC again from Sliccstart so the tab picks up a fresh token.`;let n=e.getElementById(U)?`top:44px;`:`top:0;`;t.style.cssText=`${n}${kn}`,e.body.appendChild(t)}var Mn=e({setupSudoExtension:()=>Pn,setupSudoStandalone:()=>Nn});async function Nn(e){let{createSudoBroker:n,installSudoTestHook:r}=await t(async()=>{let{createSudoBroker:e,installSudoTestHook:t}=await import(`./sudo-BLsv33L7.js`);return{createSudoBroker:e,installSudoTestHook:t}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34])),{createRestCapabilityBroker:i}=await t(async()=>{let{createRestCapabilityBroker:e}=await import(`./capability-BpyI5pqv.js`).then(e=>e.t);return{createRestCapabilityBroker:e}},__vite__mapDeps([33,4,1]));r(n(i()))}async function Pn(e){let{installPanelSudoResponder:n}=await t(async()=>{let{installPanelSudoResponder:e}=await import(`./sudo-BLsv33L7.js`);return{installPanelSudoResponder:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34]));n()}function Fn(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`slicc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function In(e){let t;try{t=new URLSearchParams(e)}catch{return null}if(t.get(`slicc`)!==`leader`)return null;let n=t.get(`ext`);return n?{extensionId:n}:null}var Ln=[100,200,400,800,1600];async function Rn(e,t,n,r=Ln,i=e=>new Promise(t=>setTimeout(t,e))){let a=r.length+1,o=null;for(let s=0;s<a;s++)try{await e.connect(t),s>0&&n.info(`CDP bridge connect succeeded after retry`,{attempt:s+1});return}catch(e){if(o=e,e instanceof Sn){n.error(`CDP bridge rejected the session token; stopped reconnecting`,e.message);return}s<r.length&&await i(r[s]??0)}n.warn(`Initial CDP connect failed after retries; worker-forwarded commands will retry on demand`,o instanceof Error?o.message:String(o))}async function zn(e,n,r){let{ExtensionBridgeTransport:i}=await t(async()=>{let{ExtensionBridgeTransport:e}=await import(`./extension-bridge-transport-B-i9vQpb.js`);return{ExtensionBridgeTransport:e}},__vite__mapDeps([35,2,36])),{mapDiscoveryPayloadToLickEvent:a,mapNavigatePayloadToLickEvent:o}=await t(async()=>{let{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}=await import(`./lick-ws-bridge-QLNp37XL.js`);return{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}},__vite__mapDeps([37,2,38,4,14,1,15,16,17,18,39])),s=null,c=[],l=!1,u=e=>{s=e;for(let t of c)e.sendForwardedLick(t);c.length=0},d=e=>{if(e){if(s){s.sendForwardedLick(e);return}c.length>=50&&(c.shift(),l||(l=!0,r.warn(`extension-bridge lick buffer overflow (cap 50); dropping oldest pending licks until the kernel client attaches`))),c.push(e)}},f=new e(new i({extensionId:n,onLick:e=>{d(o(e))},onDiscovery:e=>{d(a(e))},onOpenSettings:()=>{globalThis.dispatchEvent(new CustomEvent(`slicc:open-settings-from-panel`))}}));return await Rn(f,void 0,r),{browser:f,attachLickForwardingClient:u}}async function Bn(e){let{browser:t,bridge:n,log:r,document:i,sleep:a}=e;t.setCdpConnectFailureClassifier(Dn),t.setCdpBridgeRejectedHandler(()=>jn(i)),n&&r.info(`Routing CDP through local standalone bridge`,{url:n.url,role:n.role??`(unset)`});let o=n?{url:n.url,protocols:n.subprotocol}:void 0;if(n?.role===`follower`){r.info(`Skipping CDP connect for follower overlay tab`),t.primeConnectOptions(o);return}await Rn(t,o,r,void 0,a),t.setCdpSupersededHandler(()=>An(i))}async function Vn(e){let{runtimeMode:n,envBaseUrl:r,window:i,log:a,sleep:o}=e,s=n===`electron-overlay`;a.info(`setting up standalone page runtime (BrowserAPI + CDP)`,{runtimeMode:n});let{BrowserAPI:c}=await t(async()=>{let{BrowserAPI:e}=await import(`./cdp-Ck5NGIgv.js`);return{BrowserAPI:e}},__vite__mapDeps([40,2,41,42,43,4,1,44,45,15,11,12,5,6,7,8,9,10,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,46,47,48,31,49,50,51,52,53,54,55,56,57,58,59,60,61,36,62,63,64]));await Nn({log:a});let l,u,d,f=null,p=null,m=null,h=null,g,_=n===`cherry`?null:In(i.location.search),v=!!_&&Pe(),y=n===`cherry`||v?null:rt(i.location.search);y?.apiBaseUrl&&(f=y.apiBaseUrl,He(y.apiBaseUrl),p=y.token,Fe(y.token)),y?.lickWsUrl&&(m=y.lickWsUrl);let b=n===`cherry`||v||y!==null,x=await Jt(),S=Qt(n,x!==null)?Lt:null;if(await Kt({locationHref:i.location.href,storage:i.localStorage,envBaseUrl:r,defaultWorkerBaseUrl:S,runtimeConfigFetcher:async()=>x}),n===`cherry`){let{setupCherryFollower:e}=await t(async()=>{let{setupCherryFollower:e}=await import(`./main-cherry-Cs8W2ySf.js`);return{setupCherryFollower:e}},__vite__mapDeps([65,2,60,36,40,41,42,43,4,1,44,45,15,11,12,5,6,7,8,9,10,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,46,47,48,31,49,50,51,52,53,54,55,56,57,58,59,61,62,63,64,66])),n=await e();l=n.browser,u=n.joinUrl,d=n.transport}else if(_&&Pe()){a.info(`Routing CDP through the extension bridge (leader tab)`);let e=await zn(c,_.extensionId,a);l=e.browser,g=e.attachLickForwardingClient,h=_.extensionId,Le(_.extensionId)}else l=new c,await Bn({browser:l,bridge:y,log:a,document:i.document,sleep:o});let C=l.getUnderlyingTransport();return globalThis.__slicc_browser=l,{browser:l,realCdpTransport:C,hasLocalCdpSurface:b,cherryJoinUrl:u,cherryTransport:d,instanceId:Fn(),isElectronOverlay:s,localApiBaseUrl:f,bridgeToken:p,localLickWsUrl:m,extensionDelegateId:h,attachLickForwardingClient:g}}var W=n(`storage-persist`);function Hn(){try{return globalThis.navigator?.storage}catch{return}}async function Un(e=Hn()){try{return typeof e?.persist==`function`?typeof e.persisted==`function`&&await e.persisted()?`already-persisted`:await e.persist()?`granted`:`denied`:`unsupported`}catch(e){return W.warn(`storage persistence check failed`,e),`failed`}}var Wn=!1;function Gn(){Wn||(Wn=!0,Un().then(e=>{switch(e){case`granted`:W.info(`OPFS marked persistent — SLICC data is now exempt from disk-pressure eviction`);break;case`already-persisted`:W.debug(`OPFS already persistent`);break;case`denied`:W.warn(`Browser declined persistent storage — SLICC data can be evicted if the disk fills up`);break;case`unsupported`:W.debug(`navigator.storage.persist() unavailable in this runtime`)}}).catch(()=>{}))}var G=n(`boot/sw-registration`);async function Kn(e=null,t=null){let n=(()=>{try{return new URL(window.location.href).searchParams.get(`connect`)===`1`}catch{return!1}})();if(`serviceWorker`in navigator&&n&&await Yn())return`reload-pending`;if(!(`serviceWorker`in navigator)||n)return`ready`;try{if(await navigator.serviceWorker.register(`/preview-sw.js`,{scope:`/preview/`}),G.info(`Preview SW registered`),!Ne())try{await navigator.serviceWorker.register(`/llm-proxy-sw.js`,{scope:`/`}),G.info(`LLM-proxy SW registered`)}catch(e){G.error(`LLM-proxy SW registration failed — cross-origin LLM calls will hit CORS`,e)}if(navigator.serviceWorker.controller||await Promise.race([new Promise(e=>navigator.serviceWorker.addEventListener(`controllerchange`,()=>e(),{once:!0})),new Promise(e=>setTimeout(e,1500))]),!navigator.serviceWorker.controller&&!sessionStorage.getItem(`slicc-sw-reloaded`))return sessionStorage.setItem(`slicc-sw-reloaded`,`1`),G.info(`Reloading once to gain SW control`),location.reload(),`reload-pending`;sessionStorage.removeItem(`slicc-sw-reloaded`),e&&(qn(e),navigator.serviceWorker.addEventListener(`controllerchange`,()=>{qn(e)})),t&&(Jn(t),navigator.serviceWorker.addEventListener(`controllerchange`,()=>{Jn(t)}))}catch(e){G.error(`Preview SW registration failed — preview feature will not work`,e)}return`ready`}function qn(e){let t=navigator.serviceWorker.controller;if(!t)return;let n={type:it,apiBaseUrl:e.apiBaseUrl,token:e.token};try{t.postMessage(n)}catch(e){G.warn(`LLM-proxy SW bridge-config postMessage failed`,e)}}function Jn(e){let t=navigator.serviceWorker.controller;if(!t)return;let n={type:at,extensionId:e.extensionId};try{t.postMessage(n)}catch(e){G.warn(`LLM-proxy SW extension-delegate postMessage failed`,e)}}async function Yn(){try{let e=await navigator.serviceWorker.getRegistrations();if(await Promise.all(e.map(e=>e.unregister().catch(()=>!1))),navigator.serviceWorker.controller&&!sessionStorage.getItem(`slicc-connect-sw-cleared`))return sessionStorage.setItem(`slicc-connect-sw-cleared`,`1`),G.info(`connect mode: detaching from service worker (no proxy on worker origin)`),location.reload(),!0;sessionStorage.removeItem(`slicc-connect-sw-cleared`)}catch(e){G.error(`connect-mode SW cleanup failed`,e)}return!1}function Xn(e,t){if(e.state===`inactive`&&t.state===`inactive`)return{kind:`leader-offer`,label:`Enable multi-browser sync`,caption:`Connect another browser to this session.`};if(e.state===`leader`&&e.session?.joinUrl)return{kind:`leader-copy`,joinUrl:e.session.joinUrl,label:`Enable multi-browser sync`,caption:`Share this URL to connect more browsers.`};if(e.state!==`inactive`){let t=e.state===`connecting`?`Setting up multi-browser sync…`:e.state===`reconnecting`?`Reconnecting…`:`Sync service unreachable.`;return{kind:`leader-pending`,label:`Multi-browser sync`,caption:e.error??t}}return{kind:`follower`,label:`Multi-browser sync`,caption:t.error??t.lastError??Zn(t.state)??`Mirroring another browser.`}}function Zn(e){switch(e){case`connected`:return`Connected — mirroring another browser.`;case`connecting`:return`Connecting to the other browser…`;case`reconnecting`:return`Reconnecting…`;case`disconnected`:return`Disconnected from the other browser.`;default:return null}}function Qn(e){let t=e.trim();if(!t)return`Paste a sync URL to continue.`;let n=null;try{n=new URL(t)}catch{return`That doesn’t look like a URL. Paste the full https://… link from the other browser.`}return n.protocol!==`https:`&&n.protocol!==`http:`?`Sync URLs must start with https://.`:n.pathname.includes(`/join/`)?`That sync URL is malformed. Re-copy it from the other browser and try again.`:`This URL is missing the /join/… capability. Use “Enable multi-browser sync” on the other browser.`}var $n=e({ACCOUNTS_KEY:()=>Ee,__test__:()=>xe,addAccount:()=>ge,applyProviderDefaults:()=>ue,clearAllSettings:()=>Se,clearApiKey:()=>Te,clearBaseUrl:()=>fe,clearSelectedProvider:()=>ye,describeInvalidJoinUrl:()=>Qn,downloadProviders:()=>rr,ensureOAuthMaskReplica:()=>De,exportProviders:()=>pe,getAccounts:()=>T,getAllAvailableModels:()=>Ce,getAllExtraOAuthDomains:()=>be,getAlternativeModelProviders:()=>he,getApiKey:()=>me,getApiKeyForProvider:()=>le,getApiVersionForProvider:()=>Oe,getAvailableProviders:()=>je,getBaseUrl:()=>de,getBaseUrlForProvider:()=>Ae,getDeploymentForProvider:()=>ne,getExtraOAuthDomains:()=>d,getOAuthAccountInfo:()=>ke,getProviderConfig:()=>w,getProviderModels:()=>p,getRawApiKeyForProvider:()=>f,getSelectedModelId:()=>C,getSelectedProvider:()=>ve,isModelHiddenFromPicker:()=>l,isUsableOAuthMaskReplica:()=>_e,logoutOAuthAccount:()=>x,maskOAuthTokenWithRetry:()=>S,migrateLegacyAuthOnlySelection:()=>ee,modelRunsOnProvider:()=>m,persistOAuthMaskViaServiceWorker:()=>_,policyVisible:()=>b,providerOffersLlmModels:()=>te,reloginOAuthAccount:()=>cr,removeAccount:()=>Me,resolveCurrentModel:()=>u,resolveModelById:()=>ie,resolveModelByShorthand:()=>g,resolveModelIdForScoop:()=>re,resolveModelSelectionForScoop:()=>ae,saveOAuthAccount:()=>h,setApiKey:()=>y,setBaseUrl:()=>we,setExtraOAuthDomains:()=>v,setExtraOAuthDomainsAsync:()=>se,setSelectedModelId:()=>oe,setSelectedProvider:()=>ce,showProviderSettings:()=>kr,testOnlyDispatchTrayJoinWithFailureFeedback:()=>tr}),er=n(`provider-settings`);function tr(e,t){return nr(e,t)}function nr(e,t){let n=`tray-join-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,r=!1,i,a=()=>{r||(r=!0,i!==void 0&&clearTimeout(i),window.removeEventListener(`slicc:tray-join-failed`,o))},o=r=>{let i=r.detail;if(i.requestId!==void 0&&i.requestId!==n)return;if(a(),!t.isConnected){er.error(`Tray-join failure arrived after dialog dismissed (UX swallowed half-state)`,{joinUrl:e,error:i.error,requestId:n});return}let o=t.dataset.dismissTimer;if(o){let e=Number(o);Number.isFinite(e)&&clearTimeout(e),delete t.dataset.dismissTimer}t.textContent=`Sync failed: ${i.error}. Reload the page and try again.`,t.style.color=`var(--slicc-cone)`};return window.addEventListener(`slicc:tray-join-failed`,o),i=setTimeout(a,1e4),window.dispatchEvent(new CustomEvent(`slicc:tray-join`,{detail:{joinUrl:e,requestId:n}})),a}function rr(){let e=JSON.stringify(pe(),null,2),t=new Blob([e],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`providers.json`,r.click(),URL.revokeObjectURL(n)}function ir(e){return e.length<=10?`****`:e.slice(0,4)+`...`+e.slice(-4)}function K(e){let t=`http://www.w3.org/2000/svg`,n=document.createElementNS(t,`svg`);n.setAttribute(`width`,`14`),n.setAttribute(`height`,`14`),n.setAttribute(`viewBox`,`0 0 20 20`),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`1.5`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`);for(let r of e){let e=document.createElementNS(t,`path`);e.setAttribute(`d`,r),n.appendChild(e)}return n}var q={pen:[`M14.3 3.3a1.5 1.5 0 0 1 2.1 0l.3.3a1.5 1.5 0 0 1 0 2.1L7.7 14.8l-3.2.7.7-3.2z`],trash:[`M4 6h12`,`M8 6V4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2`,`M6 6v10a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V6`],logout:[`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,`M16 17l5-5-5-5`,`M21 12H9`],login:[`M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4`,`M10 17l5-5-5-5`,`M15 12H3`]},ar=`background: transparent; border: 1px solid var(--s2-border-subtle); color: var(--s2-content-secondary); border-radius: var(--s2-radius-s); padding: 6px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: color 0.15s, border-color 0.15s;`;function J(e,t){e.addEventListener(`mouseenter`,()=>{e.style.color=t,e.style.borderColor=t}),e.addEventListener(`mouseleave`,()=>{e.style.color=`var(--s2-content-secondary)`,e.style.borderColor=`var(--s2-border-subtle)`})}function or(e){e.overlay.remove(),e.resolve((localStorage.getItem(`slicc_accounts`)??``)!==e.accountsBefore)}function Y(e){e.options?.startInAddAccount?or(e):X(e)}function sr(e){let t=document.createElement(`div`);return t.style.cssText=`font-size: 11px; color: var(--s2-content-disabled); font-family: monospace; margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;`,e.loggedOut?(t.textContent=e.userName?`Logged out — was ${e.userName}`:`Logged out`,t.style.color=`var(--s2-content-disabled)`):t.textContent=e.userName?e.userName:e.accessToken?`Logged in`:ir(e.apiKey),e.baseUrl&&(t.textContent+=` • `+e.baseUrl),t}async function cr(e,n){let{createOAuthLauncher:r,createInterceptingOAuthLauncherForCurrentRuntime:i}=await t(async()=>{let{createOAuthLauncher:e,createInterceptingOAuthLauncherForCurrentRuntime:t}=await import(`./oauth-service-C2D9b8uV.js`);return{createOAuthLauncher:e,createInterceptingOAuthLauncherForCurrentRuntime:t}},__vite__mapDeps([67,1,14,4,15,16,17,18,26,68])),a={forceReauth:!0};if(e.onOAuthLoginIntercepted){let t=await i();t&&await e.onOAuthLoginIntercepted(t,n,a)}else if(e.onOAuthLogin){let t=r();await e.onOAuthLogin(t,n,a)}}function lr(e,t){let n=document.createElement(`button`);return n.style.cssText=ar,n.setAttribute(`aria-label`,`Edit account`),n.appendChild(K(q.pen)),J(n,`var(--s2-accent)`),n.addEventListener(`click`,()=>Z(e,t)),n}function ur(e,t,n){let r=document.createElement(`button`);return r.style.cssText=ar,t.loggedOut===!0?(r.setAttribute(`aria-label`,`Log in`),r.setAttribute(`title`,`Log in`),r.appendChild(K(q.login)),J(r,`var(--s2-accent)`),r.addEventListener(`click`,()=>{cr(n,()=>X(e))})):(r.setAttribute(`aria-label`,`Log out`),r.setAttribute(`title`,`Log out`),r.appendChild(K(q.logout)),J(r,`var(--s2-warning, #f59e0b)`),r.addEventListener(`click`,()=>{(async()=>{await x(t.providerId),X(e)})()})),r}function dr(e,t){let n=document.createElement(`button`);return n.style.cssText=ar,n.setAttribute(`aria-label`,`Remove account`),n.appendChild(K(q.trash)),J(n,`var(--s2-negative)`),n.addEventListener(`click`,()=>{(async()=>{await Me(t.providerId),X(e)})()}),n}function fr(e,t){let n=w(t.providerId),r=document.createElement(`div`);r.style.cssText=`display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; background: var(--s2-bg-layer-2); border-radius: var(--s2-radius-default); margin-bottom: 8px; border: 1px solid var(--s2-border-subtle);`;let i=document.createElement(`div`);i.style.cssText=`flex: 1; min-width: 0;`;let a=document.createElement(`div`);a.style.cssText=`font-size: 14px; font-weight: 600; color: var(--s2-content-default);`,a.textContent=n.name,i.appendChild(a),i.appendChild(sr(t)),r.appendChild(i);let o=document.createElement(`div`);return o.style.cssText=`display: flex; gap: 4px; margin-left: 12px; flex-shrink: 0;`,o.appendChild(lr(e,t)),n.isOAuth&&o.appendChild(ur(e,t,n)),o.appendChild(dr(e,t)),r.appendChild(o),r}function pr(e){let t=document.createDocumentFragment(),n=document.createElement(`hr`);n.style.cssText=`border: none; border-top: 1px solid var(--s2-border-subtle); margin: 16px 0;`,t.appendChild(n);let r=document.createElement(`div`);r.className=`dialog__desc`,r.style.cssText=`font-weight: 600; margin-bottom: 8px;`,r.textContent=`Tray`,t.appendChild(r);let i=Ke(),a=i.state!==`inactive`,o=Vt(window.localStorage);if(a||o){let e=document.createElement(`div`);e.style.cssText=`font-size: 12px; color: var(--s2-content-secondary); margin-bottom: 8px;`,e.textContent=`Follower: ${a?i.state:`configured`}`,i.error&&(e.textContent+=` — ${i.error}`,e.style.color=`var(--slicc-cone)`),t.appendChild(e)}let s=document.createElement(`button`);return s.className=`dialog__btn dialog__btn--secondary`,s.textContent=a||o?`Reconnect to other browser`:`Connect to another browser`,s.addEventListener(`click`,()=>Or(e)),t.appendChild(s),t}function X(e){let{dialog:t}=e;t.innerHTML=``;let n=document.createElement(`div`);n.className=`dialog__title`,n.textContent=`Accounts`,t.appendChild(n);let r=T();if(r.length===0){let e=document.createElement(`div`);e.className=`dialog__desc`,e.textContent=`No accounts configured.`,t.appendChild(e)}else{let n=document.createElement(`div`);n.style.cssText=`margin-bottom: 16px;`;for(let t of r)n.appendChild(fr(e,t));t.appendChild(n)}let i=document.createElement(`div`);i.style.cssText=`display: flex; gap: 8px;`;let a=document.createElement(`button`);a.className=r.length>0?`dialog__btn dialog__btn--secondary`:`dialog__btn`,a.style.flex=`1`,a.textContent=`Add Account`,a.addEventListener(`click`,()=>Z(e)),i.appendChild(a);let o=document.createElement(`button`);o.className=`dialog__btn dialog__btn--secondary`,o.style.flex=`1`,o.textContent=`Export`,o.addEventListener(`click`,()=>rr()),i.appendChild(o),t.appendChild(i),t.appendChild(pr(e));let s=document.createElement(`hr`);s.style.cssText=`border: none; border-top: 1px solid var(--s2-border-subtle); margin: 16px 0;`,t.appendChild(s);let c=document.createElement(`button`);c.className=`dialog__btn`,c.textContent=`Get Started`,c.addEventListener(`click`,()=>or(e)),t.appendChild(c)}function mr(e,t){let n=document.createElement(`select`);if(n.className=`dialog__input`,n.style.marginBottom=`8px`,t){let e=w(t.providerId),r=document.createElement(`option`);return r.value=t.providerId,r.textContent=e.name,n.appendChild(r),n.disabled=!0,n.style.opacity=`0.7`,n}let r=document.createElement(`option`);r.value=``,r.textContent=`Select a provider…`,r.disabled=!0,r.selected=!0,r.hidden=!0,n.appendChild(r);let i=new Set(T().map(e=>e.providerId)),a=[...je()].sort((e,t)=>w(e).name.localeCompare(w(t).name));for(let t of a){if(i.has(t))continue;if(e?.providerFilter){if(!e.providerFilter(t))continue}else if(!te(t))continue;let r=document.createElement(`option`);r.value=t,r.textContent=w(t).name,n.appendChild(r)}return n}function hr(e,t){let n=mr(e,t),r=document.createElement(`div`);r.className=`dialog__desc`,r.style.cssText=`font-size: 12px; color: var(--s2-content-tertiary); margin-bottom: 16px; margin-top: -4px;`;let i=document.createElement(`div`);i.style.cssText=`margin-bottom: 16px; display: none;`;let a=document.createElement(`button`);a.className=`dialog__btn`,a.textContent=`Login`,a.style.cssText=`width: 100%; margin-bottom: 8px;`,i.appendChild(a);let o=document.createElement(`div`);o.className=`dialog__desc`,o.style.cssText=`font-size: 12px; color: var(--s2-content-secondary); text-align: center;`,i.appendChild(o);let s=document.createElement(`div`),c=document.createElement(`div`);c.className=`dialog__desc`,s.appendChild(c);let l=document.createElement(`input`);l.className=`dialog__input`,l.type=`password`,l.autocomplete=`off`,l.spellcheck=!1,t&&(l.value=t.apiKey),s.appendChild(l);let u=document.createElement(`div`),d=document.createElement(`div`);d.className=`dialog__desc`,d.textContent=`Base URL:`,u.appendChild(d);let f=document.createElement(`input`);f.className=`dialog__input`,f.type=`text`,f.autocomplete=`off`,f.spellcheck=!1,t?.baseUrl&&(f.value=t.baseUrl),u.appendChild(f);let p=document.createElement(`div`);p.className=`dialog__desc`,p.style.cssText=`font-size: 11px; color: var(--s2-content-secondary); margin-top: -12px; margin-bottom: 16px;`,u.appendChild(p);let m=document.createElement(`div`);m.style.display=`none`;let h=document.createElement(`div`);h.className=`dialog__desc`,h.textContent=`Deployment:`,m.appendChild(h);let g=document.createElement(`input`);g.className=`dialog__input`,g.type=`text`,g.autocomplete=`off`,g.spellcheck=!1,t?.deployment&&(g.value=t.deployment),m.appendChild(g);let _=document.createElement(`div`);_.className=`dialog__desc`,_.style.cssText=`font-size: 11px; color: var(--s2-content-secondary); margin-top: -12px; margin-bottom: 16px;`,m.appendChild(_);let v=document.createElement(`div`);v.style.display=`none`;let y=document.createElement(`div`);y.className=`dialog__desc`,y.textContent=`API Version:`,v.appendChild(y);let b=document.createElement(`input`);b.className=`dialog__input`,b.type=`text`,b.autocomplete=`off`,b.spellcheck=!1,t?.apiVersion&&(b.value=t.apiVersion),v.appendChild(b);let x=document.createElement(`div`);x.className=`dialog__desc`,x.style.cssText=`font-size: 11px; color: var(--s2-content-secondary); margin-top: -12px; margin-bottom: 16px;`,v.appendChild(x);let S=document.createElement(`div`);S.style.cssText=`color: var(--slicc-cone); font-size: 12px; margin-bottom: 8px; display: none;`;let C=document.createElement(`button`);return C.className=`dialog__btn`,C.textContent=t?`Save`:`Add`,{providerSelect:n,providerDesc:r,oauth:{section:i,loginBtn:a,status:o},apiKeySection:s,apiKeyLabel:c,apiKeyInput:l,baseUrlSection:u,baseUrlInput:f,baseUrlDesc:p,deploymentSection:m,deploymentInput:g,deploymentDesc:_,apiVersionSection:v,apiVersionInput:b,apiVersionDesc:x,errorEl:S,saveBtn:C}}function gr(e){let t=document.createElement(`div`);t.setAttribute(`data-slicc-device-code-prompt`,``),t.style.cssText=`display:flex;flex-direction:column;gap:8px`;let n=document.createElement(`div`);n.className=`dialog__desc`,n.textContent=`Verification code`,n.style.cssText=`font-size: 11px; color: var(--s2-content-tertiary);`;let r=document.createElement(`div`);r.textContent=e,r.style.cssText=[`font: 600 22px ui-monospace, SFMono-Regular, Menlo, monospace`,`letter-spacing: 2px`,`color: var(--s2-content-primary, #e6edf3)`,`background: var(--s2-bg-secondary, #161b22)`,`border: 1px solid var(--s2-border, #30363d)`,`border-radius: 6px`,`padding: 10px 12px`,`text-align: center`,`user-select: all`,`cursor: text`].join(`;`);let i=document.createElement(`div`);i.className=`dialog__desc`,i.style.cssText=`font-size: 12px; color: var(--s2-content-secondary);`,i.textContent=`Click Copy & Continue — we will open the GitHub authorization page in a new tab. Paste this code there if it is not already filled in.`;let a=document.createElement(`div`);a.style.cssText=`display:flex;gap:8px;justify-content:flex-end;margin-top:4px`;let o=document.createElement(`button`);o.type=`button`,o.className=`dialog__btn`,o.textContent=`Cancel`;let s=document.createElement(`button`);return s.type=`button`,s.className=`dialog__btn dialog__btn--primary`,s.textContent=`Copy & Continue`,a.appendChild(o),a.appendChild(s),t.appendChild(n),t.appendChild(r),t.appendChild(i),t.appendChild(a),{prompt:t,cancelBtn:o,continueBtn:s}}function _r(e){return t=>new Promise(n=>{let r=e.loginBtn.style.display,i=e.status.style.display;e.loginBtn.style.display=`none`,e.status.style.display=`none`;let{prompt:a,cancelBtn:o,continueBtn:s}=gr(t.userCode),c=()=>{try{a.remove()}catch{}e.loginBtn.style.display=r,e.status.style.display=i};o.addEventListener(`click`,()=>{c(),n(`cancel`)}),s.addEventListener(`click`,()=>{(async()=>{try{await qe(t.userCode)}catch{}c(),e.status.style.display=i,e.status.textContent=`Waiting for you to authorize in the new tab…`,n(`continue`)})()}),e.section.appendChild(a)})}async function vr(e,n){let r=n.providerSelect.value;if(!r)return;let i=w(r);if(!i.onOAuthLogin&&!i.onOAuthLoginIntercepted)return;let{status:a}=n.oauth,o=T().some(e=>e.providerId===r),s=Ae(r);if(i.requiresBaseUrl&&!n.baseUrlInput.value.trim()&&!s){a.textContent=`Base URL is required.`,a.style.color=`var(--slicc-cone)`,n.baseUrlInput.focus();return}i.requiresBaseUrl&&n.baseUrlInput.value.trim()&&ge(r,``,n.baseUrlInput.value.trim()),a.textContent=`Opening login window...`;try{if(i.onOAuthLoginIntercepted){let{createInterceptingOAuthLauncherForCurrentRuntime:r}=await t(async()=>{let{createInterceptingOAuthLauncherForCurrentRuntime:e}=await import(`./oauth-service-C2D9b8uV.js`);return{createInterceptingOAuthLauncherForCurrentRuntime:e}},__vite__mapDeps([67,1,14,4,15,16,17,18,26,68])),a=await r();if(!a)throw Error(`No controlled-browser CDP transport available — open SLICC in standalone mode or the Chrome extension.`);await i.onOAuthLoginIntercepted(a,()=>Y(e),{presentDeviceCode:_r(n.oauth)})}else if(i.onOAuthLogin){let{createOAuthLauncher:n}=await t(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service-C2D9b8uV.js`);return{createOAuthLauncher:e}},__vite__mapDeps([67,1,14,4,15,16,17,18,26,68])),r=n();await i.onOAuthLogin(r,()=>Y(e))}}catch(e){if(!o)try{await Me(r)}catch{}er.error(`OAuth login failed`,{providerId:r,error:e instanceof Error?e.message:String(e)}),a.textContent=`Login failed: ${e instanceof Error?e.message:String(e)}`}}function yr(e,t){if(t.isOAuth){e.oauth.section.style.display=``,e.apiKeySection.style.display=`none`,e.baseUrlSection.style.display=t.requiresBaseUrl?``:`none`,t.requiresBaseUrl&&(e.baseUrlInput.placeholder=t.baseUrlPlaceholder||`https://...`,e.baseUrlDesc.textContent=t.baseUrlDescription||``),e.oauth.loginBtn.textContent=`Login with ${t.name}`,e.saveBtn.style.display=`none`;return}e.oauth.section.style.display=`none`;let n=t.requiresApiKey?`API Key`:`API Key (optional)`;e.apiKeyLabel.textContent=`${n}${t.apiKeyEnvVar?` (${t.apiKeyEnvVar})`:``}:`,e.apiKeyInput.placeholder=t.apiKeyPlaceholder||`API key`,e.apiKeySection.style.display=t.requiresApiKey||t.optionalApiKey?``:`none`,e.baseUrlInput.placeholder=t.baseUrlPlaceholder||`https://...`,e.baseUrlDesc.textContent=t.baseUrlDescription||``,e.baseUrlSection.style.display=t.requiresBaseUrl?``:`none`,e.saveBtn.style.display=``}function br(e,t){t.requiresDeployment?(e.deploymentSection.style.display=``,e.deploymentInput.placeholder=t.deploymentPlaceholder||`deployment-name`,e.deploymentDesc.textContent=t.deploymentDescription||``):e.deploymentSection.style.display=`none`}function xr(e,t){t.requiresApiVersion?(e.apiVersionSection.style.display=``,!e.apiVersionInput.value&&t.apiVersionDefault&&(e.apiVersionInput.value=t.apiVersionDefault),e.apiVersionInput.placeholder=t.apiVersionDefault||`api-version`,e.apiVersionDesc.textContent=t.apiVersionDescription||``):e.apiVersionSection.style.display=`none`}function Sr(e){let t=e.providerSelect.value;if(!t){e.providerDesc.textContent=``,e.oauth.section.style.display=`none`,e.apiKeySection.style.display=`none`,e.baseUrlSection.style.display=`none`,e.deploymentSection.style.display=`none`,e.apiVersionSection.style.display=`none`,e.saveBtn.style.display=`none`;return}let n=w(t);e.providerDesc.textContent=n.description,yr(e,n),br(e,n),xr(e,n)}function Cr(e,t){let n=t.providerSelect.value;if(!n)return;let r=w(n),i=(e,n)=>{t.errorEl.textContent=e,t.errorEl.style.display=``,n.focus()};if(r.requiresApiKey&&t.apiKeyInput.value.trim().length<5){i(`API key is required (at least 5 characters).`,t.apiKeyInput);return}if(r.requiresBaseUrl&&!t.baseUrlInput.value.trim()){i(`Base URL is required for this provider.`,t.baseUrlInput);return}if(r.requiresDeployment&&!t.deploymentInput.value.trim()){i(`Deployment name is required for this provider.`,t.deploymentInput);return}ge(n,t.apiKeyInput.value.trim(),t.baseUrlInput.value.trim()||void 0,t.deploymentInput.value.trim()||void 0,t.apiVersionInput.value.trim()||void 0),Y(e)}function wr(e,t){let{dialog:n,options:r}=e,i=T().length>0;if(r?.startInAddAccount){let t=document.createElement(`button`);t.className=`dialog__btn dialog__btn--secondary`,t.style.marginTop=`8px`,t.textContent=`Cancel`,t.addEventListener(`click`,()=>or(e)),n.appendChild(t)}else if(!t&&!i){let t=document.createElement(`button`);t.className=`dialog__btn dialog__btn--secondary`,t.style.marginTop=`8px`,t.textContent=`Connect to another browser`,t.addEventListener(`click`,()=>Or(e)),n.appendChild(t)}else if(i){let t=document.createElement(`button`);t.className=`dialog__btn dialog__btn--secondary`,t.style.marginTop=`8px`,t.textContent=`Back`,t.addEventListener(`click`,()=>X(e)),n.appendChild(t)}}function Z(e,t){let{dialog:n}=e;n.innerHTML=``;let r=document.createElement(`div`);r.className=`dialog__title`,r.textContent=t?`Edit Account`:`Add Account`,n.appendChild(r);let i=document.createElement(`div`);i.className=`dialog__desc`,i.textContent=`Provider:`,n.appendChild(i);let a=hr(e.options,t);n.appendChild(a.providerSelect),n.appendChild(a.providerDesc),a.oauth.loginBtn.addEventListener(`click`,()=>{vr(e,a)}),t?.userName&&(a.oauth.status.textContent=`Logged in as ${t.userName}`,a.oauth.loginBtn.textContent=`Re-login`),n.appendChild(a.oauth.section),n.appendChild(a.apiKeySection),n.appendChild(a.baseUrlSection),n.appendChild(a.deploymentSection),n.appendChild(a.apiVersionSection),n.appendChild(a.errorEl),a.providerSelect.addEventListener(`change`,()=>{a.errorEl.style.display=`none`,Sr(a)}),Sr(a),a.saveBtn.addEventListener(`click`,()=>Cr(e,a));let o=t=>{t.key===`Enter`&&Cr(e,a)};a.apiKeyInput.addEventListener(`keydown`,o),a.baseUrlInput.addEventListener(`keydown`,o),a.deploymentInput.addEventListener(`keydown`,o),a.apiVersionInput.addEventListener(`keydown`,o),n.appendChild(a.saveBtn),wr(e,!!t),requestAnimationFrame(()=>{let e=a.providerSelect.value;if(!e)return;let t=w(e);t.requiresApiKey?a.apiKeyInput.focus():t.requiresBaseUrl&&a.baseUrlInput.focus()})}function Tr(e,t,n){nr(t,n),n.textContent=`Connecting…`,n.style.display=``,n.style.color=`var(--s2-content-secondary)`;let r=setTimeout(()=>{e.overlay.remove(),e.resolve(!1)},800);n.dataset.dismissTimer=String(r)}function Er(e,t){let{dialog:n}=e;n.innerHTML=``;let r=document.createElement(`div`);r.className=`dialog__title`,r.textContent=`Connect this browser?`,n.appendChild(r);let i=document.createElement(`div`);i.className=`dialog__desc`,i.style.marginBottom=`12px`,i.textContent=`You’ve been invited to mirror another SLICC browser. Click below to start syncing.`,n.appendChild(i);let a=document.createElement(`div`);a.className=`dialog__desc`,a.style.cssText=`font-family: monospace; font-size: 11px; color: var(--s2-content-secondary); word-break: break-all; margin-bottom: 16px; padding: 8px; background: var(--s2-bg-secondary); border-radius: 4px;`,a.textContent=t.length>80?t.slice(0,40)+`…`+t.slice(-37):t,n.appendChild(a);let o=document.createElement(`div`);o.style.cssText=`font-size: 12px; color: var(--s2-content-secondary); margin-bottom: 8px; display: none;`,n.appendChild(o);let s=document.createElement(`button`);s.className=`dialog__btn`,s.textContent=`Connect`,s.addEventListener(`click`,()=>{let n=Bt(window.localStorage,t);if(!n){o.textContent=`Invalid sync URL.`,o.style.display=``,o.style.color=`var(--slicc-cone)`;return}Tr(e,n.joinUrl,o)}),n.appendChild(s);let c=document.createElement(`button`);c.className=`dialog__btn dialog__btn--secondary`,c.style.marginTop=`8px`,c.textContent=`Set up an account instead`,c.addEventListener(`click`,()=>Z(e)),n.appendChild(c)}function Dr(){let e=document.createElement(`details`);e.style.cssText=`margin-bottom: 12px; font-size: 12px; color: var(--s2-content-secondary);`;let t=document.createElement(`summary`);t.style.cssText=`cursor: pointer; user-select: none; color: var(--s2-content-secondary);`,t.textContent=`How do I get the sync URL?`,e.appendChild(t);let n=document.createElement(`div`);n.style.cssText=`margin-top: 8px; padding: 10px 12px; background: var(--s2-bg-layer-2); border-radius: var(--s2-radius-default); border: 1px solid var(--s2-border-subtle); line-height: 1.5;`;let r=document.createElement(`ol`);r.style.cssText=`margin: 0; padding-left: 20px;`;for(let e of[`On the other SLICC, click the avatar (top right).`,`Choose “Enable multi-browser sync” — the URL is copied automatically.`,`Paste it below. Both browsers must be on the same SLICC version.`]){let t=document.createElement(`li`);t.textContent=e,r.appendChild(t)}return n.appendChild(r),e.appendChild(n),e}function Or(e){let{dialog:t}=e;t.innerHTML=``;let n=document.createElement(`div`);n.className=`dialog__title`,n.textContent=`Connect to another browser`,t.appendChild(n);let i=document.createElement(`div`);i.className=`dialog__desc`,i.style.marginBottom=`12px`,i.textContent=`Paste a multi-browser sync URL to mirror another SLICC browser.`,t.appendChild(i),t.appendChild(Dr());let a=document.createElement(`div`);a.className=`dialog__desc`,a.textContent=`Sync URL:`,t.appendChild(a);let o=document.createElement(`input`);o.className=`dialog__input`,o.type=`text`,o.autocomplete=`off`,o.spellcheck=!1,o.placeholder=`${r}/join/<token>`,t.appendChild(o);let s=document.createElement(`div`);s.style.cssText=`color: var(--slicc-cone); font-size: 12px; margin-bottom: 8px; display: none;`,t.appendChild(s);let c=document.createElement(`div`);c.style.cssText=`font-size: 12px; color: var(--s2-content-secondary); margin-bottom: 8px; display: none;`;let l=document.createElement(`button`);l.className=`dialog__btn`,l.textContent=`Connect`,l.addEventListener(`click`,()=>{let t=o.value.trim();if(!t){s.textContent=`Paste a sync URL to continue.`,s.style.display=``,o.focus();return}let n=Bt(window.localStorage,t);if(!n){s.textContent=Qn(t),s.style.display=``,o.focus();return}Tr(e,n.joinUrl,c)}),t.appendChild(l),t.appendChild(c);let u=document.createElement(`button`);u.className=`dialog__btn dialog__btn--secondary`,u.style.marginTop=`8px`,u.textContent=`Back`,u.addEventListener(`click`,()=>Z(e)),t.appendChild(u),o.addEventListener(`input`,()=>{s.style.display=`none`}),o.addEventListener(`keydown`,e=>{e.key===`Enter`&&l.click()}),requestAnimationFrame(()=>o.focus())}function kr(e){return Ue(`button`),new Promise(t=>{let n=document.createElement(`div`);n.className=`dialog-overlay`;let r=document.createElement(`div`);r.className=`dialog`,r.style.cssText=`max-width: 480px; width: 90vw; padding: 32px;`;let i={overlay:n,dialog:r,options:e,accountsBefore:localStorage.getItem(`slicc_accounts`)??``,resolve:t};e?.startInAddAccount?Z(i):T().length>0?X(i):e?.autoJoinUrl?Er(i,e.autoJoinUrl):e?.preferTrayJoin?Or(i):Z(i),n.appendChild(r),document.body.appendChild(n)})}var Ar=n(`tray-leader-lock`),jr=!1,Q=null,Mr=null;function Nr(e){let t=()=>{Q===t&&(Q=null),e()};return Q=t,t}function Pr(e){Mr=e}function Fr(){return jr}function Ir(){jr=!0;let e=Mr;Mr=null;try{e?.()}catch(e){Ar.error(`Fatal-boot leader teardown threw`,e)}let t=Q;Q=null,t?.()}var $=n(`main`);function Lr(e){try{return new URL(e).searchParams.has(`ui-fixture`)}catch{return!1}}async function Rr(){_n();let e=document.getElementById(`app`);if(!e)throw Error(`#app element not found`);let n=Ne(),r=tn({locationHref:window.location.href,storage:window.localStorage,envBaseUrl:null,isDev:!1,isExtension:n});if(Lr(window.location.href)){let{mountWcUiPreview:n}=await t(async()=>{let{mountWcUiPreview:e}=await import(`./wc-shell-Cn2tEDM7.js`).then(e=>e.s);return{mountWcUiPreview:e}},__vite__mapDeps([44,4,1,2,45,15,42,11,12,5,6,7,8,9,10,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,46,47,48,31,49]));n(e);return}nn(),cn(),Gn(),r!==`connect`&&We({isExtensionRealm:n}).catch(()=>{});let i=rt(window.location.search),a=r===`cherry`?null:In(window.location.search),o=!!a&&Pe();if(await Kn(i?{apiBaseUrl:i.apiBaseUrl,token:i.token}:null,o&&a?{extensionId:a.extensionId}:null)===`reload-pending`)return;if(!n&&(r===`follower`||r===`cherry`)){let{bootFollowerFloat:n}=await t(async()=>{let{bootFollowerFloat:e}=await import(`./wc-follower-CmPddVGO.js`);return{bootFollowerFloat:e}},__vite__mapDeps([69,1,2,60,43,4,44,45,15,42,11,12,5,6,7,8,9,10,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,46,47,48,31,49,50,51,52,53,54,55,56,57,58,59,61,36,62,63,64,70,71,72,73,68,74,38,75,76,77,78,79,80]));return n(e,$,r)}await Ge(),ue(),i?.apiBaseUrl&&!o&&(He(i.apiBaseUrl),Fe(i.token),await Re());let{bootstrapOAuthReplicas:s}=await t(async()=>{let{bootstrapOAuthReplicas:e}=await import(`./oauth-bootstrap-CZzvOYOg.js`);return{bootstrapOAuthReplicas:e}},__vite__mapDeps([81,1,2,11,4,12,5,6,7,8,9,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,39]));if(await Promise.race([s().catch(e=>{$.error(`OAuth bootstrap failed`,e)}),new Promise(e=>setTimeout(e,1e4))]),r===`connect`){globalThis.__slicc_connect_mode=!0;let{loadLegacyStyles:n}=await t(async()=>{let{loadLegacyStyles:e}=await import(`./legacy-styles-B3nS5QUo.js`);return{loadLegacyStyles:e}},__vite__mapDeps([82,1]));await n();let{mountConnectSurface:r}=await t(async()=>{let{mountConnectSurface:e}=await import(`./connect-surface-DVI8l1Gj.js`);return{mountConnectSurface:e}},__vite__mapDeps([83,11,4,12,5,6,7,1,8,9,10,13,2,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]));await r(e);return}if(n){let{bootExtensionFloat:n}=await t(async()=>{let{bootExtensionFloat:e}=await import(`./wc-extension-B3EwzUfS.js`);return{bootExtensionFloat:e}},__vite__mapDeps([84,1,70,4,12,5,6,7,8,9,10,13,2,14,15,16,17,18,19,20,21,22,23,24,44,45,42,11,25,26,27,28,29,46,47,48,31,49,50,51,52,53,54,55,56,57,58,71,60,72,61,64,73,68,74,38,62,75,76,77,85]));return n(e,$,r===`extension-detached`)}o&&a&&ut(a.extensionId);let{bootLeaderFloat:c}=await t(async()=>{let{bootLeaderFloat:e}=await import(`./wc-live-Dq-_FAPU.js`).then(e=>e.n);return{bootLeaderFloat:e}},__vite__mapDeps([70,4,12,5,6,7,1,8,9,10,13,2,14,15,16,17,18,19,20,21,22,23,24,44,45,42,11,25,26,27,28,29,46,47,48,31,49,50,51,52,53,54,55,56,57,58,71,60,72,61,64,73,68,74,38,62,75,76,77]));return c(e,$,r)}function zr(e,t){let n=document.createElement(`div`);n.style.cssText=`padding:2rem;text-align:center;font-family:system-ui;`;let r=document.createElement(`h1`);r.textContent=`Failed to start`;let i=document.createElement(`p`);i.textContent=t instanceof Error?t.message:String(t);let a=document.createElement(`button`);a.type=`button`,a.textContent=`Reload`,a.addEventListener(`click`,()=>location.reload()),n.append(r,i,a),e.replaceChildren(n)}async function Br(e,n){let r;try{({renderBootRecoveryScreen:r}=await t(()=>import(`./recovery-screen-xvnzvjnh.js`),__vite__mapDeps([86,17,18])))}catch{zr(e,n);return}if(r(e,n),n instanceof Error&&n.message.includes(`did not signal ready`))try{let{triageModuleWorkerHealth:i}=await t(async()=>{let{triageModuleWorkerHealth:e}=await import(`./worker-triage-BvsMZrdR.js`);return{triageModuleWorkerHealth:e}},[]),a=await i();a===`browser-wedged`&&r(e,n,{verdict:a})}catch{}}Rr().catch(e=>{$.error(`Fatal error`,e),Ir();let t=document.getElementById(`app`);t&&Br(t,e)});export{jt as A,Bt as C,P as D,F as E,j as F,yt as I,xt as L,vt as M,Tt as N,It as O,ht as P,D as R,qt as S,L as T,Rt as _,kr as a,Vt as b,Mn as c,wn as d,mn as f,Lt as g,an as h,$n as i,St as j,Mt as k,Sn as l,vn as m,Fr as n,Xn as o,z as p,Pr as r,Vn as s,Nr as t,Cn as u,Gt as v,Ut as w,Ht as x,zt as y,Xe as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import{n as t,r as n}from"./transcript-export-DP-r8eDz.js";import{t as r}from"./pending-request-table-k-D7ZZsL.js";import{BrowserAPI as i}from"./cdp-
|
|
1
|
+
import{t as e}from"./logger-DDBAeTLF.js";import{n as t,r as n}from"./transcript-export-DP-r8eDz.js";import{t as r}from"./pending-request-table-k-D7ZZsL.js";import{BrowserAPI as i}from"./cdp-Ck5NGIgv.js";import{t as a}from"./synthetic-cdp-transport-OUVdC4zy.js";var o=[2,1],s=new Set([`handshake.hello`,`handshake.welcome`,`handshake.version-mismatch`,`cdp.request`,`cdp.response`,`cdp.event`,`permission.request`,`permission.response`,`host.event`,`slicc.event`,`session.export.request`,`session.export.cancel`,`session.export.progress`,`session.export.response`,`session.export.error`]);function c(e,t=[2]){if(typeof e!=`object`||!e)return!1;let n=e;if(typeof n.cherry!=`number`||!t.includes(n.cherry)||typeof n.channelId!=`string`||typeof n.kind!=`string`||!s.has(n.kind))return!1;let r=n.kind;return!(r===`handshake.version-mismatch`&&typeof n.peerVersion!=`number`||(r===`session.export.request`||r===`session.export.cancel`||r===`session.export.progress`||r===`session.export.response`||r===`session.export.error`)&&(typeof n.requestId!=`string`||n.requestId===``||r===`session.export.progress`&&typeof n.phase!=`string`||r===`session.export.response`&&!(n.blob instanceof Blob)||r===`session.export.error`&&typeof n.code!=`string`))}function l(e,t){return!(!t.allowOrigins.includes(e.origin)||t.expectedSource!==null&&e.source!==t.expectedSource||!c(e.data,t.versions)||t.channelId!==null&&e.data.channelId!==t.channelId)}function u(e,t=[2]){if(typeof e!=`object`||!e)return!1;let n=e;return typeof n.cherry==`number`&&!t.includes(n.cherry)&&typeof n.channelId==`string`&&typeof n.kind==`string`}var d=e(`cherry-transport`),f=3e4;function p(e){let r=e instanceof t||typeof e==`object`&&e&&`code`in e?e.code:void 0;return typeof r==`string`&&n.has(r)?r:`transfer-corrupt`}var m=class extends a{opts;channelId=null;nextId=1;pending=new r;connectResolve=null;connectReject=null;connectTimer=null;_joinUrl=null;_features={terminal:!0,files:!0,memory:!0,browser:!0,modelPicker:!0,history:!0,nav:!0,monitor:!0};_theme=null;_layout=null;_effortLevel=null;_flags=null;negotiatedVersion=2;boundHandler=e=>this.handleMessage(e);onHostEvent=null;onExportRequest=null;pendingHostExports=new Map;constructor(e){super({targetUrl:typeof location<`u`?location.href:`about:blank`,targetOrigin:e.targetOrigin,title:`Cherry Host Page`,ids:{target:`cherry-target`,session:`cherry-session`,frame:`cherry-frame`,loader:`cherry-loader`}}),this.opts=e}get hostOrigin(){return this.opts.targetOrigin}getCurrentUrl(){return typeof location<`u`?location.href:super.getCurrentUrl()}get joinUrl(){return this._joinUrl}get features(){return this._features}get theme(){return this._theme}get layout(){return this._layout}get effortLevel(){return this._effortLevel}get flags(){return this._flags}get negotiatedProtocolVersion(){return this.negotiatedVersion}async connect(e){if(this._state!==`disconnected`)throw Error(`Cannot connect: state is ${this._state}`);this._state=`connecting`,this.negotiatedVersion=2,this.channelId=`cherry-${crypto.randomUUID()}`,typeof window<`u`&&window.addEventListener(`message`,this.boundHandler);let t=e?.timeout??f;return new Promise((e,n)=>{this.connectResolve=e,this.connectReject=n,this.connectTimer=setTimeout(()=>{this.connectTimer=null,typeof window<`u`&&window.removeEventListener(`message`,this.boundHandler),this._state=`disconnected`,this.channelId=null,this.connectResolve=null,this.connectReject=null,n(Error(`Cherry handshake timed out after ${t}ms — no handshake.welcome from the embedding page (host SDK missing, not listening, or version-skewed; check the host page's console)`))},t);for(let e of o)this.post({cherry:e,channelId:this.channelId,kind:`handshake.hello`,capabilities:this.opts.capabilities??{navigate:!0,screenshot:!0,openUrl:!0}})})}failPendingConnect(e){if(this.connectReject===null)return;this.connectTimer!==null&&(clearTimeout(this.connectTimer),this.connectTimer=null),typeof window<`u`&&window.removeEventListener(`message`,this.boundHandler),this._state=`disconnected`,this.channelId=null;let t=this.connectReject;this.connectResolve=null,this.connectReject=null,t(e)}disconnect(){this.connectTimer!==null&&(clearTimeout(this.connectTimer),this.connectTimer=null),typeof window<`u`&&window.removeEventListener(`message`,this.boundHandler),this.pending.rejectAll(`Cherry transport disconnected`);for(let[,e]of this.pendingHostExports)e.abort();this.pendingHostExports.clear(),this._state=`disconnected`,this.channelId=null}async forward(e,t,n,r=f){let i=this.nextId++,a=this.pending.issue(i,r,`Cherry CDP timed out after ${r}ms: ${e}`);return this.post({cherry:this.negotiatedVersion,channelId:this.channelId,kind:`cdp.request`,id:i,method:e,params:t}),a}testReceive(e){this.handleMessage(e)}emitSliccEventToHost(e,t){if(!this.channelId){d.warn(`Dropping slicc.event before handshake (no channelId yet)`,{name:e});return}this.post({cherry:this.negotiatedVersion,channelId:this.channelId,kind:`slicc.event`,name:e,detail:t})}post(e){this.opts.counterpart.postMessage(e,this.opts.targetOrigin)}handleMessage(e){let t=this._state===`connected`?[this.negotiatedVersion]:o;if(!l(e,{allowOrigins:this.opts.allowOrigins,expectedSource:this.opts.counterpart,channelId:this.channelId,versions:t})){this.diagnoseRejectedMessage(e,t);return}let n=e.data;if(this.negotiatedVersion<2&&n.kind.startsWith(`session.export.`)){d.warn(`Ignoring a v2-only envelope on a v1-negotiated cherry channel`,{kind:n.kind});return}switch(n.kind){case`handshake.welcome`:this.handleWelcome(n);return;case`cdp.response`:n.error?this.pending.reject(n.id,Error(`Cherry CDP error: ${n.error.message} (${n.error.code})`)):this.pending.resolve(n.id,n.result??{});return;case`cdp.event`:this.emit(n.method,{...n.params??{},sessionId:n.sessionId??this.syntheticIds.session});return;case`host.event`:this.onHostEvent?.(n.name,n.detail);return;case`session.export.request`:this.handleExportRequest(n);return;case`session.export.cancel`:{let e=this.pendingHostExports.get(n.requestId);e&&(e.abort(),this.pendingHostExports.delete(n.requestId));return}default:return}}diagnoseRejectedMessage(e,t){u(e.data,t)?(d.warn(`Cherry protocol version mismatch — update the older side`,{peerVersion:e.data.cherry,supportedVersions:[...o],origin:e.origin}),e.data.channelId===this.channelId&&this.opts.allowOrigins.includes(e.origin)&&e.source===this.opts.counterpart&&this.failPendingConnect(Error(`Cherry protocol version mismatch (peer v${e.data.cherry}, ours v2) — update the older side`))):c(e.data,o)&&d.warn(`Rejected a cherry envelope (origin/source/channel mismatch)`,{origin:e.origin,allowOrigins:this.opts.allowOrigins})}handleWelcome(e){this.connectTimer!==null&&(clearTimeout(this.connectTimer),this.connectTimer=null),this._state=`connected`,this.negotiatedVersion=e.cherry,this._joinUrl=e.joinUrl??null,this._theme=e.theme??null,this._layout=e.layout??null,this._effortLevel=e.effortLevel??null,this._flags=e.flags??null,this._features=e.features??{terminal:!0,files:!0,memory:!0,browser:!0,modelPicker:!0,history:!0,nav:!0,monitor:!0},d.info(`Cherry handshake complete`,{channelId:this.channelId,negotiatedVersion:this.negotiatedVersion}),this.connectResolve?.(),this.connectResolve=null,this.connectReject=null}handleExportRequest(e){let{requestId:t,sessionId:n}=e;if(!this.onExportRequest||!this.channelId){this.postExportError(t,`transfer-aborted`);return}let r=new AbortController;this.pendingHostExports.set(t,r);let i=this.channelId;this.onExportRequest(t,n,r.signal,e=>{this.pendingHostExports.has(t)&&this.post({cherry:this.negotiatedVersion,channelId:i,kind:`session.export.progress`,requestId:t,phase:e.phase,...e.processedBytes===void 0?{}:{processedBytes:e.processedBytes},...e.estimatedBytes===void 0?{}:{estimatedBytes:e.estimatedBytes}})}).then(e=>{this.pendingHostExports.delete(t),this.post({cherry:this.negotiatedVersion,channelId:i,kind:`session.export.response`,requestId:t,blob:e})}).catch(e=>{this.pendingHostExports.delete(t),this.postExportError(t,p(e))})}postExportError(e,t){this.channelId&&this.post({cherry:this.negotiatedVersion,channelId:this.channelId,kind:`session.export.error`,requestId:e,code:t})}},h=e(`cherry-boot`);function g(){let e=location.ancestorOrigins;if(e&&e.length>0){let t=e[0];if(t&&t!==`null`)return t}if(document.referrer)try{return new URL(document.referrer).origin}catch{}return location.origin}async function _(){let e=g(),t=[e],n=e,r=new m({counterpart:window.parent,allowOrigins:t,targetOrigin:n});await r.connect(),h.info(`Cherry transport connected`);let a=r.joinUrl;if(!a)throw Error(`cherry boot: no joinUrl from handshake`);return{transport:r,browser:new i(r),joinUrl:a}}export{_ as setupCherryFollower};
|
package/dist/ui/assets/{memory-curation-seam-BufuSUCj.js → memory-curation-seam-BHFcRLuu.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./logger-LESFN7Hj.js";import"./record-ChU1ND2B.js";import{o as t}from"./kernel-worker-
|
|
1
|
+
import{t as e}from"./logger-LESFN7Hj.js";import"./record-ChU1ND2B.js";import{o as t}from"./kernel-worker-DPGsdtHG.js";import{a as n,i as r,n as i,o as a,s as o,t as s}from"./live-session-curation-BeMkfXGh.js";const c=e(`memory-dreaming`),l={kind:`dream`,nameFor:n,rivalsFor:e=>[r(e)]};function u(e,t){return`dream-${e}-${t}.md`}async function d(e){let t=e.today??new Date().toISOString().slice(0,10),n=e.cone?.folder??`cone`;return await f(e,n),a({spawn:e.spawn,vfs:e.vfs,sessionArchivePath:`/sessions/${u(t,n)}`,sessionCount:e.sessionCount,today:t,instructions:l,...e.cone?{cone:e.cone}:{},...e.signal?{signal:e.signal}:{}})}async function f(e,t){if(i())try{await s({vfs:e.vfs,cone:e.cone??{folder:t},spawn:e.spawn,...e.signal?{signal:e.signal}:{}})}catch(e){c.warn(`Live transcript curation before dream failed`,{cone:t,error:e instanceof Error?e.message:String(e)})}}function p(e){return o(e),{async curate(t){let n=globalThis.__slicc_agent;return n?a({spawn:e=>n.spawn(e),vfs:e,sessionArchivePath:t.sessionArchivePath,sessionCount:t.sessionCount,...t.cone?{cone:t.cone}:{}}):{ok:!1,reason:`agent bridge not published yet`,legacyFallbackSafe:!1}},async dream(n){let r=globalThis.__slicc_agent;if(!r)return{ok:!1,reason:`agent bridge not published yet`,legacyFallbackSafe:!1};let i=(await t(e)).length;return d({spawn:e=>r.spawn(e),vfs:e,sessionCount:i,...n.cone?{cone:n.cone}:{},...n.today?{today:n.today}:{}})}}}function m(e){globalThis.__slicc_memory=e}export{p as createMemorySeam,m as publishMemorySeam};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./record-ChU1ND2B.js";import{t,u as n}from"./descriptor-S4Jug1iP.js";import{i as r}from"./kernel-worker-
|
|
1
|
+
import{t as e}from"./record-ChU1ND2B.js";import{t,u as n}from"./descriptor-S4Jug1iP.js";import{i as r}from"./kernel-worker-DPGsdtHG.js";const i=`/sessions/.curation/health.json`;async function a(e,t){try{return(await c(e,n({parentJid:null,folder:t}).memoryPath)).length}catch(e){if(s(e))return null;throw e}}async function o(e){if(!e.readDir)return null;try{let n=await e.readDir(t);return new Set(n.filter(e=>e.type===`directory`).map(e=>e.name))}catch{return new Set}}function s(e){return e?.code===`ENOENT`||e instanceof Error&&e.message.includes(`ENOENT`)}async function c(e,t){let n=await e.readFile(t,{encoding:`utf-8`});return typeof n==`string`?n:new TextDecoder().decode(n)}async function l(e){let t;try{t=await c(e,r)}catch(e){return s(e)?{fresh:!0}:{failure:`sessions index unreadable at ${r}: ${e instanceof Error?e.message:String(e)}`}}try{let e=JSON.parse(t);return Array.isArray(e)?{entries:e}:{failure:`sessions index is not an array`}}catch{return{failure:`sessions index at ${r} is not valid JSON`}}}function u(e){return e.memoryFailed===void 0?e.memoryPending?`pending`:e.memoryCuratedAt===void 0?e.memorySkipped?`skipped`:`none`:`curated`:`failed`}function d(t){let n=new Map([[e,0]]);for(let e of t){if(u(e)!==`curated`)continue;let t=e.cone??`cone`;n.set(t,(n.get(t)??0)+1)}return n}async function f(e,t){let n=await o(e),r=[];for(let[i,o]of d(t))i!==`cone`&&n&&!n.has(i)||r.push({folder:i,curated:o,chars:await a(e,i)});return r}function p(e){return e.filter(e=>e.curated>0&&(e.chars??0)===0).map(e=>e.folder===`cone`?`${e.curated} archive(s) report successful curation but the primary memory file is missing or empty`:`${e.curated} archive(s) from cone "${e.folder}" report successful curation but its memory file is missing or empty`)}async function m(e,t=()=>new Date){let n={at:t().toISOString(),sessions:0,curation:{curated:0,failed:0,pending:0,skipped:0,none:0},primaryMemoryChars:null,cones:[],failures:[]};try{let t=await l(e);if(`failure`in t)return n.failures.push(t.failure),n;let r=`entries`in t?t.entries:[];n.sessions=r.length;for(let e of r)n.curation[u(e)]++;try{n.cones=await f(e,r)}catch(e){return n.failures.push(`memory file unreadable: ${e instanceof Error?e.message:String(e)}`),n}n.primaryMemoryChars=n.cones.find(e=>e.folder===`cone`)?.chars??null,n.curation.failed>0&&n.failures.push(`${n.curation.failed} archive(s) whose last curation attempt failed`),n.failures.push(...p(n.cones))}catch(e){n.failures.push(`health check itself failed: ${e instanceof Error?e.message:String(e)}`)}return n}async function h(e,t){let n=await m(e,t);return await e.mkdir(`/sessions/.curation`,{recursive:!0}),await e.writeFile(i,`${JSON.stringify(n,null,2)}\n`),n}function g(e,t){let{log:n}=t,r=async()=>{try{let t=await h(e);t.failures.length>0?(n.error??n.warn.bind(n))(`memory health check FAILED`,{failures:t.failures,report:i}):n.info(`memory health check ok`,{sessions:t.sessions,curation:t.curation})}catch(e){(n.error??n.warn.bind(n))(`memory health check could not persist its report`,e)}},a=setTimeout(()=>{r()},t.bootDelayMs??9e4),o=setInterval(()=>{r()},t.intervalMs??864e5);return()=>{clearTimeout(a),clearInterval(o)}}export{g as scheduleMemoryHealthChecks};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as e}from"./kernel-worker-DPGsdtHG.js";function t(){return e(`memory-v2`)}export{t as isMemoryV2Enabled};
|
package/dist/ui/assets/{memory-write-execute-BygymnF0.js → memory-write-execute-Bw7kTO2u.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./path-utils-DNJG-zQf.js";import{a as t,o as n}from"./memory-budget-Bcf7Eolo.js";import{t as r}from"./kernel-worker-
|
|
1
|
+
import{n as e}from"./path-utils-DNJG-zQf.js";import{a as t,o as n}from"./memory-budget-Bcf7Eolo.js";import{t as r}from"./kernel-worker-DPGsdtHG.js";function i(e){return Array.isArray(e)&&e.every(e=>typeof e==`object`&&!!e&&typeof e.oldText==`string`&&typeof e.newText==`string`)}function a(e,t){let n=e;for(let[e,r]of t.entries()){if(r.oldText.length===0)return{ok:!1,error:`edit ${e+1}: oldText must not be empty`};let t=n.indexOf(r.oldText);if(t===-1)return{ok:!1,error:`edit ${e+1}: oldText not found in the current file`};if(n.indexOf(r.oldText,t+1)!==-1)return{ok:!1,error:`edit ${e+1}: oldText occurs more than once; include more context to make it unique`};n=n.slice(0,t)+r.newText+n.slice(t+r.oldText.length)}return{ok:!0,content:n}}function o(e,t){return e<=t?`${e} chars, ${t-e} under the ${t}-char budget.`:`${e} chars, ${e-t} OVER the ${t}-char budget — the next write must be smaller than ${e} chars.`}function s(e,t,n){if(t<=n||t<e)return{allowed:!0};let r=t-n;return{allowed:!1,reason:`Rejected: the file would ${t===e?`stay at ${e} chars`:`grow from ${e} to ${t} chars`}, ${r} over the ${n}-char budget. Over budget, a write must shrink the file — cut a whole section rather than shaving characters, then write again.`}}async function c(e,t){try{let n=await e.readFile(t,{encoding:`utf-8`});return typeof n==`string`?n:new TextDecoder().decode(n)}catch(e){if(e?.code===`ENOENT`)return null;throw e}}function l(e,t,n){if(typeof e.content==`string`)return{ok:!0,next:e.content};if(!i(e.edits))return{ok:!1,error:"`edits` must be a list of { oldText, newText }"};if(t===null)return{ok:!1,error:`${n} does not exist yet — pass \`content\` to create it`};let r=a(t,e.edits);return r.ok?{ok:!0,next:r.content}:r}async function u(i,a,u){if(typeof u.path!=`string`||u.path.length===0)return{content:"memory_write: `path` is required",isError:!0};let d=e(u.path);if(!n(d))return{content:`memory_write: ${d} is not a memory file — use write_file or edit for ordinary files`,isError:!0};if(typeof u.content==`string`==(u.edits!==void 0))return{content:"memory_write: pass exactly one of `content` (whole file) or `edits` (exact replacements)",isError:!0};try{let e=await c(i,d),n=l(u,e,d);if(!n.ok)return{content:`memory_write: ${n.error}`,isError:!0};let f=t(await a.readSessionCount()),p=s(e?.length??0,n.next.length,f);if(!p.allowed)return{content:`memory_write: ${p.reason}`,isError:!0};await i.writeFile(d,n.next);let m=await r(i,d,n.next);return m?{content:m,isError:!0}:{content:`Wrote ${d}: ${o(n.next.length,f)}`}}catch(e){return{content:e instanceof Error?e.message:String(e),isError:!0}}}export{u as executeMemoryWrite};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/account-store-
|
|
2
|
-
import{t as e}from"./preload-helper-Czpn1I53.js";import{n as t}from"./mime-types-D0xZwlMO.js";import{r as n,t as r}from"./base64-ELzoYfwP.js";import{t as i}from"./types-D8gIX-W-.js";import"./mount-table-store-dY2IfQ5S.js";import"./fs-
|
|
3
|
-
`;function h(){let e=new Uint8Array(16);if(typeof crypto<`u`&&typeof crypto.getRandomValues==`function`)crypto.getRandomValues(e);else for(let t=0;t<e.length;t+=1)e[t]=Math.floor(Math.random()*256);let t=``;for(let n of e)t+=n.toString(16).padStart(2,`0`);return`----SliccFormBoundary${t}`}function g(e,t=h()){let n=new TextEncoder,r=[];for(let i of e){let e=v(_(i.name));if(`file`in i){let a=v(i.file.filename),o=y(i.file.contentType)||`application/octet-stream`;r.push(n.encode(`--${t}${m}Content-Disposition: form-data; name="${e}"; filename="${a}"${m}Content-Type: ${o}${m}${m}`)),r.push(i.file.bytes),r.push(n.encode(m))}else r.push(n.encode(`--${t}${m}Content-Disposition: form-data; name="${e}"${m}${m}${_(i.value)}${m}`))}return r.push(n.encode(`--${t}--${m}`)),{bytes:b(r),contentType:`multipart/form-data; boundary=${t}`,boundary:t}}function _(e){return e.replace(/\r\n|\r|\n/g,m)}function v(e){return e.replace(/\r/g,`%0D`).replace(/\n/g,`%0A`).replace(/"/g,`%22`)}function y(e){return(e??``).replace(/[\r\n]/g,``).trim()}function b(e){let t=0;for(let n of e)t+=n.byteLength;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.byteLength;return n}function x(e,t,n){let r=g([{name:`data`,file:{bytes:n,filename:e,contentType:t}}]);return{contentType:r.contentType,body:r.bytes}}function S(e){return e.split(`/`).pop()||`data`}function C(e){let t=e.match(/^da:\/\/([^/]+)\/([^/]+)(?:\/(.*))?$/);if(!t)throw Error(`invalid DA source '${e}' — expected da://org/repo[/path]`);return{org:t[1],repo:t[2],path:(t[3]??``).replace(/^\/+/,``).replace(/\/+$/,``)}}var w=5242880,T=class{kind=`da`;source;profile;mountId;parsed;cache;maxBodyBytes;transport;closed=!1;constructor(e){this.source=e.source,this.profile=e.profile,this.mountId=e.mountId??crypto.randomUUID(),this.parsed=C(e.source),this.cache=e.cache,this.maxBodyBytes=e.maxBodyBytes??w,this.transport=e.signedFetch}assertOpen(e){if(this.closed)throw new i(`EBADF`,`mount closed`,e)}toMountRelative(e){return e.replace(/^\/+/,``)}toSourcePath(e){let t=e.replace(/^\/+/,``).replace(/\/+$/,``),n=[this.parsed.path,t].filter(e=>e.length>0).join(`/`);return`/source/${this.parsed.org}/${this.parsed.repo}${n?`/${n}`:``}`}toListPath(e){let t=e.replace(/^\/+/,``).replace(/\/+$/,``),n=[this.parsed.path,t].filter(e=>e.length>0).join(`/`);return`/list/${this.parsed.org}/${this.parsed.repo}${n?`/${n}`:``}`}async readFile(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n&&!this.cache.isStale(n.cachedAt))return n.body;let r={};n&&(r[`if-none-match`]=n.etag);let a=await this.transport({method:`GET`,path:this.toSourcePath(t),headers:r});if(a.status===304&&n)return await this.cache.putBody(t,n.body,n.etag),n.body;if(a.status===404)throw await this.cache.invalidateBody(t),new i(`ENOENT`,`no such file`,e);if(a.status===401||a.status===403)throw new i(`EACCES`,`da access denied`,e);if(a.status>=400)throw new i(`EIO`,`da readFile failed: ${a.status}`,e);let o=a.headers.get(`content-length`),s=o?Number(o):void 0;if(s!==void 0&&s>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let c=new Uint8Array(await a.arrayBuffer());if(c.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let l=a.headers.get(`etag`)??``,u=l.startsWith(`W/`)?l.slice(2):l;return await this.cache.putBody(t,c,u),c}async writeFile(e,n){if(this.assertOpen(e),n.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let r=this.toMountRelative(e),a=await this.cache.getBody(r),o=x(S(e),t(e),n),s={"content-type":o.contentType,"content-length":String(o.body.byteLength)};a?.etag?s[`if-match`]=a.etag.startsWith(`W/`)?a.etag.slice(2):a.etag:a||(s[`if-none-match`]=`*`);let c=()=>this.transport({method:`POST`,path:this.toSourcePath(r),headers:s,body:o.body}),l,u=1;try{l=await c()}catch{u=2,l=await c()}if(l.status===412){if(u===2){let t=await this.transport({method:`HEAD`,path:this.toSourcePath(r)});if(t.status>=400)throw new i(`EIO`,`da reconcile HEAD failed: ${t.status}`,e);let a=t.headers.get(`etag`)??``;await this.cache.putBody(r,n,a);let o=r.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(o);return}await this.cache.invalidateBody(r);try{await this.readFile(e)}catch{}throw new i(`EBUSY`,`remote modified since last read — re-read and retry`,e)}if(l.status===401||l.status===403)throw new i(`EACCES`,`da write denied`,e);if(l.status>=400)throw new i(`EIO`,`da writeFile failed: ${l.status}`,e);let d=l.headers.get(`etag`)??``;await this.cache.putBody(r,n,d);let f=r.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(f)}async readDir(e){this.assertOpen(e);let t=this.toMountRelative(e).replace(/\/+$/,``),n=await this.cache.getListing(t);if(n&&!this.cache.isStale(n.cachedAt))return n.entries;let r=await this.transport({method:`GET`,path:this.toListPath(t)});if(r.status===404)throw new i(`ENOENT`,`no such directory`,e);if(r.status>=400)throw new i(`EIO`,`da list failed: ${r.status}`,e);let a=(await r.json()).map(e=>e.ext?{name:`${e.name}.${e.ext}`,kind:`file`,etag:e.etag,lastModified:e.lastModified}:{name:e.name,kind:`directory`,lastModified:e.lastModified});return await this.cache.putListing(t,a),a}async stat(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n)return{kind:`file`,size:n.size,mtime:n.cachedAt,etag:n.etag};let r=t.split(`/`),a=r.pop()??``,o=r.join(`/`),s=await this.cache.getListing(o);if(s&&!this.cache.isStale(s.cachedAt)){let t=s.entries.find(e=>e.name===a);if(t?.kind===`file`&&t.size!==void 0)return{kind:`file`,size:t.size,mtime:t.lastModified??s.cachedAt,etag:t.etag??``};if(t?.kind===`directory`)return{kind:`directory`,size:0,mtime:t.lastModified??s.cachedAt};if(!t)throw new i(`ENOENT`,`no such file or directory`,e)}let c=await this.transport({method:`HEAD`,path:this.toSourcePath(t)});if(c.status===200){let e=Number(c.headers.get(`content-length`)??`0`),t=c.headers.get(`etag`)??``,n=c.headers.get(`last-modified`),r=n?Date.parse(n):0;if(s){let n=s.entries.map(n=>n.name===a&&n.kind===`file`?{...n,size:e,etag:t,lastModified:r}:n);await this.cache.putListing(o,n)}return{kind:`file`,size:e,mtime:r,etag:t}}if(c.status===404){let n=await this.cache.getListing(t);if(n)return{kind:`directory`,size:0,mtime:n.cachedAt};throw new i(`ENOENT`,`no such file or directory`,e)}throw new i(`EIO`,`da stat failed: ${c.status}`,e)}async mkdir(e){}async remove(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.transport({method:`DELETE`,path:this.toSourcePath(t)});if(n.status===404)throw new i(`ENOENT`,`no such file`,e);if(n.status===401||n.status===403)throw new i(`EACCES`,`da delete denied`,e);if(n.status>=400)throw new i(`EIO`,`da delete failed: ${n.status}`,e);await this.cache.invalidateBody(t);let r=t.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(r)}async refresh(e){this.assertOpen(`/`);let t={added:[],removed:[],changed:[],unchanged:0,errors:[]},n=[``];for(;n.length>0;){let e=n.pop();try{await this.refreshDir(e,t,n)}catch(n){t.errors.push({path:e,message:n instanceof Error?n.message:String(n)})}}return e?.bodies&&await this.refreshBodies(t),t}async classifyFile(e,t,n){let r=await this.cache.getBody(e);r?t&&r.etag!==t?(await this.cache.invalidateBody(e),n.changed.push(e)):n.unchanged++:n.added.push(e)}async refreshDir(e,t,n){let r=await this.transport({method:`GET`,path:this.toListPath(e)});if(r.status>=400){t.errors.push({path:e,message:`list failed: ${r.status}`});return}let i=await r.json(),a=[];for(let r of i)if(r.ext){let n=e?`${e}/${r.name}.${r.ext}`:`${r.name}.${r.ext}`;a.push({name:`${r.name}.${r.ext}`,kind:`file`,etag:r.etag,lastModified:r.lastModified}),await this.classifyFile(n,r.etag,t)}else a.push({name:r.name,kind:`directory`}),n.push(e?`${e}/${r.name}`:r.name);await this.cache.putListing(e,a)}async refreshBodies(e){for(let t of e.changed)try{await this.readFile(t)}catch(n){e.errors.push({path:t,message:n instanceof Error?n.message:String(n)})}}describe(){return{displayName:`${this.parsed.org}/${this.parsed.repo}${this.parsed.path?`/${this.parsed.path}`:``}`,source:this.source,profile:this.profile}}async close(){this.closed||=!0}};function E(e){let t=e.match(/^s3:\/\/([^/]+)(?:\/(.*))?$/);if(!t)throw Error(`invalid S3 source '${e}' — expected s3://bucket[/prefix]`);return{bucket:t[1],prefix:(t[2]??``).replace(/^\/+/,``).replace(/\/+$/,``)}}var D=26214400,O=class{kind=`s3`;source;profile;mountId;parsed;cache;maxBodyBytes;transport;closed=!1;constructor(e){this.source=e.source,this.profile=e.profile,this.mountId=e.mountId??crypto.randomUUID(),this.parsed=E(e.source),this.cache=e.cache,this.maxBodyBytes=e.maxBodyBytes??D,this.transport=e.signedFetch}assertOpen(e){if(this.closed)throw new i(`EBADF`,`mount closed`,e)}toMountRelative(e){return e.replace(/^\/+/,``)}toS3Key(e){let t=e.replace(/^\/+/,``).replace(/\/+$/,``);return[this.parsed.prefix,t].filter(e=>e.length>0).join(`/`)}toMountRelativeKey(e){return this.parsed.prefix?e.slice(this.parsed.prefix.length+1):e}async readFile(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n&&!this.cache.isStale(n.cachedAt))return n.body;let r={};n&&(r[`if-none-match`]=n.etag);let a=await this.transport({method:`GET`,bucket:this.parsed.bucket,key:this.toS3Key(t),headers:r});if(a.status===304&&n)return await this.cache.putBody(t,n.body,n.etag),n.body;if(a.status===404)throw await this.cache.invalidateBody(t),new i(`ENOENT`,`no such file`,e);if(a.status===401||a.status===403)throw new i(`EACCES`,`s3 access denied`,e);if(a.status>=400)throw new i(`EIO`,`s3 readFile failed: ${a.status}`,e);let o=a.headers.get(`content-length`),s=o?Number(o):void 0;if(s!==void 0&&s>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes (${s} > ${this.maxBodyBytes})`,e);let c=new Uint8Array(await a.arrayBuffer());if(c.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let l=a.headers.get(`etag`)??``;return await this.cache.putBody(t,c,l),c}async writeFile(e,t){this.assertOpen(e);let n=this.toMountRelative(e);if(t.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let r=await this.cache.getBody(n),a={"content-type":`application/octet-stream`,"content-length":String(t.byteLength)};r?a[`if-match`]=r.etag:a[`if-none-match`]=`*`;let o=()=>this.transport({method:`PUT`,bucket:this.parsed.bucket,key:this.toS3Key(n),headers:a,body:t}),s,c=1;try{s=await o()}catch{c=2,s=await o()}if(s.status===412){if(c===2){let r=await this.transport({method:`HEAD`,bucket:this.parsed.bucket,key:this.toS3Key(n)});if(r.status>=400)throw new i(`EIO`,`s3 reconcile HEAD failed: ${r.status}`,e);let a=r.headers.get(`etag`)??``;await this.cache.putBody(n,t,a);let o=n.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(o);return}await this.cache.invalidateBody(n);try{await this.readFile(e)}catch{}throw new i(`EBUSY`,`remote modified since last read — re-read and retry`,e)}if(s.status===401||s.status===403)throw new i(`EACCES`,`s3 write denied`,e);if(s.status>=400)throw new i(`EIO`,`s3 writeFile failed: ${s.status}`,e);let l=s.headers.get(`etag`)??``;await this.cache.putBody(n,t,l);let u=n.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(u)}async listObjectsV2(){let e=[],t;do{let n={"list-type":`2`};this.parsed.prefix&&(n.prefix=`${this.parsed.prefix}/`),t&&(n[`continuation-token`]=t);let r=await this.transport({method:`GET`,bucket:this.parsed.bucket,key:``,query:n});if(r.status>=400)throw new i(`EIO`,`s3 list failed: ${r.status}`,`/`);let a=await r.text(),o=this.parseListingXml(a);e.push(...o.contents),t=o.nextContinuationToken}while(t);return e}parseListingXml(e){let t=[];for(let n of e.matchAll(/<Contents>([\s\S]*?)<\/Contents>/g)){let e=n[1],r=e.match(/<Key>([^<]+)<\/Key>/)?.[1]??``,i=e.match(/<ETag>([^<]+)<\/ETag>/)?.[1]??``,a=e.match(/<Size>([^<]+)<\/Size>/)?.[1]??`0`,o=e.match(/<LastModified>([^<]+)<\/LastModified>/)?.[1]??``;t.push({key:r,etag:i,size:Number(a),lastModified:o?Date.parse(o):0})}return{contents:t,nextContinuationToken:e.match(/<IsTruncated>([^<]+)<\/IsTruncated>/)?.[1]===`true`?e.match(/<NextContinuationToken>([^<]+)<\/NextContinuationToken>/)?.[1]:void 0}}async readDir(e){this.assertOpen(e);let t=this.toMountRelative(e).replace(/\/+$/,``),n=await this.cache.getListing(t);if(n&&!this.cache.isStale(n.cachedAt))return n.entries;let r=await this.listObjectsV2(),i=this.groupByDir(r);for(let[e,t]of i)await this.cache.putListing(e,t);return i.get(t)??[]}groupByDir(e){let t=new Map,n=e=>(t.has(e)||t.set(e,[]),t.get(e));n(``);for(let t of e){let e=this.toMountRelativeKey(t.key).split(`/`),r=e.pop();n(e.join(`/`)).push({name:r,kind:`file`,size:t.size,etag:t.etag,lastModified:t.lastModified});let i=``;for(let t of e){let e=i;i=i?`${i}/${t}`:t;let r=n(e);r.find(e=>e.name===t&&e.kind===`directory`)||r.push({name:t,kind:`directory`}),n(i)}}return t}async stat(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n)return{kind:`file`,size:n.body.byteLength,mtime:n.cachedAt,etag:n.etag};let r=t.split(`/`),a=r.pop()??``,o=r.join(`/`),s=await this.cache.getListing(o);if(s&&!this.cache.isStale(s.cachedAt)){let t=s.entries.find(e=>e.name===a);if(t?.kind===`file`&&t.size!==void 0)return{kind:`file`,size:t.size,mtime:t.lastModified??s.cachedAt,etag:t.etag??``};if(t?.kind===`directory`)return{kind:`directory`,size:0,mtime:t.lastModified??s.cachedAt};if(!t)throw new i(`ENOENT`,`no such file or directory`,e)}let c=await this.transport({method:`HEAD`,bucket:this.parsed.bucket,key:this.toS3Key(t)});if(c.status===200){let e=Number(c.headers.get(`content-length`)??`0`),t=c.headers.get(`etag`)??``,n=c.headers.get(`last-modified`);return{kind:`file`,size:e,mtime:n?Date.parse(n):0,etag:t}}if(c.status===404){let n=await this.cache.getListing(t);if(n)return{kind:`directory`,size:0,mtime:n.cachedAt};throw new i(`ENOENT`,`no such file or directory`,e)}throw new i(`EIO`,`s3 stat failed: ${c.status}`,e)}async refresh(e){this.assertOpen(`/`);let t=await this.listObjectsV2(),n=new Set(t.map(e=>this.toMountRelativeKey(e.key))),r=new Map(t.map(e=>[this.toMountRelativeKey(e.key),e.etag])),i={added:[],removed:[],changed:[],unchanged:0,errors:[]};for(let e of n){let t=await this.cache.getBody(e),n=r.get(e);t?t.etag===n?i.unchanged++:(await this.cache.invalidateBody(e),i.changed.push(e)):i.added.push(e)}let a=this.groupByDir(t);for(let[e,t]of a)await this.cache.putListing(e,t);if(e?.bodies)for(let e of i.changed)try{await this.readFile(e)}catch(t){i.errors.push({path:e,message:t instanceof Error?t.message:String(t)})}return i}async mkdir(e){}async remove(e,t){this.assertOpen(e);let n=this.toMountRelative(e);if(t?.recursive)throw new i(`EINVAL`,`recursive remove not yet supported on S3`,e);let r=await this.transport({method:`DELETE`,bucket:this.parsed.bucket,key:this.toS3Key(n)});if(r.status===404)throw new i(`ENOENT`,`no such file`,e);if(r.status===401||r.status===403)throw new i(`EACCES`,`s3 delete denied`,e);if(r.status>=400)throw new i(`EIO`,`s3 delete failed: ${r.status}`,e);await this.cache.invalidateBody(n);let a=n.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(a)}describe(){return{displayName:this.parsed.prefix?`${this.parsed.bucket}/${this.parsed.prefix}`:this.parsed.bucket,source:this.source,profile:this.profile}}async close(){this.closed||=!0}},k=class extends Error{constructor(e){super(e),this.name=`ProfileNotConfiguredError`}};async function A(){let{getAccounts:t}=await e(async()=>{let{getAccounts:e}=await import(`./account-store-SI8RQbm0.js`).then(e=>e.r);return{getAccounts:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26])),n=t().find(e=>e.providerId===`adobe`);if(!n?.accessToken)throw new k(`No Adobe IMS account found. Log in via Settings → Providers → Adobe first.`);return{identity:`adobe-ims`,getBearerToken:async()=>n.accessToken}}var j=r,M=n,N=new Set([`invalid_profile`,`invalid_request`,`profile_not_configured`,`fetch_failed`,`internal`]),P=new Set([101,103,204,205,304]);function F(e){if(!e.ok)throw e.errorCode===`profile_not_configured`||e.errorCode===`invalid_profile`?new i(`EACCES`,e.error):e.errorCode===`invalid_request`?new i(`EINVAL`,e.error):e.errorCode===`fetch_failed`||e.errorCode===`internal`||N.has(String(e.errorCode))?new i(`EIO`,e.error):new i(`EINVAL`,`mount transport returned unrecognized errorCode '${e.errorCode}': ${e.error}`);let t;try{t=j(e.bodyBase64)}catch(e){throw new i(`EIO`,`mount transport: response body decode failed: ${e instanceof Error?e.message:String(e)}`)}let n=P.has(e.status)?null:t;return new Response(n,{status:e.status,headers:new Headers(e.headers)})}async function I(e){throw new i(`EIO`,`mount transport unavailable: setMountCapabilityBroker was never called for this float (composition bug — refusing to guess a transport for a privileged sign-and-forward request)`)}function L(e){return async t=>F(await I({backend:`s3`,envelope:{profile:e,method:t.method,bucket:t.bucket,key:t.key,query:t.query,headers:t.headers,bodyBase64:t.body?M(t.body):void 0}}))}function R(e){let t=e?.getImsToken??(async()=>(await A()).getBearerToken());return async e=>{let n;try{n=await t()}catch(e){throw new i(`EACCES`,`DA mount: ${e instanceof Error?e.message:String(e)}`)}return F(await I({backend:`da`,envelope:{imsToken:n,method:e.method,path:e.path,origin:e.origin,query:e.query,headers:e.headers,bodyBase64:e.body?M(e.body):void 0}}))}}export{p as AemMountBackend,T as DaMountBackend,a as RemoteMountCache,O as S3MountBackend,R as makeSignedFetchDa,L as makeSignedFetchS3};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/account-store-Bbb4tBjB.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/core-zz8rWM4c.js","assets/compat-qQM4gjF_.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/preload-helper-Czpn1I53.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-B-zmcypy.js","assets/libesm-BypnjKEL.js","assets/logger-DDBAeTLF.js","assets/proxied-fetch-W1rZTqEQ.js","assets/base64-ELzoYfwP.js","assets/fetch-body-1l9I58Vk.js","assets/api-endpoint-DuEQRZ4g.js","assets/runtime-env-Dlaokqg1.js","assets/secret-topology-fyLSbV8r.js","assets/float-topology-U8FF9pgZ.js","assets/secrets-bridge-client-9RRVsrGm.js","assets/port-bridge-client-BYQawsDH.js","assets/image-markers-q8JQTtid.js","assets/tool-ui-eSQ1g2I1.js","assets/providers-2pihfuXe.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-BeCSBUrZ.js","assets/bedrock-camp-extra-models-WTCIjj5a.js","assets/claude-model-version-DZmbk9E2.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./preload-helper-Czpn1I53.js";import{n as t}from"./mime-types-D0xZwlMO.js";import{r as n,t as r}from"./base64-ELzoYfwP.js";import{t as i}from"./types-D8gIX-W-.js";import"./mount-table-store-dY2IfQ5S.js";import"./fs-Ce8P6WrG.js";import{t as a}from"./remote-cache-3KNT1gsp.js";var o=`https://api.aem.live`,s=`application/folder`,c=5242880;function l(e){let t=e.match(/^aem:\/\/([^/]+)\/([^/]+)(?:\/(.*))?$/);if(!t)throw Error(`invalid AEM source '${e}' — expected aem://org/site[/path]`);return{org:t[1],site:t[2],path:(t[3]??``).replace(/^\/+/,``).replace(/\/+$/,``)}}function u(e){if(!e)return``;let t=Date.parse(e);return Number.isNaN(t)?``:String(t)}function d(e){let t=Date.parse(e??``);return Number.isNaN(t)?0:t}function f(e){return e.map(e=>e[`content-type`]===s||e.name.endsWith(`/`)?{name:e.name.replace(/\/+$/,``),kind:`directory`}:{name:e.name,kind:`file`,size:e.size,etag:u(e[`last-modified`]),lastModified:d(e[`last-modified`])})}var p=class{kind=`aem`;source;profile;mountId;parsed;cache;maxBodyBytes;transport;closed=!1;constructor(e){this.source=e.source,this.profile=e.profile,this.mountId=e.mountId??crypto.randomUUID(),this.parsed=l(e.source),this.cache=e.cache,this.maxBodyBytes=e.maxBodyBytes??c,this.transport=e.signedFetch}assertOpen(e){if(this.closed)throw new i(`EBADF`,`mount closed`,e)}toMountRelative(e){return e.replace(/^\/+/,``)}toSourcePath(e){let t=e.replace(/^\/+/,``).replace(/\/+$/,``),n=[this.parsed.path,t].filter(e=>e.length>0).join(`/`),r=`/${this.parsed.org}/sites/${this.parsed.site}/source`;return n?`${r}/${n}`:r}toListPath(e){return`${this.toSourcePath(e)}/`}request(e,t,n){return this.transport({method:e,path:t,origin:o,headers:n?.headers,body:n?.body})}async readFile(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n&&!this.cache.isStale(n.cachedAt))return n.body;let r=await this.request(`GET`,this.toSourcePath(t));if(r.status===404)throw await this.cache.invalidateBody(t),new i(`ENOENT`,`no such file`,e);if(r.status===401||r.status===403)throw new i(`EACCES`,`aem access denied`,e);if(r.status>=400)throw new i(`EIO`,`aem readFile failed: ${r.status}`,e);let a=new Uint8Array(await r.arrayBuffer());if(a.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);return await this.cache.putBody(t,a,u(r.headers.get(`last-modified`))),a}async assertUnchanged(e,t,n){if(!n)return;let r=await this.request(`HEAD`,this.toSourcePath(t));if(r.status===404)return;if(r.status>=400)throw new i(`EIO`,`aem precondition HEAD failed: ${r.status}`,e);let a=u(r.headers.get(`last-modified`));if(a&&a!==n)throw await this.cache.invalidateBody(t),new i(`EBUSY`,`remote modified since last read — re-read and retry`,e)}async writeFile(e,t){if(this.assertOpen(e),t.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let n=this.toMountRelative(e),r=await this.cache.getBody(n);await this.assertUnchanged(e,n,r?.etag??``);let a=await this.request(`PUT`,this.toSourcePath(n),{body:t});if(a.status===401||a.status===403)throw new i(`EACCES`,`aem write denied`,e);if(a.status>=400)throw new i(`EIO`,`aem writeFile failed: ${a.status}`,e);await this.cache.invalidateBody(n);let o=n.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(o)}async readDir(e){this.assertOpen(e);let t=this.toMountRelative(e).replace(/\/+$/,``),n=await this.cache.getListing(t);if(n&&!this.cache.isStale(n.cachedAt))return n.entries;let r=await this.request(`GET`,this.toListPath(t));if(r.status===404)throw new i(`ENOENT`,`no such directory`,e);if(r.status===401||r.status===403)throw new i(`EACCES`,`aem access denied`,e);if(r.status>=400)throw new i(`EIO`,`aem list failed: ${r.status}`,e);let a=f(await r.json());return await this.cache.putListing(t,a),a}async stat(e){this.assertOpen(e);let t=this.toMountRelative(e);if(t===``)return{kind:`directory`,size:0,mtime:0};let n=await this.cache.getBody(t);if(n)return{kind:`file`,size:n.size,mtime:n.cachedAt,etag:n.etag};let r=t.split(`/`),a=r.pop()??``,o=r.join(`/`),s=await this.cache.getListing(o),c=(s&&!this.cache.isStale(s.cachedAt)?s.entries:await this.readDirQuietly(o))?.find(e=>e.name===a);if(!c)throw new i(`ENOENT`,`no such file or directory`,e);return c.kind===`directory`?{kind:`directory`,size:0,mtime:c.lastModified??0}:{kind:`file`,size:c.size??0,mtime:c.lastModified??0,etag:c.etag??``}}async readDirQuietly(e){try{return await this.readDir(e)}catch{return null}}async mkdir(e){}async remove(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.request(`DELETE`,this.toSourcePath(t));if(n.status===404)throw new i(`ENOENT`,`no such file`,e);if(n.status===401||n.status===403)throw new i(`EACCES`,`aem delete denied`,e);if(n.status>=400)throw new i(`EIO`,`aem delete failed: ${n.status}`,e);await this.cache.invalidateBody(t);let r=t.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(r)}async refresh(e){this.assertOpen(`/`);let t={added:[],removed:[],changed:[],unchanged:0,errors:[]},n=[``];for(;n.length>0;){let e=n.pop();try{await this.refreshDir(e,t,n)}catch(n){t.errors.push({path:e,message:n instanceof Error?n.message:String(n)})}}return e?.bodies&&await this.refreshBodies(t),t}async classifyFile(e,t,n){let r=await this.cache.getBody(e);r?t&&r.etag!==t?(await this.cache.invalidateBody(e),n.changed.push(e)):n.unchanged++:n.added.push(e)}async refreshDir(e,t,n){let r=await this.request(`GET`,this.toListPath(e));if(r.status===404){await this.cache.putListing(e,[]);return}if(r.status>=400){t.errors.push({path:e,message:`list failed: ${r.status}`});return}let i=f(await r.json());for(let r of i){let i=e?`${e}/${r.name}`:r.name;r.kind===`directory`?n.push(i):await this.classifyFile(i,r.etag??``,t)}await this.cache.putListing(e,i)}async refreshBodies(e){for(let t of e.changed)try{await this.readFile(t)}catch(n){e.errors.push({path:t,message:n instanceof Error?n.message:String(n)})}}describe(){return{displayName:`${this.parsed.org}/${this.parsed.site}${this.parsed.path?`/${this.parsed.path}`:``}`,source:this.source,profile:this.profile}}async close(){this.closed||=!0}},m=`\r
|
|
3
|
+
`;function h(){let e=new Uint8Array(16);if(typeof crypto<`u`&&typeof crypto.getRandomValues==`function`)crypto.getRandomValues(e);else for(let t=0;t<e.length;t+=1)e[t]=Math.floor(Math.random()*256);let t=``;for(let n of e)t+=n.toString(16).padStart(2,`0`);return`----SliccFormBoundary${t}`}function g(e,t=h()){let n=new TextEncoder,r=[];for(let i of e){let e=v(_(i.name));if(`file`in i){let a=v(i.file.filename),o=y(i.file.contentType)||`application/octet-stream`;r.push(n.encode(`--${t}${m}Content-Disposition: form-data; name="${e}"; filename="${a}"${m}Content-Type: ${o}${m}${m}`)),r.push(i.file.bytes),r.push(n.encode(m))}else r.push(n.encode(`--${t}${m}Content-Disposition: form-data; name="${e}"${m}${m}${_(i.value)}${m}`))}return r.push(n.encode(`--${t}--${m}`)),{bytes:b(r),contentType:`multipart/form-data; boundary=${t}`,boundary:t}}function _(e){return e.replace(/\r\n|\r|\n/g,m)}function v(e){return e.replace(/\r/g,`%0D`).replace(/\n/g,`%0A`).replace(/"/g,`%22`)}function y(e){return(e??``).replace(/[\r\n]/g,``).trim()}function b(e){let t=0;for(let n of e)t+=n.byteLength;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.byteLength;return n}function x(e,t,n){let r=g([{name:`data`,file:{bytes:n,filename:e,contentType:t}}]);return{contentType:r.contentType,body:r.bytes}}function S(e){return e.split(`/`).pop()||`data`}function C(e){let t=e.match(/^da:\/\/([^/]+)\/([^/]+)(?:\/(.*))?$/);if(!t)throw Error(`invalid DA source '${e}' — expected da://org/repo[/path]`);return{org:t[1],repo:t[2],path:(t[3]??``).replace(/^\/+/,``).replace(/\/+$/,``)}}var w=5242880,T=class{kind=`da`;source;profile;mountId;parsed;cache;maxBodyBytes;transport;closed=!1;constructor(e){this.source=e.source,this.profile=e.profile,this.mountId=e.mountId??crypto.randomUUID(),this.parsed=C(e.source),this.cache=e.cache,this.maxBodyBytes=e.maxBodyBytes??w,this.transport=e.signedFetch}assertOpen(e){if(this.closed)throw new i(`EBADF`,`mount closed`,e)}toMountRelative(e){return e.replace(/^\/+/,``)}toSourcePath(e){let t=e.replace(/^\/+/,``).replace(/\/+$/,``),n=[this.parsed.path,t].filter(e=>e.length>0).join(`/`);return`/source/${this.parsed.org}/${this.parsed.repo}${n?`/${n}`:``}`}toListPath(e){let t=e.replace(/^\/+/,``).replace(/\/+$/,``),n=[this.parsed.path,t].filter(e=>e.length>0).join(`/`);return`/list/${this.parsed.org}/${this.parsed.repo}${n?`/${n}`:``}`}async readFile(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n&&!this.cache.isStale(n.cachedAt))return n.body;let r={};n&&(r[`if-none-match`]=n.etag);let a=await this.transport({method:`GET`,path:this.toSourcePath(t),headers:r});if(a.status===304&&n)return await this.cache.putBody(t,n.body,n.etag),n.body;if(a.status===404)throw await this.cache.invalidateBody(t),new i(`ENOENT`,`no such file`,e);if(a.status===401||a.status===403)throw new i(`EACCES`,`da access denied`,e);if(a.status>=400)throw new i(`EIO`,`da readFile failed: ${a.status}`,e);let o=a.headers.get(`content-length`),s=o?Number(o):void 0;if(s!==void 0&&s>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let c=new Uint8Array(await a.arrayBuffer());if(c.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let l=a.headers.get(`etag`)??``,u=l.startsWith(`W/`)?l.slice(2):l;return await this.cache.putBody(t,c,u),c}async writeFile(e,n){if(this.assertOpen(e),n.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let r=this.toMountRelative(e),a=await this.cache.getBody(r),o=x(S(e),t(e),n),s={"content-type":o.contentType,"content-length":String(o.body.byteLength)};a?.etag?s[`if-match`]=a.etag.startsWith(`W/`)?a.etag.slice(2):a.etag:a||(s[`if-none-match`]=`*`);let c=()=>this.transport({method:`POST`,path:this.toSourcePath(r),headers:s,body:o.body}),l,u=1;try{l=await c()}catch{u=2,l=await c()}if(l.status===412){if(u===2){let t=await this.transport({method:`HEAD`,path:this.toSourcePath(r)});if(t.status>=400)throw new i(`EIO`,`da reconcile HEAD failed: ${t.status}`,e);let a=t.headers.get(`etag`)??``;await this.cache.putBody(r,n,a);let o=r.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(o);return}await this.cache.invalidateBody(r);try{await this.readFile(e)}catch{}throw new i(`EBUSY`,`remote modified since last read — re-read and retry`,e)}if(l.status===401||l.status===403)throw new i(`EACCES`,`da write denied`,e);if(l.status>=400)throw new i(`EIO`,`da writeFile failed: ${l.status}`,e);let d=l.headers.get(`etag`)??``;await this.cache.putBody(r,n,d);let f=r.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(f)}async readDir(e){this.assertOpen(e);let t=this.toMountRelative(e).replace(/\/+$/,``),n=await this.cache.getListing(t);if(n&&!this.cache.isStale(n.cachedAt))return n.entries;let r=await this.transport({method:`GET`,path:this.toListPath(t)});if(r.status===404)throw new i(`ENOENT`,`no such directory`,e);if(r.status>=400)throw new i(`EIO`,`da list failed: ${r.status}`,e);let a=(await r.json()).map(e=>e.ext?{name:`${e.name}.${e.ext}`,kind:`file`,etag:e.etag,lastModified:e.lastModified}:{name:e.name,kind:`directory`,lastModified:e.lastModified});return await this.cache.putListing(t,a),a}async stat(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n)return{kind:`file`,size:n.size,mtime:n.cachedAt,etag:n.etag};let r=t.split(`/`),a=r.pop()??``,o=r.join(`/`),s=await this.cache.getListing(o);if(s&&!this.cache.isStale(s.cachedAt)){let t=s.entries.find(e=>e.name===a);if(t?.kind===`file`&&t.size!==void 0)return{kind:`file`,size:t.size,mtime:t.lastModified??s.cachedAt,etag:t.etag??``};if(t?.kind===`directory`)return{kind:`directory`,size:0,mtime:t.lastModified??s.cachedAt};if(!t)throw new i(`ENOENT`,`no such file or directory`,e)}let c=await this.transport({method:`HEAD`,path:this.toSourcePath(t)});if(c.status===200){let e=Number(c.headers.get(`content-length`)??`0`),t=c.headers.get(`etag`)??``,n=c.headers.get(`last-modified`),r=n?Date.parse(n):0;if(s){let n=s.entries.map(n=>n.name===a&&n.kind===`file`?{...n,size:e,etag:t,lastModified:r}:n);await this.cache.putListing(o,n)}return{kind:`file`,size:e,mtime:r,etag:t}}if(c.status===404){let n=await this.cache.getListing(t);if(n)return{kind:`directory`,size:0,mtime:n.cachedAt};throw new i(`ENOENT`,`no such file or directory`,e)}throw new i(`EIO`,`da stat failed: ${c.status}`,e)}async mkdir(e){}async remove(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.transport({method:`DELETE`,path:this.toSourcePath(t)});if(n.status===404)throw new i(`ENOENT`,`no such file`,e);if(n.status===401||n.status===403)throw new i(`EACCES`,`da delete denied`,e);if(n.status>=400)throw new i(`EIO`,`da delete failed: ${n.status}`,e);await this.cache.invalidateBody(t);let r=t.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(r)}async refresh(e){this.assertOpen(`/`);let t={added:[],removed:[],changed:[],unchanged:0,errors:[]},n=[``];for(;n.length>0;){let e=n.pop();try{await this.refreshDir(e,t,n)}catch(n){t.errors.push({path:e,message:n instanceof Error?n.message:String(n)})}}return e?.bodies&&await this.refreshBodies(t),t}async classifyFile(e,t,n){let r=await this.cache.getBody(e);r?t&&r.etag!==t?(await this.cache.invalidateBody(e),n.changed.push(e)):n.unchanged++:n.added.push(e)}async refreshDir(e,t,n){let r=await this.transport({method:`GET`,path:this.toListPath(e)});if(r.status>=400){t.errors.push({path:e,message:`list failed: ${r.status}`});return}let i=await r.json(),a=[];for(let r of i)if(r.ext){let n=e?`${e}/${r.name}.${r.ext}`:`${r.name}.${r.ext}`;a.push({name:`${r.name}.${r.ext}`,kind:`file`,etag:r.etag,lastModified:r.lastModified}),await this.classifyFile(n,r.etag,t)}else a.push({name:r.name,kind:`directory`}),n.push(e?`${e}/${r.name}`:r.name);await this.cache.putListing(e,a)}async refreshBodies(e){for(let t of e.changed)try{await this.readFile(t)}catch(n){e.errors.push({path:t,message:n instanceof Error?n.message:String(n)})}}describe(){return{displayName:`${this.parsed.org}/${this.parsed.repo}${this.parsed.path?`/${this.parsed.path}`:``}`,source:this.source,profile:this.profile}}async close(){this.closed||=!0}};function E(e){let t=e.match(/^s3:\/\/([^/]+)(?:\/(.*))?$/);if(!t)throw Error(`invalid S3 source '${e}' — expected s3://bucket[/prefix]`);return{bucket:t[1],prefix:(t[2]??``).replace(/^\/+/,``).replace(/\/+$/,``)}}var D=26214400,O=class{kind=`s3`;source;profile;mountId;parsed;cache;maxBodyBytes;transport;closed=!1;constructor(e){this.source=e.source,this.profile=e.profile,this.mountId=e.mountId??crypto.randomUUID(),this.parsed=E(e.source),this.cache=e.cache,this.maxBodyBytes=e.maxBodyBytes??D,this.transport=e.signedFetch}assertOpen(e){if(this.closed)throw new i(`EBADF`,`mount closed`,e)}toMountRelative(e){return e.replace(/^\/+/,``)}toS3Key(e){let t=e.replace(/^\/+/,``).replace(/\/+$/,``);return[this.parsed.prefix,t].filter(e=>e.length>0).join(`/`)}toMountRelativeKey(e){return this.parsed.prefix?e.slice(this.parsed.prefix.length+1):e}async readFile(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n&&!this.cache.isStale(n.cachedAt))return n.body;let r={};n&&(r[`if-none-match`]=n.etag);let a=await this.transport({method:`GET`,bucket:this.parsed.bucket,key:this.toS3Key(t),headers:r});if(a.status===304&&n)return await this.cache.putBody(t,n.body,n.etag),n.body;if(a.status===404)throw await this.cache.invalidateBody(t),new i(`ENOENT`,`no such file`,e);if(a.status===401||a.status===403)throw new i(`EACCES`,`s3 access denied`,e);if(a.status>=400)throw new i(`EIO`,`s3 readFile failed: ${a.status}`,e);let o=a.headers.get(`content-length`),s=o?Number(o):void 0;if(s!==void 0&&s>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes (${s} > ${this.maxBodyBytes})`,e);let c=new Uint8Array(await a.arrayBuffer());if(c.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let l=a.headers.get(`etag`)??``;return await this.cache.putBody(t,c,l),c}async writeFile(e,t){this.assertOpen(e);let n=this.toMountRelative(e);if(t.byteLength>this.maxBodyBytes)throw new i(`EFBIG`,`body exceeds maxBodyBytes`,e);let r=await this.cache.getBody(n),a={"content-type":`application/octet-stream`,"content-length":String(t.byteLength)};r?a[`if-match`]=r.etag:a[`if-none-match`]=`*`;let o=()=>this.transport({method:`PUT`,bucket:this.parsed.bucket,key:this.toS3Key(n),headers:a,body:t}),s,c=1;try{s=await o()}catch{c=2,s=await o()}if(s.status===412){if(c===2){let r=await this.transport({method:`HEAD`,bucket:this.parsed.bucket,key:this.toS3Key(n)});if(r.status>=400)throw new i(`EIO`,`s3 reconcile HEAD failed: ${r.status}`,e);let a=r.headers.get(`etag`)??``;await this.cache.putBody(n,t,a);let o=n.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(o);return}await this.cache.invalidateBody(n);try{await this.readFile(e)}catch{}throw new i(`EBUSY`,`remote modified since last read — re-read and retry`,e)}if(s.status===401||s.status===403)throw new i(`EACCES`,`s3 write denied`,e);if(s.status>=400)throw new i(`EIO`,`s3 writeFile failed: ${s.status}`,e);let l=s.headers.get(`etag`)??``;await this.cache.putBody(n,t,l);let u=n.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(u)}async listObjectsV2(){let e=[],t;do{let n={"list-type":`2`};this.parsed.prefix&&(n.prefix=`${this.parsed.prefix}/`),t&&(n[`continuation-token`]=t);let r=await this.transport({method:`GET`,bucket:this.parsed.bucket,key:``,query:n});if(r.status>=400)throw new i(`EIO`,`s3 list failed: ${r.status}`,`/`);let a=await r.text(),o=this.parseListingXml(a);e.push(...o.contents),t=o.nextContinuationToken}while(t);return e}parseListingXml(e){let t=[];for(let n of e.matchAll(/<Contents>([\s\S]*?)<\/Contents>/g)){let e=n[1],r=e.match(/<Key>([^<]+)<\/Key>/)?.[1]??``,i=e.match(/<ETag>([^<]+)<\/ETag>/)?.[1]??``,a=e.match(/<Size>([^<]+)<\/Size>/)?.[1]??`0`,o=e.match(/<LastModified>([^<]+)<\/LastModified>/)?.[1]??``;t.push({key:r,etag:i,size:Number(a),lastModified:o?Date.parse(o):0})}return{contents:t,nextContinuationToken:e.match(/<IsTruncated>([^<]+)<\/IsTruncated>/)?.[1]===`true`?e.match(/<NextContinuationToken>([^<]+)<\/NextContinuationToken>/)?.[1]:void 0}}async readDir(e){this.assertOpen(e);let t=this.toMountRelative(e).replace(/\/+$/,``),n=await this.cache.getListing(t);if(n&&!this.cache.isStale(n.cachedAt))return n.entries;let r=await this.listObjectsV2(),i=this.groupByDir(r);for(let[e,t]of i)await this.cache.putListing(e,t);return i.get(t)??[]}groupByDir(e){let t=new Map,n=e=>(t.has(e)||t.set(e,[]),t.get(e));n(``);for(let t of e){let e=this.toMountRelativeKey(t.key).split(`/`),r=e.pop();n(e.join(`/`)).push({name:r,kind:`file`,size:t.size,etag:t.etag,lastModified:t.lastModified});let i=``;for(let t of e){let e=i;i=i?`${i}/${t}`:t;let r=n(e);r.find(e=>e.name===t&&e.kind===`directory`)||r.push({name:t,kind:`directory`}),n(i)}}return t}async stat(e){this.assertOpen(e);let t=this.toMountRelative(e),n=await this.cache.getBody(t);if(n)return{kind:`file`,size:n.body.byteLength,mtime:n.cachedAt,etag:n.etag};let r=t.split(`/`),a=r.pop()??``,o=r.join(`/`),s=await this.cache.getListing(o);if(s&&!this.cache.isStale(s.cachedAt)){let t=s.entries.find(e=>e.name===a);if(t?.kind===`file`&&t.size!==void 0)return{kind:`file`,size:t.size,mtime:t.lastModified??s.cachedAt,etag:t.etag??``};if(t?.kind===`directory`)return{kind:`directory`,size:0,mtime:t.lastModified??s.cachedAt};if(!t)throw new i(`ENOENT`,`no such file or directory`,e)}let c=await this.transport({method:`HEAD`,bucket:this.parsed.bucket,key:this.toS3Key(t)});if(c.status===200){let e=Number(c.headers.get(`content-length`)??`0`),t=c.headers.get(`etag`)??``,n=c.headers.get(`last-modified`);return{kind:`file`,size:e,mtime:n?Date.parse(n):0,etag:t}}if(c.status===404){let n=await this.cache.getListing(t);if(n)return{kind:`directory`,size:0,mtime:n.cachedAt};throw new i(`ENOENT`,`no such file or directory`,e)}throw new i(`EIO`,`s3 stat failed: ${c.status}`,e)}async refresh(e){this.assertOpen(`/`);let t=await this.listObjectsV2(),n=new Set(t.map(e=>this.toMountRelativeKey(e.key))),r=new Map(t.map(e=>[this.toMountRelativeKey(e.key),e.etag])),i={added:[],removed:[],changed:[],unchanged:0,errors:[]};for(let e of n){let t=await this.cache.getBody(e),n=r.get(e);t?t.etag===n?i.unchanged++:(await this.cache.invalidateBody(e),i.changed.push(e)):i.added.push(e)}let a=this.groupByDir(t);for(let[e,t]of a)await this.cache.putListing(e,t);if(e?.bodies)for(let e of i.changed)try{await this.readFile(e)}catch(t){i.errors.push({path:e,message:t instanceof Error?t.message:String(t)})}return i}async mkdir(e){}async remove(e,t){this.assertOpen(e);let n=this.toMountRelative(e);if(t?.recursive)throw new i(`EINVAL`,`recursive remove not yet supported on S3`,e);let r=await this.transport({method:`DELETE`,bucket:this.parsed.bucket,key:this.toS3Key(n)});if(r.status===404)throw new i(`ENOENT`,`no such file`,e);if(r.status===401||r.status===403)throw new i(`EACCES`,`s3 delete denied`,e);if(r.status>=400)throw new i(`EIO`,`s3 delete failed: ${r.status}`,e);await this.cache.invalidateBody(n);let a=n.split(`/`).slice(0,-1).join(`/`);await this.cache.invalidateListing(a)}describe(){return{displayName:this.parsed.prefix?`${this.parsed.bucket}/${this.parsed.prefix}`:this.parsed.bucket,source:this.source,profile:this.profile}}async close(){this.closed||=!0}},k=class extends Error{constructor(e){super(e),this.name=`ProfileNotConfiguredError`}};async function A(){let{getAccounts:t}=await e(async()=>{let{getAccounts:e}=await import(`./account-store-Bbb4tBjB.js`).then(e=>e.r);return{getAccounts:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27])),n=t().find(e=>e.providerId===`adobe`);if(!n?.accessToken)throw new k(`No Adobe IMS account found. Log in via Settings → Providers → Adobe first.`);return{identity:`adobe-ims`,getBearerToken:async()=>n.accessToken}}var j=r,M=n,N=new Set([`invalid_profile`,`invalid_request`,`profile_not_configured`,`fetch_failed`,`internal`]),P=new Set([101,103,204,205,304]);function F(e){if(!e.ok)throw e.errorCode===`profile_not_configured`||e.errorCode===`invalid_profile`?new i(`EACCES`,e.error):e.errorCode===`invalid_request`?new i(`EINVAL`,e.error):e.errorCode===`fetch_failed`||e.errorCode===`internal`||N.has(String(e.errorCode))?new i(`EIO`,e.error):new i(`EINVAL`,`mount transport returned unrecognized errorCode '${e.errorCode}': ${e.error}`);let t;try{t=j(e.bodyBase64)}catch(e){throw new i(`EIO`,`mount transport: response body decode failed: ${e instanceof Error?e.message:String(e)}`)}let n=P.has(e.status)?null:t;return new Response(n,{status:e.status,headers:new Headers(e.headers)})}async function I(e){throw new i(`EIO`,`mount transport unavailable: setMountCapabilityBroker was never called for this float (composition bug — refusing to guess a transport for a privileged sign-and-forward request)`)}function L(e){return async t=>F(await I({backend:`s3`,envelope:{profile:e,method:t.method,bucket:t.bucket,key:t.key,query:t.query,headers:t.headers,bodyBase64:t.body?M(t.body):void 0}}))}function R(e){let t=e?.getImsToken??(async()=>(await A()).getBearerToken());return async e=>{let n;try{n=await t()}catch(e){throw new i(`EACCES`,`DA mount: ${e instanceof Error?e.message:String(e)}`)}return F(await I({backend:`da`,envelope:{imsToken:n,method:e.method,path:e.path,origin:e.origin,query:e.query,headers:e.headers,bodyBase64:e.body?M(e.body):void 0}}))}}export{p as AemMountBackend,T as DaMountBackend,a as RemoteMountCache,O as S3MountBackend,R as makeSignedFetchDa,L as makeSignedFetchS3};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{a as t,i as n,n as r,s as i,t as a}from"./signed-fetch-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{a as t,i as n,n as r,s as i,t as a}from"./signed-fetch-Cv-pIQgJ.js";import{t as o}from"./remote-cache-BE5T1-53.js";var s=e({AEM_SOURCE_BUS_ORIGIN:()=>AEM_SOURCE_BUS_ORIGIN,AemMountBackend:()=>i,DaMountBackend:()=>t,RemoteMountCache:()=>o,S3MountBackend:()=>n,makeSignedFetchDa:()=>a,makeSignedFetchS3:()=>r});export{s as t};
|