sliccy 6.164.1 → 6.166.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node-server/_shared/agent-wire-types.d.ts +7 -1
- package/dist/node-server/_shared/agent-wire-types.d.ts.map +1 -1
- package/dist/node-server/_shared/computer-protocol.d.ts +108 -0
- package/dist/node-server/_shared/computer-protocol.d.ts.map +1 -0
- package/dist/node-server/_shared/computer-protocol.js +10 -0
- package/dist/node-server/_shared/computer-protocol.js.map +1 -0
- package/dist/node-server/_shared/index.d.ts +1 -0
- package/dist/node-server/_shared/index.d.ts.map +1 -1
- package/dist/node-server/_shared/index.js +1 -0
- package/dist/node-server/_shared/index.js.map +1 -1
- package/dist/ui/.vite/manifest.json +184 -174
- package/dist/ui/assets/{SKILL-C8DJkgFD.js → SKILL-BGEZa-y0.js} +1 -1
- package/dist/ui/assets/SKILL-DB5CVwyu.js +1 -0
- package/dist/ui/assets/SKILL-DEFDsScb.js +1 -0
- package/dist/ui/assets/SKILL-DZoCcID_.js +1 -0
- package/dist/ui/assets/{SKILL-BXSAhY0E.js → SKILL-cOU0zXaK.js} +3 -0
- package/dist/ui/assets/__vite-browser-external-C-cVeSv_.js +1 -0
- package/dist/ui/assets/{account-store-CScbFg3i.js → account-store-BEqmysw9.js} +1 -1
- package/dist/ui/assets/{account-store-DEob4Tob.js → account-store-C35GYvum.js} +1 -1
- package/dist/ui/assets/{adobe-CgamcTLU.js → adobe-BDH5oLAN.js} +1 -1
- package/dist/ui/assets/adobe-BcTGFCnQ.js +1 -0
- package/dist/ui/assets/{agent-panels-XcqgFmF4.js → agent-panels-DvqNnkLk.js} +1 -1
- package/dist/ui/assets/almost-bash-shell-headless-DqTtE9CM.js +3500 -0
- package/dist/ui/assets/{apply-layout-BDanZxtJ.js → apply-layout-CjYRGs37.js} +1 -1
- package/dist/ui/assets/{approver-agent-CCkU0PVa.js → approver-agent-CvnFt_s6.js} +1 -1
- package/dist/ui/assets/{apps-CU2dHbHf.js → apps-dzoLZ_5W.js} +1 -1
- package/dist/ui/assets/{azure-openai-kjz9Dci1.js → azure-openai-BffwoCtp.js} +1 -1
- package/dist/ui/assets/{azure-openai-Cl5VKD9d.js → azure-openai-DKGdcr4S.js} +1 -1
- package/dist/ui/assets/{backend-hostfs-DU0NS-tW.js → backend-hostfs-CWIlIhve.js} +1 -1
- package/dist/ui/assets/bridge-protocol-31SWTdS5.js +1 -0
- package/dist/ui/assets/{browser-fOe3v0iv.js → browser-eoO4vY7w.js} +1 -1
- package/dist/ui/assets/buffer-polyfill-BccMjOKj.js +1 -0
- package/dist/ui/assets/{cdp-Cry6h07Z.js → cdp-DXT6yEL1.js} +1 -1
- package/dist/ui/assets/{cerebras-DrMQuNWj.js → cerebras-BF5efkRL.js} +1 -1
- package/dist/ui/assets/{cerebras-CWXTOiZB.js → cerebras-By0l7t0i.js} +1 -1
- package/dist/ui/assets/{composer-speech-HE7hDylv.js → composer-speech-DIEePbQC.js} +1 -1
- package/dist/ui/assets/{connect-surface-DTj_-b2c.js → connect-surface-DBqs7oHf.js} +1 -1
- package/dist/ui/assets/{cost-command-DlIH8zCh.js → cost-command-BULzLcvz.js} +1 -1
- package/dist/ui/assets/descriptor-S4Jug1iP.js +1 -0
- package/dist/ui/assets/directed-approval-D1lGElvD.js +1 -0
- package/dist/ui/assets/engine-B-OPe78i.js +1 -0
- package/dist/ui/assets/{ensure-speech-assets-Bdq2ASEA.js → ensure-speech-assets-BJXemBO4.js} +1 -1
- package/dist/ui/assets/esp8266-l8ELjmQJ.js +1 -0
- package/dist/ui/assets/esptool-operations-h8-8jVn_.js +13 -0
- package/dist/ui/assets/fake-computer-1f2_4vxY.js +65 -0
- package/dist/ui/assets/{frozen-archive-writer-B1ANvJgT.js → frozen-archive-writer-DYPhPMg7.js} +2 -2
- package/dist/ui/assets/{fs-Dlit1SL1.js → fs-BapOupIM.js} +2 -2
- package/dist/ui/assets/{fs-DZGgOIET.js → fs-CBH-hQcI.js} +1 -1
- package/dist/ui/assets/gelatiere-store-C2u47uk0.js +1 -0
- package/dist/ui/assets/gelatiere-unit-wvDEO7gH.js +1 -0
- package/dist/ui/assets/{github-C5AdaH2F.js → github-Bx7_6LBm.js} +2 -2
- package/dist/ui/assets/{github-CGPZBKqk.js → github-Db015Tee.js} +1 -1
- package/dist/ui/assets/{github-auth-BEjdODKn.js → github-auth-DtKS6UIX.js} +1 -1
- package/dist/ui/assets/{github-copilot-D5K0xdpB.js → github-copilot-CtOjxhqK.js} +1 -1
- package/dist/ui/assets/{github-copilot-6b_0-c1B.js → github-copilot-eCfmryv6.js} +1 -1
- package/dist/ui/assets/{github-install-DLv9ZHaT.js → github-install-B6W4-xcc.js} +1 -1
- package/dist/ui/assets/{github-zip-pP3IhiBQ.js → github-zip-Bv1smNmy.js} +1 -1
- package/dist/ui/assets/handoff-link-B3It6xQY.js +1 -0
- package/dist/ui/assets/{hear-CybMJQVi.js → hear-BZHckZJM.js} +1 -1
- package/dist/ui/assets/{help-C1nN0w8V.js → help-BU2Hjl0P.js} +1 -1
- package/dist/ui/assets/host-BQ2qKD-D.js +1 -0
- package/dist/ui/assets/{installer-Chacgw8i.js → installer-BbtH3u7z.js} +1 -1
- package/dist/ui/assets/js-realm-worker-BT3mfq3w.js +50 -0
- package/dist/ui/assets/jsh-CrSWPG4t.js +1 -0
- package/dist/ui/assets/jsh-discovery-D3Gk1cKA.js +1 -0
- package/dist/ui/assets/jsh-executor-BWlgcE2N.js +18 -0
- package/dist/ui/assets/jsh-runtime-extensions-BnLXkzqP.js +1 -0
- package/dist/ui/assets/just-bash-compat-B-SPHuh_.js +1 -0
- package/dist/ui/assets/kernel-worker-Dseu067f.js +1185 -0
- package/dist/ui/assets/{key-GVxFyssW.js → key-6HWbWSGF.js} +1 -1
- package/dist/ui/assets/keys-n5_C9sHW.js +1 -0
- package/dist/ui/assets/lick-urls-DdKPDlgq.js +1 -0
- package/dist/ui/assets/{lick-ws-bridge-BMov8z0m.js → lick-ws-bridge-Cc9sToY7.js} +1 -1
- package/dist/ui/assets/lick-ws-bridge-ChigxI36.js +1 -0
- package/dist/ui/assets/live-session-snapshot-B70raB09.js +1 -0
- package/dist/ui/assets/{local-llm-B7zAVGSm.js → local-llm-Dcp5IIP-.js} +1 -1
- package/dist/ui/assets/{local-llm-ByCXv2P-.js → local-llm-DpSg-Oe3.js} +1 -1
- package/dist/ui/assets/{main-yKaIA_zV.js → main-CfF8CFBr.js} +3 -3
- package/dist/ui/assets/{main-cherry-BNWE5vJO.js → main-cherry-VckJPHm5.js} +1 -1
- package/dist/ui/assets/memory-curation-seam-DUaZFZG9.js +1 -0
- package/dist/ui/assets/memory-health-D7uEvfAx.js +1 -0
- package/dist/ui/assets/memory-v2-flag-BHVbti6Z.js +1 -0
- package/dist/ui/assets/memory-write-execute-rXtR1z76.js +1 -0
- package/dist/ui/assets/merge-file-core-VJlzucJY.js +11 -0
- package/dist/ui/assets/{mount-DvrzOwsL.js → mount-8lU2iH4k.js} +3 -3
- package/dist/ui/assets/mount-DoM0CLGG.js +1 -0
- package/dist/ui/assets/{new-session-C4AXW_7S.js → new-session-DEhAjxP1.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-mNVnQZ_Q.js → oauth-bootstrap-DNTgbEZF.js} +2 -2
- package/dist/ui/assets/{onboarding-orchestrator-BwCfbdlW.js → onboarding-orchestrator-DzPQ0pVG.js} +1 -1
- package/dist/ui/assets/{openai-codex-DRyLvc3I.js → openai-codex-CsAhfz0D.js} +1 -1
- package/dist/ui/assets/{openai-codex-Subg_Vg8.js → openai-codex-DYRKYWTe.js} +1 -1
- package/dist/ui/assets/{openrouter-D5mJU1oF.js → openrouter-D9T6tXUF.js} +1 -1
- package/dist/ui/assets/{openrouter-B52vd-zH.js → openrouter-IyZlRHg4.js} +1 -1
- package/dist/ui/assets/{openrouter-free-CYBINFem.js → openrouter-free-CPshAgQD.js} +1 -1
- package/dist/ui/assets/{openrouter-free-CKmFPQ3y.js → openrouter-free-DfbYsnmf.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-BUFYoKT3.js → openrouter-oauth-hZg6oH0A.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-BML-cBKi.js → openrouter-oauth-xKlWi_wI.js} +1 -1
- package/dist/ui/assets/{opfs-mount-DmOQi3qJ.js → opfs-mount-C9Iamj6N.js} +1 -1
- package/dist/ui/assets/panel-rpc-handlers-Nu-wOrG9.js +2 -0
- package/dist/ui/assets/{panelize-shell-CJS6Q9hY.js → panelize-shell-tFElgHWF.js} +1 -1
- package/dist/ui/assets/pi-edit-execution-D6vx5LyF.js +2 -0
- package/dist/ui/assets/provider-3--cEcAF.js +1 -0
- package/dist/ui/assets/{provider-G-FXP5U3.js → provider-Z5aj7SzG.js} +2 -2
- package/dist/ui/assets/provider-settings-D9sjEfYE.js +1 -0
- package/dist/ui/assets/provider-store-access-M0PvJ08M.js +1 -0
- package/dist/ui/assets/provider-store-access-RxIHhH6d.js +1 -0
- package/dist/ui/assets/{providers-BT71Fchh.js → providers-CnoKdyLc.js} +2 -2
- package/dist/ui/assets/{providers-C1P4Z_in.js → providers-DVvrXbtx.js} +1 -1
- package/dist/ui/assets/{py-realm-worker-BRyQamcA.js → py-realm-worker-DXmzJqJi.js} +2 -2
- package/dist/ui/assets/{pyodide-DwR4k6wB.js → pyodide-b5uAaIjj.js} +2 -2
- package/dist/ui/assets/{quick-llm-BOu12xbc.js → quick-llm-DjWE-wQw.js} +1 -1
- package/dist/ui/assets/realm-inprocess-D0iWBQzz.js +30 -0
- package/dist/ui/assets/record-ChU1ND2B.js +1 -0
- package/dist/ui/assets/{recovery-screen-D_LwQpCA.js → recovery-screen-Y1CSyfR-.js} +1 -1
- package/dist/ui/assets/registry-Bq_j-EXx.js +1 -0
- package/dist/ui/assets/restore-DOkDX8BI.js +1 -0
- package/dist/ui/assets/{run-BFLhWKKw.js → run-B-fA26ea.js} +1 -1
- package/dist/ui/assets/run-BEt0RS3J.js +52 -0
- package/dist/ui/assets/{run-BGSKahNd.js → run-BOc9XLhg.js} +1 -1
- package/dist/ui/assets/run-BOkp5G58.js +91 -0
- package/dist/ui/assets/{run-CS-v8Znz.js → run-BWJSDhS7.js} +2 -2
- package/dist/ui/assets/{run-Dfw_vahy.js → run-Bld9B0W0.js} +1 -1
- package/dist/ui/assets/{run-CrPSdmNd.js → run-CISIYZMm.js} +1 -1
- package/dist/ui/assets/{run-MvSXwrUs.js → run-D0C4PgZM.js} +4 -4
- package/dist/ui/assets/{run-_2GCYBFU.js → run-DgNh1E56.js} +2 -2
- package/dist/ui/assets/{run-DWBPrvVI.js → run-DniTiLYn.js} +1 -1
- package/dist/ui/assets/run-a67LpkRp.js +42 -0
- package/dist/ui/assets/{run-BCXMG6On.js → run-vEDh-Me-.js} +6 -6
- package/dist/ui/assets/screencapture-media-B1iFS6Qy.js +1 -0
- package/dist/ui/assets/{screencapture-run-CfJW-gGP.js → screencapture-run-XrgS6hEd.js} +2 -2
- package/dist/ui/assets/script-catalog-CgT8L-OG.js +2 -0
- package/dist/ui/assets/{session-command-memory-0P878oz2.js → session-command-memory-DB2GmPSU.js} +2 -2
- package/dist/ui/assets/{session-jsonl-MJMdfn6X.js → session-jsonl-DFC-2T76.js} +1 -1
- package/dist/ui/assets/{session-jsonl-f7vG8uaN.js → session-jsonl-D_pTYppB.js} +1 -1
- package/dist/ui/assets/{session-search-index-BQmbRVuk.js → session-search-index-CN1zDLlx.js} +2 -2
- package/dist/ui/assets/{setup-feature-flags-remote-KCi8ndrR.js → setup-feature-flags-remote-BVd31Z12.js} +1 -1
- package/dist/ui/assets/signed-fetch-BY2Mdjqe.js +1 -0
- package/dist/ui/assets/{silent-renew-backoff-B06r5ZL-.js → silent-renew-backoff-CKAAh6GN.js} +1 -1
- package/dist/ui/assets/{silent-renew-backoff-DIMz5UqB.js → silent-renew-backoff-Dmz3DJHb.js} +1 -1
- package/dist/ui/assets/slicc-version-BZyTvfoc.js +1 -0
- package/dist/ui/assets/{snapshot-features-vq3FCiv5.js → snapshot-features-DjMJkCGq.js} +1 -1
- package/dist/ui/assets/{snapshot-BykuJ4wW.js → snapshot-gi8tDzvN.js} +1 -1
- package/dist/ui/assets/{soundscape-DQGEZGwB.js → soundscape-Bl3LhUk9.js} +1 -1
- package/dist/ui/assets/{speak-DivfwK0_.js → speak-BY_fDou2.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-rSxSSd0J.js → sprinkle-manager-C-NUJqPy.js} +1 -1
- package/dist/ui/assets/{sprinkle-renderer-Ul_GPDpn.js → sprinkle-renderer-CcA6ie5u.js} +1 -1
- package/dist/ui/assets/{state-CGafQVGp.js → state-z3wOHLww.js} +1 -1
- package/dist/ui/assets/{store-qzvn3yV9.js → store-ByUcAFUa.js} +1 -1
- package/dist/ui/assets/{store-BbZGuhdS.js → store-ChWzn_H8.js} +1 -1
- package/dist/ui/assets/{sudo-BLaOJiyv.js → sudo-DNZFIZ-H.js} +1 -1
- package/dist/ui/assets/sudo-fs-D620mZry.js +3 -0
- package/dist/ui/assets/supervisor-BtH2-9sE.js +1 -0
- package/dist/ui/assets/{sync-dialog-CfQLao_i.js → sync-dialog-Jqz74VkZ.js} +1 -1
- package/dist/ui/assets/sync-sab-wire-CC30v4TL.js +252 -0
- package/dist/ui/assets/tab-ToMhjbM4.js +1 -0
- package/dist/ui/assets/{transformers-env-7c5cDYNs.js → transformers-env-pq1E2H6B.js} +1 -1
- package/dist/ui/assets/{tray-leader-DqDL2jwl.js → tray-leader-Bas0lH9O.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-Fs59e1NT.js → tray-leave-runtime-B9aV_guA.js} +1 -1
- package/dist/ui/assets/tray-runtime-config-BZoJXfW0.js +1 -0
- package/dist/ui/assets/{tray-sidecar-DuSizsy1.js → tray-sidecar-DA8NfCV6.js} +1 -1
- package/dist/ui/assets/upgrade-detection-B5ym__Gu.js +1 -0
- package/dist/ui/assets/{upskill-lick-skip-B0aTroa_.js → upskill-lick-skip-CZGM2OFA.js} +1 -1
- package/dist/ui/assets/v86-DseFx8Yp.js +1 -0
- package/dist/ui/assets/v86-vm-DCm7zA2r.js +2 -0
- package/dist/ui/assets/{voice-reply-BDW4paEk.js → voice-reply-CL5tDo0l.js} +1 -1
- package/dist/ui/assets/{wc-attach-C1JExhF6.js → wc-attach-C5yXIQNU.js} +2 -2
- package/dist/ui/assets/{wc-detached-YxBsBh4A.js → wc-detached-f_qit-5b.js} +1 -1
- package/dist/ui/assets/{wc-extension-CVnsFSuW.js → wc-extension-DRx21-cq.js} +2 -2
- package/dist/ui/assets/{wc-follower-CUovZlpa.js → wc-follower-DcKt92kM.js} +3 -3
- package/dist/ui/assets/{wc-follower-oauth-Bxhy8p-W.js → wc-follower-oauth-BF3qXDTt.js} +1 -1
- package/dist/ui/assets/{wc-gelatiere-CxkjwV-m.js → wc-gelatiere-qAW7lWGW.js} +1 -1
- package/dist/ui/assets/{wc-live-br4wUYv7.js → wc-live-DOMCfDT6.js} +6 -6
- package/dist/ui/assets/{wc-nav-ChrnrxPa.js → wc-nav-DzPuXq_n.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-D2v396gn.js → wc-onboarding-CXM-z-7_.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-Bw-g85Ke.js → wc-placeholder-BBqbsuml.js} +3 -3
- package/dist/ui/assets/{wc-secret-request-BK3k0VlW.js → wc-secret-request-BSUlxVVi.js} +1 -1
- package/dist/ui/assets/{wc-settings-D84UzOS6.js → wc-settings-55mC-jVS.js} +3 -3
- package/dist/ui/assets/{wc-shell-CKhQ3qyn.js → wc-shell-C71iKreG.js} +4 -4
- package/dist/ui/assets/{wc-shortcut-config-DFPLI7su.js → wc-shortcut-config-Crjq_rF1.js} +1 -1
- package/dist/ui/assets/{wc-sprinkles-Cf6JnkDK.js → wc-sprinkles-Caji5y7n.js} +2 -2
- package/dist/ui/assets/{wc-transcript-export-BbJ1QcHb.js → wc-transcript-export-Dqe3SH1t.js} +2 -2
- package/dist/ui/assets/{wc-tray-BEzyYj77.js → wc-tray-B7ayzT1W.js} +4 -4
- package/dist/ui/assets/welcome-detection-CEARSpAq.js +1 -0
- package/dist/ui/assets/{whisper-session-Ch3Rub5j.js → whisper-session-DfILe4Yb.js} +2 -2
- package/dist/ui/assets/workspace-mode-D0kUKBVS.js +1 -0
- package/dist/ui/assets/{xai-grok-D4lk5fCR.js → xai-grok-CVLBrxdD.js} +1 -1
- package/dist/ui/assets/{xai-grok-BT_WDAT_.js → xai-grok-Dp8n52fO.js} +1 -1
- package/dist/ui/index.html +3 -3
- package/dist/ui/packages/webapp/index.html +3 -3
- package/package.json +1 -1
- package/dist/ui/assets/SKILL-CtxHowg1.js +0 -96
- package/dist/ui/assets/__vite-browser-external-CCBdZzAl.js +0 -1
- package/dist/ui/assets/adobe-CjAD_QGX.js +0 -1
- package/dist/ui/assets/agent-bridge-D_5Sd3oe.js +0 -12
- package/dist/ui/assets/agent-message-to-chat-w7n13QEN.js +0 -7
- package/dist/ui/assets/attachments-u2K0aIPI.js +0 -6
- package/dist/ui/assets/bridge-protocol-DdqxTTSu.js +0 -1
- package/dist/ui/assets/budget-usage-source-BW8-RCSb.js +0 -1
- package/dist/ui/assets/clipboard-CknViQHB.js +0 -1
- package/dist/ui/assets/cone-memory-budget-Cmi9vXV5.js +0 -15
- package/dist/ui/assets/db-DSIYsBgP.js +0 -1
- package/dist/ui/assets/derive-CZLe75z_.js +0 -1
- package/dist/ui/assets/descriptor-D-6Koktu.js +0 -1
- package/dist/ui/assets/directed-approval-D9smLm9q.js +0 -1
- package/dist/ui/assets/engine-BnH9pfmR.js +0 -1
- package/dist/ui/assets/esp8266-BN3fFVWu.js +0 -1
- package/dist/ui/assets/esptool-operations-lUvXx3gs.js +0 -13
- package/dist/ui/assets/feature-flags-Dl-xb1DG.js +0 -1
- package/dist/ui/assets/frozen-archive-format-B4efpvB9.js +0 -1
- package/dist/ui/assets/gelatiere-constants-BYJlhm8R.js +0 -1
- package/dist/ui/assets/gelatiere-store-CE_Ssheh.js +0 -1
- package/dist/ui/assets/gelatiere-unit-BMHtZLOW.js +0 -1
- package/dist/ui/assets/js-realm-worker-AwpbqZPU.js +0 -50
- package/dist/ui/assets/jsh-runtime-extensions-Bcb8_nba.js +0 -1
- package/dist/ui/assets/just-bash-compat-BwD6SoTi.js +0 -1
- package/dist/ui/assets/kernel-worker-BAcS3WAP.js +0 -4673
- package/dist/ui/assets/lick-manager-ULemXDKa.js +0 -2
- package/dist/ui/assets/lick-urls-BZVq_P3x.js +0 -1
- package/dist/ui/assets/lick-ws-bridge-CDToX4F0.js +0 -1
- package/dist/ui/assets/live-session-snapshot-Dv20JKP2.js +0 -1
- package/dist/ui/assets/manager-Bl9b7X9m.js +0 -1
- package/dist/ui/assets/memory-curation-seam-BAJK5Abp.js +0 -1
- package/dist/ui/assets/memory-health-MhSOmzAf.js +0 -1
- package/dist/ui/assets/memory-v2-flag-D85UWdUr.js +0 -1
- package/dist/ui/assets/memory-write-execute-BOjUkUIG.js +0 -1
- package/dist/ui/assets/mount-CTTWc8xh.js +0 -1
- package/dist/ui/assets/mount-recovery-T6cjQxeX.js +0 -2
- package/dist/ui/assets/panel-rpc-handlers-BG91KHPa.js +0 -2
- package/dist/ui/assets/pi-edit-execution-NnXkvjSi.js +0 -2
- package/dist/ui/assets/provider-CbAKIAon.js +0 -1
- package/dist/ui/assets/provider-settings-BuhBOwFs.js +0 -1
- package/dist/ui/assets/provider-store-access-CrH5offR.js +0 -1
- package/dist/ui/assets/provider-store-access-DgZnuRxY.js +0 -1
- package/dist/ui/assets/realm-inprocess-Bmsz-kPh.js +0 -30
- package/dist/ui/assets/record-YqlVEfh_.js +0 -1
- package/dist/ui/assets/run-33hnsiVQ.js +0 -91
- package/dist/ui/assets/screencapture-media-Dc-3ljgR.js +0 -1
- package/dist/ui/assets/screencapture-media-shared-BDUdmMOP.js +0 -1
- package/dist/ui/assets/script-catalog-Bt94D0RP.js +0 -2
- package/dist/ui/assets/skills-DWkSI8sH.js +0 -5
- package/dist/ui/assets/slicc-version-DAFTorvi.js +0 -1
- package/dist/ui/assets/sync-sab-wire-Cacrunmz.js +0 -252
- package/dist/ui/assets/tray-runtime-config-CRZxBChd.js +0 -1
- package/dist/ui/assets/upgrade-detection-CyCnJlGg.js +0 -1
- package/dist/ui/assets/welcome-detection-DjgSxU4V.js +0 -1
- package/dist/ui/assets/write-verification-BOaZdtyk.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as e}from"./bridge-protocol-06nbmp2X.js";import{n as t}from"./clipboard-eqmn97SP.js";import{n}from"./icons-BM2l-_K7.js";import{A as r,D as i,E as a,O as o,T as s,k as c,w as l}from"./wc-live-
|
|
1
|
+
import{i as e}from"./bridge-protocol-06nbmp2X.js";import{n as t}from"./clipboard-eqmn97SP.js";import{n}from"./icons-BM2l-_K7.js";import{A as r,D as i,E as a,O as o,T as s,k as c,w as l}from"./wc-live-DOMCfDT6.js";function u(e){let t=[{id:`browser`,label:`Browser`},{id:`iphone`,label:`iPhone`},{id:`terminal`,label:`Terminal`}];return e>0&&t.unshift({id:`status`,label:`Status`,badge:e}),t}function d(e){return e>0?`status`:`browser`}function f(e){let t;try{t=new URL(e)}catch{return e}let n=t.pathname.split(`/`),r=n.lastIndexOf(`join`)+1;return r===0||r>=n.length||!n[r]?e:(n[r]=`•`.repeat(8),`${t.origin}${n.join(`/`)}${t.search}${t.hash}`)}function p(e){return`slicc ${e} follow bash -c`}var m=e;function h(e){try{return new URL(e).origin}catch{return m}}function g(e){return`curl -fsSL ${h(e)}/install-cli | sh`}function _(e){return`irm ${h(e)}/install-cli.ps1 | iex`}function v(e){switch(e){case`browser`:return[`Open Sliccy in the other browser, click the avatar, and choose “Connect to another browser”.`,`Paste the join link there.`];case`iphone`:return[`In the Sliccy app, paste the join link into Settings → Join link.`,`Signed in to the same iCloud account? The session is already listed under iCloud Sessions — no link needed.`];case`terminal`:return[`Lend a machine to this session — run these in its terminal:`,`The agent can then run commands on that machine as you.`]}}function y(e){return e===0?`Nothing connected yet.`:`${e} ${e===1?`device is`:`devices are`} connected.`}function b(e){return e===0?`Revoke link? The old link stops working.`:`Revoke link? ${e} connected ${e===1?`device`:`devices`} will be disconnected.`}var x=`font-family: var(--s2-font-mono); font-size: 11px; color: var(--s2-content-default); word-break: break-all; padding: 8px 12px; background: var(--s2-bg-sunken); border-radius: var(--s2-radius-default); border: 1px solid var(--s2-border-subtle);`,S=`font-size: 11px; color: var(--s2-content-secondary);`,C=`font-size: 12px; color: var(--s2-content-default);`,w=`flex: 0 0 auto; width: auto; padding: 8px 14px;`;function T(e,t,n){let r=document.createElement(e);return t&&(r.style.cssText=t),n!=null&&(r.textContent=n),r}function E(e,t,n=`normal`){e.statusEl.textContent=t,e.statusEl.style.color=n===`error`?`var(--slicc-cone)`:`var(--s2-content-secondary)`}async function D(e,n,r){await t(n)?E(e,r):E(e,`Couldn’t copy. Select the text and copy it manually.`,`error`)}async function O(e){let{onReset:t}=e.options,n=e.revokeBtn;if(!(!t||!n)){if(!e.revokeArmed){e.revokeArmed=!0,n.textContent=b(e.followers.length),k(n,!0);return}n.disabled=!0,e.doneBtn.disabled=!0,E(e,`Revoking the join link…`);try{await t(),E(e,`Join link revoked. Enable sharing from the avatar menu to get a new one.`),e.urlRevealed=!1,n.textContent=`Revoked`,e.doneBtn.disabled=!1,L(e)}catch(t){E(e,`Revoke failed: ${t instanceof Error?t.message:String(t)}`,`error`),e.revokeArmed=!1,n.textContent=`Revoke link`,k(n,!1),n.disabled=!1,e.doneBtn.disabled=!1}}}function k(e,t){e.dataset.armed=t?`1`:`0`,e.style.background=t?`var(--s2-negative)`:``,e.style.borderColor=t?`transparent`:``,e.style.color=t?`#fff`:``}function A(e){let t=T(`div`),n=T(`button`,`margin-bottom: 8px;`,`Copy join link`);n.className=`dialog__btn dialog__btn--secondary`,n.dataset.action=`copy-link`,n.addEventListener(`click`,()=>{D(e,e.options.joinUrl,`Join link copied.`)}),t.appendChild(n);let r=T(`div`,`display: flex; align-items: center; gap: 8px;`),i=T(`div`,`${x} flex: 1 1 auto; min-width: 0; color: var(--s2-content-secondary);`);i.dataset.joinUrl=`1`,i.textContent=e.urlRevealed?e.options.joinUrl:f(e.options.joinUrl);let a=T(`button`,`${w}`,e.urlRevealed?`Hide`:`Show`);return a.className=`dialog__btn dialog__btn--secondary`,a.dataset.action=`toggle-url`,a.addEventListener(`click`,()=>{e.urlRevealed=!e.urlRevealed,L(e)}),r.append(i,a),t.appendChild(r),t.appendChild(T(`div`,`${S} margin-top: 8px;`,`Anyone with this link can drive this session.`)),t}function j(e,t){let n=T(`div`,`margin-bottom: 10px;`);n.appendChild(T(`div`,`${S} margin-bottom: 4px;`,t.caption));let r=T(`div`,`${x} margin-bottom: 6px;`,t.command);r.dataset.command=t.action,n.appendChild(r);let i=T(`button`,`margin-bottom: 0;`,t.copyLabel);return i.className=`dialog__btn dialog__btn--secondary`,i.dataset.action=t.action,i.addEventListener(`click`,()=>{D(e,t.copyValue??t.command,t.okMessage)}),n.appendChild(i),n}function M(e,t){let n=T(`div`),{joinUrl:r}=e.options,i=p(r),a=e.urlRevealed?i:p(f(r));n.appendChild(j(e,{caption:`1. Install the slicc CLI (skip if you already have it):`,command:g(r),action:`copy-install`,copyLabel:`Copy install command`,okMessage:`Install command copied.`})),n.appendChild(T(`div`,`${S} margin: -6px 0 12px;`,`Windows: ${_(r)}`)),n.appendChild(j(e,{caption:`2. Connect that machine to this session:`,command:a,copyValue:i,action:`copy-command`,copyLabel:`Copy command`,okMessage:`Command copied.`}));let o=T(`button`,`${w} margin-bottom: 8px;`,e.urlRevealed?`Hide link`:`Show link`);return o.className=`dialog__btn dialog__btn--secondary`,o.dataset.action=`toggle-url`,o.addEventListener(`click`,()=>{e.urlRevealed=!e.urlRevealed,L(e)}),n.appendChild(o),n.appendChild(T(`div`,`${S} margin-bottom: 0;`,`\u26a0 ${t}`)),n}function N(e,t){let n=T(`div`),[r,i]=v(t);return n.appendChild(T(`div`,`${C} line-height: 1.5; margin-bottom: 6px;`,r)),t===`terminal`?(n.appendChild(M(e,i)),n):(n.appendChild(T(`div`,`${S} margin-bottom: 10px;`,i)),n.appendChild(A(e)),n)}function P(e){let t=T(`div`,`display: grid; grid-template-columns: 16px 1fr auto; gap: 8px; align-items: start;`);t.dataset.follower=e.runtimeId;let l=T(`span`,`display: flex; margin-top: 2px; color: var(--s2-content-secondary);`);l.appendChild(n(i(e),{size:14})),t.appendChild(l);let u=T(`div`,`display: flex; flex-direction: column; gap: 2px; min-width: 0;`);u.appendChild(T(`div`,`${C} font-weight: 500;`,r(e)));let d=a(e);d&&u.appendChild(T(`div`,`${S} overflow-wrap: anywhere;`,d));let f=s(e);if(f.length>0){let e=T(`div`,`display: flex; gap: 4px; flex-wrap: wrap; margin-top: 2px;`);for(let t of f)e.appendChild(T(`span`,`padding: 1px 6px; border-radius: 9999px; background: var(--s2-bg-layer-1); border: 1px solid var(--s2-border-subtle); font-size: 10px; font-weight: 600; color: var(--s2-content-secondary);`,t));u.appendChild(e)}t.appendChild(u);let p=c(e),m=p===`active`?`var(--s2-positive)`:p===`warn`?`var(--s2-notice)`:`var(--s2-content-tertiary)`,h=T(`div`,`display: flex; align-items: center; gap: 5px; ${S} white-space: nowrap;`);return h.appendChild(T(`span`,`width: 6px; height: 6px; border-radius: 50%; flex: 0 0 auto; background: ${m};`)),h.appendChild(T(`span`,void 0,o(e))),t.appendChild(h),t}function F(e){let t=T(`div`,`display: flex; flex-direction: column; gap: 10px;`);for(let n of e.followers)t.appendChild(P(n));return e.followers.length===0&&t.appendChild(T(`div`,`font-size: 12px; color: var(--s2-content-secondary);`,`Nothing connected right now.`)),t}function I(e,t,n){let r=t===e.activeTab,i=T(`button`,`flex: 0 0 auto; padding: 4px 10px; border-radius: 9999px; font-size: 12px; cursor: pointer; border: 1px solid ${r?`var(--s2-border-subtle)`:`transparent`}; background: ${r?`var(--s2-bg-layer-1)`:`transparent`}; color: ${r?`var(--s2-content-default)`:`var(--s2-content-secondary)`};`,n);return i.type=`button`,i.setAttribute(`role`,`tab`),i.setAttribute(`aria-selected`,String(r)),i.dataset.tab=t,i.addEventListener(`click`,()=>{e.activeTab=t,L(e)}),i}function L(e){let t=u(e.followers.length);t.some(t=>t.id===e.activeTab)||(e.activeTab=d(0)),e.tabsRow.replaceChildren(...t.map(t=>I(e,t.id,t.badge==null?t.label:`${t.label} · ${t.badge}`))),e.body.replaceChildren(e.activeTab===`status`?F(e):N(e,e.activeTab)),e.summaryEl.textContent=y(e.followers.length),e.revokeBtn&&!e.revokeArmed&&e.revokeBtn.textContent!==`Revoked`&&(e.revokeBtn.textContent=`Revoke link`,k(e.revokeBtn,!1))}function R(e){let t=T(`div`);t.className=`dialog-overlay`,t.dataset.syncDialog=`1`;let n=T(`div`);n.className=`dialog`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-modal`,`true`),n.setAttribute(`aria-label`,`Session sharing`),t.appendChild(n);let r=T(`div`,void 0,`Session sharing`);r.className=`dialog__title`;let i=T(`div`,`display: flex; gap: 4px; margin-bottom: 12px; flex-wrap: wrap;`);i.setAttribute(`role`,`tablist`);let a=T(`div`,`margin-bottom: 12px;`);a.setAttribute(`role`,`tabpanel`);let o=T(`div`,`font-size: 12px; margin-bottom: 8px; min-height: 16px;`);o.setAttribute(`role`,`status`),o.setAttribute(`aria-live`,`polite`);let s=T(`div`,`${S} margin-bottom: 8px;`),c=T(`button`,void 0,`Done`);c.className=`dialog__btn`,n.append(r,i,a,o,s,c);let l=e.followers??[];return{options:e,followers:l,activeTab:e.initialTab??d(l.length),urlRevealed:!1,revokeArmed:!1,overlay:t,tabsRow:i,body:a,statusEl:o,summaryEl:s,doneBtn:c,revokeBtn:null}}var z=null;function B(e){z?.(),document.querySelectorAll(`.dialog-overlay[data-sync-dialog]`).forEach(e=>{e.remove()});let t=R(e),n=t.overlay.firstElementChild;if(e.onReset){let e=T(`button`,`margin-top: 8px;`,`Revoke link`);e.className=`dialog__btn dialog__btn--secondary`,e.dataset.action=`revoke`,e.addEventListener(`click`,()=>{O(t)}),n.appendChild(e),t.revokeBtn=e}let r=e=>{t.followers=e.detail?.followers??[],L(t)},i=e=>{e.key===`Escape`&&a()};function a(){window.removeEventListener(l,r),document.removeEventListener(`keydown`,i),t.overlay.remove(),z===a&&(z=null)}t.doneBtn.addEventListener(`click`,()=>a()),t.overlay.addEventListener(`click`,e=>{e.target===t.overlay&&a()}),window.addEventListener(l,r),document.addEventListener(`keydown`,i),z=a,e.copied&&E(t,`Join link copied to clipboard.`),L(t),document.body.appendChild(t.overlay)}export{B as showSyncEnabledDialog};
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import{t as e}from"./runtime-env-DadgceZk.js";import{r as t}from"./fetch-body-CuwTaJC_.js";import{a as n,t as r}from"./path-utils-DNJG-zQf.js";import{C as i,_ as a}from"./shared-C_68vn79.js";function o(t,n){let r=e(),i=`/preview${t}${n?`?projectRoot=${encodeURIComponent(n)}`:``}`;if(r){let e=globalThis.chrome?.runtime?.getURL;if(e)return e(i)}let a=`http://localhost:5710`;return typeof window<`u`&&window.location?.origin?a=window.location.origin:typeof self<`u`&&self.location?.origin&&(a=self.location.origin),`${a}${i}`}async function s(e){let t=await crypto.subtle.digest(`SHA-256`,e);return Array.from(new Uint8Array(t)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}function c(e){try{return new URL(e).protocol===`https:`}catch{return!1}}function l(e){return new Promise(t=>setTimeout(t,e))}async function u(e,n,r){let i;try{i=await e(n.url,{method:`GET`,headers:{Accept:`application/octet-stream`},timeoutMs:r})}catch(e){let t=e instanceof Error?e.message:String(e);return{ok:!1,retriable:!0,error:Error(`${n.label}: network error (${t})`)}}if(i.status>=500&&i.status<600)return{ok:!1,retriable:!0,error:Error(`${n.label}: server error HTTP ${i.status}`)};if(i.status<200||i.status>=300){let e=i.statusText?` ${i.statusText}`:``;return{ok:!1,retriable:!1,error:Error(`${n.label}: HTTP ${i.status}${e}`)}}let a=t(i.body);return!(a instanceof Uint8Array)||a.length===0?{ok:!1,retriable:!1,error:Error(`${n.label}: response body was empty`)}:{ok:!0,bytes:a}}async function ee(e,t,n){let r;for(let i=1;i<=3;i++){let a=await u(e,t,n);if(a.ok)return a.bytes;if(r=a.error,!a.retriable||i===3)throw a.error;await l(250*i)}throw r??Error(`${t.label}: download failed`)}async function te(e,t){let n=await s(e);if(n!==t.sha256.toLowerCase())throw Error(`${t.label}: sha256 mismatch (expected ${t.sha256.toLowerCase()}, got ${n})`)}async function d(e,t){if(!c(t.url))throw Error(`${t.label}: refused to fetch non-https URL '${t.url}'`);let n=await ee(e,t,t.timeoutMs??6e4);return await te(n,t),n}const f=`pyproject.toml`,p=`uv.lock`,m=`/workspace`;function h(e){return e.trim().toLowerCase().replace(/[-_.]+/g,`-`)}function g(e){let t=e.indexOf(`==`);return(t===-1?e:e.slice(0,t)).trim()}function _(e){let t=e.indexOf(`==`);return t===-1?{name:e.trim(),version:``}:{name:e.slice(0,t).trim(),version:e.slice(t+2).trim()}}async function v(e,t){let i=t?.startsWith(`/`)?t:m;for(;;){if(await e.exists(r(i,f)))return i;if(i===`/`)return null;i=n(i).dir}}async function ne(e,t){return await v(e,t)??m}function y(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let i=e[r];if(i===`'`&&!n)t=!t;else if(i===`"`&&!t)n=!n;else if(i===`#`&&!t&&!n)return e.slice(0,r)}return e}function b(e){let t=e.trim();return t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`)?t.slice(1,-1):null}function re(e,t,n){let r=n,i=t;for(;!r.includes(`]`)&&i+1<e.length;)i+=1,r+=`\n${y(e[i])}`;let a=[];for(let e of r.matchAll(/["']([^"']*)["']/g))e[1].trim()&&a.push(e[1].trim());return{items:a,lastIndex:i}}function ie(e){let t=e.split(`
|
|
2
|
+
`),n=``,r=`workspace`,i=`0.1.0`,a=[];for(let e=0;e<t.length;e++){let o=y(t[e]).trim();if(!o)continue;if(o.startsWith(`[`)){n=o;continue}if(n!==`[project]`)continue;let s=o.indexOf(`=`);if(s===-1)continue;let c=o.slice(0,s).trim(),l=o.slice(s+1).trim();if(c===`name`)r=b(l)??r;else if(c===`version`)i=b(l)??i;else if(c===`dependencies`){let n=re(t,e,l);a=n.items,e=n.lastIndex}}return{name:r,version:i,dependencies:a}}function x(e){return e.length===0?`dependencies = []`:`dependencies = [\n${e.map(e=>` "${e}",`).join(`
|
|
3
|
+
`)}\n]`}function S(e){let t=x(e.dependencies);return`[project]\nname = "${e.name}"\nversion = "${e.version}"\n${t}\n`}function ae(e,t){let n=y(e[t]),r=t;for(;!n.includes(`]`)&&r+1<e.length;)r+=1,n+=`\n${y(e[r])}`;return r}function oe(e){let t={depsStart:-1,depsEnd:-1,projectHeaderIndex:-1,projectSectionEnd:-1},n=``;for(let r=0;r<e.length;r++){let i=y(e[r]).trim();if(i.startsWith(`[`)){t.projectHeaderIndex!==-1&&t.projectSectionEnd===-1&&r>t.projectHeaderIndex&&(t.projectSectionEnd=r),n=i,i===`[project]`&&(t.projectHeaderIndex=r);continue}if(n!==`[project]`||t.depsStart!==-1)continue;let a=i.indexOf(`=`);a!==-1&&i.slice(0,a).trim()===`dependencies`&&(t.depsStart=r,t.depsEnd=ae(e,r))}return t}function se(e,t){let n=x(t.dependencies).split(`
|
|
4
|
+
`),r=e.split(`
|
|
5
|
+
`),{depsStart:i,depsEnd:a,projectHeaderIndex:o,projectSectionEnd:s}=oe(r);if(i!==-1)return r.splice(i,a-i+1,...n),r.join(`
|
|
6
|
+
`);if(o!==-1){let e=s===-1?r.length:s;return r.splice(e,0,...n),r.join(`
|
|
7
|
+
`)}return`${e}${e.length===0||e.endsWith(`
|
|
8
|
+
`)?``:`
|
|
9
|
+
`}\n${S(t)}`}const ce={name:`name`,version:`version`,source:`source`,file_name:`fileName`,sha256:`sha256`};function C(e,t){t.name&&t.version&&t.source&&t.fileName&&t.sha256&&e.push(t)}function le(e){let t=[],n=null;for(let r of e.split(`
|
|
10
|
+
`)){let e=y(r).trim();if(!e)continue;if(e===`[[package]]`){n&&C(t,n),n={};continue}if(e.startsWith(`[`)){n&&C(t,n),n=null;continue}if(!n)continue;let i=e.indexOf(`=`);if(i===-1)continue;let a=ce[e.slice(0,i).trim()];if(!a)continue;let o=b(e.slice(i+1).trim());o!==null&&(a===`source`?n.source=o:n[a]=o)}return n&&C(t,n),t}function ue(e){return e.map(e=>`[[package]]\nname = "${e.name}"\nversion = "${e.version}"\nsource = "${e.source}"\nfile_name = "${e.fileName}"\nsha256 = "${e.sha256}"\n`).join(`
|
|
11
|
+
`)}function de(e,t,n){let r=h(t),i=e.filter(e=>h(g(e))!==r);return i.push(`${t}==${n}`),i.sort((e,t)=>h(g(e)).localeCompare(h(g(t)))),i}function fe(e,t){let n=h(t.name),r=e.filter(e=>h(e.name)!==n);return r.push(t),r.sort((e,t)=>h(e.name).localeCompare(h(t.name))),r}async function w(e,t){let n=r(t,f);if(!await e.exists(n))return{name:`workspace`,version:`0.1.0`,dependencies:[]};let i=await e.readFile(n);return{...ie(i),raw:i}}async function pe(e,t,n){await e.mkdir(t,{recursive:!0});let i=n.raw===void 0?S(n):se(n.raw,n);await e.writeFile(r(t,f),i)}async function T(e,t){let n=r(t,p);return await e.exists(n)?le(await e.readFile(n)):[]}async function me(e,t,n){await e.mkdir(t,{recursive:!0}),await e.writeFile(r(t,p),ue(n))}const E={EBADF:8,EEXIST:20,EINVAL:28,EIO:29,EISDIR:31,ENOENT:44,ENOTDIR:54,ENOTEMPTY:55,EPERM:63},D=16877;async function he(e){let t=new Map;t.set(``,{kind:`directory`,dirHandle:e});async function n(e,r){let i=e;for await(let[e,a]of i){let i=r===``?e:`${r}/${e}`;if(a.kind===`directory`)t.set(i,{kind:`directory`,dirHandle:a}),await n(a,i);else{let e=a,n=await e.getFile();t.set(i,{kind:`file`,fileHandle:e,size:n.size,mtime:n.lastModified})}}}return await n(e,``),{entries:t}}function O(e,t){return e===``?t:`${e}/${t}`}function ge(e,t){return{getattr(t){let n=e.isDir(t.mode),r=e.isLink(t.mode)?t.opfs.linkTarget?.length??0:n?4096:t.opfs.size,i=new Date(t.opfs.mtime||t.timestamp);return{dev:1,ino:t.id,mode:t.mode,nlink:1,uid:0,gid:0,rdev:0,size:r,atime:i,mtime:i,ctime:i,blksize:4096,blocks:Math.ceil(r/4096)}},setattr(t,n){if(n.mode!==void 0&&(t.mode=t.mode&61440|n.mode&-61441),n.size!==void 0&&e.isFile(t.mode)){let e=n.size;t.opfs.size=e;let r=e;A(t.mount,async()=>{if(t.opfs.size>r)return;let n=await Ce(t),i=t.mount.opts.sahProvider.acquire(t.opfs.relPath,n);try{i.truncate(e),i.flush()}finally{i.close(),t.mount.opts.sahProvider.release(t.opfs.relPath)}})}if(n.mtime!==void 0){let e=n.mtime.getTime();t.opfs.mtime=e,t.timestamp=e}},lookup(t,n){let r=t.opfs.children?.get(n);if(!r)throw new e.ErrnoError(E.ENOENT);return r},mknod(n,r,i,a){if(n.opfs.children?.has(r))throw new e.ErrnoError(E.EEXIST);let o=t.createNode(n,r,i,a);return n.opfs.children?.set(r,o),e.isDir(i)?A(n.mount,async()=>{let e=await(await j(n)).getDirectoryHandle(r,{create:!0});o.opfs.dirHandle=e}):e.isFile(i)&&A(n.mount,async()=>{let e=await(await j(n)).getFileHandle(r,{create:!0});o.opfs.fileHandle=e}),o},rename(t,n,r){let i=t.parent,a=t.name;if(a!==r||i!==n){if(n.opfs.children?.has(r))throw new e.ErrnoError(E.EEXIST);i.opfs.children?.delete(a),n.opfs.children?.set(r,t),t.name=r,t.parent=n,M(t,O(n.opfs.relPath,r)),e.isFile(t.mode)?A(t.mount,()=>we(t,i,a,n,r)):e.isDir(t.mode)&&A(t.mount,()=>Te(t,i,a,n,r))}},unlink(t,n){let r=t.opfs.children?.get(n);if(!r)throw new e.ErrnoError(E.ENOENT);if(e.isDir(r.mode))throw new e.ErrnoError(E.EISDIR);t.opfs.children?.delete(n),e.isFile(r.mode)&&A(t.mount,async()=>{try{t.mount.opts.sahProvider.release(r.opfs.relPath)}catch{}await(await j(t)).removeEntry(n)})},rmdir(t,n){let r=t.opfs.children?.get(n);if(!r)throw new e.ErrnoError(E.ENOENT);if(!e.isDir(r.mode))throw new e.ErrnoError(E.ENOTDIR);if((r.opfs.children?.size??0)>0)throw new e.ErrnoError(E.ENOTEMPTY);t.opfs.children?.delete(n),A(t.mount,async()=>{await(await j(t)).removeEntry(n)})},readdir(t){if(!e.isDir(t.mode))throw new e.ErrnoError(E.ENOTDIR);let n=[`.`,`..`];for(let e of t.opfs.children?.keys()??[])n.push(e);return n},symlink(n,r,i){if(n.opfs.children?.has(r))throw new e.ErrnoError(E.EEXIST);let a=t.createNode(n,r,41471,0);return a.opfs.linkTarget=i,n.opfs.children?.set(r,a),a},readlink(t){if(!e.isLink(t.mode))throw new e.ErrnoError(E.EINVAL);return t.opfs.linkTarget??``}}}function _e(e){return{open(t){let n=t.node;if(e.isDir(n.mode)||!e.isFile(n.mode))return;let r=n.mount.opts.sahProvider.acquire(n.opfs.relPath,n.opfs.fileHandle);t.sah=r,t.flags!==void 0&&t.flags&512?(r.truncate(0),n.opfs.size=0):n.opfs.size=r.getSize()},close(e){let t=e.sah;if(t)try{t.flush()}finally{t.close(),e.node.mount.opts.sahProvider.release(e.node.opfs.relPath),e.sah=void 0}},read(t,n,r,i,a){let o=t.sah;if(!o)throw new e.ErrnoError(E.EBADF);let s=new Uint8Array(n.buffer,n.byteOffset+r,i);return o.read(s,{at:a})},write(t,n,r,i,a){let o=t.sah;if(!o)throw new e.ErrnoError(E.EBADF);let s=new Uint8Array(n.buffer,n.byteOffset+r,i),c=o.write(s,{at:a}),l=Math.max(t.node.opfs.size,a+c);return t.node.opfs.size=l,t.node.opfs.mtime=Date.now(),t.node.timestamp=t.node.opfs.mtime,c},llseek(t,n,r){let i=n;if(r===1)i=t.position+n;else if(r===2){let e=t.sah;i=(e?e.getSize():t.node.opfs.size)+n}if(i<0)throw new e.ErrnoError(E.EINVAL);return t.position=i,i}}}function ve(e,t,n,r){for(let[i,a]of r.entries){if(i===``)continue;let r=i.split(`/`),o=n;for(let t=0;t<r.length-1;t++){let n=r[t],i=o.opfs.children?.get(n);if(!i)throw new e.ErrnoError(E.EIO);o=i}let s=r[r.length-1];if(a.kind===`directory`){let e=t.createNode(o,s,D,0);e.opfs.dirHandle=a.dirHandle,e.opfs.children=new Map,o.opfs.children?.set(s,e)}else{let e=t.createNode(o,s,33188,0);e.opfs.fileHandle=a.fileHandle,e.opfs.size=a.size,e.opfs.mtime=a.mtime,e.timestamp=a.mtime,o.opfs.children?.set(s,e)}}}function ye(e){let t={mount(n){let{prewalk:r}=n.opts,i=r.entries.get(``);if(i?.kind!==`directory`)throw new e.ErrnoError(E.EINVAL);let a=t.createNode(null,`/`,D,0);return a.mount=n,a.opfs.dirHandle=i.dirHandle,a.opfs.children=new Map,ve(e,t,a,r),a},createNode(n,r,i,a=0){if(!e.isDir(i)&&!e.isFile(i)&&!e.isLink(i))throw new e.ErrnoError(E.EINVAL);let o=n===null?``:O(n.opfs?.relPath??``,r),s=e.createNode(n,r,i,a);return s.node_ops=t.node_ops,s.stream_ops=t.stream_ops,s.timestamp=Date.now(),n!==null&&(s.mount=n.mount),s.opfs={relPath:o,size:0,mtime:s.timestamp},e.isDir(i)&&(s.opfs.children=new Map),s},node_ops:void 0,stream_ops:void 0};return t.node_ops=ge(e,t),t.stream_ops=_e(e),t}const k=new WeakMap;function A(e,t){let n=(k.get(e)??Promise.resolve()).then(t,t);k.set(e,n),e.opts.flush||(e.opts.flush=()=>k.get(e)??Promise.resolve())}async function be(e){await(k.get(e)??Promise.resolve())}var xe=class{backing;onClose;constructor(e,t){this.backing=e,this.onClose=t}read(e,t){let n=t?.at??0,r=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),i=Math.min(this.backing.data.length,n+r.byteLength),a=Math.max(0,i-n);return r.set(this.backing.data.subarray(n,n+a),0),a}write(e,t){let n=t?.at??0,r=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),i=n+r.byteLength;if(i>this.backing.data.length){let e=new Uint8Array(i);e.set(this.backing.data),this.backing.data=e}return this.backing.data.set(r,n),this.backing.dirty=!0,r.byteLength}truncate(e){if(e===this.backing.data.length)return;let t=new Uint8Array(e);t.set(this.backing.data.subarray(0,Math.min(e,this.backing.data.length))),this.backing.data=t,this.backing.dirty=!0}getSize(){return this.backing.data.length}flush(){}close(){this.onClose()}};function Se(){let e=new Map,t=new Set;return{provider:{acquire(n,r){let i=e.get(n);return i||(i={data:new Uint8Array,dirty:!0},e.set(n,i),t.add(n)),new xe(i,()=>{i.dirty&&t.add(n)})},release(e){}},async preload(t){for(let[n,r]of t.entries){if(r.kind!==`file`)continue;let t=await r.fileHandle.getFile(),i=new Uint8Array(await t.arrayBuffer());e.set(n,{data:i,dirty:!1})}},async flush(t){for(let[n,r]of e){if(!r.dirty)continue;let e=n.split(`/`),i=t;for(let t of e.slice(0,-1))i=await i.getDirectoryHandle(t,{create:!0});let a=await(await i.getFileHandle(e[e.length-1],{create:!0})).createWritable(),o=new ArrayBuffer(r.data.byteLength);new Uint8Array(o).set(r.data),await a.write(o),await a.close(),r.dirty=!1}},getDirtyPaths(){return[...t]}}}async function j(e){if(e.opfs.dirHandle)return e.opfs.dirHandle;let t=e.opfs.relPath.split(`/`).filter(Boolean),n=e.mount.root.opfs.dirHandle;for(let e of t)n=await n.getDirectoryHandle(e,{create:!0});return e.opfs.dirHandle=n,n}async function Ce(e){if(e.opfs.fileHandle)return e.opfs.fileHandle;let t=await(await j(e.parent)).getFileHandle(e.name,{create:!0});return e.opfs.fileHandle=t,t}function M(e,t){if(e.opfs.relPath=t,e.opfs.children)for(let[n,r]of e.opfs.children)M(r,O(t,n))}async function we(e,t,n,r,i){let a=await j(t),o=await j(r),s=await(await a.getFileHandle(n)).getFile(),c=new Uint8Array(await s.arrayBuffer()),l=await o.getFileHandle(i,{create:!0}),u=e.mount.opts.sahProvider.acquire(e.opfs.relPath,l);try{u.truncate(0),c.byteLength>0&&u.write(c,{at:0}),u.flush()}finally{u.close(),e.mount.opts.sahProvider.release(e.opfs.relPath)}await a.removeEntry(n),e.opfs.fileHandle=l}async function Te(e,t,n,r,i){let a=await j(t),o=await j(r),s=await a.getDirectoryHandle(n),c=await o.getDirectoryHandle(i,{create:!0});await N(s,c),await a.removeEntry(n,{recursive:!0}),e.opfs.dirHandle=c}async function N(e,t){let n=e;for await(let[e,r]of n)if(r.kind===`directory`)await N(r,await t.getDirectoryHandle(e,{create:!0}));else{let n=await r.getFile(),i=new Uint8Array(await n.arrayBuffer()),a=await(await t.getFileHandle(e,{create:!0})).createWritable();await a.write(i),await a.close()}}function P(e){return`slicc: synchronous access to mounted path '${e}' is not supported. Use the async slicc.fs module (e.g. \`await slicc.fs.read_text('${e}')\` or \`await slicc.fs.listdir('${e}')\`), or copy the file into the VFS first (\`await slicc.fs.read_bytes('${e}/<file>')\` then write it under /tmp).`}function F(e,t){let n=new e.ErrnoError(E.EIO);return n.message=P(t),n}function Ee(e){let t={mount(n){let r=e.createNode(null,`/`,16877,0);return r.node_ops=t.node_ops,r.stream_ops=t.stream_ops,r.mount=n,r},createNode(n,r,i,a=0){let o=e.createNode(n,r,i,a);return o.node_ops=t.node_ops,o.stream_ops=t.stream_ops,n!==null&&(o.mount=n.mount),o},node_ops:{getattr:e=>{throw F(n(e),I(e))},setattr:e=>{throw F(n(e),I(e))},lookup:e=>{throw F(n(e),I(e))},mknod:e=>{throw F(n(e),I(e))},rename:e=>{throw F(n(e),I(e))},unlink:e=>{throw F(n(e),I(e))},rmdir:e=>{throw F(n(e),I(e))},readdir:e=>{throw F(n(e),I(e))},symlink:e=>{throw F(n(e),I(e))},readlink:e=>{throw F(n(e),I(e))}},stream_ops:{open:e=>{throw F(n(e.node),I(e.node))},close:()=>{},read:e=>{throw F(n(e.node),I(e.node))},write:e=>{throw F(n(e.node),I(e.node))},llseek:e=>{throw F(n(e.node),I(e.node))}}};function n(t){return e}return t}function I(e){let t=e.mount;return t?.opts?.mountPath??t?.mountpoint??`<unknown mount>`}function De(e,t){let n=e.MOUNT_BOMB_FS;return n||(n=Ee(t),e.MOUNT_BOMB_FS=n),n}function Oe(e,t,n=()=>{}){if(t.length===0)return;let r=De(e.filesystems,e);for(let i of t)try{try{e.stat(i)}catch{e.mkdirTree(i)}e.mount(r,{mountPath:i},i)}catch(e){n(`mount '${i}': bomb overlay failed: ${e instanceof Error?e.message:String(e)}`)}}function ke(e){return P(e)}async function Ae(e,t){if(t.length===0)return;let n={};for(let e of t)n[e]=ke(e);let r=JSON.stringify({prefixes:t,messages:n});e.globals.set(`__slicc_mount_data`,r);try{await e.runPythonAsync(`
|
|
12
|
+
import builtins as _slicc_builtins
|
|
13
|
+
import io as _slicc_io
|
|
14
|
+
import os as _slicc_os
|
|
15
|
+
import os.path as _slicc_osp
|
|
16
|
+
import errno as _slicc_errno
|
|
17
|
+
import json as _slicc_json
|
|
18
|
+
|
|
19
|
+
_slicc_data = _slicc_json.loads(__slicc_mount_data)
|
|
20
|
+
_slicc_mount_prefixes = list(_slicc_data['prefixes'])
|
|
21
|
+
_slicc_mount_messages = dict(_slicc_data['messages'])
|
|
22
|
+
del _slicc_data
|
|
23
|
+
|
|
24
|
+
def _slicc_match_mount_prefix(path):
|
|
25
|
+
if path is None:
|
|
26
|
+
return None
|
|
27
|
+
if isinstance(path, int):
|
|
28
|
+
return None
|
|
29
|
+
try:
|
|
30
|
+
s = _slicc_os.fspath(path)
|
|
31
|
+
except TypeError:
|
|
32
|
+
return None
|
|
33
|
+
if isinstance(s, bytes):
|
|
34
|
+
try:
|
|
35
|
+
s = s.decode('utf-8', 'surrogateescape')
|
|
36
|
+
except Exception:
|
|
37
|
+
return None
|
|
38
|
+
if not isinstance(s, str):
|
|
39
|
+
return None
|
|
40
|
+
try:
|
|
41
|
+
resolved = _slicc_osp.abspath(s)
|
|
42
|
+
except Exception:
|
|
43
|
+
return None
|
|
44
|
+
for prefix in _slicc_mount_prefixes:
|
|
45
|
+
if resolved == prefix or resolved.startswith(prefix + '/'):
|
|
46
|
+
return prefix
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
def _slicc_raise_mount_guard(path, prefix):
|
|
50
|
+
msg = _slicc_mount_messages.get(prefix)
|
|
51
|
+
if not msg:
|
|
52
|
+
msg = "slicc: synchronous access to mounted path '" + prefix + "' is not supported; use the async slicc.fs module."
|
|
53
|
+
raise OSError(_slicc_errno.EIO, msg, str(path))
|
|
54
|
+
|
|
55
|
+
_slicc_orig_builtins_open = _slicc_builtins.open
|
|
56
|
+
_slicc_orig_io_open = _slicc_io.open
|
|
57
|
+
_slicc_orig_listdir = _slicc_os.listdir
|
|
58
|
+
_slicc_orig_scandir = _slicc_os.scandir
|
|
59
|
+
_slicc_orig_stat = _slicc_os.stat
|
|
60
|
+
_slicc_orig_lstat = _slicc_os.lstat
|
|
61
|
+
_slicc_orig_mkdir = _slicc_os.mkdir
|
|
62
|
+
_slicc_orig_remove = _slicc_os.remove
|
|
63
|
+
_slicc_orig_rename = _slicc_os.rename
|
|
64
|
+
|
|
65
|
+
def _slicc_guarded_builtins_open(file, *args, **kwargs):
|
|
66
|
+
if isinstance(file, int):
|
|
67
|
+
return _slicc_orig_builtins_open(file, *args, **kwargs)
|
|
68
|
+
prefix = _slicc_match_mount_prefix(file)
|
|
69
|
+
if prefix is not None:
|
|
70
|
+
_slicc_raise_mount_guard(file, prefix)
|
|
71
|
+
return _slicc_orig_builtins_open(file, *args, **kwargs)
|
|
72
|
+
|
|
73
|
+
def _slicc_guarded_io_open(file, *args, **kwargs):
|
|
74
|
+
if isinstance(file, int):
|
|
75
|
+
return _slicc_orig_io_open(file, *args, **kwargs)
|
|
76
|
+
prefix = _slicc_match_mount_prefix(file)
|
|
77
|
+
if prefix is not None:
|
|
78
|
+
_slicc_raise_mount_guard(file, prefix)
|
|
79
|
+
return _slicc_orig_io_open(file, *args, **kwargs)
|
|
80
|
+
|
|
81
|
+
def _slicc_make_path_guard(orig):
|
|
82
|
+
def _guarded(path, *args, **kwargs):
|
|
83
|
+
prefix = _slicc_match_mount_prefix(path)
|
|
84
|
+
if prefix is not None:
|
|
85
|
+
_slicc_raise_mount_guard(path, prefix)
|
|
86
|
+
return orig(path, *args, **kwargs)
|
|
87
|
+
return _guarded
|
|
88
|
+
|
|
89
|
+
def _slicc_guarded_rename(src, dst, *args, **kwargs):
|
|
90
|
+
for p in (src, dst):
|
|
91
|
+
prefix = _slicc_match_mount_prefix(p)
|
|
92
|
+
if prefix is not None:
|
|
93
|
+
_slicc_raise_mount_guard(p, prefix)
|
|
94
|
+
return _slicc_orig_rename(src, dst, *args, **kwargs)
|
|
95
|
+
|
|
96
|
+
_slicc_builtins.open = _slicc_guarded_builtins_open
|
|
97
|
+
_slicc_io.open = _slicc_guarded_io_open
|
|
98
|
+
_slicc_os.listdir = _slicc_make_path_guard(_slicc_orig_listdir)
|
|
99
|
+
_slicc_os.scandir = _slicc_make_path_guard(_slicc_orig_scandir)
|
|
100
|
+
_slicc_os.stat = _slicc_make_path_guard(_slicc_orig_stat)
|
|
101
|
+
_slicc_os.lstat = _slicc_make_path_guard(_slicc_orig_lstat)
|
|
102
|
+
_slicc_os.mkdir = _slicc_make_path_guard(_slicc_orig_mkdir)
|
|
103
|
+
_slicc_os.remove = _slicc_make_path_guard(_slicc_orig_remove)
|
|
104
|
+
_slicc_os.rename = _slicc_guarded_rename
|
|
105
|
+
`)}finally{try{e.runPython(`del __slicc_mount_data`)}catch{}}}var L=class{port;nextId=1;pending=new Map;eventSubscribers=new Map;progressWaiters=new Set;handler;disposed=!1;constructor(e){this.port=e,this.handler=e=>{let t=e.data;if(t?.type===`realm-rpc-res`){let t=e.data,n=this.pending.get(t.id);if(!n)return;this.pending.delete(t.id),typeof t.error==`string`?n.reject(Error(t.error)):n.resolve(t.result),this.notifyProgress();return}if(t?.type===`realm-event`){let t=e.data,n=this.eventSubscribers.get(t.channel);if(!n)return;for(let e of[...n])try{e(t.payload)}catch{}}},e.addEventListener(`message`,this.handler),e.start?.()}get pendingCount(){return this.pending.size+this.eventSubscriptionCount}get eventSubscriptionCount(){let e=0;for(let t of this.eventSubscribers.values())e+=t.size;return e}waitForProgress(){return this.pendingCount===0?Promise.resolve():new Promise(e=>{this.progressWaiters.add(e)})}notifyProgress(){if(this.progressWaiters.size===0)return;let e=[...this.progressWaiters];this.progressWaiters.clear();for(let t of e)t()}call(e,t,n=[]){if(this.disposed)return Promise.reject(Error(`realm-rpc: client disposed`));let r=this.nextId++,i={type:`realm-rpc-req`,id:r,channel:e,op:t,args:n};return new Promise((e,t)=>{this.pending.set(r,{resolve:e,reject:t}),this.port.postMessage(i)})}onEvent(e,t){if(this.disposed)return()=>{};let n=this.eventSubscribers.get(e);return n||(n=new Set,this.eventSubscribers.set(e,n)),n.add(t),this.notifyProgress(),()=>{let n=this.eventSubscribers.get(e);n&&(n.delete(t),n.size===0&&this.eventSubscribers.delete(e),this.notifyProgress())}}dispose(){if(this.disposed)return;this.disposed=!0,this.port.removeEventListener(`message`,this.handler);let e=Error(`realm-rpc: client disposed`);for(let t of this.pending.values())t.reject(e);this.pending.clear(),this.eventSubscribers.clear(),this.notifyProgress()}};function je(e){return{listdir(t){return e.call(`vfs`,`readDir`,[t])},async readBytes(t){let n=await e.call(`vfs`,`readFileBinary`,[t]);return n instanceof Uint8Array?n:new Uint8Array(n)},async writeBytes(t,n){await e.call(`vfs`,`writeFileBinary`,[t,n])},stat(t){return e.call(`vfs`,`stat`,[t])},exists(t){return e.call(`vfs`,`exists`,[t])},async mkdir(t){await e.call(`vfs`,`mkdir`,[t])},async remove(t){await e.call(`vfs`,`rm`,[t])}}}async function Me(e,t){let n=je(t);e.registerJsModule(`_slicc_fs_js`,n),await e.runPythonAsync(`
|
|
106
|
+
import sys
|
|
107
|
+
import types
|
|
108
|
+
import js
|
|
109
|
+
|
|
110
|
+
def _build_slicc_module(_bridge):
|
|
111
|
+
fs_module = types.ModuleType("slicc.fs")
|
|
112
|
+
|
|
113
|
+
async def listdir(path):
|
|
114
|
+
result = await _bridge.listdir(path)
|
|
115
|
+
return [str(name) for name in result.to_py()] if hasattr(result, "to_py") else [str(name) for name in result]
|
|
116
|
+
|
|
117
|
+
async def read_bytes(path):
|
|
118
|
+
result = await _bridge.readBytes(path)
|
|
119
|
+
# Pyodide returns JS Uint8Array as memoryview; coerce to bytes.
|
|
120
|
+
if hasattr(result, "to_bytes"):
|
|
121
|
+
return result.to_bytes()
|
|
122
|
+
if isinstance(result, memoryview):
|
|
123
|
+
return bytes(result)
|
|
124
|
+
return bytes(result)
|
|
125
|
+
|
|
126
|
+
async def read_text(path, encoding="utf-8"):
|
|
127
|
+
data = await read_bytes(path)
|
|
128
|
+
return data.decode(encoding)
|
|
129
|
+
|
|
130
|
+
async def write_bytes(path, data):
|
|
131
|
+
if isinstance(data, str):
|
|
132
|
+
raise TypeError("write_bytes expects bytes-like; use write_text for str")
|
|
133
|
+
if isinstance(data, (bytes, bytearray, memoryview)):
|
|
134
|
+
payload = bytes(data)
|
|
135
|
+
else:
|
|
136
|
+
payload = bytes(data)
|
|
137
|
+
# Convert Python bytes to a real JS Uint8Array before crossing
|
|
138
|
+
# the realm RPC boundary. The bridge call ultimately hits
|
|
139
|
+
# \`port.postMessage\` (see realm-rpc.ts), which structured-
|
|
140
|
+
# clones its argument; a Python \`bytes\` would arrive as a
|
|
141
|
+
# PyProxy and trigger DataCloneError. \`js.Uint8Array.new\`
|
|
142
|
+
# copies the buffer into a JS typed array that clones cleanly.
|
|
143
|
+
await _bridge.writeBytes(path, js.Uint8Array.new(payload))
|
|
144
|
+
|
|
145
|
+
async def write_text(path, text, encoding="utf-8"):
|
|
146
|
+
if not isinstance(text, str):
|
|
147
|
+
raise TypeError("write_text expects str; use write_bytes for bytes")
|
|
148
|
+
await write_bytes(path, text.encode(encoding))
|
|
149
|
+
|
|
150
|
+
async def stat(path):
|
|
151
|
+
result = await _bridge.stat(path)
|
|
152
|
+
obj = result.to_py() if hasattr(result, "to_py") else result
|
|
153
|
+
if isinstance(obj, dict):
|
|
154
|
+
return {
|
|
155
|
+
"isDirectory": bool(obj.get("isDirectory", False)),
|
|
156
|
+
"isFile": bool(obj.get("isFile", False)),
|
|
157
|
+
"size": int(obj.get("size", 0)),
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
"isDirectory": bool(getattr(obj, "isDirectory", False)),
|
|
161
|
+
"isFile": bool(getattr(obj, "isFile", False)),
|
|
162
|
+
"size": int(getattr(obj, "size", 0)),
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async def exists(path):
|
|
166
|
+
result = await _bridge.exists(path)
|
|
167
|
+
return bool(result)
|
|
168
|
+
|
|
169
|
+
async def mkdir(path, parents=False):
|
|
170
|
+
# The underlying vfs.mkdir is recursive ({recursive: true} in
|
|
171
|
+
# realm-host.ts), matching parents=True semantics. With
|
|
172
|
+
# parents=False we raise FileExistsError when the target
|
|
173
|
+
# already exists, mirroring pathlib.Path.mkdir(parents=False).
|
|
174
|
+
if not parents:
|
|
175
|
+
try:
|
|
176
|
+
already = await exists(path)
|
|
177
|
+
except Exception:
|
|
178
|
+
already = False
|
|
179
|
+
if already:
|
|
180
|
+
raise FileExistsError(path)
|
|
181
|
+
await _bridge.mkdir(path)
|
|
182
|
+
|
|
183
|
+
async def remove(path):
|
|
184
|
+
await _bridge.remove(path)
|
|
185
|
+
|
|
186
|
+
async def walk(path):
|
|
187
|
+
results = []
|
|
188
|
+
async def _visit(current):
|
|
189
|
+
names = await listdir(current)
|
|
190
|
+
dirnames = []
|
|
191
|
+
filenames = []
|
|
192
|
+
for name in names:
|
|
193
|
+
child = current + "/" + name if current != "/" else "/" + name
|
|
194
|
+
try:
|
|
195
|
+
st = await stat(child)
|
|
196
|
+
except Exception:
|
|
197
|
+
continue
|
|
198
|
+
if st["isDirectory"]:
|
|
199
|
+
dirnames.append(name)
|
|
200
|
+
elif st["isFile"]:
|
|
201
|
+
filenames.append(name)
|
|
202
|
+
results.append((current, dirnames, filenames))
|
|
203
|
+
for d in list(dirnames):
|
|
204
|
+
child = current + "/" + d if current != "/" else "/" + d
|
|
205
|
+
await _visit(child)
|
|
206
|
+
await _visit(path)
|
|
207
|
+
return results
|
|
208
|
+
|
|
209
|
+
fs_module.listdir = listdir
|
|
210
|
+
fs_module.read_bytes = read_bytes
|
|
211
|
+
fs_module.read_text = read_text
|
|
212
|
+
fs_module.write_bytes = write_bytes
|
|
213
|
+
fs_module.write_text = write_text
|
|
214
|
+
fs_module.stat = stat
|
|
215
|
+
fs_module.exists = exists
|
|
216
|
+
fs_module.mkdir = mkdir
|
|
217
|
+
fs_module.remove = remove
|
|
218
|
+
fs_module.walk = walk
|
|
219
|
+
|
|
220
|
+
slicc_module = types.ModuleType("slicc")
|
|
221
|
+
slicc_module.fs = fs_module
|
|
222
|
+
sys.modules["slicc"] = slicc_module
|
|
223
|
+
sys.modules["slicc.fs"] = fs_module
|
|
224
|
+
return slicc_module
|
|
225
|
+
|
|
226
|
+
import _slicc_fs_js as _bridge
|
|
227
|
+
_build_slicc_module(_bridge)
|
|
228
|
+
del _build_slicc_module
|
|
229
|
+
del _bridge
|
|
230
|
+
`)}const R=a(`pyodide`,`314.0.6`),z=`https://cdn.jsdelivr.net/pyodide/v${R}/full/`,B=`pyodide is not installed in node_modules: run \`ipk add pyodide@${R}\` (no network fallback)`,V={asmJs:`pyodide.asm.mjs`,asmWasm:`pyodide.asm.wasm`,stdlibZip:`python_stdlib.zip`,lockJson:`pyodide-lock.json`};async function Ne(e){let t;try{t=await i(`pyodide/package.json`,e.fromDir,e.reader)}catch{return null}if(t.type!==`file`)return null;let r=n(t.path).dir;for(let t of Object.values(V))if(!await e.reader.exists(`${r}/${t}`))return null;return r}async function Pe(e,t){try{let[n,r,i,a]=await Promise.all([e.call(`vfs`,`readFile`,[`${t}/${V.asmJs}`]),e.call(`vfs`,`readFileBinary`,[`${t}/${V.asmWasm}`]),e.call(`vfs`,`readFileBinary`,[`${t}/${V.stdlibZip}`]),e.call(`vfs`,`readFile`,[`${t}/${V.lockJson}`])]);return{asmJsSource:n,asmWasmBytes:r instanceof Uint8Array?r:new Uint8Array(r),stdlibBytes:i instanceof Uint8Array?i:new Uint8Array(i),lockJsonString:a}}catch{return null}}function Fe(e,t){let n=e+V.asmWasm,r=globalThis.fetch,i=!0,a=(e,i)=>(typeof e==`string`?e:e instanceof URL?e.href:e.url)===n?Promise.resolve(new Response(t,{headers:{"Content-Type":`application/wasm`}})):r(e,i);return globalThis.fetch=a,{restore:()=>{i&&(i=!1,globalThis.fetch===a&&(globalThis.fetch=r))}}}async function Ie(e,t,n){let r=await Pe(n,t);if(!r)throw Error(B);let i=URL.createObjectURL(new Blob([r.asmJsSource],{type:`text/javascript`})),a=URL.createObjectURL(new Blob([r.stdlibBytes],{type:`application/zip`})),s=`slicc-pyodide://local/${crypto.randomUUID()}/`,c=Fe(s,r.asmWasmBytes);try{let t=await import(i);return await e.loadPyodide({indexURL:s,lockFileContents:r.lockJsonString,stdLibURL:a,createPyodideModule:t.default,packageBaseUrl:o(`/workspace/python_wheels/`)})}finally{c.restore(),URL.revokeObjectURL(i),URL.revokeObjectURL(a)}}async function Le(e,t,n=()=>import(`./pyodide-65Z_RapY.js`)){let r=[],i=[],a=new L(t),o;try{let t=await n();o=e.pyodideAssetRoot?await Ie(t,e.pyodideAssetRoot,a):await t.loadPyodide({indexURL:e.pyodideIndexURL})}catch(e){a.dispose();let n={type:`realm-error`,message:`loadPyodide: ${e instanceof Error?e.message:String(e)}`};t.postMessage(n);return}let s=e=>{i.push(`Warning: ${e}\n`)},c=[],l;try{await Re(o,a,s,ze(e.pyodideAssetRoot)),c=await qe(o,e,s),await Je(o,e,s),await Ge(o,a,e,s),await Ye(o,a,s);try{o.FS.chdir(e.cwd)}catch{}Xe(o,e,r,i),l=await Ze(o,i),await Qe(c,e,a,s)}catch(e){a.dispose();let n={type:`realm-error`,message:`${e instanceof Error?e.message:String(e)}${i.length?`\n${i.join(``)}`:``}`};t.postMessage(n);return}a.dispose();let u={type:`realm-done`,stdout:r.join(``),stderr:i.join(``),exitCode:l};t.postMessage(u)}const H=`/workspace/python_wheels`;async function Re(e,t,n,r){await Be(t,n,r);try{await e.loadPackage([`micropip`])}catch(e){n(`micropip preload failed: ${G(e)}`)}}function ze(e){return e?`${e}/${V.lockJson}`:`/workspace/node_modules/pyodide/pyodide-lock.json`}const U=1e4,W=new WeakMap;function Be(e,t,n){let r=W.get(e);if(r)return r;let i=Ve(e,t,n);return W.set(e,i),i}async function Ve(e,t,n){let r;try{if(!await e.call(`vfs`,`exists`,[n]))return;let t=await e.call(`vfs`,`readFile`,[n]),i=JSON.parse(t);for(let[e,t]of Object.entries(i.packages??{}))if(t?.file_name&&h(t.name??e)===`micropip`){r=t;break}}catch(e){t(`micropip wheel staging skipped: ${G(e)}`);return}if(!r?.file_name||!r.sha256)return;let i=`${H}/${r.file_name}`;try{if(await e.call(`vfs`,`exists`,[i]))return;let t=await d(He(e),{url:`${z}${r.file_name}`,sha256:r.sha256,label:`micropip wheel`,timeoutMs:U});await e.call(`vfs`,`mkdir`,[H]),await e.call(`vfs`,`writeFileBinary`,[i,t])}catch(e){t(`micropip wheel staging failed: ${G(e)}`)}}function He(e){return async(t,n)=>{let r={method:n?.method??`GET`,...n?.headers?{headers:n.headers}:{},...n?.body===void 0?{}:{body:n.body}},i=await Ue(e.call(`fetch`,`request`,[t,r]),n?.timeoutMs??U,t);return{status:i.status,statusText:i.statusText,headers:i.headers,body:i.body instanceof Uint8Array?i.body:new Uint8Array(i.body),url:i.url}}}function Ue(e,t,n){let r,i=new Promise((e,i)=>{r=setTimeout(()=>i(Error(`request to ${n} timed out after ${t}ms`)),t)});return Promise.race([e,i]).finally(()=>clearTimeout(r))}function We(e){return{exists:t=>e.call(`vfs`,`exists`,[t]),readFile:t=>e.call(`vfs`,`readFile`,[t])}}async function Ge(e,t,n,r){let i=We(t),a;try{a=await v(i,n.cwd)}catch(e){r(`manifest discovery failed: ${G(e)}`);return}if(a===null)return;let o,s;try{let[e,t]=await Promise.all([w(i,a),T(i,a)]);o=e.dependencies,s=t}catch(e){r(`manifest read failed: ${G(e)}`);return}let c=new Map;for(let e of s)c.set(h(e.name),e);for(let t of o){let{name:n}=_(t);if(!n)continue;let i=c.get(h(n));if(!i){r(`no integrity pin for \`${n}\`; run \`di sync\` to repair`);continue}await Ke(e,i,r)}}async function Ke(e,t,n){switch(t.source){case`pyodide-cdn`:try{await e.loadPackage([t.name])}catch(e){n(`activation of \`${t.name}\` failed: ${G(e)}`)}return;case`pypi`:try{let n=`${H}/${t.fileName}`;await e.runPythonAsync(`import micropip; await micropip.install('emfs:${n}')`)}catch(e){n(`activation of \`${t.name}\` failed: ${G(e)}`)}return;default:n(`unknown source \`${t.source}\` for \`${t.name}\`; skipping`)}}async function qe(e,t,n){if(t.opfsMountDbName===void 0)return[];let r=t.pyodideMountDirs??[t.cwd,`/tmp`],i=t.mountPoints??[],a=new Set(i.map(e=>e.path));try{return(await tt(e,r,t.opfsMountDbName,n,{skipMountPaths:a})).mounts}catch(e){return n(`VFS→Pyodide OPFS mount failed: ${G(e)}`),[]}}async function Je(e,t,n){let r=t.mountPoints??[];if(r.length!==0){try{Oe(e.FS,r.map(e=>e.path),n)}catch(e){n(`bomb overlay install failed: ${G(e)}`)}try{await Ae(e,r.map(e=>e.path))}catch(e){n(`python mount guard install failed: ${G(e)}`)}}}async function Ye(e,t,n){try{await Me(e,t)}catch(e){n(`slicc.fs registration failed: ${G(e)}`)}}function Xe(e,t,n,r){e.setStdout({batched:e=>n.push(e+`
|
|
231
|
+
`)}),e.setStderr({batched:e=>r.push(e+`
|
|
232
|
+
`)});let i=!1;e.setStdin({stdin:()=>i||!t.stdin?null:(i=!0,t.stdin)}),e.globals.set(`__slicc_code`,t.code),e.globals.set(`__slicc_filename`,t.filename),e.globals.set(`__slicc_argv`,t.argv)}async function Ze(e,t){let n;try{await e.runPythonAsync(`
|
|
233
|
+
import sys
|
|
234
|
+
import traceback
|
|
235
|
+
|
|
236
|
+
__slicc_exit_code = 0
|
|
237
|
+
try:
|
|
238
|
+
sys.argv = __slicc_argv
|
|
239
|
+
exec(compile(__slicc_code, __slicc_filename, "exec"), {"__name__": "__main__", "__file__": __slicc_filename})
|
|
240
|
+
except SystemExit as exc:
|
|
241
|
+
code = exc.code
|
|
242
|
+
if code is None:
|
|
243
|
+
__slicc_exit_code = 0
|
|
244
|
+
elif isinstance(code, int):
|
|
245
|
+
__slicc_exit_code = code
|
|
246
|
+
else:
|
|
247
|
+
print(code, file=sys.stderr)
|
|
248
|
+
__slicc_exit_code = 1
|
|
249
|
+
except BaseException:
|
|
250
|
+
traceback.print_exc()
|
|
251
|
+
__slicc_exit_code = 1
|
|
252
|
+
`);let t=e.globals.get(`__slicc_exit_code`);n=typeof t==`number`?t:Number(t??1)}catch(e){let r=e instanceof Error?e.message:String(e);t.push(`${r}\n`),n=1}try{e.runPython(`del __slicc_code, __slicc_filename, __slicc_argv, __slicc_exit_code`)}catch{}return n}async function Qe(e,t,n,r){if(t.opfsMountDbName!==void 0){try{await rt(e)}catch(e){r(`Pyodide→VFS OPFS flush failed: ${e instanceof Error?e.message:String(e)}`)}try{await it(e,n)}catch(e){r(`Pyodide→kernel VFS invalidation failed: ${G(e)}`)}}}const $e=new Set([`dev`,`proc`,`lib`,`tmp`,`home`]);function G(e){if(e&&typeof e==`object`){let t=e,n=typeof t.errno==`number`,r=typeof t.code==`string`;if(n||r){let e=typeof t.name==`string`&&t.name?t.name:`Error`,i=typeof t.message==`string`?t.message:``,a=[];n&&a.push(`errno ${t.errno}`),r&&a.push(t.code);let o=a.length?` (${a.join(`, `)})`:``;return i?`${e}: ${i}${o}`:`${e}${o}`}}return e instanceof Error?e.message:String(e)}function et(e){let t=e.FS.filesystems,n=t.OPFS_SYNC_FS;return n||(n=ye(e.FS),t.OPFS_SYNC_FS=n),n}async function tt(e,t,n,r=()=>{},i={}){let a=[],o=i.skipMountPaths??new Set,s=navigator.storage;if(!s?.getDirectory)return r(`VFS→Pyodide OPFS mount skipped: navigator.storage.getDirectory unavailable`),{mounts:a};let c;try{c=await s.getDirectory()}catch(e){return r(`VFS→Pyodide OPFS mount: getDirectory() failed: ${G(e)}`),{mounts:a}}let l;try{l=await c.getDirectoryHandle(n,{create:!0})}catch(e){return r(`VFS→Pyodide OPFS mount: opening '${n}' failed: ${G(e)}`),{mounts:a}}let u=et(e);for(let n of t){if(n===`/`){await nt(e,u,l,o,a,r);continue}if(!o.has(n))try{let t=l;for(let e of n.split(`/`).filter(Boolean))t=await t.getDirectoryHandle(e,{create:!0});await K(e,u,n,t,a)}catch(e){r(`VFS→Pyodide OPFS mount '${n}' failed: ${G(e)}`)}}return{mounts:a}}async function nt(e,t,n,r,i,a){try{let o=n;for await(let[n,s]of o){if(s.kind!==`directory`||$e.has(n))continue;let o=`/${n}`;if(!r.has(o))try{await K(e,t,o,s,i)}catch(e){a(`VFS→Pyodide OPFS mount '${o}' failed: ${G(e)}`)}}}catch(e){a(`VFS→Pyodide OPFS mount '/' failed: ${G(e)}`)}}async function K(e,t,n,r,i){try{e.FS.stat(n)}catch{e.FS.mkdirTree(n)}let a=await he(r),o=Se();await o.preload(a);let s={rootHandle:r,prewalk:a,sahProvider:o.provider},c=e.FS.mount(t,s,n),l=c?.mount??{opts:s,mountpoint:n,root:c};i.push({pyPath:n,mount:l,rootHandle:r,flushBuffers:o.flush,getDirtyPaths:o.getDirtyPaths})}async function rt(e){for(let t of e)await be(t.mount),await t.flushBuffers(t.rootHandle)}async function it(e,t){let n=[];for(let t of e)for(let e of t.getDirtyPaths())n.push(t.pyPath===`/`?`/${e}`:`${t.pyPath}/${e}`);n.length>0&&await t.call(`vfs`,`invalidatePaths`,[n])}const at=new Set([`bcrypt`,`better-sqlite3`,`canvas`,`cpu-features`,`fsevents`,`leveldown`,`libxmljs`,`libxmljs2`,`node-gyp-build`,`node-sass`,`puppeteer`,`robotjs`,`sass-embedded`,`sharp`,`snappy`,`sqlite3`,`tree-sitter`,`usb`]),ot={sharp:` Use the built-in 'convert' shell command for image work.`,canvas:` Use the built-in 'convert' / OffscreenCanvas for image work.`,"better-sqlite3":` Use the built-in 'sqlite3' shell command (sql.js WASM).`,sqlite3:` Use the built-in 'sqlite3' shell command (sql.js WASM).`,bcrypt:` Use crypto.subtle.digest() with PBKDF2 / Argon2 in pure JS.`,puppeteer:` Use the built-in browser-automation shell commands.`};function st(e,t){let n=ot[t]??``;return Error(`require('${e}'): '${t}' is a Node native module (C++ bindings) — it cannot run in the browser sandbox.${n}`)}const q=new Map,J=new Map;function ct(e){let t=crypto.randomUUID();return q.set(t,e),t}function Y(e){return q.get(e)??null}function lt(e,t){if(!q.has(e))return t.abort(),()=>{};let n=J.get(e);return n||(n=new Set,J.set(e,n)),n.add(t),()=>{let n=J.get(e);n&&(n.delete(t),n.size===0&&J.delete(e))}}function ut(e){q.delete(e);let t=J.get(e);if(t){J.delete(e);for(let e of t)e.signal.aborted||e.abort()}}function X(e){let t=e instanceof Error?e.message:String(e),n=e?.code;return typeof n==`string`&&/^E[A-Z]+$/.test(n)?{ok:!1,errno:n,message:t}:{ok:!1,errno:`EIO`,message:t}}async function dt(e){let t=Y(e.token);if(!t)return{ok:!1,errno:`EACCES`,message:`sync-fs: unknown or revoked token`};let{fs:n,cwd:r}=t;try{let t=n.resolvePath(r,e.path);switch(e.op){case`read`:return{ok:!0,kind:`bytes`,bytes:await n.readFileBuffer(t)};case`write`:return await n.writeFile(t,e.body??new Uint8Array),{ok:!0,kind:`void`};case`exists`:return{ok:!0,kind:`json`,json:await n.exists(t)};case`stat`:{let e=await n.stat(t);return{ok:!0,kind:`json`,json:{isDirectory:e.isDirectory,isFile:e.isFile,isSymbolicLink:e.isSymbolicLink,size:e.size}}}case`lstat`:{let e=await n.lstat(t);return{ok:!0,kind:`json`,json:{isDirectory:e.isDirectory,isFile:e.isFile,isSymbolicLink:e.isSymbolicLink??!1,size:e.size}}}case`readdir`:return{ok:!0,kind:`json`,json:await n.readdir(t)};case`mkdir`:return await n.mkdir(t,{recursive:!0}),{ok:!0,kind:`void`};case`rm`:return await n.rm(t,{recursive:!0}),{ok:!0,kind:`void`};case`rename`:{let i=n.resolvePath(r,e.arg2??``),{renameViaFs:a}=await import(`./rename-via-fs-ckVY1Ljv.js`);return await a(n,t,i),{ok:!0,kind:`void`}}default:return{ok:!1,errno:`EINVAL`,message:`sync-fs: unknown op '${e.op}'`}}}catch(e){return X(e)}}function ft(e){return`slicc-sync-fs-`+e}const pt=`/__slicc/fs-sync`,mt=`/__slicc/exec-sync`,ht=`x-slicc-fs-token`,gt=`x-slicc-fs-errno`,_t=`x-slicc-fs`,vt=`sync-fs-req`,yt=`sync-fs-ack`,bt=`sync-fs-res`,xt=25e3,St=12e4,Z=6e5,Ct=5e3,wt=`exec`;function Tt(e){return e.channel===wt}function Et(e){let{command:t}=e;if(Array.isArray(t)){if(t.length===0||!t.every(e=>typeof e==`string`))return{errno:`EINVAL`,message:`sync-exec: argv must be a non-empty string[]`};let[e,...n]=t;return{cmd:e,args:n}}return typeof t!=`string`||t.length===0?{errno:`EINVAL`,message:`sync-exec: command must be a non-empty string`}:e.args===void 0?{cmd:t}:!Array.isArray(e.args)||!e.args.every(e=>typeof e==`string`)?{errno:`EINVAL`,message:`sync-exec: args must be a string[]`}:{cmd:t,args:e.args}}async function Dt(e,t,n){if(n===void 0)return{cwd:t};if(typeof n!=`string`)return{errno:`EINVAL`,message:`sync-exec: cwd must be a string`};if(n.length===0)return{errno:`ENOENT`,message:`sync-exec: cwd is empty`};let r=e.resolvePath(t,n);try{if(!(await e.stat(r)).isDirectory)return{errno:`ENOTDIR`,message:`sync-exec: cwd is not a directory: ${r}`}}catch(e){let t=e?.code;return t===`EACCES`||t===`EPERM`?{errno:t,message:`sync-exec: cwd not accessible: ${r}`}:{errno:`ENOENT`,message:`sync-exec: cwd does not exist: ${r}`}}return{cwd:r}}function Q(e){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return{errno:`EINVAL`,message:`sync-exec: env must be an object`};let t={};for(let[n,r]of Object.entries(e))if(r!==void 0){if(typeof r!=`string`)return{errno:`EINVAL`,message:`sync-exec: env[${n}] must be a string`};t[n]=r}return{ok:!0,env:t}}function Ot(e,t){return Math.min(typeof e!=`number`||!Number.isFinite(e)||e<=0?t:e,Z)}async function kt(e){let t=Y(e.token);if(!t)return{ok:!1,errno:`EACCES`,message:`sync-exec: unknown or revoked token`};if(!t.exec)return{ok:!1,errno:`ENOSYS`,message:`sync-exec: exec is not available`};let n=Et(e);if(`errno`in n)return{ok:!1,errno:n.errno,message:n.message};let r=await Dt(t.fs,t.cwd,e.cwd);if(`errno`in r)return{ok:!1,errno:r.errno,message:r.message};let i=Q(e.env);if(i!==void 0&&`errno`in i)return{ok:!1,errno:i.errno,message:i.message};let a=new AbortController,o=!1,s=setTimeout(()=>{o=!0,a.abort()},Ot(e.timeoutMs,Z)),c=lt(e.token,a);try{let o=await t.exec(n.cmd,{cwd:r.cwd,signal:a.signal,...n.args===void 0?{}:{args:n.args},...e.stdin===void 0?{}:{stdin:e.stdin},...i===void 0?{}:{env:i.env,replaceEnv:!0}});return{ok:!0,kind:`json`,json:{stdout:o.stdout,stderr:o.stderr,exitCode:o.exitCode}}}catch(e){return o?{ok:!1,errno:`ETIMEDOUT`,message:`sync-exec: timed out — ${e instanceof Error?e.message:String(e)}`}:a.signal.aborted?{ok:!1,errno:`ECANCELED`,message:`sync-exec: realm disposed`}:X(e)}finally{clearTimeout(s),c()}}const At=1048576,jt=`sync-sab-req`,Mt=`sync-sab-next`,Nt=new TextEncoder,$=new TextDecoder;function Pt(e){if(!e.ok)return{status:4,payload:Nt.encode(JSON.stringify({errno:e.errno,message:e.message}))};switch(e.kind){case`bytes`:return{status:1,payload:e.bytes};case`json`:return{status:2,payload:Nt.encode(JSON.stringify(e.json))};default:return{status:3,payload:new Uint8Array}}}function Ft(e,t){switch(e){case 1:return{ok:!0,kind:`bytes`,bytes:t};case 3:return{ok:!0,kind:`void`};case 2:try{return{ok:!0,kind:`json`,json:JSON.parse($.decode(t))}}catch{return{ok:!1,errno:`EIO`,message:`sync-sab: malformed json payload`}}case 4:try{let e=JSON.parse($.decode(t)),n=typeof e.errno==`string`&&/^E[A-Z]+$/.test(e.errno)?e.errno:`EIO`;return{ok:!1,errno:n,message:String(e.message??n)}}catch{return{ok:!1,errno:`EIO`,message:`sync-sab: malformed errno payload`}}default:return{ok:!1,errno:`EIO`,message:`sync-sab: unknown status ${e}`}}}function It(e){if(e.byteLength<4160)throw Error(`sync-sab: buffer too small (${e.byteLength} < 4160)`);return{header:new Int32Array(e,0,16),window:new Uint8Array(e,64)}}function Lt(){if(typeof SharedArrayBuffer>`u`||typeof Atomics>`u`)return!1;let e=globalThis.crossOriginIsolated;return e===void 0||e===!0}export{ut as A,w as B,bt as C,dt as D,ft as E,R as F,me as G,h as H,Le as I,fe as J,_ as K,Ne as L,st as M,B as N,ct as O,z as P,L as R,vt as S,ht as T,ne as U,T as V,pe as W,s as X,d as Y,o as Z,Ct as _,Pt as a,_t as b,wt as c,Tt as d,Q as f,mt as g,Z as h,Ft as i,at as j,Y as k,Ot as l,St as m,Mt as n,Lt as o,Dt as p,de as q,jt as r,It as s,At as t,kt as u,yt as v,pt as w,xt as x,gt as y,v as z};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./slicc-app-url-B9OxaBDe.js";var t=Uint8Array.of(255,216,255,192,0,11,8,0,1,0,1,1,1,17,0,255,217);function n(e){for(let t=0;t<e.length-8;t++){if(e[t]!==255)continue;let n=e[t+1];if(n===192||n===194){let n=e[t+5]<<8|e[t+6],r=e[t+7]<<8|e[t+8];if(r>0&&n>0)return{width:r,height:n}}}return null}function r(e){if(e.length<24||e[0]!==137||e[1]!==80||e[2]!==78||e[3]!==71)return null;let t=e[16]<<24|e[17]<<16|e[18]<<8|e[19],n=e[20]<<24|e[21]<<16|e[22]<<8|e[23];return t>0&&n>0?{width:t,height:n}:null}async function i(e,r=.7){if(n(e))return e;if(typeof OffscreenCanvas>`u`||typeof createImageBitmap>`u`)return t.slice();let i=new Blob([new Uint8Array(e)],{type:`image/png`}),a=await createImageBitmap(i),o=new OffscreenCanvas(a.width,a.height),s=o.getContext(`2d`);if(!s)throw Error(`could not acquire 2d canvas context`);s.drawImage(a,0,0),a.close();let c=await o.convertToBlob({type:`image/jpeg`,quality:r});return new Uint8Array(await c.arrayBuffer())}function a(e){let t=e.indexOf(`,`),n=t>=0?e.slice(t+1):e,r=atob(n),i=new Uint8Array(r.length);for(let e=0;e<r.length;e++)i[e]=r.charCodeAt(e);return i}function o(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)}var s={ctrl:!1,alt:!1,shift:!1,meta:!1},c={ctrl:`ctrl`,control:`ctrl`,alt:`alt`,shift:`shift`,meta:`meta`,super:`meta`,win:`meta`,cmd:`meta`,command:`meta`},l={return:{key:`Enter`,code:`Enter`},enter:{key:`Enter`,code:`Enter`},kp_enter:{key:`Enter`,code:`NumpadEnter`},tab:{key:`Tab`,code:`Tab`},escape:{key:`Escape`,code:`Escape`},esc:{key:`Escape`,code:`Escape`},space:{key:` `,code:`Space`},backspace:{key:`Backspace`,code:`Backspace`},delete:{key:`Delete`,code:`Delete`},del:{key:`Delete`,code:`Delete`},insert:{key:`Insert`,code:`Insert`},home:{key:`Home`,code:`Home`},end:{key:`End`,code:`End`},pageup:{key:`PageUp`,code:`PageUp`},page_up:{key:`PageUp`,code:`PageUp`},prior:{key:`PageUp`,code:`PageUp`},pagedown:{key:`PageDown`,code:`PageDown`},page_down:{key:`PageDown`,code:`PageDown`},next:{key:`PageDown`,code:`PageDown`},up:{key:`ArrowUp`,code:`ArrowUp`},down:{key:`ArrowDown`,code:`ArrowDown`},left:{key:`ArrowLeft`,code:`ArrowLeft`},right:{key:`ArrowRight`,code:`ArrowRight`},menu:{key:`ContextMenu`,code:`ContextMenu`},caps_lock:{key:`CapsLock`,code:`CapsLock`},num_lock:{key:`NumLock`,code:`NumLock`},scroll_lock:{key:`ScrollLock`,code:`ScrollLock`},print:{key:`PrintScreen`,code:`PrintScreen`},pause:{key:`Pause`,code:`Pause`}};for(let e=1;e<=12;e++)l[`f${e}`]={key:`F${e}`,code:`F${e}`};var u={return:`KEYCODE_ENTER`,enter:`KEYCODE_ENTER`,tab:`KEYCODE_TAB`,escape:`KEYCODE_ESCAPE`,esc:`KEYCODE_ESCAPE`,space:`KEYCODE_SPACE`,backspace:`KEYCODE_DEL`,delete:`KEYCODE_FORWARD_DEL`,del:`KEYCODE_FORWARD_DEL`,home:`KEYCODE_HOME`,end:`KEYCODE_MOVE_END`,insert:`KEYCODE_INSERT`,pageup:`KEYCODE_PAGE_UP`,pagedown:`KEYCODE_PAGE_DOWN`,up:`KEYCODE_DPAD_UP`,down:`KEYCODE_DPAD_DOWN`,left:`KEYCODE_DPAD_LEFT`,right:`KEYCODE_DPAD_RIGHT`,menu:`KEYCODE_MENU`};for(let e=1;e<=12;e++)u[`f${e}`]=`KEYCODE_F${e}`;function d(e){return/^[A-Z][A-Z0-9_]+$/u.test(e)}function f(e){return e.split(/[-+]/u).filter(Boolean)}function p(e){let t=e.toLowerCase();if(l[t])return l[t];if(e.length===1){let t=e;return/[A-Za-z]/u.test(t)?{key:t,code:`Key${t.toUpperCase()}`}:/[0-9]/u.test(t)?{key:t,code:`Digit${t}`}:{".":{key:`.`,code:`Period`},",":{key:`,`,code:`Comma`},"/":{key:`/`,code:`Slash`},";":{key:`;`,code:`Semicolon`},"'":{key:`'`,code:`Quote`},"[":{key:`[`,code:`BracketLeft`},"]":{key:`]`,code:`BracketRight`},"\\":{key:`\\`,code:`Backslash`},"`":{key:"`",code:`Backquote`},"-":{key:`-`,code:`Minus`},"=":{key:`=`,code:`Equal`}}[t]??{key:t,code:``}}return null}function m(e){let t=e.trim();if(!t)return null;if(d(t))return{key:t,code:t,modifiers:{...s},keysym:t,native:t};let n=f(t);if(n.length===0)return null;let r={...s},i=null;for(let e=0;e<n.length;e++){let t=n[e],a=e===n.length-1,o=c[t.toLowerCase()];if(o&&!a){r[o]=!0;continue}o&&a&&n.length,i=t}if(!i)return null;if(d(i))return{key:i,code:i,modifiers:r,keysym:i,native:i};let a=p(i);return a?(i.length===1&&/[A-Z]/u.test(i)&&(r.shift=!0),{key:a.key,code:a.code,modifiers:r,keysym:i}):null}function h(e){return+!!e.alt+(e.ctrl?2:0)+(e.meta?4:0)+(e.shift?8:0)}function g(e,t){let n=h(e.modifiers),r=e.key.length===1&&!e.modifiers.ctrl&&!e.modifiers.alt&&!e.modifiers.meta?e.key:void 0,i=t=>({type:t,key:e.key,code:e.code,modifiers:n,...t===`keyDown`&&r?{text:r}:{}});return t===!0?[i(`keyDown`)]:t===!1?[i(`keyUp`)]:[i(`keyDown`),i(`keyUp`)]}function _(e={x:0,y:0}){return{x:e.x,y:e.y}}function v(e,t){return t.x!==void 0&&t.y!==void 0?(e.x=t.x,e.y=t.y,{x:t.x,y:t.y}):{x:e.x,y:e.y}}var y={1:`left`,2:`middle`,3:`right`};function b(t){if(e(t.url))throw Error(`refusing SLICC app tab '${t.title??t.url}'`)}async function x(e,t){let o=a(await e.screenshot({format:`png`})),s=r(o)??n(o),c=o;t.maxWidth&&s&&s.width>t.maxWidth?c=a(await e.screenshot({format:`png`,maxWidth:t.maxWidth})):t.format!==`png`&&(c=a(await e.screenshot({format:`jpeg`,quality:70})));let l=r(c)??n(c)??s??{width:0,height:0};return t.format!==`png`&&!n(c)&&(c=await i(c)),{mime:n(c)?`image/jpeg`:`image/png`,bytes:c,width:l.width,height:l.height,native:s}}async function S(e,t,n=_()){switch(t.type){case`mousemove`:{let r=v(n,t);await e.send(`Input.dispatchMouseEvent`,{type:`mouseMoved`,x:r.x,y:r.y});return}case`button`:await C(e,t,n);return;case`click`:await w(e,t,n);return;case`drag`:await T(e,t,n);return;case`scroll`:{let r=v(n,t);await e.send(`Input.dispatchMouseEvent`,{type:`mouseWheel`,x:r.x,y:r.y,deltaX:t.dx,deltaY:t.dy});return}case`key`:await E(e,t);return;case`text`:await e.send(`Input.insertText`,{text:t.text});return;case`wait`:await A(Math.max(0,t.ms));return}}async function C(e,t,n){let r=v(n,t);await e.send(`Input.dispatchMouseEvent`,{type:t.down?`mousePressed`:`mouseReleased`,x:r.x,y:r.y,button:y[t.button],clickCount:1})}async function w(e,t,n){let r=v(n,t),i=Math.max(1,t.count);for(let n=1;n<=i;n++)await e.send(`Input.dispatchMouseEvent`,{type:`mousePressed`,x:r.x,y:r.y,button:y[t.button],clickCount:n}),t.holdMs&&t.holdMs>0&&await A(t.holdMs),await e.send(`Input.dispatchMouseEvent`,{type:`mouseReleased`,x:r.x,y:r.y,button:y[t.button],clickCount:n})}async function T(e,t,n){await S(e,{type:`mousemove`,x:t.x1,y:t.y1},n),await S(e,{type:`button`,button:1,down:!0,x:t.x1,y:t.y1},n),await S(e,{type:`mousemove`,x:t.x2,y:t.y2},n),await S(e,{type:`button`,button:1,down:!1,x:t.x2,y:t.y2},n)}async function E(e,t){let n=m(t.keysym);if(!n)throw Error(`unknown keysym '${t.keysym}'`);for(let r of g(n,t.down))await e.send(`Input.dispatchKeyEvent`,{type:r.type,key:r.key,code:r.code,modifiers:r.modifiers,...r.text===void 0?{}:{text:r.text}})}async function D(e,t,n){let r=await k(e,t)??{title:t,url:``};return b(r),e.withTab(t,async e=>{let t=await x(e,{format:n.format===`png`?`png`:`jpeg`,maxWidth:n.maxWidth});return{mime:t.mime,base64:o(t.bytes),width:t.width,height:t.height,...t.native?{nativeWidth:t.native.width,nativeHeight:t.native.height}:{},title:r.title,url:r.url}})}async function O(e,t,n){b(await k(e,t)??{title:t,url:``});let r=_();await e.withTab(t,async e=>{for(let t of n)await S(e,t,r)})}async function k(e,t){let n=(await e.listAllTargets()).find(e=>e.targetId===t);return n?{title:n.title,url:n.url}:null}function A(e){return new Promise(t=>setTimeout(t,e))}export{O as inputTab,D as screenshotTab};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{rt as e}from"./wc-shell-
|
|
1
|
+
import{rt as e}from"./wc-shell-C71iKreG.js";import"./proxied-fetch-DyBveeCl.js";import{n as t}from"./runtime-env-Dlaokqg1.js";import{a as n,t as r}from"./api-endpoint-DGxXvrur.js";import{t as i}from"./shared-mBEktoxE.js";var a=1e3;function o(e=()=>Date.now()){let t=new Map,n=null,r=0,i=()=>{let e=0,n=0;for(let r of t.values())e+=r.loaded,n+=r.total;return{loaded:e,total:n}};return{update(a,o,s){t.set(a,{loaded:Math.max(0,o),total:Math.max(t.get(a)?.total??0,s,o)}),n===null&&(n=e(),r=i().loaded)},complete(e){let n=t.get(e);n&&(n.loaded=n.total)},snapshot(){let{loaded:t,total:o}=i(),s=null;if(n!==null&&o>0&&t<o){let i=e()-n,c=t-r;if(i>=a&&c>0){let e=c/i;s=(o-t)/e/1e3}}return o>0&&t>=o&&(s=0),{loaded:t,total:o,etaSeconds:s}}}}var s=`onnx-community/whisper-tiny`,c=`onnx-community/Kokoro-82M-v1.0-ONNX`,l=Symbol.for(`slicc.transformers-env.fetch-wrapped`),u=t,d=`/workspace/node_modules/onnxruntime-web/dist/`,f=`/workspace/models/`;function p(e){return typeof e==`string`?e:e instanceof URL?e.toString():e.url}function m(e){let t=p(e);return t.startsWith(`http://`)||t.startsWith(`https://`)}function h(){return globalThis.location?.origin??null}function g(e){let t=h();if(!t)return!1;try{return new URL(p(e)).origin===t}catch{return!1}}async function _(e,t){let i=p(e),a={};t?.headers&&new Headers(t.headers).forEach((e,t)=>{a[t]=e});let o=r({...a,"X-Target-URL":i}),s=(t?.method??`GET`).toUpperCase(),c={method:s,headers:o,cache:`no-store`};return t?.body&&s!==`GET`&&s!==`HEAD`&&(c.body=t.body),fetch(n(`/api/fetch-proxy`),c)}var v=3e4,y=[`ort-wasm-simd-threaded.jsep.mjs`,`https://${["cdn","jsdelivr","net"].join(".")}/npm/onnxruntime-web@1.31.0-dev.20260914-8d85527a0/dist/ort-wasm-simd-threaded.jsep.wasm`,`ort-wasm-simd-threaded.mjs`,`https://${["cdn","jsdelivr","net"].join(".")}/npm/onnxruntime-web@1.31.0-dev.20260914-8d85527a0/dist/ort.wasm`,`ort-wasm-simd-threaded.asyncify.mjs`,`https://${["cdn","jsdelivr","net"].join(".")}/npm/onnxruntime-web@1.31.0-dev.20260914-8d85527a0/dist/ort-wasm-simd-threaded.asyncify.wasm`,`ort-wasm-simd-threaded.jspi.mjs`,`https://${["cdn","jsdelivr","net"].join(".")}/npm/onnxruntime-web@1.31.0-dev.20260914-8d85527a0/dist/ort-wasm-simd-threaded.jspi.wasm`],b=Symbol.for(`slicc.transformers-env.vfs-enoent`);function x(e){if(typeof BroadcastChannel>`u`)return Promise.reject(Error(`Cannot read VFS path ${e}: BroadcastChannel unavailable in this realm`));let t=new BroadcastChannel(`preview-vfs`),n=`tfx-${Date.now()}-${Math.random().toString(36).slice(2)}`;return new Promise((r,i)=>{let a=e=>{t.removeEventListener(`message`,c),t.close(),e()},o,s=()=>{clearTimeout(o),o=setTimeout(()=>{let t=Error(`ENOENT: ${e} (preview-vfs responder timed out)`);t[b]=!0,a(()=>i(t))},v)};s();let c=t=>{let c=t.data;if(!c||c.id!==n)return;if(c.type===`preview-vfs-start`){s();return}if(c.type!==`preview-vfs-response`)return;if(clearTimeout(o),typeof c.error==`string`){let e=Error(c.error);c.error.includes(`ENOENT`)&&(e[b]=!0),a(()=>i(e));return}let l=c.content;if(l instanceof Uint8Array){a(()=>r(l));return}if(typeof l==`string`){a(()=>r(new TextEncoder().encode(l)));return}a(()=>i(Error(`Unexpected empty preview-vfs response for ${e}`)))};t.addEventListener(`message`,c),t.postMessage({type:`preview-vfs-read`,id:n,path:e,asText:!1})})}function S(e){return!!e?.[b]}function C(e){let t=new ArrayBuffer(e.byteLength),n=new Uint8Array(t);return n.set(e),n}function w(e,t){return!t||!e.startsWith(t)?null:`${f}${e.slice(t.length).split(`?`)[0].split(`#`)[0]}`}async function T(e,t){let n;try{n=await x(e)}catch(t){if(S(t))return new Response(`Not found: ${e}`,{status:404,headers:{"Content-Type":`text/plain`}});throw t}let r=i(e);return(t?.headers?new Headers(t.headers).get(`range`):null)===`bytes=0-0`?new Response(null,{status:206,headers:{"Content-Type":r,"Content-Length":String(n.byteLength),"Content-Range":`bytes 0-0/${n.byteLength}`}}):new Response(C(n),{status:200,headers:{"Content-Type":r,"Content-Length":String(n.byteLength)}})}var E=null;async function D(){if(typeof URL>`u`||typeof URL.createObjectURL!=`function`)throw Error(`onnxruntime-web blob URLs require URL.createObjectURL (browser realm only)`);let e={};if(await Promise.all(y.map(async t=>{try{let n=await x(`${d}${t}`),r=new Blob([C(n)],{type:i(t)});e[t]=URL.createObjectURL(r)}catch(e){if(!S(e))throw e}})),Object.keys(e).length===0)throw Error("onnxruntime-web is not installed — run `ipk add onnxruntime-web` to stage the wasm runtime in /workspace/node_modules/.");return e}function O(){return E||=D(),E}var k=`slicc_ort_num_threads`;function A(e){if(!e.isolated)return 1;let t=e.hardwareConcurrency,n=typeof t==`number`&&Number.isFinite(t)&&t>=1,r=n?Math.min(4,Math.floor(t)):4,i=e.override==null?NaN:Number.parseInt(e.override,10);return Number.isFinite(i)&&i>=1?Math.max(1,Math.min(r,i)):n?Math.max(1,r):1}function j(){let e=null;try{e=globalThis.localStorage?.getItem(`slicc_ort_num_threads`)??null}catch{}let t={isolated:globalThis.crossOriginIsolated===!0,hardwareConcurrency:globalThis.navigator?.hardwareConcurrency,override:e},n=A(t);return e!=null&&t.isolated&&console.warn(`[speech] ort-web numThreads=${n} forced by localStorage.${k}=${JSON.stringify(e)} — this persists until removed`),n}function M(t){let n=t.backends?.onnx?.wasm;if(n&&(n.wasmPaths=e(d),n.numThreads=j()),t.allowRemoteModels=!1,t.allowLocalModels=!0,t.localModelPath=e(f),t.useBrowserCache=!1,u())return;t.allowRemoteModels=!0,t.remoteHost=t.localModelPath,t.remotePathTemplate=`{model}/`,n&&O().then(e=>{n.wasmPaths=e},()=>{});let r=t.fetch;if(r?.[l])return;let i=r,a=t.localModelPath,o=async(e,t)=>{let n=w(p(e),a);return n===null?!m(e)||g(e)?i?i(e,t):fetch(e,t):_(e,t):T(n,t)};o[l]=!0,t.fetch=o}async function N(e){let t=`weights for ${e} are missing — run \`hf download ${e}\` to fetch them into /workspace/models/.`;try{await x(`${f}${e}/config.json`)}catch(e){if(S(e))throw Error(t);let n=e instanceof Error?e.message:String(e);throw Error(`${t} (probe failed: ${n})`)}}export{s as a,c as i,M as n,o,O as r,N as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-DDBAeTLF.js";import{a as n,o as r}from"./proxied-fetch-DyBveeCl.js";import{a as i,n as a,t as o}from"./api-endpoint-DGxXvrur.js";import{p as s,u as c}from"./main-yKaIA_zV.js";var l=e({compareAndSetState:()=>T,getAllCronTasks:()=>ee,getAllWebhooks:()=>E,getState:()=>C,setState:()=>w}),u=`slicc-groups`,d=3,f={SCOOPS:`scoops`,MESSAGES:`messages`,SESSIONS:`sessions`,TASKS:`tasks`,STATE:`state`,WEBHOOKS:`webhooks`,CRONTASKS:`crontasks`},p=null;function m(e){if(!e.objectStoreNames.contains(f.MESSAGES)){let t=e.createObjectStore(f.MESSAGES,{keyPath:`id`});t.createIndex(`chatJid`,`chatJid`),t.createIndex(`timestamp`,`timestamp`),t.createIndex(`chatJid_timestamp`,[`chatJid`,`timestamp`])}e.objectStoreNames.contains(f.SESSIONS)||e.createObjectStore(f.SESSIONS,{keyPath:`groupFolder`}),e.objectStoreNames.contains(f.TASKS)||e.createObjectStore(f.TASKS,{keyPath:`id`}).createIndex(`groupFolder`,`groupFolder`),e.objectStoreNames.contains(f.STATE)||e.createObjectStore(f.STATE,{keyPath:`key`})}function h(e,t){let n=e.isMain??!1;return{jid:e.jid,name:e.name,folder:e.folder,trigger:n?void 0:e.trigger||`@${e.folder}`,requiresTrigger:!n&&(e.requiresTrigger??!0),parentJid:n?null:t??null,assistantLabel:n?`sliccy`:e.config?.assistantName||e.folder,addedAt:e.addedAt,config:e.config?{systemPromptAppend:e.config.systemPromptAppend,timeout:e.config.timeout,assistantName:e.config.assistantName}:void 0}}function g(e,t){if(t.objectStoreNames.contains(`groups`)){let n=e.target.transaction.objectStore(`groups`).getAll();n.onsuccess=()=>{let e=n.result;t.deleteObjectStore(`groups`);let r=t.createObjectStore(f.SCOOPS,{keyPath:`jid`});r.createIndex(`type`,`type`);let i=e.find(e=>e.isMain)?.jid;for(let t of e)r.put(h(t,i))};return}t.objectStoreNames.contains(f.SCOOPS)||t.createObjectStore(f.SCOOPS,{keyPath:`jid`}).createIndex(`type`,`type`)}function _(e){e.objectStoreNames.contains(f.WEBHOOKS)||e.createObjectStore(f.WEBHOOKS,{keyPath:`id`}),e.objectStoreNames.contains(f.CRONTASKS)||e.createObjectStore(f.CRONTASKS,{keyPath:`id`})}function v(e){let t=e.target.result,n=e.oldVersion;n<1&&m(t),n<2&&g(e,t),n<3&&_(t)}function y(){if(!p)return null;let e=Object.values(f).every(e=>p.objectStoreNames.contains(e));return p.version===d&&e?p:(p.close(),p=null,null)}function b(e){e.onversionchange=()=>{e.close(),p===e&&(p=null)},e.onclose=()=>{p===e&&(p=null)}}async function x(){return y()||new Promise((e,t)=>{let n=indexedDB.open(u,d);n.onupgradeneeded=v,n.onsuccess=()=>{let t=n.result;b(t),p=t,e(t)},n.onerror=()=>t(n.error)})}async function S(e,t=`readonly`){return(await x()).transaction(e,t).objectStore(e)}async function C(e){let t=await S(f.STATE);return new Promise((n,r)=>{let i=t.get(e);i.onsuccess=()=>n(i.result?.value??null),i.onerror=()=>r(i.error)})}async function w(e,t){let n=await S(f.STATE,`readwrite`);return new Promise((r,i)=>{let a=n.put({key:e,value:t});a.onsuccess=()=>r(),a.onerror=()=>i(a.error)})}async function T(e,t,n){let r=await S(f.STATE,`readwrite`);return new Promise((i,a)=>{let o=!1,s=r.transaction;s.oncomplete=()=>i(o),s.onabort=()=>a(s.error??Error(`State transaction aborted`)),s.onerror=()=>a(s.error);let c=r.get(e);c.onsuccess=()=>{(c.result?.value??null)===t&&(r.put({key:e,value:n}),o=!0)}})}async function E(){try{let e=await S(f.WEBHOOKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch{return[]}}async function ee(){try{let e=await S(f.CRONTASKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch{return[]}}var D={state:`inactive`,session:null,error:null};function O(e){return e?{workerBaseUrl:e.workerBaseUrl,trayId:e.trayId,createdAt:e.createdAt,controllerId:e.controllerId,controllerUrl:e.controllerUrl,joinUrl:e.joinUrl,webhookUrl:e.webhookUrl,runtime:e.runtime,...e.leaderKey===void 0?{}:{leaderKey:e.leaderKey},...e.leaderWebSocketUrl===void 0?{}:{leaderWebSocketUrl:e.leaderWebSocketUrl},...e.coneId===void 0?{}:{coneId:e.coneId}}:null}function k(){return{...D,session:O(D.session)}}var A=new Set;function j(e){return A.add(e),()=>{A.delete(e)}}function M(e){if(D={...e,session:O(e.session)},A.size!==0)for(let e of[...A])try{e(k())}catch{}}var N=class extends Error{constructor(e){super(e),this.name=`TrayProxyFetchError`}};function P(e=fetch){return a()?(t,n)=>e(t,n):async(t,a={})=>{let s=typeof t==`string`?t:t.toString();try{if(new URL(s).origin===window.location.origin)return e(s,{...a,cache:`no-store`})}catch{}let c=new Headers(a.headers);c.set(`X-Target-URL`,s);for(let[e,t]of Object.entries(o()))c.set(e,t);let l=await e(i(`/api/fetch-proxy`),{...a,headers:c,cache:`no-store`});if(n(l))throw new N(await r(l));return l}}var F=e({IndexedDbLeaderTraySessionStore:()=>G,IndexedDbLeaderWebhookIdentityStore:()=>K,LEADER_STATUS_STORAGE_KEY:()=>LEADER_STATUS_STORAGE_KEY,LeaderTrayManager:()=>Z,TrayProxyFetchError:()=>N,assertNoStableWebhookHome:()=>q,createTrayFetch:()=>P,getLeaderTrayRuntimeStatus:()=>k,parseConeWebhookIdentity:()=>J,parseLeaderTraySession:()=>X,setLeaderTrayRuntimeStatus:()=>M}),I=t(`tray-leader`),L=`leader-tray-session`,R=3e4,z=1e4,B=1e3,V=3e4,H=2,U=20,W=1e4,G=class{key;constructor(e=L){this.key=e}async load(){return X(await C(this.key))}async save(e){await w(this.key,JSON.stringify(e))}async clear(){await w(this.key,``)}},K=class{key;snapshots=new WeakMap;constructor(e){this.key=`leader-webhook-identity:${e.replace(/\/+$/,``)}`}async load(){let e=await C(this.key);if(!e)return null;let t;try{t=JSON.parse(e)}catch{throw Error(`Stored webhook management identity is invalid`)}if(!t||typeof t.coneId!=`string`||!t.coneId||typeof t.coneSecret!=`string`||!t.coneSecret||typeof t.rebindSecret!=`string`||!t.rebindSecret)throw Error(`Stored webhook management identity is invalid`);let n=t.pendingRotation?X(JSON.stringify(t.pendingRotation)):null,r=t.pendingRotation;if(r&&(!n||typeof r.secret!=`string`||!/^[A-Za-z0-9_-]{32,128}$/.test(r.secret)||typeof r.rebindSecret!=`string`||!/^[A-Za-z0-9_-]{32,128}$/.test(r.rebindSecret)||r.secret===t.coneSecret||r.rebindSecret===t.rebindSecret||r.secret===r.rebindSecret))throw Error(`Stored webhook rotation intent is invalid`);let i=r&&n?{...n,secret:r.secret,rebindSecret:r.rebindSecret}:null;if(t.pendingCreateAttemptId!==void 0&&(typeof t.pendingCreateAttemptId!=`string`||!/^[A-Za-z0-9_-]{32,128}$/.test(t.pendingCreateAttemptId))||t.pendingCreateTrayId!==void 0&&(!t.pendingCreateAttemptId||typeof t.pendingCreateTrayId!=`string`||!/^[A-Za-z0-9_-]{1,128}$/.test(t.pendingCreateTrayId)))throw Error(`Stored tray creation intent is invalid`);let a={coneId:t.coneId,coneSecret:t.coneSecret,rebindSecret:t.rebindSecret,established:t.established!==!1,...i?{pendingRotation:i}:{},...t.pendingCreateAttemptId?{pendingCreateAttemptId:t.pendingCreateAttemptId}:{},...t.pendingCreateTrayId?{pendingCreateTrayId:t.pendingCreateTrayId}:{}};return this.snapshots.set(a,e),a}async save(e){let t=JSON.stringify(e);await w(this.key,t),this.snapshots.set(e,t)}async compareAndSwap(e,t){let n=e===null?null:this.snapshots.get(e);if(n===void 0)throw Error(`Webhook identity must be loaded before updating`);let r=JSON.stringify(t),i=await T(this.key,n,r);return i&&this.snapshots.set(t,r),i}};async function q(e){let t=await new G().load(),n=await new K(e.getItem(`slicc.trayWorkerBaseUrl`)??t?.workerBaseUrl??c).load();if(n&&n.established!==!1||t&&Y(t))throw Error(`webhook delete: stable identity exists but leader is disconnected`)}function J(e,t){if(!t)return null;let n;try{let t=new URL(e).pathname.split(`/`).filter(Boolean);if(t.at(-2)!==`wh`)return null;n=decodeURIComponent(t.at(-1)??``)}catch{return null}let r=n.indexOf(`.`),i=t.indexOf(`.`);if(r<=0||i<=0)return null;let a=n.slice(0,r),o=n.slice(r+1),s=t.slice(0,i),c=t.slice(i+1);return![a,o,c].every(e=>/^[A-Za-z0-9_-]+$/.test(e))||s!==a?null:{coneId:a,coneSecret:o,rebindSecret:c}}function Y(e){let t=e;return t.coneId&&t.coneSecret&&t.rebindSecret?{coneId:t.coneId,coneSecret:t.coneSecret,rebindSecret:t.rebindSecret,established:!0}:null}function X(e){if(!e)return null;try{let t=JSON.parse(e);return typeof t.workerBaseUrl!=`string`||typeof t.trayId!=`string`||typeof t.createdAt!=`string`||typeof t.controllerId!=`string`||typeof t.controllerUrl!=`string`||typeof t.joinUrl!=`string`||typeof t.webhookUrl!=`string`||typeof t.runtime!=`string`?null:{workerBaseUrl:t.workerBaseUrl,trayId:t.trayId,createdAt:t.createdAt,controllerId:t.controllerId,controllerUrl:t.controllerUrl,joinUrl:t.joinUrl,webhookUrl:t.webhookUrl,leaderKey:typeof t.leaderKey==`string`?t.leaderKey:void 0,leaderWebSocketUrl:typeof t.leaderWebSocketUrl==`string`?t.leaderWebSocketUrl:null,runtime:t.runtime,...typeof t.coneId==`string`?{coneId:t.coneId}:{},...typeof t.coneId==`string`&&typeof t.coneSecret==`string`&&typeof t.rebindSecret==`string`?{coneId:t.coneId,coneSecret:t.coneSecret,rebindSecret:t.rebindSecret}:{}}}catch{return null}}var Z=class{options;store;identityStore;replacementStore;identity=null;rotation=null;starting=null;resetting=null;fetchImpl;webSocketFactory;pingIntervalMs;connectTimeoutMs;reconnectEnabled;reconnectBaseDelayMs;reconnectMaxDelayMs;reconnectBackoffMultiplier;reconnectMaxAttempts;reconnectSleep;socket=null;pingTimer=null;currentSession=null;stopped=!1;reconnecting=!1;reconnectGeneration=0;constructor(e){this.options=e,this.store=e.store??new G,this.identityStore=e.identityStore??new K(e.workerBaseUrl),this.replacementStore=e.replacementStore??new G(`leader-tray-replacement:${e.workerBaseUrl.replace(/\/+$/,``)}`),this.fetchImpl=e.fetchImpl??P(),this.webSocketFactory=e.webSocketFactory??(e=>new WebSocket(e)),this.pingIntervalMs=e.pingIntervalMs??R,this.connectTimeoutMs=e.connectTimeoutMs??z;let t=e.reconnect;this.reconnectEnabled=t!==!1;let n=t===!1||!t?{}:t;this.reconnectBaseDelayMs=n.baseDelayMs??B,this.reconnectMaxDelayMs=n.maxDelayMs??V,this.reconnectBackoffMultiplier=n.backoffMultiplier??H,this.reconnectMaxAttempts=n.maxAttempts??U,this.reconnectSleep=n.sleep??(e=>new Promise(t=>setTimeout(t,e)))}async start(){if(this.starting!==null)return this.starting;let e=this.startOnce();this.starting=e;try{return await e}finally{this.starting=null}}async startOnce(){if(this.stopped=!1,this.currentSession&&this.socket)return M({state:`leader`,session:this.currentSession,error:null}),this.currentSession;M({state:`connecting`,session:null,error:null}),this.currentSession=null;try{let e=await this.connectOnce();I.info(`Leader joined tray`,{trayId:e.trayId,controllerId:e.controllerId,runtime:e.runtime});try{this.options.onLeaderReady?.(e)}catch(e){I.warn(`onLeaderReady callback threw`,{error:e instanceof Error?e.message:String(e)})}return e}catch(e){throw M({state:`error`,session:this.currentSession,error:e instanceof Error?e.message:String(e)}),e}}stop(){this.stopped=!0,this.reconnecting=!1,this.reconnectGeneration++,this.tearDownSocket(),this.currentSession=null,M({state:`inactive`,session:null,error:null})}tearDownSocket(){this.pingTimer&&=(clearInterval(this.pingTimer),null);let e=this.socket;if(this.socket=null,e)try{e.close()}catch{}}async connectOnce(){if(this.rotation!==null&&await this.rotation,this.identity=await this.identityStore.load(),this.identity?.pendingRotation)try{await this.rotateWebhookOnce()}catch(e){if(!$(e))throw e;if(this.identity?.pendingRotation)throw Error(`Webhook rotation changed in another tab; retry before reconnecting`)}let e=await this.store.load(),t=e?.workerBaseUrl.replace(/\/+$/,``)===this.options.workerBaseUrl.replace(/\/+$/,``)?e:null,n=t&&Y(t);!this.identity&&n&&await this.saveIdentity(n);let r=t&&this.publicSession(t);r&&n&&await this.store.save(r),await this.finishPendingCreate(r);let i=await this.replacementStore.load(),a=i?await this.claimReplacement(i,r):await this.attachWithRecovery(r);this.currentSession=a;let o=await this.openLeaderSocket(a.leaderWebSocketUrl);return this.socket=o,this.startPingLoop(o),M({state:`leader`,session:a,error:null}),a}async handleUnexpectedDisconnect(e){if(this.stopped)return;if(!this.reconnectEnabled){I.warn(`Leader WebSocket dropped and auto-reconnect is disabled`,{reason:e}),this.tearDownSocket(),this.currentSession=null,M({state:`error`,session:null,error:`Leader WebSocket dropped: ${e}`});return}if(this.reconnecting)return;this.reconnecting=!0;let t=++this.reconnectGeneration;I.warn(`Leader WebSocket dropped — starting reconnect loop`,{reason:e}),this.tearDownSocket();let n=0,r=this.reconnectBaseDelayMs,i=e;for(;!this.stopped&&t===this.reconnectGeneration&&n<this.reconnectMaxAttempts&&(n++,M({state:`reconnecting`,session:this.currentSession,error:null,reconnectAttempts:n}),this.options.onReconnecting?.(n,i),I.info(`Leader reconnect attempt`,{attempt:n,delay:r}),await this.reconnectSleep(r),!(this.stopped||t!==this.reconnectGeneration));){try{let e=await this.connectOnce();if(this.stopped||t!==this.reconnectGeneration){this.tearDownSocket();break}this.reconnecting=!1,I.info(`Leader reconnect successful`,{attempt:n,trayId:e.trayId}),this.options.onReconnected?.(e);try{this.options.onLeaderReady?.(e)}catch(e){I.warn(`onLeaderReady callback threw`,{error:e instanceof Error?e.message:String(e)})}return}catch(e){i=e instanceof Error?e.message:String(e),I.warn(`Leader reconnect attempt failed`,{attempt:n,error:i}),this.tearDownSocket()}r=Math.min(r*this.reconnectBackoffMultiplier,this.reconnectMaxDelayMs)}!this.stopped&&t===this.reconnectGeneration&&(this.reconnecting=!1,this.currentSession=null,M({state:`error`,session:null,error:`Leader reconnect failed after ${n} attempts: ${i}`,reconnectAttempts:n}),I.warn(`Leader reconnect gave up`,{attempts:n,lastError:i}),this.options.onReconnectGaveUp?.(i,n))}async clearSession(){if(this.rotation!==null&&await this.rotation,await this.replacementStore.load())throw Error(`Tray replacement is pending; retry reset before clearing the session`);await this.finishPendingCreate(await this.store.load()),await this.store.clear()}async reset(){if(this.resetting!==null)return this.resetting;let e=this.resetOnce();this.resetting=e;try{return await e}finally{this.resetting=null}}async resetOnce(){return this.starting!==null&&await this.starting,this.rotation!==null&&await this.rotation,!await this.replacementStore.load()&&this.currentSession&&await this.replacementStore.save(this.currentSession),this.stop(),this.start()}async claimReplacement(e,t,n=!0){let r=t&&t.trayId!==e.trayId?t:await this.createTraySession();try{await this.transferPreviousSession(e,r)}catch(t){if(!(t instanceof Q)||t.code!==`PREVIEW_TARGET_UNAVAILABLE`)throw t;await this.finishPendingCreate(await this.store.load()),await this.store.clear(),r=await this.createTraySession(),await this.transferPreviousSession(e,r)}let i;try{i=await this.claimLeaderSession(r)}catch(e){if(e instanceof Q&&[403,404,410].includes(e.status)&&(await this.replacementStore.save(r),await this.finishPendingCreate(await this.store.load()),await this.store.clear(),n))return this.claimReplacement(r,null,!1);throw e}return await this.replacementStore.clear(),this.notifyTraySuperseded(e,i.joinUrl,i.webhookUrl),i}async transferPreviousSession(e,t){if(e.trayId===t.trayId||this.identity?.established===!1)return;let n=new URL(e.controllerUrl).pathname.split(`/`).pop(),r=new URL(t.controllerUrl).pathname.split(`/`).pop();if(!n||!r)throw Error(`Preview transfer requires controller credentials`);if((await this.fetchJson(s(e.workerBaseUrl,`api/tray/${e.trayId}/preview-transfer`),{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${n}`},body:JSON.stringify({targetTrayId:t.trayId,targetControllerToken:r})})).transferred!==!0)throw Error(`Hub did not confirm preview transfer`)}async saveIdentity(e){await this.identityStore.save(e),this.identity=e}publicSession(e){let{coneSecret:t,rebindSecret:n,...r}=e;return this.identity?.established&&r.coneId===this.identity.coneId&&(r.webhookUrl=s(this.options.workerBaseUrl,`wh/${this.identity.coneId}.${this.identity.coneSecret}`)),r}getCurrentSession(){return this.currentSession}async rotateWebhook(){if(this.resetting!==null||this.starting!==null||this.reconnecting)throw Error(`webhook rotate: tray transition in progress; retry when ready`);if(this.rotation!==null)return this.rotation;let e=this.rotateWebhookOnce();this.rotation=e;try{return await e}finally{this.rotation=null}}async rotateWebhookOnce(){this.identity=await this.identityStore.load();let e=this.identity?.pendingRotation??this.currentSession;if(!e)throw Error(`webhook rotate: no active tray session`);let t=this.identity;if(!t||t.established===!1)throw Error(`webhook rotate: this tray has no stable webhook identity to rotate (legacy hub)`);if(e.workerBaseUrl.replace(/\/+$/,``)!==this.options.workerBaseUrl.replace(/\/+$/,``))throw Error(`webhook rotate: pending identity belongs to a different hub`);let n=new URL(e.controllerUrl).pathname.split(`/`).pop();if(!n)throw Error(`webhook rotate: could not derive the controller token`);if(!t.pendingRotation){let n={...t,pendingRotation:{...e,secret:crypto.randomUUID().replace(/-/g,``),rebindSecret:crypto.randomUUID().replace(/-/g,``)}};if(!await this.identityStore.compareAndSwap(t,n))throw Error(`webhook rotate: identity changed in another tab; retry`);this.identity=t=n}let r=s(e.workerBaseUrl,`api/tray/${e.trayId}/webhook/rotate`),i=await this.fetchJson(r,{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${n}`},body:JSON.stringify({oldConeId:t.coneId,oldSecret:t.coneSecret,oldRebindSecret:t.rebindSecret,secret:t.pendingRotation.secret,rebindSecret:t.pendingRotation.rebindSecret})}).catch(async e=>{if($(e)){let{pendingRotation:e,...n}=t;await this.identityStore.compareAndSwap(t,n),this.identity=await this.identityStore.load()}throw e}),a=J(i.webhook.url,i.webhook.rebindToken);if(!a)throw Error(`webhook rotate: hub returned an unparseable webhook capability`);if(a.coneId!==t.coneId||a.coneSecret!==t.pendingRotation.secret||a.rebindSecret!==t.pendingRotation.rebindSecret)throw Error(`webhook rotate: hub changed the management identity`);let{pendingRotation:o,...c}=t,l={...c,...a,established:!0};if(!await this.identityStore.compareAndSwap(t,l))throw this.identity=await this.identityStore.load(),Error(`webhook rotate: identity changed in another tab; retry`);this.identity=l;let u={...X(JSON.stringify(e)),webhookUrl:i.webhook.url,coneId:a.coneId};return(await this.store.load())?.trayId===e.trayId&&await this.store.save(u),this.currentSession===e&&(this.currentSession=u,M({state:`leader`,session:u,error:null})),{webhookUrl:i.webhook.url}}async revokeWebhook(e){if(!e)throw Error(`webhook delete: missing webhook id`);if(this.resetting!==null||this.starting!==null||this.reconnecting)throw Error(`webhook delete: tray transition in progress; retry when ready`);let t=this.currentSession,n=this.identity??await this.identityStore.load();if(!n||n.established===!1)return;if(!t)throw Error(`webhook delete: stable identity exists but leader is disconnected`);let r=new URL(t.controllerUrl).pathname.split(`/`).pop();if(!r)throw Error(`webhook delete: missing controller credentials`);await this.fetchJson(s(t.workerBaseUrl,`webhooks/${encodeURIComponent(n.coneId)}/${encodeURIComponent(e)}/revoke`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({rebindSecret:n.rebindSecret,trayId:t.trayId,controllerToken:r})})}supersedePreviousSession(e,t){e.trayId!==``&&t.joinUrl!==e.joinUrl&&this.notifyTraySuperseded(e,t.joinUrl,t.webhookUrl)}carryConeIdentityFrom(e){}sendControlMessage(e){if(!this.socket)throw Error(`Tray leader WebSocket is not connected`);this.socket.send(JSON.stringify(e))}async attachWithRecovery(e){try{return await this.claimLeaderSession(e)}catch(t){if(!e||!te(t))throw t;return I.warn(`Stored tray session is stale, creating a fresh tray`,{trayId:e.trayId,error:t instanceof Error?t.message:String(t)}),await this.replacementStore.save(e),await this.finishPendingCreate(await this.store.load()),await this.store.clear(),this.claimReplacement(e,null)}}async notifyTraySuperseded(e,t,n){try{let r=new URL(e.controllerUrl).pathname.split(`/`).pop();if(!r)return;let i=s(e.workerBaseUrl,`api/tray/${e.trayId}/supersede`),a=await this.fetchImpl(i,{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${r}`},body:JSON.stringify({joinUrl:t,...n?{webhookUrl:n}:{}}),signal:AbortSignal.timeout(W)});a.ok||I.warn(`Old tray rejected supersession (best-effort)`,{oldTrayId:e.trayId,status:a.status})}catch{I.warn(`Failed to notify old tray of supersession (best-effort)`,{oldTrayId:e.trayId})}}async claimLeaderSession(e){let t=e??await this.createTraySession(),n=await this.fetchJson(t.controllerUrl,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({controllerId:t.controllerId,leaderKey:t.leaderKey,runtime:this.options.runtime})});if(n.role!==`leader`||!n.leaderKey||!n.websocket?.url)throw Error(`Tray attach did not return leader access for controller ${n.controllerId}`);let r={...t,trayId:n.trayId,controllerId:n.controllerId,leaderKey:n.leaderKey,leaderWebSocketUrl:n.websocket.url,runtime:this.options.runtime};return await this.store.save(r),r}async finishPendingCreate(e){for(let t=0;t<8;t++){let t=await this.identityStore.load();if(!e||!t?.pendingCreateTrayId||t.pendingCreateTrayId!==e.trayId)return;let n={...t};if(delete n.pendingCreateAttemptId,delete n.pendingCreateTrayId,await this.identityStore.compareAndSwap(t,n)){this.identity=n;return}}throw Error(`Webhook identity changed while acknowledging tray creation`)}async prepareCreateIdentity(){await this.finishPendingCreate(await this.store.load());for(let e=0;e<8;e++){let e=await this.identityStore.load();if(e?.pendingRotation)throw Error(`Webhook rotation must finish before tray creation`);if(e?.pendingCreateAttemptId)return e;let t={...e??{coneId:crypto.randomUUID(),coneSecret:crypto.randomUUID().replace(/-/g,``),rebindSecret:crypto.randomUUID().replace(/-/g,``),established:!1},pendingCreateAttemptId:crypto.randomUUID()};if(await this.identityStore.compareAndSwap(e,t))return t}throw Error(`Webhook identity changed while preparing tray creation`)}async createTraySession(){let e=await this.prepareCreateIdentity();this.identity=e;let t=JSON.stringify({...this.options.kind?{kind:this.options.kind}:{},coneId:e.coneId,coneSecret:e.coneSecret,rebindSecret:e.rebindSecret,createAttemptId:e.pendingCreateAttemptId}),n=await this.fetchJson(s(this.options.workerBaseUrl,`tray`),{method:`POST`,headers:{"content-type":`application/json`},body:t}),r=J(n.capabilities.webhook.url,n.capabilities.webhook.rebindToken);if(r){if(r.coneId!==e.coneId||r.coneSecret!==e.coneSecret||r.rebindSecret!==e.rebindSecret)throw Error(`Hub returned a different webhook management identity`)}else if(e.established||n.capabilities.webhook.rebindToken||new URL(n.capabilities.webhook.url).pathname.includes(`/wh/`))throw Error(`Hub did not confirm the stable webhook binding`);let i={workerBaseUrl:this.options.workerBaseUrl,trayId:n.trayId,createdAt:n.createdAt,controllerId:crypto.randomUUID(),controllerUrl:n.capabilities.controller.url,joinUrl:n.capabilities.join.url,webhookUrl:n.capabilities.webhook.url,runtime:this.options.runtime,...r?{coneId:r.coneId}:{}},a={...e,established:r?!0:e.established,pendingCreateTrayId:i.trayId};if(!await this.identityStore.compareAndSwap(e,a))throw Error(`Webhook identity changed during tray creation`);return this.identity=a,await this.store.save(i),await this.finishPendingCreate(i),i}async openLeaderSocket(e){return await new Promise((t,n)=>{let r=this.webSocketFactory(e),i=!1,a=setTimeout(()=>{o(`Tray leader WebSocket timed out after ${this.connectTimeoutMs}ms waiting for leader.connected`);try{r.close(1e3,`leader.connected timeout`)}catch{}},this.connectTimeoutMs),o=e=>{i||(i=!0,clearTimeout(a),n(Error(e)))};r.addEventListener(`message`,e=>{let n=ne(e.data);if(n){if(n.type===`leader.connected`){i||(i=!0,clearTimeout(a),t(r));return}if(n.type===`pong`){I.debug(`Tray leader heartbeat acknowledged`,{trayId:this.currentSession?.trayId});return}this.options.onControlMessage?.(n)}}),r.addEventListener(`close`,()=>o(`Tray leader WebSocket closed before leader.connected`)),r.addEventListener(`error`,()=>o(`Tray leader WebSocket failed before leader.connected`))})}startPingLoop(e){this.pingTimer&&clearInterval(this.pingTimer);let t=t=>{this.stopped||this.socket!==e||this.handleUnexpectedDisconnect(t).catch(e=>{I.warn(`Leader reconnect loop crashed`,{error:e instanceof Error?e.message:String(e)})})},n=()=>{try{e.send(JSON.stringify({type:`ping`}))}catch(e){t(`Leader ping send failed: ${e instanceof Error?e.message:String(e)}`)}};n(),this.pingTimer=setInterval(n,this.pingIntervalMs),e.addEventListener(`close`,()=>t(`Leader WebSocket closed`)),e.addEventListener(`error`,()=>t(`Leader WebSocket errored`))}async fetchJson(e,t){let n=await this.fetchImpl(e,{...t,signal:t.signal??AbortSignal.timeout(2e4)}).catch(e=>{throw e instanceof N?new N(`Tray proxy transport unavailable`):Error(`Tray request failed (transport unavailable)`)});if(!n.ok)throw await Q.fromResponse(n);try{return await n.json()}catch{throw Error(`Hub returned invalid JSON`)}}},Q=class e extends Error{status;code;constructor(e,t,n){super(n),this.status=e,this.code=t,this.name=`LeaderTrayHttpError`}static async fromResponse(t){try{let n=await t.json();return new e(t.status,n.code??null,`Tray request failed (${t.status})`)}catch{return new e(t.status,null,`Tray request failed (${t.status})`)}}};function $(e){return e instanceof Q&&[400,401,403,404,405,410,422].includes(e.status)}function te(e){return e instanceof N?!0:e instanceof Q?e.status===403||e.status===404||e.status===410||e.status>=500:!1}function ne(e){if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}}export{j as a,M as i,F as n,l as o,k as r,Z as t};
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-DDBAeTLF.js";import{a as n,o as r}from"./proxied-fetch-DyBveeCl.js";import{a as i,n as a,t as o}from"./api-endpoint-DGxXvrur.js";import{p as s,u as c}from"./main-CfF8CFBr.js";var l=e({compareAndSetState:()=>T,getAllCronTasks:()=>ee,getAllWebhooks:()=>E,getState:()=>C,setState:()=>w}),u=`slicc-groups`,d=3,f={SCOOPS:`scoops`,MESSAGES:`messages`,SESSIONS:`sessions`,TASKS:`tasks`,STATE:`state`,WEBHOOKS:`webhooks`,CRONTASKS:`crontasks`},p=null;function m(e){if(!e.objectStoreNames.contains(f.MESSAGES)){let t=e.createObjectStore(f.MESSAGES,{keyPath:`id`});t.createIndex(`chatJid`,`chatJid`),t.createIndex(`timestamp`,`timestamp`),t.createIndex(`chatJid_timestamp`,[`chatJid`,`timestamp`])}e.objectStoreNames.contains(f.SESSIONS)||e.createObjectStore(f.SESSIONS,{keyPath:`groupFolder`}),e.objectStoreNames.contains(f.TASKS)||e.createObjectStore(f.TASKS,{keyPath:`id`}).createIndex(`groupFolder`,`groupFolder`),e.objectStoreNames.contains(f.STATE)||e.createObjectStore(f.STATE,{keyPath:`key`})}function h(e,t){let n=e.isMain??!1;return{jid:e.jid,name:e.name,folder:e.folder,trigger:n?void 0:e.trigger||`@${e.folder}`,requiresTrigger:!n&&(e.requiresTrigger??!0),parentJid:n?null:t??null,assistantLabel:n?`sliccy`:e.config?.assistantName||e.folder,addedAt:e.addedAt,config:e.config?{systemPromptAppend:e.config.systemPromptAppend,timeout:e.config.timeout,assistantName:e.config.assistantName}:void 0}}function g(e,t){if(t.objectStoreNames.contains(`groups`)){let n=e.target.transaction.objectStore(`groups`).getAll();n.onsuccess=()=>{let e=n.result;t.deleteObjectStore(`groups`);let r=t.createObjectStore(f.SCOOPS,{keyPath:`jid`});r.createIndex(`type`,`type`);let i=e.find(e=>e.isMain)?.jid;for(let t of e)r.put(h(t,i))};return}t.objectStoreNames.contains(f.SCOOPS)||t.createObjectStore(f.SCOOPS,{keyPath:`jid`}).createIndex(`type`,`type`)}function _(e){e.objectStoreNames.contains(f.WEBHOOKS)||e.createObjectStore(f.WEBHOOKS,{keyPath:`id`}),e.objectStoreNames.contains(f.CRONTASKS)||e.createObjectStore(f.CRONTASKS,{keyPath:`id`})}function v(e){let t=e.target.result,n=e.oldVersion;n<1&&m(t),n<2&&g(e,t),n<3&&_(t)}function y(){if(!p)return null;let e=Object.values(f).every(e=>p.objectStoreNames.contains(e));return p.version===d&&e?p:(p.close(),p=null,null)}function b(e){e.onversionchange=()=>{e.close(),p===e&&(p=null)},e.onclose=()=>{p===e&&(p=null)}}async function x(){return y()||new Promise((e,t)=>{let n=indexedDB.open(u,d);n.onupgradeneeded=v,n.onsuccess=()=>{let t=n.result;b(t),p=t,e(t)},n.onerror=()=>t(n.error)})}async function S(e,t=`readonly`){return(await x()).transaction(e,t).objectStore(e)}async function C(e){let t=await S(f.STATE);return new Promise((n,r)=>{let i=t.get(e);i.onsuccess=()=>n(i.result?.value??null),i.onerror=()=>r(i.error)})}async function w(e,t){let n=await S(f.STATE,`readwrite`);return new Promise((r,i)=>{let a=n.put({key:e,value:t});a.onsuccess=()=>r(),a.onerror=()=>i(a.error)})}async function T(e,t,n){let r=await S(f.STATE,`readwrite`);return new Promise((i,a)=>{let o=!1,s=r.transaction;s.oncomplete=()=>i(o),s.onabort=()=>a(s.error??Error(`State transaction aborted`)),s.onerror=()=>a(s.error);let c=r.get(e);c.onsuccess=()=>{(c.result?.value??null)===t&&(r.put({key:e,value:n}),o=!0)}})}async function E(){try{let e=await S(f.WEBHOOKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch{return[]}}async function ee(){try{let e=await S(f.CRONTASKS);return new Promise((t,n)=>{let r=e.getAll();r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}catch{return[]}}var D={state:`inactive`,session:null,error:null};function O(e){return e?{workerBaseUrl:e.workerBaseUrl,trayId:e.trayId,createdAt:e.createdAt,controllerId:e.controllerId,controllerUrl:e.controllerUrl,joinUrl:e.joinUrl,webhookUrl:e.webhookUrl,runtime:e.runtime,...e.leaderKey===void 0?{}:{leaderKey:e.leaderKey},...e.leaderWebSocketUrl===void 0?{}:{leaderWebSocketUrl:e.leaderWebSocketUrl},...e.coneId===void 0?{}:{coneId:e.coneId}}:null}function k(){return{...D,session:O(D.session)}}var A=new Set;function j(e){return A.add(e),()=>{A.delete(e)}}function M(e){if(D={...e,session:O(e.session)},A.size!==0)for(let e of[...A])try{e(k())}catch{}}var N=class extends Error{constructor(e){super(e),this.name=`TrayProxyFetchError`}};function P(e=fetch){return a()?(t,n)=>e(t,n):async(t,a={})=>{let s=typeof t==`string`?t:t.toString();try{if(new URL(s).origin===window.location.origin)return e(s,{...a,cache:`no-store`})}catch{}let c=new Headers(a.headers);c.set(`X-Target-URL`,s);for(let[e,t]of Object.entries(o()))c.set(e,t);let l=await e(i(`/api/fetch-proxy`),{...a,headers:c,cache:`no-store`});if(n(l))throw new N(await r(l));return l}}var F=e({IndexedDbLeaderTraySessionStore:()=>G,IndexedDbLeaderWebhookIdentityStore:()=>K,LEADER_STATUS_STORAGE_KEY:()=>LEADER_STATUS_STORAGE_KEY,LeaderTrayManager:()=>Z,TrayProxyFetchError:()=>N,assertNoStableWebhookHome:()=>q,createTrayFetch:()=>P,getLeaderTrayRuntimeStatus:()=>k,parseConeWebhookIdentity:()=>J,parseLeaderTraySession:()=>X,setLeaderTrayRuntimeStatus:()=>M}),I=t(`tray-leader`),L=`leader-tray-session`,R=3e4,z=1e4,B=1e3,V=3e4,H=2,U=20,W=1e4,G=class{key;constructor(e=L){this.key=e}async load(){return X(await C(this.key))}async save(e){await w(this.key,JSON.stringify(e))}async clear(){await w(this.key,``)}},K=class{key;snapshots=new WeakMap;constructor(e){this.key=`leader-webhook-identity:${e.replace(/\/+$/,``)}`}async load(){let e=await C(this.key);if(!e)return null;let t;try{t=JSON.parse(e)}catch{throw Error(`Stored webhook management identity is invalid`)}if(!t||typeof t.coneId!=`string`||!t.coneId||typeof t.coneSecret!=`string`||!t.coneSecret||typeof t.rebindSecret!=`string`||!t.rebindSecret)throw Error(`Stored webhook management identity is invalid`);let n=t.pendingRotation?X(JSON.stringify(t.pendingRotation)):null,r=t.pendingRotation;if(r&&(!n||typeof r.secret!=`string`||!/^[A-Za-z0-9_-]{32,128}$/.test(r.secret)||typeof r.rebindSecret!=`string`||!/^[A-Za-z0-9_-]{32,128}$/.test(r.rebindSecret)||r.secret===t.coneSecret||r.rebindSecret===t.rebindSecret||r.secret===r.rebindSecret))throw Error(`Stored webhook rotation intent is invalid`);let i=r&&n?{...n,secret:r.secret,rebindSecret:r.rebindSecret}:null;if(t.pendingCreateAttemptId!==void 0&&(typeof t.pendingCreateAttemptId!=`string`||!/^[A-Za-z0-9_-]{32,128}$/.test(t.pendingCreateAttemptId))||t.pendingCreateTrayId!==void 0&&(!t.pendingCreateAttemptId||typeof t.pendingCreateTrayId!=`string`||!/^[A-Za-z0-9_-]{1,128}$/.test(t.pendingCreateTrayId)))throw Error(`Stored tray creation intent is invalid`);let a={coneId:t.coneId,coneSecret:t.coneSecret,rebindSecret:t.rebindSecret,established:t.established!==!1,...i?{pendingRotation:i}:{},...t.pendingCreateAttemptId?{pendingCreateAttemptId:t.pendingCreateAttemptId}:{},...t.pendingCreateTrayId?{pendingCreateTrayId:t.pendingCreateTrayId}:{}};return this.snapshots.set(a,e),a}async save(e){let t=JSON.stringify(e);await w(this.key,t),this.snapshots.set(e,t)}async compareAndSwap(e,t){let n=e===null?null:this.snapshots.get(e);if(n===void 0)throw Error(`Webhook identity must be loaded before updating`);let r=JSON.stringify(t),i=await T(this.key,n,r);return i&&this.snapshots.set(t,r),i}};async function q(e){let t=await new G().load(),n=await new K(e.getItem(`slicc.trayWorkerBaseUrl`)??t?.workerBaseUrl??c).load();if(n&&n.established!==!1||t&&Y(t))throw Error(`webhook delete: stable identity exists but leader is disconnected`)}function J(e,t){if(!t)return null;let n;try{let t=new URL(e).pathname.split(`/`).filter(Boolean);if(t.at(-2)!==`wh`)return null;n=decodeURIComponent(t.at(-1)??``)}catch{return null}let r=n.indexOf(`.`),i=t.indexOf(`.`);if(r<=0||i<=0)return null;let a=n.slice(0,r),o=n.slice(r+1),s=t.slice(0,i),c=t.slice(i+1);return![a,o,c].every(e=>/^[A-Za-z0-9_-]+$/.test(e))||s!==a?null:{coneId:a,coneSecret:o,rebindSecret:c}}function Y(e){let t=e;return t.coneId&&t.coneSecret&&t.rebindSecret?{coneId:t.coneId,coneSecret:t.coneSecret,rebindSecret:t.rebindSecret,established:!0}:null}function X(e){if(!e)return null;try{let t=JSON.parse(e);return typeof t.workerBaseUrl!=`string`||typeof t.trayId!=`string`||typeof t.createdAt!=`string`||typeof t.controllerId!=`string`||typeof t.controllerUrl!=`string`||typeof t.joinUrl!=`string`||typeof t.webhookUrl!=`string`||typeof t.runtime!=`string`?null:{workerBaseUrl:t.workerBaseUrl,trayId:t.trayId,createdAt:t.createdAt,controllerId:t.controllerId,controllerUrl:t.controllerUrl,joinUrl:t.joinUrl,webhookUrl:t.webhookUrl,leaderKey:typeof t.leaderKey==`string`?t.leaderKey:void 0,leaderWebSocketUrl:typeof t.leaderWebSocketUrl==`string`?t.leaderWebSocketUrl:null,runtime:t.runtime,...typeof t.coneId==`string`?{coneId:t.coneId}:{},...typeof t.coneId==`string`&&typeof t.coneSecret==`string`&&typeof t.rebindSecret==`string`?{coneId:t.coneId,coneSecret:t.coneSecret,rebindSecret:t.rebindSecret}:{}}}catch{return null}}var Z=class{options;store;identityStore;replacementStore;identity=null;rotation=null;starting=null;resetting=null;fetchImpl;webSocketFactory;pingIntervalMs;connectTimeoutMs;reconnectEnabled;reconnectBaseDelayMs;reconnectMaxDelayMs;reconnectBackoffMultiplier;reconnectMaxAttempts;reconnectSleep;socket=null;pingTimer=null;currentSession=null;stopped=!1;reconnecting=!1;reconnectGeneration=0;constructor(e){this.options=e,this.store=e.store??new G,this.identityStore=e.identityStore??new K(e.workerBaseUrl),this.replacementStore=e.replacementStore??new G(`leader-tray-replacement:${e.workerBaseUrl.replace(/\/+$/,``)}`),this.fetchImpl=e.fetchImpl??P(),this.webSocketFactory=e.webSocketFactory??(e=>new WebSocket(e)),this.pingIntervalMs=e.pingIntervalMs??R,this.connectTimeoutMs=e.connectTimeoutMs??z;let t=e.reconnect;this.reconnectEnabled=t!==!1;let n=t===!1||!t?{}:t;this.reconnectBaseDelayMs=n.baseDelayMs??B,this.reconnectMaxDelayMs=n.maxDelayMs??V,this.reconnectBackoffMultiplier=n.backoffMultiplier??H,this.reconnectMaxAttempts=n.maxAttempts??U,this.reconnectSleep=n.sleep??(e=>new Promise(t=>setTimeout(t,e)))}async start(){if(this.starting!==null)return this.starting;let e=this.startOnce();this.starting=e;try{return await e}finally{this.starting=null}}async startOnce(){if(this.stopped=!1,this.currentSession&&this.socket)return M({state:`leader`,session:this.currentSession,error:null}),this.currentSession;M({state:`connecting`,session:null,error:null}),this.currentSession=null;try{let e=await this.connectOnce();I.info(`Leader joined tray`,{trayId:e.trayId,controllerId:e.controllerId,runtime:e.runtime});try{this.options.onLeaderReady?.(e)}catch(e){I.warn(`onLeaderReady callback threw`,{error:e instanceof Error?e.message:String(e)})}return e}catch(e){throw M({state:`error`,session:this.currentSession,error:e instanceof Error?e.message:String(e)}),e}}stop(){this.stopped=!0,this.reconnecting=!1,this.reconnectGeneration++,this.tearDownSocket(),this.currentSession=null,M({state:`inactive`,session:null,error:null})}tearDownSocket(){this.pingTimer&&=(clearInterval(this.pingTimer),null);let e=this.socket;if(this.socket=null,e)try{e.close()}catch{}}async connectOnce(){if(this.rotation!==null&&await this.rotation,this.identity=await this.identityStore.load(),this.identity?.pendingRotation)try{await this.rotateWebhookOnce()}catch(e){if(!$(e))throw e;if(this.identity?.pendingRotation)throw Error(`Webhook rotation changed in another tab; retry before reconnecting`)}let e=await this.store.load(),t=e?.workerBaseUrl.replace(/\/+$/,``)===this.options.workerBaseUrl.replace(/\/+$/,``)?e:null,n=t&&Y(t);!this.identity&&n&&await this.saveIdentity(n);let r=t&&this.publicSession(t);r&&n&&await this.store.save(r),await this.finishPendingCreate(r);let i=await this.replacementStore.load(),a=i?await this.claimReplacement(i,r):await this.attachWithRecovery(r);this.currentSession=a;let o=await this.openLeaderSocket(a.leaderWebSocketUrl);return this.socket=o,this.startPingLoop(o),M({state:`leader`,session:a,error:null}),a}async handleUnexpectedDisconnect(e){if(this.stopped)return;if(!this.reconnectEnabled){I.warn(`Leader WebSocket dropped and auto-reconnect is disabled`,{reason:e}),this.tearDownSocket(),this.currentSession=null,M({state:`error`,session:null,error:`Leader WebSocket dropped: ${e}`});return}if(this.reconnecting)return;this.reconnecting=!0;let t=++this.reconnectGeneration;I.warn(`Leader WebSocket dropped — starting reconnect loop`,{reason:e}),this.tearDownSocket();let n=0,r=this.reconnectBaseDelayMs,i=e;for(;!this.stopped&&t===this.reconnectGeneration&&n<this.reconnectMaxAttempts&&(n++,M({state:`reconnecting`,session:this.currentSession,error:null,reconnectAttempts:n}),this.options.onReconnecting?.(n,i),I.info(`Leader reconnect attempt`,{attempt:n,delay:r}),await this.reconnectSleep(r),!(this.stopped||t!==this.reconnectGeneration));){try{let e=await this.connectOnce();if(this.stopped||t!==this.reconnectGeneration){this.tearDownSocket();break}this.reconnecting=!1,I.info(`Leader reconnect successful`,{attempt:n,trayId:e.trayId}),this.options.onReconnected?.(e);try{this.options.onLeaderReady?.(e)}catch(e){I.warn(`onLeaderReady callback threw`,{error:e instanceof Error?e.message:String(e)})}return}catch(e){i=e instanceof Error?e.message:String(e),I.warn(`Leader reconnect attempt failed`,{attempt:n,error:i}),this.tearDownSocket()}r=Math.min(r*this.reconnectBackoffMultiplier,this.reconnectMaxDelayMs)}!this.stopped&&t===this.reconnectGeneration&&(this.reconnecting=!1,this.currentSession=null,M({state:`error`,session:null,error:`Leader reconnect failed after ${n} attempts: ${i}`,reconnectAttempts:n}),I.warn(`Leader reconnect gave up`,{attempts:n,lastError:i}),this.options.onReconnectGaveUp?.(i,n))}async clearSession(){if(this.rotation!==null&&await this.rotation,await this.replacementStore.load())throw Error(`Tray replacement is pending; retry reset before clearing the session`);await this.finishPendingCreate(await this.store.load()),await this.store.clear()}async reset(){if(this.resetting!==null)return this.resetting;let e=this.resetOnce();this.resetting=e;try{return await e}finally{this.resetting=null}}async resetOnce(){return this.starting!==null&&await this.starting,this.rotation!==null&&await this.rotation,!await this.replacementStore.load()&&this.currentSession&&await this.replacementStore.save(this.currentSession),this.stop(),this.start()}async claimReplacement(e,t,n=!0){let r=t&&t.trayId!==e.trayId?t:await this.createTraySession();try{await this.transferPreviousSession(e,r)}catch(t){if(!(t instanceof Q)||t.code!==`PREVIEW_TARGET_UNAVAILABLE`)throw t;await this.finishPendingCreate(await this.store.load()),await this.store.clear(),r=await this.createTraySession(),await this.transferPreviousSession(e,r)}let i;try{i=await this.claimLeaderSession(r)}catch(e){if(e instanceof Q&&[403,404,410].includes(e.status)&&(await this.replacementStore.save(r),await this.finishPendingCreate(await this.store.load()),await this.store.clear(),n))return this.claimReplacement(r,null,!1);throw e}return await this.replacementStore.clear(),this.notifyTraySuperseded(e,i.joinUrl,i.webhookUrl),i}async transferPreviousSession(e,t){if(e.trayId===t.trayId||this.identity?.established===!1)return;let n=new URL(e.controllerUrl).pathname.split(`/`).pop(),r=new URL(t.controllerUrl).pathname.split(`/`).pop();if(!n||!r)throw Error(`Preview transfer requires controller credentials`);if((await this.fetchJson(s(e.workerBaseUrl,`api/tray/${e.trayId}/preview-transfer`),{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${n}`},body:JSON.stringify({targetTrayId:t.trayId,targetControllerToken:r})})).transferred!==!0)throw Error(`Hub did not confirm preview transfer`)}async saveIdentity(e){await this.identityStore.save(e),this.identity=e}publicSession(e){let{coneSecret:t,rebindSecret:n,...r}=e;return this.identity?.established&&r.coneId===this.identity.coneId&&(r.webhookUrl=s(this.options.workerBaseUrl,`wh/${this.identity.coneId}.${this.identity.coneSecret}`)),r}getCurrentSession(){return this.currentSession}async rotateWebhook(){if(this.resetting!==null||this.starting!==null||this.reconnecting)throw Error(`webhook rotate: tray transition in progress; retry when ready`);if(this.rotation!==null)return this.rotation;let e=this.rotateWebhookOnce();this.rotation=e;try{return await e}finally{this.rotation=null}}async rotateWebhookOnce(){this.identity=await this.identityStore.load();let e=this.identity?.pendingRotation??this.currentSession;if(!e)throw Error(`webhook rotate: no active tray session`);let t=this.identity;if(!t||t.established===!1)throw Error(`webhook rotate: this tray has no stable webhook identity to rotate (legacy hub)`);if(e.workerBaseUrl.replace(/\/+$/,``)!==this.options.workerBaseUrl.replace(/\/+$/,``))throw Error(`webhook rotate: pending identity belongs to a different hub`);let n=new URL(e.controllerUrl).pathname.split(`/`).pop();if(!n)throw Error(`webhook rotate: could not derive the controller token`);if(!t.pendingRotation){let n={...t,pendingRotation:{...e,secret:crypto.randomUUID().replace(/-/g,``),rebindSecret:crypto.randomUUID().replace(/-/g,``)}};if(!await this.identityStore.compareAndSwap(t,n))throw Error(`webhook rotate: identity changed in another tab; retry`);this.identity=t=n}let r=s(e.workerBaseUrl,`api/tray/${e.trayId}/webhook/rotate`),i=await this.fetchJson(r,{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${n}`},body:JSON.stringify({oldConeId:t.coneId,oldSecret:t.coneSecret,oldRebindSecret:t.rebindSecret,secret:t.pendingRotation.secret,rebindSecret:t.pendingRotation.rebindSecret})}).catch(async e=>{if($(e)){let{pendingRotation:e,...n}=t;await this.identityStore.compareAndSwap(t,n),this.identity=await this.identityStore.load()}throw e}),a=J(i.webhook.url,i.webhook.rebindToken);if(!a)throw Error(`webhook rotate: hub returned an unparseable webhook capability`);if(a.coneId!==t.coneId||a.coneSecret!==t.pendingRotation.secret||a.rebindSecret!==t.pendingRotation.rebindSecret)throw Error(`webhook rotate: hub changed the management identity`);let{pendingRotation:o,...c}=t,l={...c,...a,established:!0};if(!await this.identityStore.compareAndSwap(t,l))throw this.identity=await this.identityStore.load(),Error(`webhook rotate: identity changed in another tab; retry`);this.identity=l;let u={...X(JSON.stringify(e)),webhookUrl:i.webhook.url,coneId:a.coneId};return(await this.store.load())?.trayId===e.trayId&&await this.store.save(u),this.currentSession===e&&(this.currentSession=u,M({state:`leader`,session:u,error:null})),{webhookUrl:i.webhook.url}}async revokeWebhook(e){if(!e)throw Error(`webhook delete: missing webhook id`);if(this.resetting!==null||this.starting!==null||this.reconnecting)throw Error(`webhook delete: tray transition in progress; retry when ready`);let t=this.currentSession,n=this.identity??await this.identityStore.load();if(!n||n.established===!1)return;if(!t)throw Error(`webhook delete: stable identity exists but leader is disconnected`);let r=new URL(t.controllerUrl).pathname.split(`/`).pop();if(!r)throw Error(`webhook delete: missing controller credentials`);await this.fetchJson(s(t.workerBaseUrl,`webhooks/${encodeURIComponent(n.coneId)}/${encodeURIComponent(e)}/revoke`),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({rebindSecret:n.rebindSecret,trayId:t.trayId,controllerToken:r})})}supersedePreviousSession(e,t){e.trayId!==``&&t.joinUrl!==e.joinUrl&&this.notifyTraySuperseded(e,t.joinUrl,t.webhookUrl)}carryConeIdentityFrom(e){}sendControlMessage(e){if(!this.socket)throw Error(`Tray leader WebSocket is not connected`);this.socket.send(JSON.stringify(e))}async attachWithRecovery(e){try{return await this.claimLeaderSession(e)}catch(t){if(!e||!te(t))throw t;return I.warn(`Stored tray session is stale, creating a fresh tray`,{trayId:e.trayId,error:t instanceof Error?t.message:String(t)}),await this.replacementStore.save(e),await this.finishPendingCreate(await this.store.load()),await this.store.clear(),this.claimReplacement(e,null)}}async notifyTraySuperseded(e,t,n){try{let r=new URL(e.controllerUrl).pathname.split(`/`).pop();if(!r)return;let i=s(e.workerBaseUrl,`api/tray/${e.trayId}/supersede`),a=await this.fetchImpl(i,{method:`POST`,headers:{"content-type":`application/json`,authorization:`Bearer ${r}`},body:JSON.stringify({joinUrl:t,...n?{webhookUrl:n}:{}}),signal:AbortSignal.timeout(W)});a.ok||I.warn(`Old tray rejected supersession (best-effort)`,{oldTrayId:e.trayId,status:a.status})}catch{I.warn(`Failed to notify old tray of supersession (best-effort)`,{oldTrayId:e.trayId})}}async claimLeaderSession(e){let t=e??await this.createTraySession(),n=await this.fetchJson(t.controllerUrl,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({controllerId:t.controllerId,leaderKey:t.leaderKey,runtime:this.options.runtime})});if(n.role!==`leader`||!n.leaderKey||!n.websocket?.url)throw Error(`Tray attach did not return leader access for controller ${n.controllerId}`);let r={...t,trayId:n.trayId,controllerId:n.controllerId,leaderKey:n.leaderKey,leaderWebSocketUrl:n.websocket.url,runtime:this.options.runtime};return await this.store.save(r),r}async finishPendingCreate(e){for(let t=0;t<8;t++){let t=await this.identityStore.load();if(!e||!t?.pendingCreateTrayId||t.pendingCreateTrayId!==e.trayId)return;let n={...t};if(delete n.pendingCreateAttemptId,delete n.pendingCreateTrayId,await this.identityStore.compareAndSwap(t,n)){this.identity=n;return}}throw Error(`Webhook identity changed while acknowledging tray creation`)}async prepareCreateIdentity(){await this.finishPendingCreate(await this.store.load());for(let e=0;e<8;e++){let e=await this.identityStore.load();if(e?.pendingRotation)throw Error(`Webhook rotation must finish before tray creation`);if(e?.pendingCreateAttemptId)return e;let t={...e??{coneId:crypto.randomUUID(),coneSecret:crypto.randomUUID().replace(/-/g,``),rebindSecret:crypto.randomUUID().replace(/-/g,``),established:!1},pendingCreateAttemptId:crypto.randomUUID()};if(await this.identityStore.compareAndSwap(e,t))return t}throw Error(`Webhook identity changed while preparing tray creation`)}async createTraySession(){let e=await this.prepareCreateIdentity();this.identity=e;let t=JSON.stringify({...this.options.kind?{kind:this.options.kind}:{},coneId:e.coneId,coneSecret:e.coneSecret,rebindSecret:e.rebindSecret,createAttemptId:e.pendingCreateAttemptId}),n=await this.fetchJson(s(this.options.workerBaseUrl,`tray`),{method:`POST`,headers:{"content-type":`application/json`},body:t}),r=J(n.capabilities.webhook.url,n.capabilities.webhook.rebindToken);if(r){if(r.coneId!==e.coneId||r.coneSecret!==e.coneSecret||r.rebindSecret!==e.rebindSecret)throw Error(`Hub returned a different webhook management identity`)}else if(e.established||n.capabilities.webhook.rebindToken||new URL(n.capabilities.webhook.url).pathname.includes(`/wh/`))throw Error(`Hub did not confirm the stable webhook binding`);let i={workerBaseUrl:this.options.workerBaseUrl,trayId:n.trayId,createdAt:n.createdAt,controllerId:crypto.randomUUID(),controllerUrl:n.capabilities.controller.url,joinUrl:n.capabilities.join.url,webhookUrl:n.capabilities.webhook.url,runtime:this.options.runtime,...r?{coneId:r.coneId}:{}},a={...e,established:r?!0:e.established,pendingCreateTrayId:i.trayId};if(!await this.identityStore.compareAndSwap(e,a))throw Error(`Webhook identity changed during tray creation`);return this.identity=a,await this.store.save(i),await this.finishPendingCreate(i),i}async openLeaderSocket(e){return await new Promise((t,n)=>{let r=this.webSocketFactory(e),i=!1,a=setTimeout(()=>{o(`Tray leader WebSocket timed out after ${this.connectTimeoutMs}ms waiting for leader.connected`);try{r.close(1e3,`leader.connected timeout`)}catch{}},this.connectTimeoutMs),o=e=>{i||(i=!0,clearTimeout(a),n(Error(e)))};r.addEventListener(`message`,e=>{let n=ne(e.data);if(n){if(n.type===`leader.connected`){i||(i=!0,clearTimeout(a),t(r));return}if(n.type===`pong`){I.debug(`Tray leader heartbeat acknowledged`,{trayId:this.currentSession?.trayId});return}this.options.onControlMessage?.(n)}}),r.addEventListener(`close`,()=>o(`Tray leader WebSocket closed before leader.connected`)),r.addEventListener(`error`,()=>o(`Tray leader WebSocket failed before leader.connected`))})}startPingLoop(e){this.pingTimer&&clearInterval(this.pingTimer);let t=t=>{this.stopped||this.socket!==e||this.handleUnexpectedDisconnect(t).catch(e=>{I.warn(`Leader reconnect loop crashed`,{error:e instanceof Error?e.message:String(e)})})},n=()=>{try{e.send(JSON.stringify({type:`ping`}))}catch(e){t(`Leader ping send failed: ${e instanceof Error?e.message:String(e)}`)}};n(),this.pingTimer=setInterval(n,this.pingIntervalMs),e.addEventListener(`close`,()=>t(`Leader WebSocket closed`)),e.addEventListener(`error`,()=>t(`Leader WebSocket errored`))}async fetchJson(e,t){let n=await this.fetchImpl(e,{...t,signal:t.signal??AbortSignal.timeout(2e4)}).catch(e=>{throw e instanceof N?new N(`Tray proxy transport unavailable`):Error(`Tray request failed (transport unavailable)`)});if(!n.ok)throw await Q.fromResponse(n);try{return await n.json()}catch{throw Error(`Hub returned invalid JSON`)}}},Q=class e extends Error{status;code;constructor(e,t,n){super(n),this.status=e,this.code=t,this.name=`LeaderTrayHttpError`}static async fromResponse(t){try{let n=await t.json();return new e(t.status,n.code??null,`Tray request failed (${t.status})`)}catch{return new e(t.status,null,`Tray request failed (${t.status})`)}}};function $(e){return e instanceof Q&&[400,401,403,404,405,410,422].includes(e.status)}function te(e){return e instanceof N?!0:e instanceof Q?e.status===403||e.status===404||e.status===410||e.status>=500:!1}function ne(e){if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}}export{j as a,M as i,F as n,l as o,k as r,Z as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as e,x as t}from"./main-
|
|
1
|
+
import{b as e,x as t}from"./main-CfF8CFBr.js";async function n(n,a){let o=a.getLeader()?`leader`:a.getFollower()?`follower`:`inactive`,s=a.getLeader();a.setLeader(null);let c=a.getFollower();a.setFollower(null),a.clearLeaderHooks();let{requestId:l}=n;try{s?.stop()}catch(e){a.log.error(`Leader stop threw during tray-leave — resources may have leaked`,{requestId:l,error:e instanceof Error?e.message:String(e)})}try{c?.stop()}catch(e){a.log.error(`Follower stop threw during tray-leave — resources may have leaked`,{requestId:l,error:e instanceof Error?e.message:String(e)})}if(i(()=>a.storage.removeItem(e),a.log,`join-clear`,l),n.workerBaseUrl===null)return i(()=>a.storage.removeItem(t),a.log,`worker-clear`,l),o===`inactive`?{kind:`noop`}:{kind:`left`,previousMode:o};let u=n.workerBaseUrl,d;try{d=a.startLeader(u)}catch(e){throw a.log.error(`startLeader failed during tray-leave — runtime is now dormant`,{workerBaseUrl:u,requestId:l,error:e instanceof Error?e.message:String(e)}),i(()=>a.storage.removeItem(t),a.log,`worker-clear-on-failure`,l),e}a.setLeader(d),a.wireLeaderHooks(d);try{await d.ready}catch(e){throw r(d,a,e,u,l),e}return a.getLeader()===d?(i(()=>a.storage.setItem(t,u),a.log,`worker-set`,l),{kind:`switched`,previousMode:o,workerBaseUrl:u}):(a.log.error(`Leader superseded during connect — skipping storage write`,{workerBaseUrl:u,requestId:l}),{kind:`switched`,previousMode:o,workerBaseUrl:u})}function r(e,n,r,a,o){let s=n.getLeader()===e;try{e.stop()}catch(e){n.log.error(`Leader stop threw during async-failure rollback — resources may have leaked`,{requestId:o,error:e instanceof Error?e.message:String(e)})}s&&(n.setLeader(null),n.clearLeaderHooks(),i(()=>n.storage.removeItem(t),n.log,`worker-clear-on-async-failure`,o)),n.log.error(`Leader ready failed during tray-leave — runtime is now dormant`,{workerBaseUrl:a,requestId:o,error:r instanceof Error?r.message:String(r)})}function i(e,t,n,r){try{e()}catch(e){t.error(`tray-leave storage write failed`,{kind:n,requestId:r,error:e instanceof Error?e.message:String(e)})}}export{n as performTrayLeave};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./bridge-protocol-31SWTdS5.js";import"./proxied-fetch-DEK8DT-z.js";const t=e;export{t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import{t}from"./base64-DJRlyqZu.js";import{f as n,p as r}from"./wc-follower-oauth-
|
|
1
|
+
import{t as e}from"./logger-DDBAeTLF.js";import{t}from"./base64-DJRlyqZu.js";import{f as n,p as r}from"./wc-follower-oauth-BF3qXDTt.js";import{r as i}from"./tray-leader-Bas0lH9O.js";var a=e(`tray-sidecar`),o=`slicc-sidecar`,s=4194304,c={exec:!1},l=class{onChunk;stdout=``;stderr=``;truncated=!1;units=0;constructor(e){this.onChunk=e}push(e,t){if(!(this.truncated||t.length===0)){if(this.units+=t.length,this.units>s){this.truncated=!0;return}e===`stdout`?this.stdout+=t:this.stderr+=t,this.onChunk?.({stream:e,text:t})}}result(e,t){return{stdout:this.truncated?`${this.stdout}\n[output truncated at cap]`:this.stdout,stderr:this.stderr,exitCode:e,...t?{error:t}:{},...this.truncated?{truncated:!0}:{}}}},u=class{name;handle=null;channel=null;unsubscribe=null;listeners=new Set;dropListeners=new Set;status=null;attachedAt=Date.now();currentJoinUrl;startPromise=null;constructor(e,t){this.name=e,this.currentJoinUrl=t}statusSink={get:()=>this.status??{state:`inactive`,joinUrl:this.currentJoinUrl,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null},set:e=>{this.status=e}};get info(){let e=this.statusSink.get();return{name:this.name,joinUrl:this.currentJoinUrl,trayId:e.trayId,state:e.state,attachedAt:this.attachedAt,error:e.error}}get connected(){return this.channel!==null&&this.statusSink.get().state===`connected`}get dead(){return this.statusSink.get().state===`error`}async ready(){await(this.startPromise??Promise.resolve())}async start(e){return this.startPromise=new Promise((t,r)=>{let i=!1,a=setTimeout(()=>{i||(i=!0,this.stop(),r(Error(`timed out after ${Math.round(e/1e3)}s connecting to leader`)))},e);this.handle=n({joinUrl:this.currentJoinUrl,runtime:o,statusSink:this.statusSink,onJoinUrlChanged:e=>{this.currentJoinUrl=e}},{onConnected:e=>{this.wire(e.channel),!i&&(i=!0,clearTimeout(a),t())},onReconnecting:()=>{this.notifyDropped(`connection dropped; reconnecting`)},onGaveUp:e=>{this.notifyDropped(`reconnect gave up: ${e}`),!i&&(i=!0,clearTimeout(a),this.stop(),r(Error(e)))}})}),await this.startPromise}wire(e){let t=this.channel!==null;this.unsubscribe?.();let n=new r(e);this.channel=n,this.unsubscribe=n.onMessage(e=>this.dispatch(e)),n.send({type:`hello`,protocolVersion:8,runtime:o,capabilities:c}),a.info(t?`Sidecar reconnected`:`Sidecar attached`,{name:this.name}),t&&this.notifyDropped(`reconnected mid-request; the reply was lost`)}dispatch(e){if(e.type===`ping`){this.channel?.send({type:`pong`});return}if(e.type!==`pong`){if(e.type===`exec.request`){this.channel?.send({type:`exec.response`,requestId:e.requestId,exitCode:127,error:`slicc sidecar is a client-only attachment and does not accept exec`});return}for(let t of[...this.listeners])try{t(e)}catch(e){a.error(`Sidecar listener threw`,{name:this.name,error:e instanceof Error?e.message:String(e)})}}}send(e){return this.channel?.send(e)??!1}onMessage(e){return this.listeners.add(e),()=>this.listeners.delete(e)}onDropped(e){return this.dropListeners.add(e),()=>this.dropListeners.delete(e)}notifyDropped(e){for(let t of[...this.dropListeners])try{t(e)}catch{}}stop(){this.unsubscribe?.(),this.unsubscribe=null,this.channel?.close(),this.channel=null,this.handle?.cancel(),this.handle=null,this.notifyDropped(`detached`),this.listeners.clear(),this.dropListeners.clear()}};function d(e){let t;try{t=new URL(e)}catch{throw Error(`not a URL: ${e}`)}if(t.protocol!==`https:`&&t.protocol!==`http:`)throw Error(`join URL must be http(s): ${e}`);if(!t.pathname.includes(`/join/`))throw Error(`not a tray join URL (expected .../join/<token>): ${e}`);return t}function f(e){let t=i().session?.joinUrl;if(!t)return!1;try{let n=new URL(t);return n.origin===e.origin&&n.pathname===e.pathname}catch{return!1}}function p(e,t,n,r){return new Promise(i=>{let a=!1,o=null,s=null,c=null,l=null,u=null,d=(e,r,d)=>{a||(a=!0,c&&clearTimeout(c),l&&clearTimeout(l),o?.(),s?.(),u&&t.signal?.removeEventListener(`abort`,u),i({result:n.result(r,d),outcome:e}))},f={finish:(e,t)=>d(`complete`,e,t)};if(o=e.onMessage(e=>r(e,f)),s=e.onDropped(e=>d(`dropped`,1,`connection lost: ${e}`)),t.timeoutMs!==void 0){let e=Math.round(t.timeoutMs/1e3);c=setTimeout(()=>d(`abort`,124,`timed out after ${e}s`),t.timeoutMs)}if(t.expireMs!==void 0&&(l=setTimeout(()=>d(`expire`,0),t.expireMs)),t.signal){if(t.signal.aborted){d(`abort`,130,`interrupted`);return}u=()=>d(`abort`,130,`interrupted`),t.signal.addEventListener(`abort`,u,{once:!0})}})}var m=class{attachments=new Map;counter=0;list(){return[...this.attachments.values()].map(e=>e.info)}async attach(e){let t=d(e.joinUrl);if(f(t))throw Error(`refusing to attach to this instance's own tray — that would deadlock the leader thread`);let n=this.findByJoinUrl(t);if(n?.dead)a.info(`Replacing a dead sidecar attachment`,{name:n.name}),this.detach(n.name);else if(n){if(await n.ready(),!n.dead)return n.info;this.detach(n.name)}if(this.attachments.size>=8)throw Error(`too many sidecar attachments (8); detach one first`);let r=e.name??`slicc-${++this.counter}`;if(this.attachments.has(r))throw Error(`attachment '${r}' already exists`);let i=new u(r,t.toString());this.attachments.set(r,i);try{await i.start(e.connectTimeoutMs??3e4)}catch(e){throw this.attachments.delete(r),e}return i.info}detach(e){let t=this.attachments.get(e);return t?(t.stop(),this.attachments.delete(e),!0):!1}detachAll(){for(let e of[...this.attachments.keys()])this.detach(e)}findByJoinUrl(e){let t=`${e.origin}${e.pathname}`;return[...this.attachments.values()].find(e=>{try{let n=new URL(e.info.joinUrl);return`${n.origin}${n.pathname}`===t}catch{return!1}})}require(e){let t=this.attachments.get(e);if(!t)throw Error(`no such attachment: ${e}`);if(!t.connected)throw Error(`attachment '${e}' is not connected`);return t}async prompt(e,t,n={}){let r=this.require(e),i=new l(n.onChunk),a=!1,o=p(r,n,i,(e,t)=>{if(e.type===`agent_event`){let n=e.event;n.type===`content_delta`?i.push(`stdout`,n.text):n.type===`turn_end`?t.finish(0):n.type===`error`&&(i.push(`stderr`,`${n.error}\n`),t.finish(1));return}if(e.type===`status`){e.scoopStatus===`processing`?a=!0:a&&t.finish(0);return}e.type===`error`&&(i.push(`stderr`,`${e.error}\n`),t.finish(1))});if(!r.send({type:`user_message`,text:t,messageId:crypto.randomUUID(),...n.steer?{steer:!0}:{}}))return{stdout:``,stderr:``,exitCode:1,error:`failed to send user_message`};let{result:s,outcome:c}=await o;return c===`abort`&&r.send({type:`abort`}),s}async exec(e,n,r={}){let i=this.require(e),a=crypto.randomUUID(),o=new l(r.onChunk),s=new TextDecoder,c=new TextDecoder,u=p(i,r,o,(e,n)=>{if(e.type===`exec.chunk`&&e.requestId===a){let n;try{n=t(e.data)}catch{return}let r=e.stream===`stdout`?s:c;o.push(e.stream,r.decode(n,{stream:!0}));return}e.type===`exec.response`&&e.requestId===a&&(o.push(`stdout`,s.decode()),o.push(`stderr`,c.decode()),n.finish(e.exitCode,e.error))});if(!i.send({type:`exec.request`,requestId:a,command:n,...r.cwd?{cwd:r.cwd}:{},...r.env?{env:r.env}:{},...r.stdin?{stdin:r.stdin}:{}}))return{stdout:``,stderr:``,exitCode:1,error:`failed to send exec.request`};let{result:d,outcome:f}=await u;return f===`abort`&&i.send({type:`exec.signal`,requestId:a,signal:`SIGINT`}),d}async watch(e,t){let n=this.require(e),r=new l(t.onChunk),i=!1,{result:a}=await p(n,{...t,timeoutMs:void 0,expireMs:t.durationMs},r,(e,n)=>{if(e.type===`user_message_echo`){r.push(`stdout`,`\n> ${e.text}\n`);return}if(e.type===`agent_event`){if(t.scoopJid&&e.scoopJid!==t.scoopJid)return;r.push(`stdout`,h(e.event));return}if(e.type===`status`){if(t.scoopJid&&e.scoopJid!==t.scoopJid)return;e.scoopStatus===`processing`?i=!0:i&&t.untilIdle&&n.finish(0);return}e.type===`error`&&r.push(`stderr`,`${e.error}\n`)});return a}};function h(e){switch(e.type){case`content_delta`:return e.text;case`tool_use_start`:return`\n[tool] ${e.toolName} ${g(e.toolInput)}\n`;case`tool_result`:return`[${e.isError?`tool-error`:`tool-ok`}] ${_(e.result,200)}\n`;case`turn_end`:return`
|
|
2
2
|
`;case`error`:return`[error] ${e.error}\n`;default:return``}}function g(e){if(e==null)return``;try{return _(JSON.stringify(e),120)}catch{return``}}function _(e,t){let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:`${n.slice(0,t-1)}…`}export{m as SidecarRegistry};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./slicc-version-BZyTvfoc.js";import{f as t,p as n}from"./kernel-worker-Dseu067f.js";const r=`slicc:last-seen-version`;function i(){let{version:t,releasedAt:n}=e();return{version:t,releasedAt:n}}async function a(){let e=await t(r);return e&&e.length>0?e:null}async function o(e){await n(r,e)}async function s(){let e=i(),t=await a();return t===null?(await o(e.version),{bundled:e,lastSeen:null,isUpgrade:!1}):t===e.version?{bundled:e,lastSeen:t,isUpgrade:!1}:{bundled:e,lastSeen:t,isUpgrade:!0}}async function c(e){await o(e)}export{s as detectUpgrade,a as getLastSeenVersion,c as recordVersionSeen};
|